首頁 > 軟體

C語言實現自行車管理系統

2022-08-31 14:03:39

在大家學完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("|*******************************************************************************|nn");

}

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 %dn", 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("車主姓名:%sn", p->CycleHoster);
            (p)->Sex == 0 ? printf("男") : printf("女");
            printf("車主年齡 %dn", 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("您需要繳納的費用為%dnn", 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("當前使用中的車位號是 %dn", 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真的是基礎程式設計學科,掌握這些方法的底層實現有助於很多其他程式語言的學習,所以,底層的方法我們還是要學一學。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com