- 软件功能描述
功能模块图
2.信息管理模块
功能说明:输入、增加、删除、修改学生信息同时返回上一级
- 查询模块
功能说明:根据性别民族等查找学生人数、按照课程最高分查询学生信息、按照课程统计学生的平均分数同时返回上一级
- 成绩排序模块
功能说明:根据课程对学生成绩进行排序
- 保存学生信息模块
功能说明:通过该选项将学生信息保存至同目录下students.txt文件中
- 退出模块
功能说明:通过该选项退出学生管理系统
开发环境(C语言、Dev-C++5.6.3)
- 程序设计与实现
(一)数据结构描述
(二)菜单模块
1 主界面实现
2 函数原型及说明
int main(); 主函数,负责菜单的调用
void one_menu;次级菜单,负责信息功能调用
void two_menu;次级菜单,负责查询功能调用
student_sort();负责对学生成绩进行排序功能调用
saveStu();负责对学生信息进行文件储存
3 主要程序代码
(三)输入菜单模块
1 主界面实现
2 函数原型及说明
input_student_info();首次输入学生信息的功能调用
add_student_info();继续增加学生信息功能调用
delete_student_info();删除指定学生信息的功能调用
change_sutdent_info();修改指定学生信息的功能调用
3 主要程序代码
(四)查询模块
1 查询界面实现
2 函数原型及说明
search_student_sex_num();按照性别查询学生人数的功能调用
search_student_num();查询当前已存入信息的学生人数的功能调用
search_student_nation_num();按照民族查询学生人数的功能调用
search_student_score_max();按照课程最高分查询学生信息的功能调用
student_average_sco();统计课程学生平均分数的功能调用
3 主要程序代码
(五)成绩排序模块
1 排序界面实现
2 函数原型及说明
- void student_sort();按照成绩给学生进行排序
3 主要代码实现
(六)信息保存模块
1 保存界面实现
2 函数原型及说明
- void saveStu();对输入的学生信息保存到同目录下students.txt文件中
3 主要代码实现
(七)信息读入模块
1 保存界面实现
2 函数原型及说明
- void whiteStu();对保存的学生信息读入程序中
3 主要代码实现
开发中遇到的问题及解决办法
问题一:
对学生信息的保存
解决该问题,需要掌握C语言文件的相关知识,通过查阅书籍和相关网课的学习以及CSDN中关于该功能的学习
- 学习感想
这门课结束之后,我总结了学习中遇到的一些问题,最为突出的,书本上的知识与老师的讲解都比较容易理解,但是当自己采用刚学的知识点编写程序时却感到十分棘手,有时表现在想不到适合题意的算法,有时表现在算法想出来后,却无法根据现有知识进行编程。
刚开始学的时候确实有很多地方我很不理解,每次上上机课时老师都会在头歌平台给我们出不同的设计题目,对于我们一个初学者来说,无疑是一个具大的挑战,撞了几次壁之后,我决定静下心来,仔细去写程序。老师会给我们需要编程的内容一些讲解,顺着老师的思路,来完成自己的设计,我们可以开始运行自己的程序,可是好多处的错误让人看的可怕,还看不出到底是哪里出现了错误,但是程序还是得继续下去,我多次请教了同学和在网络中搜索并查询相关知识,逐渐能自己找出错误,并加以改正。Dev-C++里检查错误都是用英文来显示出来的,经过了这次课程设计,现在已经可以了解很多错误在英文里的提示,这对我来说是一个突破性的进步,眼看着一个个错误通过自己的努力在我眼前消失,觉得很是开心。此次的程序设计能够成功,离不开老师的指导和同学的热情帮助。在这一段努力学习的过程中,我的编程设计能力有了明显的提高。
其实现在想起来,收获还真是不少,虽然说以前非常不懂这门语言,在它上面花费了好多心血,觉得它很难,是需用花费了大量的时间编写出来的。现在真正的明白了一些代码的应用,每个程序都有一些共同点,通用的结构,相似的格式。只要努力去学习,就会灵活的去应用它。
参考文献:
魏晓鸣.王晓强.程序设计基础(C语言版).北京.清华大学出版社.2012
下面是附带的源码
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <windows.h>
int i=0;
int t=0;
//学生信息结构体
struct student
{
int tel;
char name[20];
char sex[20];
char nation[20];
int age;
float math_score;
float c_score;
float english_score;
int ff;
};
struct student stu[100];
void save();
//输入学生信息函数
void input_student_info()
{
char info;
for(;i<100;i++){
printf("\t");
printf("\t学生学号:\n");
scanf("%d",&stu[i].tel);
getchar();
printf("\t学生姓名:\n");
scanf("%s",&stu[i].name);
getchar();
printf("\t学生性别:\n");
scanf("%s",&stu[i].sex);
getchar();
printf("\t学生民族:\n");
scanf("%s",&stu[i].nation);
getchar();
printf("\t学生高数成绩:\n");
scanf("%f",&stu[i].math_score);
getchar();
printf("\t学生C语言成绩:\n");
scanf("%f",&stu[i].c_score);
getchar();
printf("\t学生年龄:\n");
scanf("%d",&stu[i].age);
getchar();
printf("\t学生英语分数:\n");
scanf("%f",&stu[i].english_score);
printf("\t是否继续输入?是请输入“y”,否则“n”\n");
scanf("%s",&info);
if(info=='n'){
t++;
break;
}else{
t++;
continue;
}
}
}
//增加学生的基本信息函数
void add_student_info()
{
char info;
for(;i+1<100;i++){
printf("\t");
printf("\t学生学号:\n");
scanf("%d",&stu[i].tel);
getchar();
printf("\t学生姓名:\n");
scanf("%s",&stu[i].name);
getchar();
printf("\t学生性别:\n");
scanf("%s",&stu[i].sex);
getchar();
printf("\t学生民族:\n");
scanf("%s",&stu[i].nation);
getchar();
printf("\t学生高数成绩:\n");
scanf("%f",&stu[i].math_score);
getchar();
printf("\t学生C语言成绩:\n");
scanf("%f",&stu[i].c_score);
getchar();
printf("\t学生年龄:\n");
scanf("%d",&stu[i].age);
getchar();
printf("\t学生英语分数:\n");
scanf("%f",&stu[i].english_score);
printf("\t是否继续输入?是请输入“y”,否则“n”\n");
scanf("%s",&info);
if(info=='n'){
t++;
break;
}else{
t++;
continue;
}
}
}
//删除学生的基本信息函数
void delete_student_info()
{
printf("\t请输入学生对应的学号:\n");
int j=0;
scanf("%d",&j);
int jj=0;
for(;jj<100;jj++){
if(stu[jj].tel==j){
strcpy(stu[jj].name,stu[jj+1].name);
stu[jj].tel=stu[jj+1].tel;
strcpy(stu[jj].sex,stu[jj+1].sex);
strcpy(stu[jj].nation,stu[jj+1].nation);
stu[jj].math_score=stu[jj+1].math_score;
stu[jj].age=stu[jj+1].age;
stu[jj].c_score=stu[jj+1].c_score;
stu[jj].english_score=stu[jj+1].english_score;
}
}
printf("\t该学生信息已删除\n");
t=t-1;
}
//修改学生的基本信息函数
void change_sutdent_info()
{
printf("\t请输入学生对应的学号:\n");
int j=0;
int number2;
scanf("%d",&j);
printf("\t请输入要修改的选项:\n");
printf("\t1.姓名\n");
printf("\t2.性别\n");
printf("\t3.民族\n");
printf("\t4.高数课程成绩\n");
printf("\t5.C语言课程成绩\n");
printf("\t6.英语课程成绩\n");
printf("\t7.学号\n\t");
printf("\t请输入修改的选项:\n");
scanf("%d",&number2);
printf("\t请输入修改的内容:\n");
for(;j<100;j++){
if(stu[j].tel==j){
switch(number2){
case 1:scanf("%s",&stu[j].name);
case 2:scanf("%s",&stu[j].sex);
case 3:scanf("%s",&stu[j].nation);
case 4:scanf("%f",&stu[j].math_score);
case 5:scanf("%f",&stu[j].c_score);
case 6:scanf("%f",&stu[j].english_score);
case 7:scanf("%d",&stu[j].tel);
}
}
}
printf("\t学生信息已修改完成\n");
}
//查询学生人数函数
void search_student_num()
{
printf("\t学生人数:%d\n",t);
}
//按照性别查询学生人数
void search_student_sex_num()
{
int x=0;
int number3=0;
char xingbie[20];
printf("\t你想查找的性别是:\n\t");
scanf("%s",&xingbie);
for(;x<100;x++){
if(strcmp(stu[x].sex,xingbie)==0){
number3++;
}
}
printf("\t学生人数是%d\n",number3);
}
//统计学生成绩的平均分数
void student_average_sco()
{
float average1=0;
float average2=0;
float average3=0;
float sum1=0;
float sum2=0;
float sum3=0;
int i=0;
for(;i<100;i++){
if(stu[i].tel!=0){
sum1=sum1+stu[i].math_score;
}
}
average1=sum1/t;
int j=0;
for(;j<100;j++){
if(stu[j].tel!=0){
sum2=sum2+stu[j].c_score;
}
}
average2=sum2/t;
int k=0;
for(;k<100;k++){
if(stu[k].tel!=0){
sum3=sum3+stu[k].english_score;
}
}
average3=sum3/t;
printf("\t|| 1.高数成绩的平均分数 ||\n");
printf("\t|| 2.C语言成绩的平均分数 ||\n");
printf("\t|| 3.英语成绩的平均分数 ||\n");
printf("\t请选择1--3:\n");
int sel1=0;
scanf("%d",&sel1);
switch(sel1)
{
case 1: printf("\t该课程的平均分数为%f\n",average1); break;
case 2: printf("\t该课程的平均分数为%f\n",average2); break;
case 3: printf("\t该课程的平均分数为%f\n",average3); break;
}
}
//按照民族查询学生人数
void search_student_nation_num()
{
int y=0;
int number4=0;
char nation1[20];
printf("\t你想查找的民族是:\n\t");
scanf("%s",&nation1);
for(;y<100;y++){
if(strcmp(stu[y].nation,nation1)==0){
number4++;
}
}
printf("\t学生人数是%d\n",number4);
}
//给学生进行排序
void student_sort()
{
printf("\t|| 1.按照高数成绩 ||\n");
printf("\t|| 2.按照C语言成绩 ||\n");
printf("\t|| 3.按照英语成绩 ||\n");
printf("\t请选择1--3:\n");
int sel1=0;
scanf("%d",&sel1);
struct student tmp;
int i,j;
if(sel1==2){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].c_score<stu[i+1].c_score) //如果前面的小于后面的
{
tmp=stu[i]; //交换两个数的位置,结构体可以直接赋值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
for(i=0; i<100; i++)
{
printf("\t学号:%d 姓名:%s 成绩 %f \n",stu[i].tel,stu[i].name,stu[i].c_score);
}
}else if(sel1==1){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].math_score<stu[i+1].math_score) //如果前面的小于后面的
{
tmp=stu[i]; //交换两个数的位置,结构体可以直接赋值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
for(i=0; i<100; i++)
{
printf("\t学号:%d 姓名:%s 成绩 %f \n",stu[i].tel,stu[i].name,stu[i].math_score);
}
}else if(sel1==3){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].english_score<stu[i+1].english_score) //如果前面的小于后面的
{
tmp=stu[i]; //交换两个数的位置,结构体可以直接赋值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
for(i=0; i<100; i++)
{
printf("\t学号:%d 姓名:%s 成绩 %f \n",stu[i].tel,stu[i].name,stu[i].english_score);
}
}
}
//查询获得某课程最高分的同学信息
void search_student_score_max()
{
printf("\t|| 1.按照高数成绩 ||\n");
printf("\t|| 2.按照C语言成绩 ||\n");
printf("\t|| 3.按照英语成绩 ||\n");
printf("\t请选择1--3:\n");
int sel1=0;
scanf("%d",&sel1);
struct student tmp;
int i,j;
if(sel1==2){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].c_score<stu[i+1].c_score) //如果前面的小于后面的
{
tmp=stu[i]; //交换两个数的位置,结构体可以直接赋值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
printf("\t学号:%d\n",stu[0].tel);
printf("\t姓名:%s\n",stu[0].name);
printf("\t性别:%s\n",stu[0].sex);
printf("\t民族:%s\n",stu[0].nation);
printf("\t高数成绩:%f\n",stu[0].math_score);
printf("\tC语言成绩:%f\n",stu[0].c_score);
printf("\t年龄:%d\n",stu[0].age);
printf("\t英语成绩:%f\n",stu[0].english_score);
}else if(sel1==1){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].math_score<stu[i+1].math_score) //如果前面的小于后面的
{
tmp=stu[i]; //交换两个数的位置,结构体可以直接赋值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
printf("\t学号:%d\n",stu[0].tel);
printf("\t姓名:%s\n",stu[0].name);
printf("\t性别:%s\n",stu[0].sex);
printf("\t民族:%s\n",stu[0].nation);
printf("\t高数成绩:%f\n",stu[0].math_score);
printf("\tC语言成绩:%f\n",stu[0].c_score);
printf("\t年龄:%d\n",stu[0].age);
printf("\t英语成绩:%f\n",stu[0].english_score);
}else if(sel1==3){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].english_score<stu[i+1].english_score) //如果前面的小于后面的
{
tmp=stu[i]; //交换两个数的位置,结构体可以直接赋值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
printf("\t学号:%d\n",stu[0].tel);
printf("\t姓名:%s\n",stu[0].name);
printf("\t性别:%s\n",stu[0].sex);
printf("\t民族:%s\n",stu[0].nation);
printf("\t高数成绩:%f\n",stu[0].math_score);
printf("\tC语言成绩:%f\n",stu[0].c_score);
printf("\t年龄:%d\n",stu[0].age);
printf("\t英语成绩:%f\n",stu[0].english_score);
}
}
//保存学生信息
void saveStu(){
int i = 0;
FILE * fp;
fp = fopen("students.txt","w");
if(fp == NULL){
printf("\t文件打开失败!\n");
exit(0);
}
fprintf(fp,"%d\n",t);
for(i = 0;i < t;i++){
fprintf(fp,"\t%d",stu[i].tel);
fprintf(fp,"\t%s",stu[i].name);
fprintf(fp,"\t%s",stu[i].sex);
fprintf(fp,"\t%s",stu[i].nation);
fprintf(fp,"\t%f",stu[i].math_score);
fprintf(fp,"\t%f",stu[i].c_score);
fprintf(fp,"\t%d",stu[i].age);
fprintf(fp,"\t%f\n",stu[i].english_score);
}
fclose(fp);
printf("\t写入成功!\n");
}
void whiteStu(){
int i = 0;
FILE * fp;
fp = fopen("students.txt","r+");
if(fp == NULL){
printf("\t文件打开失败!\n");
exit(0);
}
fscanf(fp,"%d\n",&t);
for(i = 0;i < t;i++){
fscanf(fp,"\t%d",&stu[i].tel);
fscanf(fp,"\t%s",&stu[i].name);
fscanf(fp,"\t%s",&stu[i].sex);
fscanf(fp,"\t%s",&stu[i].nation);
fscanf(fp,"\t%f",&stu[i].math_score);
fscanf(fp,"\t%f",&stu[i].c_score);
fscanf(fp,"\t%d",&stu[i].age);
fscanf(fp,"\t%f\n",&stu[i].english_score);
}
fclose(fp);
printf("\t读入成功!\n");
}
//menu
void menu()
{
printf("\t======================================================\n");
printf("\t 学生信息管理系统 \n");
printf("\t ********************************* \n");
printf("\t * 功能菜单 * \n");
printf("\t ********************************* \n");
printf("\t 1.信息管理 \n");
printf("\t 2.查询 \n");
printf("\t 3.成绩排序 \n");
printf("\t 4.保存学生信息 \n");
printf("\t 5.读入学生信息 \n");
printf("\t 6.退出系统 \n");
printf("\t * 退出前请保存学生信息 * \n");
printf("\t======================================================\n");
}
void two_menu()
{
printf("\t|| 1.按照性别查询学生人数 ||\n");
printf("\t|| 2.查询当前学生人数 ||\n");
printf("\t|| 3.按照民族查询学生人数 ||\n");
printf("\t|| 4.查询某课程的最高分的学生信息 ||\n");
printf("\t|| 5.按照课程统计学生的平均分数 ||\n");
printf("\t|| 6.返回上一级 ||\n");
printf("\t请选择1--6:\n");
int selection;
scanf("%d",&selection);
switch(selection)
{
case 1: search_student_sex_num(); break;
case 2: search_student_num(); break;
case 3: search_student_nation_num(); break;
case 4: search_student_score_max(); break;
case 5: student_average_sco(); break;
case 6: break;
}
}
void one_menu()
{
printf("\t|| 1.首次输入学生信息 ||\n");
printf("\t|| 2.增加学生信息 ||\n");
printf("\t|| 3.删除学生信息 ||\n");
printf("\t|| 4.修改学生信息 ||\n");
printf("\t|| 5.返回上一级 ||\n");
printf("\t请选择1--5:\n");
int selection;
scanf("%d",&selection);
switch(selection)
{
case 1: input_student_info(); break;
case 2: add_student_info(); break;
case 3: delete_student_info(); break;
case 4: change_sutdent_info(); break;
case 5: break;
}
}
//主函数
int main()
{
int selection;
while(true)
{
int selection;
menu();
printf("\t请选择1--5:\n");
scanf("%d",&selection);
switch(selection)
{
case 1: one_menu(); break;
case 2: two_menu(); break;
case 3: student_sort(); break;
case 4:saveStu(); break;
case 5:whiteStu(); break;
case 6:
printf("\n\t>>>您已成功退出学生信息管理系统,感谢使用!\n");
exit(0);
break;
default:
printf("\n\t>>>输入有误,请重新输入!\n");
}
}
return 0;
}
//文件打开
/*
FILE *fp;
fp=fopen("C:\\Users\\subrewmaster\\Desktop\\student.dat","wb");// ("文件名","打开文件方式")
或
FILE *fp;
char *filename="C:\\Users\\subrewmaster\\Desktop\\student.dat";
fp=fopen(filename,"r");
如果打开出错,fopen函数会返回一个空指针NULL
*/
//文件关闭
//fclose(fp);
//文件的顺序读写
//字符读写函数fgetc()和fputc() 例:ch=fgetc(fp);
该内容为个人记录所用,错误难以避免,希望大佬们能在评论区提出建议或更好的方法!与君共勉
版权归原作者 永远的萌新01 所有, 如有侵权,请联系我们删除。