C语言程序设计报告
经过上次的飞机游戏制作,使我感觉到C语言程序设计,更加的有趣,也使我对这门课程有了更深的理解和认识。这次我们学习了学习C语言操作文件永久保存数据和基于函数的结构化大型程序的编写方法。这次的学习也比较上次来说显得有些复杂。
这次要做的是一个关于书本的管理系统。可以让我们更加方便的去利用程序查找书本存放的位置和一些基本的信息。
首先建立基本的函数公式:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define PAGE 3
#define MAX 1000
#define N 5
int k=0;
然后定义我们所要设计和查找的变量:
typedef struct
{ int num;
char name[50];
char type[40];
int time;
char place[50];
char writer[50];
}STUDENTS;
这两步对于制作数据库来说十分的重要,也是整个程序的基础和地基,所以这两步绝对不能出错否则后面也将无法进行。从这之后便真正开始数据库的制作。
int read_file(STUDENTS stu[])
{ FILE *fp;
int i=0;
if((fp=fopen("stu.txt","rt"))==NULL)
{printf("\n\n*****库存文件不存在!请创");
return 0;
}
while(feof(fp)!=1)
{
fread(&stu[i],sizeof(STUDENTS),1,fp);
if(stu[i].num==0)
break;
else
i++;
}
fclose(fp);
return i;
}
void save_file(STUDENTS stu[],int sum)
{FILE*fp;
int i;
if((fp=fopen("stu.txt","wb"))==NULL)
{printf("写文件错误!\n");
return;
}
for(i=0;i<sum;i++)
if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1)
printf("写文件错误!\n");
fclose(fp);
}
这一步是当数据库中并没有数据存储的情况下而让程序自己转到输入数据界面的程序,如若有数据存储那么再打开以后便不会转到存储界面。
接着上面如若没有数据转移到输入数据的界面,所以我们为了使输入界面更加简洁开始编辑界面环境:
int input(STUDENTS stu[])
{ int i,x;
for(i=0;i<1000;i++)
{
system("cls");
printf("\n\n 录入书本信息\n",MAX);
printf(" ----------------------------\n");
printf("\n 第%d本书",k+1);
printf("\n 请输入书本的编号:");
scanf("%d",&stu[k].num);
printf("\n 请输入书本的名称:");
scanf("%s",stu[k].name);
printf("\n 请输入书本的类型:");
scanf("%s",stu[k].type);
printf("\n 请输入书本的出版时间:");
scanf("%d",&stu[k].time);
printf("\n 请输入书本的位置:");
scanf("%s",stu[k].place);
printf("\n 请输入书本的作者:");
scanf("%s",stu[k].writer);
printf("\n 请按1键返回菜单或按0键继续创建");
scanf("%d",&x);
if(x)
break;
}
return k;
}
这样我们就可以按照我们所需要的将书本的信息一步一步的输入近数据库中,并且还能够随时返回初始界面。但是,说到创建数据就不得不提到删除数据,所以接下来制作删除数据的程序便是我们先要解决的:
void deletel(STUDENTS stu[])
{ system("cls");
char Stuname2[20];
int i,j;
printf("请输入书本名称:");
scanf("%s",Stuname2);
printf("\n");
for(i=0;i<k;i++)
if(strcmp(stu[i].name,Stuname2)==0)
for(j=0;j<20;j++)
stu[i].name[j]=stu[i+1].name[j];
k--;
printf("删除成功\n");
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
getchar();
}
这个完成之后我们的数据库就算是基本上完成了。但日后要查找数据可能不仅仅是查找那么简单,有可能需要进行打印之类的工作。为了方便使用。我们也将编入打印所需的程序,是这个程序变得更方便。
void output(STUDENTS stu[])
{ system("cls");
int i;
for(i=0;i<k;i++)
printf("编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作家: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
getchar();
}
输入、删除、打印都完成了,接下来便是最关键的一步:查找。这一步相对于之前的几步来说算是最简单的了只需要把存入库中的数据输出即可:
void inquire(STUDENTS stu[])
{ int i;
int num;
system("cls");
printf(" \n\n请输入您要查找的书本的编号");
scanf("%d",&num);
for(i=0;i<k;i++)
if(num==stu[i].num)
printf("\n\n\n编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作者: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
getchar();
}
查找完成之后我们便会发现,我们的数据中只存在创建和删除,然而对于书本来说修改是必不可少的,我们总不可能每次都将数据删除后再创建,太浪费时间了。所以还要做一个修改的程序:
void change(STUDENTS stu[])
{ int num,i,choice;
system("cls");
printf("\n\n\n 请输入您要修改的书本的编号");
scanf("%d",&num);
for(i=0;i<k;i++)
{ if(num==stu[i].num)
printf("\n编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作者: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("\n\n\n ********请输入您想要修改的数据********\n\n");
printf(" 1. 编号\n\n");
printf(" 2. 名称\n\n");
printf(" 3. 类型\n\n");
printf(" 4. 出版时间\n\n");
printf(" 5. 位置\n\n");
printf(" 6. 作者\n\n");
printf(" 请选择(1-6):");
scanf("%d",&choice);
switch(choice)
{case 1:{
printf("\n 请输入你改的新编号");
scanf("%d",&stu[i].num);
break;
}
case 2:{
printf("\n 请输入你改的新名称");
scanf("%s",stu[i].name);
break;
}
case 3:{
printf("\n 请输入你改的新类型");
scanf("%s",stu[i].type);
break;
}
case 4:{
printf("\n 请输入你改的新出版时间");
scanf("%d",&stu[i].time);
break;
}
case 5:{
printf("\n 请输入你改的新位置");
scanf("%s",stu[i].place);
break;
}
case 6:{
printf("\n 请输入你改的新作家");
scanf("%s",stu[i].writer);
break;
}
}
printf("编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作者: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
break;
}
}
之后为了能方便的将数据列举出来做个列举的程序会使整个程序更完成:
void sort(STUDENTS stu[])
{ int i,j,n=1,x;
system("cls");
int t;
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(stu[i].time<stu[j].time)
{ t=stu[i].time;
stu[i].time=stu[j].time;
stu[j].time=t;
t=stu[i].num;
stu[i].num=stu[j].num;
stu[j].num=t;
}
for(i=0;i<k;i++)
printf("排名 编号 名称 日期\n %d %d %d %d\n",n++,stu[i].num,stu[i].name,stu[i].time);
printf("按任意键加回车返回主菜单!");
scanf("%d",&x);
getchar();
}
最后我们要装饰一下我们的主页面使其更美观:
void pagedis()
{
printf(" \n\n\n **********************************\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 欢迎进入书本信息管理系统 *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" **********************************\n");
}
void check()
{
char userName[5];
char userPWD[5];
int i,sum;
system("color 4E");
for(i = 1; i < 4; i++)
{
printf(" 用户名和密码均为abcde\n\n");
printf("\n 请输入您的用户名:");
gets(userName);
printf("\n 请输入您的密码:");
gets(userPWD);
if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))
{
printf("用户名和密码正确,显示主菜单");
return;
}
else
{
if (i < 3)
{
printf("用户名或密码错误,提示用户重新输入");
printf("用户名或密码错误,请重新输入!");
}
else
{
printf("连续3次输错用户名或密码,退出系统。");
printf("您已连续3次将用户名或密码输错,系统将退出!");
exit(1);
}
}
}
}
void menu()
{
STUDENTS stu[20];
int choice,k,sum;
sum=read_file(stu);
if(sum==0)
{ printf("首先录入基本库存信息!按回车后进入*****\n");
getch();
sum=input(stu);
}
do
{ system("cls");
printf("\n\n\n ********书本信息管理系统********\n\n");
printf(" 1. 创建书本信息\n\n");
printf(" 2. 打印书本信息\n\n");
printf(" 3. 查询书本信息\n\n");
printf(" 4. 修改书本信息\n\n");
printf(" 5. 删除书本信息\n\n");
printf(" 6. 书本时间信息列表\n\n");
printf(" 0. 退出系统\n\n");
printf(" 请选择(0-6):");
scanf("%d",&choice);
switch(choice)
{
case 1: k=input(stu); break;
case 2: output( stu) ; break;
case 3: inquire(stu); break;
case 4: change(stu); break;
case 5: deletel(stu); break;
case 6: sort(stu); break;
case 0: break;
}
}while(choice!=0);
save_file(stu,sum);
}
int main()
{
int i,sum;
pagedis();
check();
menu();
}
关于这次的感想:这次的课程使我对C语言这个程序更加的刮目相看,没想到平常的那些看起来十分高级的查找系统也是通过这些基础的软件一点一点制作而成的。看起来复杂的东西只要拆开就会发现它十分的简单易懂。
下面是这次整个程序的完整程序:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define PAGE 3
#define MAX 1000
#define N 5
int k=0;
typedef struct
{ int num;
char name[50];
char type[40];
int time;
char place[50];
char writer[50];
}STUDENTS;
int read_file(STUDENTS stu[])
{ FILE *fp;
int i=0;
if((fp=fopen("stu.txt","rt"))==NULL)
{printf("\n\n*****库存文件不存在!请创");
return 0;
}
while(feof(fp)!=1)
{
fread(&stu[i],sizeof(STUDENTS),1,fp);
if(stu[i].num==0)
break;
else
i++;
}
fclose(fp);
return i;
}
void save_file(STUDENTS stu[],int sum)
{FILE*fp;
int i;
if((fp=fopen("stu.txt","wb"))==NULL)
{printf("写文件错误!\n");
return;
}
for(i=0;i<sum;i++)
if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1)
printf("写文件错误!\n");
fclose(fp);
}
int input(STUDENTS stu[])
{ int i,x;
for(i=0;i<1000;i++)
{
system("cls");
printf("\n\n 录入书本信息\n",MAX);
printf(" ----------------------------\n");
printf("\n 第%d本书",k+1);
printf("\n 请输入书本的编号:");
scanf("%d",&stu[k].num);
printf("\n 请输入书本的名称:");
scanf("%s",stu[k].name);
printf("\n 请输入书本的类型:");
scanf("%s",stu[k].type);
printf("\n 请输入书本的出版时间:");
scanf("%d",&stu[k].time);
printf("\n 请输入书本的位置:");
scanf("%s",stu[k].place);
printf("\n 请输入书本的作者:");
scanf("%s",stu[k].writer);
printf("\n 请按1键返回菜单或按0键继续创建");
scanf("%d",&x);
if(x)
break;
}
return k;
}
void deletel(STUDENTS stu[])
{ system("cls");
char Stuname2[20];
int i,j;
printf("请输入书本名称:");
scanf("%s",Stuname2);
printf("\n");
for(i=0;i<k;i++)
if(strcmp(stu[i].name,Stuname2)==0)
for(j=0;j<20;j++)
stu[i].name[j]=stu[i+1].name[j];
k--;
printf("删除成功\n");
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
getchar();
}
void output(STUDENTS stu[])
{ system("cls");
int i;
for(i=0;i<k;i++)
printf("编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作家: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
getchar();
}
void inquire(STUDENTS stu[])
{ int i;
int num;
system("cls");
printf(" \n\n请输入您要查找的书本的编号");
scanf("%d",&num);
for(i=0;i<k;i++)
if(num==stu[i].num)
printf("\n\n\n编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作者: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
getchar();
}
void change(STUDENTS stu[])
{ int num,i,choice;
system("cls");
printf("\n\n\n 请输入您要修改的书本的编号");
scanf("%d",&num);
for(i=0;i<k;i++)
{ if(num==stu[i].num)
printf("\n编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作者: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("\n\n\n ********请输入您想要修改的数据********\n\n");
printf(" 1. 编号\n\n");
printf(" 2. 名称\n\n");
printf(" 3. 类型\n\n");
printf(" 4. 出版时间\n\n");
printf(" 5. 位置\n\n");
printf(" 6. 作者\n\n");
printf(" 请选择(1-6):");
scanf("%d",&choice);
switch(choice)
{case 1:{
printf("\n 请输入你改的新编号");
scanf("%d",&stu[i].num);
break;
}
case 2:{
printf("\n 请输入你改的新名称");
scanf("%s",stu[i].name);
break;
}
case 3:{
printf("\n 请输入你改的新类型");
scanf("%s",stu[i].type);
break;
}
case 4:{
printf("\n 请输入你改的新出版时间");
scanf("%d",&stu[i].time);
break;
}
case 5:{
printf("\n 请输入你改的新位置");
scanf("%s",stu[i].place);
break;
}
case 6:{
printf("\n 请输入你改的新作家");
scanf("%s",stu[i].writer);
break;
}
}
printf("编号:%d,名称:%s,类型:%s,出版时间:%d,位置:%s,作者: %s\n",stu[i].num,stu[i].name,
stu[i].type,stu[i].time,stu[i].place,stu[i].writer);
printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
break;
}
}
void sort(STUDENTS stu[])
{ int i,j,n=1,x;
system("cls");
int t;
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(stu[i].time<stu[j].time)
{ t=stu[i].time;
stu[i].time=stu[j].time;
stu[j].time=t;
t=stu[i].num;
stu[i].num=stu[j].num;
stu[j].num=t;
}
for(i=0;i<k;i++)
printf("排名 编号 名称 日期\n %d %d %d %d\n",n++,stu[i].num,stu[i].name,stu[i].time);
printf("按任意键加回车返回主菜单!");
scanf("%d",&x);
getchar();
}
void pagedis()
{
printf(" \n\n\n **********************************\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 欢迎进入书本信息管理系统 *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" **********************************\n");
}
void check()
{
char userName[5];
char userPWD[5];
int i,sum;
system("color 4E");
for(i = 1; i < 4; i++)
{
printf(" 用户名和密码均为abcde\n\n");
printf("\n 请输入您的用户名:");
gets(userName);
printf("\n 请输入您的密码:");
gets(userPWD);
if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))
{
printf("用户名和密码正确,显示主菜单");
return;
}
else
{
if (i < 3)
{
printf("用户名或密码错误,提示用户重新输入");
printf("用户名或密码错误,请重新输入!");
}
else
{
printf("连续3次输错用户名或密码,退出系统。");
printf("您已连续3次将用户名或密码输错,系统将退出!");
exit(1);
}
}
}
}
void menu()
{
STUDENTS stu[20];
int choice,k,sum;
sum=read_file(stu);
if(sum==0)
{ printf("首先录入基本库存信息!按回车后进入*****\n");
getch();
sum=input(stu);
}
do
{ system("cls");
printf("\n\n\n ********书本信息管理系统********\n\n");
printf(" 1. 创建书本信息\n\n");
printf(" 2. 打印书本信息\n\n");
printf(" 3. 查询书本信息\n\n");
printf(" 4. 修改书本信息\n\n");
printf(" 5. 删除书本信息\n\n");
printf(" 6. 书本时间信息列表\n\n");
printf(" 0. 退出系统\n\n");
printf(" 请选择(0-6):");
scanf("%d",&choice);
switch(choice)
{
case 1: k=input(stu); break;
case 2: output( stu) ; break;
case 3: inquire(stu); break;
case 4: change(stu); break;
case 5: deletel(stu); break;
case 6: sort(stu); break;
case 0: break;
}
}while(choice!=0);
save_file(stu,sum);
}
int main()
{
int i,sum;
pagedis();
check();
menu();
}