鱼C论坛

 找回密码
 立即注册
查看: 1191|回复: 2

[技术交流] 用C语言写成的控制台学籍管理系统(简单版)

[复制链接]
发表于 2020-6-24 14:06:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jhanker 于 2020-6-24 14:45 编辑

注意:由于我的账号没有上传附件及图片的权限,只能让大家自己复制代码到VC++环境想自行编译!

用C语言写成的控制台学籍管理系统(简单版)
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX_LEN 10 /* 字符串最大长度 */ 
#define STU_NUM 30 /* 最多的学生人数 */ 
#define COURSE_NUM 6 /* 最多的考试科目数 */ 
typedef struct student 
{ 
 long num; /* 每个学生的学号 */ 
 char name[MAX_LEN]; /* 每个学生的姓名 */ 
 float score[COURSE_NUM]; /* 每个学生 COURSE_NUM 门功课的成绩 */ 
 float sum; /* 每个学生的总成绩 */ 
 float aver; /* 每个学生的平均成绩 */ 
}STU;
STU stu[STU_NUM];
//int n; 
int Menu(); /*选择菜单函数原型*/ 
void ReadScore(STU stu[], int n, int m); /*输入成绩函数原型*/ 
void AverSumofEveryStudent(STU stu[], int n, int m); 
 /*求每个学生各门课程平均成绩函数原型*/ 
void AverSumofEveryCourse(STU stu[], int n, int m); 
 /*求每门课程平均成绩函数原型*/ 
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b)); 
 /*成绩排序函数原型*/ 
int Ascending(float a, float b); /*升序排序函数原型*/ 
int Descending(float a, float b); /*降序排序函数原型*/ 
void SwapFloat(float *x, float *y); /*交换两个浮点数函数原型*/ 
void SwapLong(long *x, long *y); /*交换两个长整型数函数原型*/ 
void SwapChar(char x[], char y[]); /*交换两个字符数组函数原型*/ 
void AsSortbyNum(STU stu[], int n, int m); /*交换两个字符数组函数原型*/ 
void SortbyName(STU stu[], int n, int m); /*按姓名字典顺序排序函数原型*/ 
void SearchbyNum(STU stu[], int n, int m); /*按学号查询成绩函数原型*/ 
void SearchbyName(STU stu[], int n, int m); /*按姓名查询成绩函数原型*/ 
void StatisticAnalysis(STU stu[], int n, int m); /*统计分析函数原型*/ 
void PrintScore(STU stu[], int n, int m); /*输出成绩函数原型*/ 
void WritetoFile(STU record[], int n, int m); /*向文件写数据函数原型*/ 
void ReadfromFile(STU record[], int *n, int *m); /*从文件读数据函数原型*/
void add(STU stu[], int *n, int m);
void delscore(STU stu[], int *n, int m); 
int main() 
{ 
 char ch; /*ch 是菜单选项*/ 
 int n = 0, m = 0; /* 学生人数为 n,课程门数为 m */ 
 STU stu[STU_NUM]; /*定义结构体数组 stu[]*/ 
 while (1) 
 { 
 ch = Menu(); /* 显示菜单,并读取用户输入 */ 
 switch (ch) 
{
 case 1:printf("请输入学生人数 n(n<%d):", STU_NUM);
 scanf("%d", &n); /*输入学生人数*/ 
 printf("请输入课程数 m(m<=%d):",COURSE_NUM); 
 scanf("%d", &m); /*输入课程数*/ 
 ReadScore(stu, n, m); /*输入 n 个学生 m 各门课程成绩*/ 
 break; 
 case 2: AverSumofEveryCourse(stu, n, m); /*求每个学生 m 门课程平均成绩*/ 
 break; 
 case 3: AverSumofEveryStudent(stu, n, m); /*求每门课程平均成绩*/ 
 break; 
 case 4: SortbyScore(stu, n, m, Descending); /*按降序排序成绩*/ 
 printf("\n 成绩按降序排序结果:\n"); 
 PrintScore(stu, n, m); 
 break; 
 case 5: SortbyScore(stu, n, m, Ascending); /*按升序排序成绩*/ 
 printf("\n 成绩按升序排序结果:\n"); 
 PrintScore(stu, n, m); 
 break; 
 case 6: AsSortbyNum(stu, n, m); /*按学号升序排序*/ 
 printf("\n 成绩按学号升序排序结果:\n"); 
 PrintScore(stu, n, m); 
 break; 
 case 7: SortbyName(stu, n, m); /*按姓名字典顺序排序*/ 
 printf("\n 成绩按姓名字典顺序排序结果:\n"); 
 PrintScore(stu, n, m); 
 break; 
 case 8: SearchbyNum(stu, n, m); /*按学号查询成绩*/ 
 break; 
 case 9: SearchbyName(stu, n, m); /*按学号查询成绩*/ 
 break; 
 case 10: StatisticAnalysis(stu, n, m); /*统计分析*/ 
 break; 
 case 11:PrintScore(stu, n, m); /*输出成绩*/ 
 break; 
 case 12:add(stu, &n, m);
 break; 
 case 13:delscore(stu, &n, m); 
 break; 
 case 14:WritetoFile(stu, n, m); /*向文件写数据*/ 
 break;
 case 15:ReadfromFile(stu, &n, &m); /*从文件读数据*/ 
 break;

 case 0: printf("程序结束!\n"); 
 exit(0); 
 default:printf("输入菜单序号错误!"); 
 } 
 } 
return 0;
} 
/* 函数功能:显示菜单并获得用户键盘输入的选项 */ 
int Menu() 
{ 
 int itemSelected; 
 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"); 
 printf("12.添加学生成绩\n"); 
 printf("13.删除学生成绩\n");
 printf("14.从文件读数据\n");
 printf("15.向文件写数据\n");
 printf("0.退出系统\n"); 
 printf("请输入你的选择:"); 
 scanf("%d", &itemSelected); /* 读入用户输入 */ 
 return itemSelected; 
} 
/* 函数功能:输入 n 个学生的 m 门课成绩 */ 
void ReadScore(STU stu[], int n, int m) 
{ 
 int i, j; 
 printf("请顺序输入每个学生的学号、姓名和成绩::\n"); 
 printf("学号 姓名 "); 
 //输出标题行中的学号(学号后面留 6 个空格)、姓名(姓名后面留 4 个空格) 
 for (j=0; j<m; j++) 
 { 
 printf("课程%d ", j+1); //输出标题行中的课程名 
 } 
 printf("\n"); 
 for (i=0; i<n; i++) 
 { 
 scanf("%ld%s", &stu[i].num, stu[i].name); 
 for (j=0; j<m; j++) 
 { 
 scanf("%f", &stu[i].score[j]); 
 } 
}
} 
/* 函数功能:计算每个学生各门课程的总分和平均分 */ 
void AverSumofEveryStudent(STU stu[], int n, int m) 
{ 
 int i, j; 
 for (i=0; i<n; i++) 
 { 
 stu[i].sum = 0; 
 for (j=0; j<m; j++) /*依次计算一个学生 m 门课程总分*/ 
 { 
 stu[i].sum = stu[i].sum + stu[i].score[j]; 
 } 
 stu[i].aver = m>0 ? stu[i].sum / m : -1; /*计算平均成绩*/ 
 printf("学生%d: 总分 = %.0f, 平均分 = %.0f\n", 
 i+1, stu[i].sum, stu[i].aver); 
 } 
} 
/* 函数功能:计算每门课程的总分和平均分 */ 
void AverSumofEveryCourse(STU stu[], int n, int m) 
{ 
 int i, j; 
 float sum[COURSE_NUM], aver[COURSE_NUM];/*定义课程总分数组和平均分数组*/ 
 for (j=0; j<m; j++) 
 { 
 sum[j] = 0; 
 for (i=0; i<n; i++) /*计算一门课程的总分*/ 
 { 
 sum[j] = sum[j] + stu[i].score[j]; 
 } 
 aver[j] = n>0 ? sum[j] / n : -1; /*计算一门课程的平均分*/ 
 printf("课程%d 总分=%.0f,平均分=%.0f\n",j+1,sum[j],aver[j]); 
 } 
} 
/* 函数功能:按选择法将数组 sum 的元素值排序 */ 
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b)) 
{ 
 int i, j, k, t; 
 for (i=0; i<n-1; i++) 
 { 
 k = i; 
 for (j=i+1; j<n; j++) 
 { 
 if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
 if (k != i)
 { 
 for (t=0; t<m; t++) /* 交换 m 门课程的成绩 */ 
 { 
 SwapFloat(&stu[k].score[t], &stu[i].score[t]); 
 } 
 SwapFloat(&stu[k].sum, &stu[i].sum); /* 交换总分 */ 
 SwapFloat(&stu[k].aver, &stu[i].aver); /* 交换平均分 */ 
 SwapLong(&stu[k].num, &stu[i].num); /* 交换学号 */ 
 SwapChar(stu[k].name, stu[i].name); /* 交换姓名 */ 
 } 
 } 
} 
/* 使数据按升序排序 */ 
int Ascending(float a, float b) 
{ 
 return a < b; /* 这样比较决定了按升序排序,如果 a<b,则交换 */ 
} 
/* 使数据按降序排序 */ 
int Descending(float a, float b) 
{ 
 return a > b; /* 这样比较决定了按降序排序,如果 a>b,则交换 */ 
} 
/* 交换两个单精度浮点型数据 */ 
void SwapFloat(float *x, float *y) 
{ 
 float temp; 
 temp = *x; 
 *x = *y; 
 *y = temp; 
} 
/* 交换两个长整型数据 */ 
void SwapLong(long *x, long *y) 
{ 
 long temp; 
 temp = *x; 
 *x = *y; 
 *y = temp; 
} 
/* 交换两个字符串 */ 
void SwapChar(char x[], char y[]) 
{ 
 char temp[MAX_LEN]; 
strcpy(temp, x);
 strcpy(x, y);
 strcpy(y, temp); 
} 
/* 函数功能:按选择法将数组 num 的元素值按从低到高排序 */ 
void AsSortbyNum(STU stu[], int n, int m) 
{ 
 int i, j, k, t; 
 for (i=0; i<n-1; i++) 
 { 
 k = i; 
 for (j=i+1; j<n; j++) 
 { 
 if (stu[j].num < stu[k].num) k = j; 
 } 
 if (k != i) 
 { 
 for (t=0; t<m; t++) /* 交换 m 门课程的成绩 */ 
 { 
 SwapFloat(&stu[k].score[t], &stu[i].score[t]); 
 } 
 SwapFloat(&stu[k].sum, &stu[i].sum); /* 交换总分 */ 
 SwapFloat(&stu[k].aver, &stu[i].aver); /* 交换平均分 */ 
 SwapLong(&stu[k].num, &stu[i].num); /* 交换学号 */ 
 SwapChar(stu[k].name, stu[i].name); /* 交换姓名 */ 
 } 
 } 
} 
/* 函数功能:交换法实现字符串按字典顺序排序 */ 
void SortbyName(STU stu[], int n, int m) 
{ 
 int i, j, t; 
 for (i=0; i<n-1; i++) 
 { 
 for (j = i+1; j<n; j++) 
 { 
 if (strcmp(stu[j].name, stu[i].name) < 0) 
 { 
 for (t=0; t<m; t++)/* 交换 m 门课程的成绩 */ 
 { 
 SwapFloat(&stu[i].score[t], &stu[j].score[t]); 
 } 
 SwapFloat(&stu[i].sum, &stu[j].sum); /* 交换总分 */ 
 SwapFloat(&stu[i].aver, &stu[j].aver); /* 交换平均分 */
SwapLong(&stu[i].num, &stu[j].num); /* 交换学号 */
 SwapChar(stu[i].name, stu[j].name); /* 交换姓名 */
 } 
 } 
 } 
} 
/* 函数功能:按学号查找学生成绩并显示查找结果 */ 
void SearchbyNum(STU stu[], int n, int m) 
{ 
 long number; 
 int i, j; 
 printf("请输入要查询的学生学号:"); 
 scanf("%ld", &number); 
 printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名 
 for (j=0; j<m; j++) 
 { 
 printf("课程%d\t", j+1); //输出标题行中的课程名 
 } 
 printf("总分\t 平均分\n"); //输出标题行中的总分和平均分 
 for (i=0; i<n; i++) 
 { 
 if (stu[i].num == number) 
 { 
 printf("%ld\t%s\t", stu[i].num, stu[i].name); 
 for (j=0; j<m; j++) 
 { 
 printf("%.0f\t", stu[i].score[j]); 
 } 
 printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver); 
 return; 
 } 
 } 
 printf("\n 找不到该学号的学生!\n"); 
} 
/* 函数功能:按姓名学号查询学生成绩并显示查找结果*/ 
void SearchbyName(STU stu[], int n, int m) 
{ 
 char x[MAX_LEN]; 
 int i, j; 
 printf("请输入要查询的学生姓名:"); 
 scanf("%s", x); 
 printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名 
 for (j=0; j<m; j++) 
 {  printf("课程%d\t", j+1); //输出标题行中的课程名 
 }
 printf("总分\t 平均分\n"); //输出标题行中的总分和平均分 
 for (i=0; i<n; i++) 
 { 
 if (strcmp(stu[i].name, x) == 0) 
 { 
 printf("%ld\t%s\t", stu[i].num, stu[i].name); 
 for (j=0; j<m; j++) 
 { 
 printf("%.0f\t", stu[i].score[j]); 
 } 
 printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver); 
 return; 
 } 
 } 
 printf("\n 找不到该姓名的学生!\n"); 
} 
/* 函数功能:统计各分数段的学生人数及所占的百分比 */ 
void StatisticAnalysis(STU stu[], int n, int m) 
{ 
 int i, j, total, t[6]; 
 for (j=0; j<m; j++) 
 { 
 printf("For course %d:\n", j+1); 
 memset(t, 0, sizeof(t)); /* 将数组 t 的全部元素初始化为 0 */ 
 for (i=0; i<n; i++) 
 { 
 if (stu[i].score[j]>=0 && stu[i].score[j]<60)t[0]++; 
 else if (stu[i].score[j]<70) t[1]++; 
 else if (stu[i].score[j]<80) t[2]++; 
 else if (stu[i].score[j]<90) t[3]++; 
 else if (stu[i].score[j]<100) t[4]++; 
 else if (stu[i].score[j] == 100) t[5]++; 
 } 
 for (total=0, i=0; i<=5; i++) 
 { 
 total = total + t[i]; 
 } 
 for (i=0; i<=5; i++) 
 { 
 if (i==0) printf("不及格%d 人,占%.2f%%\n",t[i],(float)t[i]/n*100); 
 else if (i==5) printf("%d 分%d 人,占%.2f%%\n", 
 (i+5)*10,t[i],(float)t[i]/n*100);  else printf("%d 分-%d 分%d 人,占%.2f%%\n", 
 (i+5)*10, (i+5)*10+9, t[i], (float)t[i]/n*100);
 } 
 
 } 
} 
/* 函数功能: 打印学生成绩 */ 
void PrintScore(STU stu[], int n, int m) 
{ 
 int i, j; 
 printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名 
 for (j=0; j<m; j++) 
 { 
 printf("课程%d\t", j+1); //输出标题行中的课程名 
 } 
 printf("总分\t 平均分\n"); //输出标题行中的总分和平均分 
 for (i=0; i<n; i++) 
 { 
 printf("%ld\t%s\t", stu[i].num, stu[i].name); 
 for (j=0; j<m; j++) 
 { 
 printf("%.0f\t", stu[i].score[j]); 
 } 
 printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver); 
 } 
} 
/* 输出 n 个学生的学号、姓名及 m 门课程的成绩到文件 student.txt 中 */ 
void WritetoFile(STU stu[], int n, int m) 
{ 
 FILE *fp; /*定义指向文件的指针*fp*/ 
 int i, j; 
 if ((fp = fopen("student.txt","w")) == NULL) 
 /*以只写方式打开文件"student.txt"*/ 
 { 
 printf("打开文件“student.txt”失败!\n"); 
 exit(0); 
 } 
 fprintf(fp, "%d\t%d", n, m); //将学生人数和课程门数写入文件 
 /*依次向文件写入 n 个学生的学号、姓名、m 门课程的成绩、总分、平均分*/ 
 for (i=0; i<n; i++) 
 { 
 fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name); 
 for (j=0; j<m; j++) 
 {  fprintf(fp, "%10.0f", stu[i].score[j]);
 }
 fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver); 
 } 
 fclose(fp); 
 printf("学生成绩数据已保存到文件!\n"); 
} 
/*从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组 stu 中*/ 
void ReadfromFile(STU stu[], int *n, int *m) 
{ 
 FILE *fp; 
 int i, j; 
 if ((fp = fopen("student.txt","r")) == NULL) 
 /*以只写方式打开文件"student.txt"*/ 
 { 
 printf("打开文件“student.txt”失败!\n"); 
 exit(0); 
 } 
 fscanf(fp, "%d\t%d", n, m); //从文件中读出学生人数和课程门数 
 //依次将 n 个学生的学号、姓名、m 门课程的成绩、总分、平均分保存到 n 指向的存储单元 
 for (i=0; i<*n; i++) 
 { 
 fscanf(fp, "%10ld", &stu[i].num); 
 fscanf(fp, "%10s", stu[i].name); 
 for (j=0; j<*m; j++) //课程门数保存到 m 指向的存储单元 
 { 
 fscanf(fp, "%10f", &stu[i].score[j]); /*不能用%10.0f*/ 
 } 
 fscanf(fp, "%10f%10f", &stu[i].sum, &stu[i].aver);/*不能用%10.0f*/ 
 } 
 fclose(fp); 
 printf("已从文件读出学生成绩数据!\n"); 
} 
void add(STU stu[], int *n, int m)
{
        int a,i,j;
        system("cls");
        printf("请输入新增加的学生人数:\n");
        scanf("%d",&a);
        *n=*n+a;
    printf("请顺序输入每个学生的学号、姓名和成绩::\n"); 
    printf("学号 姓名 "); 
    //输出标题行中的学号(学号后面留 6 个空格)、姓名(姓名后面留 4 个空格) 
    for (j=0; j<m; j++) 
    { 
        printf("课程%d ", j+1); //输出标题行中的课程名
        } 
    printf("\n"); 
        for(i=(*n)-a;i<(*n);i++)
        {
         scanf("%ld%s", &stu[i].num, stu[i].name);
          for (j=0; j<m; j++)
           { 
            scanf("%f", &stu[i].score[j]); 
           } 
        }
        printf("添加成功!\n");
}
void delscore(STU stu[], int *n, int m)
{
        int i,j;
        long a;
        system("cls");
        printf("请输入学生学号\n");
        scanf("%ld",&a);
        for(i=0;i<(*n);i++)
        {
                if(a==stu[i].num)
                {
                  printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名 
                  for (j=0; j<m; j++) 
                   { 
                    printf("课程%d\t", j+1); //输出标题行中的课程名 
                   } 
                    printf("总分\t 平均分\n"); //输出标题行中的总分和平均分 
                        printf("%ld\t%s\t", stu[i].num, stu[i].name); 
            for (j=0; j<m; j++) 
            { 
               printf("%.0f\t", stu[i].score[j]); 
                    } 
            printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver); 
                         break;
                }
                else
                        printf("未找到该学生信息\n");
        }
                printf("是否删除该学生信息<y/n>\n");
                scanf("%s",&m);
                if(m=='y')
                {
                    for(;i<(*n);i++)
                        {
                            stu[i].num=stu[i+1].num;
                                strcpy(stu[i].name, stu[i+1].name);
                                for (j=0; j<m; j++)
                                {
                                     stu[i].score[j]=stu[i+1].score[j];
                            } 
                                stu[i].sum=stu[i+1].sum;
                                stu[i].aver=stu[i+1].aver;
                        }
                        printf("删除成功\n");
                        (*n)--;
                }
                else
                        printf("删除失败\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-14 15:51:33 | 显示全部楼层
图片发一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-14 17:48:00 | 显示全部楼层
运行图
无标题.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 07:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表