C语言——课程设计

article/2025/10/8 5:33:08

一、实验目的

  1. 了解开发环境
  2. 掌握结构体变量的定义和使用;
  3. 掌握结构体数组的定义和使用;
  4. 掌握文件输入,输出基本方法
  5. 掌握函数用法

二、实验内容

【项目1】完成以下功能的设计。

此学生成绩管理可以实现对学生成绩及基本信息进行创建、添加、删除,对已经存在的学生信息进行查询、排序、统计并保存至文件中。
设学生信息包括:姓名、学号、性别、英语、计算机、高数、平均分。除平均成绩外,其他成绩都为已知。初始同学成绩存放在文本文件datas.dat中。从文件输入学生数据,并打印出每个学生的记录(除平均成绩外)。
数据请自理,如:

数据以文本形式应该存放在datas.dat中

邓文俊			20140023	男	96	64	54	郑芬				20140024	女	69	55	77	李凯		20140026	男	88	51	50	林紫娟		20140039	女	89	64	62	游成松		20140045	男	98	82	68	雷小航		20140050	男	62	92	78	李立红		20140051	女	80	82	79	陈荣		20140052	男	71	98	63	袁春燕		20140053	女	83	81	77	冉灿		20140054	男	53	85	92	周雪莲		20140056	女	62	60	54	张小清		20140063	女	75	52	83	陈梅		20140064	女	89	99	62	郑涵		20140074	男	97	94	65

每个子功能请做成函数进行调用。

设计说明
1、菜单功能:用if else或switch做一个选择性的结构,从而实现输入相应的数字来达成与之对应的功能;反复操作直到输入0退出为止。
2、创建:定义对应的结构体,可用数组或链式结构实现,自由选择不做限定。
3、 新增学生:在适当的位置插入一个新的学生信息。如何插入,在哪里插入均自由选择,自己体会在哪里进行数据操作是高效和方便的。
4、 显示学生信息:显示出所有学生的基本信息。
5、 搜索学生信息:输入想要查看学生的姓名,如果有与之相匹配的就输出,如果没有则输出“没有该生信息”。
6、 删除学生信息:
遍历存储表,输入想删除学生信息的位置,若输入的位置为假,继续向下一个节点遍历,直到与输入的位置相符合。
遍历存储表,输入想删除的学生的学号,若存在该学生则将其删除。
7、 统计学生性别信息:通过学生的性别分别进行统计并输出。
8、 按英语成绩排序:利用冒泡排序方法,将排序结果按英语成绩的降序输出学号及英语成绩列。
9、 退出程序:输入与退出程序相匹配的数字即可。
10、进行添加或删除后的信息要重新写入datas.dat文件中

结构体定义提示:

#define NAME_NUMBER 10
#define ID_NUMBER   9
#define SEX_NUMBER  3
#define SCORE_NUMBER    3
#define MAX_STUDENT_NUMBER 100struct student
{char name[NAME_NUMBER];char id[ID_NUMBER];char sex[SEX_NUMBER];float score[SCORE_NUMBER];float averageSCore;
};
typedef struct student STUDENT;

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{char name[100];int id;char sex[100];float egl;float mat;float com;float ave;
};
typedef struct student STUDENT;STUDENT stu[100];
int getlong(STUDENT stu_[]);//获取当前学生数
int print(STUDENT stu_[]);//显示全部学生信息
int add(int n);//新增学生信息
int reserch();//查询学生信息
int delete1(int n);//删除学生信息方式一
int delete2();//删除学生信息方式二
int sexprint();//统计学生性别
int yingyusort();//按英语成绩排序
int main()
{FILE *fp = fopen("datas.dat", "r+");int i=0;if(fp == NULL){printf("can't read data from the datas.dat!\n");exit(0);}while(fscanf(fp,"%s%d%s%f%f%f",stu[i].name,&stu[i].id,stu[i].sex,&stu[i].egl,&stu[i].mat,&stu[i].com)!=EOF){i++;}printf("导入完成,学生数为:%d\n",getlong(stu));fclose(fp);int choice,n,x;while (1){printf("\n\n学生信息管理系统\n\n");printf("[0] 保存信息并退出\n\n");printf("[1] 显示学生信息		");printf("[2] 新增学生信息\n\n");printf("[3] 搜索学生信息		");printf("[4] 删除学生信息\n\n");printf("[5] 统计学生性别信息		");printf("[6] 按英语成绩排序\n\n");printf("请输入选项(0 - 6):\n");scanf("%d",&choice);switch (choice){case 1://显示;print(stu);break;case 2://新增;printf("请输入新增学生的位置:\n");scanf("%d",&n);add(n);FILE *fp1 = fopen("datas.dat", "w");for(i=0;i<getlong(stu);i++)fprintf(fp1,"%s\t%d\t%s\t%f\t%f\t%f\n",stu[i].name,stu[i].id,stu[i].sex,stu[i].egl,stu[i].mat,stu[i].com);fclose(fp1);break;case 3://搜索;reserch();break;case 4://删除printf("[1] 按学生所在位置删除该生    ");printf("[2] 按学生学号删除该生\n");scanf("%d",&x);switch(x){case 1:printf("请输入要删除学生的位置:");scanf("%d",&n);delete1(n);FILE *fp2 = fopen("datas.dat", "w");for(i=0;i<getlong(stu);i++)fprintf(fp2,"%s\t%d\t%s\t%f\t%f\t%f\n",stu[i].name,stu[i].id,stu[i].sex,stu[i].egl,stu[i].mat,stu[i].com);fclose(fp2);break;case 2:delete2();FILE *fp3 = fopen("datas.dat", "w");for(i=0;i<getlong(stu);i++)fprintf(fp3,"%s\t%d\t%s\t%f\t%f\t%f\n",stu[i].name,stu[i].id,stu[i].sex,stu[i].egl,stu[i].mat,stu[i].com);fclose(fp3);break;default:printf("您输入的菜单有误。请重新输入!\n");}break;case 5://统计学生性别sexprint();break;case 6://按英语成绩排序yingyusort();break;case 0://退出程序printf("退出程序\n");printf("程序结束,谢谢使用!\n");exit(0);default:printf("您输入的菜单有误。请重新输入!\n");}}return 0;
}
int getlong(STUDENT stu_[])
{int i,k=0;for(i=0; ;i++){if(stu_[i].id!=0)k++;else break;}return k;
}
int print(STUDENT stu_[])
{int i;for( i=0; i<getlong(stu); i++){if(stu[i].id != 0)printf("姓名:%s\t 学号:%d\t 性别:%s\t 英语:%f\t 高数:%f\t 计算机:%f\t\n", stu[i].name,stu[i].id, stu[i].sex, stu[i].egl, stu[i].mat, stu[i].com);}return 0;
}
int add(int n)
{int i,k=getlong(stu);for(i=k;i>=n;i--){stu[i]=stu[i-1];}printf("请输入学生的姓名:\n");scanf("%s",stu[n-1].name);printf("请输入学生的学号:\n");scanf("%d",&stu[n-1].id);printf("请输入学生的性别:\n");scanf("%s",stu[n-1].sex);printf("请输入学生的英语成绩:\n");scanf("%f",&stu[n-1].egl);printf("请输入学生的高数成绩:\n");scanf("%f",&stu[n-1].mat);printf("请输入学生的计算机成绩:\n");scanf("%f",&stu[n-1].com);printf("录入完成,此时学生数为:%d\n",getlong(stu));return 0;
}
int reserch()
{int i,k=getlong(stu);char name1[100];printf("请输入想要查看学生的姓名:");scanf("%s",name1);for(i=0;i<k;i++){if(strcmp(name1,stu[i].name)==0){printf("该学生的学号为:%d,性别为:%s,英语成绩:%f,高数成绩:%f,计算机成绩:%f\n",stu[i].id, stu[i].sex, stu[i].egl, stu[i].mat, stu[i].com);break;}}if(i==k)printf("对不起,查无此人\n");return 0;
}
int delete1(int n)
{int i,k=getlong(stu);if( n>0 && n<=k ){for(i=n;i<=k;i++)stu[i-1]=stu[i];stu[i].id=0;printf("删除完成,此时学生数为:%d\n",getlong(stu));}else printf("该位置为假");return 0;
}
int delete2()
{int id1,i,j,k=getlong(stu);printf("请输入想要删除学生的学号:");scanf("%d",&id1);for(i=0;i<k;i++){if(id1==stu[i].id){for(j=i;j<k-1;j++)stu[j]=stu[j+1];stu[j].id=0;printf("删除完成,此时学生数为:%d\n",getlong(stu));break;}}if(i==k)printf("对不起,查无此人\n");return 0;
}
int sexprint()
{int i,k=getlong(stu),boynum=0,girlnum=0;char boy[100]="男";char girl[100]="女";printf("男生:\n");for(i=0;i<k;i++)if(strcmp(boy,stu[i].sex)==0){printf("姓名:%s\t学号:%d\t性别:%s\t英语:%f\t高数:%f\t计算机:%f\n", stu[i].name,stu[i].id, stu[i].sex, stu[i].egl, stu[i].mat, stu[i].com);boynum++;}printf("男生总数为:%d\n",boynum);printf("女生:\n");for(i=0;i<k;i++)if(strcmp(girl,stu[i].sex)==0){printf("姓名:%s\t学号:%d\t性别:%s\t英语:%f\t高数:%f\t计算机:%f\n", stu[i].name,stu[i].id, stu[i].sex, stu[i].egl, stu[i].mat, stu[i].com);girlnum++;}printf("女生总数为:%d\n",girlnum);return 0;
}
int yingyusort()
{int i, j, k=getlong(stu);STUDENT temp;for (i = 0; i < k-1 ; i++){for (j = 0; j < k - 1 - i; j++)if (stu[j].egl < stu[j+1].egl){temp = stu[j];stu[j] = stu[j+1];stu[j+1] = temp;}}for (i = 0; i < k; i++){if(stu[i].id != 0)printf("姓名:%s\t 学号:%d\t 性别:%s\t 英语:%f\t 高数:%f\t 计算机:%f\t\n", stu[i].name,stu[i].id, stu[i].sex, stu[i].egl, stu[i].mat, stu[i].com);}return 0;
}

将每个函数调用后的运行截图附录在此:
0.保存信息并退出:
在这里插入图片描述
1.显示学生信息:
在这里插入图片描述
2.新增学生信息:
在这里插入图片描述
在这里插入图片描述
3.搜索学生信息:
在这里插入图片描述
4.按学生位置删除学生信息:
在这里插入图片描述
按学号删除学生信息:
在这里插入图片描述
在这里插入图片描述
5.统计学生性别信息:
在这里插入图片描述
6.按英语成绩排序:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/SHRRefP1.shtml

相关文章

学生成绩管理系统-C语言(附源码和课程设计报告)

学生成绩管理系统-C语言&#xff08;附源码和课程设计报告&#xff09; 这是我初学C语言时的课程设计作业&#xff0c;源码贴出来希望对有需要的小伙伴有所帮助 系统功能层次图 头文件源代码 #include<stdio.h> #include<stdlib.h> #define FILENAME"stude…

通讯录管理系统 C语言课程设计实验报告

通讯录管理系统C语言课程设计 一、实验目的 1.巩固和加深学生对C语言课程的基本知识的理解和掌握 2.掌握C语言编程和程序调试的基本技能 3.利用C语言进行基本的软件设计 4.掌握书写程序设计说明文档的能力 5.提高运用C语言解决实际问题的能力 二.程序要求 学生信息包括&#x…

C语言学生成绩管理系统(课程设计报告书)

今天再跟大家分享一份课程设计报告&#xff1a;C语言学生成绩管理系统源码 程序设计组成框图&#xff1a; #include<stdio.h> #include<conio.h> #include<malloc.h> #include<string.h>typedef struct STUDENT { char studentNumber[10];/*学生学号*/…

记录C语言课程设计报告-图书管理系统

倾心原创&#xff0c;转载请备注原文地址&#xff0c;谢谢。 主要内容&#xff1a; 图书信息包括&#xff1a;书名、作者名、ISBN号、出版单位、出版年份、价格等。试设计一个图书信息管理系统&#xff0c;使之能提供以下功能&#xff1a; &#xff08;1&#xff09;系统以菜…

C语言课程设计

《C语言课程设计》任务书 课程设计名称&#xff1a;C语言课程设计&#xff08;C Language Designing &#xff09; 课程设计学分&#xff1a;1学分 课程设计时间&#xff1a;第一学年第1学期 课程设计学时&#xff08;周数&#xff09;&#xff1a;28学时&#xff08;1周&…

C语言课程设计报告-菜单设计

源代码&#xff1a;https://blog.csdn.net/queen00000/article/details/94468911 xxx大学 C语言课程设计报告 题 目 菜单设计 专业班级 组 别 学生姓名…

连续邮资问题

1、实验环境 Visual C 6.0 2、实验目的和要求 利用回溯法解决连续邮资问题。假设某国家发行了n种不同面值的邮票并且规定每张信封上最多只允许贴m张。对于给定的n和m的值&#xff0c;给出邮票面值的最佳设计&#xff0c;使得可在1张信封上贴出从邮资1开始&#xff0c;增量为…

寄信收信问题

问题 在一个村庄里有i个人&#xff0c;他们每个人只能寄出一封信&#xff0c;接收一封信&#xff0c;并且不能给自己寄信。那么请问一共有多少种寄信收信方式。 思路 遇到此类问题&#xff0c;应该从简单的情况考虑。比如&#xff0c;当村里只有两个人的时候&#xff0c;只有…

【图论】中国邮递员问题、平面图上最大割问题的多项式时间算法

文章目录 一、中国邮递员问题1. 与欧拉回路的关系2. Edmonds-Johnson算法3. 一个例子 二、平面图上的最大割问题1. 割2. 最大割及其 N P \bold{NP} NP完全性3. 平面图上的最大割问题4. 奇回路覆盖5. 转化为一般图最大匹配6. 一个例子 三、顶点图上最大割问题的 N P \bold{NP} N…

AMPL实现中国邮递员问题,你get到了吗

本文所有代码全部使用AMPL语言实现 中国邮递员问题和旅行商问题不太相同&#xff0c;旅行商问题是不能回头的&#xff0c;而邮递员问题要求是访问所有街道&#xff0c;也就是说每个街道必须访问到。 1、哥尼斯堡七桥问题 要解出中国邮递员问题&#xff0c;首先我们一起来了解…

关于中国邮递员问题和欧拉图应用

关于中国邮递员问题和欧拉图应用 中国邮递员问题&#xff1a; 1962年有管梅谷先生提出中国邮递员问题&#xff08;简称CPP&#xff09;。一个邮递员从邮局出发&#xff0c;要走完他所管辖的每一条街道&#xff0c;可重复走一条街道&#xff0c;然后返回邮局。任何选择一条尽可…

欧拉环游和中国邮递员问题

文章目录 前言欧拉环游Fleury算法中国邮递员问题 前言 这篇文章介绍了欧拉环游的定义判定&#xff0c;Fleury算法求欧拉图中的欧拉环游&#xff0c;最后给出了中国邮递员问题的解决步骤。 欧拉环游 所谓欧拉环游就是指在一个无向图中&#xff0c;从一个点出发&#xff0c;每…

中国邮递员问题最短路径(代码+实现)

奇点需要配合LINGO进行去除&#xff0c;有需要请联系1822285076qq.com&#xff0c;需要一定费用。 总程序&#xff1a; 奇点消除lingo代码&#xff1a;

一笔画问题(中国邮递员问题)

一笔画与中国邮递员问题 一、引述 一笔画问题&#xff1a; 节点可以重复走边不可以重复走要求把所有边都走一次 欧拉图(Euler graph)&#xff1a; 从任何节点开始&#xff0c;都可以一笔画 每一个节点都是偶数价&#xff08;价数指的是从该节点能够伸出去的边的数目&#x…

用遗传算法解决中国邮递员问题

中国邮递员问题 所谓中国邮递员问题&#xff0c;见下面无向图 &#xff0c;假设邮递员初始位置在A点&#xff0c;现在他要访问所有其他4个结点以便投递邮件&#xff0c;结点与结点之间的距离已经标注在边上。问&#xff1a;邮递员应该依次访问哪些结点才能以最短路径遍历所有结…

中国邮路问题邮递员问题欧拉路径图论C++

下载链接&#xff1a;https://download.csdn.net/download/RONNIE_Zz/13094843 通路&#xff1a;在无向图中由点边交替组成的序列就是通路&#xff08;如果这个图是简单的&#xff0c;那么也可以使用点的序列来表示&#xff09;&#xff0c;如果首尾的点相同&#xff0c;则称为…

邮局问题

原题&#xff1a;POJ 1160 题意&#xff1a; 一些村庄被建立在一条笔直的高速公路边上,我们用一条坐标轴来描述这条高速公路&#xff0c;每一个村庄的坐标都是整数&#xff0c;没有两个村庄坐标相同。两个村庄间的距离&#xff0c;定义为它们的坐标值差的绝对值。我们需要在一…

c语言邮递员问题算法,中国邮递员问题的求解实例

中国邮递员问题的求解实例 前面已经讲过&#xff0c;对于欧拉图&#xff0c;可以直接用Fleury算法找出一条欧拉巡回路线&#xff1b;对于半欧拉图&#xff0c;可以先求出奇点u和v之间的最短路径P,令G G P&#xff0c;贝U G *为欧拉图&#xff0c;然后用Fleury算法来确定一个G *…

ACM图论算法—邮递员投递问题

题目描述 著名图论问题之一。邮递员从邮局出发送信&#xff0c;要求对辖区内每条街&#xff0c;都至少通过一次&#xff0c;再回邮局。在此条件下&#xff0c;怎样选择一条最短路线&#xff1f;此问题由中国数学家管梅谷于1960年首先研究并给出算法&#xff0c;故名。 中国邮…

百子作业 —— 中国邮递员问题

题目 严老师和宋老板去勘测武威市区的道路网&#xff0c;每一条路都需要勘测&#xff0c;且需要两人合作.武威市区可以近似地看成六横六纵组成的道路网&#xff0c;自西向东依次为学府路、民勤路、西关路、中关路、富民路、滨河路&#xff1b;自北向南依次为雷海路、宣武路、祁…