1、大连民族学院 计算机科学与工程学院实验报告 实验题目: 学生成绩管理程序 课程名称: 程序设计基础实习 实验类型:□演示性□验证性□操作性■设计性□综合性 专业:网络工程 班级: 网络124 学生姓名: 学号: 实验日期: 2015年3月30日 实验地点:计算机学院综合试验中心(F-307) 实验学时: 48 实验成绩: 指导教师签字:
2、 2015 年 3月 30日 一、教学目的与要求: 本实习的目的就是要达到能够灵活运用程序设计基础所讲授内容,能够针对一个 需求比较明确的小型问题,设计合理的解决方案,并能够用编程语言转化为程序以解 决实际问题。进一步掌握开发一个小型实用软件系统的基本步骤和方法、初步培养良 好的编程习惯、掌握调试代码的基本方法。 具体目标要求: 1)学生应该熟练掌握条件分支、循环控制等语句,掌握函数的定义与调用,能以结构体的形式(struct)表示事物对象,并以数组的形式组织数据,部分同学可以尝试用指针、文件等知识;2)学生能够以比较规范的方式书写代码,能够了解一些程序在工程上的要
3、求以及为何这样要求; 3)学生能独立调试、跟踪代码,并能解决常见的编译错误和运行错误。 二 功能分析 1、读/写功能:在程序开始时读取数据文件中的数据至程序,在程序选择正常退出时将程序中的数据写回数据文件; 2、浏览功能:实现所有数据的显示即可; 3、查找功能:分为按照学号查找(结果唯一)和按照姓名查找(结果不唯一)两个 子功能; 4、增加功能:首先输入要增加的记录的学号,然后判断此学号是否已经存在,如果存在,则不增加,否则增加记录(放在所有记录之后即可); 5、删除功能:首先输入要删除的记录的学号,然后判断此学号是否已经存在,如果存在才删除此条记录(即数组数据的删除); 6
4、修改功能:首先输入要修改的记录的学号,然后判断此学号是否已经存在,如果存在,则对记录的信息项进行修改;
三.数据需求
(1)学生信息包括:学号、学生姓名、班级。
(2)课程信息包括:成绩数学、外语、物理、程序、思修、中传,共6门
四.代码说明
//头文件包含
#include
5、truct{ char no[11]; //学号 char name[30]; //姓名 char clname[10]; //班级名称 int score[6]; //6门课程的分数 int sum; //本学期总分 }StScore; //函数原型声明 void mainMenu(); //主菜单 int readFunc(StScore stS[]); //从文件中读数据至数组 int saveFunc(StScore stS[], int n); //将程序中的数据写回到数据文件中 void displayAl
6、l(StScore stS[], int n); //显示功能(显示所有记录) void searchFunc(StScore stS[], int n); //查找功能 int searchByNo(StScore stS[], int n); //按学号查找 //void displaySingleRecord(StScore stS[], int index); //显示单条记录 int searchByName(StScore stS[], int n);//按姓名查找 int delFunc(StScore stS[], int n); //删除功能 int
7、 addFunc(StScore stS[], int n); //添加功能 int modifyFunc(StScore stS[], int n); //修改功能 /////////////////////////////////////////////////////////////////////// //函数说明:程序的主函数 int main() { StScore stS[300]; //用于存储数据的数组 int size; //数组中记录的数目 char x; size = readFunc(stS); if(size == -1) {
8、 printf("读取文件错误!\n"); return 1; } char sel; //菜单选项 // char no[11]; //输入的学号变量 // char name[20]; // int ret; //返回值 while(1) { mainMenu(); printf("请输入您的选项: \n"); fflush(stdin); sel = getche(); putchar('\n'); switch(sel) { case '1': //添加记录 addFunc(stS, s
9、ize); size++; break; case '2': //删除记录 delFunc(stS, size); size--; break; case '3': //修改记录 modifyFunc(stS, size); break; case '4': //查找记录 { printf("请选择:1--按学号查找,2--按姓名查找\n"); x = getche(); putchar('\n'); switch(x){ case '1':
10、 searchByNo(stS, size); break; case '2': searchByName(stS, size); break; } } break; case '5': //显示记录 displayAll(stS, size); break; case '0': //退出程序 saveFunc(stS, size); return 0; default: printf("输入错误!\n"); break; } }
11、 return 0; } /////////////////////////////////////////////////////////////////////// /* 函数说明:从文件中读数据至数组 参数: stS:StScore *类型,指向要操作的学生记录数组的指针。 返回值: 如果读取成功,则返回stS数组中的记录数目;如果读取失败,则返回-1。 算法描述: 0、SrcFile文件中数据格式如下:2013250612 李宣廷 网络141 69 82 78 81 61 87; 1、从SrcFile中读取至StScore类型的数组stS; 2、如果文
12、件操作失败,则返回-1,否则每读取一条,计数器+1,读取结束后,返回该计数器的值。 */ int readFunc(StScore stS[]) { int i, j; FILE *fp; fp = fopen(SrcFile, "r"); //只读形式打开文件 if(fp == NULL) return -1; for(i=0; !feof(fp); i++) { if(fscanf(fp, "%s%s%s", stS[i].no, stS[i].name, stS[i].clname) == EOF) break; stS[i].su
13、m = 0; for(j=0; j<6; j++) { fscanf(fp, "%d", &stS[i].score[j]); stS[i].sum += stS[i].score[j]; } } fclose(fp); return i; } //////////////////////////////////////////////////////////* 函数说明:把程序中的数据写回数据文件 参数: stS:StScore *类型,指向要操作的学生记录数组的指针。 n:int类型,表明参数stS数组的大小 返回值: 如果写成
14、功,则返回1,否则返回0。
算法描述:将数组stS中的数据全部写回
*/
int saveFunc(StScore stS[], int n)
{
int i, j;
FILE *fp;
fp = fopen(SrcFile, "w"); //只写形式打开文件
if(fp == NULL)
return -1;
for(i=0; i 15、fp, "%d ", stS[i].score[j]);
}
fclose(fp);
return i;
}
///////////////////////////////////////////////////////////////////////
//函数说明:主菜单程序
void mainMenu()
{
printf("--1. 添加记录 --\n");
printf("--2. 删除记录 --\n");
printf("--3. 修改记录 --\n");
printf("--4. 查找记录 16、\n");
printf("--5. 显示记录 --\n");
printf("--0. 退出程序 --\n");
}
/*
函数说明:完成显示功能(显示所有记录)
参数说明:
stS:StScore *类型,指向要操作的学生记录数组的指针
n:int类型,表明参数stS数组的大小
返回值说明:无返回值
算法描述:先显示表头,之后显示学号、姓名、班级,
接着通过循环显示成绩数组、显示总分,最后每输出一条记录换一行。
*/
void displayAll(StScore stS[], int n)
{
int i, j;
17、printf("学号\t\t姓名\t班级\t数学 外语 物理 程序 思修 中传 总分\t\n");
printf("------------------------------------------------------------------\n");
for(i=0; i 18、 stS[i].sum);
}
}
int addFunc(StScore stS[], int n) //添加记录功能
{
int i;
char sno[10];
FILE *fp;
printf("请输入要添加的学号:\n");
gets(sno);
for(i=0;i 19、
}
}
strcpy(stS[n].no,sno); //拷贝字符串。
printf("此学号已添加!!!\n");
printf("请输入姓名:\n");
gets(stS[n].name);
printf("请输入班级:\n");
gets(stS[n].clname);
printf("请输入数学、外语、物理、程序、思修、中传:\n"); scanf("%d %d %d %d %d %d",&stS[n].score[0],&stS[n].sco 20、re[1],&stS[n].score[2],&stS[n].score[3],&stS[n].score[4],&stS[n].score[5]);
// stS[n].sum=stS[n].score[0]+stS[n].score[1]+stS[n].score[2]+stS[n].score[3]+stS[n].score[4]+stS[n].score[5];
fp = fopen(SrcFile, "at"); //在文件原有内容后追加内容。
if(fp==NULL)
{
printf("文件不存在!!!");
retu 21、rn -1;
}
fprintf(fp," %s %s %s %d %d %d %d %d %d",stS[n].no,stS[n].name,stS[n].clname,stS[n].score[0],stS[n].score[1],stS[n].score[2],stS[n].score[3],stS[n].score[4],stS[n].score[5]);
fclose(fp);
printf("记录添加成功!!!\n");
return 0;
}
int searchByNo(StScore stS[], int n)//按学号查找信息记录
{ 22、
int x=0;
char sno[10];
printf("请输入学号:\n");
gets(sno);
for(int i=0;i 23、e[4],stS[i].score[5]);
x++;
return 0;
}
if(x==0)
printf("此学号不存在");
return 0;
}
int searchByName(StScore stS[], int n)//按姓名查找信息记录
{
char sname[20];
int a=0;
printf("请输入姓名:\n");
gets(sname);
for(int i=0;i 24、号是否存在
{
printf("%s %s %s %d %d %d %d %d %d\n",stS[i].no,stS[i].name,stS[i].clname,stS[i].score[0],stS[i].score[1],stS[i].score[2],stS[i].score[3],stS[i].score[4],stS[i].score[5]);
a++;
}
if(a==0)
printf("此姓名不存在!!!\n");
return 0;
}
int delFunc(StScore stS[], int n)//按学号删除信 25、息
{
int weizhi=-1,i,j;
FILE *fp;
char sno[10];
printf("请输入要删除的学号:\n");
gets(sno);
for(i=0;i 26、e[2],stS[i].score[3],stS[i].score[4],stS[i].score[5]);
weizhi=i;
break;
}
if(weizhi==-1)
printf("此学号不存在!!!\n");
else
printf("删除成功!!!\n");
for(i=weizhi;i 27、 strcpy(stS[i].clname,stS[i+1].clname);
stS[i].score[0]=stS[i+1].score[0];
stS[i].score[1]=stS[i+1].score[1];
stS[i].score[2]=stS[i+1].score[2];
stS[i].score[3]=stS[i+1].score[3];
stS[i].score[4]=stS[i+1].score[4];
s 28、tS[i].score[5]=stS[i+1].score[5];
}
fp = fopen(SrcFile, "w"); //只写形式打开文件
if(fp == NULL)
return -1;
for(i=0; i 29、
}
int modifyFunc(StScore stS[], int n)//修改成绩
{
int x=0,j;
FILE *fp;
char sno[10];
printf("请输入要修改的学号:\n");
gets(sno);
for(int i=0;i 30、stS[i].score[0],&stS[i].score[1],&stS[i].score[2],&stS[i].score[3],&stS[i].score[4],&stS[i].score[5]);
printf("修改成功!!!\n");
x++;
return 0;
}
if(x==0)
printf("此学号不存在\n");
fp = fopen(SrcFile, "w"); //只写形式打开文件
if(fp == NULL)
return -1;
for(i=0; i 31、tf(fp, "%s %s %s ", stS[i].no, stS[i].name, stS[i].clname);
for(j=0; j<6; j++)
fprintf(fp, "%d ", stS[i].score[j]);
}
fclose(fp);
return 0;
}
五.心得体会
课程设计实践训练,在课设中也遇到了很多问题,经过向老师询问和跟同学们交流,认真的思考,积极解决问题,终于解决了那些问题。在解决问题的过程中,我也学到了很多知识,更是让我把课本的知识应用到实际之中,让我了解了我们学习的知识有什么用,增强我的自信心和学习的动力。同时感谢老师和同学在课程设计过程中的帮助!
总之,通过这次课程设计,我获益匪浅。






