资源描述
学生证管理系统课程设计报告
C语言课程设计实验报告
课程设计题目:学生证管理系统
姓名:
学号:
班级:
专业:
指导教师:
2014年 1 月 2 日
学生证管理系统课程设计报告
1。需求分析。
根据学生证管理的需要,建一个“学生证管理系统”,以方便对学生证信息的各项管理操作。要求完成:1.能对学生证信息进行录入和修改2.能按照学号和班级号显示学生证信息和更改、删除信息。
2。总体设计.
根据以上分析,本系统主要包括:从键盘输入学生证信息、从指定的文件中读入学生证信息、按照学号和班号查询学生证信息、删除和修改学生证信息.
(1) 主函数main():定义学生结构体数组,输出操作对话框,调用录入、查询、删除、输出等函数对学生证信息进行处理。
(2) 录入函数enter():从键盘输入学生证信息。
(3) 录入函数load():从文件输入学生证信息.
(4) 查询函数search():按学号查找记录信息。
(5) 查询函数display():按班级查找记录信息.
(6) 删除函数del():删除指定学号的学生记录.
(7) 修改函数modify():按照指定学号修改记录。
学生证管理系统
程序功能机构图如下:
学号查询
班级查询
键盘输入
文件输入
修改记录
删除记录
3。详细设计.
本功能一共有16个函数,其中一个主函数,15个功能模块,每个功能模块都是由于主函数或其他功能模块调用,分别说明如下:
1.主函数main().输入操作s
输入菜单
开始
键盘输入
文件输入
删除记录
修改记录
班级查询
学号查询
继续操作否
结束
Y
N
图1。2 主程序流程图
(2)键盘输入函数.
键盘输入函数主要完成学生信息从屏幕输入数据,并将数据保存到文本文件中,以备后用.
开始
流程图:
输入学生信息
是否继续
结束
Y
N
(3)文件输入函数。
文件输入函数主要完成学生信息从文件中读入数据.
开始
打开文件
结束
关闭文件
是否继续
读入学生证信息
Y
N
图1.4文件输入流程图
(4)学号查询函数.
学号查询函数是完成由用户输入需要查询的学号,在现有学生信息中查询是否有此学生信息存在,查到输出学生全部信息,没查到则输出“此学生部存在”信息。
流程图如下:
开始
打开文件
读入学生证信息
输入查到学生信息
结束
关闭文件
输出学生不存在信息
查到否
输入查询学号
Y
N
图1.5 学号查询流程图
(5)班级查询函数。
输出查到学生信息
结束
关闭文件
输出此班级学生不存在信息
查到否?
输入查询班号
读入学生信息
打开文件
开始
班级查询函数是完成由用户输入需要查询的班级,在现有学生信息中查询此班级的全部学生信息,查到输出全部信息,没差到则输出“此班级学生不存在”信息.
Y
N
(6)学号删除函数。
学号删除函数是完成由用户输入需要删除的学号,在现有学生信息中查询是否有该学生信息存在,查到则删除此学生全部信息,没查到则输出“此学生不存在"信息。
程序流程图如下:
开始
打开文件
读入学生信息
输入删除学号
找到否?
输入此学生不存在信息
关闭文件
结束
删除此学生信息
Y
N
(7)修改函数。
修改函数主要是完成根据学号查找到学生信息,输出学生信息,然后修改学生信息。
修改此学生信息
结束
关闭文件
输出此学生不存在信息
找到否?
输入修改学号
读入学生学号
打开文件
开始
程序流程如下:
Y
N
图1。7 学号修改流程图
4.测试结果。
(1)程序运行主菜单
1.9 主菜单界面
(2)从文件输入并显示结果
(3)按学号查找。
(4)修改测试.
(5)按班号浏览。
(6) 统计班级的人数。
(7)删除功能测试.
5。软件操作使用说明书.
本软件采用命令行对话方式进行操作,运行后出现主界面如图1。9所示,然后按菜单提示操作即可.
6。总结。
通过本次课程设计练习,我们学会了科学分析问题解决问题的方法,从问题分析下手,然后进行模块设计,详细设计,再进行代码编写和测试。在调试程序过程中,学会了分模块进行,避免了以前那种将程序全部功能都放在main()函数中完成的弊病,使得调试过程更加顺利.另外通过本次练习,在前面学习过程中碰到的诸如结构体使用.指针使用.函数之间参数传递等难点问题也迎刃而解了。
源代码:
//student。h
#include <stdio。h〉//I/O函数
#include <stdlib.h〉//标准库函数
#include <string.h〉//字符串函数
#include 〈ctype.h>//字符操作函数
#define M 50//定义常数表示记录数
typedef struct//定义数据结构
{
char no[20];//学号
char name[20];//姓名
char sex[5];//性别
char classes[20];//班号
char subject[20];//学院专业
}STUDENTS;
//以下是函数原型
#include”stufun。h”
//student.cpp
//菜单函数,函数返回值为整数,代表所选的菜单项 ....。.。.。。。。.。。。.。。.。。。.。..。。。..
int menu_select()
{
char s[80];
int c;
printf(”******************************主菜单*********************\n”);
printf("* 0。 输入学生证信息记录*\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("*********************************************************\n");
do
{
printf(”\n 输入您的菜单选项编号(0-10):”); //提示输入选项
scanf("%s",s);//输入选择项
c=atoi(s);//将输入的字符串转化为整型数
getchar();
}while(c<0||c>10);//选择项不在0~10之间重输
return c;//返回选择项,主程序根据该数调用相应的函数
}
//输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度 。。。。。.。.。.。。...。。..。。。.
int enter(STUDENTS t[])
{
int i,n;
system(”cls”);
printf(”\n请输入学生记录条数:\n");
scanf(”%d",&n);//输入记录数
printf(”请输入学生记录:\n”);
printf(”学号 姓名 性别 班号 学院专业\n");
printf("-——-—--——————--————-----————--—--—-—-———--——-——-——-—-——--—-—----——---——-\n”);
for (i=0;i〈n;i++)
{
scanf(”%s”,t[i]。no);//输入学号
scanf("%s”,t[i]。name);//输入姓名
scanf(”%s”,t[i]。sex);//输入性别
scanf("%s”,t[i]。classes);//输入班号
scanf("%s”,t[i].subject);//学院专业
}
getchar();
return n;//返回记录条数
}
//显示记录,参数为记录数组和记录条数 。。。.。.。。。。。.。.。。。。。..。...
void list(STUDENTS t[],int n)
{
int i;
system(”cls");
printf(”\n********************学生清单************************\n");
printf("学号 姓名 性别 班号 学院专业\n”);
printf(”-—--———--———-—————--——--——————-—---—————-—--——-—-—————-—-—-——-—--—-—-—-—\n”);
for(i=0;i〈n;i++)
{
printf(”%—20s%-20s%—10s%-10s%—10s\n",t[i].no,t[i].name,t[i].sex,t[i].classes,t[i]。subject);
if((i+1)%10==0&&n%10〉0)//判断输出是否达到10条记录
{
printf("-———---—---———--—-—-————-—————-——-——---———————--——-—----—---———-———-————\n”);
printf("每页显示10条学生记录,按回车键向后翻页。。。\n”);
getchar();
system("cls”);
printf("\n********************学生清单************************\n”);
printf(”学号 姓名 性别 班号 学院专业\n”);
printf(”—--—-————-—-——--—--—-——--——---——-—-—————-————-—-———————-——-—--—-——--—---\n");
}
}
printf(”-——-—————---——---———————--—-—-——-—---—-—-——————--——-————---———-———---——-\n”);
}
//查找记录 。.。.。。。。......。。。.。。。。...。
void search(STUDENTS t[],int n)
{
char s[20];//保存待查找学号字符串
int i;//保存查找到结点的序号
system("cls");
printf(”请输入查找的学号:\n”);
scanf(”%s",s);//输入待查找学号
getchar();
i=find_no(t,n,s);//调用find_no函数,得到一个整数
if(i>n-1)//如果整数i值大于n—1,说明没找到
printf("没有学号为%s的学生!\n”,s);
else
print(t[i]);//找到,调用显示函数显示记录
}
//删除函数,参数为记录数组和记录条数 .。..。。。。。。。.。...。。.。。。。。。。。
int del(STUDENTS t[],int n)
{
char s[20];//要删除记录的学号
int ch=0;
int i;
printf(”请输入要删除的学生学号:\n”);
scanf(”%s”,s);//输入学号
getchar();
i=find_no(t,n,s);//调用find_no函数
if(i==n)
printf(”没有找到学号为%s的学生!\n",s);
else
{
printf("正在删除中!\n”);
for(;i〈n;i++)//从删除位置开始依次前移学生记录
{
strcpy(t[i]。name,t[i+1]。name);
strcpy(t[i].no,t[i+1]。no);
strcpy(t[i].sex,t[i+1].sex);
strcpy(t[i]。classes,t[i+1]。classes);
strcpy(t[i]。subject,t[i+1]。subject);
}
n-—;//删除后记录数减1
printf("删除成功!\n”);
}
return n;//返回记录数
}
//插入记录函数,参数为结构体数组和记录数 。...。。。..。。。。.。....。。。。.。。。。。.。.。
int add(STUDENTS t[],int n)
{
STUDENTS temp;//新插入记录信息
int i,j;
char s[20];//确定插入在哪个记录之前
printf(”请输入要插入的学生记录:\n”);
printf("************************************************\n");
printf("学号 姓名 性别 班号 学院专业\n”);
printf(”—-—————-—————-———-———-—-——-————-——-——-——-———-—--—------—-—--—————------—\n”);
scanf(”%s%s%s%s%s”,temp。no,temp.name,temp.sex,temp。classes,temp。subject); //输入插入信息
getchar();
printf("——-—-——--———---——————-——---———-———----—-—--———————-———-————————-———--——-\n”);
if(n>0)
{
printf("请输入插入位置的姓名,将新记录插入在该名字前:\n”);
scanf(”%s”,s);//输入插入位置的姓名
getchar();
i=find_name(t,n,s);//调用find_name,确定插入位置
}
else
i=0;
for(j=n-1;j>=i;j——)//从最后一个结点开始向后移动一条
{
strcpy(t[j+1].no,t[j]。no); //当前记录的学号拷贝到后一条
strcpy(t[j+1]。name,t[j]。name); //当前记录的姓名拷贝到后一条
strcpy(t[j+1]。sex,t[j]。sex); //当前记录的性别拷贝到后一条
strcpy(t[j+1].classes,t[j]。classes); //当前记录的班号拷贝到后一条
strcpy(t[j+1]。subject,t[j].subject); //当前记录的学院专业拷贝到后一条
}
strcpy(t[i].no,temp。no); //将新插入记录的学号拷贝到第i个位置
strcpy(t[i].name,temp。name); //将新插入记录的姓名拷贝到第i个位置
strcpy(t[i].sex,temp。sex); //将新插入记录的性别拷贝到第i个位置
strcpy(t[i]。classes,temp.classes);
strcpy(t[i].subject,temp。subject); //将新插入记录的年龄拷贝到第i个位置
n++; //记录数加1
return n; //返回记录数
}
//保存函数,参数为结构体数组和记录数 。。.。.。。。.。。。.。。.。。。..。..。.。.。.。。。。
void save(STUDENTS t[],int n)
{
int i;
FILE *fp; //指向文件的指针
if((fp=fopen(”record.txt”,”wb”))==NULL)//打开文件,并判断打开是否正常
{
printf("无法打开学生记录文件!\n");//打开失败
exit(1); //退出
}
printf(”\n正在保存中\n”);
fprintf(fp,”%d",n); //将记录数写入文件
fprintf(fp,”\r\n"); //将换行符号写入文件
for(i=0;i〈n;i++)
{
fprintf(fp,"%—20s%-30s%—10s%-10s%-10s”,t[i]。no,t[i]。name,t[i].sex,t[i]。classes,t[i].subject);
//格式写入记录
fprintf(fp,”\r\n");//将换行符号写入文件
}
fclose(fp);//关闭文件
printf(”****保存成功***\n”);//显示保存成功
}
//读入函数,参数为结构体数组 .。......。..。。。。。。。。.。。....。。.
int load(STUDENTS t[])
{
int i,n;
FILE *fp;//指向文件的指针
if((fp=fopen("record。txt","rb"))==NULL)//打开文件
{
printf(”无法打开学生记录文件!\n");//打开失败
exit(1);//退出
}
fscanf(fp,”%d”,&n); //读入记录数
for(i=0;i〈n;i++)
fscanf(fp,"%20s%30s%10s%10s%10s",t[i].no,t[i]。name,t[i]。sex,t[i]。classes,t[i]。subject);
//按格式读入记录
fclose(fp); //关闭文件
printf("已经成功加载学生记录文件到内存!\n"); //显示保存成功
return n; //返回记录数
}
//按班号显示记录函数 。.。。。。。。。。。。.。。。。.。.。.。。..。。.。..。
void display(STUDENTS t[],int n)
{
int i;
char s[20];
printf(”请输入班号:\n");
scanf("%s”,s); //输入班号
getchar();
i=find_classes(t,n,s);
if(i〉n-1)
printf(”没有班号为%d的班级\n",s);
else
{
printf(”\n********************学生清单************************\n”);
printf("学号 姓名 性别 班号 学院专业\n”);
printf(”—-—-—-———-—--——-————-—--—-———-—-—————-—-——-—-—-——-———-—-——————-—-—--——-—\n—”);
for(i=0;i〈n;i++)
{
if(strcmp(s,t[i].classes)==0)
{
printf(”%—20s%—20s%—10s%-10s%—10s\n”,t[i].no,t[i]。name,t[i]。sex,t[i]。classes,t[i].subject);
}
}
printf(”——-—————---——-————-————-—--—-—-——--——-----—--———-——-——————-——-—--—--———-\n—”);
}
}
//按班号统计人数..。。。.。。
void classcount(STUDENTS t[],int n)
{
int i;
char s[20];
printf(”请输入班号:\n”);
scanf(”%s”,s); //输入班号
getchar();
i=find_classes(t,n,s);
if(i>n—1)
printf(”没有班号为%d的班级\n",s);
else
{
int j=0;
for(i=0;i〈n;i++)
if(strcmp(s,t[i]。classes)==0)
j++;
printf("该班一共有%d人\n",j);
}
}
//显示指定的一条记录
void print(STUDENTS temp)
{
printf("\n****************************************************\n”);
printf(”学号 姓名 性别 班号 学院专业\n”);
printf(”————-———-————--—-—-——-—-—-------—-——-———-——-—-—-—————————————--—-——-—-—-\n");
printf(”%—20s%-20s%-10s%-10s%—10s\n",temp.no,temp.name,temp.sex,temp。classes,temp.subject);
printf(”--—-—--—-———-—--——-—---—-—-——--—--—--—---———————-————-—----—————-————--—\n”);
}
//按姓名查找函数,参数为记录数组和记录条数以及姓名s 。.。。.。。.。.。.。.。.。。..。。...。.。。。。。。..
int find_name(STUDENTS t[],int n,char *s)
{
int i;
for(i=0;i<n;i++) //记录开始,直到最后一条
{
if(strcmp(s,t[i].name)==0) //记录中的姓名和待比较的姓名是否相等
return i; //相等,则返回该记录的下标号,程序提前结束
}
return i; //返回i值
}
//按班号查找函数,参数为记录数组和记录条数以及姓名s 。。。。。。。.。。。。。。。..。.。。。。。。。。。....。。。
int find_classes(STUDENTS t[],int n,char *s)
{
int i;
for(i=0;i〈n;i++) //记录开始,直到最后一条
{
if(strcmp(s,t[i]。classes)==0) //记录中的姓名和待比较的姓名是否相等
return i; //相等,则返回该记录的下标号,程序提前结束
}
return i; //返回i值
}
//按学号查找函数,参数为记录数组和记录条数以及学号no ..。.。。。。。.。。。。。。。....。.。。.
int find_no(STUDENTS t[],int n,char *no)
{
int i;
for(i=0;i〈n;i++) //从第一条记录开始,直到最后一条
{
if(strcmp(no,t[i]。no)==0) //记录中的学号和待比较的学号是否相等
return i; //相等,则返回该记录的下标号,程序提前结束
}
return i; //返回i值
}
//修改函数,按照输入学号修改
void modify(STUDENTS t[],int n)
{
char no[20]; //要修改记录的学号
int ch=0;
int i;
printf("请输入要修改的学生学号:\n”);
scanf(”%s”,no);//输入学号
getchar();
i=find_no(t,n,no); //调用find_no函数
if(i==n)
printf(”没有找到学号为%s的学生!\n",no);
else
{
printf(”学号为%s的学生修改前:\n”,no);
print(t[i]);
printf("请输入修改后学生记录:\n”);
printf("学号 姓名 性别 班号 学院专业\n”);
printf("-----—————-—————-—-————---—-————-—-———————--——--———-——-—————-————-—---——\n”);
scanf(”%s”,t[i]。no);
scanf("%s",t[i]。name);
scanf(”%s",t[i].sex);
scanf("%s",t[i]。classes);
scanf(”%s",t[i]。subject);
getchar();
printf(”学号为%s的学生修改后:\n”,no);
print(t[i]);
}
}
//main.cpp
//主函数开始
void main()
{
STUDENTS stu[M]; //定义结构体数组
int length; //保存记录长度
for(;;) //无限循环
{
system("cls”); //清屏
switch(menu_select()) //调用主菜单函数,返回值作为开关语句的条件
{
case 0:length=enter(stu);break; //输入记录
case 1:list(stu,length);break; //显示全部记录
case 2:search(stu,length);break; //按学号查找记录
case 3:length=del(stu,length);break; //按学号删除记录
case 4:modify(stu,length);break; //按学号修改记录
case 5:length=add(stu,length);break; //插入记录
case 6:save(stu,length);break; //保存文件
case 7:length=load(stu);break; //加载文件到内存
case 8:display(stu,length);break; //按班号显示记录
case 9:classcount(stu,length);break; //统计班级人数
case 10:exit(0); //程序结束
}
printf("按回车键返回主菜单。.。\n”); //提示信息
getchar();
}
return;
}
12
展开阅读全文