资源描述
C语言课程设计实验报告
一、设计目的:
学生信息包括:学号、姓名、性别、系名、班级名、出生年月、住址、电话号码。设计一学生信息管理系统,使之能提供以下功能:4A3cdmc。
1.系统以菜单方式工作;
2.学生信息录入功能(输入);
3.学生信息浏览功能(输出);
4.学生信息检索功能;
5.学生信息的删除与修改功能;
二、总体设计思路:
1>程序设计组成框图
主菜单
添加新的学生信息
浏览所有学生信息
检索学生信息
按学号检索
按姓名检索
修改此同学信息
删除此同学信息
检索信息库
添加新的学生信息
删除所有记录
保存并退出
81lb6tl。
C语言课程设计学生信息管理系统
2>N-S流程图case ‘4’
case ‘3’
Case’ 2’
case ‘1’
结束
调用add()
添加新的学生信息
()
Menu()
输入选择x
调用scan()
浏览所有学生信息
退出系统
调用res()
检索学生信息
x
开始
()
f6Bj3e0。
三、详细设计说明:
1>头文件
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
2>数入口说明
main();主函数;
void menu();主菜单界面;
void add();添加新的学生信息;
void print(int i);打印学生信息;
void scan();查找学生信息;
void res();检索学生信息界面;
void res_name();按姓名检索;
void res_num();按学号检索;
void del(int i);删除学生信息;
void modify(int i);修改学生信息;
void ();打开文件;
void ();保存文件;
2>调用关系
add()
menu()
add()
()
res()
add()
menu()
scan()
menu()
main()
modify(int i)
res_name()
res()
del(int i)
menu()
res_num()
()
4.调试与测试:
Ø 编译工具
1.C/C++程序设计学习与实验系统
2.Tc
3.VC++6.0
均通过调试!
Ø 主菜单
Ø 添加新的学生信息
Ø 浏览所有学生信息
Ø 检索信息库
Ø 继续查找下一条
Ø 修改学生信息
Ø 删除信息库所有记录
五、调试中所遇到的问题及解决方法
1>问题:程序退出后,再次打开,上次输入的数据无法保存。
解决:调用()与()保存文件数据,方便第二次打开程序时仍能调用上次输入的数据。
2>问题:跳出的界面与选择分支中的对应项不符合。
解决:改getchar()为getch(),头文件中加”conio.h”.因为getchar()从输入输出流中一次只能读取一个字符,而且需要以回车来确认输入。本文件中多次用到getchar(),键盘缓冲区的’\n’会被下次调用getchar()时接收。而getch()则不会,从键盘上读入一个数据,不给回显,不需要回车确认,按下键就实现了函数。XGNddA9。
3>问题:误输入X,导致退出。
解决:加标志变量flag=1,用while(flag)循环switch语句,当正确输入时,flag=1,跳出循环。h6mJFgk。
4>问题:检索时只能查到第一个学生信息。
解决:定义数组log(100)记录符合的结构体数组。循环打印。
5>问题:不能刷新界面。
解决:调用system(“cls”)清屏函数。
6>问题:删除某项信息,返回主函数时不能暂停。
解决:调用system(“PAUSE”)暂停函数。
六、程序源码
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"
void menu(); //声明所有函数;
void add();
void print(int i);
void scan();
void res();
void res_name();
void res_num();
void del(int i);
void modify(int i);
void ();
void ();
; //定义全局变量x,减少代码量;
int n=0; //定义全局变量n,代表信息条数;
struct student //定义结构体数组stu[100];
{
char num[15];
char name[30];
char sex[2];
char xi[30];
char ban[10];
char birth[10];
char address[30];
char tel[20];
}stu[100];
void main() //主函数;
{
();
menu(); //调用menu()函数,打开主界面;
();
}
void () //打开data文件;
{
FILE *fp;
int i;
if((fp=fopen("data","r+"))==NULL) //若无data文件,则新建;GSDBhmf。
fp=fopen("data","w+");
for(i=0;i<100;i++) //读取数据;
fread(&stu[i],sizeof(struct student),1,fp);
fread(&n,4,1,fp);
fclose(fp);
}
void menu() //主菜单;
{
int flag=1; //定义标志标量flag;
system("cls"); //清屏函数;
printf("┌────────────────────┐\n"); //主界面;
printf("│ ☆欢迎登录学生信息管理系统★ │\n");
printf("│ │\n");SszXHLU。
printf("│ 1.添加新的学生信息 │\n");
printf("│ 2.浏览所有学生信息 │\n");
printf("│ 3.检索学生信息 │\n");
printf("│ 4.保存并退出系统 │\n");
printf("│ │\n");7Oi7gDj。
printf("│ by rlk│\n");DiX5Sa0。
printf("└────────────────────┘\n");
while(flag) //防止用户误选导致退出;
switch(getch()) //用switch分支选择语句;getch()获取用户键入值;cQRWRWA。
{
case '1':flag=0;add();break;//当用户选择1时,调用add()函数,添加新的学生信息;YP1EhoS。
case '2':flag=0;scan();break;//当用户选择2时,调用scan()函数,浏览所有学生信息;AYu7utr。
case '3':flag=0;res();break;//当用户选择3时,调用res()函数,检索学生信息;rfzK04C。
case '4':flag=0;printf("√保存成功!");break; //当用户选择4时,调用flag()函数,退出系统;4efi8ue。
default:printf("※错误!请重新输入..\n"); //其它输入,提示错误;
}
}
void add() //信息添加函数;
{
int flag=1;
system("cls"); //清屏函数;
printf("──────────%2d───────────\n",n+1); //逐一输入各项数据;VaMl2sS。
printf(" *添加新的学生信息*\n");
printf(" ①学号:");
scanf("%s",&stu[n].num);
printf(" ②姓名:");
scanf("%s",&stu[n].name);
printf(" ③性别:");
scanf("%s",&stu[n].sex);
printf(" ④系名:");
scanf("%s",&stu[n].xi);
printf(" ⑤班级名:");
scanf("%s",&stu[n].ban);
printf(" ⑥出生年月:");
scanf("%s",&stu[n].birth);
printf(" ⑦住址:");
scanf("%s",&stu[n].address);
printf(" ⑧电话号码:");
scanf("%s",&stu[n].tel);
printf("──────────────────────\n");
printf("\n√添加成功!\n\n☆ 请选择 : 1.继续添加 2.返回主菜单\n");
n++; //总信息量增加一项;
while(flag)
switch(getch())
{
case '1':flag=0;add();break; //选择'1',重新调用add();PGZYKTz。
case '2':flag=0;menu();break; //选择'2',调用menu(),返回主菜单;Gm2fBTg。
default:printf("※错误!请重新输入..\n"); //其它输入,提示错误;
}
}
void print(int i) //学生信息打印函数;XCJpVBN。
{
printf("──────────%2d──────────\n",i+1);
printf(" ①学号:%s\n",stu[i].num);
printf(" ②姓名:%s\n",stu[i].name);
printf(" ③性别:%s\n",stu[i].sex);
printf(" ④系名:%s\n",stu[i].xi);
printf(" ⑤班级名:%s\n",stu[i].ban);
printf(" ⑥出生年月:%s\n",stu[i].birth);
printf(" ⑦住址:%s\n",stu[i].address);
printf(" ⑧电话号码:%s\n",stu[i].tel);
printf("─────────────────────\n");
}
void scan() //信息浏览函数;NAsM5UF。
{
int i,flag=1;
system("cls");
if(n==0) //当n==0时,信息库中无记录; tPto5Y6。
{
printf("──────────────────────\n");
printf(" 当前信息库记录为0!\n");
printf("──────────────────────\n");
printf("☆ 请选择 : 1.添加新的学生信息 2.返回主菜单\n");
while(flag)
switch(getch())
{
case '1':flag=0;add();break;
case '2':flag=0;menu();break;
default:printf("※错误!请重新输入..\n");
}
}
else //当n不为0时,打印信息;
{
printf("**********目前信息库里共有%d条记录.*********\n",n);
for(i=0;i<n;i++)print(i);
printf("☆ 请选择 : 1.检索信息库 2.添加新的学生信息\n");
printf(" 3.删除所有记录4.返回主菜单 \n");
while(flag)
switch(getch())
{
case '1':flag=0;res();break;
case '2':flag=0;add();break;
case '3':
flag=0;
printf("\n!!!!!!!!!!!!警告:您将删除信息库所有记录!!!!!!!!!!!!\n");Oge5tIM。
printf(" \n☆ 请选择 : 1.确认删除 2.返回\n");
flag=1;
while(flag)
switch(getch())
{
case '1':flag=0;n=0;printf("√已删除!\n");system("PAUSE");scan();break;WsfVnNY。
case '2':flag=0;scan();
default:printf("※错误!请重新输入..\n");
}break;
case '4':flag=0;menu();break;
default:printf("※错误!请重新输入..\n");
}
}
}
void modify(int i) //信息修改函数;3ypSqQY。
{
int flag=1;
printf(" ────────────────────────\n"); //信息修改界面;W62ZeQd。
printf(" ☆请输入你想修改的内容:\n");
printf(" 1.学号 2.姓名 3.性别 4.系名\n");
printf(" 5.班级名 6.出生年月 7.住址 8.电话号码\n");
printf(" ────────────────────────\n");
while(flag)
switch(getch())
{
case '1':flag=0;printf("请重新输入学号:");scanf("%s",&stu[i].num);break;svOalWB。
case '2':flag=0;printf("请重新输入姓名:");scanf("%s",&stu[i].name);break;6177Qt1。
case '3':flag=0;printf("请重新输入性别:");scanf("%s",&stu[i].sex);break;POA9w9s。
case '4':flag=0;printf("请重新输入系名:");scanf("%s",&stu[i].xi);break;OJXLv5a。
case '5':flag=0;printf("请重新输入班级名:");scanf("%s",&stu[i].ban);break;hgDiJoL。
case '6':flag=0;printf("请重新输入出生年月:");scanf("%s",&stu[i].birth);break;9E0gloC。
case '7':flag=0;printf("请重新输入住址:");scanf("%s",&stu[i].address);break;SnUIkGO。
case '8':flag=0;printf("请重新输入电话号码:");scanf("%s",&stu[i].tel);break;bdZlVFR。
default:printf("※错误!请重新输入..");
}
printf("√修改成功!\n修改后的学生信息:\n");
print(i);
system("PAUSE"); //暂停函数:按任意键继续..;HFPwdRS。
printf("☆ 请选择 : 1.继续修改此学生信息 2.查看下一条相关信息 3.返回主菜单\n");tgkpX7f。
flag=1;
while(flag)
switch(getch())
{
case '1':flag=0;modify(i);break;
case '2':flag=0;break;
case '3':flag=0;menu();
default:printf("※错误!请重新输入..\n");
}
}
void del(int i) //信息删除函数;Lq9gLTy。
{
int a,flag=1;
printf("\n!!!!!!!!!!!!警告:您将删除此条学生信息!!!!!!!!!!!!");
printf("\n ☆ 请输入 : 1.继续删除");
printf("\n 2.不删除,返回主菜单\n");fBLTw3g。
while(flag)
switch(getch())
{
case '1':
flag=0;
for(a=i;a<n-1;a++) //拷贝后一个学生信息到前一个人上。
{
strcpy(stu[a].num,stu[a+1].num);
strcpy(stu[a].name,stu[a+1].name);
strcpy(stu[a].sex,stu[a+1].sex);
strcpy(stu[a].xi,stu[a+1].xi);
strcpy(stu[a].ban,stu[a+1].ban);
strcpy(stu[a].birth,stu[a+1].birth);
strcpy(stu[a].address,stu[a+1].address);
strcpy(stu[a].tel,stu[a+1].tel);
}
n--;
printf("√删除成功!\n");//总信息量减少一项;
system("PAUSE");
menu();
break;
case '2':
flag=0;
system("PAUSE"); //暂停函数:按任意键继续..;
menu(); //返回主菜单;
break;
default:printf("※错误!请重新输入..\n");
}
}
void res_num() //按学号检索函数;tcHB32n。
{
int i,j=0,flag=1,log[100];
char xh[15];
system("cls");
printf("******************************************\n");4fN89eh。
printf("\n☆请输入要检索的学号:");
scanf("%s",&xh);
for(i=0;i<n;i++)
if(!strcmp(stu[i].num,xh)) //字符串比较函数;dVwrm3F。
while(j<100){log[j]=i;j++;break;} //记录下相关的信息;1Gi9H6K。
if(!j) //信息库中没查找到所需信息;RMBb2Qt。
{
printf(" 对不起,信息库里没要你想要查找的信息!\n");
printf("\n******************************************\n");dWLN8gB。
printf("\n☆ 请选择 :1.继续查找 2.返回主菜单\n");
while(flag)
switch(getch())
{
case '1':flag=0;res();break;
case '2':flag=0;menu();break;
default:printf("※错误!请重新输入..\n");
}
}
else
{
printf("\n在信息库中共找到%d条相关信息..\n",j);
for(i=0;i<j;i++)
{
flag=1;
printf("\n第%d条\n",i+1);
print(log[i]);
printf("\n******************************************\n"); xH9zapu。
printf("\n☆ 请选择 :1.修改此学生信息 2.删除此学生信息\n");
printf(" 3.继续查找下一条 4.返回主菜单\n");
while(flag)
switch(getch())
{
case '1':flag=0;modify(log[i]);break;
case '2':flag=0;del(log[i]);break;
case '3':flag=0;break;
case '4':flag=0;menu();break;
default:printf("※错误!请重新输入..\n");
}
}
printf("\n已到最后一条相关信息..\n");
system("PAUSE"); //暂停函数:按任意键继续..; pZBiGr3。
menu();
}
}
void res_name() //按姓名检索函数;IL0kZs3。
{
int i,j=0,flag=1,log[100];
char mz[20];
system("cls");
printf("******************************************\n");iemSGWa。
printf("\n☆请输入要检索的姓名:");
scanf("%s",&mz);
for(i=0;i<n;i++)
if(!strcmp(stu[i].name,mz)) //字符串比较函数;Qj04CqY。
while(j<100){log[j]=i;j++;break;} //记录下相关的信息;pYkcJgt。
if(!j) //信息库中没查找到所需信息;TYNTRjm。
{
printf(" 对不起,信息库里没要你想要查找的信息!\n");
printf("\n******************************************\n");ZVwS67N。
printf("\n☆ 请选择 :1.继续查找 2.返回主菜单\n");
while(flag)
switch(getch())
{
case '1':flag=0;res();break;
case '2':flag=0;menu();break;
default:printf("※错误!请重新输入..\n");
}
}
else
{
printf("\n在信息库中共找到%d条相关信息..\n",j);
for(i=0;i<j;i++)
{
flag=1;
printf("\n第%d条\n",i+1);
print(log[i]);
printf("\n******************************************\n"); fxuolkU。
printf("\n☆ 请选择 :1.修改此学生信息 2.删除此学生信息\n");
printf(" 3.继续查找下一条 4.返回主菜单\n");
while(flag)
switch(getch())
{
case '1':flag=0;modify(log[i]);break;
case '2':flag=0;del(log[i]);break;
case '3':flag=0;break;
case '4':flag=0;menu();break;
default:printf("※错误!请重新输入..\n");
}
}
printf("\n※已到最后一条相关信息..\n");
system("PAUSE");
menu();
}
}
void res() //检索函数;wEOqA1J。
{
int flag=1;
system("cls");
printf(" ────────────────────\n"); //检索界面;ZVrEMT6。
printf(" *检索模式选择*\n");
printf(" 1.按学号检索\n");
printf(" 2.按姓名检索\n");
printf(" 3.返回主菜单\n");
printf(" ────────────────────\n");
while(flag)
switch(getch())
{
case '1':flag=0;res_num();break; //调用res_num()函数,按学号检索;rotrMO1。
case '2':flag=0;res_name();break; //调用res_name()函数,按姓名检索;Qmpqb5M。
case '3':flag=0;menu();break; //调用menu()函数,返回主菜单;aCdlJ59。
default:printf("※错误!请重新输入..\n");
}
}
void () //保存data文件;
{
int i;
FILE *fp;
fp=fopen("data","r+");
for(i=0;i<100;i++)
fwrite(&stu[i],sizeof(struct student),1,fp);
fwrite(&n,4,1,fp);
fclose(fp);
}
七、心得体会
通过这次C程序课程设计,我感受到了编程是一项非常烦琐周密的活动,它不但需要一个人周密的思考问题的能力,处理问题的能力,还需要有足够的耐心和严谨治学的作风,来不得半点马虎,一点小的错误就可能导致整个程序不能运行。我初步学会了课程设计的基本方法,学会了怎样去借鉴别人的方法和经验,知道如何去查找资料和整合处理这些资料的能力,使我收益最大的是享受到了一种成功的喜悦。uWSv54e。
因为C语言底子比较差,我选择的是相对容易的学生信息管理系统。先开始,比较快速的把大体程序代码写出来了,然后是进行编译,这个环节是一个非常痛苦和艰难的,常常会因为一小点的错误而在编译失败与再次修改的漫漫循环之路中,但失败的越多,对人的考验就越多,在编译运行成功之后的享受成功的喜悦也就越多,另外在调试程序的过程中不断的思考和运用已经学到的知识,这对于自己是有很大的提高的。 PSxzlka。
由于所学的知识不多,自己的编程经验不足,仍存在一些问题,如不能实现模糊查找等功能。按现有的知识水平有些东西暂时还无法解决,还有待于在以后的学习中不断提高和改进!QCipztc。
展开阅读全文