目录-------------------------------------------------------------------------------------------- 一.第一章两个大数相乘问题
二.第二章学生信息管理系统设计
三.第三章职工信息管理系统设计
-------------------------------------------------------------------------------------------------------------
第一章两个大数相乘问题
§1.题目描述
本问题中,要求输入两个相对较大的正整数,能够通过程序计算出其结果。
§2.算法设计
※①先给任意两个大数并存放在数组a[],b[]中,然后数组相乘,利用数组中数字的高低位次关系设计循环,找出相乘结果的每一项数值来并存放在数组c[]中;
②又由于上一步所得每一项数值中有多位数,再用进位关系把最后结果的每一项化成一位数;
③最后依次输出数组c[]中的每一项,注意输出顺序。
流程图:
§3.程序设计及代码分析
※※重点有两步:
第一步是初步找出相乘结果的每一项数值,设计思路是:
4 3 2 1 2 1 --------数字代表位次,数字越大位次越高
例如:数组a[4]={1,2,3,4}和b[2]={2,3}相乘所得结果每一项按照位次高低依次为:
6 5 4 3 2 ----数字代表位次,数字越大位次越高
1*2 1*3+2*2 2*3+3*2 3*3+4*2 4*3
其代码可以设计为:
char a[500],b[500];int c[500];
x=strlen(a);
y=strlen(b);
for(i=0;i for(j=0;j c[x-i-1+y-j-1]+=(a[i]-'0')*(b[j]-'0'); /*初步找出结果的每一项*/ 第二步是把每一项化成一位数,就是用进位关系,思路比较简单,其代码为: for(i=0;i { c[i+1]+=c[i]/10; c[i]%=10; } /*用进位关系把每一项化为一位数*/ §4.实验数据及运行效果截图 §5.设计中出现的错误及解决方法 在将算法转化为代码时,在初步找出相乘结果的每一项上的代码调试的次数比较多,在设计循环时,c[x-i-1+y-j-1]+=(a[i]-'0')*(b[j]-'0');这句代码是最难搞清楚的,后来举了一个例子,1234*23=28382,终于写出了这句代码。 第二章学生信息管理系统设计 §1.题目描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能: 1系统以文本菜单方式工作, 2学生信息录入功能(学生信息最好用文件保存)---输入 3学生信息浏览功能---输出 4查询、排序功能---算法 5按学号查询 6按姓名查询 7学生信息的删除与修改(可选项) §2.算法设计 ※题目二和题目三这两个信息系统的算法设计总体上是一致的,要求系统以菜单方式工作,就需要设置主菜单,来调用下面的功能菜单,这些功能菜单包括刷新,查询,修改,增加,删除,显示,保存,退出系统,其中查询可以按学号和姓名查询,删除按学号来删除。 流程图: §3.程序设计及代码分析 ※※3.1 主菜单设计: void menu() { int num; printf("\n\n中国地质大学(武汉)学生信息管理系统\n\n"); printf(" 查询前请刷新系统!\n\n"); printf(" 1.刷新学生信息 \n"); printf(" 2.查询学生信息 3.修改学生信息 \n"); printf(" 4.增加学生信息 5.按学号删信息 \n"); printf(" 6.显示当前信息 7.保存当前信息 \n"); printf(" 8.退出系统|\n\n"); printf("请选择菜单编号: "); scanf("%d",&num); switch(num) { case 0:help();break; case 1:readfile();break; case 2:seek();break; case 3:modify();break; case 4:insert();break; case 5:del();break; case 6:display();break; case 7:save();break; case 8:k=0;break; default:printf("请在0-8之间选择\n"); } } /*用swich-case调用八个功能子菜单*/ 3.2 一共有八个子菜单,代码太多,在这里选择查询,修改两个子菜单来说明。 1. 查询: void seek() /*查找*/ { int i,item,flag; char s1[21]; printf("------------------\n"); printf("-----1.按学号查询-----\n"); printf("-----2.按姓名查询-----\n"); printf("-----3.退出本菜单-----\n"); printf("------------------\n"); while(1) { printf("请选择子菜单编号:") scanf("%d",&item); flag=0; switch(item) { /*用swich-case条件语句来调不同方式查询*/ case 1: printf("请输入要查询的学生的学号:\n"); scanf("%s",s1); for(i=0;i if(strcmp(stu[i].code,s1)==0) { flag=1; printf("学生学号学生姓名年龄性别出生年月地址电话E-mail\n"); printf("%6s %7s %6d %5s %9s %8s %10s %14s\n",stu[i].code,stu[i].name,stu[i].age, stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail); } if(flag==0) printf("该学号不存在!\n"); break; case 2: printf("请输入要查询的学生的姓名:\n"); scanf("%s",s1); for(i=0;i if(strcmp(stu[i].name,s1)==0) /*比较字符串是否相等*/ { flag=1; printf("学生学号学生姓名年龄性别出生年月地址电话E-mail\n"); printf("--------------------------------------------------------------------\n"); printf("%6s %7s %6d %5s %9s %8s %10s %14s\n",stu[i].code,stu[i].name,stu[i].age, stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail); } if(flag==0) printf("该姓名不存在!\n"); break; case 3:return; default:printf("请在1-3之间选择\n"); } } } 2.修改: void modify() /*修改信息*/ { int i,item,num; char sex1[3],s1[16],s2[16]; printf("请输入要要修改的学生的学号:\n"); scanf("%s",s1); for(i=0;i if(strcmp(stu[i].code,s1)==0) /*比较字符串是否相等*/ num=i; printf("------------------\n"); printf("1.修改姓名\n"); printf("2.修改年龄\n"); printf("3.修改性别\n"); printf("4.修改出生年月\n"); printf("5.修改地址\n"); printf("6.修改电话号码\n"); printf("7.修改E-mail地址\n"); printf("8.退出本菜单\n"); printf("------------------\n"); while(1) { printf("请选择子菜单编号:"); scanf("%d",&item); switch(item) { /*同样用到swich-case语句依次输入所有信息 case 1: printf("请输入新的姓名:\n"); scanf("%s",s2); strcpy(stu[num].name,s2); break; case 2: printf("请输入新的年龄:\n"); scanf("%d",&stu[num].age); break; case 3: printf("请输入新的性别:\n"); scanf("%s",sex1); strcpy(stu[num].sex,sex1); break; case 4: printf("请输入新的出生年月:\n"); scanf("%s",s2); strcpy(stu[num].time,s2); break; case 5: printf("请输入新的地址:\n"); scanf("%s",s2); strcpy(stu[num].add,s2); break; case 6: printf("请输入新的电话号码:\n"); scanf("%s",s2); strcpy(stu[num].tel,s2); break; case 7: printf("请输入新的E-mail地址:\n"); scanf("%s",s2); strcpy(stu[num].mail,s2); break; case 8:return; default:printf("请在1-8之间选择\n"); } } } §4.实验数据及运行效果截图 §5.设计中出现的错误及解决方法 我是先做的职工信息系统,再做学生信息系统时,基本框架已经清楚,文件,数组和一些条件语句比较熟练了,但在一些函数的使用上起初还不了解,strcmp,strcpy的意义,还得查书,其他的就是琐碎的问题了,经过多次调试,还是可以做的比较完整。 第三章职工信息管理系统设计 §1.题目描述 职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。试设计一职工信息管理系统,使之能提供以下功能: 系统以菜单方式工作 1职工信息录入功能(职工信息用文件保存)--输入 2职工信息浏览功能--输出 3查询和排序功能:(至少一种查询方式) --算法 4按工号查询 5按学历查询等 6职工信息删除、修改功能(任选项) §2.算法设计 ※①总体上,可以设计成主菜单下辖子菜单的形式,子菜单即该职工信息管理系统包括的各种功能,包括创建,增加,修改,浏览,查询,退出这些功能。 ②主菜单程序中可以用swich-case语句来调用不同的子菜单,其中查询方式有两种按工号查询和按学历查询。 流程图: 工号 学历 §3.程序设计及代码分析 ※※3.1 主菜单设计: void menu() { int n,w1; do { printf("\t\t中国地质大学(武汉)职工信息系统\t\t\t\t\t\t\t\n"); printf("\t\t 选择功能\n\n"); printf("\t\t 1 创建新数据\n\n"); printf("\t\t 2 修改数据\n\n"); printf("\t\t 3 按学历或编号查询\n\n"); printf("\t\t 4 浏览数据\n\n"); printf("\t\t 5 增加数据\n\n"); printf("\t\t 6 退出\n\n"); printf("请选择号码(1-6):[ ]\b\b"); scanf("%d",&n); if(n<1||n>6) w1=1; else w1=0; } while(w1==1); switch(n) { case 1:enter();break; case 2:modify();break; case 3:search();break; case 4:browse();break; case 5:add();break; case 6:exit(0); } /*用swich-case调用六个功能子菜单*/ } 3.2 子菜单设计,由于代码太多,所以选择增加,浏览,查询这三个功能来描述。 1 增加: add() { int i,n,m,k; FILE*fp; n=load(); printf("How many people are you want to add(0-%d)?:",N-1-n); /*增加m个人的信息*/ scanf("%d",&m); k=m+n; for(i=n;i printf("\nInput %dth people record.\n",i-n+1 ); input(i); } if((fp=fopen("Pro.txt","ab"))==NULL) { printf("cannot open file\n"); } for(i=n;i if(fwrite(&people[i],sizeof(struct people),1,fp)!=1) /*检查输入数据是否无误*/ printf("file write error\n"); fclose(fp); printf_back(); } 2 浏览: browse() { int i,j,n; n=load(); printf_face(); for(i=0;i { if((i!=0)&&(i%10==0)) { printf("\n\nPass any key to continue ...."); getch(); puts("\n\n"); } printf_one(i) ; } printf("\tThere are %d record.\n",n); printf("\nPass any key to back ..."); getch(); menu(); } 3 查询的一部分,只介绍按学历查询,按工号查询情况类似: search() { int i,n,k,w1=1,w2,w3,w4,m,a; struct people p; n=load(); do { /*两种查询方式:学历和工号*/ printf("\n\nWhich way do you want to choose? \n\t1).By xueli 2).By num [ ]\b\b"); scanf("%d",&m); switch(m) { case 1: /*1.按学历查询*/ do { k=-1; printf("\n\nEnter xeuli that you want to search! xueli."); scanf("%s",p.xueli); /*输入所要查询的学历*/ printf_face(); for(i=0;i if(strcmp(p.xueli,people[i].xueli)==0) /*输入的学历和文件信息里的学历相匹配*/ { k=i; printf_one(k);break; } /*找到相应的信息并输出*/ if(k==-1) { printf("\n\nNO exist!please"); printf("\n\nAre you again?\n\t1).again 2).NO and back [ ]\b\b"); scanf("%d",&w1); if(w1==2) printf_back(); } } while(k==-1&&w1==1);break; §4.实验数据及运行效果截图