实验项目指导书.docx
《实验项目指导书.docx》由会员分享,可在线阅读,更多相关《实验项目指导书.docx(19页珍藏版)》请在冰豆网上搜索。
实验项目指导书
实验项目指导书
实验项目名称:
学生成绩管理系统
实验类型:
综合型
所属课程:
计算机程序设计基础(C)
所属实验室:
计算机基础实验中心
适用专业:
机电学院、理学院各专业
刘明才
2010年6月1日
目录
实验项目指导书1
1.实验目的3
2.实验准备3
3.实验内容3
4.实验步骤3
4.1分析问题3
4.2编写主函数4
4.3编写输入记录函数7
4.4编写显示记录函数9
4.5编写排序函数10
4.6编写统计数据函数11
4.7编写向文件中写记录函数13
4.8编写从文件中读记录函数14
5.功能扩充15
6.撰写实验报告16
1.实验目的
(1)通过实验了解较大程序的设计方法。
(2)掌握结构化程序设计方法。
2.实验准备
(1)预习第9章结构体类型的定义和结构体变量的定义与引用。
(2)预习第10章文件指针变量的定义以及与文件操作有关的函数
(2)了解实验内容。
3.实验内容
编写一个综合的学生成绩管理程序。
学生信息包括:
学号、姓名、成绩。
一个学生的信息称为一个记录,程序要求实现以下功能:
(1)输入记录
(2)显示记录
(3)按学号排序记录
(4)输出统计信息:
总记录数、最高分、最低分及平均分
(5)从文件读取记录
(6)将记录写入文件
4.实验步骤
4.1分析问题
从题目要求可知,每个学生的记录包括下面3个属性:
学号、姓名和成绩。
每个属性需要用不同的数据类型表示,学号可以用整数表示,也可以用字符串表示,本题用字符串表示,姓名必须用字符串表示,成绩可用整数表示。
所以每个学生的记录可用一个结构体表示:
structstudent
{charnum[10];
charname[20];
intscore;
}
所有学生的记录用一个结构体数组表示。
从题目所要求的功能看,可编写六个函数分别完成相应的功能,如图1所示:
图1
根据以上分析,程序设计步骤如下:
(1)编写主函数,由主函数调用其它函数。
(2)编写输入记录的函数。
(3)编写显示记录的函数。
(4)编写记录排序的函数。
(5)编写统计数据函数。
(6)编写从文件读取记录函数。
(7)编写将记录写入文件函数。
4.2编写主函数
1.编写主函数main
为了使程序即能在TC2.0环境运行,又能在VC++6.0环境下运行,提示信息用英文表示。
主函数运行时,首先在屏幕上显示如下提示(菜单):
*****************************************
Students'scoremanagementsystem
1.Inputrecords
2.Displayallrecords
3.Sortbynumber
4.Statistic
5.ReadfromaTextFile
6.WritetoaTextfile
0.Exit
*****************************************
Inputyourchoice(0-9):
程序根据用户输入的选择(0—9)调用相应的函数。
程序如下:
#include
#include
#include
/*定义结构体类型STU*/
typedefstruct
{charnum[10];/*学号*/
charname[20];/*姓名*/
intscore;/*成绩*/
}STU;
STUstu[80];/*定义结构体数组*/
/*输入记录函数Input*/
/*显示记录函数Display*/
/*记录排序函数Sort_by_num*/
/*统计数据函数Statistic*/
/*从文件读记录函数Read_from_file*/
/*向文件写记录函数Write_to_file*/
voidmain()/*主函数*/
{intn=0;/*存放记录个数*/
charc;/*存放用户选择的数字字符*/
for(;;)
{do{
system("cls");/*清屏幕函数*/
printf("*****************************************\n");
printf("Students'scoremanagementsystem\n");
printf("1.Inputrecords\n");
printf("2.Displayallrecords\n");
printf("3.Sortbynumber\n");
printf("4.Statistic\n");
printf("5.ReadfromaTextFile\n");
printf("6.WritetoaTextfile\n");
printf("0.Exit\n");
printf("*****************************************\n");
printf("Inputyourchoice(0-9):
");
c=getchar();
}while(c<'0'||c>'9');/*若输入的不是数字字符,则重新输入*/
switch(c)
{case'1':
printf("InputRecords\n");/*输入若干条记录*/
/*调用输入记录函数*/
system("pause");
break;
case'2':
printf("DisplayAllRecords\n");/*显示所有记录*/
/*调用显示记录函数*/
system("pause");
break;
case'3':
printf("Sort\n");
/*调用排序函数*/
printf("SortSucceeded!
\n");
system("pause");
break;
case'4':
printf("Statistic\n");
/*调用统计数据函数*/
system("pause");
break;
case'5':
printf("Readfromafile\n");
/*调用读文件函数*/
system("pause");
break;
case'6':
printf("WritetoaTextfile\n");
/*调用写文件函数*/
system("pause");
break;
case'0':
printf("HaveaGoodLuck,Bye-bye!
\n");/*结束程序*/
system("pause");
exit(0);
}
}
}
2.调试主函数
将上述程序在TC2.0环境下进行调试运行。
程序运行后,屏幕显示如图2所示的主菜单选项:
图2
输入1并按回车键后,屏幕显示如图3所示:
图3
按任意键后,回到主菜单,如图2所示。
输入2并按回车键后,屏幕显示如图4所示:
图4
按任意键后,回到主菜单,如图2所示。
输入3并按回车键后,屏幕显示如图5所示:
图5
按任意键后,回到主菜单,如图2所示。
输入4并按回车键后,屏幕显示如图6所示:
图6
按任意键后,回到主菜单,如图2所示。
输入5并按回车键后,屏幕显示如图7所示:
图7
按任意键后,回到主菜单,如图2所示。
输入6并按回车键后,屏幕显示如图8所示:
图8
按任意键后,回到主菜单,如图2所示。
输入0并按回车键后,屏幕显示如图9所示:
图9
按任意键后,退出程序。
4.3编写输入记录函数
1.编写输入记录函数Input
函数编写如下:
/*Input函数
功能:
输入若干个记录。
参数:
从结构体数组元素stu[n]开始输入,n表示原有记录个数。
返回值:
输入的记录个数。
*/
intInput(STUstu[],intn)
{inti=0;/*统计输入记录的个数*/
charsign;/*存放用户输入的选择Y/N*/
charx[10];/*x[10]为清除多余的数据所用*/
while(sign!
='n'&&sign!
='N')
{printf("student'snum:
");
scanf("%s",stu[n+i].num);
printf("student'sname:
");
scanf("%s",stu[n+i].name);
printf("student'sscore:
");
scanf("%d",&stu[n+i].score);
gets(x);/*清除多余的输入*/
printf("anymorerecords?
(Y/N)");/*选Y输入下一个记录,选N输入结束*/
scanf("%c",&sign);
i++;
}
return(n+i);
}
2.调试程序
(1)将输入记录函数Input插入到main函数前的注释部分
/*输入记录函数Input*/
处。
(2)在main函数中的switch语句中的注释部分
/*调用输入记录函数*/
处插入语句
n=Input(stu,n);
(3)程序运行结果如图10所示。
图10
按任意键后,返回主菜单,如图2所示。
4.4编写显示记录函数
1.编写显示记录函数Display
函数编写如下:
/*Display函数
功能:
显示记录
参数:
从结构体数组元素stu[0]开始输出n个记录
返回值:
无
*/
voidDisplay(STUstu[],intn)
{inti;
printf("%-15s%-15s%-15s\n","number","name","score");
for(i=0;i{printf("%-15s%-15s%-15d\n",stu[i].num,stu[i].name,stu[i].score);
if(i>0&&i%20==0)system("pause");/*每输出20个记录暂停*/
}
system("pause");
}
2.调试程序
(1)将显示记录函数Display插入到main函数前的注释部分
/*显示记录函数Display*/
处。
(2)在main函数中的switch语句中的注释部分
/*调用显示记录函数*/
处插入语句
Display(stu,n);
(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。
当输入2后,屏幕显示结果如图11所示。
图11
按任意键后,返回主菜单,如图2所示。
4.5编写排序函数
1.编写排序函数Sort_by_num
/*Sort_by_num函数
功能:
按学号排序
参数:
对结构体数组stu的前n个元素排序
返回值:
无
*/
voidSort_by_num(STU*stu,intn)
{inti,j;
STUtemp;
for(i=0;ifor(j=0;jif(strcmp(stu[j].num,stu[j+1].num)>0)
{temp=stu[j];stu[j]=stu[j+1];stu[j+1]=temp;
}
}
2.调试程序
(1)将排序函数Sort_by_num插入到main函数前的注释部分
/*记录排序函数Sort_by_num*/
处。
(2)在main函数中的switch语句中的注释部分
/*调用排序函数*/
处插入语句
Sort_by_num(stu,n);
(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。
当输入3后,屏幕显示结果如图12所示。
图12
按任意键后,返回主菜单,如图2所示。
再输入2,屏幕显示如图13所示。
图13
4.6编写统计数据函数
1.编写统计数据函数Statistic
/*Statistic函数
功能:
输出统计信息:
总记录数、最高分、最低分及平均分
参数:
统计结构体数组stu的前n个记录
返回值:
无
*/
voidStatistic(STUstu[],intn)
{inti,j=0,k=0,sum=0;
floataver;
for(i=0;i{sum+=stu[i].score;
if(stu[j].score>stu[i].score)j=i;
if(stu[k].score}
aver=1.0*sum/n;
printf("thereare%drecords.\n",n);/*总记录数*/
printf("thehignestscore:
\n");/*最高分*/
printf("number:
%sname:
%sscore:
%d\n",stu[k].num,stu[k].name,stu[k].score);
printf("thelowestscore:
\n");/*最低分*/
printf("number:
%sname:
%sscore:
%d\n",stu[j].num,stu[j].name,stu[j].score);
printf("theaveragescoreis%5.2f\n",aver);/*平均分*/
}
2.调试程序
(1)将统计数据函数Statistic插入到main函数前的注释部分
/*统计数据函数Statistic*/
处。
(2)在main函数中的switch语句中的注释部分
/*调用统计数据函数*/
处插入语句
Statistic(stu,n);
(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。
当输入4后,屏幕显示结果如图14所示。
图14
按任意键后,返回主菜单,如图2所示。
4.7编写向文件中写记录函数
1.编写向文件中写记录函数Write_to_file
/*Write_to_file函数
功能:
将记录写入文件
参数:
将数组stu的前n个记录写入文件
返回值:
无
*/
voidWrite_to_file(STUstu[],intn)
{inti=0;
FILE*fp;/*定义文件指针*/
charfilename[20];/*定义文件名*/
printf("WriteRecordstoaTextFile\n");/*输入文件名*/
printf("Inputthefilename:
");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)/*打开文件*/
{printf("cann'topenthefile\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n);/*写入记录个数*/
while(i{fprintf(fp,"%-16s%-15s%d\n",stu[i].num,stu[i].name,stu[i].score);
i++;
}
fclose(fp);/*关闭文件*/
printf("Successed!
\n");/*返回成功信息*/
}
2.调试程序
(1)将向文件中写记录函数Write_to_file插入到main函数前的注释部分
/*向文件写记录函数Write_to_file*/
处。
(2)在main函数中的switch语句中的注释部分
/*调用写文件函数*/
处插入语句
Write_to_file(stu,n);
(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。
当输入6后,屏幕提示输入存放数据的文件名,如输入student,并按回车,屏幕显示结果如图15所示。
图15
按任意键后,返回主菜单,如图2所示。
4.8编写从文件中读记录函数
1.编写从文件中读记录函数Read_from_file
/*Read_from_file函数
功能:
从文件中读取数据
参数:
从数组元素stu[n]开始输入
返回值:
记录个数
*/
intRead_from_file(STUstu[],intn)
{inti=0,num;
FILE*fp;/*定义文件指针*/
charfilename[20];/*定义文件名*/
printf("Inputthefilename:
");
scanf("%s",filename);/*输入文件名*/
if((fp=fopen(filename,"r"))==NULL)/*打开文件*/
{printf("cann'topenthefile\n");/*打开失败信息*/
system("pause");
return(n);}
fscanf(fp,"%d",&num);/*读入总的记录个数*/
while(i{fscanf(fp,"%s%s%d",stu[n+i].num,stu[n+i].name,&stu[n+i].score);
i++;
}
n+=num;
fclose(fp);/*关闭文件*/
printf("Successed!
\n");
system("pause");
return(n);
}
2.调试程序
(1)将从文件中读记录函数Read_from_file插入到main函数前的注释部分
/*从文件读记录函数Read_from_file*/
处。
(2)在main函数中的switch语句中的注释部分
/*调用读文件函数*/
处插入语句
n=Read_from_file(stu,n);
(3)程序运行后,出现主菜单。
当输入5后,屏幕出现提示信息:
输入文件名,如输入文件名student,并按回车后,屏幕显示结果如图16所示。
图16
按任意键后,返回主菜单,如图2所示。
至此,整个程序输入并调试完毕。
5.功能扩充
同学们可在上述实验的基础上进行修改和功能扩充。
例如:
(1)编写函数,其功能是删除用户指定的记录。
(2)编写函数,其功能是查找某记录。
(3)编写函数,其功能是按成绩排序。
以及其它功能。
本例采用静态结构体数组存放学生记录,其优点是程序设计简单,思路清楚,容易实现,缺点是数组的大小是在程序中固定的,要想改变大小,就要改写程序。
如果用链表存放学生记录,则灵活性较大,通用性强,学生可尝试用动态链表方式编写学生成绩管理程序。
6.撰写实验报告
学生做完该实验后要撰写实验报告,其格式如下:
计算机程序设计基础(C)实验报告
实验名称
一个小型软件的设计与实现
学院
专业班级
姓名
学号
任课教师
实验时间
一、实验目的
二、实验内容
三、设计方法
四、源程序
五、测试数据
六、实验心得
七、教师评语