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");
}