c语言课程设计学生成绩管理系统

更新时间:2023-05-21 07:23:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

c语言课程设计 c语言

目录

——学生成绩管理程序

题目要求 ··················· 2

设计目的 ··················· 2

总体设计 ··················· 3

详细设计 ··················· 3

调试与测试 ················· 12

源程序 ··················· 14

总结 ··················· 30

学生成绩管理程序

c语言课程设计 c语言

一. 题目要求

1. 问题描述:

对在校学生几门课程的考试成绩进行统一管理.每个学生记录包括学号,姓名,年龄,数学,英语,物理成绩,默认以学号为序存放.

2. 要求:

(1)一个文件按以班为单位存储学生记录.

(2)将允许的操作分为四种,以A,B ,C,D,E,F为标志: A:插入一个学生记录; B:修改学生记录; C:删除一个学生记录; D:查找一个学生记录; E:浏览学生成绩: F:退出

3. 计算学生的总成绩.

4. 按学号排序输出全班学生成绩表 .

二. 设计目的

根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入,输出等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外还应提供键盘式选择菜单实现功能选择.

三. 总体设计

根据上面的需求分析,可以将这个系统分为以下模块:输入模块,修改模块,删除模块,查找模块,显示模块.

c语言课程设计 c语言

四. 详细设计

1. 主函数:

主函数一般设计得比较简单,只提供输入,处理和输出部分的函数调用,其中各功能模块用菜单方式选择.

流程图:

Y

[程序]:

//#include "head.h" int menu_select() {

char c;

printf("\n\n");

printf(" | 1. 增加学生记录 5.统计信息 |\n"); printf(" | 2. 查询学生记录 6.打开文件 |\n"); printf(" | 3. 修改学生记录 7.保存文件 |\n"); printf(" | 4. 学生纪录排序 8.显示记录 |\n"); printf(" | 0. 退出系统 |\n"); printf("\n\n");

printf("请选择(0-8):"); c=getchar(); getchar();

return (c-'0'); }

2. 输入模块:

c语言课程设计 c语言

[分析]:

单独看各数据信息,学号,姓名是字符型,可以采用字符型数组;分数为整数,采用整数;数据信息存放在文件中,一条记录对应一个学生,既符合习惯又方便信息管理.

如果要存放若干学生信息就用结构体数组:

void addrecord(student stud[]) {

int i=0,j,num; char str[5]; if(numstus!=0) {

printf("已有记录存在是否覆盖?(y/n)\n"); gets(str);

if(str[0]=='Y'||str[0]=='y') i=0;

else i=numstus; }

printf("请输入增加的学生信息条目数:"); scanf("%d",&num); if(i==0)

numstus=num;

else numstus+=num; if(numstus>lens) {

lens+=50;

pointer=(student *)realloc(pointer,lens*LEN); }

printf("请输入学生信息:\n"); for(;i<numstus;i++) {

getchar();

printf("请输入学号:"); gets(pointer[i].number); printf("请输入姓名:"); gets(pointer[i].name);

printf("请输入性别(男/女 1/0):"); gets(pointer[i].sex);

if(pointer[i].sex[0]=='0') strcpy(pointer[i].sex,"女"); else strcpy(pointer[i].sex,"男");

printf("请输入各科成绩:(按“语文,数学,英语,历史,政治”的顺序):");

c语言课程设计 c语言

stud[i].score=0;

for(j=0;j<numsubs;j++) {

scanf("%f",&stud[i].subject[j]); /*计算总分*/ stud[i].score+=stud[i].subject[j]; }

stud[i].average=stud[i].score/numsubs; /*计算平均分*/ }

count(stud); /*附名次*/ display(stud,0,numstus-1); getchar(); }

int numstus; int lens;

student *pointer; void main() {

int i=1;

char str[2]; lens=100;

pointer=(student *)malloc(lens*LEN); /*分配内存*/ numstus=0;

welcome(); /*欢迎界面*/ while(i>0) {

i=menu_select(); /*控制菜单*/ switch(i) {

case 1:addrecord(pointer);break; /*增加学生信息*/ case 2:findrecord(pointer);break; /*查询学生信息*/ case 3:amendrecord(pointer);break; /*修改学生信息*/ case 4:sort(pointer);break; /*学生信息排序*/ case 5:statistic(pointer);break; /*统计信息*/ case 6:openfile(pointer);break; /*打开文件*/ case 7:writetotext(pointer);break; /*保存文件*/

case 8:display(pointer,0,numstus-1);break; /*显示记录*/ case 0:

if(numstus!=0) printf("是否保存当前记录?(y/n)"); gets(str);

if(str[0]=='y'||str[0]=='Y') writetotext(pointer); i=-1;break; /*退出系统*/

default:printf("请输入数字0~8:\n");i=1; /*输入错误*/ }

c语言课程设计 c语言

}

printf("\t\t欢迎再次使用本系统。\n\n"); display1(); }

3. 修改模块:

[分析]:用户输入要修改学生的学号,根据学生的学号等信息查找学生记录,并提示用户修改该记录的哪部分信息.根据用户选择修改相应的信息. [流程图]:

[程序]:

void xiugai() {

c语言课程设计 c语言

if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) /*检查是否出错*/ {

printf("Cannot open this file.\n"); exit(0); }

printf("\nPLease shuru xiugai xuehao:"); scanf("%d",&i); getchar();

while((fread(&data,sizeof(data),1,fp))==1) {

j=atoi(data.xuehao); if(j==i) {

printf("xuehao:%s\nmingzi:%s\nnianling:%s\n",data.xuehao,data.mingzi,data.nianling);

printf("Please shuru mingzi:"); gets(data.mingzi);

printf("Please shuru shuxue score:"); gets(temp);data.score[0]=atof(temp); printf("Please input yingyu score:"); gets(temp);data.score[1]=atof(temp); printf("Please input wuli score:"); gets(temp);data.score[2]=atof(temp);

data.score[3]=data.score[0]+data.score[1]+data.score[2];

} fwrite(&data,sizeof(data),1,fp1); }

fseek(fp,0L,0); /*将位置指针移到离头文件0个字节处*/ fseek(fp1,0L,0);

while((fread(&data,sizeof(data),1,fp1))==1) {

fwrite(&data,sizeof(data),1,fp); }

fclose(fp); fclose(fp1); }

4. 删除模块:

c语言课程设计 c语言

[分析]:

该模块的功能是,用户输入要删除的学生的学号,根据学生学号查找记录并删除.

[流程图]:

[程序]:

void deleterecord(student stu[],int i) /*删除信息*/ {

int j;

while(i>=0) {

for(j=i;j<numstus;j++) stu[j]=stu[j+1]; numstus--;

printf("删除成功!\n"); } }

void count(student stud[])

c语言课程设计 c语言

{

int i,j;

for(i=0;i<numstus;i++) {

stud[i].index=1;

for(j=0;j<numstus;j++)

if(stud[j].score>stud[i].score) stud[i].index++; } }

5. 查找模块:

[需求分析]:

该模块的功能是根据输入的学生的姓名查找对应的记录,找到以后,显示相应的学生信息.

[程序]:

//#include "head.h"

c语言课程设计 c语言

int findrecord(student stud[]) /*查找信息*/ {

char str[2]; int i,num; if(numstus==0) {

printf("没有可被查找的记录\n"); return -1; } else {

printf("以何种方式查找?\n1.学号\t2.姓名\t3.名次\n"); gets(str);

if(str[0]=='1') /*按学号查找*/ {

printf("请输入学号:"); gets(str);

for(i=0;i<=numstus;i++)

if(strcmp(str,stud[i].number)==0) {

display(stud,i,i); break; }

else continue; }

else if(str[0]=='2') /*按姓名查找*/ {

printf("请输入姓名:"); gets(str);

for(i=0;i<=numstus;i++)

if(strcmp(str,stud[i].name)==0) {

display(stud,i,i); break; }

else continue; }

else if(str[0]=='3') /*按名次查找*/ {

printf("请输入名次:"); scanf("%d",&num); getchar();

for(i=0;i<=numstus;i++) if(num==stud[i].index)

c语言课程设计 c语言

{

display(stud,i,i); break; }

else continue; }

if(i>numstus) {

printf("没有查找所要的信息。\n"); return -1; }

return i; } }

6. 显示模块:

[需求分析]:

该模块的功能是显示所有学生记录信息. [程序]:

void welcome() {

printf("\t*************************************************************\n");

printf("\t\t\t\t**学生成绩管理系统**\n\t\t\t\t 倾情奉献 欢迎使用!\n");

printf("\t*************************************************************\n"); }

void showtable() {

printf("---------------------------------------------------------------------------------------\n");

printf("学号\t姓名\t性别\t语文\t数学\t英语\t历史\t政治\t总分\t平均分\t名次\n");

c语言课程设计 c语言

printf("---------------------------------------------------------------------------------------\n"); }

void display(student stud[],int n1,int n2) {

int i;

showtable(); /*显示表头*/ for(i=n1;i<=n2;i++)

printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t\n",stud[i].number,stud[i].name,stud[i].sex,stud[i].subject[0],stud[i].subject[1],stud[i].subject[2],stud[i].subject[3],stud[i].subject[4],stud[i].score,stud[i].average,stud[i].index);

/*通过循环输出数据*/ }

void display1() {

printf("\t\t本系统由计科二班制作\n\n"); printf("\t\t制作人员列表: \n\n"); printf("\t\t殷增锋\t\t\t邵超\n"); printf("\n\n"); getchar(); }

五. 调试与测试

在这次课程设计中,程序编写过程中遇到了很多的问题,各种函数的运用也让人头疼,在上机编译运行过程中出现了很多的错误,例如:各种数据类型的定义,函数的调用等等。但最终还是在老师同学的帮助下进行了各种代码的编写与修改,最终程序成功的运行。

下面是各个模块的界面图

(1) 主菜单函数:

c语言课程设计 c语言

(2): 输入模块:

(3): 显示模块:

(4): 删除模块:

(5): 查找模块:

c语言课程设计 c语言

(6): 修改模块

:

六.程序源

#ifndef H_STUDENT_HH #define H_STUDENT_HH

#include "stdio.h" #include "string.h" #include "malloc.h"

#define LEN sizeof(struct message_student) /*一个结构体数组元素的长度*/

#define numsubs 5 /*学科数目*/

typedef struct message_student /*结构体定义*/ {

char number[6]; char name[20]; char sex[4];

float subject[numsubs]; float score; float average; int index; }student;

c语言课程设计 c语言

extern int numstus; /*学生数目*/

extern student *pointer; /*指向结构体数组*/ extern int lens;

int menu_select(); /*函数声明*/ int openfile(student stu[]); int findrecord(student stud[]); int writetotext(student stud[]); void welcome(); void display1(); void showtable();

void sort(student stu[]);

void deleterecord(student stu[],int i); void addrecord(student stud[]);

void display(student stud[],int n1,int n2); void amendrecord(student stud[]); void count(student stud[]); void sortnum(student stud[]); void sortnum2(student stud[]); void sortname(student stud[]); void sortname2(student stud[]); void sortcount(student stud[]); void sortcount2(student stud[]); void statistic(student stud[]); void display1();

#endif

//#include "head.h" int menu_select() {

char c;

printf("\n\n");

printf(" | 1. 增加学生记录 5.统计信息 |\n"); printf(" | 2. 查询学生记录 6.打开文件 |\n"); printf(" | 3. 修改学生记录 7.保存文件 |\n"); printf(" | 4. 学生纪录排序 8.显示记录 |\n"); printf(" | 0. 退出系统 |\n"); printf("\n\n");

printf("请选择(0-8):"); c=getchar();

c语言课程设计 c语言

getchar();

return (c-'0'); }

//#include "head.h"

int findrecord(student stud[]) /*查找信息*/ {

char str[2]; int i,num; if(numstus==0) {

printf("没有可被查找的记录\n"); return -1; } else {

printf("以何种方式查找?\n1.学号\t2.姓名\t3.名次\n"); gets(str);

if(str[0]=='1') /*按学号查找*/ {

printf("请输入学号:"); gets(str);

for(i=0;i<=numstus;i++)

if(strcmp(str,stud[i].number)==0) {

display(stud,i,i); break; }

else continue; }

else if(str[0]=='2') /*按姓名查找*/ {

printf("请输入姓名:"); gets(str);

for(i=0;i<=numstus;i++)

if(strcmp(str,stud[i].name)==0) {

display(stud,i,i); break; }

else continue; }

else if(str[0]=='3') /*按名次查找*/ {

c语言课程设计 c语言

printf("请输入名次:"); scanf("%d",&num); getchar();

for(i=0;i<=numstus;i++) if(num==stud[i].index) {

display(stud,i,i); break; }

else continue; }

if(i>numstus) {

printf("没有查找所要的信息。\n"); return -1; }

return i; } }

//#include"head.h"

int openfile(student stu[]) {

int i=0,j; FILE *fp;

char filename[20],str[2]; if(numstus!=0) {

printf("已经有记录存在,是否保存?(y/n)"); gets(str);

if(str[0]=='y'||str[0]=='Y') writetotext(stu); }

printf("请输入文件名:"); gets(filename); numstus=0;

if((fp=fopen(filename,"rb+"))==NULL) {

printf("无法打开该文件\n"); return(-1); }

fscanf(fp,"%d",&numstus); fgetc(fp);

while(i<numstus) {

c语言课程设计 c语言

fscanf(fp,"%s",stu[i].number); fscanf(fp,"%s",stu[i].name); fscanf(fp,"%s",stu[i].sex); for(j=0;j<numsubs;j++)

fscanf(fp,"%f",&stu[i].subject[j]); fscanf(fp,"%f",&stu[i].score); fscanf(fp,"%f",&stu[i].average); fscanf(fp,"%d",&stu[i].index); i++; }

fclose(fp);

printf("文件读取成功\n");

printf("是否显示纪录?(y/n)"); gets(str);

if(str[0]=='y'||str[0]=='Y') display(stu,0,numstus-1); return(0); }

//#include "head.h"

void sort(student stud[]) {

int i,j=0; char str[5]; student *p; p=stud;

if(numstus==0) {

printf("没有可供查询的记录!"); }

while(1) {

for(i=0;;i++) {

printf(" 请输入查询方式:");

printf("(直接输入回车则结束查询操作)\n"); printf("1.按照学号\t"); printf("2.按照姓名\t"); printf("3.按照名次\n"); gets(str);

if(strlen(str)==0) break; if(str[0]=='1') {

printf("请输入排序次序:\n"); printf("1.升序排列\t");

c语言课程设计 c语言

printf("2.降序排列\n"); gets(str);

if(str[0]=='1') sortnum2(p); else

sortnum(p);

display(stud,0,numstus-1); }

else if(str[0]=='2') {

printf("请输入排序次序:\n"); printf("1.升序排列\t"); printf("2.降序排列\n"); gets(str);

if(str[0]=='1') sortname2(p); else

sortname(p);

display(stud,0,numstus-1); }

else if(str[0]=='3') {

printf("请输入排序次序:\n"); printf("1.升序排列\t"); printf("2.降序排列\n"); gets(str);

if(str[0]=='1') sortcount2(p); else

sortcount(p);

display(stud,0,numstus-1); }

else printf("请输入1~3"); printf("是否退出排序?(y/n)"); gets(str);

if(str[0]=='y'||str[0]=='Y') break; }

return; } }

void sortnum(student stud[]) {

int i,j;

student temp;

c语言课程设计 c语言

student *p; p=stud;

for(i=0;i<numstus;i++)

for(j=0;j<numstus-i-1;j++) {

if(strcmp(stud[j+1].number,stud[j].number)>0) {

temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } } }

void sortnum2(student stud[]) {

int i,j;

student temp; student *p; p=stud;

for(i=0;i<numstus;i++)

for(j=0;j<numstus-i-1;j++) {

if(strcmp(stud[j].number,stud[j+1].number)>0) {

temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } } }

void sortname(student stud[]) {

int i,j;

student temp; student *p; p=stud;

for(i=0;i<numstus;i++)

for(j=0;j<numstus-i-1;j++) {

if(strcmp(stud[j+1].name,stud[j].name)>0) {

temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp;

c语言课程设计 c语言

} } }

void sortname2(student stud[]) {

int i,j;

student temp; student *p; p=stud;

for(i=0;i<numstus;i++)

for(j=0;j<numstus-i-1;j++) {

if(strcmp(stud[j].name,stud[j+1].name)>0) {

temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } } }

void sortcount(student stud[]) {

int i,j;

student temp; student *p; p=stud;

for(i=0;i<numstus;i++)

for(j=0;j<numstus-i-1;j++) {

if(stud[j+1].index>stud[j].index) {

temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } } }

void sortcount2(student stud[]) {

int i,j;

student temp; student *p; p=stud;

for(i=0;i<numstus;i++)

本文来源:https://www.bwwdw.com/article/3t14.html

Top