一、题目:编写程序,用函数实现通过指针连接两个字符串。
1. 需求说明
本实习题要求输入两个字符串,并将其中一个字符串通过指针连接到另一个字符串。 2. 算法设计
(1)编写一个连接函数cat_string
a. 先找到from字符串的末尾,以’\\0'为标记;
b. 将to字符串中的元素一个个的移到from字符串的末尾; c. 最后在to字符串末尾加上’\\0’。 (2)编写主函数
a. 先定义两个字符型指针变量a,b,和两个字符型数组str1,str2;使a指向数组str1,使
b指向str2;
b. 动态输入两个字符串,并将其打印出来;
c. 调用cat_string函数,将字符串a连接到字符串b的末尾; d. 最后将结果打印出来。 (3)结束
3. 程序清单:
#include〈stdio.h〉
void cat_string(char *from,char *to) {
while(*to!=’\\0’) to++;
for(;*from!='\\0';from++,to++) *to=*from; *to='\\0’; }
main() {
char *a,*b,str1[50],str2[100]; a=str1; b=str2;
scanf(”%s%s\",a,b);
printf(\"string1=%s\\nstring2=%s\\n”,a,b); cat_string(a,b);
printf(”\\nsrting=%s\\n\); }
4. 运行结果分析
输入: friend
-1-
boy
输出结果: string1=friend string2=boy
string=boyfriend
二、题目:编写程序完成统计学生成绩。功能包括输入学生的姓名和成绩,按成绩从高到低排列打印输出,对成绩前70%的学生定为合格(PASS),而后30%的学生定为不合格(FAIL)。
1.需求说明
本实习题要求输入学生的姓名和成绩,将成绩从高到低排列,并将其打印输出,对成绩前70%的学生定义为合格,而后30%的学生定义为不合格。也就是说,若有学生10名,则排名前7位的学生为合格,后3位为不合格。 2. 算法设计
(1)先定义结构体student,其中包括学号num、姓名name、成绩score; (2)输入所有学生信息;
(3)对学生成绩进行排序,用气泡排序法,从高到低排列。
成绩排序时,其它信息的顺序也做相应的调整。
(4)对成绩前70%的学生定为合格PASS;而后30%的学生定为不合格FALL; (5)将成绩从高到低打印出来; (6)结束. 3. 程序清单:
#include〈stdio。h> #define SIZE 10 struct student {int num;
char name[10]; int score;
}stu[SIZE],st;
main() {int i,j;
char p[]=”PASS\[]=”FALL\"; for(i=0;i〈SIZE;i++)
scanf(\"%d%s%d\。num,stu[i].name,&stu[i]。score); for(j=0;j〈=SIZE—2;j++) for(i=0;i〈=SIZE—1—j;i++) if(stu[i].score〈stu[i+1]。score)
-2-
{st=stu[i];stu[i]=stu[i+1];stu[i+1]=st;} printf(\"num name score result\\n”); for(i=0;i〈SIZE;i++) if(i〈SIZE*0.7)
printf(\"%2d%10s%5d%8s\\n”,stu[i]。num,stu[i].name,stu[i].score,p); else
printf(\"%2d%10s%5d%8s\\n\[i]。num,stu[i]。name,stu[i].score,f); }
4. 运行结果分析 输入: 1 Li 86 2 Fun 79 3 Zhang 81 4 Wang 90 5 Min 97 6 Lin 89 7 Tan 69 8 Ling 70 9 Xi 57 10 Xu 82 输出结果:
num name score result 5 Min 97 PASS 4 Wang 90 PASS 6 Lin 89 PASS 1 Li 86 PASS 10 Xu 82 PASS 3 Zhang 81 PASS 2 Fun 79 PASS 8 Ling 70 FALL 7 Tan 69 FALL 9 Xi 57 FALL
三、题目:从键盘上输入3个学生的信息,将它们存入文件student;然后再从文件中读出数据,显示在屏幕上。
1.需求说明
本实习题要求输入3个学生的信息,可以包括学号,姓名,年龄,性别,成绩,家庭住址等信息,将它们存入文件student;然后再从文件中读出数据,并将其显示在屏幕上。 2.算法设计
(1)先定义结构体student,其中包括学号num,姓名name,性别sex,年龄age,成绩score,家庭住址addr;
(2)编写保存函数save
-3-
a. 先将文件打开;
b. 若(fp=fopen(“student”,”wb”))==NULL,则说明文件无法打开;反之文件能打开; c. 在打开的文件中一一将信息写进去; d. 最后,将文件student关闭。 (3)编写显示函数display a。先将文件打开;
b.若(fp=fopen(“student\”wb”))==NULL,则说明文件无法打开;反之文件能打开; c。从打开的文件中一一将信息读出,并将其显示在屏幕上; d。最后,将文件关闭。 (7)编写主函数
a. 输入3个学生的所有信息; b. 调用save()函数; c. 调用display()函数; (5)结束。 3.程序清单: #include char addr[30]; }stu[SIZE]; void save() {FILE *fp; int i; if((fp=fopen(\"student\",\"wb\"))==NULL) {printf(”cannot open file\\n”); return; } for(i=0;i void display() {FILE *fp; int i; if((fp=fopen(”student”,”rb”))==NULL) {printf(”cannot open file\\n”); -4- return; } printf(”num name sex age score addr\\n”); for(i=0;i〈SIZE;i++) {fread(&stu[i],sizeof(struct student),1,fp); printf(”%3d %—15s%-2s %3d%5d %-30s\\n”,stu[i]。num,stu[i]。name,stu [i]。sex, stu[i]。age,stu[i]。score,stu[i]。addr); } fclose(fp); } main() {int i; printf(\"Please input students’ message:\\n”); printf(\"num,name,sex,age,score,addr\\n\"); for(i=0;i〈SIZE;i++) scanf(”%d%s%s%d%d%s”,&stu[i]。num,stu[i]。name,stu[i]。sex,&stu[i]。age, &stu[i].score,stu[i]。addr); printf(”\\n”); save(); display(); } 4.运行结果分析 Please input students’ message: num,name,sex,age,score,addr 1 ZhangFang F 19 96 room_101 2 WangMing M 20 86 room_102 3 XiaoDan F 19 81 room_103 num name sex age score addr 1 ZhangFang F 19 96 room_101 2 WangMing M 20 86 room_102 3 XiaoDan F 19 81 room_103 四、题目:编程解决百钱百鸡问题:中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题\":鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何? 1.需求说明 -5- 本实习题要求解决百钱百鸡问题.一只公鸡值5元,一只母鸡值3元,三只小鸡值1元。如果用100元买100只鸡,公鸡,母鸡,小鸡各多少只? 2.算法设计 设公鸡、母鸡、小鸡各有x,y,z,题意规定用100元买100只鸡.假定100元全部买公鸡的话,则最多可以买20只;若100元全部买母鸡,则最多可买母鸡33只,即x的值在0~20之间,y的取值在0~33之间.根据题意可得到下面的等式: 5x+3y+z/3=100 x+y+z=100 所以此问题可归结为求这个不定方程的整数解。 (1)先定义3个变量x,y,z; (2)用外层循环控制公鸡的数量,x的范围在0~20之间; (3)用内层循环控制母鸡的数量,y的范围在0~33之间; (8)在内外层循环的控制下,小鸡数z的值受x,y的值的制约,z=100—x—y; (9)验证取z值的合理性及得到一组解的合理性,即同时满足z%3==0和 5*x+3*y+z/3==100; (10) 打印出所有合理的结果; (11) 结束。 3.程序清单: #include〈stdio。h〉 main() {int x,y,z; for(x=0;x〈=20;x++) for(y=0;y<=33;y++) {z=100—x-y; if(z%3==0&&5*x+3*y+z/3==100) printf(\"cock=%2d hen=%2d chicken=%2d\\n\,y,z); } } 4.运行结果分析 cock= 0 hen=25 chicken=75 cock= 4 hen=18 chicken=78 cock= 8 hen=11 chicken=81 cock=12 hen= 4 chicken=84 五、题目:学生成绩管理系统设计 主要功能: 1)能按学期、按班级完成对学生成绩的录入、修改,用文件保存信息. 2)能按班级统计学生的成绩,求学生的总分及平均分,并能 -6- 根据学生的平均成绩进行排序。 3)能查询学生成绩,不及格科目及学生名单。 按学号查询或按姓名查询。 4)能按班级输出学生的成绩单。 1.需求说明 本实习题要求按学期、班级对学生的各科成绩进行录入、修改、并保存;并能按班级计算学生的总分和平均分,并能根据学生的平均成绩进行排序;能按学号或姓名查询学生成绩;最后,能按班级输出学生的成绩单。 2.算法设计 (1)先声明结构体类型; (2)编写录入函数input(); (3)编写保存函数save(); (4)编写修改函数modify(); (5)编写计算平均成绩函数average(); (6)编写排序函数order(); (7)编写打印函数print(); (8)编写搜索函数search(); (9)编写主函数; (10)结束。 3.程序清单: #include〈stdio.h> #include struct student {int term; int class; int num; char name[15]; struct subject mark; int all; int aver; }stud[SIZE],temp; -7- void input() {int i; printf(”term,class,num,name,chin,math,engl,phys,chem,poli\\n”); for(i=0;i stud[i].name,&stud[i]。mark。chin,&stud[i]。mark.math,&stud[i].mark。engl, &stud[i]。mark。phys,&stud[i].mark.chem,&stud[i]。mark.poli); } void save() {FILE *fp; int i; if((fp=fopen(”student_mark\ {printf(”cannot open file\\n\"); return; } for(i=0;i〈SIZE;i++) if(fwrite(&stud[i],sizeof(struct student),1,fp)!=1) printf(\"file write error\\n”); fclose(fp); } void modify() {FILE *fp; int i; if((fp=fopen(”student_mark”,”rb+\"))==NULL) {printf(\"cannot open file\\n”); return; } printf(”term class num name chi mat eng phy che pol\\n\"); for(i=0;i printf(\"%2d%8d%10d%15s%4d%4d%4d%4d%4d%4d\\n”,stud[i]。term,stud[i]。class, stud[i]。num,stud[i].name,stud[i].mark。chin,stud[i].mark。math, stud[i].mark。engl, stud[i]。mark.phys,stud[i].mark.chem,stud[i].mark.poli); } fclose(fp); } void average() {FILE *fp; -8- int i; if((fp=fopen(”student_mark”,\"rb\"))==NULL) {printf(”cannot open file\\n\"); return; } for(i=0;i〈SIZE;i++) {fread(&stud[i],sizeof(struct student),1,fp); stud[i]。all=stud[i].mark。chin+stud[i].mark。math+stud[i].mark。engl+ stud[i].mark.phys+stud[i].mark.chem+stud[i].mark.poli; stud[i].aver=stud[i].all/6。0; } save(); fclose(fp); } void order() {FILE *fp; int i,j; if((fp=fopen(”student_mark\",\"rb”))==NULL) {printf(\"cannot open file\\n”); return; } for(j=0;j〈=SIZE-2;j++) for(i=0;i<=SIZE—1—j;i++) if(stud[i].aver〈stud[i+1].aver) {temp=stud[i];stud[i]=stud[i+1];stud[i+1]=temp;} save(); fclose(fp); } void print() {FILE *fp; int i; if((fp=fopen(\"student_mark\))==NULL) {printf(\"cannot open file\\n”); return; } printf(\"term class num name chi mat eng phy che pol all aver\\n”); for(i=0;i -9- } fclose(fp); } int search1(int num2) {FILE *fp; int i; if((fp=fopen(”student_mark”,”rb”))==NULL) {printf(”cannot open file\\n”); exit(); } for(i=0;i〈SIZE;i++) if(stud[i]。num==num2) return(i); else return —1; fclose(fp); } int search2(char *name2) {FILE *fp; int i; if((fp=fopen(”student_mark”,”rb”))==NULL) {printf(\"cannot open file\\n”); exit(); } for(i=0;i void search() {FILE *fp; int i,choice,num1; char name1[15]; if((fp=fopen(\"student_mark\",\"rb\"))==NULL) {printf(”cannot open file\\n”); return; } printf(”search:\\n\"); printf(\"1。according number\\n\"); printf(\"2。according name\\n\"); printf(”PLease enter your choice:\\n”); scanf(\"%d\",&choice); if(choice==1) -10- {scanf(”%d\); if((i=search1(num1))>=0) {printf(\" num name chi mat eng phy che pol all aver\\n”); printf(”%10d%15s%4d%4d%4d%4d%4d%4d%4d%5。2f\\n\",stud[i]。num,stud[i].name, stud[i].mark.chin,stud[i].mark。math,stud[i].mark.engl,stud[i].mark。phys, stud[i].mark.chem,stud[i].mark.poli,stud[i]。all,stud[i].aver); } else printf(\"The number %d not found!\\n\",num1); } if(choice==2) {gets(name1); if((i=search2(name1))〉=0) {printf(” num name chi mat eng phy che pol all aver\\n\"); printf(”%10d%15s%4d%4d%4d%4d%4d%4d%4d%5.2f\\n\]。num,stud[i]。name, stud[i]。mark。chin,stud[i]。mark。math,stud[i].mark.engl,stud[i].mark.phys, stud[i]。mark.chem,stud[i].mark。poli,stud[i].all,stud[i]。aver); } else printf(”The name %s not found!\\n\",name1); } fclose(fp); } main() {int c1,c2; printf(”Please input students' messages:\\n”); input(); save(); printf(”Do you want to modify the message?\\n”); printf(\"1。Yes\\n\"); printf(”2。No\\n”); scanf(\"%d”,&c1); if(c1==1) {modify();save();} average(); order(); print(); printf(\"Do you want to search the message?\\n\"); printf(\"1.Yes\\n\"); printf(\"2.No\\n”); scanf(”%d”,&c2); -11- if(c2==1) search(); } 4.运行结果分析 please input students' messages: term,class,num,name,chi,mat,eng,phy,che,pol 1 0315 031501 wang 89 95 91 79 88 90 1 0315 031502 xiao 87 90 94 80 84 81 1 0315 031503 lin 90 89 79 95 90 77 1 0315 031504 tan 70 90 81 91 90 55 1 0315 031505 li 95 87 88 78 68 80 1 0315 031506 fun 68 78 57 86 78 74 1 0315 031507 zhao 69 60 89 79 57 80 1 0315 031508 wu 75 90 88 68 78 90 1 0315 031509 gu 77 68 59 58 59 69 1 0315 031510 zhang 70 50 61 57 59 77 Do you want to modify the message? 1。Yes 2。No 2 term class num name chi mat eng phy che pol all aver 1 0315 031501 wang 89 95 91 79 88 90 532 88.67 1 0315 031503 lin 90 89 79 95 90 77 520 86。67 1 0315 031502 xiao 87 90 94 80 84 81 516 86。00 1 0315 031505 li 95 87 88 78 68 80 495 82.67 1 0315 031508 wu 75 90 88 68 78 90 489 81.50 1 0315 031504 tan 70 90 81 91 90 55 477 79.50 1 0315 031506 fun 68 78 57 86 78 74 441 73。50 1 0315 031507 zhao 69 60 89 79 57 80 434 72.33 1 0315 031509 gu 77 68 59 58 59 69 390 65。00 1 0315 031510 zhang 70 50 61 57 59 77 374 62.33 Do you want to search the message? 1。Yes 2.No search: 1.according number 2。according name PLease enter your choice: 1 031503 num name chi mat eng phy che pol all aver 031503 lin 90 89 79 95 90 77 520 86.67 -12- 体会 这次实习题的第一题是编写程序用函数实现通过指针连接两个字符串.在这题中首要问题是判断字符串b是否结束,即判断是否等于‘\\0’。当等于‘\\0'时,说明字符串b已经结束。此时,再将字符串a中的元素一个个移到字符串b的末尾.最后,在这个新的字符串末尾加上‘\\0’作为结束标记。整个过程用函数实现。 在编写cat_string函数时,一开始,我用if(*to!='0’) to++;来判断字符串b是否结束。后来在调试过程中发现如果用if语句判断,只是判断这个字符串中的第一个元素不等于‘\\0’,不在继续判断下去了,所以所得的结果无论b字符串有多长,只取它的第一个元素。显然,这种做法是不对的.要判断b字符串是否结束,必须用循环结构,才能逐个判断其中的元素是否等于‘\\0’。所以,最后我采用while循环来判断字符串b是否结束,最终取得理想的结果。 第二题是编写程序完成统计学生成绩,并按要求输出结果。这题要求动态输入学生的学号、姓名和成绩,并对其成绩进行排序,最后按成绩由高到低排列打印输出,对成绩前70%的学生定为合格,而后30%定为不合格. 在编写程序时,对成绩的排序一开始采用函数编写,但在函数调用时,实际参数名有误,而且有多处警告错误,所以最终没有用函数。在这题调试过程中,我遇到的主要问题是,成绩以按高低输出,但学生的其它信息并没有做相应的调整.经过仔细研究发现,我在排序的过程中只对成绩进行排序,其它相应的信息为发生变化。所以,我定义了一个空的结构体变量作为排序过程中的中间变量。在对成绩进行比较排序时,所有信息的顺序都进行调整。这样才保证,成绩从高到低输出时,学生信息的真实性。 第三题是从键盘上输入学生信息,将其存入文件student,然后从文件中读出数据,显示在屏幕上。这题主要在于声明结构体类型和编写save()函数、display()函数以及主函数。重点在于确定每次使用文件的方式,是“wb”(只写),还是“rb”(只读),或其它。为每次的不同需要选择合适的文件使用方式。还应注意的是,对文件读写之前应该先“打开”该文件,在使用结束之后必须“关闭”该文件。 第四题是编程解决百钱百鸡问题.题目转化为数学问题就是“一只公鸡值5元,一只母鸡值3元,三只小鸡值1元。问如何用100元买100只鸡,其中公鸡、母鸡、小鸡各多少只?\"如果设公鸡x只,母鸡y只,小鸡z只,则题目转化为求下列不定方程 x+y+z=100 5x+3y+z/3=100 所以此问题归结为求不定方程的整数解。可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。用外循环控制公鸡数,用内循环控制母鸡数。为提高程序的执行效率,可进一步减少循环次数。 假设100元都买公鸡,则可买公鸡20只;若都买母鸡,则可买母鸡33只。则0 -13- 名查询学生的成绩. 这题是一道较复杂的题,如果都写在主函数里将会十分的复杂。为了减轻编写过程中复杂性,也便于阅读。我将此题采用函数来做.根据题意,要有一个录入函数(input),修改函数(modify),保存函数(save),打印函数(print),一个计算学生平均成绩的函数(average),还有一个查询函数(search)。在用主函数将整个程序连起来. 现在,我的这个程序有点缺陷。就是对学生平均成绩进行排序时,并不能按班级来进行排序,它是将所有的成绩一起排序.还有在打印成绩单时,此程序是按照排序顺序打印,并不是按班级输出学生的成绩.所以整个程序的可用性还不太强,应有待提高。 通过这次的作业,使我学会了不少.明白光读书,不实践是不行的。教材上的东西是纯理论化的。怎样把书本上的东西化己用,并付之实践才是最重要的。 在做题的过程中,最关键的是算法。拿到题目,首先要明白这道题要求我们做什么,接下来要知道怎样才能实现题目的要求。知道这些后,才能在编写程序的过程中知道自己下一步做什么. 一个程序的语法错误能够被C编译程序及时的捕获,但是对于程序的运行结果正确性,就无法从编译环节得到答案,所以必须从调试程序的环节中寻找答案.在做题的过程中,往往在程序编译正确的情况得不到理想的答案,此时不须对程序进行调试。在不断的调试过程中,一个程序才能更优秀. 合理使用函数也是我在这次作业中学到的.函数是构成C程序的一种模块,也是C语言的最大特点之一。它能是程序的结构清晰,程序代码减小。合理的使用函数会使程序更清晰,易阅读。 我们学习C语言的时间不长,也许有的地方会不明白,但是我们不能就此放弃。因为C语言的设计自由,并不是只有一种方法.我们应开拓自己的思维,这种方法不行,换另一种方法,终有一种方法你是会的。 -14- 因篇幅问题不能全部显示,请点此查看更多更全内容