#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char name[10];
int num;
float c;
}stu;
void menu()
{
system("cls"); //清屏
printf("\n\n\n\n\t\t\t********* 學生成績管理系統 ***********\n");
printf("\t\t\t Time:2020年6月6日 \n");
printf("\t\t\t|==========================================|\n");
printf("\t\t\t|*************1. 錄入資訊 ***************|\n");
printf("\t\t\t|*************2. 查詢成績 ***************|\n");
printf("\t\t\t|*************3. 修改資訊 ***************|\n");
printf("\t\t\t|*************4. 添加學生 ***************|\n");
printf("\t\t\t|*************5. 洗掉成績 ***************|\n");
printf("\t\t\t|*************6. 顯示成績 ***************|\n");
printf("\t\t\t|*************7. 統計 ***************|\n");
printf("\t\t\t|*************0. 退出 ***************|\n");
printf("\t\t\t|==========================================|\n");
printf("\t\t\t|******************************************|\n");
printf("\n\n\t\t\t 請選擇相應的功能<輸入編號>:");
}
//錄入資訊
void input()
{
FILE *fp;
stu xs; /*定義一個結構體變數來裝從檔案中讀出來的資料*/
if((fp=fopen("d:\\作業\\C語言成績記錄簿\\c語言txt","wb"))==NULL)
{
printf("\nopen file error");
getchar();
exit(1);
printf("\n錄入格式: 姓名 學號 C語言 \n");
printf("當輸入姓名為 end 結束錄入\n");
while(1)
{
scanf("%s",xs.name);
if(strcmp(xs.name,"end")==0) break; //判斷姓名是否為LAST,用字串判斷
scanf("%d%f",&xs.num,&xs.c);
fwrite(&xs,sizeof(stu),1,fp); //將成績資訊寫入檔案
}
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 the 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\n","姓名","學號","C語言");
printf("%10s %6d %6.2f\n",xs.name,xs.num,xs.c,);
break;
}
}
if(feof(fp))
printf("ERROR,查找失敗!!!"); /*學生不存在*/
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 the file");exit(0);
}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(xs.num==num)/*按學號查詢時判斷輸入的學號是否存在,會回圈從資料中找取*/
{
printf(" 學生的資訊如下:\n");
printf("\n%10s %6s %6s\n","姓名","學號","C語言");
printf("%10s %6d %6.2f\n",xs.name,xs.num,xs.c);
break;
}
}
if(feof(fp))
printf("ERROR,查找失敗!!!");
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 modify1()
{
stu xs;
FILE *fp;
char name[10];
printf("\n請輸入要修改的學生姓名: ");
scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL)
{
printf("can't open the 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);
printf("\n請依次輸入 C語言 :");
scanf("%f%f%f%f",&xs.c);
break;
}
}
if(!feof(fp))
{
printf(" \n 修改后的學生的資訊如下:\n");
printf("\n%10s %6s %6s\n","姓名","學號","C語言");
printf("%10s %6d %6.2f\n",xs.name,xs.num,xs.c);
fseek(fp,-sizeof(stu),1); //負號表示后退,1表示檔案當前位置
fwrite(&xs,sizeof(stu),1,fp); //再重新寫入,同時把之前的要修改的覆寫掉
}
else
printf("\nERROR,學生不存在,修改失敗!!");
fclose(fp);
getch();
}
//修改:輸入學生的學號,查找該學生,若找到則修改該生的成績資訊,并顯示修改前后的結果;
void modify2()
{
stu xs;
FILE *fp;
int num;
printf("\n請輸入要修改的學生學號: ");
scanf("%d",&num);
if((fp=fopen("student.dat","rb+"))==NULL)
{
printf("can't open the file!\n");exit(0);
}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(xs.num==num)/*判斷輸入要修改的姓名是否存在*/
{
printf(" 修改前學生的資訊如下:\n");
printf("\n%10s %6s %6s\n","姓名","學號","C語言");
printf("%10s %6d %6.2f\n",xs.name,xs.num,xs.c);
printf("\n請依次輸入C語言");
scanf("%f%f%f%f",&xs.c);
break;
}
}
if(!feof(fp))
{
printf(" \n 修改后的學生的資訊如下:\n");
printf("\n%10s %6s %6s\n","姓名","學號","C語言");
printf("%10s %6d %6.2f\n",xs.name,xs.num,xs.c);
fseek(fp,-sizeof(stu),1);
fwrite(&xs,sizeof(stu),1,fp);
}
else
printf("\nERROR,學生不存在,修改失敗!!");
getch();
fclose(fp);
}
//選擇修改方式
void modiway()
{
char ch1;
system("cls");
printf("請輸入按何種方式修改<編號>:\n");
printf("1->姓名,2->學號:");
ch1=getchar(); /*用字符接收*/
switch(ch1) /*判斷*/
{
case '1':modify1();break;
case '2':modify2();break;
}
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 %f %f %f",&s.c);
printf("\n請輸入插入到第幾行:");scanf("%d",&k);
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("can't open the file!\n");exit(0);
}
while(!feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);/*把資料讀入到結構體陣列中*/
if(feof(fp)) break;
i++;
}
fclose(fp);
lenth=i; //記錄此時lenth最大
if(k<lenth && k>=0) /*k的位置要位于陣列范圍之內*/
{
for(j=lenth-1;j>=k;j--)
xs[j+1]=xs[j]; /*一開始j是最大的,往后移一個這樣移動避免資料被覆寫*/
xs[k]=s; /*將輸入的學生資訊加入這個k位置*/
lenth++; //增加一個學生空間,否則會少一個資料
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 the file!\n");exit(0);
}
printf("\n%10s %s %6s\n","姓名","學號","C語言");
while(!feof(fp))
{
fread(&s,sizeof(stu),1,fp); //從檔案中讀取成績資訊
if(feof(fp)) break; //判斷是否檔案尾
printf("%10s %4d %6.2f\n",s.name,s.num,s.c);
}
fclose(fp);
getch();
}
//洗掉:輸入學生姓名,若該學生存在,則洗掉,并顯示洗掉后余下的學生成績資訊
void delete1()
{
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 the 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 the 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("ERROR,洗掉失敗!!!\n");getch();} /*失敗后重新回傳選單*/
print();
}
//洗掉:輸入學生學號,若該學生存在,則洗掉,并顯示洗掉后余下的學生成績資訊
void delete2()
{
stu xs[N];
FILE *fp;
int num;
int i=0,len,k=-1/*k<0是為后面if判斷用的*/;
system("cls");
printf("\n請輸入要洗掉的學生學號: ");
scanf("%d",&num);
if((fp=fopen("student.dat","rb+"))==NULL)
{
printf("can't open the file!\n");exit(0);
}
while(!feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);
if(feof(fp)) break;
if(xs[i].num==num)
k=i;
i++;
}
fclose(fp);
//以下是洗掉后重新寫檔案
len=i;/*結構體陣列上限*/
if(k>=0)/*k>0說明找到洗掉學生位置*/
{
if((fp=fopen("student.dat","wb+"))==NULL)
{
printf("can't openfile!\n");exit(0);
}
for(i=0;i<len;i++)
{
if(i==k) continue;/*從這個位置開始寫入*/
fwrite(&xs[i],sizeof(stu),1,fp);
}
fclose(fp);
}
else {printf("ERROR,洗掉失敗!!!\n");getch();} /*失敗后重新回傳選單*/
print();
}
//洗掉
void deleteway()
{
char ch1;
system("cls");
printf("請輸入按何種方式洗掉:\n");
printf("1->姓名,2->學號:");
ch1=getchar();/*用字符接收*/
switch(ch1)/*判斷*/
{
case '1':delete1();break;
case '2':delete2();break;
}
getch();/*讓螢屏停留同時按任意鍵回傳*/
}
//統計C語言成績情況
void count()
{
int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u; //j,k,m,l分別是指各個分數段,n,p,q,r也是
FILE *fp;
stu s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指標陣列*/
system("cls");
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("can't open the file!\n");exit(0);
}
while(!feof(fp))
{
fread(&s[i++],sizeof(stu),1,fp);/*讀入資料*/
if(feof(fp)) break; //到檔案末尾中斷程式
}
t=i;i=0; //t 指最大
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("%14s %4d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c); //逐個顯示個分數段資訊
uj5u.com熱心網友回復:
}printf(" 60-79分之間:姓名 學號 C語言\n");
for(p=0;p<k;p++)
{
printf("%16s %4d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c);
}
printf(" 80-89分之間:姓名 學號 C語言\n");
for(q=0;q<l;q++)
{
printf("%16s %4d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c);
}
printf("90以上:姓名 學號 C語言\n");
for(r=0;r<m;r++)
{
printf("%12s %4d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c);
}
fclose(fp);
getch();
}
int main()
{
FILE *fp;
if((fp=fopen("d:\\作業\\C語言成績記錄簿\\c語言txt","wb"))==NULL)
{
printf("\nopen file error");
getchar();
exit(1);
}
char ch;
while(1)
{
menu();// 顯示選單
ch=getch();//選擇選單
if(ch=='0')
break;
switch(ch)//判斷功能項
{
case '1':input();break;
case '2':search();break;
case '3':modiway();break;
case '4':insert();break;
case '5':deleteway();break;
case '6':print();break;
case '7':count();break;
}
}
printf("\n\n\n\t\t\t\tWelcome to use,Goodbye!\02!\n");
return ;
}
uj5u.com熱心網友回復:
求求各位了,救救寶寶吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248213.html
標籤:C語言
下一篇:Clion無法運行
