首页系统c语言程序设计学生成绩管理系统 c语言成绩查询入口

c语言程序设计学生成绩管理系统 c语言成绩查询入口

编程之家2026-05-181015次浏览

大家好,关于c语言程序设计学生成绩管理系统很多朋友都还不太明白,今天小编就来为大家分享关于c语言成绩查询入口的知识,希望对各位有所帮助!

c语言程序设计学生成绩管理系统 c语言成绩查询入口

学生成绩管理系统(c语言程序设计)

本程序是用链表做的~因为是转载~不保证正确性.

/*头文件*/

#include<stdio.h>

#include<dos.h>

#include<stdlib.h>/*其它说明*/

#include<string.h>/*字符串函数*/

c语言程序设计学生成绩管理系统 c语言成绩查询入口

#include<mem.h>/*内存操作函数*/

#include<ctype.h>/*字符操作函数*/

#include<alloc.h>/*动态地址分配函数*/

#define LEN sizeof(STUDENT)

typedef struct stu/*定义结构体数组用于缓存数据*/

{char num[6];

c语言程序设计学生成绩管理系统 c语言成绩查询入口

char name[5];

int score[3];

int sum;

float average;

int order;

struct stu*next;

}STUDENT;

/*函数原型*/

STUDENT*init();/*初始化函数*/

int menu_select();/*菜单函数*/

STUDENT*create();/*创建链表*/

void print(STUDENT*head);/*显示全部记录*/

void search(STUDENT*head);/*查找记录*/

STUDENT*delete(STUDENT*head);/*删除记录*/

STUDENT*sort(STUDENT*head);/*排序*/

STUDENT*insert(STUDENT*head,STUDENT*new);/*插入记录*/

void save(STUDENT*head);/*保存文件*/

STUDENT*load();/*读文件*/

/*主函数界面*/

main()

{STUDENT*head,new;

head=init();/*链表初始化,使head的值为NULL*/

for(;;)/*循环无限次*/

{switch(menu_select())

{

case 1:head=create();break;

case 2:print(head);break;

case 3:search(head);break;

case 4:head=delete(head);break;

case 5:head=sort(head);break;

case 6:head=insert(head,&new);break;/*&new表示返回地址*/

case 7:save(head);break;

case 8:head=load(); break;

case 9:exit(0);/*如菜单返回值为9则程序结束*/

}

}

}

/*初始化函数*/

STUDENT*init()

{

return NULL;/*返回空指针*/

}

/*菜单选择函数*/

menu_select()

{int n;

struct date d;/*定义时间结构体*/

getdate(&d);/*读取系统日期并把它放到结构体d中*/

printf("press any key to enter the menu......");/*按任一键进入主菜单*/

getch();/*从键盘读取一个字符,但不显示于屏幕*/

clrscr();/*清屏*/

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

printf("\t\t Welcome to\n");

printf("\n\t\t The student score manage system\n");

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

printf("\t\t\t1. Enter the record\n");/*输入学生成绩记录*/

printf("\t\t\t2. Print the record\n");/*显示*/

printf("\t\t\t3. Search record on name\n");/*寻找*/

printf("\t\t\t4. Delete a record\n");/*删除*/

printf("\t\t\t5. Sort to make new a file\n");/*排序*/

printf("\t\t\t6. Insert record to list\n");/*插入*/

printf("\t\t\t7. Save the file\n");/*保存*/

printf("\t\t\t8. Load the file\n");/*读取*/

printf("\t\t\t9. Quit\n");/*退出*/

printf("\n\t\t Made by Hu Haihong.\n");

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

printf("\t\t\t\t%d\\%d\\%d\n",d.da_year,d.da_mon,d.da_day);/*显示当前系统日期*/

do{

printf("\n\t\t\tEnter your choice(1~9):");

scanf("%d",&n);

}while(n<1||n>9);/*如果选择项不在1~9之间则重输*/

return(n);/*返回选择项,主函数根据该数调用相应的函数*/

}

/*输入函数*/

STUDENT*create()

{int i,s;

STUDENT*head=NULL,*p;/*定义函数.此函数带回一个指向链表头的指针*/

clrscr();

for(;;)

{p=(STUDENT*)malloc(LEN);/*开辟一个新的单元*/

if(!p)/*如果指针p为空*/

{printf("\nOut of memory.");/*输出内存溢出*/

return(head);/*返回头指针,下同*/

}

printf("Enter the num(0:list end):");

scanf("%s",p->num);

if(p->num[0]=='0') break;/*如果学号首字符为0则结束输入*/

printf("Enter the name:");

scanf("%s",p->name);

printf("Please enter the%d scores\n",3);/*提示开始输入成绩*/

s=0;/*计算每个学生的总分,初值为0*/

for(i=0;i<3;i++)/*3门课程循环3次*/

{

do{

printf("score%d:",i+1);

scanf("%d",&p->score[i]);

if(p->score[i]<0|| p->score[i]>100)/*确保成绩在0~100之间*/

printf("Data error,please enter again.\n");

}while(p->score[i]<0|| p->score[i]>100);

s=s+p->score[i];/*累加各门成绩*/

}

p->sum=s;/*将总分保存*/

p->average=(float)s/3;/*先用强制类型转换将s转换成float型,再求平均值*/

p->order=0;/*未排序前此值为0*/

p->next=head;/*将头结点做为新输入结点的后继结点*/

head=p;/*新输入结点为新的头结点*/

}

return(head);

}

/*显示全部记录函数*/

void print(STUDENT*head)

{int i=0;/*统计记录条数*/

STUDENT*p;/*移动指针*/

clrscr();

p=head;/*初值为头指针*/

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

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

printf("| Rec| Num| Name| Sc1| Sc2| Sc3| Sum| Ave| Order|\n");

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

while(p!=NULL)

{

i++;

printf("|%3d|%4s|%-4s|%3d|%3d|%3d|%3d|%4.2f|%-5d|\n",

i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

p=p->next;

}

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

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

}

/*查找记录函数*/

void search(STUDENT*head)

{STUDENT*p;/*移动指针*/

char s[5];/*存放姓名用的字符数组*/

clrscr();

printf("Please enter name for searching.\n");

scanf("%s",s);

p=head;/*将头指针赋给p*/

while(strcmp(p->name,s)&& p!= NULL)/*当记录的姓名不是要找的,或指针不为空时*/

p=p->next;/*移动指针,指向下一结点*/

if(p!=NULL)/*如果指针不为空*/

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

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

printf("| Num| Name| sc1| sc2| sc3| Sum| Ave| Order|\n");

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

printf("|%4s|%4s|%3d|%3d|%3d|%3d|%4.2f|%-5d|\n",

p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

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

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

}

else

printf("\nThere is no num%s student on the list.\n",s);/*显示没有该学生*/

}

/*删除记录函数*/

STUDENT*delete(STUDENT*head)

{int n;

STUDENT*p1,*p2;/*p1为查找到要删除的结点指针,p2为其前驱指针*/

char c,s[6];/*s[6]用来存放学号,c用来输入字母*/

clrscr();

printf("Please enter the deleted num:");

scanf("%s",s);

p1=p2=head;/*给p1和p2赋初值头指针*/

while(strcmp(p1->num,s)&& p1!= NULL)/*当记录的学号不是要找的,或指针不为空时*/

{p2=p1;/*将p1指针值赋给p2作为p1的前驱指针*/

p1=p1->next;/*将p1指针指向下一条记录*/

}

if(strcmp(p1->num,s)==0)/*学号找到了*/

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

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

printf("| Num| Name| sc1| sc2| sc3| Sum| Ave| Order|\n");

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

printf("|%4s|%4s|%3d|%3d|%3d|%3d|%4.2f|%-5d|\n",

p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);

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

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

printf("Are you sure to delete the student Y/N?");/*提示是否要删除,输入Y删除,N则退出*/

for(;;)

{scanf("%c",&c);

if(c=='n'||c=='N') break;/*如果不删除,则跳出本循环*/

if(c=='y'||c=='Y')

{

if(p1==head)/*若p1==head,说明被删结点是首结点*/

head=p1->next;/*把第二个结点地址赋予head*/

else

p2->next=p1->next;/*否则将一下结点地址赋给前一结点地址*/

n=n-1;

printf("\nNum%s student have been deleted.\n",s);

printf("Don't forget to save.\n");break;/*删除后就跳出循环*/

}

}

}

else

printf("\nThere is no num%s student on the list.\n",s);/*找不到该结点*/

return(head);

}

/*排序函数*/

STUDENT*sort(STUDENT*head)

{int i=0;/*保存名次*/

STUDENT*p1,*p2,*t,*temp;/*定义临时指针*/

temp=head->next;/*将原表的头指针所指的下一个结点作头指针*/

head->next=NULL;/*第一个结点为新表的头结点*/

while(temp!=NULL)/*当原表不为空时,进行排序*/

{

t=temp;/*取原表的头结点*/

temp=temp->next;/*原表头结点指针后移*/

p1=head;/*设定移动指针p1,从头指针开始*/

p2=head;/*设定移动指针p2做为p1的前驱,初值为头指针*/

while(t->average<p1->average&&p1!=NULL)/*作成绩平均分比较*/

{

p2=p1;/*待排序点值小,则新表指针后移*/

p1=p1->next;

}

if(p1==p2)/*p1==p2,说明待排序点值大,应排在首位*/

{

t->next=p1;/*待排序点的后继为p*/

head=t;/*新头结点为待排序点*/

}

else/*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/

{

t->next=p1;/*t的后继是p1*/

p2->next=t;/*p2的后继是t*/

}

}

p1=head;/*已排好序的头指针赋给p1,准备填写名次*/

while(p1!=NULL)/*当p1不为空时,进行下列操作*/

{

i++;/*结点序号*/

p1->order=i;/*将结点序号赋值给名次*/

p1=p1->next;/*指针后移*/

}

printf("Sorting is sucessful.\n");/*排序成功*/

return(head);

}

/*插入记录函数*/

STUDENT*insert(STUDENT*head,STUDENT*new)

{STUDENT*p0,*p1,*p2;

int n,sum1,i;

p1=head;/*使p1指向第一个结点*/

p0=new;/*p0指向要插入的结点*/

printf("\nPlease enter a new record.\n");/*提示输入记录信息*/

printf("Enter the num:");

scanf("%s",new->num);

printf("Enter the name:");

scanf("%s",new->name);

printf("Please enter the%d scores.\n",3);

sum1=0;/*保存新记录的总分,初值为0*/

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

{

do{

printf("score%d:",i+1);

scanf("%d",&new->score[i]);

if(new->score[i]>100||new->score[i]<0)

printf("Data error,please enter again.\n");

}while(new->score[i]>100||new->score[i]<0);

sum1=sum1+new->score[i];/*累加各门成绩*/

}

new->sum=sum1;/*将总分存入新记录中*/

new->average=(float)sum1/3;

new->order=0;

if(head==NULL)/*原来的链表是空表*/

{head=p0;p0->next=NULL;}/*使p0指向的结点作为头结点*/

else

{while((p0->average<p1->average)&&(p1->next!=NULL))

{p2=p1;/*使p2指向刚才p1指向的结点*/

p1=p1->next;/*p1后移一个结点*/

}

if(p0->average>=p1->average)

{if(head==p1)head=p0;/*插到原来第一个结点之前*/

else p2->next=p0;/*插到p2指向的结点之后*/

p0->next=p1;}

else

{p1->next=p0;p0->next=NULL;}/*插到最后的结点之后*/

}

n=n+1;/*结点数加1*/

head=sort(head);/*调用排序的函数,将学生成绩重新排序*/

printf("\nStudent%s have been inserted.\n",new->name);

printf("Don't forget to save the new file.\n");

return(head);

}

/*保存数据到文件函数*/

void save(STUDENT*head)

{FILE*fp;/*定义指向文件的指针*/

STUDENT*p;/*定义移动指针*/

char outfile[10];

printf("Enter outfile name,for example c:\\score\n");

scanf("%s",outfile);

if((fp=fopen(outfile,"wb"))==NULL)/*为输出打开一个二进制文件,为只写方式*/

{

printf("Cannot open the file\n");

return;/*若打不开则返回菜单*/

}

printf("\nSaving the file......\n");

p=head;/*移动指针从头指针开始*/

while(p!=NULL)/*如p不为空*/

{

fwrite(p,LEN,1,fp);/*写入一条记录*/

p=p->next;/*指针后移*/

}

fclose(fp);/*关闭文件*/

printf("Save the file successfully!\n");

}

/*从文件读数据函数*/

STUDENT*load()

{STUDENT*p1,*p2,*head=NULL;/*定义记录指针变量*/

FILE*fp;/*定义指向文件的指针*/

char infile[10];

printf("Enter infile name,for example c:\\score\n");

scanf("%s",infile);

if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制文件,为只读方式*/

{

printf("Can not open the file.\n");

return(head);

}

printf("\nLoading the file!\n");

p1=(STUDENT*)malloc(LEN);/*开辟一个新单元*/

if(!p1)

{

printf("Out of memory!\n");

return(head);

}

head=p1;/*申请到空间,将其作为头指针*/

while(!feof(fp))/*循环读数据直到文件尾结束*/

{

if(fread(p1,LEN,1,fp)!=1) break;/*如果没读到数据,跳出循环*/

p1->next=(STUDENT*)malloc(LEN);/*为下一个结点开辟空间*/

if(!p1->next)

{

printf("Out of memory!\n");

return(head);

}

p2=p1;/*使p2指向刚才p1指向的结点*/

p1=p1->next;/*指针后移,新读入数据链到当前表尾*/

}

p2->next=NULL;/*最后一个结点的后继指针为空*/

fclose(fp);

printf("You have success to read data from the file!\n");

return(head);

}

用C语言怎么学生成绩管理系统

#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;

}

}

}

/**/

/*

学生成绩管理程序

编制一个统计学生考试分数的管理程序。

设学生成绩已以一个学生一个记录的形式存储在文件中,

每位学生记录包含的信息有:姓名,学号和各门功课的成绩。

程序具有以下几项功能:求出各门课程的总分,平均分,按姓名,

按学号寻找其记录并显示,浏览全部学生成绩和按总分由高到低显示学生信息等。

*/

#include<stdio.h>

#define SWN 3/*课程数*/

#define NAMELEN 20/*姓名最大字符数*/

#define CODELEN 10/*学号最大字符数*/

#define FNAMELEN 80/*文件名最大字符数*/

#define BUFLEN 80/*缓冲区最大字符数*/

/*课程名称表*/

char schoolwork[SWN][NAMELEN+1]={"Chinese","Mathematic","English"};

struct record

{

char name[NAMELEN+1];/*姓名*/

char code[CODELEN+1];/*学号*/

int marks[SWN];/*各课程成绩*/

int total;/*总分*/

}stu;

struct node

{

char name[NAMELEN+1];/*姓名*/

char code[CODELEN+1];/*学号*/

int marks[SWN];/*各课程成绩*/

int total;/*总分*/

struct node*next;/*后续表元指针*/

}*head;/*链表首指针*/

int total[SWN];/*各课程总分*/

FILE*stfpt;/*文件指针*/

char stuf[FNAMELEN];/*文件名*/

/*从指定文件读入一个记录*/

int readrecord(FILE*fpt,struct record*rpt)

{

char buf[BUFLEN];

int i;

if(fscanf(fpt,"%s",buf)!=1)

return 0;/*文件结束*/

strncpy(rpt->name,buf,NAMELEN);

fscanf(fpt,"%s",buf);

strncpy(rpt->code,buf,CODELEN);

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

fscanf(fpt,"%d",&rpt->marks[i]);

for(rpt->total=0,i=0;i<SWN;i++)

rpt->total+=rpt->marks[i];

return 1;

}

/*对指定文件写入一个记录*/

writerecord(FILE*fpt,struct record*rpt)

{

int i;

fprintf(fpt,"%s\n",rpt->name);

fprintf(fpt,"%s\n",rpt->code);

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

fprintf(fpt,"%d\n",rpt->marks[i]);

return;

}

/*显示学生记录*/

displaystu(struct record*rpt)

{

int i;

printf("\nName:%s\n",rpt->name);

printf("Code:%s\n",rpt->code);

printf("Marks:\n");

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

printf("%-15s:%4d\n",schoolwork[i],rpt->marks[i]);

printf("Total:%4d\n",rpt->total);

}

/*计算各单科总分*/

int totalmark(char*fname)

{

FILE*fp;

struct record s;

int count,i;

if((fp=fopen(fname,"r"))==NULL)

{

printf("Can't open file%s.\n",fname);

return 0;

}

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

total[i]=0;

count=0;

while(readrecord(fp,&s)!=0)

{

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

total[i]+=s.marks[i];

count++;

}

fclose(fp);

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

}

/*列表显示学生信息*/

void liststu(char*fname)

{

FILE*fp;

struct record s;

if((fp=fopen(fname,"r"))==NULL)

{

printf("Can't open file%s.\n",fname);

return;

}

while(readrecord(fp,&s)!=0)

{

displaystu(&s);

printf("\n Press ENTER to continue...\n");

while(getchar()!='\n');

}

fclose(fp);

return;

}

/*构造链表*/

struct node*makelist(char*fname)

{

FILE*fp;

struct record s;

struct node*p,*u,*v,*h;

int i;

if((fp=fopen(fname,"r"))==NULL)

{

printf("Can't open file%s.\n",fname);

return NULL;

}

h=NULL;

p=(struct node*)malloc(sizeof(struct node));

while(readrecord(fp,(struct record*)p)!=0)

{

v=h;

while(v&&p->total<=v->total)

{

u=v;

v=v->next;

}

if(v==h)

h=p;

else

u->next=p;

p->next=v;

p=(struct node*)malloc(sizeof(struct node));

}

free(p);

fclose(fp);

return h;

}

/*顺序显示链表各表元*/

void displaylist(struct node*h)

{

while(h!=NULL)

{

displaystu((struct record*)h);

printf("\n Press ENTER to continue...\n");

while(getchar()!='\n');

h=h->next;

}

return;

}

/*按学生姓名查找学生记录*/

int retrievebyn(char*fname, char*key)

{

FILE*fp;

int c;

struct record s;

if((fp=fopen(fname,"r"))==NULL)

{

printf("Can't open file%s.\n",fname);

return 0;

}

c=0;

while(readrecord(fp,&s)!=0)

{

if(strcmp(s.name,key)==0)

{

displaystu(&s);

c++;

}

}

fclose(fp);

if(c==0)

printf("The student%s is not in the file%s.\n",key,fname);

return 1;

}

/*按学生学号查找学生记录*/

int retrievebyc(char*fname, char*key)

{

FILE*fp;

int c;

struct record s;

if((fp=fopen(fname,"r"))==NULL)

{

printf("Can't open file%s.\n",fname);

return 0;

}

c=0;

while(readrecord(fp,&s)!=0)

{

if(strcmp(s.code,key)==0)

{

displaystu(&s);

c++;

break;

}

}

fclose(fp);

if(c==0)

printf("The student%s is not in the file%s.\n",key,fname);

return 1;

}

main()

{

int i,j,n;

char c;

char buf[BUFLEN];

FILE*fp;

struct record s;

clrscr();

printf("Please input the students marks record file's name:");

scanf("%s",stuf);

if((fp=fopen(stuf,"r"))==NULL)

{

printf("The file%s doesn't exit, do you want to creat it?(Y/N)",stuf);

getchar();

c=getchar();

if(c=='Y'||c=='y')

{

fp=fopen(stuf,"w");

printf("Please input the record number you want to write to the file:");

scanf("%d",&n);

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

{

printf("Input the student's name:");

scanf("%s",&s.name);

printf("Input the student's code:");

scanf("%s",&s.code);

for(j=0;j<SWN;j++)

{

printf("Input the%s mark:",schoolwork[j]);

scanf("%d",&s.marks[j]);

}

writerecord(fp,&s);

}

fclose(fp);

}

}

fclose(fp);

getchar();

/*clrscr();*/

puts("Now you can input a command to manage the records.");

puts("m: mean of the marks.");

puts("t: total of the marks.");

puts("n: search record by student's name.");

puts("c: search record by student's code.");

puts("l: list all the records.");

puts("s: sort and list the records by the total.");

puts("q: quit!");

while(1)

{

puts("Please input command:");

scanf("%c",&c);/*输入选择命令*/

if(c=='q'||c=='Q')

{

puts("\n Thank you for your using.");

break;/* q,结束程序运行*/

}

switch(c)

{

case'm':/*计算平均分*/

case'M':

if((n=totalmark(stuf))==0)

{

puts("Error!");

break;

}

printf("\n");

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

printf("%-15s's average is:%.2f.\n",schoolwork[i],(float)total[i]/n);

break;

case't':/*计算总分*/

case'T':

if((n=totalmark(stuf))==0)

{

puts("Error!");

break;

}

printf("\n");

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

printf("%-15s's total mark is:%d.\n",schoolwork[i],total[i]);

break;

case'n':/*按学生的姓名寻找记录*/

case'N':

printf("Please input the student's name you want to search:");

scanf("%s",buf);

retrievebyn(stuf,buf);

break;

case'c':/*按学生的学号寻找记录*/

case'C':

printf("Please input the student's code you want to search:");

scanf("%s",buf);

retrievebyc(stuf,buf);

break;

case'l':/*列出所有学生记录*/

case'L':

liststu(stuf);

break;

case's':/*按总分从高到低排列显示*/

case'S':

if((head=makelist(stuf))!=NULL)

displaylist(head);

break;

default: break;

}

}

}

c语言学生成绩管理系统

C语言课程设计任务书

一、题目:学生成绩管理

二、目的与要求

1.目的:

(1)基本掌握面向过程程序设计的基本思路和方法;

(2)达到熟练掌握C语言的基本知识和技能;

(3)能够利用所学的基本知识和技能,解决简单的程序设计问题

2.要求

基本要求:

1.要求利用C语言面向过程的编程思想来完成系统的设计;

2.突出C语言的函数特征,以多个函数实现每一个子功能;

3.画出功能模块图;

4.进行简单界面设计,能够实现友好的交互;

5.具有清晰的程序流程图和数据结构的详细定义;

6.熟练掌握C语言对文件的各种操作。

创新要求:

在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同

三、信息描述

输入一个班10个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打印一张按高分到低分名次排序的成绩单。要求:

1)排序用一个函数实现。

2)打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。

3)按实验报告电子模板格式填写实验内容。

四、功能描述

1.学生基本信息及成绩所选科目成绩的录入。

2.基本信息的查询(分系、班级;分科目)与修改。

3.对每系或每班各科成绩进行分析(即求单科平均成绩、及格率和优秀率);

4.对所开课程的成绩分析(求其平均成绩,最高分和最低分);

5.对学生考试成绩进行排名(单科按系别或班级进行排名,对每一个班级,同一学期学生总体成绩进行排名,并显示各科成绩信息)

五、解决方案

1.分析程序的功能要求,划分程序功能模块。

2.画出系统流程图。

3.代码的编写。定义数据结构和各个功能子函数。

4.程序的功能调试。

5.完成系统总结报告以及使用说明书

六、进度安排

此次课程设计时间为两周,分四个阶段完成:

1.分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。

2.编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。

3.总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。

4.考核阶段。

#include

#include

#define STU_NUM 10/*宏定义学生的数量*/

struct student/*定义一个结构体用来存放学生学号、三门课成绩、总分及平均成绩*/

{

char stu_id[20];/*学生学号;*/

float score[3];/*三门课成绩;*/

float total;/*总成绩;*/

float aver;/*平均成绩;*/

};

/*排序用一个函数来实现*/

void SortScore(student*stu,int n)

{

student stud;

for(int i= 0; i< n-1; i++)

for(int j= i+1; j< n; j++)

{

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

{

stud= stu[i];

stu[i]= stu[j];

stu[j]= stud;

}

}

}

int main()

{

student stu[STU_NUM];/*创建结构体数组中有10个元素,分别用来保存这10个人的相关信息。*/

/*输入这十个学生的相关信息*/

for(int i= 0; i<STU_NUM; i++)

{

printf("请输入第%d个学生的学号:",i+1);

scanf("%s",&stu[i].stu_id);

printf("输入第%d个学生的数学成绩:",i+1);

scanf("%f",&stu[i].score[0]);

printf("输入第%d个学生的英语成绩:",i+1);

scanf("%f",&stu[i].score[1]);

printf("输入第%d个学生的计算机成绩:",i+1);

scanf("%f",&stu[i].score[2]);

stu[i].total= stu[i].score[0]+stu[i].score[1]+stu[i].score[2];

stu[i].aver= stu[i].total/3;

}

printf("\n");

SortScore(stu,STU_NUM);/*调用排序函数*/

/*输出排序后的各学生的成绩*/

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

{

printf("序号:%d\t",i);

printf("学号:%s\t",stu[i].stu_id);

printf("数学:%f\t",stu[i].score[0]);

printf("英语:%f\t",stu[i].score[1]);

printf("计算机:%f\t",stu[i].score[2]);

printf("平均成绩:%f\t",stu[i].aver);

printf("总分:%f\t",stu[i].total);

printf("\n\n");

}

return 0;

}

注:(源程序中主要标识符含义说明)

#define STU_NUM 10/*宏定义学生的数量*/

struct student/*定义一个结构体用来存放学生学号、三门课成绩、总分及平均成绩*/

{

char stu_id[20];/*学生学号;*/

float score[3];/*三门课成绩;*/

float total;/*总成绩;*/

float aver;/*平均成绩;*/

}

实验结果:

输入:(只输入后面的数字,前面的文字是自己产生的)。

请输入第1个学生的学号:001

输入第1个学生的数学成绩:1

输入第1个学生的英语成绩:1

输入第1个学生的计算机成绩:1

请输入第2个学生的学号:002

输入第2个学生的数学成绩:2

输入第2个学生的英语成绩:2

输入第2个学生的计算机成绩:2

请输入第3个学生的学号:003

输入第3个学生的数学成绩:3

输入第3个学生的英语成绩:3

输入第3个学生的计算机成绩:3

请输入第4个学生的学号:004

输入第4个学生的数学成绩:4

输入第4个学生的英语成绩:4

输入第4个学生的计算机成绩:4

请输入第5个学生的学号:005

输入第5个学生的数学成绩:5

输入第5个学生的英语成绩:5

输入第5个学生的计算机成绩:5

请输入第6个学生的学号:006

输入第6个学生的数学成绩:6

输入第6个学生的英语成绩:6

输入第6个学生的计算机成绩:6

请输入第7个学生的学号:007

输入第7个学生的数学成绩:7

输入第7个学生的英语成绩:7

输入第7个学生的计算机成绩:7

请输入第8个学生的学号:008

输入第8个学生的数学成绩:8

输入第8个学生的英语成绩:8

输入第8个学生的计算机成绩:8

请输入第9个学生的学号:009

输入第9个学生的数学成绩:9

输入第9个学生的英语成绩:9

输入第9个学生的计算机成绩:9

请输入第10个学生的学号:010

输入第10个学生的数学成绩:10

输入第10个学生的英语成绩:10

输入第10个学生的计算机成绩:10

输出:

序号: 0学号:010数学:10.000000英语:10.000000计算机:10.000000

平均成绩:10.000000总分:30.000000

序号: 1学号:009数学:9.000000英语:9.000000计算机:9.000000

平均成绩:9.000000总分:27.000000

序号: 2学号:008数学:8.000000英语:8.000000计算机:8.000000

平均成绩:8.000000总分:24.000000

序号: 3学号:007数学:7.000000英语:7.000000计算机:7.000000

平均成绩:7.000000总分:21.000000

序号: 4学号:006数学:6.000000英语:6.000000计算机:6.000000

平均成绩:6.000000总分:18.000000

序号: 5学号:005数学:5.000000英语:5.000000计算机:5.000000

平均成绩:5.000000总分:15.000000

序号: 6学号:004数学:4.000000英语:4.000000计算机:4.000000

平均成绩:4.000000总分:12.000000

序号: 7学号:003数学:3.000000英语:3.000000计算机:3.000000

平均成绩:3.000000总分:9.000000

序号: 8学号:002数学:2.000000英语:2.000000计算机:2.000000

平均成绩:2.000000总分:6.000000

序号: 9学号:001数学:1.000000英语:1.000000计算机:1.000000

平均成绩:1.000000总分:3.000000

七、撰写课程设计报告或课程设计总结

课程设计报告要求:

总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。

C语言常见错误

书写标识符时,忽略了大小写字母的区别

main()

{

int a=5;

printf("%d",A);

}

编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。

2.忽略了变量的类型,进行了不合法的运算。

main()

{

float a,b;

printf("%d",a%b);

}

%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。

3.将字符常量与字符串常量混淆。

char c;

c="a";

在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。

4.忽略了“=”与“==”的区别。

在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写

if(a=3) then…

但C语言中,“=”是赋值运算符,“==”是关系运算符。如:

if(a==3) a=b;

前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。

5.忘记加分号。

分号是C语句中不可缺少的一部分,语句末尾必须有分号。

a=1

b=2

编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。

{ z=x+y;

t=z/100;

printf("%f",t);

}

对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。

6.多加分号。

对于一个复合语句,如:

{ z=x+y;

t=z/100;

printf("%f",t);

};

复合语句的花括号后不应再加分号,否则将会画蛇添足。

又如:

if(a%3==0);

I++;

本是如果3整除a,则I加1。但由于if(a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。

再如:

for(I=0;I<5;I++);

{scanf("%d",&x);

printf("%d",x);}

本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。

7.输入变量时忘记加地址运算符“&”。

int a,b;

scanf("%d%d",a,b);

这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。

8.输入数据的方式与要求不符。①scanf("%d%d",&a,&b);

输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:

3,4

输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。

②scanf("%d,%d",&a,&b);

C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:

3,4

此时不用逗号而用空格或其它字符是不对的。

3 4 3:4

又如:

scanf("a=%d,b=%d",&a,&b);

输入应如以下形式:

a=3,b=4

9.输入字符的格式与要求不一致。

在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。

scanf("%c%c%c",&c1,&c2,&c3);

如输入a b c

字符“a”送给c1,字符“”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。

10.输入输出的数据类型与所用格式说明符不一致。

例如,a已定义为整型,b定义为实型

a=3;b=4.5;

printf("%f%d\n",a,b);

编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。

11.输入数据时,企图规定精度。

scanf("%7.2f",&a);

这样做是不合法的,输入数据时不能规定精度。

12.switch语句中漏写break语句。

例如:根据考试成绩的等级打印出百分制数段。

switch(grade)

{ case'A':printf("85~100\n");

case'B':printf("70~84\n");

case'C':printf("60~69\n");

case'D':printf("<60\n");

default:printf("error\n");

由于漏写了break语句,case只起标号的作用,而不起判断作用。因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“break;”。例如

case'A':printf("85~100\n");break;

13.忽视了while和do-while语句在细节上的区别。

(1)main()

{int a=0,I;

scanf("%d",&I);

while(I<=10)

{a=a+I;

I++;

}

printf("%d",a);

}

(2)main()

{int a=0,I;

scanf("%d",&I);

do

{a=a+I;

I++;

}while(I<=10);

printf("%d",a);

}

可以看到,当输入I的值小于或等于10时,二者得到的结果相同。而当I>10时,二者结果就不同了。因为while循环是先判断后执行,而do-while循环是先执行后判断。对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体。

14.定义数组时误用变量。

int n;

scanf("%d",&n);

int a[n];

数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。即C不允许对数组的大小作动态定义。

15.在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。

main()

{static int a[10]={1,2,3,4,5,6,7,8,9,10};

printf("%d",a[10]);

}

C语言规定:定义时用a[10],表示a数组有10个元素。其下标值由0开始,所以数组元素a[10]是不存在的。

16.初始化数组时,未使用静态存储。

int a[3]={0,1,2};

这样初始化数组是不对的。C语言规定只有静态存储(static)数组和外部存储(exterm)数组才能初始化。应改为:

static int a[3]={0,1,2};

17.在不应加地址运算符&的位置加了地址运算符。

scanf("%s",&str);

C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。应改为:

scanf("%s",str);

18.同时定义了形参和函数中的局部变量。

int max(x,y)

int x,y,z;

{z=x>y?x:y;

return(z);

}

形参应该在函数体外定义,而局部变量应该在函数体内定义。应改为:

int max(x,y)

int x,y;

{int z;

z=x>y?x:y;

return(z);

}

如果你还想了解更多这方面的信息,记得收藏关注本站。

css手册下载(css帮助文档)openai怎么安装 OpenAI怎么安装