三、设计方法和基本原理
1. 课题功能描述
本程序的功能:由用户输入两个五进制无符号整数,计算得到它们的和、差并输出。
程序运行时,提示用户输入两个五进制整数,如:
Please input number: 34210234
Please input number: 243102
程序计算后,输出运算结果:
34210234+243102=40003341
34210234-243102=33412132
2. 问题的解决方案
注意:问题的解决方案有很多,下面给出的一种仅供同学们参考。
根据问题的描述,使用字符数组来存放输入的两个五进制无符号整数和运算结果,并按字符串进行输入和输出。
为实现程序的功能,可按照下述过程完成程序(仅供参考,可自行设计实现过程及方法):
输入两个数据到字符数组中
因输入时数据的高位在下标为0的元素中,所以要对两个字符数组中的字符串求逆序
调用相加函数求两个数的和,然后输出
调用相减函数求两个数的差,然后输出
本程序应采用模块化设计方法,设计几个功能模块。例如(仅供参考):
输入函数:完成一个五进制无符号整数的输入。输入数据到字符数组中,然后检验用户输入的数据是否合法(例五进制数中只能出现0~4),合法则返回,否则继续输入。
求字符数组中字符串的逆序:因输入时数据的高位在下标为0的元素中,为使运算时从0开始循环,所以要对两个字符数组中的字符串求逆序。
求两个数据(字符数组中)的和
求两个数据(字符数组中)的差
我们知道,用户输入的数字4在字符数组中存放的是字符4的ASCII码值51。在运算中要将字符转换成对应的数字,运算后还要将其转换为字符存入字符数组,为此编写两个函数将字符与数字之间的转换作为独立模块,供上面的运算模块调用。例如(仅供参考):
字符转数字
数字转字符
主函数中控制函数调用完成输入、计算,并输出计算结果。
四、主要技术问题的描述
1) 单个字符与数字的转换
在字符转数字时,'0'~'4'只需减去'0'即可;同样的,数字转字符时,只需加上'0'。
2) 求两个数据(字符数组中)的和
从低位向高位逐位相加,每位数字相加时,实际是三个数字相加:两个加数的当前位数字和低位向当前位的进位。要将两个加数的数组元素(字符型)转换成相应的数字再相加,相加后转换为字符存入存放和的字符数组中。最后对存放和的字符数组求逆序,使得高位存放在下标为0的元素中。
3) 虽然进行的是两个无符号整数的运算,但相减后可能得到一个负数,考虑如果第1个数小于第2个数时如何得到一个负数差;
五、创新要求
实现程序功能后,可进行创新设计:
1) 使用多文件,即主函数和各个函数分别存放在不同的.cpp文件中,在头文件中进行函数原型声明;
2) 实现两个带符号整数的运算;
3) 求两个五进制无符号整数的乘积(两个因子相乘时,当其中的两个数位相乘时,如a[i]*b[j],对应的乘积的数位应该是i+j)。
4) 本程序实现的是五进制无符号整数的运算,可扩充程序功能,由用户输入数据使用的进制,然后输入两个整数,由程序计算并输出这两个数据的和、差及乘积。
方法1
小数字相加运算
首先熟悉加法的概念。拿出一把小黄豆(或其它小物体)。将一些黄豆放在一边形成一堆,然后从1开始数这一堆黄豆有多少个(从1、2、3数到最后一个黄豆)。数到最后一个黄豆的数字就是这一堆黄豆的总数。在纸上记录黄豆总数的数字。然后再数另一堆有多少个黄豆。
学习“数对”。由于大多数人都习惯以10为单位计数,所以熟记和为10的一对数可以让加法更简单。掌握那些两数和为10的数对。
尽可能地将数字配对组成“数对”。尽可能地将数字和数字配对,使之和为十的倍数。
将额外部分数字相加。凑完整十数之后,再加上余下的数字,用笔算或心算将其相加即可。
仔细检查你的运算结果。只要有时间,你最好每次都用其它方法来复检你的运算结果以保证运算正确。
方法2
大数目相加运算
学习数位的概念。当你书写数字时,每个数字的位置都有其特定的名字或类型。掌握数位的概念可以帮助你正确地排列数字及运算
排列数字。在计算加法运算时,先将数字按位数从多到少来从上向下地排列数字。排列数字是为了让数字的每个相同的数位进行对齐。如果一个数字没有高位数,那么就在其左侧空出一个数位。
将第一列数字相加。从右边开始,将最右侧的一列数字相加。将相加得到的结果写在这一列的下方位置。按照该法将其它列数字相加并写下结果。
向前一个数位进位。如果个位数数字相加得到的结果在十位数上有数字,那么在左侧一栏的顶部写下十位上的数字。
计算下一栏。计算完个位数一栏,我们需要计算左侧十位上数字之和,这也包括进位的数字。然后将计算结果写在中间栏的下方。
方法3
小数的加法运算
将小数进行排列。当一个数字带有小数点时,那么你在计算小数相加时要格外仔细才行。主要的窍门就是根据小数点的位置排列所有数字。数字的小数点对齐,自成一列。
方法4
分数的加法运算
将各个分数的分母化为相同的分母。分母是分数式横线下方的数字。在计算分数相加时,你需要将分母化成相同的数字,然后将分子相加。你可以将分子分母同时乘以(或除以)一个相同的数字来
化简分数。你也许希望简化分数来方便阅读。你可以用分子和分母同时除以其相同的因数来化简分数。在本例中,我们不需要化简。因为它已经是最简形式了。但是如果你得到的是一个像3/6这样的结果,那么你需要将其进行化简。
当我们发现分子分母可以同时除以一个小数字时,我们就可以将分数化简。在本例中,我们用两者都除以3来化简,得到结果1/2。
方法5
加法技巧
凑数计算。如果你只计算几个数字的和,并且这些数字中没有恰巧可以凑成整10数的,那么你可以通过加上或者减去一个数来简化计算。
利用数字的形状。如果你想快速心算,那么分组的方法可能并不适合你。你可以利用数字的形状计算加法,而不是靠数手指。这个方法最适合用于几个数字求和的情况。
#include "stdlib.h"
#include "string.h"
int pan(char a[])//判断是否有大于4的数
{int i=strlen(a)-1;
while(i>=0)
if(a[i]>'4')
return 0;
else i--;
return 1;
}
void jia(char a[],char b[],char c[])//将a,b相加,结果存放于c
{int i=strlen(a)-1,j=strlen(b)-1,n=99,t,q;
for(t=i,q=n;t>=0;t--,q-- )
c[q]=a[t];
for(;j>=0;j--,n--)
{c[n]=c[n]+b[j]-'0';
if(c[n]>'4')
{c[n]=c[n]-5;c[n-1]++;}}
}
void jian(char a[],char b[],char c[])//将a,b相减,结果存放于c
{int i=strlen(a)-1,j=strlen(b)-1,n=99,t,q;
for(t=i,q=n;t>=0;t--,q-- )
c[q]=a[t];
for(;j>=0;j--,n--)
if(c[n]-b[j]<0)
{c[n-1]--;c[n]=c[n]+5-b[j]+'0';}
else c[n]=c[n]-b[j]+'0';
if(c[n]<'0')
c[n]='-';
}
int main()
{char a[100],b[100],c[100],d[100];
int i,j,n,sum=0;
for(i=0;i<100;i++)
{c[i]='0';
d[i]='0';}//c,d存放结果
while (1)//判断输入是否正确
{printf("请输入二个五进制数:\n");
scanf("%s",a);
scanf("%s",b);
if(pan(a)&&pan(b))
break;}
jia(a,b,c);//调用加法 //将a,b相加,结果存放于c
for(i=0;;i++)
if(c[i]>'0')
break;
printf("\n%s+%s=",a,b);
for(;i<100;i++)
printf("%c",c[i]);
jian(a,b,d);//调用减法//将a,b相减,结果存放于d
for(i=0;;i++)
if(d[i]!='0')
break;
printf("\n%s-%s=",a,b);
if(i==100)
printf("0");
else
for(;i<100;i++)
printf("%c",d[i]);
system("pause");
}本回答被提问者和网友采纳
法2:做加法逢5进1,做减法不够退1.
举个例子:32+124
列出算式:
124
+
32
▁▁▁▁
211
4+2=6=5+1=11(进1);2+3+1=6=5+1=11(进1);1+1=2;结果是211
举个减法的例子:211-32
列出算式:
211
-
32
▁▁▁▁
124
个位数不够,退1,11-2=5+1-2=4;十位数不够,退1,10-3=5-3=2
结果是124
这样说应该明白了吧^^