设计一个基于控制台应用程序的高精度整数运算程序。学生需要根据题目要求,编写中文菜单程序,供用户选择不同的功能,包括输入两个可长达40位的无符号整数 AB ,计算并输出 A + B ,计算和输出 A - B ;计算和输出 A * B 和结束程序等选项;要求分析功能要求,描述算法,绘制流程图,并根据流程图编写 C 语言代码;调试运行编写完成的代码,并记录调试中遇到的错误现象和解决方案;完成 C 语言课程设计报告。
时间: 2024-02-13 12:05:03 浏览: 96
计算:接受2个整数和一个字符的基本C#控制台程序。 根据输入的字符,程序将对两个整数进行加,减或乘运算
好的,下面是完整的 C 语言代码,包括加、减、乘三个操作以及菜单程序:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 41
// 声明函数
void add(char a[], char b[], char result[]);
void subtract(char a[], char b[], char result[]);
void multiply(char a[], char b[], char result[]);
void print_menu();
void clear_input_buffer();
int main()
{
char a[MAX_LEN], b[MAX_LEN], result[MAX_LEN];
int choice;
while (1) {
print_menu();
scanf("%d", &choice);
clear_input_buffer(); // 清空输入缓冲区,防止输入错误
switch (choice) {
case 1:
printf("请输入两个整数 A 和 B:\n");
scanf("%s %s", a, b);
clear_input_buffer();
add(a, b, result);
printf("A + B = %s\n", result);
break;
case 2:
printf("请输入两个整数 A 和 B:\n");
scanf("%s %s", a, b);
clear_input_buffer();
subtract(a, b, result);
printf("A - B = %s\n", result);
break;
case 3:
printf("请输入两个整数 A 和 B:\n");
scanf("%s %s", a, b);
clear_input_buffer();
multiply(a, b, result);
printf("A * B = %s\n", result);
break;
case 4:
printf("程序已结束。\n");
return 0;
default:
printf("输入错误,请重新输入。\n");
break;
}
}
return 0;
}
// 加法函数
void add(char a[], char b[], char result[])
{
int carry = 0;
int len_a = strlen(a);
int len_b = strlen(b);
// 对齐两个数的位数
for (int i = 0; i < MAX_LEN - 1; i++) {
if (i < len_a) {
result[i] = a[i] - '0';
} else {
result[i] = 0;
}
if (i < len_b) {
result[i] += b[i] - '0';
}
result[i] += carry;
if (result[i] >= 10) {
carry = 1;
result[i] -= 10;
} else {
carry = 0;
}
}
// 去除前导零
int i;
for (i = MAX_LEN - 2; i >= 0; i--) {
if (result[i] != 0) {
break;
}
}
for (int j = 0; j <= i; j++) {
result[j] += '0';
}
result[i+1] = '\0';
strrev(result); // 反转字符串
}
// 减法函数
void subtract(char a[], char b[], char result[])
{
int borrow = 0;
int len_a = strlen(a);
int len_b = strlen(b);
// 对齐两个数的位数
for (int i = 0; i < MAX_LEN - 1; i++) {
if (i < len_a) {
result[i] = a[i] - '0';
} else {
result[i] = 0;
}
if (i < len_b) {
result[i] -= b[i] - '0';
}
result[i] -= borrow;
if (result[i] < 0) {
borrow = 1;
result[i] += 10;
} else {
borrow = 0;
}
}
// 去除前导零
int i;
for (i = MAX_LEN - 2; i >= 0; i--) {
if (result[i] != 0) {
break;
}
}
for (int j = 0; j <= i; j++) {
result[j] += '0';
}
result[i+1] = '\0';
strrev(result); // 反转字符串
}
// 乘法函数
void multiply(char a[], char b[], char result[])
{
int len_a = strlen(a);
int len_b = strlen(b);
// 结果最多有 len_a + len_b 位
for (int i = 0; i < MAX_LEN - 1; i++) {
result[i] = 0;
}
for (int i = 0; i < len_a; i++) {
for (int j = 0; j < len_b; j++) {
result[i+j] += (a[i] - '0') * (b[j] - '0');
}
}
// 对结果进行进位处理
for (int i = 0; i < MAX_LEN - 2; i++) {
result[i+1] += result[i] / 10;
result[i] %= 10;
}
// 去除前导零
int i;
for (i = MAX_LEN - 2; i >= 0; i--) {
if (result[i] != 0) {
break;
}
}
for (int j = 0; j <= i; j++) {
result[j] += '0';
}
result[i+1] = '\0';
strrev(result); // 反转字符串
}
// 输出菜单
void print_menu()
{
printf("请选择功能:\n");
printf("1. A + B\n");
printf("2. A - B\n");
printf("3. A * B\n");
printf("4. 结束程序\n");
}
// 清空输入缓冲区
void clear_input_buffer()
{
while (getchar() != '\n') {}
}
```
在编写代码的过程中,主要遇到了以下两个问题:
1. 数组越界问题
当输入的数字长度超过 40 位时,数组会发生越界,导致程序崩溃。为了解决这个问题,我们需要在定义数组时将长度设为 41,其中最后一位用来存储结束符 '\0'。
2. 输入缓冲区问题
在输入数字时,如果用户输入了非法字符(例如字母或符号),会导致程序出错。为了解决这个问题,我们可以在读取用户输入后,清空输入缓冲区,防止输入错误。
最终,我们得到了一个高精度整数运算程序,可以进行加、减、乘三个操作,满足题目要求。
阅读全文