C语言课程设计-车辆信息管理系统
C語言課程設計-車輛信息管理系統
這個是我學編程以來寫的第一個管理系統,現在回來看,當時寫的代碼還是很青澀的,寫得不好大家輕點噴!!!
題目描述:
建立車輛信息管理系統,實現車輛信息的添加和維護管理。
系統存儲數據要求:
每臺車輛至少需要包含以下屬性,系統中保存多臺車輛的信息:
? 車輛型號(如思域、卡羅拉、天籟等)
? 廠商(如廣汽本田、一汽大眾、東風日產等)
? 車型級別(如緊湊型車、中型車、SUV等)
? 座位數(如5座、7座等)
? 排量(如1.2T、1.4T、1.5T、1.6T等)
? 變速箱(如手動、手自一體、無級變速等)
? 車身顏色(白色、黑色等)
? 車輛價格(單位為萬)
程序基本要求:
1、 要有系統菜單,選擇不同選項執行不同功能。每個功能執行結束后,需返回到系統菜單,繼續進行功能選擇操作。
2、系統需要完成以下基本功能,每個功能的代碼封裝在單獨的函數里:
(1) 系統初始化時,至少要有10條車輛記錄信息。
(2) 錄入車輛信息:錄入某臺車輛的基本信息,為新記錄自動生成一個記錄號。輸入數據時要有提示語,錄入結束后在屏幕上輸出新增的車輛信息。
車輛信息輸出格式如下:
| 雅閣 | 本田 | 中型車 | 5座 | 1.5T | 無級變速 | 白色 | 19.98萬 |
(3) 瀏覽所有車輛信息:統計共有多少臺車輛,并在屏幕中顯示所有車輛信息。
(4) 按不同字段查詢車輛信息,包括按照廠商、車型級別、車輛價格范圍(輸入最低價格、最高價格)
(5) 修改車輛信息:對車輛的基本信息進行修改,要求提供菜單選擇某一項參數信息進行修改,而不是重新覆蓋錄入整條信息。
(6) 刪除車輛信息:將滿足條件的車輛信息刪除,包括按型號、廠商刪除。要求刪除前,先按照型號或者廠商查找需要刪除的車輛信息,如果找不到則給出對應的提示信息。
擴展要求:
(1) 實現排序功能。例如按車輛價格、座位數、排量等對車輛信息進行排序。
(2) 所有車輛信息存儲在文件中。
(3) 每次打開程序,把文件中的信息導入到程序中。
(4) 可自己定義其他功能需求,并編碼實現
編寫這個系統時我總結了一個思路,方便我編寫代碼和防止浪費不必要的時間。
開發平臺:Dev-C++ 5.11
接下來,按照步驟一步一步地實現…
步驟一:分析功能需求
問題的分析與總結是最重要的,只要把功能需求分析清楚,接下來編寫代碼的思路就會很清晰。
首先從題目來看我們要實現的功能有:1.錄入車輛信息功能2.瀏覽車輛信息功能3.查詢車輛信息功能4.修改車輛信息功能5.刪除車輛信息功能6.排序瀏覽車輛信息功能。
功能要實現的需求有:
1、錄入車輛信息功能:可實現輸入車輛型號、廠商、車輛級別、座位數、排量、變速箱、車身顏色、車輛價格(同時需要按照指定的格式輸入,否則顯示錯誤,需要重新輸入)。錄入結束后,會為新的車輛信息自動生成一個編號,并且在屏幕上輸出新增的車輛信息。
2、瀏覽車輛信息功能:選擇該功能可以輸出所有車輛信息,并且統計共有多少臺車輛。
3、查詢車輛信息功能:該功能可以提供菜單選擇四種不同的方式進行查詢:一、按廠商查詢,二、按車型級別查詢,三、按車輛價格范圍查詢(同時需要按照指定的格式輸入,否則顯示錯誤,需要重新輸入)四、按廠商和車型級別查詢。如果查詢的車輛信息不存在,會提示該信息不存在。
4、修改車輛信息功能:該功能可以提供菜單選擇某一項參數信息進行修改。選擇想要修改的車輛信息編號,將需要修改的車輛信息輸出,進行參數信息的修改。修改結束后,輸出修改后的車輛信息。修改完成后,進行錄入保存。
5、刪除車輛信息功能:該功能可以提供菜單選擇四種不同的方式進行刪除:一、按車輛型號,二、按廠商,三、按車型級別,四、按車輛型號和廠商。將滿足條件的車輛信息輸出,如果找不到,則顯示該信息不存在。否則判斷是否刪除(是:輸入Y,否:輸入N),刪除結束后,進行錄入保存。
6、排序瀏覽車輛信息功能:該功能可以提供菜單選擇三種不同方式進行排序瀏覽:一、按價格,二、按座位,三、 按排量。
7、退出功能:可以實現退出車輛信息管理系統。(即結束程序)
8、所有的車輛信息可以存儲在文件中,每次打開程序,可以把文件里的車輛信息導入到程序中,并且每次修改也可以保存在文件里,還有可以刪除文件里面的車輛信息。
步驟二:分析業務邏輯
功能需求分析完畢后,接下來就是大體的功能交互分析,邏輯分析,畫好系統程序流程圖。注意這不是最終的流程圖,如果在編寫過程中有修改的話,也可以進行修改(也方便后期增加需求)
分析完業務邏輯之后,我們還需要考慮三個問題:1、數據的保存2、數據的展示3、用戶的交互。
數據保存:
從題目來看數據應保存在文件中,我選擇的是保存在txt文件中。
數據展示:
數據的可視化我是直接在控制臺中進行輸出。
用戶交互:
用戶的輸入輸出都是通過控制臺,進行交互的。
步驟三:編寫代碼
定義數據結構:
struct Car //定義結構體 {int number; //編號 char type[20]; //車輛型號 char merchant[20]; //廠商 char level[20]; //車輛級別 char seet[10]; //座位數 char output[10]; //排量 char gearbox[20]; //變速箱 char colour[10]; //車身顏色 float price; //車輛價格 } c[100]; //定義100個結構體數組準備數據,(在工程目錄下新建一個file.txt的文件,用于存放數據)
注意:
每行數據用英文格式的空格隔開。
讀取文件中的數據:
FILE *fp;int i=0;fp=fopen("file.txt","r"); //讀取文件中的車輛信息。while(!feof(fp)) {fscanf(fp,"%d %s %s %s %s %s %s %s %f\n",&c[i].number,c[i].type,c[i].merchant,c[i].level,c[i].seet,c[i].output,c[i].gearbox,c[i].colour,&c[i].price);i++; //記錄錄入的車輛信息,每錄入一條車輛信息i自增1。}fclose(fp); //關閉文件保存數據到文件中:
FILE *fp;int j;fp=fopen("file.txt","w"); //打開文件名為file的文件,文件file里面的車輛信息已經刪除,重新錄入。 for(j=0;j<i;j++) //讀取車輛信息{if(c[j].number!=0) //判斷編號是否是 0,如果是不輸入,達到刪除的目的,否則輸入車輛信息。fprintf(fp,"%d %s %s %s %s %s %s %s %0.2f\n",c[j].number,c[j].type,c[j].merchant,c[j].level,c[j].seet,c[j].output,c[j].gearbox,c[j].colour,c[j].price); //錄入車輛信息 }fclose(fp); //關閉文件主函數目錄:
int chose=0; //定義chose用來選擇功能 while(chose!=7) //當chose等于7時結束循環。 {printf(" 歡迎使用車輛信息管理系統 \n");printf(" 菜單目錄 \n");printf(" ******************************************\n");printf(" * 1→ 錄入車輛信息 *\n");printf(" * 2→ 瀏覽車輛信息 *\n");printf(" * 3→ 查詢車輛信息 *\n");printf(" * 4→ 修改車輛信息 *\n");printf(" * 5→ 刪除車輛信息 *\n");printf(" * 6→ 排序車輛信息 *\n");printf(" * 7→ 退出 *\n");printf(" ******************************************\n"); //菜單:方便選擇需要的功能printf("請輸入功能的選項:");scanf("%d",&chose); //用于輸入選擇的功能switch(chose){case 1: input(c,i);i++;break; //功能1:錄入 case 2: browse(c,i);break; //功能2:瀏覽 case 3: inquiry(c,i);break; //功能3:查詢case 4: modify(c,i);rekeep(c,i);break; //功能4:修改case 5: delete_0(c,i);rekeep(c,i);break; //功能5:刪除case 6: sort(c,i);break; //功能6:排序case 7:printf("歡迎下次使用!\n");break; //功能7:退出default:printf("您輸入的數據有誤!\n請重新輸入!\n"); //如果輸入的數字不是1到7會顯示您輸入的數據有誤!}}接下來,就編寫每一個功能函數~~~
1、void input(struct Car c[],int i) :為錄入車輛信息功能的一個函數。主要功能為輸入車輛信息,包括車輛型號、廠商、車型級別、座位數、排量、變速箱、車身顏色、車輛價格,并為新記錄自動生成一個編號。輸入時需按照指定的格式輸入車輛信息(如果輸入格式不對會有提示和需要重新輸入)
void input(struct Car c[],int i) //功能1:錄入功能的定義 {FILE *fp;fp=fopen("file.txt","a"); //定義文件file.tet,錄入時錄入文件里printf("請輸入車輛的有關信息!\n\n");printf("請輸入車輛型號:");scanf("%s",c[i].type); printf("請輸入廠商:");scanf("%s",c[i].merchant);printf("請輸入車型級別:");scanf("%s",c[i].level); printf("請輸入座位數:");scanf("%s",c[i].seet); printf("請輸入排量:");scanf("%s",c[i].output); printf("請輸入變速箱:");scanf("%s",c[i].gearbox); printf("請輸入車身顏色:");scanf("%s",c[i].colour); printf("請輸入車輛價格:");scanf("%f",&c[i].price); while(c[i].price==0||c[i].price<0) //容錯處理,金額不能小于或等于零{printf("\n輸入錯誤!\n價格不能為:零和負數\n\n");printf("請重新輸入車輛價格:");scanf("%f",&c[i].price); }c[i].number=i+1; //自動生成一個編號 printf("輸入完畢!\n\n");printf("______________________________________________________________________________________________________________________\n"); //輸出新增的車輛信息。printf(" 編號 車輛型號 廠商 車型級別 座位數/座 排量/T 變速箱 車身顏色 車輛價格/萬\n");printf(" %-10d %-11s %-13s %-14s %-10s %-10s %-16s %-12s %-0.2f\n",c[i].number,c[i].type,c[i].merchant,c[i].level,c[i].seet,c[i].output,c[i].gearbox,c[i].colour,c[i].price);fprintf(fp,"%d %s %s %s %s %s %s %s %0.2f\n",c[i].number,c[i].type,c[i].merchant,c[i].level,c[i].seet,c[i].output,c[i].gearbox,c[i].colour,c[i].price); //錄入新的車輛信息 printf("______________________________________________________________________________________________________________________\n\n");fclose(fp); //關閉文件 }2、void browse(struct Car c[],int i) :為瀏覽所有車輛信息功能的一個函數。主要功能為輸出已經輸入的車輛信息以及后期修改后的車輛信息。并統計共有多少臺車輛。
void browse(struct Car c[],int i) //功能2:瀏覽功能的定義 {int j;printf("______________________________________________________________________________________________________________________\n");printf(" 編號 車輛型號 廠商 車型級別 座位數/座 排量/T 變速箱 車身顏色 車輛價格/萬\n");for(j=0;j<i;j++) //輸出所有的車輛信息 {printf(" %-10d %-11s %-13s %-14s %-10s %-10s %-16s %-12s %-0.2f\n",c[j].number,c[j].type,c[j].merchant,c[j].level,c[j].seet,c[j].output,c[j].gearbox,c[j].colour,c[j].price); }printf("______________________________________________________________________________________________________________________\n");printf("共有%d臺車輛\n\n",j);//輸出一共有多少臺車輛 }3、void inquiry(struct Car c[],int i) :為查詢車輛信息功能的一個函數。里面同時也包含了四個函數。主要的功能為提供一個關于查詢方式的菜單(1、按廠商查詢 2、按車型級別查詢 3、按車輛價格范圍查詢 4、按廠商和車型級別查詢),里面的四個函數分別是:
一、void inquiry_1(struct Car c[],int i) :為按廠商查詢的一個函數,主要功能為輸出指定的廠商信息(若指定的廠商不存在,則會輸出你查詢的信息不存在,直接跳出函數)。
二、void inquiry_2(struct Car c[],int i) :為按車型級別查詢的一個函數。主要功能為輸出指定的車型級別信息(若指定的車型級別不存在,則會輸出你查詢的信息不存在,直接跳出函數)。
三、void inquiry_3(struct Car c[],int i) :為按車輛價格范圍查詢的一個函數。主要功能為輸出指定的車輛價格范圍內車輛信息(若價格不在范圍之內,則會輸出你查詢的信息不存在,直接跳出函數)。
四、void inquiry_4(struct Car c[],int i) :為按廠商和車型級別查詢的一個函數。主要功能為輸出指定的廠商和車型級別的信息(若指定的廠商和車型級別不存在,則會輸出你查詢的信息不存在,直接跳出函數)。
文章篇幅有限完整的代碼我放到了文章的最后~~~有興趣的同學可以看看
4、void modify(struct Car c[],int i) :為修改車輛信息功能的一個函數。主要功能為提供菜單選擇某一項參數信息進行修改,包括車輛型號、廠商、車型級別、座位數、排量、變速箱、車身顏色、車輛價格。
void modify(struct Car c[],int i) //功能4:修改功能的定義 {int j,n; //定義n用于輸入想要修改的車輛信息編號。以及進行比較查詢int h=0,t=0,b=0; //定義h用于判斷是否修改成功。 定義t用于判斷是否退出俢改循環。定義b用于判斷是否查詢到信息。char m; //定義m用于判斷是否修改車輛信息。 int chose; //定義chose用于選擇功能browse(c,i); //輸出車輛信息表 while(b==0) //此循環用于判斷是否找到要修改的車輛信息編號{printf("請輸入想要修改的車輛信息的編號:");scanf("%d",&n); //輸入想要修改的車輛信息的編號for(j=0;j<i;j++) //對輸入的信息在原數據進行搜索并輸出{if(n==c[j].number) //判斷輸入的編號是否存在 {b++; printf("______________________________________________________________________________________________________________________\n");printf(" 編號 車輛型號 廠商 車型級別 座位數/座 排量/T 變速箱 車身顏色 車輛價格/萬\n");printf(" %-10d %-11s %-13s %-14s %-10s %-10s %-16s %-12s %-0.2f\n",c[j].number,c[j].type,c[j].merchant,c[j].level,c[j].seet,c[j].output,c[j].gearbox,c[j].colour,c[j].price);printf("______________________________________________________________________________________________________________________\n\n");break;}}if(b==0) //對沒有查詢到信息進行輸出printf("您想要修改的信息不存在!\n\n");}printf(" 選擇修改的類型 \n");printf(" ***************************************\n"); printf(" ** 1 按車輛型號 **\n");printf(" ** 2 按廠商 **\n");printf(" ** 3 按車型級別 **\n");printf(" ** 4 按座位數 **\n");printf(" ** 5 按排量 **\n");printf(" ** 6 按變速箱 **\n");printf(" ** 7 按車身顏色 **\n");printf(" ** 8 按車輛價格 **\n");printf(" ** 9 退出修改 **\n");printf(" ***************************************\n"); //查詢班費菜單:方便選擇需要的功能while(t==0) //此循環用于判斷是否執行修改命令,如果不是1~9的命令,則會提示輸入錯誤,請重新輸入 {printf("請輸入修改的類型:");scanf("%d",&chose); //輸入需要選擇的修改方式switch(chose){case 1: printf("輸入新的車輛型號:");scanf("%s",c[j].type); h++;t++;break;case 2: printf("輸入新的廠商:");scanf("%s",c[j].merchant);h++;t++;break;case 3: printf("輸入新的車型級別:");scanf("%s",c[j].level);h++;t++;break;case 4: printf("輸入新的座位數:");scanf("%s",c[j].seet);h++;t++;break;case 5: printf("輸入新的排量:");scanf("%s",c[j].output);h++;t++;break;case 6: printf("輸入新的變速箱:");scanf("%s",c[j].gearbox);h++;t++;break;case 7: printf("輸入新的車身顏色:");scanf("%s",c[j].colour);h++;t++;break;case 8: printf("輸入新的車輛價格:");scanf("%f",&c[j].price);while(c[j].price==0||c[j].price<0) //容錯處理,金額不能小于或等于零{printf("\n輸入錯誤!\n價格不能為:零和負數\n\n");printf("請重新輸入車輛價格:");scanf("%f",&c[j].price); }h++;t++;break;case 9: printf("已退出修改!\n");t++;break;default:printf("輸入錯誤!\n");//如果輸入的數字不是上面的數字會輸出:輸入錯誤! }}if(h!=0){printf("______________________________________________________________________________________________________________________\n"); //輸出修改后的車輛信息 printf(" 編號 車輛型號 廠商 車型級別 座位數/座 排量/T 變速箱 車身顏色 車輛價格/萬\n");printf(" %-10d %-11s %-13s %-14s %-10s %-10s %-16s %-12s %-0.2f\n",c[j].number,c[j].type,c[j].merchant,c[j].level,c[j].seet,c[j].output,c[j].gearbox,c[j].colour,c[j].price);printf("______________________________________________________________________________________________________________________\n\n");printf("修改成功!\n\n");} }5、void Delete(struct Car c[],int i) :為刪除車輛信息功能的一個函數。里面同時也包含了四個函數。主要功能為提供一個關于刪除方式的菜單(1、按車輛型號刪除 2、按廠商刪除 3、按車型級別刪掉 4、按車輛型號和廠商刪除),里面的四個函數分別是:
一、void delete_1(struct Car c[],int i) :為按車輛型號刪除的一個函數。主要功能為刪除指定的車輛型號信息(若指定的車輛型號不存在,則會輸出你查找的信息不存在)。
二、void delete_2(struct Car c[],int i) :為按廠商刪除的一個函數,主要功能為刪除指定的廠商信息(若指定的廠商信息不存在,則會輸出你查找的信息不存在)。
三、void delete_3(struct Car c[],int i) :為按車型級別刪除的一個函數。主要功能為刪除指定的車型級別信息(若指定的車型級別信息不存在,則會輸出你查找的信息不存在)。
四、void delete_4(struct Car c[],int i) :為按車輛型號和廠商刪除的一個函數。主要功能為刪除指定的車輛型號和廠商信息(若指定的車輛型號和廠商不存在,則會輸出你查找的信息不存在)。
6、void sort(struct Car c[],int i) :為排序瀏覽車輛信息功能的一個函數。主要功能為提供一個關于排序方式的菜單(1、按價格排序 2、按座位排序 3、 按排量排序),利用冒泡排序法進行排序。
void sort(struct Car c[],int i) //功能6:排序功能的定義 {struct Car d[100]; //定義結構體d,作為臨時變量,用于交換數據。 int j,k,chose=0; //定義chose用于功能選擇。 while(chose!=4) //當chose等于4時,退出排序功能。 {printf(" 排序瀏覽\n");printf(" *****************************************\n");printf(" ** 1→ 按價格 **\n");printf(" ** 2→ 按座位 **\n");printf(" ** 3→ 按排量 **\n");printf(" ** 4→ 退出排序 **\n");printf(" *****************************************\n"); //菜單:方便選擇需要的功能printf("輸入功能的選項:");scanf("%d",&chose); //輸入選擇的功能switch(chose){case 1:for(j=0;j<i-1;j++) //利用冒泡排序法進行從大到小排序{for(k=0;k<i-1;k++){if(c[k].price<c[k+1].price) //比較價格的大小 {d[k]=c[k];//交換數據c[k]=c[k+1];//交換數據c[k+1]=d[k];//交換數據}}}printf("______________________________________________________________________________________________________________________\n");//輸出排序后的結果。printf(" 編號 車輛型號 廠商 車型級別 座位數/座 排量/T 變速箱 車身顏色 車輛價格/萬\n");for(j=0;j<i;j++) //輸出所有的車輛信息 {printf(" %-10d %-11s %-13s %-14s %-10s %-10s %-16s %-12s %-0.2f\n",c[j].number,c[j].type,c[j].merchant,c[j].level,c[j].seet,c[j].output,c[j].gearbox,c[j].colour,c[j].price); }printf("______________________________________________________________________________________________________________________\n");break; case 2:for(j=0;j<i-1;j++) //利用冒泡排序法進行從大到小排序{for(k=0;k<i-1;k++){if(strcmp(c[k].seet,c[k+1].seet)<0) //比較座位的大小 {d[k]=c[k];//交換數據c[k]=c[k+1];//交換數據c[k+1]=d[k];//交換數據}}}printf("______________________________________________________________________________________________________________________\n");//輸出排序后的結果。printf(" 編號 車輛型號 廠商 車型級別 座位數/座 排量/T 變速箱 車身顏色 車輛價格/萬\n");for(j=0;j<i;j++) //輸出所有的車輛信息 {printf(" %-10d %-11s %-13s %-14s %-10s %-10s %-16s %-12s %-0.2f\n",c[j].number,c[j].type,c[j].merchant,c[j].level,c[j].seet,c[j].output,c[j].gearbox,c[j].colour,c[j].price);}printf("______________________________________________________________________________________________________________________\n");break; case 3:for(j=0;j<i-1;j++) //利用冒泡排序法進行從大到小排序{for(k=0;k<i-1;k++){if(strcmp(c[k].output,c[k+1].output)<0) //比較排量的大小 {d[k]=c[k];//交換數據c[k]=c[k+1];//交換數據c[k+1]=d[k];//交換數據}}}printf("______________________________________________________________________________________________________________________\n");//輸出排序后的結果。printf(" 編號 車輛型號 廠商 車型級別 座位數/座 排量/T 變速箱 車身顏色 車輛價格/萬\n");for(j=0;j<i;j++) //輸出所有的車輛信息 {printf(" %-10d %-11s %-13s %-14s %-10s %-10s %-16s %-12s %-0.2f\n",c[j].number,c[j].type,c[j].merchant,c[j].level,c[j].seet,c[j].output,c[j].gearbox,c[j].colour,c[j].price);}printf("______________________________________________________________________________________________________________________\n");break;case 4: printf("已退出排序!\n");break; //退出排序功能 default:printf("您輸入的數據有誤!\n請重新輸入!\n"); //如果輸入的是其他數字,顯示您輸入的數據有誤!}} }步驟四:功能測試
就隨便測了幾個功能,邊測邊改bug
功能1:錄入車輛信息
功能2:瀏覽車輛信息
功能3:查詢車輛信息
總結
程序優點:基本實現要求的所有功能,程序能較好的運行,而且用戶輸入錯誤時有保障機制,能讓用戶重新輸入數據。實現了所需的功能操作和更加有序的程序代碼,輸出時也能清晰顯示,避免了輸出時不理解的現象。同時,各種功能之間也會有一定的關系。它對某些輸入有特定的輸入,以避免輸入數據中的錯誤。
程序不足:沒有采用鏈表存儲車輛信息,每次需要引用車輛信息時都需要把車輛信息全部錄入,消耗資源大。
遇到的困難:1、數據錄入TXT時,打開TXT文件時,如果用“w”,會先刪除文件中的內容。如果用“r+”,會先覆蓋文件中的內容。“a”為追加模式每次寫入時,位置指針都會指向文件結尾以便于追加新內容。
2、程序結束時要在最后關閉文件fclose ( fp ),否則不會保存。
3、在功能輸入數字時,若輸入其它數據,可能會出現錯誤和無限循環。
4、在修改功能上,選擇某一項參數信息進行修改,沒有想到更好的方法確定參數信息,沒有實現循環修改。
完整代碼下載!!!
資源下載路徑一
資源下載路徑二
!!!
總結
以上是生活随笔為你收集整理的C语言课程设计-车辆信息管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言仿ce内存搜索工 源代码_仿CE内
- 下一篇: 文献补充材料怎么下载?