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.2 主程序流程图(2)键盘输入函数。
键盘输入函数主要完成学生信息从屏幕输入数据,并将数据保存到文本文件中,以备后用。
流程图:Y(3)文件输入函数。
文件输入函数主要完成学生信息从文件中读入数据。
Y(4)学号查询函数。
学号查询函数是完成由用户输入需要查询的学号,在现有学生信息中查询是否有此学生信息存在,查到输出学生全部信息,没查到则输出“此学生部存在”信息。
流程图如下:图1.5 学号查询流程图班级查询函数是完成由用户输入需要查询的班级,在现有学生信息中查询此班级的全部学生信息,查到输出全部信息,没差到则输出“此班级学生不存在”信息。
学号删除函数是完成由用户输入需要删除的学号,在现有学生信息中查询是否有该学生信息存在,查到则删除此学生全部信息,没查到则输出“此学生不存在”信息。
程序流程图如下:(7)修改函数。
修改函数主要是完成根据学号查找到学生信息,输出学生信息,然后修改学生信息。
程序流程如下:图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].classe s,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);elseprint(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--; //删除后记录数减1printf("删除成功!\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.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,确定插入位置}elsei=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,); //将新插入记录的拷贝到第i个位置strcpy(t[i].sex,temp.sex); //将新插入记录的性别拷贝到第i个位置strcpy(t[i].classes,temp.classes);strcpy(t[i].subject,temp.subject); //将新插入记录的年龄拷贝到第i个位置n++; //记录数加1return 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].clas ses,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.sex,temp.classe s,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;}。