跪求C语言程序代码“学生成绩管理”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跪求C语言程序代码“学生成绩管理”相关的知识,希望对你有一定的参考价值。

课题:学生成绩管理
主要功能:
(1)能按学期、按班级完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序
(3)能查询学生成绩,不及格科目及学生名单
(4)能按班级输出学生的成绩单
要求:模块独立性强

别给我个有错的让小弟来找错啊~~
科目有:
1 数学,
2 英语,
3 物理,
4 化学,
5 C语言,

我刚在网上搜了一个,正巧,我们做的是同一个,不过我搜的要求跟你们的有点不一样,我下了个EXE文件,直接就可以运行了,全中文界面,不过修改不了,一改就错,就算你把某个字删了再按原来的打上去,一样错,不知道是什么原因.

你不是软件专业的吧,对这个要求应该不高,老师应该很容易让你们过的,要是不嫌弃,就用我下的去蒙混一下,看看可以过关不,
同是天涯沦落人
我在你百度空间留个邮箱地址给你,就这样了,不用我的也没关系,我也是为了蒙混过关而已
参考技术A /******头文件(.h)***********/
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*标准库函数*/
#include "string.h"/*字符串函数*/
#include "ctype.h" /*字符操作函数*/
#define M 200 /*定义常数表示记录数*/
typedef struct /*定义数据结构*/

char name[20]; /*姓名*/
char units[30]; /*单位*/
char tele[10]; /*电话*/
char product_company[30];/* 生产厂家 */
char designer[30]; /* 设计者 */
char price[10]; /* 价格 */
char kucun[10]; /* 库存量 */
char year[4]; /* 出厂年份 */
char month[2]; /* 出厂月份 */
char day[2]; /* 出厂 */
ADDRESS;
/******以下是函数原型*******/
int enter(ADDRESS t[]); /*输入记录*/
void list(ADDRESS t[],int n); /*显示记录*/
void search(ADDRESS t[],int n); /*按姓名查找显示记录*/
int delete(ADDRESS t[],int n); /*删除记录*/
int add(ADDRESS t[],int n); /*插入记录*/
void save(ADDRESS t[],int n); /*记录保存为文件*/
int load(ADDRESS t[]); /*从文件中读记录*/
void display(ADDRESS t[]); /*按序号查找显示记录*/
void sort(ADDRESS t[],int n); /*按姓名排序*/
void modify_price(ADDRESS t[],int n); /*快速查找记录*/
void copy(); /*文件复制*/
void print(ADDRESS temp); /*显示单条记录*/
int find(ADDRESS t[],int n,char *s) ; /*查找函数*/
int menu_select(); /*主菜单函数*/
/******主函数开始*******/
main()

int i;
ADDRESS adr[M]; /*定义结构体数组*/
int length=0; /*保存记录长度*/
clrscr(); /*清屏*/
for(;;)/*无限循环*/

clrscr(); /*清屏*/
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

case 0:length=enter(adr);break;/*输入记录*/
case 1:list(adr,length);break; /*显示全部记录*/
case 2:search(adr,length);break; /*查找记录*/
case 3:length=delete(adr,length);break; /*删除记录*/
case 4:length=add(adr,length); break; /*插入记录*/
case 5:save(adr,length);break; /*保存文件*/
case 6:modify_kucun(adr,length); break; /*读文件*/
case 7:display(adr);break; /*按序号显示记录*/
case 8:sort(adr,length);break; /*按姓名排序*/
case 9:modify_kucun(adr,length);break; /*快速查找记录*/
case 10:copy();break; /*复制文件*/
case 11:exit(0); /*如返回值为11则程序结束*/



/*菜单函数,函数返回值为整数,代表所选的菜单项*/
menu_select()

char s[80];
int c;
/*gotoxy(1,25);*//* 将光标定为在第25行,第1列*/
printf("press any key enter menu......\n");/*提示压任意键继续*/
getch(); /*读入任意字符*/
clrscr(); /*清屏*/
/*gotoxy(1,1); */
printf("********************MENU*********************\n\n");
printf(" 0. Enter record\n");
printf(" 1. List the file\n");
printf(" 2. Search record on name\n");
printf(" 3. Delete a record\n");
printf(" 4. add record \n");
printf(" 5. Save the file\n");
printf(" 6. Modify kucun\n");
printf(" 7. Display record on order\n");
printf(" 8. Sort to make new file\n");
printf(" 9. Quick seek record\n");
printf(" 10. Copy the file to new file\n");
printf(" 11. Quit\n");
printf("***********************************************\n");
do
printf("\n Enter you choice(0~11):"); /*提示输入选项*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整型数*/
while(c<0||c>11); /*选择项不在0~11之间重输*/
clrscr(); /*清屏*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/

/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
int enter(ADDRESS t[])

int i,n;
char *s;
clrscr(); /*清屏*/
do
printf("\nHow many numbers do you want to record?\nplease input the numbers you wanted:\n"); /*提示信息*/
scanf("%d",&n); /*输入记录数*/
if(n==0)
printf("the num couldn't be '0'!Please enter again!");
while(n==0);
printf("please input record! \n"); /*提示输入记录*/
printf("name|unit|telephone|product_company|designer|price|kucun|year|month|day\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)

/*scanf("%s %s %s %s %s %s %s %s %s %s",t[i].name,t[i].units,t[i].tele,t[i].product_company,t[i].designer,t[i].price,t[i].kucun,t[i].year,t[i].month,t[i].day); *//*输入记录*/
printf("name:"); /* 打印输出号码 */
scanf("%s",&t[i].name);/* 用数组输入号码 */
printf("unit:"); /* 打印输出名字 */
scanf("%s",&t[i].units); /* 用数组输入姓名 */
printf("telephone:");/* 打印输出性别 */
scanf("%s",&t[i].tele);/* 用数组输入性别 */
printf("product_company:"); /* 打印输出生日 */
scanf("%s",&t[i].product_company); /* 用数组输入生日 */
printf("designer:");/* 打印输出婚姻状况 */
scanf("%s",&t[i].designer);/* 用数组输入婚姻状况 */
printf("price:");/* 打印输出工作状况 */
scanf("%s",&t[i].price);/* 用数组输入工作状况 */
printf("kucun:");/* 打印输出工作状况 */
scanf("%s",&t[i].kucun);/* 用数组输入工作状况 */
printf("produce year:");/* 打印输出工作状况 */
scanf("%s",&t[i].year);/* 用数组输入工作状况 */
printf("produce month:");/* 打印输出工作状况 */
scanf("%s",&t[i].month);/* 用数组输入工作状况 */
printf("produce day:");/* 打印输出工作状况 */
scanf("%s",&t[i].day);/* 用数组输入工作状况 */
printf("-----------Ok!this record have been recorded!------------\n");

printf("the all have been recorded!\n");
getch();
clrscr();
return n; /*返回记录条数*/

/*显示记录,参数为记录数组和记录条数*/
void list(ADDRESS t[],int n)

int i;
clrscr();
printf("\n\n*******************ADDRESS******************\n");
printf("name|unit|telephone|product_company|designer|price|kucun|year|month|day\n");
printf("------------------------------------------------------------------------\n");
if(n!=0)
for(i=0;i<n;i++)

printf("%s/%s/%s/%s/%s/%s/%s/%s/%s/%s",t[i].name,t[i].units,t[i].tele,t[i].product_company,t[i].designer,t[i].price,t[i].kucun,t[i].year,t[i].month,t[i].day);
if((i+1)%10==0) /*判断输出是否达到10条记录*/

printf("Press any key continue...\n"); /*提示信息*/
getch(); /*压任意键继续*/


else printf("there is no record!\n");
printf("************************end*******************\n");

/*查找记录*/
void search(ADDRESS t[],int n)

char s[20]; /*保存待查找姓名字符串*/
int i; /*保存查找到结点的序号*/
/*clrscr(); */
printf("please input the search name:\n");
scanf("%s",s); /*输入待查找姓名*/
i=find(t,n,s); /*调用find函数,得到一个整数*/
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("not found!\n");
else
print(t[i]); /*找到,调用显示函数显示记录*/
clrscr();

/*显示指定的一条记录*/
void print(ADDRESS temp)

/* clrscr(); */
printf("\n\n********************************************\n");
printf("name|unit|telephone|product_company|designer|price|kucun|year|month|day\n");
/*printf("------------------------------------------------\n"); */
printf("%s/%s/%s/%s/%s/%s/%s/%s/%s/%s",temp.name,temp.units,temp.tele,temp.product_company,temp.designer,temp.price,temp.kucun,temp.year,temp.month,temp.day);
printf("**********************end***********************\n");

/*查找函数,参数为记录数组和记录条数以及姓名s */
int find(ADDRESS t[],int n,char *s)

int i;
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/

if(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/
return i; /*相等,则返回该记录的下标号,程序提前结结束*/

return i; /*返回i值*/

/*删除函数,参数为记录数组和记录条数*/
int delete(ADDRESS t[],int n)

char s[20]; /*要删除记录的姓名*/
int ch=0;
int i,j;
printf("please deleted name\n"); /*提示信息*/
scanf("%s",s);/*输入姓名*/
i=find(t,n,s); /*调用find函数*/
if(i>n-1) /*如果i>n-1超过了数组的长度*/
printf("no found not deleted\n"); /*显示没找到要删除的记录*/
else

print(t[i]); /*调用输出函数显示该条记录信息*/
printf("Are you sure delete it(1/0)\n"); /*确认是否要删除*/
scanf("%d",&ch); /*输入一个整数0或1*/
if(ch==1) /*如果确认删除整数为1*/

for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/

strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/
strcpy(t[j-1].units,t[j].units); /*将后一条记录的单位拷贝到前一条*/
strcpy(t[j-1].tele,t[j].tele); /*将后一条记录的电话拷贝到前一条*/
strcpy(t[j-1].product_company,t[j].product_company);
strcpy(t[j-1].designer,t[j].designer);
strcpy(t[j-1].price,t[j].price);
strcpy(t[j-1].kucun,t[j].kucun);
strcpy(t[j-1].year,t[j].year);
strcpy(t[j-1].month,t[j].month);
strcpy(t[j-1].day,t[j].day);

n--; /*记录数减1*/


return n; /*返回记录数*/

/*插入记录函数,参数为结构体数组和记录数*/
int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/


ADDRESS temp; /*新插入记录信息*/
int i,j;
char s[20],p; /*确定插入在哪个记录之前*/
printf("please input the new record:\n");
printf("************************************************\n");
printf("name|unit|telephone|product_company|designer|price|kucun|year|month|day\n");
/*printf("--------------------------------------------------\n");
scanf("%s%s%s",temp.name,temp.units,temp.tele); *//* 输入插入信息*/
printf("name:"); /* 打印输出号码 */
scanf("%s",&temp.name);/* 用数组输入号码 */
printf("unit:"); /* 打印输出名字 */
scanf("%s",&temp.units); /* 用数组输入姓名 */
printf("telephone:");/* 打印输出性别 */
scanf("%s",&temp.tele);/* 用数组输入性别 */
printf("product_company:"); /* 打印输出生日 */
scanf("%s",&temp.product_company); /* 用数组输入生日 */
printf("designer:");/* 打印输出婚姻状况 */
scanf("%s",&temp.designer);/* 用数组输入婚姻状况 */
printf("price:");/* 打印输出工作状况 */
scanf("%s",&temp.price);/* 用数组输入工作状况 */
printf("kucun:");/* 打印输出工作状况 */
scanf("%s",&temp.kucun);/* 用数组输入工作状况 */
printf("produce year:");/* 打印输出工作状况 */
scanf("%s",&temp.year);/* 用数组输入工作状况 */
printf("produce month:");/* 打印输出工作状况 */
scanf("%s",&temp.month);/* 用数组输入工作状况 */
printf("produce day:");/* 打印输出工作状况 */
scanf("%s",&temp.day);/* 用数组输入工作状况 */
printf("-----------Ok!this record have been recorded!------------\n");
printf("------------------------------------------------\n");
K:printf("please input the wanted name's position to insert:\n");
scanf("%s",s); /*输入插入位置的姓名*/
i=find(t,n,s); /*调用find,确定插入位置*/
if(i>n-1) /*如果i>n-1超过了数组的长度*/

printf("the name isn't exist!\n"); /*显示没找到要删除的记录*/
printf("Are you want to continue to insert?Yes--y/No--any other key!\n");
if(getch()=='y') goto K;

else

for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/

strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/
strcpy(t[j+1].units,t[j].units); /*当前记录的单位拷贝到后一条*/
strcpy(t[j+1].tele,t[j].tele); /*当前记录的电话拷贝到后一条*/
strcpy(t[j+1].product_company,t[j].product_company);
strcpy(t[j+1].designer,t[j].designer);
strcpy(t[j+1].price,t[j].price);
strcpy(t[j+1].kucun,t[j].kucun);
strcpy(t[j+1].year,t[j].year);
strcpy(t[j+1].month,t[j].month);
strcpy(t[j+1].day,t[j].day);

strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/
strcpy(t[i].units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/
strcpy(t[i].tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/
strcpy(t[i].product_company,temp.product_company);
strcpy(t[i].designer,temp.designer);
strcpy(t[i].price,temp.price);
strcpy(t[i].kucun,temp.kucun);
strcpy(t[i].year,temp.year);
strcpy(t[i].month,temp.month);
strcpy(t[i].day,temp.day);
n++; /*记录数加1*/
return n; /*返回记录数*/


/*保存函数,参数为结构体数组和记录数*/
void save(ADDRESS t[],int n)

int i;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/

printf("can not open file\n");/*没打开*/
exit(1); /*退出*/

printf("\nSaving file now!\n"); /*输出提示信息*/
fprintf(fp,"there is %d records!",n); /*将记录数写入文件*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
for(i=0;i<n;i++)

fprintf(fp,"%s/%s/%s/%s/%s/%s/%s/%s/%s/%s",t[i].name,t[i].units,t[i].tele,t[i].product_company,t[i].designer,t[i].price,t[i].kucun,t[i].year,t[i].month,t[i].day);/*格式写入记录*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/

fclose(fp);/*关闭文件*/
printf("****save success***\n"); /*显示保存成功*/

/*读入函数,参数为结构体数组*/
/* int load(ADDRESS t[]) */
/* */
/* int i,n; */
/* FILE *fp; *//*指向文件的指针*/
/* if((fp=fopen("record.txt","rb"))==NULL)*//* 打开文件*/
/* */
/* printf("can not open file\n"); *//*不能打开*/
/* exit(1); *//*退出*/
/* */
/* fscanf(fp,"%d",&n);*/ /*读入记录数*/
/* for(i=0;i<n;i++) */
/* fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele); */ /*按格式读入记录*/
/* fclose(fp);*/ /*关闭文件*/
/* printf("You have success read data from file!!!\n"); *//* 显示保存成功*/
/* return n;*/ /*返回记录数*/
/* */
/*按序号显示记录函数*/
int modify_kucun(ADDRESS t[],int n)

char s[20],ch[10]; /*保存待查找姓名字符串*/
int i,j; /*保存查找到结点的序号*/
/*clrscr(); */
printf("please input the cloth name which you wanted to modify its kucun:\n");
scanf("%s",s); /*输入待查找姓名*/
i=find(t,n,s); /*调用find函数,得到一个整数*/
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("sorry!the name don't exist!\n");
else

print(t[i]); /*找到,调用显示函数显示记录*/
/*printf("Are you sure to modify its kucun?Yes--y/"); */
printf("please input the new kucun you want:\n");
scanf("%c",ch);
for(j=0;j<10;j++)
t[i].kucun[j]=ch[j];
printf("Ok!the kucun has been modified!");

clrscr();

void display(ADDRESS t[])

int id,n;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/

printf("can not open file\n"); /*不能打开文件*/
exit(1); /*退出*/

printf("Enter order number:\n"); /*显示信息*/
scanf("%d",&id); /*输入序号*/
fscanf(fp,"%d",&n); /*从文件读入记录数*/
if(id>=0&&id<n) /*判断序号是否在记录范围内*/

fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/
print(t[id]); /*调用输出函数显示该记录*/
printf("\r\n");

else
printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/
fclose(fp); /*关闭文件*/

/*排序函数,参数为结构体数组和记录数*/
void sort(ADDRESS t[],int n)

int i,j,flag;
char y;
ADDRESS temp; /*临时变量做交换数据用*/
R: printf("Please select which kind to sort!0--sort by kucun/1--sort by Chu_Chang_Ri_Qi\n "); /*选择何种方式排序*/
if(getch()=='0')

for(i=0;i<n;i++)

flag=0; /*设标志判断是否发生过交换*/
for(j=0;j<n-1;j++)
if((strcmp(t[j].kucun,t[j+1].kucun))>0) /*比较大小*/

flag=1;
strcpy(temp.name,t[j].name); /*交换记录*/
strcpy(temp.units,t[j].units);
strcpy(temp.tele,t[j].tele);
strcpy(temp.product_company,t[j].product_company);
strcpy(temp.designer,t[j].designer);
strcpy(temp.price,t[j].price);
strcpy(temp.kucun,t[j].kucun);
strcpy(temp.year,t[j].year);
strcpy(temp.month,t[j].month);
strcpy(temp.day,t[j].day);
strcpy(t[j].name,t[j+1].name);
strcpy(t[j].units,t[j+1].units);
strcpy(t[j].tele,t[j+1].tele);
strcpy(t[j].product_company,t[j+1].product_company);
strcpy(t[j].designer,t[j+1].designer);
strcpy(t[j].price,t[j+1].price);
strcpy(t[j].kucun,t[j+1].kucun);
strcpy(t[j].year,t[j+1].year);
strcpy(t[j].month,t[j+1].month);
strcpy(t[j].day,t[j+1].day);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].units,temp.units);
strcpy(t[j+1].tele,temp.tele);
strcpy(t[j+1].product_company,temp.product_company);
strcpy(t[j+1].designer,temp.designer);
strcpy(t[j+1].price,temp.price);
strcpy(t[j+1].kucun,temp.kucun);
strcpy(t[j+1].year,temp.year);
strcpy(t[j+1].month,temp.month);
strcpy(t[j+1].day,temp.day);

if(flag==0) break; /*如果标志为0,说明没有发生过交换循环结束*/

printf("sort sucess!!!\n"); /*显示排序成功*/

else
if(getch()=='1')

for(i=0;i<n;i++)

flag=0; /*设标志判断是否发生过交换*/
for(j=0;j<n-1;j++)
/* if((()&&((strcmp(t[j].month,t[j+1].month))>0)))
&&((strcmp(t[j].day,t[j+1].day))>0))||
(((strcmp(t[j].year,t[j+1].year))=0)&&((strcmp(t[j].month,t[j+1].month))>0))||
(((strcmp(t[j].year,t[j+1].year))=0)&&((strcmp(t[j].month,t[j+1].month))=0)&&((strcmp(t[j].day,t[j+1].day))>0))) *//*比较大小*/
if(( ((strcmp(t[j].year,t[j+1].year))>0)&&((strcmp(t[j].month,t[j+1].month))>0)&&((strcmp(t[j].day,t[j+1].day))>0) )||
( ((strcmp(t[j].year,t[j+1].year))==0)&&((strcmp(t[j].month,t[j+1].month))>0) )||
( ((strcmp(t[j].year,t[j+1].year))==0)&&((strcmp(t[j].month,t[j+1].month))==0)&&((strcmp(t[j].day,t[j+1].day))>0) ))

flag=1;
strcpy(temp.name,t[j].name); /*交换记录*/
参考技术B #include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shoudsave=0; /* */
struct student

char num[10];/* 学号 */
char name[20];
char sex[4];
int cgrade;
int mgrade;
int egrade;
int totle;
int ave;
char neartime[10];/* 最近更新时间 */
;

typedef struct node

struct student data;
struct node *next;
Node,*Link;

void menu()

printf("********************************************************************************");
printf("\t1登记学生资料\t\t\t\t\t2删除学生资料\n");
printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");
printf("\t5保存学生资料\t\t\t\t\t0退出系统\n");
printf("********************************************************************************\n");


void printstart()

printf("-----------------------------------------------------------------------\n");

void Wrong()

printf("\n=====>提示:输入错误!\n");


void Nofind()

printf("\n=====>提示:没有找到该学生!\n");


void printc() /* 本函数用于输出中文 */

printf(" 学号\t 姓名 性别 英语成绩 数学成绩 C语言成绩 总分 平均分\n");


void printe(Node *p)/* 本函数用于输出英文 */

printf("%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);


Node* Locate(Link l,char findmess[],char nameornum[]) /* 该函数用于定位连表中符合要求的接点,并返回该指针 */

Node *r;
if(strcmp(nameornum,"num")==0) /* 按学号查询 */

r=l->next;
while(r!=NULL)

if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;


else if(strcmp(nameornum,"name")==0) /* 按姓名查询 */

r=l->next;
while(r!=NULL)

if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;


return 0;


void Add(Link l) /* 增加学生 */

Node *p,*r,*s;
char num[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; /* 将指针置于最末尾 */
while(1)

printf("请你输入学号(以'0'返回上一级菜单:)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
while(s)

if(strcmp(s->data.num,num)==0)

printf("=====>提示:学号为'%s'的学生已经存在,若要修改请你选择'4 修改'!\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;

s=s->next;


p=(Node *)malloc(sizeof(Node));

strcpy(p->data.num,num);
printf("请你输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请你输入性别:");
scanf("%s",p->data.sex);
getchar();
printf("请你输入c语言成绩:");
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入数学成绩:");
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入英语成绩:");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle / 3;
/* 信息输入已经完成 */
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;




void Qur(Link l) /* 查询学生 */

int sel;
char findmess[20];
Node *p;

if(!l->next)

printf("\n=====>提示:没有资料可以查询!\n");
return;


printf("\n=====>1按学号查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/* 学号 */

printf("请你输入要查找的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)

printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();

else
Nofind();

else if(sel==2) /* 姓名 */

printf("请你输入要查找的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)

printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();

else
Nofind();

else
Wrong();



void Del(Link l) /* 删除 */

int sel;
Node *p,*r;
char findmess[20];
if(!l->next)

printf("\n=====>提示:没有资料可以删除!\n");
return;

printf("\n=====>1按学号删除\n=====>2按姓名删除\n");
scanf("%d",&sel);
if(sel==1)

printf("请你输入要删除的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)

r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该学生已经成功删除!\n");
shoudsave=1;

else
Nofind();

else if(sel==2)

printf("请你输入要删除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)

r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该学生已经成功删除!\n");
shoudsave=1;

else
Nofind();

else
Wrong();


void Modify(Link l)

Node *p;
char findmess[20];
if(!l->next)

printf("\n=====>提示:没有资料可以修改!\n");
return;

printf("请你输入要修改的学生学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)

printf("请你输入新学号(原来是%s):",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请你输入新性别(原来是%s):",p->data.sex);
scanf("%s",p->data.sex);
printf("请你输入新的c语言成绩(原来是%d分):",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入新的数学成绩(原来是%d分):",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入新的英语成绩(原来是%d分):",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n=====>提示:资料修改成功!\n");
shoudsave=1;

else
Nofind();



void Disp(Link l)

int count=0;
Node *p;
p=l->next;

if(!p)

printf("\n=====>提示:没有资料可以显示!\n");
return;

printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
while(p)

printe(p);
p=p->next;

printstart();
printf("\n");


void Tongji(Link l)

Node *pm,*pe,*pc,*pt,*pa; /* 用于指向分数最高的接点 */
Node *r=l->next;
if(!r)

printf("\n=====>提示:没有资料可以统计!\n");
return ;

pm=pe=pc=pt=pa=r;
while(r!=NULL)

if(r->data.cgrade>=pc->data.cgrade)
pc=r;
if(r->data.mgrade>=pm->data.mgrade)
pm=r;
if(r->data.egrade>=pe->data.egrade)
pe=r;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.ave>=pa->data.ave)
pa=r;

r=r->next;

printf("------------------------------统计结果--------------------------------\n");
printf("总分最高者:\t%s %d分\n",pt->data.name,pt->data.totle);
printf("平均分最高者:\t%s %d分\n",pa->data.name,pa->data.ave);

printf("英语最高者:\t%s %d分\n",pe->data.name,pe->data.egrade);
printf("数学最高者:\t%s %d分\n",pm->data.name,pm->data.mgrade);
printf("c语言最高者:\t%s %d分\n",pc->data.name,pc->data.cgrade);
printstart();


void Sort(Link l)

Link ll;
Node *p,*rr,*s;

ll=(Link)malloc(sizeof(Node)); /* 用于做新的连表 */
ll->next=NULL;

if(l->next==NULL)

printf("\n=====>提示:没有资料可以排序!\n");
return ;

p=l->next;
while(p)

s=(Node*)malloc(sizeof(Node)); /* 新建接点用于保存信息 */
s->data=p->data;
s->next=NULL;

rr=ll;
while(rr->next!=NULL && rr->next->data.totle>=p->data.totle)
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else

s->next=rr->next;
rr->next=s;

p=p->next;

free(l);
l->next=ll->next;
printf("\n=====>提示:排序已经完成!\n");


void Save(Link l)

FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("c:\\student","wb");
if(fp==NULL)

printf("\n=====>提示:重新打开文件时发生错误!\n");
exit(1);

p=l->next;

while(p)

if(fwrite(p,sizeof(Node),1,fp)==1)

p=p->next;
count++;

else

flag=0;
break;


if(flag)

printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;

fclose(fp);


void main()

Link l;/* 连表 */
FILE *fp; /* 文件指针 */
int sel;
char ch;
char jian;

int count=0;
Node *p,*r;
printf("\t\t\t\t学生成绩管理系统\n\t\t\t\t-------福建农业职业学院计应0501 黄欢(32号)\n");
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
r=l;

fp=fopen("C:\\student","rb");
if(fp==NULL)

printf("\n=====>提示:文件还不存在,是否创建?(y/n)\n");
scanf("%c",&jian);
if(jian=='y'||jian=='Y')
fp=fopen("C:\\student","wb");
else
exit(0);

printf("\n=====>提示:文件已经打开,正在导入记录......\n");

while(!feof(fp))

p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp)) /* 将文件的内容放入接点中 */

p->next=NULL;
r->next=p;
r=p; /* 将该接点挂入连中 */
count++;



fclose(fp); /* 关闭文件 */
printf("\n=====>提示:记录导入完毕,共导入%d条记录.\n",count);

while(1)

menu();
printf("请你选择操作:");
scanf("%d",&sel);

if(sel==0)

if(shoudsave==1)
getchar();
printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(l);

printf("\n=====>提示:你已经退出系统,再见!\n");
break;

switch(sel)

case 1:Add(l);break; /* 增加学生 */
case 2:Del(l);break;/* 删除学生 */
case 3:Qur(l);break;/* 查询学生 */
case 4:Modify(l);break;/* 修改学生 */
case 5:Save(l);break;/* 保存学生 */
case 9:printf("\t\t\t==========帮助信息==========\n");break;
default: Wrong();getchar();break;



/* */
参考技术C 你太幸运了,我刚做完这个设计的报告,一模一样的.
只是我的学科是语文数学英语,你自己改一下吧,如果你也是要做课程设计报告可以来找我,我的那份做好了得了90分呢!记得把分给我哦!

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>

#define InputRcd 1
#define UpdateRcd 2
#define SelectRcd 3
#define Exit 4

#define NAMELEN 16
#define CLASSLEN 6

struct record
char classID[CLASSLEN];
int term;
char name[NAMELEN];
int chinese,math,english;
;

void showProgInform()

printf("-------------------------------------------------\n");
printf("| *** STUDENTS' SCORE PLATFORM *** |\n");;
printf("-------------------------------------------------\n\n");


void showMenu()
system("cls");
showProgInform();

printf("Please select an operation fo the following MENU: \n");
printf(" 1. Input a record \n");
printf(" 2. Update a record\n");
printf(" 3. Select record(s)\n");
printf(" 4. Exit. \n");


void inputRecord()
struct record inscr;
FILE * fp;

system("cls");
showProgInform();

printf("Mention: You are to add new record\n\n");
printf("Please input by the following instructions: \n");
printf("Class ID: ");
scanf("%s",inscr.classID);
printf("Term Number: ");
scanf("%d",&(inscr.term));
printf("Student Name: ");
scanf("%s",inscr.name);
printf("Chinese score: ");
scanf("%d",&(inscr.chinese));
printf("Math score: ");
scanf("%d",&(inscr.math));
printf("English Score: ");
scanf("%d",&(inscr.english));
getchar();

if((fp=(fopen("stu_score.rcd","ab+")))==NULL)
printf("Input record failed!\n");
return;


fwrite(&inscr,sizeof(struct record),1,fp);
fclose(fp);

if((fp=fopen("stu_score.txt","ab+"))==NULL)
return;


fprintf(fp,"%s-%d %s: %d %d %d\r\n",inscr.classID,inscr.term,inscr.name,inscr.chinese,inscr.math,inscr.english);;
fclose(fp);


void showSingleRecord(struct record rc)
printf("%s-%d %s: (CHI)%d (MAT)%d (ENG)%d\n",rc.classID,rc.term,rc.name,rc.chinese,rc.math,rc.english);


void updateRecord()

long fsize,arraySize,i;
struct record *allRecords,newRcd;
int hasFound = 0;

FILE * fp;
FILE * txt;

system("cls");
showProgInform();

if((fp = fopen("stu_score.rcd","rb")) == NULL )
printf("! No records , cannot operate\n");
return;


printf("Mention: You are to update record\n\n");
printf("Please the record you want to update by the follow mention: \n");
printf("Class Id: ");
scanf("%s",newRcd.classID);
printf("Term number: ");
scanf("%d",&newRcd.term);
printf("Student name: ");
scanf("%s",newRcd.name);

fseek(fp,0,SEEK_END);
fsize = ftell(fp);
arraySize = fsize/(sizeof(struct record));
allRecords = (struct record *)calloc(arraySize,sizeof(struct record));

rewind(fp);
fread(allRecords,sizeof(struct record),arraySize,fp);

for(i=0;i<arraySize;i++)
if(strcmp(newRcd.classID,allRecords[i].classID)==0 && newRcd.term==allRecords[i].term && strcmp(newRcd.name,allRecords[i].name)==0)
printf("Find the matching record: ");
showSingleRecord(allRecords[i]);

printf("Input new Score: \n");
printf("New Chinese Score: ");
scanf("%d",&(allRecords[i].chinese));
printf("New Math Score: ");
scanf("%d",&(allRecords[i].math));
printf("New English Score: ");
scanf("%d",&(allRecords[i].english));
printf("After update ,the records is : \n\t");
showSingleRecord(allRecords[i]);
printf("\n");
hasFound = 1;
break;


fclose(fp);

if(!hasFound)
printf("No matching record has found!\n");
free(allRecords);
return;


if((fp = fopen("stu_score.rcd","w"))==NULL)
printf("Write file stu_score.rcd failed\n");
return;


if((txt = fopen("stu_score.txt","w"))==NULL)
printf("Write file stu_score.txt failed\n");
return;


fwrite(allRecords,sizeof(struct record),arraySize,fp);

for(i=0;i<arraySize;i++)
fprintf(txt,"%s-%d %s: %d %d %d\r\n",allRecords[i].classID,allRecords[i].term,allRecords[i].name,allRecords[i].chinese,allRecords[i].math,allRecords[i].english);


free(allRecords);

fclose(fp);
fclose(txt);


void showSelectMenu(char classID[],int term)
system("cls");
showProgInform();

printf("Mention: All the following opertion based on classID: %s,Term: %d\n\n",classID,term);
printf("Mention: You are to select the records\n\n");
printf("\t Please choose an operation: \n");
printf("\t 1. Select all records of the classID.\n");
printf("\t 2. Sort by the average score.\n");
printf("\t 3. Select no passed record.\n");
printf("\tOther. Return the high level menu.\n\n");


void showStatistic(struct record *r ,long size,char classID[],int term)
int total;
float ave;
long i;

system("cls");
showProgInform();
printf("All records for class: %s,term: %d; total record nubmer: %ld\n",classID,term,size);

printf("********************************************************\n");
for(i=0;i<size;i++)
total = r[i].chinese+r[i].english +r[i].math ;
ave = (float)total/3;
printf(" %s: (CHI)%d (MAT)%d (ENG)%d (Total)%d (Ave)%.2f\r\n",r[i].name,r[i].chinese,r[i].math,r[i].english,total,ave);

printf("********************************************************\n\n");
printf("Press Enter to return Select submenu\n");
getchar();


void sortSelectByAve(struct record * r,long size)

FILE *fp;
struct record temp;
float outerAve ,innerAve;
int total;
long i,j;
system("cls");
showProgInform();
printf("\nSorted the records by average score\n");

for(i=0;i<size;i++)
outerAve = (float)(r[i].chinese+r[i].math+r[i].english)/3;
for(j=i+1;j<size;j++)
innerAve = (float)(r[j].chinese+r[j].math+r[j].english)/3;
if(innerAve > outerAve)
strcpy(temp.name,r[j].name);
temp.chinese = r[j].chinese;
temp.math = r[j].math ;
temp.english = r[j].english ;

strcpy(r[j].name,r[i].name);
r[j].chinese = r[i].chinese ;
r[j].math = r[i].math ;
r[j].english = r[i].english ;

strcpy(r[i].name,temp.name);
r[i].chinese = temp.chinese ;
r[i].math = temp.math ;
r[i].english = temp.english ;




printf("\nshow sorted records \n");
printf("********************************************\n");
for(i=0;i<size;i++)
total = r[i].chinese + r[i].math + r[i].english ;
innerAve = (float)total/3;
printf("%s: %d %d %d %d %f\n",r[i].name,r[i].chinese,r[i].math,r[i].english,total,innerAve);

printf("********************************************\n");

printf("write sorted records to \"sorted.txt\"\n");
if((fp = fopen("sorted.txt","w"))== NULL)
printf("open sort.txt failed\n");
return;


for(i=0;i<size;i++)
total = r[i].chinese + r[i].math + r[i].english ;
innerAve = (float)total/3;
fprintf(fp,"(CLASS-TERM)%s-%d (NAME)%s: (CHI)%3d (MAT)%3d (ENG)%3d (TOTAL)%4d (AVERG)%.2f\r\n",r[i].classID,r[i].term,r[i].name,r[i].chinese,r[i].math,r[i].english,total,innerAve);


printf("write file sorted.txt finished\n");
fclose(fp);

printf("\nPress any key to return Select subMenu\n");


void noPass(struct record * r,int size)
long i=0,j=0;

FILE * fp;
if((fp=fopen("no-pass.txt","w"))==NULL)
printf("create no-pass.txt failed");
return;


system("cls");
showProgInform();
printf("Mention: The following operation will be all on the classId and term you input\n\n");

printf("\nShow student that one subject is no-pass\n");
printf("***********************************************\n");
for(i=0;i<size;i++)
if(r[i].chinese <60 || r[i].math<60 || r[i].english <60)
printf("%s-%d %s: ",r[i].classID,r[i].term,r[i].name);
fprintf(fp,"%s-%d %s: ",r[i].classID,r[i].term,r[i].name);
if(r[i].chinese < 60 )
printf("(Chinese)%d ",r[i].chinese);
fprintf(fp,"(Chinese)%d ",r[i].chinese );

if(r[i].math < 60)
printf("(Math)%d ",r[i].math);
fprintf(fp,"(Math)%d ",r[i].math);

if(r[i].english < 60)
printf("(English)%d",r[i].english);
fprintf(fp,"(English)%d",r[i].english);

printf("\r\n");
fprintf(fp,"\r\n");


printf("***********************************************\n");
fclose(fp);
printf("Press Enter to return \"Select\" submenu\n");


void selectRecord()
char classID[CLASSLEN];
int term;
FILE * fp;
long fsize=0,arraySize=0,thisSize=0,i=0,j=0;
struct record *allRcd,*thisClass;

system("cls");
showProgInform();
printf("Mention: The following operation will be all on the classId and term you input\n\n");
printf("Mention: please operate by the following instructions\n\n");

printf("Input ClassID: ");
scanf("%s",classID);
printf("Input term number: ");
scanf("%d",&term);

if((fp=fopen("stu_score.rcd","r"))==NULL)
printf("\nWarining: No record exists!\n");
return;


fseek(fp,0,SEEK_END);
fsize = ftell(fp);
arraySize = fsize/(sizeof(struct record));
allRcd = (struct record *)calloc(arraySize,sizeof(struct record));
rewind(fp);
fread(allRcd,sizeof(struct record),arraySize,fp);

printf("Press Enter to show the sub menu of Select menu\n");

for(i=0;i<arraySize;i++)
if(strcmp(classID,allRcd[i].classID)==0 && term==allRcd[i].term)
thisSize++;



if(thisSize==0)
printf("\nWaring: No record for Class %s Term %d\n",classID,term);
fclose(fp);
free(allRcd);
return;


thisClass = (struct record *)calloc(thisSize,sizeof(struct record));
j=0;
for(i=0;i<arraySize;i++)
if(strcmp(classID,allRcd[i].classID)==0 && term==allRcd[i].term )
strcpy(thisClass[j].classID,classID) ;
thisClass[j].term = term ;
strcpy(thisClass[j].name,allRcd[i].name);
thisClass[j].chinese = allRcd[i].chinese;
thisClass[j].math = allRcd[i].math ;
thisClass[j].english = allRcd[i].english ;
j++;


free(allRcd);
/////////////////////////////////////////////////////////////
getchar();
getchar();
while(1)
system("cls");
showProgInform();
printf("Mention: The following operation will be all on the classId and term you input\n\n");
showSelectMenu(classID,term);

switch(getchar())
case '1':
getchar();
showStatistic(thisClass,thisSize,classID,term);
break;
case '2':
getchar();
sortSelectByAve(thisClass,thisSize);
getchar();
break;
case '3':
getchar();
noPass(thisClass,thisSize);
printf("0: Press 0 to return \"Select\" submenu\n");
if(getchar()=='0')
break;
default:
getchar();
return;



free(thisClass);
fclose(fp);


void go_on()
printf("Press Enter to continue\n");
getchar();


void main()
showProgInform();

while(1)
showMenu();
switch(getchar())
case '1':
getchar();
inputRecord();
go_on();
break;

case '2':
getchar();
updateRecord();
getchar();
go_on();
break;

case '3':
getchar();
selectRecord();
getchar();
go_on();

break;

case '4':
getchar();
//exit(1);
return;

default:
getchar();
printf("Wrong Option! input again\n");
go_on();
break;


参考技术D C写这个?能用么??
老师没事闲的……
第5个回答  2007-07-14 楼上的DEV编译不通过。好像需要TC

C语言编程题目,关于学生成绩管理系统的。向各位求助了

#include<stdio.h>
#include<string.h>
#include <malloc.h>
#include <stdlib.h>
#include<conio.h>
#define LEN sizeof(struct student)
typedef struct student
long numb;
int chinese;
int math;
int english;
int totalscore;
char name[12];
struct student *next;
STU;
//声明部分
STU* creat();
void output(STU *head);
STU* creatByN(int num);
STU* findByNumb(STU *head, long num);
STU* findByNumbEx(STU *head, long num, STU **ppBefore);
STU* findByName(STU *head, char *name);
void find(STU *head);
STU* del(STU *head);
STU* insert(STU *head);
void update(STU *head);
STU* sort(STU *head);
void save_info(STU *head);
STU *load_info();
void Backup_info(STU *head);
int n;//全局变量
void main()

STU *head;
int choice;

for(;;)
system("cls");/*清屏*/
printf("\t欢迎使用成绩管理系统\t\n");
printf("\t1:输入多个学生信息\t\n");
printf("\t2:显示全部学生信息\t\n");
printf("\t3:删除\t\n");
printf("\t4:查找\t\n");
printf("\t5:插入\t\n");
printf("\t6:修改\t\n");
printf("\t7:排序\t\n");
printf("\t8:保存到文件\t\n");
printf("\t9:从文件加载\t\n");
printf("\t10:备份\t\n");
printf("\t0:退出\t\n");
printf("*请输入数字(0-9)进行功能选择 :");
scanf("%d",&choice);
if(choice==0) break;
switch(choice)
case 1: head=creat(); break;
case 2: output(head); break;
case 3: head=del(head); break;
case 4: find(head); break;
case 5: head=insert(head); break;
case 6: update(head); break;
case 7: head=sort(head);break;
case 8: save_info(head); break;
case 9: head=load_info(); break;
case 10:Backup_info(head);break;

printf("按任意键继续....\n");
getch();/*暂停*/

printf("欢迎使用,再见!\n");

STU *creat()/*创建链表*/

STU *head,*pnew,*ptail;
head=NULL;
n=0;//初始化
printf("现在进行学生信息的输入,学号输入为0时结束\n");
while(1)
//不断申请新节点
pnew=(STU *)malloc(LEN);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%ld",&pnew->numb);
if(pnew->numb==0)
break;
scanf("%s",pnew->name);
scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
pnew->totalscore=0; pnew->totalscore=pnew->chinese+pnew->math+pnew->english;
pnew->next=NULL;//将节点连接到链表尾部
n++;
if(n==1)
head=pnew;
ptail=pnew;

else
ptail->next=pnew;
ptail=pnew;
//这个算法的思路是让pnew指向新开辟的结点,ptail指向链表中最后一个结点,把pnew所指的结点连接在ptail所指的结点后面,用"ptail->next=pnew"来实现.

return head;//因为可能对head进行赋值,所以有返回值


void output(STU *head)

STU *p;//定义一个可动指针,使其不断下移完成多个输出
printf("当前共有%d个节点:\n",n);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
for(p=head;p!=NULL;p=p->next)
printf("%ld\t%s\t%d\t%d\t%d\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore);
//无变动不返回
struct student *creatByN(int num)

STU *head,*pnew,*ptail;
int i;
//链表初始化
head=NULL;
n=0;
//链表创建,一个循环
for(i=0;i<num;i++)
//获得一个节点,并赋值,节点由pnew指向
pnew=(STU *)malloc(LEN);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%ld",&pnew->numb);
scanf("%s",pnew->name);
scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
pnew->next=NULL;//将pnew所指向的节点,插入到链表尾部
n++;
if(n==1)
head=pnew;
ptail=pnew;

else
ptail->next=pnew;
ptail=pnew;


return head;

STU* findByNumb(STU *head, long num)

STU *p,*presult;
presult=NULL;
for(p=head;p!=NULL;p=p->next)
if(p->numb==num)
presult=p;//记录此时指针的位置
break;

return presult;

STU* findByName(STU *head, char *name)

STU *p,*presult;
presult=NULL;
for(p=head;p!=NULL;p=p->next)
if(strcmp(p->name,name)==0)
presult=p;
break;

return presult;//位置变更有返回值

STU* findByNumbEx(STU *head, long num, STU **ppBefore)

STU *p,*presult,*pBefore;
presult=pBefore=NULL;
for(p=head;p!=NULL;pBefore=p,p=p->next)//记录指针的前一个位置
if(p->numb==num)
presult=p;
break;

*ppBefore=pBefore;
return presult;

void find(STU *head)

int num,choice;
STU *pr;
char name[12];
printf("输入要查找的方式(1:按学号,2:按姓名):");
scanf("%d",&choice);
if(choice==1)
printf("输入要查找的学号:");
scanf("%ld",&num);
pr=findByNumb(head,num);

else if(choice==2)
printf("输入要查找的姓名:");
scanf("%s",name);
pr=findByName(head,name);

if(pr==NULL)
printf("对不起,查无此人\n");
else
printf("找到了,该生信息如下:\n");
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english,pr->totalscore);


void update(STU *head)

int num;
STU *pr;
printf("输入要查找的学号:");
scanf("%ld",&num);
pr=findByNumb(head,num);
if(pr==NULL)
printf("对不起,查无此人\n");
else
printf("找到了,该生信息如下:\n");
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english);
printf("请输入修改信息\n");
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%ld%s%d%d%d%d",&pr->numb,&pr->name,&pr->chinese,&pr->math,&pr->english);
pr->totalscore=0; pr->totalscore=pr->chinese+pr->math+pr->english;


STU* del(STU *head)

long num;
STU *pCur,*pBefore;
//查找要删除的节点,用pCur记录该节点
printf("输入要删除的学号:");
scanf("%ld",&num);
pCur=findByNumbEx(head,num,&pBefore);
//如果该节点存在,进行删除
if(pCur!=NULL)
n--;//记录删除后节点个数
//根据pCur所指节点位置进行判断:头节点或后续节点
//删除的是头节点
if(pCur==head)
head=pCur->next;

//删除的是后续节点
else
//获取前向节点指针pBefore

//利用pBefore和pCur完成删除
pBefore->next=pCur->next;


return head;

STU* insert(STU *head)

STU *pCur,*pnew,*pBefore,*p;
//申请一个新节点,并赋值
pnew=(STU *)malloc(LEN);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%d",&pnew->numb);
scanf("%s",&pnew->name);
scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
pnew->totalscore=0; pnew->totalscore=pnew->chinese+pnew->math+pnew->english;
pnew->next=NULL;
if(head==NULL)//链表为空
head=pnew;
else//链表不为空
//找位置,即获取pCur
for(p=head;p!=NULL;pBefore=p,p=p->next)
if(p->numb > pnew->numb)
pCur=p;
break;

//没有找到pCur,则应将pnew插入到尾节点之后
if(p==NULL)
pBefore->next=pnew;

//找到pCur,则应将pnew插入到pCur之前,根据pCur的位置分为:头结点之前和中间节点之前两种情况
else
//pCur是头结点
if(pCur==head)
pnew->next=pCur;
head=pnew;

//pCur是中间结点
else
pnew->next=pCur;
pBefore->next=pnew;



n++;
return head;

STU* sort(STU *head)

STU *first; /*排列后有序链的表头指针*/
STU *tail; /*排列后有序链的表尾指针*/
STU *p_min; /*保留键值更小的节点的前驱节点的指针*/
STU *min; /*存储最小节点*/
STU *p; /*当前比较的节点*/
(STU *)malloc(LEN);
first = NULL;
while (head != NULL) /*在链表中找键值最小的节点。*/

/*注意:这里for语句就是体现选择排序思想的地方*/
for (p=head,min=head; p->next!=NULL; p=p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/

if (p->next->totalscore < min->totalscore) /*找到一个比当前min小的节点。*/

p_min = p; /*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/
min = p->next; /*保存键值更小的节点。*/


/*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/
/*第一件事*/
if (first == NULL) /*如果有序链表目前还是一个空链表*/

first = min; /*第一次找到键值最小的节点。*/
tail = min; /*注意:尾指针让它指向最后的一个节点。*/

else /*有序链表中已经有节点*/

tail->next = min; /*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/
tail = min; /*尾指针也要指向它。*/

/*第二件事*/
if (min == head) /*如果找到的最小节点就是第一个节点*/

head = head->next; /*显然让head指向原head->next,即第二个节点,就OK*/

else /*如果不是第一个节点*/

p_min->next = min->next; /*前次最小节点的next指向当前min的next,这样就让min离开了原链表。*/


if (first != NULL) /*循环结束得到有序链表first*/

tail->next = NULL; /*单向链表的最后一个节点的next应该指向NULL*/

head = first;
return head;

//保存
void save_info(STU *head)

STU *p;
FILE *fp;
char filename[20];
printf("输入保存文件的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
printf("can not open the file");
exit(0);

fprintf(fp,"当前共有%d个节点:\n",n);
fprintf(fp,"学号\t姓名\t语文\t数学\t英语\t总分\n");
for(p=head;p!=NULL;p=p->next)
fprintf(fp,"%ld\t%s\t%d\t%d\t%d%\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore);
fclose(fp);
printf("保存成功!\n");

//加载
STU *load_info()

STU *head,*pnew,*ptail;
FILE *fp;
char filename[20],secondLine[20];
int num,i;
printf("输入读取文件的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
printf("can not open the file");
exit(0);

fscanf(fp,"当前共有%d个节点:",&num);

//过滤第二行
for(i=0;i<6;i++)
fscanf(fp,"%s",secondLine);
//链表初始化
head=NULL;
n=0;
//链表创建,一个循环
for(i=0;i<num;i++)
//获得一个节点,并赋值,节点由pnew指向
pnew=(STU *)malloc(LEN);
fscanf(fp,"%ld%s%d%d%d%d",&pnew->numb,&pnew->name,&pnew->chinese,&pnew->math,&pnew->english,&pnew->totalscore);
pnew->next=NULL;
//将pnew所指向的节点,插入到链表尾部
n++;//记录加载后节点个数
if(n==1)
head=pnew;
ptail=pnew;

else
ptail->next=pnew;
ptail=pnew;


fclose(fp);
printf("读取成功!\n");
return head;

void Backup_info(STU *head)//备份
FILE *in,*out;
char infile[10],outfile[10];
printf("Enter the inflie name:\n");
scanf("%s",infile);
printf("Enter the outflie name:\n");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)

printf("cannot open infile\n");
exit(0);

if((out=fopen(outfile,"w"))==NULL)

printf("cannot open outfile\n");
exit(0);

while(! feof(in)) fputc(fgetc(in),out);
fclose(in);
fclose(out);
printf("备份成功!\n");
参考技术A 定义一个结构体,结构体成员为学生的学号、姓名、各科成绩。然后在主函数里申请一个结构体数组的动态内存 因为不超过三十人 你就申请三十个就行了。然后就是写那几个函数了 第一个要传结构体数组的指针进去 因为要对值进行修改 剩下几个传值就行了 思路就是这样 我也没动手试过 不过应该差不多 你要是嫌传指针什么的麻烦 把结构体数组设为全局变量也行。

以上是关于跪求C语言程序代码“学生成绩管理”的主要内容,如果未能解决你的问题,请参考以下文章

C语言学生成绩管理系统代码

c语言学生成绩管理系统1000行源代码

学生成绩管理系统c

C语言编写一个简单的学生成绩管理系统

c语言学生成绩管理系统设计

学生成绩管理系统的c语言程序