C语言课程设计报告.docx
- 文档编号:2459089
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:17
- 大小:26.84KB
C语言课程设计报告.docx
《C语言课程设计报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告.docx(17页珍藏版)》请在冰点文库上搜索。
C语言课程设计报告
南京航空航天大学
2010-2011
(二)C程序设计课程设计报告
课设题目:
学生成绩简单管理程序一
学生学号:
课设教师:
日期:
2011.5.31
一.程序主要功能:
(写出程序完成的主要功能)
用结构体数组结构实现简单的学生成绩管理功能,要求具有数据输入、数据输出、数组排序、元素插入、元素删除、查询等功能。
各菜单功能:
1.InputRecords(输入若干条记录)
从键盘一次输入一个学生的姓名和成绩(一条记录),依次存放到结构体数组中。
掺入一条记录后,显示提示信息:
确认是否输入下一条记录,如确认,继续输入,否则,退出输入功能。
2.DisplayAllRecord(显示所有记录)
按顺序显示表中所有记录,每屏显示十条记录。
每显示十条记录,按
3.Sort(排序)
以姓名为序排列数组。
4.InsertaRecord(插入一条记录)
在以姓名为序排列的数组中插入一条记录,插入后数组仍有序。
输出插入成功的信息。
5.DeleteaRecord(按姓名查找,删除一条记录)
输入待删除记录的姓名,显示提示信息,让用户再次确认是否要删除。
确认后,将该姓名的记录删除。
6.Query(查找并显示一个记录)
输入姓名,查找该记录,并显示该同学的成绩。
7.AddRecordsfromaTextFile(从正文文件中添加数据到结构体数组中)
用户可事前建立一个正文文件data.txt,存放多个待加入的记录。
提示输入正文文件的文件名,然后从该文件中一次性加入多条学生记录。
文件data,txt格式如下:
2
WangXiao95
LiuLin87
8.WritetoaTextfile
将数组中的全部记录写入文件records.txt,要求文件格式和文件data.txt相同。
9.Quit(退出学生成绩管理程序)
二.说明:
(写出对题目的分析,设计中遇到的主要问题及解决方法,对设计的感想和心得。
如有新增加的功能,给出增加功能的设计说明)
1.题目分析
该题主要考察对结构体,指针,文件的操作,以及C语言算法的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。
如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。
菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学过的技巧,下面就各个子程序中的功能进行说明:
功能1和4的算法相似,输入一条记录到结构体中去,其中有一部很关键,就是通过gets将所有的多余的字符,回车读去,否则就会出错。
功能2是显示所有的记录,通过循环输出,格式也比较重要。
功能3为按学号排序,因为学号定义成了字符数组的形式,因此在运用冒泡法进行排序的时候,要用到strcmp,strcpy等函数。
功能5为按姓名删除记录,先输入姓名,再一一比较,如果没有则返回失败信息,如果找到就将此记录都向前移一位,返回n-1。
功能6的算法在5中就已经体现了,输入姓名,一一比较。
功能7为新增的功能,因为考虑到原来给出的函数中竟然没有对学生成绩的统计功能,因此新增此功能,可以得出所有的记录个数,最高、最低、平均分,并输出相关的学生信息等。
功能8和9是对文件的操作,提前准备好数据。
2.在写程序中遇到的问题:
开始时无法正确完成“确认后再继续”我先是自己认真耐心地用很多方法调试修改,然后问了几个同学,解决了这个问题,还有有关文件读写的问题,因为是上课时没有听太明白,所以自己再次仔细看了一遍书,分析书中例题,然后再运用到该程序的编写中,在同学的帮助下解决了。
面对遇到的其他很多或大或小的问题主要都是和同学交流探讨与问老师相结合的方式来达到彻底的解决的。
3.心得体会:
编这样一个程序在之前看的时候总是觉得不可能做到,完全没有思路,不过当静下心坐在电脑前仔细看完要求和提示后,一步一步地编写,慢慢地发现其实只要肯想肯问就能积少成多,完成这样一个在我们之前看来很复杂的程序设计。
两百多行的程序内容很多,有的地方也很复杂,尤其是一些细节问题,粗心地丢三落四,造成很多不必要的错误并且很难发现,因此的确是对我毅力的一种考验。
完成之后程序运行到第一次输入数据总是会停止,不得不对300多行的程序进行单步调试,再次解决了之前没有发现的问题之后,发现编程需要非常严谨的态度和足够的耐心,否则就会因为一些问题而卡住甚至放弃。
当然在整个过程中,同学帮助解决了许多自己没有意识到得错误,换一个角度,才能发现问题吧。
三.源程序
#include
#include
#include
#include
#defineNULL0
typedefstruct/*定义结构体数组*/
{
charname[20];/*姓名*/
floatscore;/*成绩*/
}Student;
intmenu_select();/*个函数的类型声明*/
intInput(Studentstud[],intn);
voidDisplay(Studentstud[],intn);
voidSort_by_Name(Studentstud[],intn);
intInsert(Studentstud[],intn,Student*s);
intInsert_a_record(Studentstud[],intn);
intDelete(Studentstud[],intn,char*name);
intDelete_a_record(Studentstud[],intn);
intQuery(Studentstud[],intn,char*name);
voidQuery_a_record(Studentstud[],intn);
intAddfromText(Studentstud[],intn,char*filename);
voidWritetoText(Studentstud[],intn,char*filename);
voidQuit();
voidDisplay_Main_Menu();
Students,t;/*定义结构体变量*/
Studentstud[40];/*定义结构体数组变量*/
voidmain()/*主函数*/
{
intn=0;/*定义文件的记录数变量*/
charfilename[20];
for(;;)
{
switch(menu_select())/*判断使用者需要使用的程序*/
{
case1:
/*执行1所代表的函数功能*/
printf("\tInputRecords:
\n");
n=Input(stud,n);
system("pause");
break;
case2:
printf("\tDisplayAllRecord:
\n");
Display(stud,n);
system("pause");
break;
case3:
printf("\tSort:
\n");
Sort_by_Name(stud,n);
system("pause");
break;
case4:
printf("\tInsertaRecord:
\n");
n=Insert_a_record(stud,n);
system("pause");
break;
case5:
printf("\tDeleteaRecord:
\n");
n=Delete_a_record(stud,n);
system("pause");
break;
case6:
printf("\tQuery:
\n");
Query_a_record(stud,n);
system("pause");
break;
case7:
printf("\tAddRecordsfromaTextFile:
\n");
n=AddfromText(stud,n,filename);
system("pause");
break;
case8:
printf("\tWritetoaTextFile:
\n");
WritetoText(stud,n,filename);
system("pause");
break;
case0:
printf("\tQuit:
");
system("pause");
exit(0);/*退出程序*/
}
}
menu_select();/*返回菜单函数*/
}
intmenu_select()/*菜单函数*/
{
charc;
do{
system("cls");/*运行前清屏*/
printf("\n\t\t*Welcometousethisprogram!
*\n\n\n");
printf("\t\t\t1.InputRecords\n");
printf("\t\t\t2.DisplayAllRecord\n");
printf("\t\t\t3.Sort\n");
printf("\t\t\t4.InsertaRecord\n");
printf("\t\t\t5.DeleteaRecord\n");
printf("\t\t\t6.Query\n");
printf("\t\t\t7.AddRecordsfromaTextFile\n");
printf("\t\t\t8.WritetoaTextFile\n");
printf("\t\t\t0.Quit\n");
printf("********************************************************************************\n");
printf("PleaseInputYourChoice0-8:
");
c=getchar();/*读入选择*/
}
while(c<'0'||c>'8');
return(c-'0');/*返回选择*/
}
intInput(Studentstud[],intn)/*输入若干条记录*/
{
inti=0,p=1;
chare;
while(p!
=0)
{
printf("\tpleaseinputaname:
");
scanf("%s",stud[i].name);/*输入学生姓名*/
getchar();
printf("\tpleaseinputthescore:
");
scanf("%f",&stud[i].score);/*输入学生成绩*/
getchar();
i++;
printf("Doyouwanttocontinuetoinput:
(Y/N)?
");
scanf("%c",&e);
if(e=='n'||e=='N')
p=0;
}
n=i;
return(n);
}
voidDisplay(Studentstud[],intn)/*显示所有记录*/
{
inti=0;
printf("\tName\tScore\n");
while(i { printf("\t%s\t%f\n",stud[i].name,stud[i].score); if((i+1)%10==0)/*判断是否十行暂停一下*/ { system("pause"); } i++; } } voidSort_by_Name(Studentstud[],intn)/*将所有数据按姓名排序*/ {inti,j; for(i=0;i {for(j=i;j if(strcmp(stud[i].name,stud[j].name)>0) {t=stud[i]; stud[i]=stud[j]; stud[j]=t; } } printf("Succeed! "); } intInsert(Studentstud[],intn,Student*s)/*插入给定记录*/ { stud[n]=*s; n++; Sort_by_Name(stud,n);/*调用排序函数*/ printf("successfullyinsert! ");/*返回成功信息*/ return(n); } intInsert_a_record(Studentstud[],intn)/*插入一条记录*/ { Student*p=(Student*)malloc(sizeof(Student)); printf("\tpleaseinputaname: "); scanf("%s",&p->name); printf("\tpleaseinputthescore: "); scanf("%f",&p->score); n=Insert(stud,n,p);/*调用插入函数*/ return(n); } intDelete(Studentstud[],intn,char*name)/*删除给定姓名的记录*/ { inti,k; for(i=0;i { if(strcmp(stud[i].name,name)==0) { for(k=i;k { stud[k].score=stud[k+1].score; strcpy(stud[k].name,stud[k+1].name); } n--; printf("Deletesuccessfully! ");/*返回成功信息*/ return(n); } } printf("Thisrecorddoesn'texsit! ");/*返回失败信息*/ return(n); } intDelete_a_record(Studentstud[],intn)/*按姓名查找,删除一条记录*/ { charc,k[20],*p; p=k; printf("\tpleaseinputaname: "); scanf("%s",k); getchar();/*读入姓名*/ printf("Makesurethatyoureallywanttodeleteit: (Y/N)? ");/*询问是否继续操作*/ c=getchar(); if(c=='y'||c=='Y') { n=Delete(stud,n,p);/*调用删除函数*/ } return(n); } intQuery(Studentstud[],intn,char*name)/*查找给定姓名的记录信息*/ {inti; for(i=0;i { if(strcmp(stud[i].name,name)==0)/*比较是否存在给定信息*/ { printf("Querysuccessfully! ");/*返回成功信息*/ return(i); } } return(-1); } voidQuery_a_record(Studentstud[],intn)/*查找记录*/ { charp[20]; inta; printf("\tpleaseinputaname: "); scanf("%s",p);/*读入姓名*/ a=Query(stud,n,p);/*调用查找函数*/ if(a==(-1)) { printf("Thisrecorddoesn'texsit! ");/*返回失败信息*/ } printf("\n\t%s\t%f",stud[a].name,stud[a].score);/*输出查找到的学生记录*/ } intAddfromText(Studentstud[],intn,char*filename)/*从外界文件中读入记录*/ { inti=0,m; FILE*fp; printf("\t\tInputthefilename: "); scanf("\t\t%s",filename); if((fp=fopen(filename,"r"))==NULL)/*打开文件并判断文件是否存在*/ { printf("\t\t\tcann'topenthefile\n"); printf("\t\t\t"); system("pause"); return(n);/*返回记录数*/ } else { fscanf(fp,"%d",&m);/*读入文件中记录的条数*/ while(i { fscanf(fp,"%s%f",stud[n+i].name,&stud[n+i].score);/*将文件中的记录写入程序*/ i++; } n+=m; fclose(fp); printf("\t\t\tSuccessed! \n"); printf("\t\t\t"); system("pause"); return(n);/*返回记录数*/ } } voidWritetoText(Studentstud[],intn,char*filename)/*将程序中的记录写入文件*/ { inti=0; FILE*fp; printf("\t\t\tWriteRecordstoaTextFile\n"); printf("\t\t\tInputthefilename: "); scanf("\t\t\t%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("\t\t\tcann'topenthefile\n"); system("pause"); return; } fprintf(fp,"%d\n",n); while(i { fprintf(fp,"%-15s%f\n",stud[i].name,stud[i].score);/*将记录写入文件*/ i++; } fclose(fp);/*关闭文件*/ printf("Successed! \n"); } 四.画出函数调用关系图,描述程序中主要算法的实现 Query Delete Insert AddformText Query_a_record Delete_a_record Insert_a_record Sort DisplayAllRecord 五.写出测试流程,提供典型测试数据 1、进入界面 2、输入选项1, 按提示依次输入: A B C D E F G H I J K 3、回到主菜单; 输入7, 输入文件名: data.txt, 输出“Succeed! ”,则读入文件操作成功。 4、回到主菜单,输入2, 输出: 第一屏A B C D E F G H I J 第二屏K 5、回到主菜单,输入3, 输出: 6、回到主菜单,输入4, 按提示插入一组数据L 输出: successfullyinsert! 7、回到主菜单,输入5, 按提示输入姓名D,删除数据 输出: Deletesuccessfully! 8、回到主菜单,输入6, 输入姓名F 输出: 55.000000 9、回到主菜单,输入9, 输入result.txt, 输出: Succeed! 10、回到主菜单,输入0,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)