学生成绩管理系统C语言不用链表而用结构体数组如何实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学生成绩管理系统C语言不用链表而用结构体数组如何实现相关的知识,希望对你有一定的参考价值。

这里还有几个实习表上的要求
1功能要求
1建立文件
1-可以使用默认文件名或指定文件名将记录存到文件
2-文件保存成功返回0,失败返回-1
3-设置保存标志savedtag作为是否已对记录进行存储操作的信息
4-写同名文件将覆盖原来的内容
2增加学生记录(每条记录包含学号、姓名、性别、五门课程成绩、总分、平均分、名次等字段)
1-可在已有记录后面追加新的记录
2-可以随时用它增加新的记录,它们仅保存在结构数组当中
3-可以将一个文件读入,追加在已有记录之后
4-如果已经采取用文件追加的方式,在没有保存到文件之前,将继续保持文件的追加状态,以便实现连续文件追加操作方式
5-如果没有记录存在,给出提示信息
3.新建学生信息文件
1-用来重新建立学生信息记录
2-如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存到一个指定文件,然后重新建立记录
3-给出相应的提示信息
4.显示记录
1-如果没有记录可供显示,给出提示信息
2-可以随时显示内存中的记录
3-显示表头(即字段名)
5.文件存储
1-可以按默认名字或指定名字存储记录
2-存储成功返回0,否则返回-1
3-更新存储标志
6.读取文件
1-可以按默认名字或指定名字存储记录文件
2-读取成功返回0,否则返回-1
3-可以将指定或默认文件追加到现有记录的尾部
4-可以将文件连续追加到现有记录并更新记录的名次
5-更新存储标志
还缺5个要求,过会补上
7.对记录进行排序
可以按学号姓名名词进行升序或降序排列
如果属于选择错误,可以立即退出排序
更新储存标志
8.删除记录
可以按学号姓名或名次方式删除记录
给出将被删除记录的信息,经确认后再删除
如果已经是空表,删除时应给出提示信息并返回主菜单
如果没有要删除的信息,输出没有找到的信息
应该更新其他记录的名次
删除操作仅限于内存,只有执行存记录时,才能覆盖原记录
更新储存标志
9.查询记录
可以按学号姓名或名次方式查询记录
能给出查询记录的信息
如果查询的信息不存在,输出提示信息
10.修改记录
可以按学号姓名或名次方式修改记录内容
给出将被修改记录的信息,经确认后进行修改
如果已经是空表,应给出提示信息并返回主菜单
如果没有找到需要修改的信息,输出提示信息
应该同时更新其他记录的名次
修改操作仅限于内存,只有进行存储记录时,才能覆盖原记录
更新储存标志
11.测试程序
应列出测试大纲对程序进行测试
应保证测试用例测试到程序的各种边缘情况
二设计要求
不用链表,而用数组来设计该程序
要求使用多文件方式实现设计
要求在各个文件内实现结构化设计,每个模块作为一个单独的C文件
宏和数据结构等放在头文件(worker.h)中

这是我用的,我同学做的,我也没仔细看,如果可以的话就用这个吧。
#include<stdio.h> /*引用库函数*/
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
typedef struct /*定义结构体数组*/

char num[10]; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
Student;
Student stu[80]; /*结构体数组变量*/
int menu_select() /*菜单函数*/

char c;
do
system("cls"); /*运行前清屏*/
printf("\t\t****Students' Grade Management System****\n"); /*菜单选择*/
printf("\t\t | 1. Input Records |\n");
printf("\t\t | 2. Display All Records |\n");
printf("\t\t | 3. Sort |\n");
printf("\t\t | 4. Insert a Record |\n");
printf("\t\t | 5. Delete a Record |\n");
printf("\t\t | 6. Query |\n");
printf("\t\t | 7. Statistic |\n");
printf("\t\t | 8. Add Records from a Text File|\n");
printf("\t\t | 9. Write to a Text file |\n");
printf("\t\t | 0. Quit |\n");
printf("\t\t*****************************************\n");
printf("\t\t\tGive your Choice(0-9):");
c=getchar(); /*读入选择*/
while(c<'0'||c>'9');
return(c-'0'); /*返回选择*/

int Input(Student stud[],int n) /*输入若干条记录*/
int i=0;
char sign,x[10]; /*x[10]为清除多余的数据所用*/
while(sign!='n'&&sign!='N') /*判断*/
printf("\t\t\tstudent's num:"); /*交互输入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n+i].score);
gets(x); /*清除多余的输入*/
printf("\t\t\tany more records?(Y/N)");
scanf("\t\t\t%c",&sign); /*输入判断*/
i++;

return(n+i);

void Display(Student stud[],int n) /*显示所有记录*/

int i;
printf("\t\t\t-----------------------------------\n"); /*格式头*/
printf("\t\t\tnumber name score\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i<n+1;i++) /*循环输入*/

printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i>1&&i%10==0) /*每十个暂停*/
printf("\t\t\t-----------------------------------\n"); /*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");


printf("\t\t\t");
system("pause");

void Sort_by_num(Student stud[],int n) /*按学号排序*/
int i,j,*p,*q,s;
char t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(strcmp(stud[j].num,stud[j+1].num)>0)
strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=&stud[j+1].score;
q=&stud[j].score;
s=*p;
*p=*q;
*q=s;


int Insert_a_record(Student stud[],int n) /*插入一条记录*/
char x[10]; /*清除多余输入所用*/
printf("\t\t\tstudent's num:"); /*交互式输入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n].score);
gets(x);
n++;
Sort_by_num(stud,n); /*调用排序函数*/
printf("\t\t\tInsert Successed!\n"); /*返回成功信息*/
return(n);

int Delete_a_record(Student stud[],int n) /*按姓名查找,删除一条记录*/
char s[20];
int i=0,j;
printf("\t\t\ttell me his(her) name:"); /*交互式问寻*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
printf("\t\t\tnot find!\n"); /*返回失败信息*/
return(n);

for(j=i;j<n-1;j++) /*删除操作*/

strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;

printf("\t\t\tDelete Successed!\n"); /*返回成功信息*/
return(n-1);

void Query_a_record(Student stud[],int n) /*查找并显示一个记录*/
char s[20];
int i=0;
printf("\t\t\tinput his(her) name:"); /*交互式输入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
printf("\t\t\tnot find!\n"); /*输入失败信息*/
return;


printf("\t\t\this(her) number:%s\n",stud[i].num); /*输出该学生信息*/
printf("\t\t\this(her) score:%d\n",stud[i].score);

void Statistic(Student stud[],int n) /*新增功能,输出统计信息*/
int i,j=0,k=0,sum=0;
float aver; /*成绩平均值*/
for(i=0;i<n;i++) /*循环输入判断*/

sum+=stud[i].score;
if(stud[j].score>stud[i].score) j=i;
if(stud[k].score<stud[i].score) k=i;

aver=1.0*sum/n;
printf("\t\t\tthere are %d records.\n",n); /*总共记录数*/
printf("\t\t\tthe hignest score:\n"); /*最高分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\tthe lowest score:\n"); /*最低分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\tthe average score is %5.2f\n",aver); /*平均分*/

int AddfromText(Student stud[],int n) /*从文件中读入数据*/
int i=0,num;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打开文件*/
printf("\t\t\tcann't open the file\n"); /*打开失败信息*/
printf("\t\t\t");
system("pause");
return(n);

fscanf(fp,"%d",&num); /*读入总记录量*/
while(i<num) /*循环读入数据*/

fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,&stud[n+i].score);
i++;

n+=num;
fclose(fp); /*关闭文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);

void WritetoText(Student stud[],int n) /*将所有记录写入文件*/

int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\tWrite Records to a Text File\n"); /*输入文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打开文件*/

printf("\t\t\tcann't open the file\n");
system("pause");
return;

fprintf(fp,"%d\n",n); /*循环写入数据*/
while(i<n)

fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);
i++;

fclose(fp); /*关闭文件*/
printf("Successed!\n"); /*返回成功信息*/

void main() /*主函数*/

int n=0;
for(;;)

switch(menu_select()) /*选择判断*/

case 1:
printf("\t\t\tInput Records\n"); /*输入若干条记录*/
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); /*显示所有记录*/
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); /*按学号排序*/
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); /*插入一条记录*/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); /*按姓名查找,删除一条记录*/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); /*查找并显示一个记录*/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\tStatistic\n");
Statistic(stu,n); /*新增功能,输出统计信息*/
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tAdd Records from a Text File\n");
n=AddfromText(stu,n); /*新增功能,输出统计信息*/
break;
case 9:
printf("\t\t\tWrite to a Text file\n");
WritetoText(stu,n); /*循环写入数据*/
printf("\t\t\t");
system("pause");
break;
case 0:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /*结束程序*/
printf("\t\t\t");
system("pause");
exit(0);




四、函数调用关系图
注:“→”代表调用
Input函数
打印链表记录
Display函数
输入若干条记录
menu_select()函数
选择菜单
Sort_by_num函数
显示所有记录
Delete_a_record函数
按姓名查找,删除一条记录
Query_a_record查找并显示一条记录
Statistic函数
输出统计信息 (新增)
AddfromText函数
从正文中添加数据到结构体数组中
Main函数
Insert_a_record插入一条记录
WritetoText函数 将所有数据写入文件中
退出程序
Reverse(head)函数
按学号排序
五、设计测试流程
1、进入界面
2、输入选项1,回车;
按提示输入数据:
3、回到主菜单;
输入选项7,回车;
输入文件名:data.txt,回车;
出现成功提示,则读入文件操作成功。
4、回到主菜单,输入2,回车
每10个暂停显示数据
5、回到主菜单,输入3,回车
出现排序成功信息。
6、回到主菜单,输入4,回车
按提示插入一组数据
7、回到主菜单,输入5,回车
按提示输入姓名,删除数据
出现删除成功的信息
8、回到主菜单,输入6,回车
输入姓名进行查询
9、回到主菜单,输入7,回车
出现统计信息
10、回到主菜单,输入9,回车
输入result.txt,回车
出现成功写入文件的信息
11、回到主菜单,输入0,回车退出系统
回答者:kingkey001 - 试用期 一级 7-14 22:38
修改答复: kingkey001,您要修改的答复如下: 积分规则 关闭
C语言课程设计报告-------学生成绩简单管理程序
一、系统菜单的主要功能
(1)输入若干条记录
(2)显示所有记录
(3)按学号排序
(4)插入一条记录
(5)按姓名查找,删除一条记录
(6)查找并显示一条记录
(7)输出统计信息 (新增)
(8)从正文中添加数据到结构体数组中
(9)将所有数据写入文件中
(0)退出程序
二、题目分析
该题主要考察学生对结构体,指针,文件的操作,以及C语言算法的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。
菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学过的技巧,下面就各个子程序中的功能进行说明:
功能1和4的算法相似,输入一条记录到结构体中去,其中有一部很关键,就是通过gets将所有的多余的字符,回车读去,否则就会出错。
功能2是显示所有的记录,通过循环输出,格式也比较重要。
功能3为按学号排序,因为学号定义成了字符数组的形式,因此在运用冒泡法进行排序的时候,要用到strcmp,strcpy等函数。
功能5为按姓名删除记录,先输入姓名,再一一比较,如果没有则返回失败信息,如果找到就将此记录都向前移一位,返回n-1。
功能6的算法在5中就已经体现了,输入姓名,一一比较。
功能7为新增的功能,因为考虑到原来给出的函数中竟然没有对学生成绩的统计功能,因此新增此功能,可以得出所有的记录个数,最高、最低、平均分,并输出相关的学生信息等。
功能8和9是对文件的操作,提前准备好数据。
三、程序正文部分
#include<stdio.h> /*引用库函数*/
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
typedef struct /*定义结构体数组*/

char num[10]; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
Student;
Student stu[80]; /*结构体数组变量*/
int menu_select() /*菜单函数*/

char c;
do
system("cls"); /*运行前清屏*/
printf("\t\t****Students' Grade Management System****\n"); /*菜单选择*/
printf("\t\t | 1. Input Records |\n");
printf("\t\t | 2. Display All Records |\n");
printf("\t\t | 3. Sort |\n");
printf("\t\t | 4. Insert a Record |\n");
printf("\t\t | 5. Delete a Record |\n");
printf("\t\t | 6. Query |\n");
printf("\t\t | 7. Statistic |\n");
printf("\t\t | 8. Add Records from a Text File|\n");
printf("\t\t | 9. Write to a Text file |\n");
printf("\t\t | 0. Quit |\n");
printf("\t\t*****************************************\n");
printf("\t\t\tGive your Choice(0-9):");
c=getchar(); /*读入选择*/
while(c<'0'||c>'9');
return(c-'0'); /*返回选择*/

int Input(Student stud[],int n) /*输入若干条记录*/
int i=0;
char sign,x[10]; /*x[10]为清除多余的数据所用*/
while(sign!='n'&&sign!='N') /*判断*/
printf("\t\t\tstudent's num:"); /*交互输入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n+i].score);
gets(x); /*清除多余的输入*/
printf("\t\t\tany more records?(Y/N)");
scanf("\t\t\t%c",&sign); /*输入判断*/
i++;

return(n+i);

void Display(Student stud[],int n) /*显示所有记录*/

int i;
printf("\t\t\t-----------------------------------\n"); /*格式头*/
printf("\t\t\tnumber name score\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i<n+1;i++) /*循环输入*/

printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i>1&&i%10==0) /*每十个暂停*/
printf("\t\t\t-----------------------------------\n"); /*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");


printf("\t\t\t");
system("pause");

void Sort_by_num(Student stud[],int n) /*按学号排序*/
int i,j,*p,*q,s;
char t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(strcmp(stud[j].num,stud[j+1].num)>0)
strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=&stud[j+1].score;
q=&stud[j].score;
s=*p;
*p=*q;
*q=s;


int Insert_a_record(Student stud[],int n) /*插入一条记录*/
char x[10]; /*清除多余输入所用*/
printf("\t\t\tstudent's num:"); /*交互式输入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n].score);
gets(x);
n++;
Sort_by_num(stud,n); /*调用排序函数*/
printf("\t\t\tInsert Successed!\n"); /*返回成功信息*/
return(n);

int Delete_a_record(Student stud[],int n) /*按姓名查找,删除一条记录*/
char s[20];
int i=0,j;
printf("\t\t\ttell me his(her) name:"); /*交互式问寻*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
printf("\t\t\tnot find!\n"); /*返回失败信息*/
return(n);

for(j=i;j<n-1;j++) /*删除操作*/

strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;

printf("\t\t\tDelete Successed!\n"); /*返回成功信息*/
return(n-1);

void Query_a_record(Student stud[],int n) /*查找并显示一个记录*/
char s[20];
int i=0;
printf("\t\t\tinput his(her) name:"); /*交互式输入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
printf("\t\t\tnot find!\n"); /*输入失败信息*/
return;


printf("\t\t\this(her) number:%s\n",stud[i].num); /*输出该学生信息*/
printf("\t\t\this(her) score:%d\n",stud[i].score);

void Statistic(Student stud[],int n) /*新增功能,输出统计信息*/
int i,j=0,k=0,sum=0;
float aver; /*成绩平均值*/
for(i=0;i<n;i++) /*循环输入判断*/

sum+=stud[i].score;
if(stud[j].score>stud[i].score) j=i;
if(stud[k].score<stud[i].score) k=i;

aver=1.0*sum/n;
printf("\t\t\tthere are %d records.\n",n); /*总共记录数*/
printf("\t\t\tthe hignest score:\n"); /*最高分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\tthe lowest score:\n"); /*最低分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\tthe average score is %5.2f\n",aver); /*平均分*/

int AddfromText(Student stud[],int n) /*从文件中读入数据*/
int i=0,num;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打开文件*/
printf("\t\t\tcann't open the file\n"); /*打开失败信息*/
printf("\t\t\t");
system("pause");
return(n);

fscanf(fp,"%d",&num); /*读入总记录量*/
while(i<num) /*循环读入数据*/

fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,&stud[n+i].score);
i++;

n+=num;
fclose(fp); /*关闭文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);

void WritetoText(Student stud[],int n) /*将所有记录写入文件*/

int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\tWrite Records to a Text File\n"); /*输入文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打开文件*/

printf("\t\t\tcann't open the file\n");
system("pause");
return;

fprintf(fp,"%d\n",n); /*循环写入数据*/
while(i<n)

fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);
i++;

fclose(fp); /*关闭文件*/
printf("Successed!\n"); /*返回成功信息*/

void main() /*主函数*/

int n=0;
for(;;)

switch(menu_select()) /*选择判断*/

case 1:
printf("\t\t\tInput Records\n"); /*输入若干条记录*/
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); /*显示所有记录*/
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); /*按学号排序*/
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); /*插入一条记录*/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); /*按姓名查找,删除一条记录*/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); /*查找并显示一个记录*/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\tStatistic\n");
Statistic(stu,n); /*新增功能,输出统计信息*/
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tAdd Records from a Text File\n");
n=AddfromText(stu,n); /*新增功能,输出统计信息*/
break;
case 9:
printf("\t\t\tWrite to a Text file\n");
WritetoText(stu,n); /*循环写入数据*/
printf("\t\t\t");
system("pause");
break;
case 0:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /*结束程序*/
printf("\t\t\t");
system("pause");
exit(0);




四、函数调用关系图
注:“→”代表调用
Input函数
打印链表记录
Display函数
输入若干条记录
menu_select()函数
选择菜单
Sort_by_num函数
显示所有记录
Delete_a_record函数
按姓名查找,删除一条记录
Query_a_record查找并显示一条记录
Statistic函数
输出统计信息 (新增)
AddfromText函数
从正文中添加数据到结构体数组中
Main函数
Insert_a_record插入一条记录
WritetoText函数 将所有数据写入文件中
退出程序
Reverse(head)函数
按学号排序
五、设计测试流程
1、进入界面
2、输入选项1,回车;
按提示输入数据:
3、回到主菜单;
输入选项7,回车;
输入文件名:data.txt,回车;
出现成功提示,则读入文件操作成功。
4、回到主菜单,输入2,回车
每10个暂停显示数据
5、回到主菜单,输入3,回车
参考技术A #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>

struct student
char num[10];
char name[20];
char sex[5];
float grade[3];
float v;
float sum;
stu[50];
int k=0;

void input();
void display();
void lookandchange();
void average();
void paixu();
void save();

void main()

int a;
do


printf("\n\n ******************************************************************\n");
printf(" *"); printf("\t\twelcome enter the student management system"); printf("\t*");
printf("\n ******************************************************************\n");

printf(" *"); printf("\t 1.Access student information"); printf("\t\t\t\t*\n");
printf(" *"); printf("\t 2.Display student information"); printf("\t\t\t\t*\n");
printf(" *"); printf("\t 3.LookandChange student information"); printf("\t\t\t*\n");
printf(" *"); printf("\t 4.By sum Sort student information and output"); printf("\t\t*\n");
printf(" *"); printf("\t 5.save the student information"); printf("\t\t\t*\n");
printf(" *"); printf("\t 6. exit "); printf("\t\t\t\t\t*\n");
printf(" ******************************************************************\n");

printf(" Enter you choice : ");
scanf("%d",&a);

switch(a)


case 1:printf("\n");input();break;
case 2:printf("\n");display();break;
case 3:printf("\n");lookandchange();break;
case 4:printf("\n");paixu();break;
case 5:printf("\n");save();break;
case 6:printf("\n");exit(0);break;
default:printf("\nThe choice is between 1 to 6.\n");

while(a!=0);



void input()
int j;
char ch[20];
printf("\nenter student information:\n");
do
printf("\nnum: ");
scanf("%s",stu[k].num);
printf("\nname: ");
scanf("%s",stu[k].name);
printf("\nsex: ");
scanf("%s",stu[k].sex);
for(j=0;j<3;j++)
printf("\ngrade%d: ",j+1);
scanf("%f",&stu[k].grade[j]);
k++;
printf("\nif want continue input student information(y/n): ");
scanf("%s",ch);
while(strcmp(ch,"y")==0||strcmp(ch,"Y")==0);
average();
display();


void display()
int i;
printf(" the student information is:\n");
for(i=0;i<k;i++)
printf("%-10s %-10s %-5s %.2f %.2f %.2f %8f %8f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].sum,stu[i].v);
printf("\n");


void average()
int i,j;
for(i=0;i<k;i++)
stu[i].sum=0;
for(j=0;j<3;j++)
stu[i].sum=stu[i].sum+stu[i].grade[j] ;
stu[i].v=stu[i].sum/5;


void lookandchange()

int pass[4]; int i,j,l,flag;
char a[20],ch[10],c[20];
printf("This is a database management system:\n");
for(l=0;l<3;l++)
flag=0;
printf(" please enter the password: ");
scanf("%1d%1d%1d%1d",&pass[0],&pass[1],&pass[2],&pass[3]);
for(i=0;i<4;i++)
if(pass[i]==i+1) flag=flag+1;
if(flag==4)
printf("\nenter you want look student num:");
scanf("%s",a);
for(i=0;i<k;i++)
if(strcmp(stu[i].num,a)==0) printf("%-10s %-10s %-5s %.2f %.2f %.2f %8f %8f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].sum,stu[i].v);
printf("\nenter you want look student name:");
scanf("%s",a);
for(i=0;i<k;i++)
if(strcmp(stu[i].name,a)==0) printf("%-10s %-10s %-5s %.2f %.2f %.2f %8f %8f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].sum,stu[i].v);
printf("\nenter you want change student num:");
scanf("%s",a);
for(i=0;i<k;i++)

if(strcmp(stu[i].num,a)==0)
printf("\nyou sure want change student num(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0) printf("\nnum:"); scanf("%s",stu[i].num);
printf("\nyou sure want change student name(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0) printf("\nname:"); scanf("%s",stu[i].name);
printf("\nyou sure want change student sex(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0) printf("\nsex:"); scanf("%s",stu[i].sex);
printf("\nyou sure want change student grade(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
for(j=0;j<3;j++)
printf("grade%d:",j+1); scanf("%f",&stu[i].grade[j]); printf("\n");
stu[i].sum=0;
for(j=0;j<5;j++)
stu[i].sum=stu[i].sum+stu[i].grade[j] ;
stu[i].v=stu[i].sum/5;

printf("\nyou sure want delete student information(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
printf("\nenter you want delete num :\n");
printf("num:");
scanf("%s",&c);
for(i=0;i<k;i++)
if(strcmp(c,stu[i].num)==0) break;
for(j=i;j<=2;j++)
stu[j]=stu[j+1];
printf("\t\t\tyou had delete %s\n",c);
k--;

else printf("\nyou enter password is wrong.\n");
display();


void paixu()
struct student temp;
int i,j;
for(i=0;i<k-1;i++)

for(j=i+1;j<k;j++)

if(stu[i].sum<stu[j].sum)

temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;


display();


void save()
FILE *fp; int i;
if((fp=fopen("xinxi.txt","w"))==NULL)
printf("cannot write the file.\n");
exit(0);
for(i=0;strlen(stu[i].num)!=0;i++)
fprintf(fp,"%-10s %-10s %-5s %.2f %.2f %.2f %8f %8f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].sum,stu[i].v);
fclose(fp);

什么是C语言设计模板结构?

最近遇到一专业题:
按照模板设计思想,设计一学生成绩录入管理字系统。要求写出其模板结构和原程序?

想问下什么是模板结构?怎样写?多谢~ 程序就不用了~~

应该不是C吧,只有C++才支持模板,题目的意思就是要你用模板类来设计这个管理系统。
比如你的程序可能会用到链表存储结构,这个链表类就可以是一个模板类,代入学生类这个类型,就成了具体的用于存储学生信息的链表类了。
参考技术A 应该是C++类和对象里面的吧

以上是关于学生成绩管理系统C语言不用链表而用结构体数组如何实现的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体排序

C语言 建立一个结构体类型,包括了学生姓名和两门课的成绩,用这个类型定义结构体数组,保存多个学生信息

C语言实训

用C语言设计一个学生成绩管理系统

C语言中结构体的理解

C语言 n名学生的成绩存储在一个结构体数组变量scoreLists中,计算学生成绩的平均分