網站首頁 編程語言 正文
在大家學完C語言后,經常會被學校要求做很多管理系統,主流做法當選鏈表,但是很多問題就來了,在學習階段寫過最多基本上就是50行代碼左右了,一下子做個小型管理系統問題就比較多。小編當然也是在學完初階C語言之后過了半年才完整做出來。
所以分享一下經驗。
1:首先數據結構:鏈表要會,而且要熟練掌握其增刪查改;
2:調試代碼要會,很多代碼一行一行的看到最后真的是很讓人頭大;
不會調試和監控變量是個很痛苦的過程,就算寫出來bug多到炸也是很繁瑣的;
3:最關鍵的就是這個框架問題了,如果框架不好,這個代碼量會數倍上升,最后就是很多重疊的語句,很不美觀,并且代碼質量不是很好,在寫系統之前一定要多看點小型管理系統的代碼,主要是學習框架如何建立,然后再根據自己的系統情況進行改進。
首先我們來看頭文件,先將能夠用到的頭文件一一羅列出來創建在?
common.h文件里面。
#define _CRT_SECURE_NO_WARNINGS?
#define Space 1000
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<assert.h>//斷言
#include<stdbool.h>
#include<string.h>
將定義宏等包含進去。
其次就是這個框架了
#include"system.h"
int main()
{
?? ?CycleList myCycleList;
?? ?CycleListInit(&myCycleList);
?? ?int input = 0;
?? ?do
?? ?{
?? ??? ?menu();
?? ??? ?printf("請選擇->");
?? ??? ?scanf("%d", &input);
?? ??? ?switch (input)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?system("cls");
?? ??? ??? ?LoginCycle(&myCycleList);
?? ??? ??? ?break;
?? ??? ?case 0:
?? ??? ??? ?system("cls");
?? ??? ??? ?printf("自行車管理系統已經退出\n");
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?system("cls");
?? ??? ??? ?SearchCycle(&myCycleList);
?? ??? ??? ?break;
?? ??? ?case 3:
?? ??? ??? ?system("cls");
?? ??? ??? ?ChangeCycle(&myCycleList);
?? ??? ??? ?break;
?? ??? ?case 4:
?? ??? ??? ?system("cls");
?? ??? ??? ?PickUpCycle(&myCycleList);
?? ??? ??? ?_flushall();
?? ??? ??? ?FileWrite(&myCycleList);
?? ??? ??? ?_flushall();
?? ??? ??? ?break;
?? ??? ?case 5:
?? ??? ??? ?system("cls");
?? ??? ??? ?PrintResSpace(&myCycleList);
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?system("cls");
?? ??? ??? ?printf("輸入有誤請重新選擇\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?} while (input);
?? ??? ?system("pause");
?? ??? ?return 0;
?? ?}
再看各個功能的實現
為了避免函數代碼在一個文件里面十分的繁瑣,可以先創建一個.h文件將函數名和節點定義放進去,看代碼。
#include"common.h"
typedef struct Time
{
?? ?int year;
?? ?int month;
?? ?int day;
?? ?int hour;
}Time;
typedef struct Cycle
{
?? ?char CycleHoster[20];//自行車主名字
?? ?int Sex;
?? ?int Age;
?? ?char IDcard[18];//身份證號
?? ?Time partingTime; ? ? ?//存放時間
?? ?int number;//自行車車位號
?? ?struct Cycle* next;
}CycleNode;
typedef struct CycleList
{
?? ?CycleNode *first;
?? ?CycleNode *last;
?? ?size_t ?space;
}CycleList;
void menu();
void LoginCycle(CycleList *plist);//登記自行車函數
bool SearchCycle(CycleList* myBycycleList);//按照車位號查詢自行車
void ChangeCycle(CycleList* myBycycleList);
void PickUpCycle(CycleList* myBycycleList);
void PrintResSpace(CycleList* myBycycleList);
void CycleListInit(CycleList *plist);
CycleNode*_Buynode(char* p, int sex, int age, char* number, int Pnumber, int year, int month, int day, int hour);
bool CycleListIsFull(CycleList *plist);
CycleNode* SearchCycle1(CycleList* myBycycleList);
void FileWrite(CycleList* myBycycleList);
void DeleteCyNode(CycleList* myBycycleList,int key);
最后就是代碼函數功能的實現了。
#include"system.h"
void menu()
{
?? ?system("color 4");
?? ?printf(" ? ? *********************************************************************** ? ? \n");
?? ?printf(" ?************************歡迎使用自行車存放管理系統******************************* ? \n");
?? ?printf("| ? ? ? ? ? ? ? ? ? ? ? ? ?自行車停車收費標準2元一小時 ? ? ? ? ? ? ? ? ? ? ? ? ?|\n");
?? ?printf("|\t1.--登記自行車停放位信息 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|\n");
?? ?printf("|\t2.--查詢自行車停車位信息 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|\n");
?? ?printf("|\t3.--修改自行車信息 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|\n");
?? ?printf("|\t4.--用戶取車管理 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|\n");
?? ?printf("|\t5.--顯示當前空余自行車位信息 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|\n");
?? ?printf("|\t0.--退出自行車管理系統 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|\n");
?? ?printf("| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |\n");
?? ?printf("|*******************************************************************************|\n");
?? ?printf("|********************>>>>楊天喆-計科(02)班-20190101134<<<<********************|\n");
?? ?printf("|*******************************************************************************|\n\n");
}
void LoginCycle(CycleList *plist)
{
?? ?
?? ?if (!CycleListIsFull(plist))
?? ?{
?? ??? ?char name[20];
?? ??? ?int age;
?? ??? ?int sex;
?? ??? ?char IDcard[18];
?? ??? ?int hour;
?? ??? ?int Number;
?? ??? ?int year;
?? ??? ?int month;
?? ??? ?int day;
?? ??? ?printf("請輸入自行車主姓名\n");
?? ??? ?scanf("%s",name);
?? ??? ?_flushall();
?? ??? ?printf("請輸入性別(0代表男,1代表女)");
?? ??? ?scanf("%d", &sex);
?? ??? ?printf("請輸入車主年齡");
?? ??? ?scanf("%d", &age);
?? ??? ?printf("請輸入身份證號");
?? ??? ?scanf("%s", IDcard);
?? ??? ?_flushall();
?? ??? ?printf("請輸入停車時間(年,月,日,時)");
?? ??? ?scanf("%d,%d,%d,%d",&year,&month,&day,&hour);
?? ??? ?printf("請輸入要停的位號(位號為1到2000)");
?? ??? ?scanf("%d", &Number);
?? ??? ?plist->space++;
?? ??? ?plist->last->next = _Buynode(name, sex, age, IDcard, Number,year,month,day,hour);
?? ??? ?plist->last = _Buynode(name, sex, age, IDcard, Number, year, month, day, hour);
?? ??? ?FILE *fp = fopen("Test.txt", "a");
?? ??? ?fprintf(fp, "%s %d %d %s %d %d %d %d %d %d\n", name,age,sex,IDcard,hour,Number,year,month,day,hour);
?? ??? ?fclose(fp);
?? ??? ?printf("登記成功\n");
?? ??? ?printf("\n");
?? ?}
?? ?else
?? ?{
?? ??? ?printf("自行車位已滿,不能繼續停車");
?? ?}
}
CycleNode* _Buynode(char* p, int sex, int age, char* number, int Pnumber, int year, int month, int day, int hour)
{
?? ?CycleNode *s = (CycleNode*)malloc(sizeof(CycleNode));
?? ?size_t sz = strlen(p)+1;
?? ?size_t sz1 = strlen(number)+1;
?? ?if (s == NULL)
?? ??? ?return NULL;
?? ?else
?? ?{
?? ??? ?memcpy(s->CycleHoster,p,sz);
?? ??? ?s->Age = age;
?? ??? ?s->Sex = sex;
?? ??? ?s->partingTime.year = year;
?? ??? ?s->partingTime.month = month;
?? ??? ?s->partingTime.hour = hour;
?? ??? ?s->partingTime.day = day;
?? ??? ?memcpy(s->IDcard,number,sz1);
?? ??? ?s->number = Pnumber;
?? ??? ?s->next = NULL;
?? ??? ?return s;
?? ?}
}
void CycleListInit(CycleList *plist)
{
?? ?char qname[20] = "姓名初始化";
?? ?char qnumber[18] = "身份證初始化";
?? ?CycleNode* p = _Buynode(qname, 0, 0, qnumber, 0, 0,0,0,0);
?? ?plist->first = plist->last = p;
?? ?plist->space = 0;
}
bool CycleListIsFull(CycleList *plist)
{
?? ?if (plist->space > Space)
?? ??? ?return true;
?? ?return false;
}
bool SearchCycle(CycleList* myBycycleList)
{
?? ?int num;
?? ?printf(" ? ? ?查詢客房信息\n");
?? ?printf("請輸入要查詢自行車位號:\n");
?? ?scanf("%d", &num);
?? ?CycleNode* p = myBycycleList->first->next;
?? ?while ((p) != NULL)
?? ?{
?? ??? ?if (p->number == num)
?? ??? ?{
?? ??? ??? ?printf("車主姓名:%s\n", p->CycleHoster);
?? ??? ??? ?(p)->Sex == 0 ? printf("男") : printf("女");
?? ??? ??? ?printf("車主年齡 %d\n", p->Age);
?? ??? ??? ?printf("車主的身份證號為%s \n", p->IDcard);
?? ??? ??? ?printf("停車時間是 %d 年 %d ?月 ?%d 日 ?%d時\n", p->partingTime.year,p->partingTime.month,p->partingTime.day,p->partingTime.hour);
?? ??? ??? ?printf("停車位號為%d \n", p->number);
?? ??? ??? ?printf("查詢成功\n");
?? ??? ??? ?printf("\n");
?? ??? ??? ?return true;
?? ??? ?}
?? ??? ?p = p->next;
?? ?}
?? ?system("cls");
?? ?printf("查詢失敗,此車位還未被停車\n");
?? ?return false;
}
void ChangeCycle(CycleList* myBycycleList)
{
?? ?int num;
?? ?int temp;
?? ?char Name[20];
?? ?char Number[18];
?? ?size_t sz1;
?? ?size_t sz2;
?? ?FILE *fp = fopen("Test.txt", "wt");
?? ?int SEX;
?? ?int AGE;
?? ?printf("請輸入你要更改的信息的自行車位號\n");
?? ?scanf("%d", &num);
?? ?CycleNode *p = myBycycleList->first;
?? ?while (p != NULL)
?? ?{
?? ??? ?if (p->number == num)
?? ??? ?{
?? ??? ??? ?printf("您所查詢的信息如下\n");
?? ??? ??? ?SearchCycle(myBycycleList);
?? ??? ??? ?printf("請輸入你要更改的信息\n");
?? ??? ??? ?printf("1:更改姓名\n");
?? ??? ??? ?printf("2:更改性別\n");?? ??? ?
?? ??? ??? ?printf("3:更改年齡\n");
?? ??? ??? ?printf("4:更改身份證號\n");
?? ??? ??? ?scanf("%d", &temp);
?? ??? ??? ?switch (temp)
?? ??? ??? ?{
?? ??? ??? ?case ?1:
?? ??? ??? ??? ?_flushall();
?? ??? ??? ??? ?printf("請輸入新的姓名\n");
?? ??? ??? ??? ?scanf("%s", Name);
?? ??? ??? ??? ?_flushall();
?? ??? ??? ??? ?sz1 = strlen(Name)+1;
?? ??? ??? ??? ?memcpy(p->CycleHoster, Name, sz1);
?? ??? ??? ??? ?printf("更改成功,返回主菜單");
?? ??? ??? ??? ?printf("\n");
?? ??? ??? ??? ?return;
?? ??? ??? ?case 2:
?? ??? ??? ??? ?printf("請輸入性別:(0代表男)\n");
?? ??? ??? ??? ??? ?scanf("%d", &SEX);
?? ??? ??? ??? ??? ?p->Sex = num;
?? ??? ??? ??? ??? ?printf("更改成功,返回主菜單");
?? ??? ??? ??? ??? ?printf("\n");
?? ??? ??? ??? ??? ?return;
?? ??? ??? ?case 3:
?? ??? ??? ??? ?printf("請輸入年齡\n");
?? ??? ??? ??? ?scanf("%d", &AGE);
?? ??? ??? ??? ?p->Age = AGE;
?? ??? ??? ??? ?printf("更改成功,返回主菜單");
?? ??? ??? ??? ?printf("\n");
?? ??? ??? ??? ?return;
?? ??? ??? ?case 4:
?? ??? ??? ??? ?printf("請輸入身份證號\n");
?? ??? ??? ??? ?scanf("%s", Number);
?? ??? ??? ??? ?_flushall();
?? ??? ??? ??? ?sz2 = strlen(Number)+1;
?? ??? ??? ??? ?memcpy(p->IDcard, Number, sz2);
?? ??? ??? ??? ?printf("更改成功,返回主菜單");
?? ??? ??? ??? ?printf("\n");
?? ??? ??? ??? ?return;
?? ??? ??? ?default:
?? ??? ??? ??? ?printf("輸入有誤,返回主菜單\n");
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?p = p->next;
?? ?}
?? ?if(p == NULL)
?? ?{
?? ?printf("輸入有誤,返回主菜單");
?? ?printf("\n");
?? ?}
?? ?fclose(fp);
}
void PickUpCycle(CycleList* myBycycleList)//取車
{
?? ?int Year;
?? ?int Month;
?? ?int Day;
?? ?int Hour;
?? ?int FEE;
?? ?CycleNode*p = SearchCycle1(myBycycleList);
?? ?CycleNode* q = p->next;
?? ?assert(p != NULL);
?? ?printf("請輸入取車(年,月,日,時)");
?? ?scanf("%d,%d,%d,%d", &Year, &Month, &Day, &Hour);
?? ?printf("您存車的時間是 %d年 %d月 %d日 %d時", (*p).partingTime.year, (*p).partingTime.month, (*p).partingTime.day, (*p).partingTime.hour);
?? ?FEE = (((Year - (*p).partingTime.year) * 365 * 24 + (Month - (*p).partingTime.month) * 30 + (Day - (*p).partingTime.day) * 24 + (Hour - (*p).partingTime.hour)))*2;
?? ?printf("您需要繳納的費用為%d\n\n", FEE);
?? ?DeleteCyNode(myBycycleList, p->number);
?? ?printf("取車成功,返回主菜單\n");
?? ?printf("\n");
}
CycleNode* SearchCycle1(CycleList* myBycycleList)
{
?? ?int num;
?? ?printf("請輸入要查詢自行車位號:\n");
?? ?scanf("%d", &num);
?? ?CycleNode* p = myBycycleList->first;
?? ?while (p != NULL)
?? ?{
?? ??? ?if (p->number == num)
?? ??? ?{
?? ??? ??? ?return p;
?? ??? ?}
?? ??? ?p = p->next;
?? ?}
?? ?return NULL;
}
void PrintResSpace(CycleList* myBycycleList)
{
?? ?printf("=============查詢剩余車位===================\n");
?? ?CycleNode* p = myBycycleList->first->next;
?? ?assert(p != NULL);
?? ?while (p != NULL)
?? ?{
?? ??? ?printf("當前使用中的車位號是 %d\n", p->number);
?? ??? ?p = p->next;
?? ?}
?? ?printf("剩余車位數為: %zu \n",Space - myBycycleList->space);
?? ?printf("=============================================\n");
}
void FileWrite(CycleList* myBycycleList)
{
?? ?FILE *fp = fopen("Test.txt", "w");
?? ?CycleNode *p = myBycycleList->first;
?? ?assert(p != NULL);
?? ?while (p != NULL)
?? ?{
?? ??? ?fprintf("%s %d %d %s %d %d %d %d %d ",p->CycleHoster, p->Age,p->Sex,p->IDcard,p->number,p->partingTime.year,p->partingTime.month,p->partingTime.day, p->partingTime.hour);
?? ??? ?p = p->next;
?? ?}
?? ?fclose(fp);
}
void DeleteCyNode(CycleList* myBycycleList, int key)
{
?? ?CycleNode *s;//q
?? ?CycleNode *t = myBycycleList->first;//p
?? ?while (t->next != NULL && t->next->number != key)
?? ??? ?t = t->next;
?? ?if (t->next == NULL)
?? ??? ?return;
?? ?s = t->next;
?? ?if (t->next == myBycycleList->last)
?? ??? ?myBycycleList->last = t;
?? ?t->next = s->next;
?? ?free(t);
?? ?myBycycleList->space--;
?? ?return;
}
實際上用C寫出來的這種系統只能說是應付學校檢測,實際上沒有人愿意用這種系統,操作性不好,界面不美觀,魯棒性也不好,但是C真的是基礎編程學科,掌握這些方法的底層實現有助于很多其他編程語言的學習,所以,底層的方法我們還是要學一學。
原文鏈接:https://blog.csdn.net/flf1234567898/article/details/104660142
相關推薦
- 2022-03-20 docker中容器數據卷volume介紹_docker
- 2023-10-17 前端下載文件時修改文件名
- 2022-11-17 淺析golang的依賴注入_Golang
- 2023-02-23 Redis的setNX分布式鎖超時時間失效?-1問題及解決_Redis
- 2022-06-02 了解Kubernetes中的Service和Endpoint_云和虛擬化
- 2022-07-19 Oracle 集群sysbackup用戶登陸隨機報錯ORA-01017
- 2022-05-20 Node-Red 初始編寫第一條數據流Hello world
- 2022-07-04 Python異步處理返回進度——使用Flask實現進度條_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支