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