c語言學生管理系統課程設計
Ⅰ 用c語言設計一個學生信息查詢系統程序
1、首先創建一個c語言項目。然後旁汪者右鍵頭文件,創建一個Stu的頭文件。

Ⅱ 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 <stdio.h> 
#include <stdlib.h> 
#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); 
}
Ⅲ c語言課程設計學生成績管理系統。 學生基本信息包括學號,姓名,性別,三門成績,請編程序,實現如下功能:
臨時寫的,沒有編譯,應該差不離。
 
#include <stdio.h>
#define MAX_CORE_NUM 3
#define MAX_STU_NUM 100
struct stu_info_t
{
    int no;
    char name[50];
    int is_male;
    int core[MAX_CORE_NUM];
    int core_total;
    int rank;
};
int class_min_stu[MAX_CORE_NUM];
int class_max_stu[MAX_CORE_NUM];
struct stu_info_t stu_info[MAX_STU_NUM];
int stu_num = 0;
int input_stu_info()
{
    char q = 0;
    int i = 0;
    int j = 0;
    char c = 0;
    
    printf("請輸入所有學生信息:\n");
    i = 0;
    while (q != 'q' && q != 'Q' && i < MAX_STU_NUM)
    {
        printf("學號:");
        scanf("%d", &(stu_info[i].no));
        printf("姓名:");
        scanf("%s", stu_info[i].name);
        printf("性別(M/m - 男生,F/f - 女生):");
        scanf("%c", &c);
        if (c == 'M' || c == 'c')
            stu_info[i].is_male = 1;
        else
            stu_info[i].is_male = 0;
        stu_info[i].core_total = 0;
        for (j = 0; j < MAX_CORE_NUM; j++)
        {
            printf("課程%d得分:", j+1);
            scanf("%d", &(stu_info[i].core[j]));
            stu_info[i].core_total += stu_info[i].core[j];
        }
        i++;
        if (i >= MAX_STU_NUM)
        {
            printf("最多輸入%d個學生信息\n", MAX_STU_NUM);
            break;
        }
        printf("退出(Q/q):");
        scanf("%c", &q);
    }
    stu_num = i;
    return 0;
}
int save_stu_info()
{
    int i = 0;
    int j = 0;
    FILE * fp = NULL;
    fp = fopen("students.txt", "rw");
    if (fp == NULL)
        return -1;
    fprintf(fp, "\t學號\t姓名\t性別");
    for (j = 0; j < MAX_CORE_NUM; j++)
    {
        fprintf(fp, "\t課程%d", j+1);
    }
    fprintf(fp, "\r\n");
    for (i = 0; i < stu_num; i++)
    {
        fprintf(fp, "\t%d\t%s\t%s", stu_info[i].no, stu_info[i].name, (stu_info[i].is_male ? "男" : "女"));
        for (j = 0; j < MAX_CORE_NUM; j++)
        {
            fprintf(fp, "\t%d", stu_info[i].core[j]);
        }
        fprintf(fp, "\r\n");
    }
    fclose(fp);
    return 0;
}
int cal_rank()
{
    int i = 0;
    int j = 0;
    int class_min;
    int class_max;
    struct stu_info_t t;
    for (i = 0; i < stu_num - 1; i++)
    {
        for (j = i + 1; j < stu_num; j++)
        {
            if (stu_info[i].core_total < stu_info[j].core_total)
            {
                memcpy(&t, &stu_info[j], sizeof(struct stu_info_t));
                memcpy(&stu_info[j], &stu_info[i], sizeof(struct stu_info_t));
                memcpy(&stu_info[i], &t, sizeof(struct stu_info_t));
            }
        }
    }
    for (i = 0; i < stu_num; i++)
    {
        stu_info[i].rank = i + 1;
    }
    for (j = 0; j < MAX_CORE_NUM; j++)
    {
        class_min = 0;
        class_max = 10000;
        for (i = 0; i < stu_num; i++)
        {
            if (stu_info[i].core[j] < class_min)
            {
                class_min = stu_info[i].core[j];
                class_min_stu[j] = i;
            }
            if (stu_info[i].core[j] > class_max)
            {
                class_max = stu_info[i].core[j];
                class_max_stu[j] = i;
            }
        }
    }
    return 0;
}
int output_total()
{
    int i = 0;
    printf("\t學號\t姓名\t總分\t排名\n");
    for (i = 0; i < stu_num; i++)
    {
        printf("\t%d\t%s\t%d\t%d\n", stu_info[i].no, stu_info[i].name, stu_info[i].core_total, stu_info[i].rank);
    }
    return 0;
}
int output_class()
{
    int i = 0;
    int j = 0;
    int core = 0;
    for (j = 0; j < MAX_CORE_NUM; j++)
    {
        core = stu_info[class_max_stu[j]].core[j];
        printf("課程%d最高分:%d\n", j+1, core);
        printf("\t學號\t姓名\n");
        for (i = 0; i < stu_num; i++)
        {
            if (stu_info[i].core[j] == core)
            {
                printf("\t%d\t%s\n", stu_info[i].no, stu_info[i].name);
            }
        }
    }
    for (j = 0; j < MAX_CORE_NUM; j++)
    {
        core = stu_info[class_min_stu[j]].core[j];
        printf("課程%d最低分:%d\n", j+1, core);
        printf("\t學號\t姓名\n");
        for (i = 0; i < stu_num; i++)
        {
            if (stu_info[i].core[j] == core)
            {
                printf("\t%d\t%s\n", stu_info[i].no, stu_info[i].name);
            }
        }
    }
    return 0;
}
void main()
{
    input_stu_info();
    save_stu_info();
    cal_rank();
    output_total();
    output_class();
    return;
}
Ⅳ c語言課程設計 學生成績管理系統
#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 
int shoudsave=0; /* */ 
struct student 
{ 
char num[10];/* 學號 */ 
char name[20]; 
char class[10];
char term[2];
int ygrade;
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\%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->data.name,p->data.class,p->data.term,p->data.ygrade,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.class);
getchar(); 
printf("請你輸入學期:");
scanf("%s",p->data.term);
getchar(); 
printf("請你輸入語文成績:");
scanf("%d",&p->data.ygrade);
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.ygrade+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.class);
scanf("%s",p->data.class);
getch();
printf("請你輸入新學期(原來是%s):",p->data.term);
scanf("%s",p->data.term);
getchar();
printf("請你輸入新的語文成績(原來是%d分):",p->data.ygrade);
scanf("%d",&p->data.ygrade);
getchar(); 
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,*pa; /* 用於指向不及格學生的接點 */
Node *r=l->next; 
if(!r) 
{ 
printf("\n=====>提示:沒有資料可以統計!\n"); 
return ; 
} 
pm=pe=pc=pa=r;
while(r!=NULL) 
{ 
if(r->data.ygrade<60)
pa=r;
if(r->data.cgrade<60)
pc=r; 
if(r->data.mgrade<60)
pm=r; 
if(r->data.egrade<60)
pe=r; 
r=r->next;
} 
printf("------------------------------統計結果--------------------------------\n"); 
printf("語文不及格:\t%s %d分\n",pe->data.name,pe->data.ygrade);
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;
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; 
} 
} 
}
Ⅳ c語言課程設計學籍管理系統
這個是我曾經做的,上面功課和你的不一樣,把漢字改下就行了,還有那個人數,人數和排名最後一名數字一樣,你運行一下就清楚了
#include<stdio.h>
#include<malloc.h>
#define M "%-6s%-6d%-6d%-6d%-6d%-6d%-7d%-6d\n"
#define H p->name,p->num,p->grade.Escore,p->grade.Mscore,p->grade.Cscore,p->grade.Pscore,p->grade.Allscore,p->grade.Allrank
typedef struct score{
	int Escore;
	int Mscore;
	int Cscore;
	int Pscore;
	int Allscore;
	int Allrank;
}Sco;
typedef struct student{
	char name [20];
	int  num;
	struct score grade;
	struct student *next;
}*stu;
struct student *Create(struct student *head)
{
	int i,n;
	printf("請輸入學生個數;");
	scanf("%d",&n);
	printf("請輸入信息和成績\n");
	printf("姓名,學號,英語,高數,C語言,體育:");
    printf("\n");
	stu p,q;
    p=q=(stu)malloc(sizeof(student));
    head=p;
	for(i=0;i<n;i++)
	{
		p->next=q;
		p=q;
		scanf("%s%d%d%d%d%d",q->name,&q->num,&q->grade.Escore,&q->grade.Mscore,&q->grade.Cscore,&q->grade.Pscore);
		q->grade.Allscore=q->grade.Escore+q->grade.Mscore+q->grade.Cscore+q->grade.Pscore;
        q=(stu)malloc(sizeof(student));
	}
	p->next=NULL;
	return head;
}
struct student *Change(struct student *head)
{
	int n,i,k;
	stu p;
	p=head;
	printf("請輸入要修改的學號:");
	scanf("%d",&i);
	printf("1.英語  2.高數  3.C語言  4.體育\n");
	printf("請輸入要修改的成績:");
    scanf("%d",&n);
	while(p)
	{
	if(i==p->num)
	switch(n)
	{
	    case 1:
			printf("請輸入英語分數:");
		    scanf("%d",&k);
            p->grade.Escore=k;
		    break;
		case 2:
			printf("請輸入高數分數:");
		    scanf("%d",&k);
            p->grade.Mscore=k;
		    break;
		case 3:
	        printf("請輸入C語言分數:");
		    scanf("%d",&k);
            p->grade.Cscore=k;
		    break;
        case 4:
	        printf("請輸入體育分數:");
		    scanf("%d",&k);
            p->grade.Pscore=k;
		    break;
	}
	if(i==p->num) break;
	if(p->next)
	p=p->next;
	}
    p->grade.Allscore=p->grade.Escore+p->grade.Mscore+p->grade.Cscore+p->grade.Pscore;
	return head;
}
struct student *Insert(struct student *head)
{
	stu p,q;
	p=q=(stu)malloc(sizeof(student));
p=head;
	printf("請輸入姓名和學號:\n");
	scanf("%s%d",q->name,&q->num);
	printf("請輸入英語,高數,C語言,體育成績:\n");
	scanf("%d%d%d%d",&q->grade.Escore,&q->grade.Mscore,&q->grade.Cscore,&q->grade.Pscore);
    q->grade.Allscore=q->grade.Escore+q->grade.Mscore+q->grade.Cscore+q->grade.Pscore;
	while(p->next)
	{
		p=p->next;
	}
	p->next=q;
	p=p->next;
    p->next=NULL;
	return head;
}
struct student *Delet(struct student *head) 
{
	stu p,q,m;
	int n;
	printf("請輸入要刪除的學號:");
	scanf("%d",&n);
	p=head;
	if(n==p->num)
	{
		q=p;
		head=p->next;
		free(p);
	}
	else
	{
		q=p->next;
		while(q)
				if(q->next==NULL&&n==q->num)
				{
					m=q;
			        free(q);
			        p->next=NULL;
					q=NULL;
				}
				else if(q->next!=NULL&&n==q->num)
					{
					    p->next=q->next;
                        free(q);
						q=NULL;			      
					}
				else
				{
					if(q->next!=NULL)
					{
						p=q;
						q=q->next;	
					}
				}                  
	}
	return head;
}
void Look(struct student *head)
{
	stu p;
	int n,i,k;
	p=head;
	printf("1.按學號查找  2.按分數查找\n");
	printf("請輸入查找的類別:");
	scanf("%d",&n);
	if(n==1)
	{
		printf("請輸入要查找的學號:");
		scanf("%d",&i);
        while(p)
		{
			if(i==p->num)
			{
				printf("姓名 學號  英語  高數  C語言 體育  總成績 排名\n");
                printf(M,H);
			}
			if(i==p->num) break;
			if(p->next)
				p=p->next;
		}
	}
	if(n==2)
	{
		printf("1.英語  2.高數  3.C語言  4.體育 5.總分\n");
		printf("請輸入要查找的課程:");
		scanf("%d",&i);
		switch(i)
		{
		case 1:
			printf("請輸入要查找的英語最低分數:");
		    scanf("%d",&k);
			printf("姓名 學號  英語  高數  C語言 體育  總成績 排名\n");
            while(p)
			{
				if(k<=p->grade.Escore)
					printf(M,H);
				p=p->next;
			}
		    break;
		case 2:
			printf("請輸入要查找的高數最低分數:");
		    scanf("%d",&k);
			printf("姓名 學號  英語  高數  C語言 體育  總成績 排名\n");
            while(p)
			{
				if(k<=p->grade.Mscore)
					printf(M,H);
				p=p->next;
			}
		    break;
		case 3:
	       	printf("請輸入要查找C語言語最低分數:");
		    scanf("%d",&k);
		    printf("姓名 學號  英語  高數  C語言 體育  總成績 排名\n");
            while(p)
			{
				if(k<=p->grade.Cscore)
					printf(M,H);
				p=p->next;
			}
		    break;
        case 4:
	       	printf("請輸入要查找的體育最低分數:");
		    scanf("%d",&k);
		    printf("姓名 學號  英語  高數  C語言 體育  總成績 排名\n");
            while(p)
			{
				if(k<=p->grade.Pscore)
					printf(M,H);
				p=p->next;
			}
		    break;
        case 5:
	       	printf("請輸入要查找的總分最低分數:");
		    scanf("%d",&k);
			printf("姓名 學號  英語  高數  C語言 體育  總成績 排名\n");
            while(p)
			{
				if(k<=p->grade.Allscore)
					printf(M,H);
				p=p->next;
			}
		    break;
		}
	}
}
struct student *Rank(struct student *head,struct student *p,int j)
{
	int i;
	stu q;
	i=p->grade.Allscore;
	q=head;
	while(q)
	{
		if(q->grade.Allscore>i)
			j++;
		if(!q->next)break;
		q=q->next;
	}
p->grade.Allrank=j;
	while(p)
	{
		if(!p->next)break;
		{
		p=p->next;
		Rank(head,p,1);
		}
	}
   return head;
}
void Rankshow(struct student *head,int j)
{
	int i;
	stu p,q;
	q=head;
	p=head;
	i=j;
    printf("姓名 學號  英語  高數  C語言 體育  總成績 排名\n");
	while(q)
	{
		while(p)
			if(i==p->grade.Allrank)
			{
				printf(M,H);
				p=p->next;
			}
			else
				p=p->next;
		p=head;
		i++;
		if(!q->next)break;
		q=q->next;
	}
}
void show(struct student *head)
{
	stu p;
	printf("姓名 學號  英語  高數  C語言 體育  總成績 排名");
	printf("\n");
    p=head;
	while(p)
	{    
		printf(M,H);
        p=p->next;
	}
}
void main()
{
	int n; 
	struct student *head,*p;
	stu L;
	printf("綜合素質測評系統\n");
        printf("1.數據錄入\n");
        printf("2.數據修改\n");
        printf("3.插入操作\n");
	printf("4.刪除操作\n");
	printf("5.查找操作\n");
	printf("6.排序操作\n");
	printf("7.數據顯示\n");
	printf("0.退出系統\n");
	printf("請輸入操作:");
	scanf("%d",&n);
	while(n!=0)
	{
	switch(n)
	{
	case 0:
		break;
	case 1:
		L=Create(head);
		Rank(L,L,1);
		printf("請輸入操作:");
		break;
	case 2:
		Change(L);
		Rank(L,L,1);
		printf("請輸入操作:");
		break;
	case 3:
		L=Insert(L);
		Rank(L,L,1);
		printf("請輸入操作:");
		break;
	case 4:
		L=Delet(L);
		Rank(L,L,1);
		printf("請輸入操作:");
		break;
	case 5:
		Look(L);
		printf("請輸入操作:");
		break;
	case 6:
		Rank(L,L,1);
		Rankshow(L,1);
		printf("請輸入操作:");
		break;
	case 7:
		show(L);
		printf("請輸入操作:");
		break;
	}
	scanf("%d",&n);
	}	
}
