
c语言课程设计
-
2023年3月1日发(作者:睡前小故事在线听)评语:
C语言课程设计报告
班级:电气1004
学号:201009334
姓名:雷海燕
指导教师:王果
2011年07月18日
-1-/18
1基本题目
1.1题目
1.1题目
有17个人围成一圈,从0号的人开始报数,凡报到3的倍数的人离开圈子,
然后再数下去。直到最后只剩下一个人为止。问此人原来的位置是多少号。
1.2题目分析
创建一个指针变量,指针变量中的初值为0至16。然后通过for循环将指针变
量中所指的值是三的倍数的变量赋值为0,最后找出所要找的值。
1.3程序
#include
#defineN17
intmain()
{
inti,j,k,a[N+1],*p;
for(i=0,p=a;p<=a+N;i++,p++)
*p=i;
p=a+1;
k=N;
for(i=0,j=1;k!=1;j++)
{
if(p>(a+N))
p=a+1;
if(*p!=0)
i++;
if(i%3==0&&i!=0)
{
*p=0;i=0;k--;
}
p++;
}
for(i=1;i<=N;i++)
if(a[i]!=0)
printf("最后留下的是%dn",a[i]);
return0;
}
1.4流程图
-2-/18
图1.1基本题目的流程图
Y
Y
N
Y
N
Y
Y
Y
N
开始
输出最后留下的值
i=0
p<=a+N
*p=i,i++,p++
p=a+N
i=0,p=aN=17
p>a+N
N
k!=1
*p!=0
i++
i%3!=0
*p=0,i=0,k--
p++,j++
p=a+1,i=0,j=0
p++,j++
N
i<=N
N
i++
结束
-3-/18
1.5程序的运行结果
基本体运行结果如图1.2所示:
图1.2基本题目运行结果
2改错题目
2.1改正后程序
#include
intmain()
{
intx=1;inty;
y=x++;
printf("y=%d",y);
intz;
z=++x;
printf("z=%dn",z)
return0;
}
2.2程序运行结果
程序完成的功能:用x的初始值算出y与z的值。
改正后的运行结果如图2.1所示:
-4-/18
图2.1改正后的运行结果
3.综合题目
3.1题目
班级成绩管理系统,对一个有N个学生的班级,每个学生有M门课程。该系统实
现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
3.2程序的主要功能
本程序实现对一个班学生某几门课程的录入,成绩的显示、成绩的保存、对成绩
进行排、对成绩进行修改、对成绩进行统计(包括每门课程的最高分、平均分、超
过每门平均分的人数等),运行程序后退出程序。
3.3各函数的功能
(1)input函数
利用嵌套循环语句,实现对N位学生,M门课程的输入。
(2)output函数
实现对先前输入学生成绩的输出。
(3)save函数
将输入数据存入指定文件中。
(4)rank函数
计算出所有学生的成绩总分,并按照分数从高到低,进行输出。
(5)change函数
判断密码是否正确,并对选中学生成绩进行修改。
3.4程序流程图
-5-/18
图3.1综合题目的流程图
'G'或'g'
'F'或'f'
'E'或'e''D'或'd'
'C'或'c'
N
N
N
i<=M
Y
N
'B'或'b'
'A'或'a'
开始
输入x
N
Y
i=
输入
科目名
输入学
生姓名
输入
学号
i=0
i++
i i i++ 输入 成绩 Y i=0 输出 科目名 i++ i=0 输出姓 名、学号 j=0 输出成绩 j++ j i++ i Y Y 将数据 存入指 定文件 利用 for循 环,对 每一位 学生算 出成绩 总分 利用 for循 环,将 学生按 成绩从 高到低 输出 While(1) 结束 Retur n0, 即退 出系 统 利用 tran函 数,进行 加密码, 修改学生 成绩。 详见图5 利用 coun函 数,进 行对学 生成绩 的统计 详见图 6 -6-/18 3.4源程序 #include #include #include #defineN10/*学生人数*/ #defineM4/*课程数*/ #definePASS890508/*修改密码*/ voidinput();/*成绩输入*/ voidoutput();/*成绩显示*/ voidsave();/*成绩保存*/ voidrank();/*成绩排序*/ voidtran();/*成绩修改*/ voidcoun();/*成绩统计*/ voiderrorinput();/*出错输出*/ structstudent/*成绩数据结构体*/ { charname[10]; intnum; floatscore[M]; doublesum; } stud[N]; charsubject_name[N][10]; intmain() { charx; while(1) { system("cls"); printf("________________________________________________________n"); printf("***班级成绩管理系统***n"); printf("******n"); printf("***A[成绩录入]***n"); printf("******n"); printf("***B[成绩显示]***n"); printf("******n"); printf("***C[成绩保存]***n"); printf("******n"); printf("***D[成绩排序]***n"); printf("******n"); printf("***E[成绩修改]***n"); printf("******n"); printf("***F[成绩统计]***n"); printf("******n"); -7-/18 printf("***G[退出系统]***n"); printf("******n"); printf("________________________________________________________n"); printf("输入你的选择:"); scanf("%c",&x); switch(x) { case'a':case'A':input(); break; case'b':case'B':output(); break; case'c':case'C':save(); break; case'd':case'D':rank(); break; case'e':case'E':tran(); break; case'f':case'F':coun(); break; case'g':case'G':return0; default:errorinput(); break; } getchar(); } return0; } voidinput()/*成绩输 入*/ { inti,j; printf("请输入科目名称:n"); for(i=0;i 目名称*/ { printf("科目%d:",i+1); scanf("%s",subject_name[i]); } for(i=0;i 息、各科成绩*/ { printf("学生%d:n",i+1); printf("姓名:"); scanf("%s",&stud[i].name); -8-/18 printf("学号:"); scanf("%d",&stud[i].num); for(j=0;j { printf("%s成绩:",subject_name[j]); scanf("%f",&stud[i].score[j]); } printf("n"); } } voidoutput()/*成绩显 示*/ { inti,j; system("cls"); printf("姓名学号"); for(i=0;i<=M;i++) printf("%s",subject_name[i]);/*在一行里面输出科目名称,相 互之间有间隔。作为其下列表的目录。*/ printf("n"); for(i=0;i { printf("%1st%1dt",stud[i].name,stud[i].num); for(j=0;j printf("%5.1ft",stud[i].score[j]); printf("n"); } printf("!输入任意键返回!n"); getchar(); } voidsave()/*成绩 保存*/ { FILE*fp; inti,j; if((fp=fopen("","w"))==NULL)/*文件打开*/ { printf("error!n"); return; } for(i=0;i 称*/ fprintf(fp,"%s",subject_name[i]); fprintf(fp,"n"); -9-/18 for(i=0;i 信息*/ { fprintf(fp,"%5s%5d",stud[i].name,stud[i].num); for(j=0;j { fprintf(fp,"%6.1f",stud[i].score[j]); } fprintf(fp,"n"); } if(fclose(fp))/*文件关闭*/ { printf("Cannotclosethefile!n"); return; } printf("succeed!n"); getchar(); return; } voidrank()/*成绩 排序*/ { voids*px,int*py); int*a; a=newint[N]; inti,j; doubletot; system("cls"); for(i=0;i { a[i]=i; for(j=0,tot=0;j tot=tot+stud[i].score[j]; stud[i].sum=tot; } for(i=0;i for(j=0;j if(stud[a[j]].sum s[j],&a[j+1]); } printf("学号姓名总分n"); for(i=0;i printf("%dt%st%.1fn",stud[a[i]].num,stud[a[i]].name,stud[a[i]].sum); delete[]a; -10-/18 printf("!输入任意键退出!n"); getchar(); } voids*px,int*py) { intt; t=*px; *px=*py; *py=t; } voidtran()/*成绩修改*/ { charch[10],flag='Y'; intnum; inti,j; printf("请输入密码:");//检查密码 scanf("%s",ch); if(strcmp(ch,"123")!=0) { printf("密码错误!(按任意键返回)n"); getchar(); return; } while(flag=='Y'||flag=='y')//修改成绩 { printf("输入要修改成绩的学生学号:");//按学号搜索 scanf("%d",&num); for(i=0;i if(num==stud[i].num) break; if(i==N) { if(num==0) return; else { printf("没有找到学生,请重新输入!(输入0退出)n"); continue; } } printf("请输入新的各科成绩:n");//修改成绩 for(j=0;j { printf("%s:",subject_name[j]); -11-/18 scanf("%f",&stud[i].score[j]); } printf("是否继续修改(Y/N)?"); scanf("%s",&flag); } } voidcoun()/*成绩统计*/ { voidstate_high(); voidstate_ave(); voidstate_num(); charchoice; system("cls"); printf("&&&================================================&&&n"); printf("&&&选择菜单&&&n"); printf("&&&A.显示每门课程成绩最高的学生的基本信息&&&n"); printf("&&&B.显示每门课程的平均成绩&&&n"); printf("&&&C.显示超过某门课程平均成绩的学生人数&&&n"); printf("&&&D.返回&&&n"); printf("&&&================================================&&&n"); scanf("%s",&choice); switch(choice) { case'A':case'a':state_high(); break; case'B':case'b':state_ave(); break; case'C':case'c':state_num(); break; case'D':case'd':break; default:errorinput();coun(); break; } printf("按任意键返回主菜单n"); getchar(); } voidstate_high()/*输出各科最高分的基本信息*/ { inti,j,high; system("cls"); for(j=0;j { for(i=0,high=0;i { -12-/18 if(stud[i].score[j]>stud[high].score[j]) high=i; } printf("%s最高分:",subject_name[j]); printf("%st学号%dtn",stud[high].name,stud[high].num); } printf("n"); } voidstate_ave()/*每门课程平均成绩*/ { inti,j; floatsum,ave; system("cls"); for(j=0;j { for(i=0,sum=0;i { sum+=stud[i].score[j]; } ave=sum/N; printf("%s平均成绩:%.1fn",subject_name[j],ave); } printf("n"); } voidstate_num()/*每门课程超过平均成绩的学生人数*/ { inti,j,n; floatsum,ave; system("cls"); for(j=0;j { for(i=0,sum=0;i { sum=sum+stud[i].score[j]; } ave=sum/N; for(i=0,n=0;i { if(stud[i].score[j]>ave) n++; } printf("%s超过平均分的人数为:%dtn",subject_name[j],n); } printf("n"); -13-/18 } voiderrorinput()/*出错输出*/ { system("cls"); printf("无效的输入,请重新输入!n"); } 3.5程序运行结果 程序运行初显示如图3.2所示: 图3.2程序运行初显示 输入“A”进行成绩录入后,输入“B”,对成绩进行显示如图3.3所示: -14-/18 图3.3成绩显示 输入C,成绩保存如图3.4所示: 图3.4成绩保存 输入D,进行成绩排序如图3.5所示: -15-/18 图3.5成绩排序 成绩修改如图3.6所示: 图3.6成绩修改 输入“F”,成绩统计如图3.7所示: -16-/18 图3.7成绩统计 4结论与体会 这学期让我们做C语言课程设计,是因为这学期我们开了C语言这门课程,为 了进一步培养我们结构化程序设计的思想,加深对高级语言基本语言要素和控制结 构的理解,所以让我们针对C语言中的重点和难点内容进行训。 考完C语言后便去老师那里拿题。我们是班里的最后一个组,所以之前也听说 了课程设计相当难做,班里C语言学的好的同学都在埋怨难做,这就让我觉得犯难 了。当我把题目看完之后,认真想了想,基本题和改错题,靠自己一个人,应该完 成不是难事。但是综合题,我就蒙了。 基础题通过查资料基本完成了,但画流程图却是基本没有接触过,我又把我们 课本中的这一部分复习了一下,明白以后,滤清思路,利用visio办公软件,很快 便做了出来。 改错题也不是很难,理解了题意,读了一下程序,在VC6.0中走了几遍,便找 出了错误,没多长时间,便也完成了。 接下来是综合题,读完题后,我就觉得不知如何下手了。我们组的这道综合题 应该说不算是综合题里最难的,但我觉得还是能力有限,想破头皮,都不能够很完 整的做出来,所以综合题就只能和同组的同学讨论、查资料、询问学长来获取一些 宝贵的信息来完成了,在此期间学到了不少新知识,掌握了更多C语言的技巧。最 终,经过我们小组成员的合作,还有和其他做同一道题小组成员的讨论,终于完成 了这道题。但程序似乎还是不太完善,比如程序太长,不能够简洁明了。 这次课程设计是在我们就军训期间抽空完成的,占用了我们大量的休息时间, 但我觉得,从中学到的东西,让我得到更多,受益匪浅。 由于水平和时间原因,并且又是第一次做,这次的课程设计报告,肯定有许多 -17-/18 不足之处,望老师指出并加以指导,让学生的学习能更进一步。 参考书目 [1]谭浩强.C程序设计[M].清华大学出版社,2010 [2]杨萌华.线性代数[M].北京大学出版社,2003 [3]严蔚敏.数据结构[M].清华大学出版社,2004