c语言程序设计学生成绩管理系统 c语言成绩查询入口
大家好,关于c语言程序设计学生成绩管理系统很多朋友都还不太明白,今天小编就来为大家分享关于c语言成绩查询入口的知识,希望对各位有所帮助!
学生成绩管理系统(c语言程序设计)
本程序是用链表做的~因为是转载~不保证正确性.
/*头文件*/
#include<stdio.h>
#include<dos.h>
#include<stdlib.h>/*其它说明*/
#include<string.h>/*字符串函数*/
#include<mem.h>/*内存操作函数*/
#include<ctype.h>/*字符操作函数*/
#include<alloc.h>/*动态地址分配函数*/
#define LEN sizeof(STUDENT)
typedef struct stu/*定义结构体数组用于缓存数据*/
{char num[6];
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);
}
如果你还想了解更多这方面的信息,记得收藏关注本站。