当前位置:文档之家› 软件设计

软件设计

通信与信息工程学院2015 /2016 学年第一学期软件设计实验报告模块名称VC++软件设计课程专业电子信息工程学生班级学生学号学生姓名指导教师题目一(R010E)千分位要求:将一个正整数n(长整型)输出成“千分位”形式,即从个位数起,每三位之间加一个逗号,例如,将7654321输出成7,654,321。

1、问题分析与方案设计。

(1)方案设计:如果该正整数小于一千,则不用转换,如果大于一千则要,也就是一个数除以一千,取整,在整数后面加一个逗号后再写上余数。

由于题目要求定义n为无符号长整型,则输入数不能大于长整型的范围,即不大于2147483647,因此加一个条件控制用户输入范围,输入不满足则重新输入。

(2)流程图:2、编程实现。

#include<stdio.h>void main(){char c=',';unsigned long n=0;for(; ;){printf("请输入一个正整数n(不大于2147483647):\n"); scanf("%u",&n);if(n>2147483647||n<0){printf("输入不符合条件,请重新输入\n"); }else{int i=0,j=0,a[10]={0};if(n<1000)printf("%u",n); //如果输入的数小于一千,则直接输出else{for(i=0;n>=1000;i++){a[i]=n%1000; //取余n/=1000; //取整数j=i+1;}a[j]=n;for(i=j;i>0;i--){printf("%u%c",a[i],c);}printf("%u",a[0]);}printf("\n");}}}3、测试数据、测试结果、结果分析。

(1)测试结果图:(2)结果分析:题目要求输入为一个无符号长整型,则输入数不能大于2147483647,这样的限制在实际中不实用,若改为输入一个字符串的形式则较实用,以下为更改程序:#include<stdio.h>#include<string.h>int main(void){ char c[1000]={0};int i,len,k;gets(c);len=strlen(c);k=len%3;for(i=0;i<k;i++)printf("%c",c[i]);if(k!=0)printf(",");for(i=k;i<len;i++){printf("%c",c[i]);if(((i-k+1)%3==0)&&(i!=len-1))printf(",");}printf("\n");return 0;}题目二(P018M)进制转换编制不同数制间的转换程序。

要求提供输入输出界面,当输完一个任意十进制数字,程序能自动将其转化为另外的数制表示的值,包括二进制、八进制和十六进制。

1、问题分析与设计。

(1)设计思想:先显示一个功能菜单供用户选择。

程序设计两个函数,分别是十进制的数转化成其他进制数程序,及其他程序转换成十进制的程序。

如果二进制、八进制、十进制、十六进制要转换成其他进制的数,首先要判断他们是否是输入正确的特定进制的数,然后转换成十进制,再由十进制转换成其他进制。

(2)程序流程图:2、编程实现。

#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>void dis_menu(); //菜单显示void set_menu(); //菜单设置void DX_transfer(int num,int n); //十进制转换为其他进制int XD_transfer(int n); //其他进制转换成十进制int main(){while(1){dis_menu();set_menu();}return 0;}void dis_menu() //菜单显示{printf("\t******************************************************\n"); printf("\t****************进制转换器程序************************\n"); printf("\t******************************************************\n"); printf("\t** 1、输入二进制 **\n"); printf("\t** 2、输入八进制 **\n"); printf("\t** 3、输入十进制 **\n"); printf("\t** 4、输入十六进制 **\n"); printf("\t** 5、退出程序 **\n"); printf("\t******************************************************\n"); printf("\t请选择你要进行的操作:");}void set_menu() //菜单设置{int num;char n[5];scanf("%s",n);if(strlen(n)>1){ printf("\t输入错误!请重新输入:");set_menu();}else{ switch(*n){case '1': num=XD_transfer(2);DX_transfer(num,8);printf("\t转换10进制输出为:%d\n",num);DX_transfer(num,16); printf("\t\n");break;case '2': num=XD_transfer(8);DX_transfer(num,2);printf("\t转换10进制输出为:%d\n",num);DX_transfer(num,16); printf("\t\n");break;case '3': num = XD_transfer(10);DX_transfer(num,2);DX_transfer(num,8);DX_transfer(num,16);printf("\t\n");break;case '4': num=XD_transfer(16);DX_transfer(num,2);DX_transfer(num,8);printf("\t转换10进制输出为:%d\n",num);printf("\t\n");break;case '5': printf("\t");exit(1);break;default: printf("\t输入错误!请重新输入:");set_menu();break;}}}void DX_transfer(int num,int n) //十进制转换为其他进制{char num_tp[100];int i=0;printf("\t转换%d进制输出为:",n);if(n<16){while(num!=0) //除以n取余数{num_tp[i]='0'+num%n;num=num/n;i++;}num_tp[i]='\0';while(i!=0)putchar(num_tp[--i]);}else{while(num!=0){if(num%16>9&&num%16<16)num_tp[i]='A'+(num%16-10);elsenum_tp[i]='0'+num%16;num=num/16;i++;}num_tp[i]='\0';while(i!=0)putchar(num_tp[--i]);}printf("\n");}int XD_transfer(int n) //其他进制转换成十进制{char temp[100],ch,m;int num=0,i=0,flag=1,count=0;while(flag){i=0;flag=0;count=0;fflush(stdin); //清空输入缓冲区,确保读入无错printf("\t请输入%d进制数:",n);m=48+n-1;if(n<16){while((ch=getchar())!='\n'){if(ch<'0'||ch>m){printf("\t输入数字有误!\n");flag=1;break;}temp[i]=ch;count++;i++;}temp[i]='\0';// 输入正确2或8进制结束for(i=0;i<count;i++){num=num+(temp[i]-'0')*(int)pow(n,(count-i-1));//计算值}}else{while((ch=getchar())!='\n'){if((ch<'0'||ch>'9')&&(ch<'A'||ch>'F')&&(ch<'a'||ch>'f')){printf("\t输入数字有误!\n");flag=1;break;}temp[i]=ch;count++;i++;}temp[i]='\0';// 输入正确十六进制结束for(i=0;i<count;i++){if(temp[i]>='0'&&temp[i]<='9')num=num+(temp[i]-'0')*(int)pow(16,(count-i-1));//计算值else if(temp[i]>='A'&&temp[i]<='F'){num=num+((temp[i]-'A')+10)*(int)pow(16,(count-i-1));}else if(temp[i]>='a'&&temp[i]<='f'){num=num+((temp[i]-'a')+10)*(int)pow(16,(count-i-1));}}}}return num;}3、测试数据、测试结果、结果分析。

相关主题