c语言大作业学生管理系统
㈠ 关于c语言大作业学生管理系统
存入文件中。这是我以前做的,关于图书信息保存的,修改下就行了。
//保存图书信息到文件
void book_save(struct Book_List *head)
{
FILE *fp;
struct Book_List *p;
if((fp = fopen("书库信息.txt" , "w+")) == NULL){
printf("书 库 信 息 文 件 打 开 出 错 ! \n");
exit(0);
}
for(p = head;p != NULL;p = p -> next){
fprintf(fp , "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%.2f\t%d\t%d\n" , p -> book_number ,p -> book_ID,p -> book_name ,p -> book_writter
,p -> book_publiction ,p -> book_sort ,p -> book_born, p -> price , p -> number[0],p -> number[1] );
}
if(fclose(fp)){
printf("不 能 关 闭 书 库 信 息 文 件!\n");
exit(0);
}
else
printf("-------图 书 信 息 保 存 成 功 -------\n");
getchar();
}
㈡ C语言大作业 学生成绩管理系统
这个有难度啊!!!!
㈢ 急求C语言期末大作业:学生成绩管理系统!!!(并附有详解)
1、题目:
学生成绩管理程序
2、要求:
1)编制一个统计学生考试分数的管理程序。
2)设学生成绩已以一个学生一个记录的形式存储在文件中,
3)每位学生记录包含的信息有:姓名,学号和各门功课的成绩。
4)程序具有以下几项功能:求出各门课程的总分,平均分,按姓名,
5)按学号寻找其记录并显示,浏览全部学生成绩和按总分由高到低显示学生信息等。
#include<iostream>
#include<string>
using namespace std;
struct record
{
char name[20]; /* 姓名 */
char code[20]; /* 学号 */
int mathmark; /* 数学课程成绩 */
int englishmark; /* 英语课程成绩 */
int compmark; /* 计算机课程成绩 */
}stu[20];
int total[20][3],avg[20][3];
int student_total[20],flag[20];
void input()//从键盘输入20个学生的各项信息
{
int i;
for(i=0;i<20;i++)
{
cout<<"输入第"<<i+1<<"个学生信息"<<endl;
cout<<"输入学生姓名:";
cin>>stu[i].name;
cout<<"输入学生学号:";
cin>>stu[i].code;
cout<<"输入数学成绩: ";
cin>>stu[i].mathmark;
cout<<"输入英语成绩: ";
cin>>stu[i].englishmark;
cout<<"输入计算机成绩: ";
cin>>stu[i].compmark;
cout<<endl;
}
}
void find_by_name(char *p)//按姓名寻找其记录并显示,如输入“张三”,即可输出该同学的学号和三门功课的成绩
{
int i;
for(i=0;i<20;i++)
if(strcmp(stu[i].name,p)==0)
{
cout<<"学号\t"<<"数学\t"<<"英语\t"<<"计算机"<<endl;
cout<<stu[i].code<<"\t"<<stu[i].mathmark<<"\t"<<stu[i].englishmark<<"\t"<<stu[i].compmark<<endl;
break;
}
}
void find_by_code(char *p)//按学号寻找其记录并显示,如输入“09001”,即可输出该同学的姓名和三门功课的成绩
{
int i;
for(i=0;i<20;i++)
if(strcmp(stu[i].code,p)==0)
{
cout<<"姓名\t"<<"数学\t"<<"英语\t"<<"计算机"<<endl;
cout<<stu[i].name<<"\t"<<stu[i].mathmark<<"\t"<<stu[i].englishmark<<"\t"<<stu[i].compmark<<endl;
break;
}
}
void disp()//浏览全部学生的各项信息
{
int i;
cout<<"姓名\t"<<"学号\t"<<"数学\t"<<"英语\t"<<"计算机"<<endl;
for(i=0;i<20;i++)
{
cout<<stu[i].name<<"\t"<<stu[i].code<<"\t"<<stu[i].mathmark<<"\t"<<stu[i].englishmark<<"\t"<<stu[i].compmark<<endl;
}
}
void dis_by_total()//按总分由高到低显示学生信息等
{
int i,j,n;
int temp1,temp2;
for(i=0;i<20;i++)flag[i]=i;
n=19;
while(n>0)
{
j=0;
for(i=0;i<n;i++)
if(student_total[i]<student_total[i+1])
{
temp1=student_total[i];
student_total[i]=student_total[i+1];
student_total[i+1]=temp1;
temp2=flag[i];
flag[i]=flag[i+1];
flag[i+1]=temp2;
j=i;
}
n=j;
}
cout<<"姓名\t"<<"学号\t"<<"数学\t"<<"英语\t"<<"计算机"<<endl;
for(i=0;i<20;i++)
{
cout<<stu[flag[i]].name<<"\t"<<stu[flag[i]].code<<"\t"<<stu[flag[i]].mathmark<<"\t"<<stu[flag[i]].englishmark<<"\t"<<stu[flag[i]].compmark<<endl;
}
}
int main()
{
char name[20];
char code[20];
cout<<"请输入学生信息!!"<<endl;
input();
cout<<"\n请输入您要查找的名字:";
cin>>name;
find_by_name(name);
cout<<"\n请输入您要查找的学号:";
cin>>code;
find_by_code(code);
cout<<"\n显示所有学生信息:"<<endl;
disp();
cout<<"\n按总分由高到低显示学生信息!!"<<endl;
dis_by_total();
return 0;
}
自己再根据需要改改,应该可以的
㈣ C语言 学生信息管理系统设计
呵呵~~
我也找了很久哦~~
第一种:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
struct student{
int id;
char name[10];
int age;
char sex[10];
char birthady[20];
int tel;
char nativeplace[50];
}st[50];
int i=0;
void shuru() {
char a;
do{
printf("\n请输入学号:");
scanf("%d",&st[i].id);
fflush(stdin);
printf("\n请输入姓名:");
gets(st[i].name);
printf("\n") ;
printf("请输入年龄:");
scanf("%d",&st[i].age);
fflush(stdin);
printf("\n请输入姓别:");
gets(st[i].sex);
fflush(stdin);
printf("\n请输入生日:");
gets(st[i].birthady);
printf("\n请输入电话:");
scanf("%d",&st[i].tel);
fflush(stdin);
printf("\n请输入籍贯:");
gets(st[i].nativeplace);
printf("\n是否继续输入另外一个学生信息?(y/n)");
fflush(stdin);
a=getchar();
i++;
}while(a=='y' && i<=50);
}
void xianshi()
{
int j;
printf("\t学号\t姓名\t年龄\t性别\t生日\t\t电话\t籍贯\n");
for(j=0;j<i;j++)
printf("\t%d\t%s\t%d\t%s\t%s\t%d\t%s\n",
st[j].id,st[j].name,st[j].age,st[j].sex,st[j].birthady,st[j].tel,st[j].nativeplace);
}
void paixu() //按年龄从大到小排序函数
{
int j,k;
int temp;
for(j=0;j<i;j++)
{
for(k=0;k<i-1-j;k++)
{
if(st[k].age<st[k+1].age)
{
temp=st[k].age;
st[k].age=st[k+1].age;
st[k+1].age=temp;
}
}
}
xianshi(); //排序后输出
}
void chazhao()
{
int m;
char name[20],b;
do
{
printf("\n请输入想查找的学生姓名:");
fflush(stdin);
gets(name);
for(m=0;m<i;m++)
{
if(strcmp(name,st[m].name)==0)
{
printf("\n\t您查找的学生在第%d个位置找到了!!!\n",m+1);
break;
}
}
if(m>=20)
printf("\n\t没有找到这个学生!!!\n");
else
{
printf("\t学号\t姓名\t年龄\t性别\t生日\t\t电话\t籍贯\n");
printf("\t%d\t%s\t%d\t%s\t%s\t%d\t%s\n",
st[m].id,st[m].name,st[m].age,st[m].sex,st[m].birthady,st[m].tel,st[m].nativeplace);
}
printf("\n是否查找另一个学生的信息?(y/n)");
fflush(stdin);
b=getchar();
}while(b=='y');
}
void shanchu()
{
char name[20],c;
int a,b;
do
{
printf("\n请输入要删除的学生姓名:\n");
fflush(stdin);
gets(name);
for(a=0;a<i;a++)
{
if(strcmp(name,st[a].name)==0)
break;
}
for(b=a;b<i;b++)
st[b]=st[b+1];
if(a>i)
printf("\t没有找到这个学生!!!\n");
else
{
i--;
xianshi();
}
printf("\n是否继续删除另一个学生信息?(y/n) ");
fflush(stdin);
c=getchar();
}while(c=='y');
}
void charu()
{
shuru();
paixu();
}
void main() //主函数
{
int change;
do{
system("cls");
printf("============================学生信息管理系统===================================\n");
printf("\t\t一: 输入学生信息\n");
printf("\t\t二: 显示学生信息\n");
printf("\t\t三: 查找学生信息\n");
printf("\t\t四: 删除学生信息\n");
printf("\t\t五: 插入学生信息\n");
printf("\t\t六: 退出程序\n");
fflush(stdin);
printf("\t\t请输入功能选项:");
scanf("%d",&change);
switch(change)
{
case 1:
shuru(); break;
case 2:
xianshi(); break;
case 3:
chazhao(); break;
case 4:
shanchu(); break;
case 5:
charu(); break;
case 6:
break;
}
getch();
}while(change!=6);
}
第二种
#include<stdio.h>
#include<conio.h>
#include<string.h>
typedef struct STUDENT
{
char studentNumber[10];/*学生学号*/
char studentName[20];/*学生姓名*/
char studentSEX[10];/*学生性别*/
char className[20];/*班级名称*/
float mark1;/*第1门成绩*/
float mark2;/*第2门成绩*/
float mark3;/*第3门成绩*/
float mark4;/*第4门成绩*/
float mark5;/*第5门成绩*/
struct STUDENT *next;
}STUDENT;
STUDENT *headLink;/*链表表头指针*/
/*以下是函数声明*/
void ReadInfoFormFile(void);
void DesplayMenu(void);
void CreateHeadLink(void);
STUDENT *MallocNode(void);
void GetInformation(STUDENT *t);
void OutputInformation(void);
void DesplayInfoBystudentName(void);
void DesplayInfoBystudentNumber(void);
void DesplayOneNode(STUDENT *t);
void InsertOneNode(STUDENT *t);
void DeleteNodeBystudentNumber(void);
void ChangeMarkByName(void);
void ChangeMarkByNumber(void);
void SaveLinkToFile(void);
void DesplayMarkSegment(void);
void CompositorByTotalMark(void);
int choose;/*用于接受用户的选择*/
/*主函数*/
void main()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
/************************************
函数功能:从文件中读学生信息到链表中
************************************/
void ReadInfoFormFile(void)
{
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%s%f%f%f",p->studentNumber,p->studentSEX,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3),&(p->mark4),&(p->mark5))>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
/************************************
函数功能:显示菜单,根据用户的输入
完成相应的功能
************************************/
void DesplayMenu(void)
{
STUDENT *p;
printf("-------请选择相应功能------------\n\n");
printf("| 1 显示所有学生的信息 |\n");
printf("| 2 按姓名查询 |\n");
printf("| 3 按学号查询 |\n");
printf("| 4 增加学生 |\n");
printf("| 5 删除学生 |\n");
printf("| 6 按姓名修改学生成绩 |\n");
printf("| 7 按学号修改学生成绩 |\n");
printf("| 8 保存所有学生信息 |\n");
printf("| 9 显示优秀和不及格学生成绩 |\n");
printf("| 10 排序结果并输出成绩 |\n");
printf("| 11 退出 |\n\n");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case 1:
OutputInformation();/*显示所有学生的信息*/
break;
case 2:
DesplayInfoBystudentName();
break;
case 3:
DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/
break;
case 4:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case 5:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
break;
case 6:
ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
break;
case 7:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
break;
case 8:
SaveLinkToFile();/*保存数据*/
break;
case 9:
DesplayMarkSegment();/*显示各分数段的学生成绩*/
break;
case 10:
CompositorByTotalMark();
break;
case 11:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
exit(1);
break;
default:
break;
}
DesplayMenu();/*递归调用*/
}
/************************************
函数功能:建立链表表头
************************************/
void CreateHeadLink(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
/************************************
函数功能:申请一个新结点,并将其初始化
************************************/
STUDENT *MallocNode(void)
{
STUDENT *p;
int i;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
for(i=0;i<10;i++)
p->studentNumber[i]='\0';
for(i=0;i<20;i++)
p->studentName[i]='\0';
for(i=0;i<10;i++)
p->studentSEX[i]='\0';
for(i=0;i<20;i++)
p->className[i]='\0';
p->mark1=0.0;
p->mark2=0.0;
p->mark3=0.0;
p->mark4=0.0;
p->mark5=0.0;
p->next=NULL;
return p;
}
/************************************
函数功能:取得用户输入的学生信息
************************************/
void GetInformation(STUDENT *t)
{
printf("请输入学生学号:\n");
scanf("%s",t->studentNumber);
printf("请输入学生姓名:\n");
scanf("%s",t->studentName);
printf("请输入学生性别:\n");
scanf("%s",t->studentSEX);
printf("请输入该生所在班级:\n");
scanf("%s",t->className);
printf("请输入第1门成绩:\n");
scanf("%f",&(t->mark1));
printf("请输入第2门成绩:\n");
scanf("%f",&(t->mark2));
printf("请输入第3门成绩:\n");
scanf("%f",&(t->mark3));
printf("请输入第4门成绩:\n");
scanf("%f",&(t->mark4));
printf("请输入第5门成绩:\n");
scanf("%f",&(t->mark5));
}
/************************************
函数功能:在链表的结尾处增加一个结点
************************************/
void InsertOneNode(STUDENT *t)
{
STUDENT *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/************************************
函数功能:根据用户输入的学生姓名显示该学生的信息
************************************/
void DesplayInfoBystudentName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
p=headLink->next;
printf("请输入学生姓名:\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在姓名为 %s 的学生\n",studentName);
}
/************************************
函数功能:根据用户输入的学号显示该学生的信息
************************************/
void DesplayInfoBystudentNumber(void)
{
STUDENT *p;
char studentNumber[10];
char flag=0;
p=headLink->next;
printf("请输入学生学号:\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
}
/************************************
函数功能:输出一个结点的信息
************************************/
void DesplayOneNode(STUDENT *t)
{
printf("%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->studentSEX);
printf("%s\t",t->className);
printf("%.2f\t",t->mark1);
printf("%.2f\t",t->mark2);
printf("%.2f\t",t->mark3);
printf("%.2f\t",t->mark4);
printf("%.2f\t",t->mark5);
printf("%.2f\t",t->mark1+t->mark2+t->mark3+t->mark4+t->mark5);
printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3+t->mark4+t->mark5)/5);
}
/************************************
函数功能:根据用户输入的学号删除该学生
************************************/
void DeleteNodeBystudentNumber(void)
{
char studentNumber[10];
STUDENT *p,*q;
char flag=0;
printf("请输入要删除的学生学号:");
scanf("%s",studentNumber);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->studentNumber,studentNumber)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
{
printf("不存在该学号的学生\n");
return;
}
printf("成功删除\n");
}
/************************************
函数功能:显示所有学生的信息
************************************/
void OutputInformation(void)
{
STUDENT *p;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
/************************************
函数功能:根据输入的姓名修改成绩
************************************/
void ChangeMarkByName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
float mark1,mark2,mark3,mark4,mark5;
p=headLink->next;
printf("请输入学生姓名:\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的第1门成绩:\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:\n");
scanf("%f",&mark3);
printf("请输入新的第4门成绩:\n");
scanf("%f",&mark4);
printf("请输入新的第5门成绩:\n");
scanf("%f",&mark5);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
p->mark4=mark4;
p->mark5=mark5;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在姓名为 %s 的学生\n",studentName);
}
/************************************
函数功能:根据输入的学号修改成绩
************************************/
void ChangeMarkByNumber(void)
{
STUDENT *p;
char studentNumber[20];
char flag=0;
float mark1,mark2,mark3,mark4,mark5;
p=headLink->next;
printf("请输入学生学号:\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的第1门成绩:\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:\n");
scanf("%f",&mark3);
printf("请输入新的第4门成绩:\n");
scanf("%f",&mark4);
printf("请输入新的第5门成绩:\n");
scanf("%f",&mark5);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
p->mark4=mark4;
p->mark5=mark5;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
}
/************************************
函数功能:保存链表数据到文件中
************************************/
void SaveLinkToFile(void)
{
STUDENT *p;
FILE *fp;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s %s %s %s %f %f %f %f %f\n",p->studentNumber,p->studentName,p->studentSEX,p->className,p->mark1,p->mark2,p->mark3,p->mark4,p->mark5);
p=p->next;
}
fclose(fp);
}
/************************************
函数功能:显示优秀和不及格学生成绩
************************************/
void DesplayMarkSegment(void)
{
STUDENT *p;
int count=0;
p=headLink->next;
printf("60分以下(不及格)的学生成绩如下:\n");
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
while(p)
{
if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10)))||(6>((int)(p->mark4/10)))||(6>((int)(p->mark5/10))))/*只要有一科不及格就认为该生不及格*/
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("不及格的学生一共有%d人\n",count);
p=headLink->next;
printf("成绩优秀的学生成绩如下:\n");
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
count=0;
while(p)
{
if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10)))&&(8<=((int)(p->mark4/10)))&&(8<=((int)(p->mark5/10))))
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("成绩优秀的学生一共有%d人\n",count);
}
/************************************
函数功能:按总成绩排序
************************************/
void CompositorByTotalMark(void)
{
STUDENT exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("现在还没学生信息,请先输入学生信息\n");
return;
}
while(r)/*两层while循环实现排序*/
{
p=r;
q=r->next;
while(q)
{
if((q->mark1+q->mark2+q->mark3+q->mark4+q->mark5)>(p->mark1+p->mark2+p->mark3+p->mark4+p->mark5))
{
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
strcpy(exchange.studentName,q->studentName);
strcpy(exchange.className,q->className);
exchange.mark1=q->mark1;
exchange.mark2=q->mark2;
exchange.mark3=q->mark3;
exchange.mark4=q->mark4;
exchange.mark5=q->mark5;
strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
strcpy(q->studentName,p->studentName);
strcpy(q->studentSEX,p->studentSEX);
strcpy(q->className,p->className);
q->mark1=p->mark1;
q->mark2=p->mark2;
q->mark3=p->mark3;
q->mark4=p->mark4;
q->mark5=p->mark5;
strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
strcpy(p->studentName,exchange.studentName);
strcpy(p->className,exchange.className);
p->mark1=exchange.mark1;
p->mark2=exchange.mark2;
p->mark3=exchange.mark3;
p->mark4=exchange.mark4;
p->mark5=exchange.mark5;
}
q=q->next;
}
r=r->next;
}
OutputInformation();
}
我比较倾向于第二种,因为是自己调试的,呵呵~~
你只要把"成绩"改成你需要的其他信息就OK了~~
㈤ c语言大作业 学生成绩管理系统
给个参考你:
/*编制一个学生成绩管理系统,每个学生信息包括:学号、姓名、C语言、高数和英语成绩。具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的成绩;
(3)按学号或姓名查询成绩;
(4)添加成绩记录;
(5)修改指定姓名或学号的学生的成绩并可存盘;
(6)显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息。以C语言成绩为例*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 20
typedef struct
{
char name[10];
int num;
float c;
float math;
float english;
float aver;
}stu;
//菜单
void menu() /*便于操作员使用*/
{ /*清屏*/
system("cls");
printf(" 学生平时成绩管理\n");
printf("=======================\n");
printf(" 1.成绩录入\n");
printf(" 2.计算\n");
printf(" 3.查询\n");
printf(" 4.修改\n");
printf(" 5.插入\n");
printf(" 6.显示\n");
printf(" 7.统计\n");
printf(" 8.删除\n");
printf(" 0.退出\n");
printf("=======================\n");
printf("请选择相应的功能:");
}
//成绩录入
void input()
{
FILE *fp;
stu xs; /*定义一个结构体变量来装从文件中读出来的数据*/
if((fp=fopen("student.dat","ab"))==NULL) {printf("can't open file!\n");exit(0);}
printf("\n录入格式: 姓名 学号 C语言 高数 英语 当输入姓名为ps结束录入\n");
while(1) /*中间加油break,可使循环中断*/
{
scanf("%s",xs.name);
if(strcmp(xs.name,"ps")==0) break;/*判断姓名是否为ps,用字符串判断*/
scanf("%d%f%f%f",&xs.num,&xs.c,&xs.math,&xs.english);
xs.aver=0;/*给平均分变量赋初值*/
fwrite(&xs,sizeof(stu),1,fp); //将成绩信息写入文件
}
fclose(fp);
}
//计算平均分
void sum()
{
int i=0,n;
stu xs[N];
FILE *fp;
if((fp=fopen("student.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))/*文件读入内存,读取指针未到文件尾时返回值为0,读到尾时返回值为1,加!取反后,结束即为0*/
{
fread(&xs[i],sizeof(stu),1,fp);/*读入结构体变量*/
if(feof(fp)) break;/*上面while循环那个会多读一次因为读到尾时那个0还没返回,这里判断如果以读到文件尾,则直接停止,避免重复输入*/
xs[i].aver=(xs[i].c+xs[i].math+xs[i].english)/3;
i++;
}
n=i;/*把i的末尾值给n,用于下面循环写入*/
i=0;
fclose(fp);
if((fp=fopen("student.dat","wb"))==NULL) {printf("can't open file!\n");exit(0);}
while(i<n)
{
fwrite(&xs[i],sizeof(stu),1,fp);
i++;
}
fclose(fp);
}
void xingming()
{
FILE *fp;
stu xs;
char name[10];
printf("\n输入要查学生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*按姓名查询时判断输入的姓名是否存在,会循环从数据中找取*/
{
printf(" 学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
}
}
if(feof(fp)) printf("查找失败!!!"); /*学生不存在*/
fclose(fp);
}
void xuehao()
{
FILE *fp;
stu xs;
int num;
printf("\n输入要查学生的学号: ");scanf("%d",&num);
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(xs.num==num)/*按学号查询时判断输入的学号是否存在,会循环从数据中找取*/
{
printf(" 学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
}
}
if(feof(fp)) printf("查找失败!!!");
fclose(fp);
}
//查询
void search()
{
char ch1;
system("cls");
printf("请输入按何种方式查询:\n");
printf("1-姓名,2-学号:");
ch1=getchar();/*用字符接收*/
switch(ch1)/*判断*/
{
case '1':xingming();break;
case '2':xuehao();break;
}
getch();/*让屏幕停留同时按任意键返回*/
}
//修改:输入学生的姓名,查找该学生,若找到则修改该生的成绩信息,并显示修改前后的结果;
void modi()
{
stu xs;
FILE *fp;
char name[10];
system("cls");
printf("\n输入要查学生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*判断输入要修改的姓名是否存在*/
{
printf(" 修改前学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
printf("\n请输入该生的C语言成绩:");scanf("%f",&xs.c);
printf("\n高数成绩:");scanf("%f",&xs.math);
printf("\n英语成绩:");scanf("%f",&xs.english);
xs.aver=(xs.c+xs.math+xs.english)/3;
break;
}
}
if(!feof(fp))
{
printf(" \n 修改后的学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
fseek(fp,sizeof(-stu),1);/*负号表示后退,1表示文件当前位置*/
fwrite(&xs,sizeof(stu),1,fp);/*再写入,同时把要修改的那个覆盖掉*/
}
else
printf("\n学生不存在,修改失败!!");
fclose(fp);
getch();
}
//插入:输入学生的平时的各项成绩,插入到指定位置;当指定的位置超出范围时,将其插入到全班的最后,并显示插入成功后的结果。
void insert()
{
int i=0,j,k,lenth;
FILE *fp;
stu s,xs[N];
system("cls");
printf("\n请输入插入的学生的姓名:");scanf("%s",&s.name);
printf("\n学生的学号:");scanf("%d",&s.num);
printf("\n学生的C成绩:");scanf("%f",&s.c);
printf("\n高数成绩:");scanf("%f",&s.math);
printf("\n英语成绩:");scanf("%f",&s.english);
s.aver=(s.c+s.math+s.english)/3;
printf("\n插入位置:");scanf("%d",&k);
// i=0;
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/
if(feof(fp)) break;
i++;
}
fclose(fp);
lenth=i;
if(k<lenth && k>=0)/*k的位置要位于数组范围之内*/
{//插入
for(j=lenth-1;j>=k;j--)
xs[j+1]=xs[j];/*一开始j是最大的,往后移一个这样移动避免数据被覆盖*/
/*循环是只循环这一句的*/
xs[k]=s;/*将输入的学生信息加入这个k位置*/
lenth++;/*长度+1*/
//写回
if((fp=fopen("student.dat","wb"))==NULL) {printf("不能建立文件!!\n");exit(0);}
for(i=0;i<lenth;i++)
fwrite(&xs[i],sizeof(stu),1,fp);
}
else/*不再数组范围之内*/
{
if((fp=fopen("student.dat","ab"))==NULL) {printf("不能建立文件!!\n");exit(0);}
fwrite(&s,sizeof(stu),1,fp);
}
fclose(fp);
}
//显示
void print()
{
FILE *fp;
stu s;
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
printf("\n%10s %s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
while(!feof(fp))
{
fread(&s,sizeof(stu),1,fp);//从文件中读取成绩信息
if(feof(fp)) break;//判断是否文件尾
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",s.name,s.num,s.c,s.math,s.english,s.aver);
}
fclose(fp);
getch();
}
//统计
void tongji()
{
int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;
FILE *fp;
stu s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指针数组*/
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) {printf("cant't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&s[i++],sizeof(stu),1,fp);/*读入数据*/
if(feof(fp)) break;
}
t=i;i=0;
for(u=0;u<t;u++)/*以下每个指针数组用于指向各分数段的学生信息*/
{
if(s[i].c<60) {p1[j++]=&s[i++];continue;}/*每个学生信息只能位于一个分数段*/
if(s[i].c>=60&&s[i].c<80) {p2[k++]=&s[i++];continue;}
if(s[i].c>=80&&s[i].c<90) {p3[l++]=&s[i++];continue;}
if(s[i].c>=90) {p4[m++]=&s[i++];continue;}
}
printf("不及格:姓名 学号 C语言\n");
for(n=0;n<j-1;n++)
{
printf("%10s %6d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c);
}
printf("60-79:姓名 学号 C语言\n");
for(p=0;p<k;p++)
{
printf("%10s %6d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c);
}
printf("80-89:姓名 学号 C语言\n");
for(q=0;q<l;q++)
{
printf("%10s %6d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c);
}
printf("90以上:姓名 学号 C语言\n");
for(r=0;r<m;r++)
{
printf("%10s %6d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c);
}
fclose(fp);
getch();
}
//删除:输入学生姓名,若该学生存在,则删除,并显示删除后余下的学生成绩信息
void dele()
{
stu xs[N];
FILE *fp;
char name[10];
int i=0,len,k=-1/*k<0是为后面if判断用的*/;
system("cls");
printf("\n输入要删除的学生姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);
if(feof(fp)) break;
if(strcmp(xs[i].name,name)==0) k=i;
i++;
}
fclose(fp);
//以下是删除后重新写文件
len=i;/*结构体数组上限*/
if(k>=0)/*k>0说明找到删除学生位置*/
{
if((fp=fopen("student.dat","wb+"))==NULL) {printf("can't open file!\n");exit(0);}
for(i=0;i<len;i++)
{
if(i==k) continue;/*从这个位置开始写入*/
fwrite(&xs[i],sizeof(stu),1,fp);
}
fclose(fp);
}
else {printf("删除失败!!!\n");getch();} /*失败后重新返回菜单*/
print();
}
//菜单选择
void main()
{
char ch;
while(1)
{
menu();// 显示菜单
ch=getch();//选择菜单
if(ch=='0') break;
switch(ch)//判断功能项
{
case '1':input();break;
case '2':sum();break;
case '3':search();break;
case '4':modi();break;
case '5':insert();break;
case '6':print( );break;
case '7':tongji();break;
case '8':dele();break;
}
}
printf("\n欢迎使用!!!\n");
}