一、系统菜单的主要功能
(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<stdioh> /引用库函数/
#include<stdlibh>
#include<ctypeh>
#include<stringh>
typedef struct /定义结构体数组/
{
char num[10]; /学号/
char name[20]; /姓名/
int score; /成绩/
}Student;
Student stu[80]; /结构体数组变量/
int menu_select() /菜单函数/
{
char c;
do{
system("cls"); /运行前清屏/
printf("\t\tStudents' 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=10sum/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 %52f\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,回车;
输入文件名:datatxt,回车;
出现成功提示,则读入文件 *** 作成功。
4、回到主菜单,输入2,回车
每10个暂停显示数据
5、回到主菜单,输入3,回车
出现排序成功信息。
6、回到主菜单,输入4,回车
按提示插入一组数据
7、回到主菜单,输入5,回车
按提示输入姓名,删除数据
出现删除成功的信息
8、回到主菜单,输入6,回车
输入姓名进行查询
9、回到主菜单,输入7,回车
出现统计信息
10、回到主菜单,输入9,回车
输入resulttxt,回车
出现成功写入文件的信息
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<stdioh> /引用库函数/
#include<stdlibh>
#include<ctypeh>
#include<stringh>
typedef struct /定义结构体数组/
{
char num[10]; /学号/
char name[20]; /姓名/
int score; /成绩/
}Student;
Student stu[80]; /结构体数组变量/
int menu_select() /菜单函数/
{
char c;
do{
system("cls"); /运行前清屏/
printf("\t\tStudents' 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=10sum/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 %52f\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");//自己再添上性别 什么的就行
#include <stringh>
#include <stdioh>
#include <stdlibh>
#define _COURSES 3//定义科目数
#define _LEN sizeof(student)//定义结构体大小
//枚举返回值情况
enum status
{
OVERFLOW = -1, //内存(溢出)问题
DONE = 0, //成功
NOFOUND = 1, //不存在
OPENFAIL = 2, //打开(文件)失败
BACK = 3 //返回
};
//end
//定义学生信息结构体
typedef struct StudentInfo
{
//数据域
unsigned int num;//学号
char name[11];//姓名
float scores[_COURSES];//各科成绩
//指针域
struct StudentInfo next;//存放下一节点的地址
}student;
//end
student head=NULL;//声明链表头结点
student curr=NULL;//声明指向当前节点的指针
int total = 0;//声明当前节点个数
int init();//初始化链表
int add_stu();//添加新节点
int show_all();//显示所有学生信息
int find_stu();//查找指定信息节点
int modify_stu();//修改指定信息节点
int remove_stu();//删除指定信息节点
int sort_list();//对链表排序
int save_to_file();//将所有信息保存至文件
int read_from_file();//从文件中读取信息
void about();//关于
int quit();//释放所有节点空间
int entering(student input);//录入学生信息
void show_stu(student show, int serial);//显示指定学生信息
void start();//程序开始界面
void change(student former, student latter, student temp);//交换两个节点的数据域
void main()
{
int choice=0;
init();
while(1)
{
system("cls");
start();
printf("请选择:");
scanf("%d",&choice);
fflush(stdin);//清空缓冲区
switch (choice)
{
case 1:
{
add_stu();
break;
}
case 2:
{ show_all();
break;
}
case 3:
{
find_stu();
break;
}
case 4:
{
modify_stu();
break;
}
case 5:
{
remove_stu();
break;
}
case 6:
{
sort_list();
break;
}
case 7:
{
save_to_file();
break;
}
case 8:
{
read_from_file();
break;
}
case 9:
{
about();
break;
}
case 0:
{
quit();
exit(0);
break;
}
default:{break;}
}
system("pause");
}
}
//
/功能: 初始化带头结点的链表,头结点指针域置空 /
/ /
/返回: /
//
int init()
{
head = (student )malloc(_LEN);//为头结点申请空间
if (!head)
{//如果申请空间失败,返回
return OVERFLOW;
}
head->next = NULL;//指向下一节点(空)
curr = head->next;//当前节点指针指向第一个结点
total = 0;//当前节点个数初始化为0(头结点不计算在内)
return DONE;
}
//
/功能:头插法添加新节点,并刷新学生人数 /
/ /
/返回: /
//
int add_stu()
{
student add = (student )malloc(_LEN);
curr = head->next;//当前节点指针指向第一个节点
printf("\t====当前已存入 %d 个同学\n",total);
printf("请输入第 %d 个学生的信息\n",total+1);
if (BACK == entering(add))
{
free(add);
return BACK;
}
head->next = add;//头结点指针域指向新建的节点
add->next = curr;//新建节点指针域指向第一个节点
curr = add; //当前节点指向新建的节点
total += 1; //更新学生总人数
return DONE;
}
//
/功能:显示所有学生信息 /
/ /
/返回: /
//
int show_all()
{
if ( 0 == total )
{
printf("\t====没有可供显示的学生信息!\n");
return NOFOUND;
}
curr = head->next;//当前节点指针指向第一个节点
printf("\t%4s%12s%12s","序号","学号","姓名");
for (int m=0; m<_COURSES; m++)
{
printf("%7s","科目");
}
printf("\n");
printf("\t-------------------------------------------------------------\n");
for (int i=1; i<=total; i++)
{
show_stu(curr,i);
curr = curr->next;//当前节点指针后移
}
printf("\t-------------------------------------------------------------\n");
return DONE;
}
//
/功能:查找指定学生信息 /
/ /
/返回: /
//
int find_stu()
{
char stu_name[11];
int flag=1;
printf("请输入要查找的学生姓名:");
scanf("%s",stu_name);
curr = head->next;//指向第一个节点
while (curr != NULL)
{
if (strcmp(stu_name,curr->name) == 0)
{
printf("\t%4s%12s%12s","序号","学号","姓名");
for (int m=0; m<_COURSES; m++)
{
printf("%7s","科目");
}
printf("\n");
printf("\t-------------------------------------------------------------\n");
show_stu(curr,flag);
return DONE;
}
curr = curr->next;
++flag;
}
printf("\t====没有找到 %s !请仔细核对姓名再查找\n",stu_name);
return NOFOUND;
}
//
/功能:修改指定学生的所有信息 /
/ /
/返回: /
//
int modify_stu()
{
char stu_name[11];
int flag=1;
curr = head->next;//指向第一个节点
printf("请输入要修改的学生的姓名:");
scanf("%s",stu_name);
while (curr != NULL)
{
if (strcmp(stu_name,curr->name) == 0)
{
printf("\t%4s%12s%12s","序号","学号","姓名");
for (int m=0; m<_COURSES; m++)
{
printf("%7s","科目");
}
printf("\n");
printf("\t-------------------------------------------------------------\n");
show_stu(curr,flag);
entering(curr);
printf("\t====成功修改了 %s 的所有信息!\n",stu_name);
return DONE;
}
curr = curr->next;
++flag;
}
printf("\t====没有找到 %s !请仔细核对姓名\n",stu_name);
return NOFOUND;
}
//
/功能:删除指定学生 /
/ /
/返回: /
//
int remove_stu()
{
student pre=head;
char stu_name[11];
curr = head->next;//指向第一个节点
printf("请输入要删除的学生的姓名:");
scanf("%s",stu_name);
while (curr != NULL)
{
if (strcmp(stu_name,curr->name) == 0)
{
pre->next = curr->next; //
free(curr); //
--total; //
printf("\t====已成功删除\"%s\"\n",stu_name);
return DONE;
}
pre = pre->next;
curr = curr->next;
}
printf("\t====没有找到 %s !请仔细核对姓名\n",stu_name);
return NOFOUND;
}
//
/功能:对所有学生排序 /
/ /
/返回: /
//
int sort_list()
{
student temp = (student )malloc(_LEN);
student curr_i = head->next;
student curr_j = NULL;
char choice='0';
printf("\t \t1----按学号排序 \t2----按姓名排序 \n");
printf("\t \t3----按科目排序 \t0----退 出 排 序 \n");
printf("请选择:");
scanf("%c",&choice);
fflush(stdin);
switch (choice)
{
case '1':
{
while(curr_i->next != NULL)
{
curr_j = curr_i->next;
while (curr_j != NULL)
{
if (curr_i->num > curr_j->num)
{
change(curr_i,curr_j,temp);
}
curr_j = curr_j->next;
}
curr_i = curr_i->next;
}
printf("\t====排序成功!\n");
break;
}
case '2':
{
while(curr_i->next != NULL)
{
curr_j = curr_i->next;
while (curr_j != NULL)
{
if (strcmp(curr_i->name , curr_j->name) > 0)
{
change(curr_i,curr_j,temp);
}
curr_j = curr_j->next;
}
curr_i = curr_i->next;
}
printf("\t====排序成功!\n");
break;
}
case '3':
{
while(curr_i->next != NULL)
{
curr_j = curr_i->next;
while (curr_j != NULL)
{
if (curr_i->scores[0] < curr_j->scores[0])
{
change(curr_i,curr_j,temp);
}
curr_j = curr_j->next;
}
curr_i = curr_i->next;
}
printf("\t====排序成功!\n");
break;
}
case '0':
{
free(temp);
return BACK;
}
default:
{printf("\t====输入有误!\n");break;}
}
free(temp);
return DONE;
}
//
/功能:保存数据到文件 /
/ /
/返回: /
//
int save_to_file()
{
curr=head->next;
if (total == 0)
{
printf("\t====目前还没有任何信息,不用保存!\n");
return BACK;
}
FILE fp;
if((fp=fopen("recorddat","wb"))==NULL)
{
printf("\t====文件打开失败!\n");
return OPENFAIL;
}
while (curr != NULL)
{
//将数据成块写入文件
fwrite((char )curr, _LEN, 1, fp);
curr=curr->next;
}
fclose(fp);
printf("\t====信息已成功保存至文件\"recorddat\"文件中\n");
return DONE;
}
//
/功能:从文件中读取数据 /
/ /
/返回: /
//
int read_from_file()
{
char judge='y';
FILE fp;
if((fp=fopen("recorddat","r"))==NULL)
{
printf("文件不存在或者打开失败!\n");
return OPENFAIL;
}
printf("\t====读取文件会覆盖当前信息!是否确定载入文件(y/n):");
scanf("%c",&judge);
if (judge=='n' || judge=='N')
{
return BACK;
}
quit();//释放以前所有信息的空间
init();//重新初始化链表
curr = head;//当前节点指针指向头结点
student add=(student )malloc(_LEN);//申请空间存放读取的信息
while (fread((char )add, _LEN, 1, fp))
{//由于存储的信息是最新的信息在前,所以读取的时候将其添加在链表尾
add->next=curr->next;
curr->next=add;
curr=add;
add=(student )malloc(_LEN);
++total;
}
fclose(fp);
printf("\t====文件载入成功!当前已有%d个学生。\n",total);
return DONE;
}
//
/功能: /
/ /
/返回: /
//
void about()
{
printf("\t#############################################################\n");
printf("\n\t \t欢迎各位用户反馈Bug或提出宝贵的意见和建议 \n");
printf("\t \t \n");
printf("\t \t手 机:13667102098 \n");
printf("\t \tE-mail:Never_S@126com \n");
printf("\n\t \t\tC语言学生成绩管理系统10版\n\n");
printf("\t#############################################################\n");
}
//
/功能:释放内存 /
/ /
/返回: /
//
int quit()
{
curr =head->next;
student temp=curr;
while(curr != NULL)
{
temp=curr->next;
free(curr);
curr=temp;
}
curr=NULL;
temp=NULL;
free(head);//释放头节点
return DONE;
}
//////////////////////////////////////////////////////////////////////////
//
/功能:录入一个学生的全部信息 /
/ /
/返回: /
//
int entering(student input)
{
printf("\n请输入学生的学号(输入0退出添加):");
scanf("%d",&input->num);
if (0 == input->num)
{
return BACK;
}
printf("请输入学生的姓名(五个汉字以内):");
scanf("%s",&input->name);
printf("请输入%d门科目的成绩(用空格隔开):", _COURSES);
for (int i=0; i<_COURSES; i++)
{
scanf("%f",&input->scores[i]);
}
return DONE;
}
//
/功能:显示指定学生的所有信息 /
/ /
/返回: /
//
void show_stu(student show, int serial)
{
printf("\t%4d%12d%12s",serial,show->num,show->name);
for (int i=0; i<_COURSES; i++)
{
printf("%71f",show->scores[i]);
}
printf("\n");
}
//
/功能:根据权限进入不同的界面 /
/ /
/返回: /
//
void start()
{
printf("\n");
printf("\t\t\t欢迎使用学生成绩管理系统\n");
printf("\t\n");
printf("\t|\t1----添 加 学 生\t2----显 示 信 息 |\n");
printf("\t|\t3----查 找 学 生\t4----修 改 信 息 |\n");
printf("\t|\t5----删 除 学 生\t6----学 生 排 序 |\n");
printf("\t|\t7----信 息 存 档\t8----读 取 存 档 |\n");
printf("\t|\t9----关 于\t0----退 出 |\n");
printf("\t\n");
}
//
/功能: /
/ /
/返回: /
//
void change(student former, student latter,student temp)
{
temp = former;
strcpy(former->name , latter->name);
strcpy(latter->name , temp->name);
former->num = latter->num;
latter->num = temp->num;
for (int i=0; i<_COURSES; i++)
{
former->scores[i] = latter->scores[i];
latter->scores[i] = temp->scores[i];
}
}# include "iostream"
# include "Stringh"
using namespace std;
struct List
{
char name[20];
int NO;
};
template <class List>
struct Node
{
List data;
Node<List> next;
};
template <class List>
class Student
{
Node<List> head;
public:
Student(int m);
void Setdata(int n);
void PrintStudent();
int Get(char b[]);
void Delete(int i);
void Insert(int i,List item);
void Change(char a[],int num);
~Student();
};
template <class List>
Student<List>::Student(int m)
{
Node<List> r,s;
head = new Node<List>;
r = head;
for (int i = 0;i < m;i++)
{
s = new Node<List>;
r->next = s;
r = s;
}
r->next = NULL;
}
template <class List>
void Student<List>::Setdata(int n)
{
Node<List> p;
p = head->next;
for(int i = 0;i < n;i++)
{
cout<<"请输入姓名:";
cin>>p->dataname;
cout<<"请输入身份z号码:";
cin>>p->dataNO;
p = p->next;
}
}
template <class List>
void Student<List>::PrintStudent()
{
Node<List> p;
p = head->next;
while (p)
{
cout<<p->dataname<<","<<p->dataNO<<endl;
p = p->next;
}
}
template <class List>
int Student<List>::Get(char b[])
{
Node<List> p;
p = head->next;
while(p && strcmp(p->dataname,b) != 0)
{
p = p->next;
}
return p->dataNO;
}
template <class List>
void Student<List>::Delete(int i)
{
Node<List> p,q;
p = head;
int j = 0;
while(p && j < i-1)
{
p = p->next;
j++;
}
if(!p || !p->next) {cerr<<"删除位置非法";exit(1);}
else
{
List x;
q = p->next;
x = q->data;
p->next = q->next;
delete q;
cout<<xname<<","<<xNO<<endl;
}
}
template <class List>
void Student<List>::Insert(int i,List item)
{
Node<List> p,s;
p = head;
int j = 0;
while (p && j < i-1)
{
p = p->next;
j++;
}
if(!p) {cerr<<"插入位置非法";exit(1);}
else
{
s = new Node<List>;
strcpy(s->dataname,itemname);
s->dataNO = itemNO;
s->next = p->next;
p->next = s;
}
}
template <class List>
void Student<List>::Change(char a[],int num)
{
Node<List> p;
p = head->next;
while (p && strcmp(p->dataname,a) != 0)
{
p = p->next;
}
p->dataNO = num;
}
template <class List>
Student<List>::~Student()
{
Node<List> p,q;
p = head;
while (p)
{
q = p;
p = p->next;
delete q;
}
head = NULL;
}
void main()
{
cout<<"请建立学籍系统"<<endl;
int m;
cout<<"请输入总人数:";
cin>>m;
Student<List> stu(m);
int n = m;
stuSetdata(n);
stuPrintStudent();
int choice;
do
{
cout<<""<<endl;
cout<<"1查询"<<endl;
cout<<"2删除"<<endl;
cout<<"3插入"<<endl;
cout<<"4修改"<<endl;
cout<<"0退出"<<endl;
cout<<""<<endl;
cout<<"请输入您的选择:";
cin>>choice;
switch(choice)
{
case 1:
{
char b[20];
cout<<"请输入需查询的姓名:";
cin>>b;
cout<<"查询人的学号为:";
cout<<stuGet(b)<<endl;
}break;
case 2:
{
int i;
cout<<"请输入需删除数据的位置:";
cin>>i;
cout<<"删除的数据为:";
stuDelete(i);
}break;
case 3:
{
List item;
cout<<"请输入需插入学生的姓名:";
cin>>itemname;
cout<<"请输入需插入学生的学号:";
cin>>itemNO;
int i;
cout<<"请输入需插入的位置:";
cin>>i;
stuInsert(i,item);
stuPrintStudent();
}break;
case 4:
{
char a[20];
cout<<"请输入需修改人的姓名:";
cin>>a;
int num;
cout<<"请输入修改的新学号:";
cin>>num;
stuChange(a,num);
stuPrintStudent();
}break;
case 0:
{
exit(1);
}break;
default:
{
cout<<"选择项非法,请重新选择";
cout<<endl;
cout<<endl;
}
}
} while(choice);
}#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
/定义学生结构体/
struct Student
{
char ID[20];
char Name[20];
float Mark1;
float Mark2;
float Mark3;
float Average;
};
/声明学生数组及学生数量/
struct Student students[1000];
int num=0;
/求平均值/
float Avg(struct Student stu)
{
return (stuMark1+stuMark2+stuMark3)/3;
}
/通过学号返回数组下标/
int Student_SearchByIndex(char id[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i]ID,id)==0)
{
return i;
}
}
return -1;
}
/通过姓名返回数组下标/
int Student_SearchByName(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i]Name,name)==0)
{
return i;
}
}
return -1;
}
/显示单条学生记录/
void Student_DisplaySingle(int index)
{
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%82f%82f%82f%102f\n",students[index]ID,students[index]Name,
students[index]Mark1,students[index]Mark2,students[index]Mark3,students[index]Average);
}
/插入学生信息/
void Student_Insert()
{
while(1)
{
printf("请输入学号:");
scanf("%s",&students[num]ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[num]Name);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num]Mark1);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num]Mark2);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num]Mark3);
getchar();
students[num]Average=Avg(students[num]);
num++;
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/修改学生信息/
void Student_Modify()
{
//float mark1,mark2,mark3;
while(1)
{
char id[20];
int index;
printf("请输入要修改的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要修改的学生信息为:\n");
Student_DisplaySingle(index);
printf("-- 请输入新值--\n");
printf("请输入学号:");
scanf("%s",&students[index]ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[index]Name);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index]Mark1);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index]Mark2);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index]Mark3);
getchar();
students[index]Average=Avg(students[index]);
}
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/删除学生信息/
void Student_Delete()
{
int i;
while(1)
{
char id[20];
int index;
printf("请输入要删除的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要删除的学生信息为:\n");
Student_DisplaySingle(index);
printf("是否真的要删除(y/n)");
if (getchar()=='y')
{
for (i=index;i<num-1;i++)
{
students[i]=students[i+1];//把后边的对象都向前移动
}
num--;
}
getchar();
}
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/按姓名查询/
void Student_Select()
{
while(1)
{
char name[20];
int index;
printf("请输入要查询的学生的姓名:");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要查询的学生信息为:\n");
Student_DisplaySingle(index);
}
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/按平均值排序/
void Student_SortByAverage()
{
int i,j;
struct Student tmp;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (students[j-1]Average<students[j]Average)
{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
/显示学生信息/
void Student_Display()
{
int i;
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");
printf("-------------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%10s%10s%82f%82f%82f%102f\n",students[i]ID,students[i]Name,
students[i]Mark1,students[i]Mark2,students[i]Mark3,students[i]Average);
}
}
/将学生信息从文件读出/
void IO_ReadInfo()
{
FILE fp;
int i;
if ((fp=fopen("Databasetxt","rb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=0;i<num;i++)
{
fread(&students[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
/将学生信息写入文件/
void IO_WriteInfo()
{
FILE fp;
int i;
if ((fp=fopen("Databasetxt","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入文件错误!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)
{
printf("写入文件错误!\n");
}
}
fclose(fp);
}
/主程序/
void main()
{
int choice;
IO_ReadInfo();
while(1)
{
/主菜单/
printf("\n------ 学生成绩管理系统------\n");
printf("1 增加学生记录\n");
printf("2 修改学生记录\n");
printf("3 删除学生记录\n");
printf("4 按姓名查询学生记录\n");
printf("5 按平均成绩排序\n");
printf("6 退出\n");
printf("请选择(1-6):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_Insert();
break;
case 2:
Student_Modify();
break;
case 3:
Student_Delete();
break;
case 4:
Student_Select();
break;
case 5:
Student_SortByAverage();
Student_Display();
break;
case 6:
exit(0);
break;
}
IO_WriteInfo();
}
}使用结构体+单链表
或者使用 结构体+数组的形式。
定一个一个表示学生的结构体,类似:
struct studentstr
{
int stuNo;
char name[20];
int age;
int sex;
};
然后,使用数组或单链表来存储你所输入的信息后,就可以进行相关的 *** 作了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)