日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于C语言的个人信息管理系统

發布時間:2023/12/9 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于C语言的个人信息管理系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實訓項目-個人信息管理系統

      • 前言
      • 一、前期相關準備
        • 1、 編譯軟件安裝
        • 2、 基本技術掌握
        • 2.1、 信息存儲
          • 2.1.1、 臨時存儲
          • 2.1.2、 長期存儲
        • 2.2、 查找排序
        • 2.3、 線性表操作
        • 2.4、 文件操作
        • 2.5、 代碼書寫規范
      • 二、需求分析
      • 三、難點疑點分析
        • 1、實現讀取文件并寫入鏈表中( 控制size )
        • 2、中文如何實現排序
        • 3、多文件如何聯系起來
      • 四、核心代碼思想和實現
        • 1、登陸注冊
        • 2、管理員模塊
        • 3、個人中心
        • 4、日程管理
        • 5、通訊錄管理
        • 6、健身管理
        • 7、財務管理
      • 五、總結與收獲
      • 六、白嫖源碼

前言

這篇博客記錄的是菜鳥(就是本人@~@)在大一學年末的實訓項目總結,公布之前已獲得項目小組成員的同意,轉載請保留申明,謝謝。
項目主要目的是加強數據結構代碼能力(C語言版)以及提高團隊合作能力,增加項目經驗,如果哪里寫的不恰當還請各位大神指點

一、前期相關準備

1、 編譯軟件安裝

在本次實訓項目中用的是Windows環境下的Dev-C++,實訓老師推薦的是可跨平臺的CLion,但是由于種種原因暫時沒有轉變隊伍內熟悉的IDE,這邊提供Dev-C++的官網下載地址

2、 基本技術掌握

2.1、 信息存儲

2.1.1、 臨時存儲

在臨時存儲中,由于元素個數變化較大以及錄入用戶的信息壓根不知道多大,因此會很明顯看到在本系統中存在對鏈表的大量操作demo,鏈表相對與順序表而言的優勢之一無外乎就是便于進行大量的數據增加和刪除,而正好這個項目需要的就是這個

2.1.2、 長期存儲

對于長期存儲,由于我們暫時還未學習數據庫,同時時間也不允許,因此運用了熟悉的C語言中的文件操作函數,將用戶數據保存在對應的文件中,而且老師也不允許我們用數據庫來做,說對會數據庫的同學來說這個完全沒有難度了(◎ロ◎)

2.2、 查找排序

在日程生活中不難發現,我們平時用的APP或Web或小程序,一塊有規律的數據一般情況下都會擁有查找功能,而查找的同時肯定也會將數據排序之后變成有序之后才顯示給用戶,增加用戶體驗感。因此便需要復習重溫排序查找的相關算法。

查找常用算法:順序查找、折半查找、分塊查找、哈希查找等

排序常用算法:折半排序、希爾排序、快速排序、堆排序等

2.3、 線性表操作

對線性表尤其是其中的鏈表的增刪改查要有熟練的掌握,對于這些函數的編寫要信手拈來。不會???正在加強技術的路上!!!

2.4、 文件操作

文件操作是根本,畢竟需要長期存儲,要保證數據持久化,總不能這次注冊登錄之后就把你的賬號自動注銷掉了是吧,所以我們就得把文件操作給掌握,主要熟悉文件打開關閉、文件信息讀寫,而文件指針定位在這個項目中沒用到所以我們對其只是一個簡單的了解,感興趣的可以自行去問問度娘

2.5、 代碼書寫規范

這是團隊合作最怕的就是代碼書寫不規范,大家做的時候一定一定要統一代碼的一些書寫風格,要不然到后期你會發現你腦子里都是“這a是啥”、“這個func干哈的”、“這個b又是個什么東西”……(頭疼)

二、需求分析

有需求分析才有編寫代碼的方向,所以很榮幸當了一把隊伍里面的客戶,體驗了上帝的感覺,確定下了以下功能模塊

功能模塊功能分析備注
注冊功能用于新用戶注冊賬號不可裁剪
登陸功能用于用戶登錄進入系統不可裁剪
個人信息管理用于查看修改個人賬號信息不可裁剪
通訊錄管理用于管理用戶朋友圈的聯系方式不可裁剪
日程管理用戶記錄用戶的日程不可裁剪
財務管理用于記錄用戶的日常財務情況不可裁剪
健身管理用于記錄用戶的健身情況不可裁剪

這里附上我小組項目的項目流程圖

三、難點疑點分析

1、實現讀取文件并寫入鏈表中( 控制size )

主要采用了二進制進行存儲,一開始的時候由于不熟悉,采取了最蠢的辦法,用fget和fput一行一行的進行讀寫文件,后面經過老師的一句話點撥——“為什么不直接將一個結點進行讀寫呢”,因此后來查找資料和個人demo測試之后發現,真香( ! w ! ),具體實現可查看- -> 財務管理模塊

2、中文如何實現排序

這個剛開始糾結了我和小組另外一位同學好一段時間,最后經過一次心血來潮想用strcmp來進行試驗之后,發現排序成功了,然后去廣泛查看他人的經驗分享,原來中文排序的時候是根據它的拼音為標識進行排序的;

3、多文件如何聯系起來

剛開始有想過放在一個文件里面,其他功能模塊都只是它的子函數,但是合并起來之后發現居然有四千多行(!M !)然后就去找度娘搜索如何解決這個問題,最終決定了將功能模塊封裝成函數庫,在主函數里面根據頭文件進行調用,這樣就控制了每個文件它的代碼量,看起來就很舒服,真香( ~ w ~ )

四、核心代碼思想和實現

由于是團隊聯合,代碼的實現界面排版以及代碼的風格會有一定的差異, 部分引用的是成員自寫的代碼思路,若哪里有問題歡迎各位大佬指點指點(+w+)

//結點結構 typedef struct userAccountInfo {accountInfo user; //用戶個人中心struct userAccountInfo *next; } userAccountInfo, *LinkuserAccountInfo;

1、登陸注冊

在程序運行的開始優先將用戶庫文檔內存放的數據加載進自定義的鏈表中,新用戶注冊時系統會判斷用戶名是否已存在,保證用戶名的唯一性(充當userID的角色)。

登錄時會根據用戶輸入的賬號密碼進行匹配,匹配成功則進入系統主菜單中

//登錄遍歷鏈表匹配賬號密碼 while(p) {if(!strcmp(UserName, p->user.userName)) {printf("請輸入密碼:");scanf("%s",PassWord);getchar();if(!strcmp(PassWord, p->user.userPassword)) {printf("正在登陸中請稍候……\n");Sleep(900); //進行等待0.9秒,可刪除system("cls"); //清屏mainMenu(p->user);return ;} else {while(errortime) {printf("請重新輸入密碼(還剩%2d次機會):", errortime);//密碼錯誤重新輸入scanf("%s", PassWord);getchar();errortime--;if(!strcmp(PassWord, p->user.userPassword)) { //最多只能錯三次printf("正在登陸中請稍候……\n");Sleep(900);system("cls");mainMenu(p->user);return ;}}if(!errortime) { //密碼錯誤達到最大值printf("密碼錯誤多次!!自動退出登錄界面!!!\n");return ;}}}p = p->next; }

注冊時會檢測申請注冊的賬號ID是否已存在,已存在的會提示重新輸入

p = userInfo->next; char userPassword_1[SCOPE]; printf("—————————————————————\n"); printf("| 請輸入你要注冊的用戶名 |\n"); printf("—————————————————————\n\n"); scanf("%s", s->user.userName); //輸入注冊用戶名 getchar(); while(p||(strcmp(s->user.userName, "admin") == 0)) { //判斷是否該用戶名是否和管理員沖突if(!strcmp(s->user.userName, "admin") || !strcmp(s->user.userName, p->user.userName)) {printf("———————————————————————\n");printf("| 該用戶已經存在!!! |\n");printf("| 請重新輸入你要注冊的用戶名 |\n");printf("———————————————————————\n\n");scanf("%s", s->user.userName); //重新輸入用戶名getchar();p = userInfo;}p = p->next; //移動遍歷 }

2、管理員模塊

該系統中設定的管理員擁有查看用戶信息、注銷用戶賬號和重置用戶密碼的功能,主要實現也是運用了鏈表的遍歷進行完成,下面附上注銷用戶賬號的核心代碼(判斷選項是否合法可以換用do-while循環來進行控制)

/*注銷用戶*/ void cancelUserAccount(LinkuserAccountInfo &user, char *userTarget) {userAccountInfo *p;p = searchUsesrInfo(user, userTarget); //查找目標結點 if(!p) {return ;}int chooseSure; printf("\n—————————————————————————————————\n");printf(" 是否確認注銷用戶\"%s\": \n",userTarget);printf(" 1. 確認 2. 取消 \n");printf("—————————————————————————————————\n\n");chooseSure = getch();while(chooseSure > 2+48 || chooseSure < 1+48) {printf("請輸入正確的選項\n");printf("\n—————————————————————————————————\n");printf(" 是否確認注銷用戶\"%s\": \n",userTarget);printf(" 1. 確認 2. 取消 \n");printf("—————————————————————————————————\n\n");chooseSure = getch();}switch(chooseSure) {case '1': {system("cls");userAccountInfo *q;q = p->next;p->next = q->next;usernum--;free(q);printf("\n—————————————————————————————————\n");printf(" 用戶\"%s\"已被注銷 \n", userTarget);printf("—————————————————————————————————\n\n");system("pause");system("cls");return ;}case '2': {system("cls");break;}} }

3、個人中心

該模塊主要功能是查看和修改個人的基本信息,以及修改個人賬號密碼

/*修改用戶密碼*/ Status changePassword(char *password) {int countError = 0; //輸入密碼錯誤次數 char inputWord[15]; //輸入的密碼 printf("\n—————————————————————————————————\n");printf(" 請輸入你的舊密碼 \n");printf("—————————————————————————————————\n");cin >> inputWord; for(countError = 1; countError <= maxErrorTime; countError++) { //若用戶輸入密碼錯誤次數超過設定次數則無法再修改密碼 if(countError == maxErrorTime) { //錯誤次數過多,退出修改密碼程序printf("\n—————————————————————————————————\n");printf(" 你輸入的密碼錯誤次數過多 \n");printf(" 將自動退出該界面 \n");printf("—————————————————————————————————\n"); return ERROR;}//輸入與用戶舊密碼相同時觸發if(!strcmp(password, inputWord)) { int flag = 1;char newPassword[15], newPasswordAgain[15];//判斷用戶兩次輸入新密碼是否一致 while(flag) {printf("\n—————————————————————————————————\n");printf(" 請輸入你的新密碼 \n");printf("—————————————————————————————————\n");cin >> newPassword; //輸入新密碼 printf("\n—————————————————————————————————\n");printf(" 請再次輸入新密碼 \n");printf("—————————————————————————————————\n");cin >> newPasswordAgain;//再次輸入新密碼 //判斷兩次輸入是否相等 if(!strcmp(newPassword, newPasswordAgain)) { //兩次輸入新密碼相同時更新密碼 strcpy(password, newPassword);printf("\n—————————————————————————————————\n");printf(" 密碼修改成功 \n");printf("—————————————————————————————————\n");return OK; } else { //兩次輸入新密碼不同時重新輸入新密碼printf("\n—————————————————————————————————\n");printf(" 兩次密碼輸入不同 \n");printf(" 請重新輸入新密碼 \n");printf("—————————————————————————————————\n"); }}} else {printf("\n—————————————————————————————————\n");printf(" 密碼輸入錯誤 \n");printf(" 請重新輸入密碼 \n");printf("—————————————————————————————————\n");cin >> inputWord; } } }

4、日程管理

主要記錄用戶的日常出行數據,同樣具備增刪改查的功能

/*新建日程*/ Status userscheduleManaInsert(LinkuserscheduleMana &L) {userscheduleMana *s;s = new userscheduleMana;printf("\n請輸入時間:");scanf("%s",s->elem.eventTime);getchar();printf("\n請輸入任務:");scanf("%s",s->elem.EventAddress);getchar();s->next = L->next;L->next = s;printf("增加成功!!!!\n");system("pause");system("cls"); }

5、通訊錄管理

采用對鏈表的操作和對文件的讀寫操作,從而實現增刪改查的功能

/*排序聯系人信息*/ void SortInformation(InformationLinkList &L,int n) {int i,j;Contacts temp[1];FILE *fp = fopen(DataAddress, "wb+");if (fp == NULL) {printf("文件無內容,請先新建聯系人信息\n");}Contacts read_demo[Max];fread(read_demo, sizeof(Contacts),n, fp);for( i=1;i<n;i++)//利用插入排序法 {strcpy(temp[0].ContactsNUm,read_demo[i].ContactsNUm);strcpy(temp[0].ContactsName,read_demo[i].ContactsName);strcpy(temp[0].ContactsAge,read_demo[i].ContactsAge);strcpy(temp[0].ContactsPhone,read_demo[i].ContactsPhone);strcpy(temp[0].ContactsAddress,read_demo[i].ContactsAddress);strcpy(temp[0].ContactsMail,read_demo[i].ContactsMail);for(j=i-1;j>=0&&strcmp(temp[0].ContactsNUm,read_demo[j].ContactsNUm)<0;j--){strcpy(read_demo[j+1].ContactsNUm,read_demo[j].ContactsNUm);strcpy(read_demo[j+1].ContactsName,read_demo[j].ContactsName); strcpy(read_demo[j+1].ContactsAge,read_demo[j].ContactsAge);strcpy(read_demo[j+1].ContactsPhone,read_demo[j].ContactsPhone);strcpy(read_demo[j+1].ContactsAddress,read_demo[j].ContactsAddress);strcpy(read_demo[j+1].ContactsMail,read_demo[j].ContactsMail);}strcpy(read_demo[j+1].ContactsNUm,temp[0].ContactsNUm);strcpy(read_demo[j+1].ContactsName,temp[0].ContactsName); strcpy(read_demo[j+1].ContactsAge,temp[0].ContactsAge);strcpy(read_demo[j+1].ContactsPhone,temp[0].ContactsPhone);strcpy(read_demo[j+1].ContactsAddress,temp[0].ContactsAddress);strcpy(read_demo[j+1].ContactsMail,temp[0].ContactsMail);}printf("排序后的聯系人信息為(編號從小到大):\n");printf("編號 姓名 年齡 電話號碼 通訊地址 郵箱\n");printf("——————————————————————————————————————\n");for( i=0;i<n;i++)printf("|%s\t%s\t%s\t%s\t%s\t%s|\n",read_demo[i].ContactsNUm,read_demo[i].ContactsName, read_demo[i].ContactsAge, read_demo[i].ContactsPhone,read_demo[i].ContactsAddress,read_demo[i].ContactsMail);printf("——————————————————————————————————————\n");fwrite(read_demo,sizeof(Contacts),n,fp);fflush(stdin); fclose(fp); }

6、健身管理

創建結構體鏈表存放方案各個數據域,錄入鏈表中的結點,增刪改查為對鏈表進行基礎操作,然后再將結點錄入文檔和讀取文檔

/*按照名稱查找方案信息*/ fitnessNode *searchFitnessInfo(Fitness &userFitness, char *target) {fitnessNode *p; p = userFitness;//對鏈表進行順序查找while(p->next) {if(!strcmp(p->next->data.schemeName, target)) {printf("—————————————————————————————————\n\n");printf(" 方案名稱:%s \n",p->next->data.schemeName);printf(" 方案類型:%s \n",p->next->data.schemeCategory);printf(" 方案強度:%s \n",p->next->data.schemeIntensity);printf(" 方案描述:%s \n",p->next->data.schemeDescribe);printf("—————————————————————————————————\n\n");return p; //返回前驅節點}p = p->next;}return NULL; //若不存在,則返回空 }

7、財務管理

可能刷到這里增刪改查都已經看累了,下面是結合了自己個人想法和老師的一句點睛提醒自編的讀寫文件代碼(二進制),基本思想就是每次讀寫的

/*加載初始化財務信息*/ void initFinance() {userFinance = (FinNode *)malloc(sizeof(FinNode));//初始化鏈表 userFinance->next = NULL;FILE *fp;fp = fopen("financeInfo.dat", "rb"); //打開目標文件 if(!fp) {printf("\n—————————————————————————————————\n");printf(" 數據讀取錯誤! \n");printf("——————————————————————————————————\n");fclose(fp);return ;} // fwrite(&numFinanceInfo, sizeof(numFinanceInfo), 1, fp); //用于開發者在最初的時候將numFinanceInfo置零 fread((void*)&numFinanceInfo, sizeof(numFinanceInfo), 1, fp); //財從文件讀取務數據結點數if(numFinanceInfo == 0) {fclose(fp);return ;}int tempNumFin = numFinanceInfo;FinNode *p; p = userFinance->next; //對鏈表進行錄入數據 while(tempNumFin--) { //根據信息個數一個個讀取出來 p = (FinNode *)malloc(sizeof(FinNode));fread((void*)&p->data, sizeof(financeInfo), 1, fp); //以每次讀取結點大小進鏈表,讀取financeInfo次p->next = userFinance->next;userFinance->next = p;}fclose(fp); } /*更新財務信息*/ void upDataFinance() {FILE *fp;fp = fopen("financeInfo.dat", "wb+"); //打開文件為二進制文件覆蓋寫 if(!fp) {printf("\n—————————————————————————————————\n");printf(" 數據出錯,可能數據包已丟失 \n");printf("——————————————————————————————————\n");fclose(fp);return ;}fwrite(&numFinanceInfo, sizeof(numFinanceInfo), 1, fp);FinNode *p;p = userFinance->next;while(numFinanceInfo--) { //根據信息個數決定寫入的次數 if(fwrite(p, sizeof(financeInfo), 1, fp) == 1) { //給到每個結點的地址,寫入一個結點的大小,寫一次循環 p = p->next;}}fclose(fp); }

五、總結與收獲

收獲和成長肯定是有的,我主要總結成以下精簡的幾個小點

  • 實訓之前的數據結構復習讓我注意到了之前編寫代碼沒注意到的細節
  • 編寫代碼時,代碼規范以及適當的注釋十分重要
  • 團隊協作進行項目制作是一個新挑戰,但你堅持下來之后你自然而然的會發現自己技術知識上的不足

六、白嫖源碼

得想辦法搞到第一手源碼 --> 快點這里
gitee倉庫已上傳 --> https://gitee.com/xbaozi-ch/InfoMS.git

總結

以上是生活随笔為你收集整理的基于C语言的个人信息管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。