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