#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Student
{
char ID[10];
char Name[25];
char banji[20];
int gs;
int wy;
int wl;
int cx;
int sx;
int zz;
};
struct Student stu[1000];
int num = 0;
void main()//程式主入口
{
void welcome();//主選單
void cjyl(); //成績預覽
int xhcx(int n); //學號查詢
int xmcx(int n);//姓名查詢
void zjcj(); //增加成績
void sccj(); //洗掉成績
void ggcj();//更改成績
void weltocome();//子選單
void cjcx();//成績查詢
int Bh;
while (1)
{
welcome();
printf("請選擇編號功能編號輸入(1-6):");
scanf("%d", &Bh);
while (Bh<1 || Bh>6)
{
printf("請輸入正確的功能編號(1-6):");
scanf("%d", &Bh);
}
switch (Bh)
{
case 1:
cjyl();
getchar();
break;
case 2:
cjcx();
getchar();
break;
case 3:
zjcj();
getchar();
break;
case 4:
sccj();
getchar();
break;
case 5:
ggcj();
getchar();
break;
case 6:
exit(0);
break;
}
}
}
void welcome()
{
printf("**********歡迎使用學生成績管理系統!********** \n");
printf(" 功能選單 \n");
printf(" 1.成績預覽 \n");
printf(" 2.成績查詢 \n");
printf(" 3.增加成績 \n");
printf(" 4.洗掉成績 \n");
printf(" 5.更改成績 \n");
printf(" 6.退出 \n");
printf("******************感謝使用******************** \n");
}
void cjyl()//成績預覽
{
int i;
printf("成績資訊如下:\n");
FILE *fp;
fp=fopen("2221.txt","r");
if(fp==NULL)
{
printf("打開檔案失敗,請重試!\n");
fclose(fp); //關閉檔案
exit(0) ;
}
printf("學號\t姓名\t班級\t高數\t外語\t物理\t程式\t思修\t中傳\n");
while(!feof(fp))//feof判段fp所指的檔案是不是結束
{
fscanf(fp,"%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d",&stu[i].ID,stu[i].Name,stu[i].banji,&stu[i].gs,&stu[i].wy,&stu[i].wl,&stu[i].cx,&stu[i].sx,&stu[i].zz);
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);
}
fclose(fp);
printf("顯示完畢 ,請按任意鍵回傳\n");
getchar();
return;
}
void weltocome()
{
printf("**********歡迎使用學生成績管理系統!********** \n");
printf(" 功能子選單 \n");
printf(" 1.姓名查詢 \n");
printf(" 2.學號查詢 \n");
printf(" 3.回傳子選單 \n");
printf("******************感謝使用******************** \n");
}
void cjcx()//成績查詢選單
{
int k;
while(1)
{
weltocome();
printf("請選擇編號功能編號輸入(1-3):");
scanf("%d",&k);
while(k<1 || k>3)
{
printf("請輸入正確編號:");
scanf("%d",&k);
}
switch(k)
{
case 1:
xmcx();
getchar();
break;
case 2:
xhcx();
getchar();
break;
case 3:
main();
break;
}
}
}
int xmcx(int n)//姓名查詢
{
int i;
char sname[25];
printf("請輸入你要查詢學生的姓名:");
scanf("%s",&sname);
FILE *fp;
fp=fopen("2221.txt ","r");
if(fp==NULL)
{
printf("打開檔案失敗!\n");
exit(0);
}
for(i=1;;)
{
if(strcmp(sname, stu[i].Name) == 0)
{
//while(!feof(fp))
fscanf(fp,"%s %s %s %d %d %d %d %d %d",stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);
printf("學號:%d\t", stu[i].ID);
printf("姓名:%s\t", stu[i].Name);
printf("班級:%s\t", stu[i].banji);
printf("高數:%d\t", stu[i].gs);
printf("外語:%d\t", stu[i].wy);
printf("物理:%d\t", stu[i].wl);
printf("程式:%d\t", stu[i].cx);
printf("思修:%d\t", stu[i].sx);
printf("中傳:%d\t\n", stu[i].zz);
getchar();
}
else
printf("沒有該同學\n");
break;
getchar();
}
fclose(fp);
getchar();
return ;
}
int xhcx(int n)//學號查詢
{
int i;
char sid[10];
printf("請輸入你要查詢學生的學號:");
scanf("%s",&sid);
FILE *fp;
fp=fopen("2221.txt ","r");
if(fp==NULL)
{
printf("打開檔案失敗!\n");
exit(0);
}
for(i=0;i<n;i++)
{
if(strcmp(sid, stu[i].ID) == 0)
{
while(!feof(fp))
fscanf(fp,"%s %s %s %d %d %d %d %d %d",stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);
printf("學號:%d\t", stu[i].ID);
printf("姓名:%s\t", stu[i].Name);
printf("班級:%s\t", stu[i].banji);
printf("高數:%d\t", stu[i].gs);
printf("外語:%d\t", stu[i].wy);
printf("物理:%d\t", stu[i].wl);
printf("程式:%d\t", stu[i].cx);
printf("思修:%d\t", stu[i].sx);
printf("中傳:%d\t\n", stu[i].zz);
getchar();
}
else
printf("沒有該同學\n");
break;
getchar();
}
fclose(fp);
getchar();
return ;
}
void zjcj()//增加成績
{
int i;
FILE *fp;
fp=fopen("2221.txt","a+"); //at+讀寫打開一個文本,允許讀寫資料。
if(fp==NULL)
{
printf("打開檔案失敗,請重試!\n");
fclose(fp); //釋放指標,可以理解為關閉檔案
exit(0);
}
for(i=1;;)//while (1)
{
printf("請輸入學號:");
scanf("%d", &stu[i].ID);
printf("請輸入姓名:");
scanf("%s", &stu[i].Name);
printf("請輸入班級:");
scanf("%s", &stu[i].banji);
printf("請輸入高數:");
scanf("%d", &stu[i].gs);
printf("請輸入外語:");
scanf("%d", &stu[i].wy);
printf("請輸入物理:");
scanf("%d", &stu[i].wl);
printf("請輸入程式:");
scanf("%d", &stu[i].cx);
printf("請輸入思修:");
scanf("%d", &stu[i].sx);
printf("請輸入中傳:");
scanf("%d", &stu[i].zz);
getchar();
fprintf(fp,"%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);
fclose(fp);
printf("是否繼續輸入(y/n):");
if (getchar() == 'n' || getchar() == 'N')
break;
}
}
void sccj()//洗掉成績
{
char sid[10];
int flag = 0;//找到后標記
int i;
FILE *fp;
fp=fopen("2221.txt","r");
if(fp==NULL)
{
printf("打開檔案失敗,請重試!\n");
fclose(fp);
exit(0);
}
while (1)
{
printf("請輸入將要洗掉資訊的學生學號:");
scanf("%s", &sid);
getchar();
int i,j;
while (1)
{
for ( i = 0; i <= num; i++)
{
if ((strcmp(sid, stu[i].ID))==0)
{
for ( j = i; j < (num); j++)
{
stu[j] = stu[j + 1];
}
flag = 1;
num = num - 1;
break;
}
}
if (flag == 0)
{
printf("對不起,沒有這位學生!");
break;
}
break;
}
printf("是否繼續洗掉(y/n):");
if (getchar() == 'n'|| getchar() == 'N')
break;
}
}
void ggcj()//更改成績
{
char sid[10];
int i = 0;
int flag = 0;
while (1)
{
printf("請輸入需要更改成績的學生學號:");
scanf("%s", &sid);
getchar();
while (1)
{
for (i = 0; i <= num; i++)
{
if (strcmp(sid, stu[i].ID) == 0)
{
printf("請重新輸入高數總分:");
scanf("%d", &stu[i].gs);
printf("請重新輸入外語總分:");
scanf("%d", &stu[i].wy);
printf("請重新輸入物理總分:");
scanf("%d", &stu[i].wl);
printf("請重新輸入程式總分:");
scanf("%d", &stu[i].cx);
printf("請重新輸入思修總分:");
scanf("%d", &stu[i].sx);
printf("請重新輸入中傳總分:");
scanf("%d", &stu[i].zz);
getchar();
flag = 1;
break;
}
}
if (flag == 0)
{
printf("對不起,沒有這位學生!");
break;
}
else
{
flag = 0;
break;
}
}
printf("是否繼續修改(y/n):");
if (getchar() == 'n'|| getchar() == 'N')
break;
}
}
因為是新手,有許多地方不懂,希望各位大佬能夠幫忙看一下代碼的問題
uj5u.com熱心網友回復:
有什么問題嗎?是編譯不通過嗎?uj5u.com熱心網友回復:
先按照自己的想法寫寫,不明白的再問吧uj5u.com熱心網友回復:
while (Bh<1 || Bh>6){
printf("請輸入正確的功能編號(1-6):");
scanf("%d", &Bh);
}
switch (Bh)
{
case 1:
cjyl();
getchar();
break;
這個可以優化,寫這種代碼多的能合在一起就合在一起,就不用占用別的資源了,這里用while判斷不如直接在switc里default,這個就是除了上面csae之外的其他情況。
if(fp==NULL)
{
printf("打開檔案失敗,請重試!\n");
fclose(fp); //關閉檔案
exit(0) ;
}
printf("學號\t姓名\t班級\t高數\t外語\t物理\t程式\t思修\t中傳\n");
while(!feof(fp))//
這里你是要重試嘛?重試應該是函式退出回傳到上一界面,你這里直接把程式退出是沒有重試了的,if判斷了不存在return回去下面寫存在是可以的,但是規范一點應該把存在用else{括起來
while(!feof(fp))
fscanf(fp,"%s %s %s %d %d %d %d %d %d",stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);
printf("學號:%d\t", stu[i].ID);
printf("姓名:%s\t", stu[i].Name);
printf("班級:%s\t", stu[i].banji);
printf("高數:%d\t", stu[i].gs);
printf("外語:%d\t", stu[i].wy);
printf("物理:%d\t", stu[i].wl);
printf("程式:%d\t", stu[i].cx);
printf("思修:%d\t", stu[i].sx);
printf("中傳:%d\t\n", stu[i].zz);
getchar();
讀檔案這里你是判斷存不存在然后去讀這一個資訊吧?那只要讀那一次就可以了,還有你這里都用了getchar,這個在檔案操作中用不到吧,按照格式寫再按照格式讀就好了,除非你寫的時候寫完了又寫了一個符號進去。寫的時候看你一個個傳還要制表,有這個必要嘛?如果檔案不會單獨打開的話盡量直接傳結構體,一個結構體傳進去,一個結構體讀出來,這樣不會出錯,讀和寫是要求保持一致的
你的洗掉本來想講的,但是看到你的num覺得也行,但是往上翻了一下,你的添加成績num沒有做改變啊。細節一定要注意,不然你這個怎么運行都不行那豈不是難受?
uj5u.com熱心網友回復:
謝謝大家的回答轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/30911.html
標籤:C語言
上一篇:C語言,學生管理系統求助
下一篇:服務器與客戶端資料傳輸問題
