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