C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單圖書(shū)管理系統(tǒng)
目前為止跟著學(xué)校進(jìn)度學(xué)習(xí)C語(yǔ)言大概半年左右,基礎(chǔ)學(xué)習(xí)只學(xué)到了指針,學(xué)得非常淺。說(shuō)實(shí)話,起初對(duì)C語(yǔ)言的印象———只是一個(gè)學(xué)習(xí)計(jì)算機(jī)語(yǔ)言的敲門(mén)磚,對(duì)具體C語(yǔ)言如何應(yīng)用等,非常迷茫。直到大一下半學(xué)期的高級(jí)語(yǔ)言設(shè)計(jì)課程之后,試過(guò)dos運(yùn)行的圖形化界面的完整小程序,才發(fā)現(xiàn)C語(yǔ)言的魅力。
ok,廢話不多說(shuō)了,下面是我第二節(jié)課的作品————C語(yǔ)言的圖書(shū)管理系統(tǒng)。一個(gè)簡(jiǎn)單的小程序。并非純?cè)瓌?chuàng),是基于網(wǎng)絡(luò)搜索到的“學(xué)生管理系統(tǒng)”改編而成的。通過(guò)直接瀏覽、修改一個(gè)完整的代碼,我的收獲頗豐。我認(rèn)為這樣比枯燥的學(xué)習(xí)代碼更加高效、易懂、易記。以下是幾個(gè)我在修改程序時(shí)學(xué)到的對(duì)于我來(lái)說(shuō)比較有用的幾點(diǎn):
(這些可能很簡(jiǎn)單,但是我之前真的沒(méi)學(xué)過(guò)(⊙﹏⊙)b )
1.DOS界面的顏色設(shè)置(背景、字體顏色)
color [attr]
下面是顏色代碼:(如 color fc 為亮白色產(chǎn)生亮紅色,第一個(gè)背景,第二個(gè)前景)
0 = 黑色 8 = 灰色
1 = 藍(lán)色 9 = 淡藍(lán)色
2 = 綠色 A = 淡綠色
3 = 湖藍(lán)色 B = 淡淺綠色
4 = 紅色 C = 淡紅色
5 = 紫色 D = 淡紫色
6 = 黃色 E = 淡黃色
7 = 白色 F = 亮白色
dos只能顯示這幾種基礎(chǔ)顏色并不能自己定制其他的顏色
2.字符串的比較(用于密碼驗(yàn)證等)
strcmp 是一個(gè)比較字符串的函數(shù) 原型:extern int strcmp(char *s1,char * s2); 用法:#include <string.h> 功能:比較字符串s1和s2。 說(shuō)明: 當(dāng)s1<s2時(shí),返回值<0 當(dāng)s1=s2時(shí),返回值=0 當(dāng)s1>s2時(shí),返回值>0
3.C語(yǔ)言的文件操作
定義一個(gè)代表文件的符號(hào)(指針變量)這樣的形式FILE *fp
打開(kāi)文件的語(yǔ)句是
fopen(文件位置,打開(kāi)模式);
文件位置好理解,就是文件所在的位置,例如D://test.txt
打開(kāi)模式有幾種,
r(read): 讀
w(write): 寫(xiě)
a(append): 追加
t(text): 文本文件,可省略不寫(xiě)
b(banary): 二進(jìn)制文件
+: 讀和寫(xiě)
一般是rt+,也可以寫(xiě)成r+,和w+,就是讀和寫(xiě),能保留原來(lái)的內(nèi)容。所以打開(kāi)C盤(pán)下my目錄中的文件c:\my\test.txt的語(yǔ)句是
fp=fopen("c://my/test.txt","r+")。注意文件夾符號(hào)同上面的不同。
4.代碼模塊(驗(yàn)證密碼、查詢(xún)信息、修改信息、刪除信息)
①安全驗(yàn)證
void check() { char userName[5];/*用戶(hù)名*/ char userPWD[5];/*密碼*/ int i,sum; system("color 0B"); for(i = 1; i < 4; i++) { /*用戶(hù)名和密碼均為abcde;*/ printf(" (用戶(hù)名和密碼均為abcde)\n\n"); printf("\n 請(qǐng)輸入您的用戶(hù)名:"); gets(userName); printf("\n 請(qǐng)輸入您的密碼:"); gets(userPWD); if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))/*驗(yàn)證用戶(hù)名和密碼*/ { printf("\n *用戶(hù)名和密碼正確,顯示主菜單*"); return; } else { if (i < 3) { printf("用戶(hù)名或密碼錯(cuò)誤,提示用戶(hù)重新輸入"); printf("用戶(hù)名或密碼錯(cuò)誤,請(qǐng)重新輸入!"); } else { printf("連續(xù)3次輸錯(cuò)用戶(hù)名或密碼,退出系統(tǒng)。"); printf("您已連續(xù)3次將用戶(hù)名或密碼輸錯(cuò),系統(tǒng)將退出!"); exit(1); } } } }
②查詢(xún)圖書(shū)信息
void inquire(STUDENTS stu[]) { int i; char name[20]; system("cls"); printf(" \n\n請(qǐng)輸入您要查找的圖書(shū)的書(shū)名:"); scanf("%s",&name); for(i=0;i<k;i++) if(strcmp(name,stu[i].name)==0) printf("\n\n\n編號(hào):%d,書(shū)名:%s,作者:%s,出版社:%s,價(jià)格: %.2f,數(shù)量:%d\n",stu[i].num,stu[i].name, stu[i].author,stu[i].press,stu[i].price,stu[i].quantity); printf("按任意鍵加回車(chē)返回主菜單!"); scanf("%d",&i); getchar(); }
原理是通過(guò)循環(huán),將所有stu數(shù)組中的學(xué)號(hào)stu[i].num同輸入要查詢(xún)的學(xué)號(hào)num對(duì)比,如果一樣,就printf顯示。
③修改圖書(shū)信息
函數(shù)是change(STUDENTS stu[])
void change(STUDENTS stu[]) { int num,i,choice; system("cls"); printf("\n\n\n 請(qǐng)輸入您要修改的圖書(shū)的編號(hào)"); scanf("%d",&num); for(i=0;i<k;i++) { if(num==stu[i].num) printf("\n編號(hào):%d,書(shū)名:%s,作者:%s,出版社:%s,價(jià)格: %.2f,數(shù)量:%d\n",stu[i].num,stu[i].name, stu[i].author,stu[i].press,stu[i].price,stu[i].quantity); printf("\n\n\n ********請(qǐng)輸入您想要修改的數(shù)據(jù)********\n\n"); printf(" 1. 編號(hào)\n\n"); printf(" 2. 書(shū)名\n\n"); printf(" 3. 作者\(yùn)n\n"); printf(" 4. 出版社\n\n"); printf(" 5. 價(jià)格\n\n"); printf(" 6. 數(shù)量\n\n"); printf(" 請(qǐng)選擇(1-6):"); scanf("%d",&choice); switch(choice) {case 1:{ printf("\n 請(qǐng)輸入你改的新編號(hào)"); scanf("%d",&stu[i].num); break; } case 2:{ printf("\n 請(qǐng)輸入你改的新書(shū)名"); scanf("%s",stu[i].name); break; } case 3:{ printf("\n 請(qǐng)輸入你改的新作者"); scanf("%s",stu[i].author); break; } case 4:{ printf("\n 請(qǐng)輸入你改的新出版社"); scanf("%s",stu[i].press); break; } case 5:{ printf("\n 請(qǐng)輸入你改的新價(jià)格"); scanf("%f",&stu[i].price); break; case 6:{ printf("\n 請(qǐng)輸入你改的新數(shù)量"); scanf("%d",&stu[i].quantity); break; } } }
原理是首先定位,然后輸入新的值替換以前的值。
④刪除圖書(shū)信息
函數(shù)是 void deletel(STUDENTS stu[])
主要原理是
printf("請(qǐng)輸入圖書(shū)名稱(chēng):"); scanf("%s",Stuname2); 讓用戶(hù)輸入圖書(shū)的名稱(chēng),然后從頭開(kāi)始比對(duì)每個(gè)stu變量中的名稱(chēng) [csharp] view plain copy if(strcmp(stu[i].name,Stuname2)==0) for(j=0;j<20;j++) stu[i].name[j]=stu[i+1].name[j]; k--;
如果找到名字相符的話,就將下一個(gè)名字覆蓋前一個(gè)名字
以下是完整的主程序代碼:
#include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define Pquantity 3 #define MAX 1000 #define N 5 int k=0; /*結(jié)構(gòu)體類(lèi)型*/ typedef struct { int num;/*編號(hào)*/ char name[20];/*書(shū)名*/ char author[20];/*作者*/ char press[20];/*出版社*/ float price;/*價(jià)格*/ int quantity;/*數(shù)量*/ }STUDENTS; int read_file(STUDENTS stu[]) { FILE *fp; int i=0; if((fp=fopen("stu.txt","rt"))==NULL) {printf("\n\n—————庫(kù)存文件不存在!請(qǐng)創(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("寫(xiě)文件錯(cuò)誤!\n"); return; } for(i=0;i<sum;i++) if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1) printf("寫(xiě)文件錯(cuò)誤!\n"); fclose(fp); } /*創(chuàng)建圖書(shū)信息*/ int input(STUDENTS stu[]) { int i,x; for(i=0;i<1000;i++) { system("cls"); printf("\n\n 錄入圖書(shū)信息 (最多%d本)\n",MAX); printf(" ----------------------------\n"); printf("\n 第%d本圖書(shū)",k+1); printf("\n 請(qǐng)輸入圖書(shū)的編號(hào):"); scanf("%d",&stu[k].num); printf("\n 請(qǐng)輸入圖書(shū)的書(shū)名:"); scanf("%s",stu[k].name); printf("\n 請(qǐng)輸入圖書(shū)的作者:"); scanf("%s",stu[k].author); printf("\n 請(qǐng)輸入圖書(shū)的出版社:"); scanf("%s",stu[k].press); printf("\n 請(qǐng)輸入圖書(shū)的價(jià)格:"); scanf("%f",&stu[k++].price); printf("\n 請(qǐng)輸入圖書(shū)的數(shù)量:"); scanf("%d",&stu[i].quantity); printf("\n 請(qǐng)按1鍵返回菜單或按0鍵繼續(xù)創(chuàng)建"); scanf("%d",&x); if(x) break; } return k; } /*刪除圖書(shū)信息*/ void deletel(STUDENTS stu[]) { system("cls"); char Stuname2[20]; int i,j; printf("請(qǐng)輸入圖書(shū)書(shū)名:"); 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("按任意鍵加回車(chē)返回主菜單!"); scanf("%d",&i); getchar(); } /*打印圖書(shū)信息*/ void output(STUDENTS stu[]) { system("cls"); int i; for(i=0;i<k;i++) printf("編號(hào):%d,書(shū)名:%s,作者:%s,出版社:%s,價(jià)格: %.2f,數(shù)量:%d\n",stu[i].num,stu[i].name, stu[i].author,stu[i].press,stu[i].price,stu[i].quantity); printf("按任意鍵加回車(chē)返回主菜單!"); scanf("%d",&i); getchar(); } /*查詢(xún)圖書(shū)信息*/ void inquire(STUDENTS stu[]) { int i; char name[20]; system("cls"); printf(" \n\n請(qǐng)輸入您要查找的圖書(shū)的書(shū)名:"); scanf("%s",&name); for(i=0;i<k;i++) if(strcmp(name,stu[i].name)==0) printf("\n\n\n編號(hào):%d,書(shū)名:%s,作者:%s,出版社:%s,價(jià)格: %.2f,數(shù)量:%d\n",stu[i].num,stu[i].name, stu[i].author,stu[i].press,stu[i].price,stu[i].quantity); printf("按任意鍵加回車(chē)返回主菜單!"); scanf("%d",&i); getchar(); } /*修改圖書(shū)信息*/ void change(STUDENTS stu[]) { int num,i,choice; system("cls"); printf("\n\n\n 請(qǐng)輸入您要修改的圖書(shū)的編號(hào)"); scanf("%d",&num); for(i=0;i<k;i++) { if(num==stu[i].num) printf("\n編號(hào):%d,書(shū)名:%s,作者:%s,出版社:%s,價(jià)格: %.2f,數(shù)量:%d\n",stu[i].num,stu[i].name, stu[i].author,stu[i].press,stu[i].price,stu[i].quantity); printf("\n\n\n ********請(qǐng)輸入您想要修改的數(shù)據(jù)********\n\n"); printf(" 1. 編號(hào)\n\n"); printf(" 2. 書(shū)名\n\n"); printf(" 3. 作者\(yùn)n\n"); printf(" 4. 出版社\n\n"); printf(" 5. 價(jià)格\n\n"); printf(" 6. 數(shù)量\n\n"); printf(" 請(qǐng)選擇(1-6):"); scanf("%d",&choice); switch(choice) {case 1:{ printf("\n 請(qǐng)輸入你改的新編號(hào)"); scanf("%d",&stu[i].num); break; } case 2:{ printf("\n 請(qǐng)輸入你改的新書(shū)名"); scanf("%s",stu[i].name); break; } case 3:{ printf("\n 請(qǐng)輸入你改的新作者"); scanf("%s",stu[i].author); break; } case 4:{ printf("\n 請(qǐng)輸入你改的新出版社"); scanf("%s",stu[i].press); break; } case 5:{ printf("\n 請(qǐng)輸入你改的新價(jià)格"); scanf("%f",&stu[i].price); break; case 6:{ printf("\n 請(qǐng)輸入你改的新數(shù)量"); scanf("%d",&stu[i].quantity); break; } } } printf("編號(hào):%d,書(shū)名:%s,作者:%s,出版社:%s,價(jià)格: %.2f,數(shù)量:%d\n",stu[i].num,stu[i].name, stu[i].author,stu[i].press,stu[i].price,stu[i].quantity); printf("按任意鍵加回車(chē)返回主菜單!"); scanf("%d",&i); break; } } /*圖書(shū)價(jià)格信息排名*/ 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].price<stu[j].price) { t=stu[i].price; stu[i].price=stu[j].price; stu[j].price=t; t=stu[i].num; stu[i].num=stu[j].num; stu[j].num=t; } for(i=0;i<k;i++) printf("排名 編號(hào) 價(jià)格\n %d %d %.2f\n",n++,stu[i].num,stu[i].price); printf("按任意鍵加回車(chē)返回主菜單!"); scanf("%d",&x); getchar(); } void pquantitydis() { printf(" \n\n\n **********************************\n"); printf(" * *\n"); printf(" * *\n"); printf(" * *\n"); printf(" * 歡迎進(jìn)入圖書(shū)信息管理系統(tǒng) *\n"); printf(" * *\n"); printf(" * *\n"); printf(" * *\n"); printf(" **********************************\n"); } void check() { char userName[5];/*用戶(hù)名*/ char userPWD[5];/*密碼*/ int i,sum; system("color 0B"); for(i = 1; i < 4; i++) { /*用戶(hù)名和密碼均為abcde;*/ printf(" (用戶(hù)名和密碼均為abcde)\n\n"); printf("\n 請(qǐng)輸入您的用戶(hù)名:"); gets(userName); printf("\n 請(qǐng)輸入您的密碼:"); gets(userPWD); if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))/*驗(yàn)證用戶(hù)名和密碼*/ { printf("\n *用戶(hù)名和密碼正確,顯示主菜單*"); return; } else { if (i < 3) { printf("用戶(hù)名或密碼錯(cuò)誤,提示用戶(hù)重新輸入"); printf("用戶(hù)名或密碼錯(cuò)誤,請(qǐng)重新輸入!"); } else { printf("連續(xù)3次輸錯(cuò)用戶(hù)名或密碼,退出系統(tǒng)。"); printf("您已連續(xù)3次將用戶(hù)名或密碼輸錯(cuò),系統(tǒng)將退出!"); exit(1); } } } } void menu() { STUDENTS stu[20]; int choice,k,sum; sum=read_file(stu); if(sum==0) { printf("首先錄入基本庫(kù)存信息!按回車(chē)后進(jìn)入—————\n"); getch(); sum=input(stu); } do { system("cls"); printf("\n\n\n ********圖書(shū)信息管理系統(tǒng)********\n\n"); printf(" 1. 創(chuàng)建圖書(shū)信息\n\n"); printf(" 2. 打印圖書(shū)信息\n\n"); printf(" 3. 查詢(xún)圖書(shū)信息\n\n"); printf(" 4. 修改圖書(shū)信息\n\n"); printf(" 5. 刪除圖書(shū)信息\n\n"); printf(" 6. 圖書(shū)價(jià)格信息排名\n\n"); printf(" 0. 退出系統(tǒng)\n\n"); printf(" 請(qǐng)選擇(0-6):"); scanf("%d",&choice); switch(choice) { case 1: k=input(stu); break;/*創(chuàng)建圖書(shū)信息*/ case 2: output( stu) ; break;/*打印圖書(shū)信息*/ case 3: inquire(stu); break;/*查詢(xún)圖書(shū)信息*/ case 4: change(stu); break;/*修改圖書(shū)信息*/ case 5: deletel(stu); break;/*刪除圖書(shū)信息*/ case 6: sort(stu); break;/*圖書(shū)價(jià)格信息排名*/ case 0: break; } }while(choice!=0); save_file(stu,sum); } int main() { int i,sum; pquantitydis(); check(); menu(); }
更多學(xué)習(xí)資料請(qǐng)關(guān)注專(zhuān)題《管理系統(tǒng)開(kāi)發(fā)》。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
- C語(yǔ)言圖書(shū)管理系統(tǒng)簡(jiǎn)潔版
- C語(yǔ)言圖書(shū)管理系統(tǒng)課程設(shè)計(jì)
- C語(yǔ)言鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的圖書(shū)管理系統(tǒng)
- C語(yǔ)言設(shè)計(jì)圖書(shū)登記系統(tǒng)與停車(chē)場(chǎng)管理系統(tǒng)的實(shí)例分享
- C語(yǔ)言實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng)(文件數(shù)據(jù)庫(kù))
- C語(yǔ)言單鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng)開(kāi)發(fā)
相關(guān)文章
gcc中extra qualification錯(cuò)誤的解決
今天小編就為大家分享一篇gcc中extra qualification錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12C語(yǔ)言中break與continue的用法和區(qū)別詳解
當(dāng)我們使用while或for循環(huán)時(shí),如果想提前結(jié)束循環(huán)(在不滿(mǎn)足結(jié)束條件的情況下結(jié)束循環(huán)),可以使用break或continue關(guān)鍵字,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中break與continue的用法和區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-10-10C語(yǔ)言詳細(xì)分析浮點(diǎn)數(shù)在內(nèi)存中的儲(chǔ)存
我們?cè)谌粘I钪泻途幊讨卸紩?huì)用到小數(shù),比如:3.1415926、29.9、1E10(科學(xué)計(jì)數(shù)法也是浮點(diǎn)型)。在C語(yǔ)言中的浮點(diǎn)型類(lèi)型有:float,double,long double。那么浮點(diǎn)數(shù)在這些浮點(diǎn)型的內(nèi)存之中又是如何儲(chǔ)存的呢,這就是今天我們要分享的2022-06-06C/C++ 多線程的學(xué)習(xí)心得總結(jié)
本篇文章是對(duì)C/C++中多線程的學(xué)習(xí)心得總結(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++ read函數(shù)讀入int整形數(shù)據(jù)
這篇文章主要介紹了C++ read函數(shù)讀入int整形數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-07-07