C语言课程设计报告
一 .设计目的
学生成绩管理系统
主要功能:
(1)能按学期、按班级完成对学生成绩的录入、
修改,删除
(2)能按班级统计学生的成绩,求学生的总分及
平均分,并能根据学生的平均成绩进行排序
(3)能查询学生成绩,不及格科目及学生名单
(4)能按班级输出学生的成绩单
二 .总体设计
此流程图是整体上对程序需要哪些函数而设计的,这些都是核心函数,先将这些函数实现以后再通过main()主函数对每一个核心函数进行调用,主函数里面可以用到while循环和switch语句
三.详细设计
void Pass_File(); //创建密码文件
int Name_Password(); //登陆密码验证
void User_Amadeus();/* 密码修改 */
/***********************************************/
void in();/*录入学生成绩信息*/
void show();/*显示学生信息*/
void order();/*按总分排序*/
void del();/*删除学生成绩信息*/
void modify();/*修改学生成绩信息*/
void menu();/*主菜单*/
void insert();/*插入学生信息*/
void total();/*计算总人数*/
void search();/*查找学生信息*/
void ShowClassS(); // 显示某班学生信息
void ShowFailS(); // 显示不及格学生信息
void main()/*主函数,实现对每个函数的调用,main函数里面,通过对输入序号的值对应的调用函数,这需要用到switch()语句*/
每个函数都相对是独立的,入口参数就是输入学生的成绩信息
四.调试与测试
五.源程序清单和执行结果
1 . 定义结构体及宏定义
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<string.h>
#define LEN sizeof(struct student)
#define FORMAT " %2s %2s %s %s %4.1lf %4.1lf %4.1lf %4.1lf %4.2lf \n"
#define DATA stu[i].Term,stu[i].Class,stu[i].name,stu[i].num,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum,stu[i].ave
char Name[15]; //用户名存储
char Pass[15]; //用户密码存储
#define R 3
struct student/*定义学生成绩结构体*/
{
char Class[15]; //专业班级
char Term[5]; // 学期
char num[15]; /*学号*/
char name[15]; /*姓名*/
double score[3]; //学科成绩
double sum; /*总分*/
double ave; /*平均分*/
};
struct student stu[100];/*定义结构体数组*/
/******用户输入用户名与登陆密码*******/
struct NamePass
{
char name[15];
char pass[15];
};
2.函数声明
/**********密码登陆模块************************/
void Pass_File(); //创建密码文件
int Name_Password(); //登陆密码验证
void User_Amadeus();/* 密码修改 */
/***********************************************/
void in();/*录入学生成绩信息*/
void show();/*显示学生信息*/
void order();/*按总分排序*/
void del();/*删除学生成绩信息*/
void modify();/*修改学生成绩信息*/
void menu();/*主菜单*/
void insert();/*插入学生信息*/
void total();/*计算总人数*/
void search();/*查找学生信息*/
void ShowClassS(); // 显示某班学生信息
void ShowFailS(); // 显示不及格学生信息
3.主函数 main()
利用while循环和swithch()语句进行菜单选择来实现各函数的调用,系统根据输入的数字选项来调用相应的函数,输入0时,结束退出。等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!
/*******************************************************************************************************************
程序的开始部分
********************************************************************************************************************/
void main()/*主函数*/
{
int n;
Pass_File();
Name_Password();
system("pause");
system("cls");
printf("\t\t******************************************************************\n");
printf("\t\t* *\n");
printf("\t\t* 欢迎使用由计算机1505班设计的学生成绩管理系统 *\n");
printf("\t\t* 祝您使用愉快!!!! *\n");
printf("\t\t* *\n");
printf("\t\t* 心灵鸡汤: *\n");
printf("\t\t* *\n");
printf("\t\t* 相信自己,依靠自己,要尽自己的能力,把每件事情都做得更好,*\n");
printf("\t\t* 让自己活的每一天都有意义。 *\n");
printf("\t\t* 努力成为你最喜欢的那种人,就算不成功, *\n");
printf("\t\t* 至少你会喜欢这样努力的自己。 *\n");
printf("\t\t* *\n");
printf("\t\t* 指导老师 :毋小省 *\n");
printf("\t\t* 课程设计 :C语言 *\n");
printf("\t\t* 姓 名 :张诚华、马莹莹 *\n");
printf("\t\t* 学 校 :河南理工大学 *\n");
printf("\t\t* 学 号 :311509010516,311509010507 *\n");
printf("\t\t* 专业班级 :计算机1505 *\n");
printf("\t\t* *\n");
printf("\t\t******************************************************************\n");
system("pause");//暂停
system("cls");
menu();
scanf("%d",&n);/*输入选择功能的编号*/
while(n)
{
switch(n)
{
case 1:
in();
break;
case 2:
search();
break;
case 3:
del();
break;
case 4:
modify();
break;
case 5:
insert();
break;
case 6:
order();
break;
case 7:
total();
break;
case 8:
User_Amadeus();
break;
case 9:
ShowClassS();
break;
case 10:
show();
break;
case 11:
ShowFailS();
break;
default:break;
}
getch();
menu();/*执行完功能再次显示菜单界面*/
scanf("%d",&n);
}
}
4.创建密码文件函数
/****************创建密码文件*************/
void Pass_File()
{
FILE * PassFile;
PassFile = fopen("c:\\CLP\\password.bat", "ab+");
if(NULL == PassFile)
{
printf("创建密码文件失败!\n");
exit(0);
}
fprintf(PassFile ,"amadeus\n");
fwrite("amadeus" , sizeof("amadeus"), 1, PassFile);
fclose(PassFile);
}
5.登录密码验证函数
/******************登 陆 密 码 验 证 ***********************/
int Name_Password()
{
struct NamePass PassW1;
int num = 0;
FILE * PassFile;
PassFile = fopen("c:\\CLP\\password.bat", "rb");//以只读的方式打开二进制文件password.bat
if(NULL == PassFile)
{
Pass_File();
}
fscanf(PassFile, "%s", Name );//设置初始用户名
fscanf(PassFile, "%s", Pass);//设置初始密码
while(1)
{
system("cls");
printf("\n\n\t\t\t 欢迎使用学生成绩管理系统\n\n");
printf("\t\t\t\t密码和学号一样\n\n\n");
printf(" 请输入学号: ");
scanf("%s", &PassW1.name);
printf("\n");
printf(" 请输入密码: ");
scanf("%s", &PassW1.pass);
if(0 == strcmp(Name,PassW1.name) && 0 == strcmp(Pass,PassW1.pass))
{
printf("\n\n\n\t\t\t密 码 核 对 正 确 ! \1 \n");
printf("\n\n\n\t\t 欢 迎 您 使 用 学 生 管 理 系 统 ! \2\n");
break;
}
else
{
printf("\n\n\t\t\t对不起,您输入的用户名或密码有误!\n\n");
printf("\n\n\t\t 请 按 任 意 键 重 新 输 入 !\n\n\n\n\n\n\n\n\n");
getch();
num++;
if(3 == num)
{
system("cls");
printf("\n\n\t\t\t 欢迎使用学生成绩管理系统\n\n\n");
printf("\n\n\n\t\t 对 不 起\n\n\n");
printf("\n\t\t\t 你 已 经 三 次 输 入 错 误\n\n");
printf("\n\t\t\t\t\t\t\t再 见 ! \n\n\n\n\n\n");
getch();
fclose(PassFile);
return 0;
}
}
}
printf("\n\n\n");
fclose(PassFile);
return 1;
}
6.密码修改函数
/*******************密码修改****************/
void User_Amadeus()
{
FILE * PassFile;
int a = 1;
char name1[15];
char passw1[15];
char passw2[15];
char passw3[15];
system("cls");
PassFile = fopen("c:\\CLP\\password.bat", "wb");
if(NULL == PassFile)
{
printf("修改密码文件失败!\n");
exit(0);
}
printf("\t\t\t\t 用 户 修 改 \n");
while(1)
{
printf("请输入原密码:");
scanf("%s", passw1);
if(0 == strcmp(Pass, passw1))
{
printf("\n请输入新用户名:");
scanf("%s", name1);
while(1)
{
while(1)
{
printf("\n请输入新密码:");
scanf("%s", passw2);
if(0 == strcmp(Pass, passw2))
{
printf("\n新密码不能与旧密码相同!\n");
}
else
break;
}
printf("\n请确认新密码:");
scanf("%s", passw3);
if(0 == strcmp(passw2, passw3))
{
strcpy(Pass , passw2);
printf("\n\n\t\t\t密 码 修 改 成 功 \1 请 重 新 登 陆 !\n\n");
fprintf(PassFile, "%s\r\n", name1);
fprintf(PassFile, "%s\r\n", passw2);
break;
}
else
printf("\n您输入的密码不一致, 请重新输入!\n");
}
break;
}
else
{
if(a != 3)
{
printf("\n密码错误,请重新输入!\n\n");
a++;
}
else
{
printf("你已三次输入密码错误 !\n\n");
printf("再见!\n");
exit(0);
}
}
}
fclose(PassFile);
system("pause");
}
7.按学期、按班级录入学生成绩函数
/*********************录入学生信息********************/
void in()
{
int i,m=0;/*m是记录的条数*/
char ch[2];
FILE *fp;/*定义文件指针*/
if((fp=fopen("data","ab+"))==NULL)/*打开指定文件*/
{
printf("can not open the file\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m] ,LEN,1,fp)==1)
m++;/*统计当前记录条数*/
}
fclose(fp);
if(m==0)
printf("No record!\n");
else
{
system("cls");
show();/*调用show函数,显示原有信息*/
}
if((fp=fopen("data","wb"))==NULL)
{
printf("can not open the file\n");
return;
}
printf("please input(Y/N):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息*/
{
printf("输入学期:");
scanf("%s",stu[m].Term);
printf("输入专业班级:");
scanf("%s",stu[m].Class);
printf("输入学生姓名:");
scanf("%s",stu[m].name);/*输入学生姓名*/
printf("学号:");
scanf("%s",stu[m].num);/*输入学生学号*/
printf("输入工科数学成绩:");
scanf("%lf",&stu[m].score[0]);/*输入工科数学成绩*/
printf("输入大学英语成绩:");
scanf("%lf",&stu[m].score[1]);/*输入大学英语成绩*/
printf("输入C语言成绩:");
scanf("%lf",&stu[m].score[2]);/*输入C语言成绩*/
stu[m].sum=stu[m].score[0]+stu[m].score[1]+stu[m].score[2];/*计算出总成绩*/
stu[m].ave=stu[m].sum/3.0;/*计算出平均分*/
if(fwrite(&stu[m],LEN,1,fp)!=1)/*将新录入的信息写入指定的磁盘文件*/
{
printf("不能保存!");
getch();
}
else
{
printf("%s 保存成功!\n",stu[m].name);
m++;
}
printf("是否继续?(Y/N):");/*询问是否继续*/
scanf("%s",ch);
}
fclose(fp);
printf("OK!\n");
}
8.显示学生成绩函数
/**************************显示学生成绩*************************/
void show()
{
FILE *fp;
int i,m=0;
fp=fopen("data","ab+");
while(!feof(fp))
{
if(fread(&stu[m] ,LEN,1,fp)==1)
m++;
}
fclose(fp);
printf(" 学期 专业班级 姓名 学号 工科数学 大学英语 C语言 总分 平均分 \n");
for(i=0;i<m;i++)
{
printf(FORMAT,DATA);/*将信息按指定格式打印*/
}
}
9.将学生成绩进行排序函数
/*******************自定义排序函数***********************/
void order()
{
FILE *fp;
struct student t;
int i=0,j=0,m=0;
if((fp=fopen("data","ab+"))==NULL)
{
printf("can not open the file!\n");
return;
}
while(!feof(fp))
if(fread(&stu[m] ,LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("no record!\n");
return;
}
for(i=0;i<m-1;i++)
for(j=i+1;j<m;j++)/*双重循环实现成绩比较并交换*/
if(stu[i].sum<stu[j].sum)
{
t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
printf(" 学期 专业班级 姓名 学号 工科数学 大学英语 C语言 总分 平均分 \n");
for(i=0;i<m;i++)
{
printf(FORMAT,DATA);/*将信息按指定格式打印*/
}
if((fp=fopen("data","a"))==NULL)
{
printf("can not open the file\n");
return;
}
for(i=0;i<m;i++)/*将重新排好序的内容重新写入指定的磁盘文件中*/
if(fwrite(&stu[i] ,LEN,1,fp)!=1)
{
printf("%s 没有保存成功!\n");
getch();
}
fclose(fp);
printf("保存成功!已将成绩名次存入data中\n");
}
10.删除学生成绩函数
/********************自定义删除函数********************/
void del()
{
FILE *fp;
int i,j,m=0;
char snum[15];
char ch[2];
if((fp=fopen("data","ab+"))==NULL)
{
printf("can not open the file\n");
return;
}
while(!feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("没有该学号!\n");
return;
}
printf("请输入学号:");
scanf("%s",snum);
for(i=0;i<m;i++)
if(strcmp(snum,stu[i].num))
break;
if(i==m)
{
printf("没有找到该学生的成绩");
getchar();
return;
}
printf("找到该学生的成绩,是否删除?(Y/N)");
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
{
for(j=i;j<m;j++)
stu[j]=stu[j+1];/*将后一个记录移到前一个记录的位置*/
m--;/*记录的总个数减1*/
printf("删除成功!\n");
}
if((fp=fopen("data","wb"))==NULL)
{
printf("can not open the file\n");
return;
}
for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&stu[j] ,LEN,1,fp)!=1)
{
printf("保存失败!\n");
getch();
}
fclose(fp);
}
11.修改学生成绩函数
/*********************自定义修改函数********************/
void modify()
{
FILE *fp;
int i,j,m=0;
char snum[15];
if((fp=fopen("data","ab+"))==NULL)
{
printf("can not open the file\n");
return;
}
while(!feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
if(m==0)
{
printf("没有记录!\n");
fclose(fp);
return;
}
printf("请输入你要修改的成绩的学生的学号!\n");
scanf("%s",snum);
for(i=0;i<m;i++)
if(strcmp(snum,stu[i].num))/*检索记录中是否有要修改的信息*/
break;
if(i<m)
{
printf("找到该学生的成绩!你可以修改该成绩!\n");
printf("姓名:");
scanf("%s",stu[i].name);/*输入名字*/
scanf("%lf",&stu[m].score[0]);/*输入工科数学成绩*/
printf("输入大学英语成绩:");
scanf("%lf",&stu[m].score[1]);/*输入大学英语成绩*/
printf("输入C语言成绩:");
scanf("%lf",&stu[m].score[2]);/*输入C语言成绩*/
stu[m].sum=stu[m].score[0]+stu[m].score[1]+stu[m].score[2];/*计算出总成绩*/
stu[i].ave=stu[i].sum/3.0;
}
else
{
printf("没有找到该学生的成绩!");
getchar();
return;
}
if((fp=fopen("data","wb"))==NULL)
{
printf("can not open the file\n");
return;
}
for(j=0;j<m;j++)/*将新修改的信息写入指定的磁盘文件中*/
if(fwrite(&stu[j] ,LEN,1,fp)!=1)
{
printf("保存失败!");
getch();
}
fclose(fp);
}
12.功能主菜单函数
/******************自定义函数实现菜单功能*************************/
void menu()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t\t\t|-------------------学生成绩管理系统------------|\n");
printf("\t\t\t|\t\t *0 退出 |\n");
printf("\t\t\t|\t\t *1 按学期、班级录入学生成绩 |\n");
printf("\t\t\t|\t\t *2 查找学生成绩 |\n");
printf("\t\t\t|\t\t *3 删除学生成绩 |\n");
printf("\t\t\t|\t\t *4 修改学生成绩 |\n");
printf("\t\t\t|\t\t *5 插入学生成绩 |\n");
printf("\t\t\t|\t\t *6 学生成绩名次 |\n");
printf("\t\t\t|\t\t *7 统计保存的学生人数 |\n");
printf("\t\t\t|\t\t *8 用户密码修改 |\n");
printf("\t\t\t|\t\t *9 按班级输出学生成绩 |\n");
printf("\t\t\t|\t\t *10 显示学生成绩信息 |\n");
printf("\t\t\t|\t\t *11 输出不及格学生成绩 |\n");
printf("\t\t\t|-----------------------------------------------|\n\n");
printf("\t\t\t请选择(0-10):");
}
13.插入学生成绩函数
/****************自定义插入函数*****************/
void insert()
{
FILE *fp;
int i,j,k,m=0;
char snum[15];
if((fp=fopen("data","ab+"))==NULL)
{
printf("can not open the file\n");
return;
}
while(!feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
if(m==0)
{
printf("没有记录!\n");
fclose(fp);
return;
}
printf("请输入你要插入的位置!(请输入学号)\n");
scanf("%s",snum);/*输入要插入的位置*/
for(i=0;i<m;i++)
if(strcmp(snum,stu[i].num))
break;
for(j=m-1;j>i;j--)
stu[j+1]=stu[j];/*从最后一条记录开始均向后移一位*/
printf("现在请输入新的信息.\n");
printf("学号:");
scanf("%s",stu[i+1].num);
for(k=0;k<m;k++)
if(stu[k].num==stu[i+1].num&&k!=i+1)
{
printf("the number is existing,press any to continue!");
getch();
fclose(fp);
return;
}
printf("姓名:\n");
scanf("%s",stu[i+1].name);
printf("\n工科数学成绩:");
scanf("%lf",&stu[i+1].score[0]);
printf("\n大学英语成绩:");
scanf("%lf",&stu[i+1].score[1]);
printf("\nC语言成绩:");
scanf("%lf",&stu[i+1].score[2]);
stu[i+1].sum=stu[i+1].score[0]+stu[i+1].score[1]+stu[i+1].score[2];/*计算出总成绩*/
stu[i+1].ave=stu[i+1].sum/3.0;
if((fp=fopen("data","wb"))==NULL)
{
printf("can not open the file\n");
return;
}
for(k=0;k<=m;k++)
if(fwrite(&stu[k] ,LEN,1,fp)!=1)/*将修改后的记录写入磁盘文件中*/
{
printf("保存失败!");
getch();
}
fclose(fp);
}
14.统计学生人数
/*************统计学生人数************/
void total()
{
FILE *fp;
int m=0;
if((fp=fopen("data","ab+"))==NULL)
{
printf("can not open the file\n");
return;
}
while(!feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;/*统计记录个数即学生个数*/
if(m==0)
{
printf("没有记录!\n");
fclose(fp);
return;
}
printf("该年级有 %d 个学生!\n",m);/*将统计的个数输出*/
fclose(fp);
}
15.查找学生成绩函数
/**********************自定义查找函数*********************/
void search()
{
FILE *fp;
int i,m=0;
char snum[15];
char ch[2];
if((fp=fopen("data","ab+"))==NULL)
{
printf("can not open the file\n");
return;
}
while(!feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("没有记录!\n");
return;
}
printf("请输入学号:");
scanf("%s",snum);
for(i=0;i<m;i++)
if(strcmp(snum,stu[i].num))/*查找输入的学号是否在记录中*/
{
printf("找到该学生成绩,是否显示?(y/n)");
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
{
printf(" 学期 专业班级 姓名 学号 工科数学 大学英语 C语言 总分 平均分 \n");
printf(FORMAT,DATA);/*将查找出的结果按指定格式输出*/
break;
}
else
return;
}
if(i==m)
printf("没有找到该学生的成绩!\n");/*未找到要查找的信息*/
}
16.显示某班学生成绩信息函数
/*****************按班级输出学生成绩****************/
void ShowClassS()
{
int i,j;
char k[15];
printf("请输入班级:\n");
scanf("%s",k);
printf(" 学期 专业班级 姓名 学号 工科数学 大学英语 C语言 总分 平均分 \n");
for(i=0;i<R;i++)
{
if(strcmp(k,stu[i].Class))
{
stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].ave=stu[i].sum/3.0;
printf(FORMAT,DATA);//按班级输出学生成绩
}
}
system("pause");
system("cls");
}
17.输出不及格学生成绩单
/***********输出不及格学生成绩****************/
void ShowFailS()
{
int i,j;
printf("不及格学生名单及成绩:\n\n");
printf(" 学期 专业班级 姓名 学号 工科数学 大学英语 C语言 总分 平均分 \n");
for(i=0;i<R;i++)
{for(j=0;j<3;j++)
{
if(stu[i].score[j]<60)
printf(FORMAT,DATA); /*输出不及格学生名单及成绩*/
break;
}
}
}