您好,登錄后才能下訂單哦!
C語言程序設計報告
經(jīng)過上次的飛機游戲制作,使我感覺到C語言程序設計,更加的有趣,也使我對這門課程有了更深的理解和認識。這次我們學習了學習C語言操作文件永久保存數(shù)據(jù)和基于函數(shù)的結(jié)構(gòu)化大型程序的編寫方法。這次的學習也比較上次來說顯得有些復雜。
這次要做的是一個關(guān)于書本的管理系統(tǒng)??梢宰屛覀兏臃奖愕娜ダ贸绦虿檎視敬娣诺奈恢煤鸵恍┗镜男畔?。
首先建立基本的函數(shù)公式:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define PAGE 3
#define MAX 1000
#define N 5
int k=0;
/*結(jié)構(gòu)體類型*/
然后定義我們所要設計和查找的變量:
typedef struct
{ int num;/*書號*/
char name[50];/*名稱*/
char type[40];/*類型*/
int time;/*出版時間*/
char place[50];/*位置*/
char writer[50];/*作者*/
}STUDENTS;
這兩步對于制作數(shù)據(jù)庫來說十分的重要,也是整個程序的基礎和地基,所以這兩步絕對不能出錯否則后面也將無法進行。從這之后便真正開始數(shù)據(jù)庫的制作。
int read_file(STUDENTS stu[])
{ FILE *fp;
int i=0;
if((fp=fopen("stu.txt","rt"))==NULL)
{printf("\n\n*****庫存文件不存在!請創(chuàng)");
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);
}
這一步是當數(shù)據(jù)庫中并沒有數(shù)據(jù)存儲的情況下而讓程序自己轉(zhuǎn)到輸入數(shù)據(jù)界面的程序,如若有數(shù)據(jù)存儲那么再打開以后便不會轉(zhuǎn)到存儲界面。
接著上面如若沒有數(shù)據(jù)轉(zhuǎn)移到輸入數(shù)據(jù)的界面,所以我們?yōu)榱耸馆斎虢缑娓雍啙嶉_始編輯界面環(huán)境:
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鍵繼續(xù)創(chuàng)建");
scanf("%d",&x);
if(x)
break;
}
return k;
}
這樣我們就可以按照我們所需要的將書本的信息一步一步的輸入近數(shù)據(jù)庫中,并且還能夠隨時返回初始界面。但是,說到創(chuàng)建數(shù)據(jù)就不得不提到刪除數(shù)據(jù),所以接下來制作刪除數(shù)據(jù)的程序便是我們先要解決的:
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();
}
這個完成之后我們的數(shù)據(jù)庫就算是基本上完成了。但日后要查找數(shù)據(jù)可能不僅僅是查找那么簡單,有可能需要進行打印之類的工作。為了方便使用。我們也將編入打印所需的程序,是這個程序變得更方便。
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();
}
輸入、刪除、打印都完成了,接下來便是最關(guān)鍵的一步:查找。這一步相對于之前的幾步來說算是最簡單的了只需要把存入庫中的數(shù)據(jù)輸出即可:
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();
}
查找完成之后我們便會發(fā)現(xiàn),我們的數(shù)據(jù)中只存在創(chuàng)建和刪除,然而對于書本來說修改是必不可少的,我們總不可能每次都將數(shù)據(jù)刪除后再創(chuàng)建,太浪費時間了。所以還要做一個修改的程序:
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 ********請輸入您想要修改的數(shù)據(jù)********\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;
}
}
之后為了能方便的將數(shù)據(jù)列舉出來做個列舉的程序會使整個程序更完成:
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(" * 歡迎進入書本信息管理系統(tǒng) *\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++)
{
/*用戶名和密碼均為abcde;*/
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("連續(xù)3次輸錯用戶名或密碼,退出系統(tǒng)。");
printf("您已連續(xù)3次將用戶名或密碼輸錯,系統(tǒng)將退出!");
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 ********書本信息管理系統(tǒng)********\n\n");
printf(" 1. 創(chuàng)建書本信息\n\n");
printf(" 2. 打印書本信息\n\n");
printf(" 3. 查詢書本信息\n\n");
printf(" 4. 修改書本信息\n\n");
printf(" 5. 刪除書本信息\n\n");
printf(" 6. 書本時間信息列表\n\n");
printf(" 0. 退出系統(tǒng)\n\n");
printf(" 請選擇(0-6):");
scanf("%d",&choice);
switch(choice)
{
case 1: k=input(stu); break;/*創(chuàng)建書本信息*/
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();
}
關(guān)于這次的感想:這次的課程使我對C語言這個程序更加的刮目相看,沒想到平常的那些看起來十分高級的查找系統(tǒng)也是通過這些基礎的軟件一點一點制作而成的。看起來復雜的東西只要拆開就會發(fā)現(xiàn)它十分的簡單易懂。
下面是這次整個程序的完整程序:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define PAGE 3
#define MAX 1000
#define N 5
int k=0;
/*結(jié)構(gòu)體類型*/
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*****庫存文件不存在!請創(chuàng)");
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);
}
/*創(chuàng)建書本信息*/
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鍵繼續(xù)創(chuàng)建");
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 ********請輸入您想要修改的數(shù)據(jù)********\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(" * 歡迎進入書本信息管理系統(tǒng) *\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++)
{
/*用戶名和密碼均為abcde;*/
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("連續(xù)3次輸錯用戶名或密碼,退出系統(tǒng)。");
printf("您已連續(xù)3次將用戶名或密碼輸錯,系統(tǒng)將退出!");
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 ********書本信息管理系統(tǒng)********\n\n");
printf(" 1. 創(chuàng)建書本信息\n\n");
printf(" 2. 打印書本信息\n\n");
printf(" 3. 查詢書本信息\n\n");
printf(" 4. 修改書本信息\n\n");
printf(" 5. 刪除書本信息\n\n");
printf(" 6. 書本時間信息列表\n\n");
printf(" 0. 退出系統(tǒng)\n\n");
printf(" 請選擇(0-6):");
scanf("%d",&choice);
switch(choice)
{
case 1: k=input(stu); break;/*創(chuàng)建書本信息*/
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();
}
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。