C语言课程设计报告书
课程名称:C语言课程设计
课题名称:简易计算器
班级:
学号:
姓名:
指导老师:
成绩:
20##年6月
一、 课程设计目的
1. 通过一个学期的学习,我认为要学好C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。特别是作为本科生,更要注重实践这一环节,只有这样我们才能成为合格的计算机人材。通过这次课程设计,进一步巩固所学的语句,如语句嵌套等;加深对循环,分支等结构的运用;最后还可以熟悉四则运算﹑三角函数等经典算法。
2. 通过此次课程设计扩展自己的知识面,课本上的东西是远远不够的,可以通过去图书馆查资料,上网找资料等手段学到一些新知识,比如画图函数,颜色填充函数等。
3. 通过课程设计,加深对结构化程序设计思想的理解,能进行一个系统功能需求分析,并设计合理的模块化结构。提高程序开发能力。
二、设计内容
我设计的是一款简易计算器,界面清楚,操作方便,它能实现以下功能:
1.以界面形式给出计算器功能
2.简单的四则混合运算(支持小括号、优先级)
3.弦、余弦函数计算
4.指数、对数的运算
三、总体设计
简单计算器由五大模块组成,模块设计如下:
图1 模块调用图
1. 主函数 void main()
功能:调用各个主要模块,实现简单计算器的整体功能。
2. 主界面函数void JieMian()
功能:使用有关图形函数模拟出可视化的计算器外观界面,并提供用户输入窗口。
3. 四则混合运算函数void SiZeHunHeYunSuan()
功能:实现简单的加减乘除混合运算,并支持优先级和带括号的运算。
4. 三角运算函数void SanJiaoYunSuan()
功能:实现基本的三角函数运算:sin(x)和cos(x)。
5. 指对数函数void ZhiDuiShuYunSuan()
功能:实现基本的指数和对数运算。
四、详细设计
(一)数据结构设计
1.用initgraph函数初始化图形界面,用outtextxy函数在图形模式下显示需输出内容,用setcolor和setbkcolor函数设置边框颜色和填充颜色,用circle 和rectangle函数来画计算器界面的按键,用gotoxy将数字送入显示区。
函数原型为:
void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver)
void far outtextxy(int x, int y, char far *textstring)
void far setcolor ( int color)
void far setbkcolor ( int color)
void far circle (int x, int y, int r)
void far rectangle (int x, int y, int x, int y)
void far gotoxy(int x, int y)
具体形式:(按键以部分为例,其余相同)
{ initgraph(&driver,&mode,"c:\tc\\bgi");
setcolor(GREEN);
setbkcolor(BLUE);
rectangle(18,18,500,300);
rectangle(30,25,488,65);
circle(50,105,20);
circle(50,175,20);
circle(50,245,20);
outtextxy(318,240,"/");
outtextxy(435,135,"ln");
outtextxy(365,135,"log");
gotoxy(5,3)
2.将表达式转换成波兰式void change(char *work),用两个指针分别指向操作数和运算符。从字符串中依次分离出操作数与运算符。当操作符串为空时,直接存入。当不为空时,与指针最后一个元素,比较优先级,若大于直接存入,否则弹出操作数最后两位进行运算。
(二)模块接口设计:
1.四则混合运算:void SiZeHunHeYunSuan()
首先判断优先级,其过程为
int compare(char symbol)
{ int jud = 0;
switch (symbol)
{case '(': jud = 1: break;
case '*':
case '/':
jud = sym[tops] == '/'?-1:1; break;case ')':
jud=0; break;
case '+':
case '-':
jud = (sym[tops] != '*' && sym[tops] != '/')?1:-1;break;
default:
break;}
return jud;}
四则混合运算包括的子函数的函数原型:
void sizeyunsuan(double num1, char symbol, double num2)
把表达式转化成波兰式
void change(char *work)
图2 四则混合运算函数调用图
2.三角运算:void SanJiaoYunSuan()
包括的子函数的函数原型:
1) double hudu(double x);
把接受到的实数转化为弧度返回。
2) double to_double(char *p);
将字符串转化为实数。
3) double read();
将连续输入的字符整合成一个浮点数并在屏幕上逆向输出将其返回。
4) double sin(double x);
求sinx,实数型参数,返回实数型值。
5) double cos(double x);
求cosx,实数型参数,返回实数型值。
图3 三角运算函数调用图
4.指对数运算:void ZhiDuiShuYunSuan()
包括的子函数的函数原型:
1) double read();
将连续输入的字符整合成一个浮点数在屏幕上逆向输出将其返回。
2) double exp(double x);
求e的x次方,返回双精度实数值。
3) double lnx(double x);
求lnx的值,返回双精度实数值。
图4 指数对数运算函数调用图
(三) 流程图:
1. 主函数流程图
图5 主函数调用图
1. 优先级:接收四则运算多项式的每相邻两个字符,并判断是否是操作符,如是操作符,与之前存入的操作符进行优先级比较。按顺序存入对应数组。
图6 运算级优先级流程图
2. 正弦函数
图7 正弦函数流程图
3. ln函数:
图8 lnx函数流程图
五、调试与测试
遇到的问题:
1.计算器的界面不会做,有时数字显示在边框外面。
2.在四则混合运算中,运算符号的优先级比较难判断。
3.编写ln函数遇到困难。
4.在做计算器界面的时候有些函数没有学过。
采取的解决措施:
1.去图书馆借相关图书,上网查资料,通过自己的阅读,研究,不断的尝试,运行,修改,最终做出了简单的界面,但仍存在很多不足的地方,只能模拟出大体的外观,没能模拟出计算器中的各个键。
2.查在界面显示的函数原型,对比自己的程序,不断修改,对比,调试,检查,反思,最后发现是语句顺序错误,显示写在了判断的后面,修改成功。
3.在编写ln函数的时候,遇到很大困难,最后通过查阅资料,向别人请教编写出了函数。
界面截图及相关说明:
(1)主界面:
:
等待输入表达式
(2)四则混合运算截图:
以上是对四则混合运算1+4*5-2*(3+2)运算结果的界面截图。
(3)三角函数截图:
以上是对Sin 30 运算结果的界面截图
(4)指数函数截图:
以上是对对数函数ln0.999998运算界面的截图。
第二篇:C语言程序设计-计算器C语言程序
#include<stdio.h>
#include<windows.h>
int main()
{
void top();
void
no1(),no2(),no3(),no4(),no5(),no6(),no7(),no8(),no9(),no10(),no11(),no12(),no13(),no14(),no15(),no16(),no17(),no18(),no19(),no20(),no21(),no22(),no23(),no24(),no25();
void menu();
int k=1;char m;
char select;
while(1)
{ system("cls"); //清屏
menu();
system("color 0a"); //绿化 scanf("%c",&select); switch(select) { case'a':no1();break; case'b':no2();break; case'c':no3();break; case'd':no4();break; case'e':no5();break; case'f':no6();break; case'g':no7();break; case'h':no8();break; case'i':no9();break; case'j':no10();break; case'k':no11();break; case'l':no12();break; case'm':no13();break; case'n':no14();break; case'o':no15();break; case'p':no16();break; case'q':no17();break; case'r':no18();break; case's':no19();break; case't':no20();break; case'u':no21();break; case'v':no22();break; case'w':no23();break; case'x':no24();break;
}
scanf("%d",&k);
if(k==0)break;
if(k==1){printf("\n");}
}
return 0;
}
void menu()
{
//printf("\n 老师您好!我是通信2班的陈国昌 学号201130095092\n\n"); printf(" 请键入字母选择功能,按其他键退出:\n\n");
printf(" a.整数加法 h.小数乘法 o.八转十六 v.二进制加法运算\n\n"); printf(" b.整数减法 i.小数除法 p.十进转二 w.二进制减法运算\n\n"); printf(" c.整数乘法 j.二进转八 q.十进转八 x.二进制原补反码\n\n"); printf(" d.整数除法 k.二进转十 r.十转十六\n\n");
printf(" e.整除求余 l.二转十六 s.十六转二\n\n");
printf(" f.小数加法 m.八进转二 t.十六转八\n\n");
printf(" g.小数减法 n.八进转十 u.十六转十\n");
}
void no1()
{ int i,k=1,sum1=0,sum2=0;char num[20],rem[20];
while(k==1){
printf("整数加法,请输入第一个数:\n");
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{if(num[i]>47&&num[i]<58){sum1=sum1*10+num[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:\n");k=1;break;}}} k=1;
while(k==1){
printf("请输入第二个数:\n");
scanf("%s",rem);
for(i=0;rem[i]!=0;i++)
{if(rem[i]>47&&rem[i]<58){sum2=sum2*10+rem[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:");k=1;break;}}} printf("%d+%d=%d\n",sum1,sum2,sum1+sum2);
printf("键入1键继续,键入0键退出.\n");
}
void no2()
{ int i,k=1,sum1=0,sum2=0;char num[20],rem[20];
while(k==1){
printf("整数减法,请输入第一个数:\n");
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{if(num[i]>47&&num[i]<58){sum1=sum1*10+num[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:\n");k=1;break;}}} k=1;
while(k==1){
printf("请输入第二个数:\n");
scanf("%s",rem);
for(i=0;rem[i]!=0;i++)
{if(rem[i]>47&&rem[i]<58){sum2=sum2*10+rem[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:");k=1;break;}}} printf("%d-%d=%d\n",sum1,sum2,sum1-sum2);
printf("键入1键继续,键入0键退出.\n");
}
void no3()
{ int i,k=1,sum1=0,sum2=0;char num[20],rem[20];
while(k==1){
printf("整数乘法,请输入第一个数:\n");
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{if(num[i]>47&&num[i]<58){sum1=sum1*10+num[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:\n");k=1;break;}}} k=1;
while(k==1){
printf("请输入第二个数:\n");
scanf("%s",rem);
for(i=0;rem[i]!=0;i++)
{if(rem[i]>47&&rem[i]<58){sum2=sum2*10+rem[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:");k=1;break;}}} printf("%d*%d=%d\n",sum1,sum2,sum1*sum2);
printf("键入1键继续,键入0键退出.\n");
}
void no4()
{ int i,k=1,sum1=0,sum2=0;char num[20],rem[20];
while(k==1){
printf("整数除法,请输入第一个数:\n");
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{if(num[i]>47&&num[i]<58){sum1=sum1*10+num[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:\n");k=1;break;}}} k=1;
while(k==1){
printf("请输入第二个数:\n");
scanf("%s",rem);
for(i=0;rem[i]!=0;i++)
{if(rem[i]>47&&rem[i]<58){sum2=sum2*10+rem[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:");k=1;break;}}} printf("%d/%d=%d\n",sum1,sum2,sum1/sum2);
printf("键入1键继续,键入0键退出.\n");
}
void no5()
{ int i,k=1,sum1=0,sum2=0;char num[20],rem[20];
while(k==1){
printf("整除求余,请输入第一个数:\n");
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{if(num[i]>47&&num[i]<58){sum1=sum1*10+num[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:\n");k=1;break;}}} k=1;
while(k==1){
printf("请输入第二个数:\n");
scanf("%s",rem);
for(i=0;rem[i]!=0;i++)
{if(rem[i]>47&&rem[i]<58){sum2=sum2*10+rem[i]-48;k=0;}
else{printf("输入错误,输入的只能是0…9的数字,请重新输入:");k=1;break;}}} i=sum1/sum2;
printf("%d除%d商为%d余数为%d\n",sum1,sum2,sum1/sum2,sum1-i); printf("键入1键继续,键入0键退出.\n");
}
void no6()
{
float x,y;
printf("小数加法,请输入第一个数:\n");
scanf("%f",&x);
printf("请输入第二个数:\n");
scanf("%f",&y);
printf("%5.2f+%5.2f=%5.3f\n\n",x,y,x+y);
printf("键入1键继续,键入0键退出.\n");
}
void no7()
{
float x,y;
printf("小数减法,请输入第一个数:\n");
scanf("%f",&x);
printf("请输入第二个数:\n");
scanf("%f",&y);
printf("%5.2f-%5.2f=%5.3f\n\n",x,y,x-y);
printf("键入1键继续,键入0键退出.\n");
}
void no8()
{
float x,y;
printf("小数乘法,请输入第一个数:\n");
scanf("%f",&x);
printf("请输入第二个数:\n"); scanf("%f",&y); printf("%5.2f*%5.2f=%5.3f\n\n",x,y,x*y);
printf("键入1键继续,键入0键退出.\n");
}
void no9()
{
float x,y;
printf("小数除法,请输入第一个数:\n");
scanf("%f",&x);
printf("请输入第二个数:\n");
scanf("%f",&y);
printf("%5.2f/%5.2f=%5.3f\n\n",x,y,x/y);
printf("键入1键继续,键入0键退出.\n");
}
void no10()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("二进转八,请输入二进制数组:\n");
while(k==1){
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]!='0'&&num[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入:\n");k=1;break;}
else{sum=sum*2+num[i]-48;k=0;}
}}
for(j=0;j<=20;j++)
{
rem[j]=sum%8;
if(sum<=7){rem[j]=sum;break;}
else{sum=sum-sum%8;i=sum/8;sum=i;}
}
printf("二进制数组:");
for(i=0;num[i]!=0;i++)
{
printf("%d",num[i]-48);
}
printf(" 的八进制表示为:"); for(i=j;i>=0;i--) { printf("%d",rem[i]); }
printf("\n键入1键继续,键入0键退出.\n");
}
void no11()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("二进转十,请输入二进制数组:\n");
while(k==1){
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]!='0'&&num[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入:\n");k=1;break;}
else{sum=sum*2+num[i]-48;k=0;}
}}
for(j=0;j<=20;j++)
{
rem[j]=sum%10;
if(sum<=9){rem[j]=sum;break;}
else{sum=sum-sum%10;i=sum/10;sum=i;}
}
printf("二进制数组:");
for(i=0;num[i]!=0;i++)
{
printf("%d",num[i]-48);
}
printf(" 的十进制表示为:");
for(i=j;i>=0;i--)
{
printf("%d",rem[i]);
}
printf("\n键入1键继续,键入0键退出.\n");
}void no12()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("二转十六,请输入二进制数组:\n");
while(k==1){
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]!='0'&&num[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入:\n");k=1;break;}
else{sum=sum*2+num[i]-48;k=0;}
}}
for(j=0;j<=20;j++)
{
rem[j]=sum%16;
if(sum<=15){rem[j]=sum;break;}
else{sum=sum-sum%16;i=sum/16;sum=i;}
}
printf("二进制数组:"); for(i=0;num[i]!=0;i++) { printf("%d",num[i]-48); }
printf(" 的十六进制表示为:");
for(i=j;i>=0;i--)
{
if(rem[i]>9&&rem[i]<16){printf("%c",rem[i]+55);}
else{printf("%d",rem[i]);}
}
printf("\n键入1键继续,键入0键退出.\n");
}
void no13()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("八进转二,请输入八进制数组:\n");
while(k==1){
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]<56&&num[i]>47){sum=sum*8+num[i]-48;k=0;}
else {printf("输入错误,输入的只能为0…7的数字,请重新输入:\n");k=1;break;} }}
for(j=0;j<=20;j++)
{
rem[j]=sum%2;
if(sum<=1){rem[j]=sum;break;}
else{sum=sum-sum%2;i=sum/2;sum=i;}
}
printf("八进制数组:");
for(i=0;num[i]!=0;i++) { printf("%d",num[i]-48); } printf(" 的二进制表示为:"); for(i=j;i>=0;i--) { printf("%d",rem[i]); }
printf("\n键入1键继续,键入0键退出.\n");
}
void no14()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("八进转十,请输入八进制数组:\n"); while(k==1){ scanf("%s",num); for(i=0;num[i]!=0;i++) { if(num[i]<56&&num[i]>47){sum=sum*8+num[i]-48;k=0;}
else {printf("输入错误,输入的只能为0…7的数字,请重新输入:\n");k=1;break;} }}
for(j=0;j<=20;j++)
{
rem[j]=sum%10;
if(sum<=9){rem[j]=sum;break;}
else{sum=sum-sum%10;i=sum/10;sum=i;}
}
printf("八进制数组:");
for(i=0;num[i]!=0;i++)
{
printf("%d",num[i]-48);
}
printf(" 的十进制表示为:");
for(i=j;i>=0;i--)
{
printf("%d",rem[i]);
}
printf("\n键入1键继续,键入0键退出.\n");
}
void no15()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("八转十六,请输入八进制数组:\n"); while(k==1){ scanf("%s",num); for(i=0;num[i]!=0;i++) { if(num[i]<56&&num[i]>47){sum=sum*8+num[i]-48;k=0;} else {printf("输入错误,输入的只能为0…7的数字,请重新输入:\n");k=1;break;} }} for(j=0;j<=20;j++) { rem[j]=sum%16; if(sum<=15){rem[j]=sum;break;} else{sum=sum-sum%16;i=sum/16;sum=i;} } printf("八进制数组:"); for(i=0;num[i]!=0;i++) { printf("%d",num[i]-48); }
printf(" 的十六进制表示为:");
for(i=j;i>=0;i--)
{
if(rem[i]>9&&rem[i]<16){printf("%c",rem[i]+55);}
else{printf("%d",rem[i]);}
}
printf("\n键入1键继续,键入0键退出.\n");
}
void no16()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("十进转二,请输入十进制数组:\n");
while(k==1){
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]<58&&num[i]>47){sum=sum*10+num[i]-48;k=0;}
else {printf("输入错误,输入的只能为0…9的数字,请重新输入:\n");k=1;break;} }}
for(j=0;j<=20;j++)
{
rem[j]=sum%2;
if(sum<=1){rem[j]=sum;break;}
else{sum=sum-sum%2;i=sum/2;sum=i;} } printf("十进制数组:"); for(i=0;num[i]!=0;i++) { printf("%d",num[i]-48); } printf(" 的二进制表示为:"); for(i=j;i>=0;i--) { printf("%d",rem[i]); }
printf("\n键入1键继续,键入0键退出.\n"); }
void no17()
{
int i,j,k=1,sum=0;char num[20],rem[20];
} printf("十进转八,请输入十进制数组:\n"); while(k==1){ scanf("%s",num); for(i=0;num[i]!=0;i++) { if(num[i]<58&&num[i]>47){sum=sum*10+num[i]-48;k=0;} else {printf("输入错误,输入的只能为0…9的数字,请重新输入:\n");k=1;break;} }} for(j=0;j<=20;j++) { rem[j]=sum%8; if(sum<=7){rem[j]=sum;break;} else{sum=sum-sum%8;i=sum/8;sum=i;} } printf("十进制数组:"); for(i=0;num[i]!=0;i++) { printf("%d",num[i]-48); } printf(" 的八进制表示为:"); for(i=j;i>=0;i--) { printf("%d",rem[i]); } printf("\n键入1键继续,键入0键退出.\n");
void no18()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("十转十六,请输入十进制数组:\n");
while(k==1){
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]<58&&num[i]>47){sum=sum*10+num[i]-48;k=0;}
else {printf("输入错误,输入的只能为0…9的数字,请重新输入:\n");k=1;break;} }}
for(j=0;j<=20;j++)
{
rem[j]=sum%16;
if(sum<=15){rem[j]=sum;break;}
else{sum=sum-sum%16;i=sum/16;sum=i;}
}
printf("十进制数组:");
for(i=0;num[i]!=0;i++)
{
printf("%d",num[i]-48);
}
printf(" 的十六进制表示为:");
for(i=j;i>=0;i--)
{
if(rem[i]>9&&rem[i]<16){printf("%c",rem[i]+55);}
else{printf("%d",rem[i]);}
}
printf("\n键入1键继续,键入0键退出.\n");
}
void no19()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("十六转二,请输入十六进制数组:\n");
while(k==1){
scanf("%s",num);//开始时我想到用getchar()的,但时做时输入都要把getchar()循环,很麻烦,所以就用scanf("%s",num);
for(i=0;num[i]!=0;i++)//num[i]!=0;的i值可以确定,下面会用到时。
{if(num[i]>47&&num[i]<58){rem[i]=num[i]-48;k=0;}
//初始化k=0;下面若成功运行k继续为0。
else if(num[i]>64&&num[i]<71){rem[i]=num[i]-55;k=0;}
/*大写字母ABCDEF转化成10.11.12.13.14.15来存在num[i]数组里;一直不输错就k=0;自动跳出for循环。*/
else if(num[i]>96&&num[i]<103){rem[i]=num[i]-87;k=0;}
//小写字母abcdef转化成10.11.12.13.14.15来存在num[i]数组里;一直不输错就k=0;自动跳出for循环。
else {printf("输入错误,只能输入数字0…9或大小写字母A…F,a…f.请重新输入:\n");k=1;break;}
//若输错就令k=1;跳出循环重新提示输入。
}} for(i=0;num[i]!=0;i++){sum=sum*16+rem[i];}
for(j=0;j<=20;j++)
{
rem[j]=sum%2;
if(sum<=1){rem[j]=sum;break;}//sum<=1时直接把sum赋给rem[j]并跳出循环;因为不管sum怎么%2,它的余数都最小也只能是0和1。
else{sum=sum-sum%2;i=sum/2;sum=i;}
}
printf("十六进制数组:");
for(i=0;num[i]!=0;i++)
{
printf("%c",num[i]);
}
printf(" 的二进制表示为:");
for(i=j;i>=0;i--)
{
printf("%d",rem[i]);
}
printf("\n键入1键继续,键入0键退出.\n");
}
void no20()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("十六转八,请输入十六进制数组:\n");
while(k==1){
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{if(num[i]>47&&num[i]<58){rem[i]=num[i]-48;k=0;}
else if(num[i]>64&&num[i]<71){rem[i]=num[i]-55;k=0;}
else if(num[i]>96&&num[i]<103){rem[i]=num[i]-87;k=0;}
else {printf("输入错误,只能输入数字0…9或大小写字母A…F,a…f.请重新输入:\n");k=1;break;}
}} for(i=0;num[i]!=0;i++){sum=sum*16+rem[i];}
for(j=0;j<=20;j++)
{
rem[j]=sum%8;
} if(sum<=7){rem[j]=sum;break;} else{sum=sum-sum%8;i=sum/8;sum=i;} printf("十六进制数组:"); for(i=0;num[i]!=0;i++) { printf("%c",num[i]); }
printf(" 的八进制表示为:");
for(i=j;i>=0;i--)
{
printf("%d",rem[i]);
}
printf("\n键入1键继续,键入0键退出.\n");
}
void no21()
{
int i,j,k=1,sum=0;char num[20],rem[20];
printf("十六转十,请输入十六进制数组:\n"); while(k==1){ scanf("%s",num); for(i=0;num[i]!=0;i++) {if(num[i]>47&&num[i]<58){rem[i]=num[i]-48;k=0;} else if(num[i]>64&&num[i]<71){rem[i]=num[i]-55;k=0;} else if(num[i]>96&&num[i]<103){rem[i]=num[i]-87;k=0;}
else {printf("输入错误,只能输入数字0…9或大小写字母A…F,a…f.请重新输入:\n");k=1;break;}
}} for(i=0;num[i]!=0;i++){sum=sum*16+rem[i];}
for(j=0;j<=20;j++)
{
rem[j]=sum%10;
if(sum<=9){rem[j]=sum;break;}
else{sum=sum-sum%10;i=sum/10;sum=i;}
}
printf("十六进制数组:");
for(i=0;num[i]!=0;i++)
{
printf("%c",num[i]);
}
printf(" 的十进制表示为:");
for(i=j;i>=0;i--) { printf("%d",rem[i]); }
printf("\n键入1键继续,键入0键退出.\n");
}
void no22()
{
int i,j,k=1,sum=0,sum1=0,sum2=0;//
char num[20],rem[20],three[25];
printf("二进制加法请输入第一组二进制数组,按回车确定:\n");
while(k==1){
sum1=0;
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]!='0'&&num[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入第一组二进制数组:\n");k=1;break;}
else{sum1=sum1*2+num[i]-48;k=0;}
}}
k=1;
printf("请输入第二组二进制数组,按回车确定:\n");
while(k==1){
sum2=0;
scanf("%s",rem);
for(i=0;rem[i]!=0;i++)
{
if(rem[i]!='0'&&rem[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入第二组二进制数组:\n");k=1;break;}
else{sum2=sum2*2+rem[i]-48;k=0;}
}}
sum=sum1+sum2;
printf("它们的和为:%d ;",sum); for(k=0;k<=50;k++) { three[k]=sum%2; if(sum<=1){three[k]=sum;break;} else{sum=sum-sum%2;i=sum/2;sum=i;} } printf("用二进制表示为:"); for(i=k;i>=0;i--) { printf("%d",three[i]);
}printf(".");
printf("\n");
printf("\n键入1键继续,键入0键退出.\n");
}
void no23()
{
int i,j=0,k=1,sum=0,sum1=0,sum2=0;
char num[20],rem[20],three[25];
printf("二进制减法请输入第一组二进制数组,按回车确定:\n");
while(k==1){
sum1=0;
scanf("%s",num);
for(i=0;num[i]!=0;i++)
{
if(num[i]!='0'&&num[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入第一组二进制数组:\n");k=1;break;}
else{sum1=sum1*2+num[i]-48;k=0;}
}}
k=1;
printf("请输入第二组二进制数组,按回车确定:\n");
while(k==1){
sum2=0;
scanf("%s",rem);
for(i=0;rem[i]!=0;i++)
{
if(rem[i]!='0'&&rem[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入第二组二进制数组:\n");k=1;break;}
else{sum2=sum2*2+rem[i]-48;k=0;}
}}
sum=sum1-sum2;
printf("它们的差为:%d ;",sum); if(sum<0){sum=-sum;j=1;} for(k=0;k<=50;k++) { three[k]=sum%2; if(sum<=1){three[k]=sum;break;} else{sum=sum-sum%2;i=sum/2;sum=i;} } printf("用二进制表示为:"); if(j==1){printf("-");} for(i=k;i>=0;i--) {
printf("%d",three[i]); }printf("."); printf("\n");
printf("\n键入1键继续,键入0键退出.\n");
}
void no24()//二进制数原反补码
{
int h=0,i,j=0,k=1,l=0,sum=0,sum1=0,sum2=0;
char num[10],rem[10],three[10];
printf("二进制原反补码\n\n请输入一组位数为1…7位的二进制数组正数不用带+号,负数要带-号,按回车确定:\n");
while(k==1){
sum1=0;
scanf("%s",num);
if(num[0]==45){num[0]='0';h=1;}
//判断输入的第一个字符是不是负号,如果是,就让它等于0,并令h=1,使下一步执行负数的求原反补码。
for(i=0;num[i]!=0;i++)
{
if(num[i]!='0'&&num[i]!='1'){printf("输入错误,输入的只能是0和1,请重新输入:\n");k=1;break;}
else{sum=sum*2+num[i]-48;k=0;}
}}
if(h==0){//原来h就已经赋初值为0,默认输入正数就执行这一个模块。
printf("它的原码为:");
printf("0");
for(l=7-i;l>0;l--){printf("0");}
for(l=0;l<i;l++){printf("%d",num[l]-48);}
printf(" 反码为:");
printf("0");
for(l=7-i;l>0;l--){printf("0");}
for(l=0;l<i;l++){printf("%d",num[l]-48);}
printf(" 补码为:");
printf("0");
for(l=7-i;l>0;l--){printf("0");}
for(l=0;l<i;l++){printf("%d",num[l]-48);}
}
else {/*定义了一个新数组three[10]用以记录反码数组,为下面的补码比反码大1作一个准备,*/
//当输入负数时会检测到负号并令h=1,使上面的模块就不能执行而执行这一模块。 printf("它的原码为:");
printf("1");//不管负数是多少,第一个都是1;所以输出1;(注意的是不能加\n来换
行)
for(l=8-i;l>0;l--){printf("0");}
/*我是这样想的,当输入一个三位的负数,若输入的是-110时,
我在上面已经把这个数组变成了0110,并使i记录下了位数是3+1=4位, 所以除去开头的1占了一位,余下的还有8-1-i(i我现在假设是4)=3位,
这3位的座次依次是[1],[2]…[7-i],这个范围的数组都可以直接输出0,
而之前又把负号变成了0,所以实际操作时直接把[1],[2]…[8-i]的位置输出作0;(不能加\n换行)*/
for(l=1;l<i;l++){printf("%d",num[l]-48);}
printf(" 反码为:"); for(l=8-i;l>0;l--){printf("1");three[l]=1;} /*除去第一位及从[9-i]…[7](即最后一位),的都输出1,并在数 */ j=9-i; for(l=0;l<i;l++){ if(num[l]=='0'){printf("1");three[j]=1;j=j+1;} else{printf("0");three[j]=0;j=j+1;}} //上面两行代码确定了数组three[]从第9-i位开始至数级最后一位的值 sum=0; for(l=1;l<9;l++){sum=sum*2+three[l];} printf("补码为:"); h=1; //three数组记录了反码,求和 sum=sum+1; if(sum>254){printf("000000000");h=0;}
/*这里用以判断用户是不是输入-1111111;
因为输入这样的数后反码会变成11111111,
加一后变成100000000,共九位,而实际规定要写成00000000,
所以有点不按常规*/
while(h==1){/*上面判断到输入的不是-1111111时h的值依然为1,
按常规执行这一模块把数%2后以数组形式输出。*/
for(j=0;j<=7;j++)
{
num[j]=sum%2;
if(sum<=1){num[j]=sum;break;}
else{sum=sum-sum%2;i=sum/2;sum=i;}
}
for(i=j;i>=0;i--){printf("%d",num[i]);} h=2;
}
}
printf("\n键入1键继续,键入0键退出.\n");
}