C语言-----职工信息管理系统
C語言 職工信息管理系統
(新手上道,請多指教)
(有些許轉載)
功能描述
1.錄入職工信息并保存
2.顯示所有職工信息(以一定的格式)
3.查詢職工信息(以一種或多種方式)
4.修改職工信息并保存
5. 刪除職工信息
6.職工號排序
7.文件的使用
1.創建鏈表
1.頭文件和結構體的定義
#include <stdlib.h> #include<string.h> #include<windows.h> #define N sizeof(struct works) /* N的值為struct works長度*/ typedef struct works {char number[15]; //職工號char name[20]; //名字char sex[5]; //性別char birth[11]; //出生日期char xueli[20]; //學歷char position[15]; // 職位char gongzi[20]; //工資char addr[20]; //地址char tel[11]; //電話號碼 /* memset(name,0);函數的功能是:將指針變量 s 所指向的前 n 字節的內存單元用一個“整數” c 替換,注意 c 是 int 型。s 是 void* 型的指針變量,所以它可以為任何類型的數據進行初始化。 memset() 的作用是在一段內存塊中填充某個給定的值。因為它只能填充一個值,所以該函數的初始化為原始初始化,無法將變量初始化為程序中需要的數據。用memset初始化完后,后面程序中再向該內存空間中存放需要的數據。 memset 一般使用“0”初始化內存單元,而且通常是給數組或結構體進行初始化。一般的變量如 char、int、float、double 等類型的變量直接初始化即可,沒有必要用 memset。如果用 memset 的話反而顯得麻煩。*/ /*在這里可選擇不用*/struct works *next; //定義了 }Node;上面注釋的有memset函數,是c++內容的東西,鑒于作者本文尚未接觸到所以并沒有使用,提前學習的可以嘗試使用
創建鏈表的同時,也可以為其定義一個別名,用的是 typedef 函數 在之后的書寫中會很方便,對于鏈表的創建,和了解不是很清楚的可以觀看這個博客的詳細介紹
結構體中定義值域與指針域,數值域存儲員工的信息,而指針域存儲要連接的結構體地址,
2.開始添加信息咯
2.開始定義其中的一個函數
Node *create(Node *&head) { // 建立鏈表Node *p1,*p2,*p;int n=1;char a;do { p1=(Node *)malloc(N);/*為p1開辟一個新單元,后面的都與之相似*/printf("輸入職工信息:\n"); printf("\n職工號:");scanf("%s",p1->number);/*scanf 需要跟&,數據是字符串不能使用喲*/p=head; //開辟新節點為了查詢重復 // do{ // printf("\n輸入職工號:"); // scanf("%s",p->number); // if(strcmp(p1->number,p->number)==0) // { // printf("職工號重復!"); // } // // };/*這里查重復可以使用調用函數,包括下邊的性別也是*/ 可以選擇 //int isExist(char number[],Node *&head){ // // Node* p ; // p= head; // // while(p){ // if(strcmp(p -> number,number) == 0){ // printf("該職工號已重復,請重新輸入:\n"); // return 1; // } // p = p->next; // } // return 0; //}printf("姓名:");scanf("%s",p1->name);printf("性別(輸入男或女):");scanf("%s",p1->sex);while(strcmp(p1->sex,"男")&&strcmp(p1->sex,"女")) /*判斷男女*/{/*strcmp的作用是比較字符串1和字符串2。(1) 如果字符串1=字符串2,函數值為0。(2) 如果字符串1>字符串2,函數值為一正整數。(3) 如果字符串1<字符串2,函數值為一負整數注:strcpy也是字符串的用法*/printf("請重新輸入!");scanf("%s",p1->sex);}printf("出生年月(例如:2002-02-02):");scanf("%s",p1->birth);printf("學歷----(本科/專科):");scanf("%s",p1->xueli);printf("職務----(現處于職務):");scanf("%s",p1->position);printf("工資-----:");scanf("%s",p1->gongzi);printf("住址----:");scanf("%s",p1->addr);printf("電話號碼:");scanf("%s",p1->tel);p1->next=NULL;if(n==1) {head=p1;}p2->next=p1;p2=p1;n++;printf("\n輸入 y 繼續輸入,輸入其他返回主菜單\n");getchar(); //可以吸收輸入的空格 或者一個字符a=getchar();} while(a=='y'||a=='Y');//執行是否輸入下一個數據return head; }上面所指的調用函數可以使用下面的調用函數進行使用
當初使用這個函數的時候代碼真的崩了(所以我把這個函數給去了,放心作為作者的我,等后來定會補上去)
3.刪除函數的定義
3.刪除函數
void Delete(Node *&head) {Node *p, *r;char k[15];p = head;if (p == NULL) {printf("提示:沒有職工信息可以刪除!\n ");return ;}printf(" \n提示:請輸入你要刪除的職工號!\n ");scanf("%s",k);if(strcmp(p->number,k)==0){head = head->next; //頭節點指向下一個的下一個,直接把下一個隔了過去,就這樣把下一個給刪除了,printf("刪除成功!");return;}while (p->next != NULL) {if (strcmp(p->next->number,k)==0) {p->next = p->next->next;printf("刪除成功!");break;}p = p->next;}}刪除函數形式
p->next->next相當于把中間那個就隔了過去,中間那個因此達到刪除的效果,
這個比上邊更形象,
4.插入職工信息
4.信息插入
Node *insert(Node *&head) { // 插入Node *p1,*p3;works *p2=new works(); // 開辟了一個新空間,運用了c++內容。char k[15];printf("\n插入某個職工之后:");scanf("%s", k);printf("\n輸入將要插入職工的數據:\n");p3=(Node *)malloc(N);//開辟空間p1=head;while(strcmp(p1->number,k)!=0&&p1->next!=NULL) {p2=p1;p1=p1->next;}if(strcmp(p1->number,k)!=0){printf("沒有該職工\n");} else { // p=head; // do{ // printf("\n輸入職工號:"); // scanf("%s",p->number); // if(strcmp(p1->number,p->number)==0) // { // printf("職工號重復!"); // } // }printf("\n職工號:");scanf("%s",p3->number);printf("姓名:");scanf("%s",p3->name);printf("性別:");scanf("%s",p3->sex);while(strcmp(p1->sex,"男")&&strcmp(p1->sex,"女")) /*判斷男女*/{ printf("請重新輸入!");scanf("%s",p1->sex);}printf("出生年月 (例如:2002-02-02):");scanf("%s",p3->birth);printf("學歷: (本科/專科)");scanf("%s",p3->xueli);printf("職務: (現處于職務)");scanf("%s",p3->position);printf("工資:");scanf("%s",p3->gongzi);printf("住址:");scanf("%s",p3->addr);printf("電話號碼:");scanf("%s",p3->tel);p2=p1->next;p1->next=p3;p3->next=p2;}return head; }采用尾插法開始插入,從頭指針進行開始,
5.查找功能
5.(1)通過職工號查找
Node *seek1(Node *head){ // 查找Node *p;char k[15];p=head;printf("\n輸入查找職工的職工號:\n");scanf("%s", k);while(strcmp(p->number,k)!=0&&p->next!=NULL) {p=p->next;}if(strcmp(p->number,k)==0){ //找到了printf("\n職工號\t姓名\t性別\t出生年月\t學歷\t職務\t工資\t住址\t電話號碼\n");printf("%d\t%s\t%s\t%s\t\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->birth,p->xueli,p->position,p->gongzi,p->addr,p->tel);}else { //*沒有找到printf("\n未找到該職工!\n");}return p; }(2).通過姓名查找職工信息
// Node *seek2(Node *&head) {Node *p;char M[20];p=head;printf("請輸入要查找的職工姓名:\n");scanf("%s",M);while(strcmp(p->name,M)!=0&&p->next!=NULL) {p=p->next;}if(strcmp(p->name,M)==0){printf("\n未找到該職工!\n");} else {if(strcmp(p->name,M)!=0)printf("\n職工號\t姓名\t性別\t出生年月\t學歷\t職務\t工資\t住址\t電話號碼\n");printf("%d\t%s\t%s\t%s\t\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->birth,p->xueli,p->position,p->gongzi,p->addr,p->tel);}return p; }(3)查找信息的主菜單
void menu1(){printf("*********歡迎進入查詢系統***********\n");printf("\t\t《《《1.按職工號查找》》》\n");printf("\t\t《《《2.按姓名查找》》》\n");printf("\t\t 《《《3.退出》》》 \n");printf("************結束使用*******************\n"); }6.修改職工信息
6.修改職工信息
Node *change(Node *&head){ // 修改Node *p;char k[15];p=head;printf("\n輸入要修改職工的職工號:");scanf("%s",k);while(strcmp(p->number,k)!=0&&p->next!=NULL){p=p->next;/*后一一個結點*/}if(strcmp(p->number,k)==0){ /*找到了*/printf("\n職工號:");scanf("%s",p->number); // p1=head; // while(strcmp(p1->number,k)!=0&&p1->next!=NULL) // { // p2=p1; // p1=p1->next; // }printf("姓名:");scanf("%s",p->name);printf("性別(輸入男或女):");scanf("%s",p->sex);while(strcmp(p->sex,"男")&&strcmp(p->sex,"女")) {printf("請重新輸入!");scanf("%s",p->sex);}printf("出生年月 (例如:2002-02-02):");scanf("%s",p->birth);printf("學歷: (本科/專科)");scanf("%s",p->xueli);printf("職務: (現處于職務)");scanf("%s",p->position);printf("工資------");scanf("%s",p->gongzi);printf("住址------");scanf("%s",p->addr);printf("電話號碼--");scanf("%s",p->tel);printf("\n修改成功!\n");}else { printf("\n未找到該職工 !\n");}return head; }首先需要找到所要修改的職工信息是否存在,查找完成后進行修改,將原本的信息進行替換,完成修改函數的定義。
7.職工信息的排序
Node *sort(Node *&head) {Node *p1,*p2,*p3;char a[20];p3=(Node *)malloc(N);for(p1=head; p1!=NULL; p1=p1->next){for(p2=p1->next; p2!=NULL; p2=p2->next){if(p1->number>p2->number){ strcpy(p3->number,p2->number); //后面的字符賦值給前面的字符串strcpy(p2->number,p1->number);strcpy(p1->number,p3->number); strcpy(a,p1->name);strcpy(p1->name,p2->name);strcpy(p2->name,a);strcpy(a,p1->sex);strcpy(p1->sex,p2->sex);strcpy(p2->sex,a);strcpy(a,p1->birth);strcpy(p1->birth,p2->birth);strcpy(p2->birth,a);strcpy(a,p1->xueli);strcpy(p1->xueli,p2->xueli);strcpy(p2->xueli,a);strcpy(a,p1->position);strcpy(p1->position,p2->position);strcpy(p2->position,a);strcpy(a,p1->gongzi);strcpy(p1->gongzi,p2->gongzi);strcpy(p2->gongzi,a);strcpy(a,p1->addr);strcpy(p1->addr,p2->addr);strcpy(p2->addr,a);strcpy(a,p1->tel);strcpy(p1->tel,p2->tel);strcpy(p2->tel,a);}}}return head; }主要是運用strcmp函數和strcpy函數(使用的時候都是字符串)其他類型會出現出錯
的使用進行類似下面的交換形式,從而達到信息的交換,
當然還可以,有很多其他的方法,等待發掘嘿嘿
這個排序的方法比上一個,更簡便些,運用指針的方法更為簡便。
8.輸出職工系統中的信息
Node *Disp(Node *&head) {Node *p;p=head;printf("\n職工號\t姓名\t性別\t出生年月\t學歷\t職務\t工資\t住址\t電話號碼\n");while(p!=NULL) { printf("%s\t%s\t%s\t%s\t\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->birth,p->xueli,p->position,p->gongzi,p->addr,p->tel);p=p->next;} return head; }把之前鏈表的內容輸出出來;
當然后面主函數的調用的時候可以實現輸出文件里面的東西。
文件里面一定要提前輸入,保證里面有東西。
9.讀取文件里的內容
Node *Du_qu(Node *&head) {FILE *fp; // Node *head;head = (Node*)malloc(N);Node *q=(Node*)malloc(N);if((fp=fopen("D:\\職工信息管理系統.txt","r+"))==NULL){printf("沒有此文件!");}q = head;while (!feof(fp)){ Node *p=(Node*)malloc(N);fscanf(fp,"%s %s %s %s %s %s %s %s %s\n",p->number,p->name,p->sex,p->birth,p->xueli,p->position,p->gongzi,p->addr,p->tel);printf("%s %s %s %s %s %s %s %s %s\n",p->number,p->name,p->sex,p->birth,p->xueli,p->position,p->gongzi,p->addr,p->tel);p->next = NULL;q->next = p;q= p;}fclose(fp); return head; }里面使用了feof
feof
是C語言標準庫函數函數,其原型在stdio.h中,其功能是檢測流上的文件結束符,如果文件結束,則返回非O值,否則返回0,文件結束符只能被clearerr()清除。
10.保存函數的定義
Node *save(Node *&head) { // 保存FILE *fp;Node *p;p=head;if((fp=fopen("D:\\職工信息管理系統.txt","w+"))==NULL){printf("打開失敗\n");exit(0);}while(p!=NULL){fprintf(fp,"%s %s %s %s %s %s %s %s %s\n",p->number,p->name,p->sex,p->birth,p->xueli,p->position,p->gongzi,p->addr,p->tel);p=p->next;}printf("保存成功\n");fclose(fp);printf("\n");return head; }保存函數和讀取函數的時候,一定記得,保存和讀取的需要一直。
11.主菜單的顯示
void menu() { // 菜單printf("********************************************************************************\n");printf("\t\t\t 歡迎使用職工管理系統\n");printf("\t**************************************************************\n");printf("\t\t\t 1.錄入職工信息。\n");printf("\t\t\t 2.查詢職工信息。\n");printf("\t\t\t 3.刪除職工信息。\n");printf("\t\t\t 4.插入職工信息。\n");printf("\t\t\t 5.修改職工信息。\n");printf("\t\t\t 6.輸出職工信息。\n");printf("\t\t\t 7.按職工號排序。\n"); // printf("\t\t\t 8.保存職工信息。\n");printf("\t\t\t 8.讀取職工信息。\n");printf("\t\t\t 0.退出系統。\n");printf("********************************************************************************\n");printf("\t\t\t 選擇對應編號:");}12.主函數(調用函數及主菜單)
int main() {Node *head;system("color 0B"); //輸出框的顏色與#include<windows.h>相對應char ch;int k;while(1) {menu();scanf("%d",&k);switch(k) {case 1:create(head);save(head); break; case 2:menu1();Disp(head);seek(head);break; case 3:Delete(head);save(head);break; case 4:insert(head);save(head);break; case 5:change(head);save(head);break; case 6:Disp(head);break; case 7: sort(head);Disp(head);break; // case 8: save(head); 單獨一個保存可有可無 // break; // case 8:Du_qu(head); Disp(head);break; case 0: printf(" 謝謝對本系統的使用!\n");exit(0);break;} // system("pause"); 暫停 // system("cls"); 原本寫的清屏(后來不想要了)}printf("************************************謝謝使用************************************\n");return 0; }主函數的調用:
需要在所使用的函數進行引用比如:Node *change(Node *&head)
之后所調用函數可以為 change(head);
引用就是 & 這個符號,如果不進行引用,比如:Node *change(Node *head)
調用函數,結果便需要為head=(change);
總結:關于職工信息管理系統的設計,剛開始的我,選擇借鑒其他人的博客,開始進行編輯,整體的系統構造,理解之后都非常的相似,主要的便是鏈表,指針,函數的使用
理解后讓自己補一些缺少的函數,也會有所思路,寫完后不算是太難。
嘿嘿,至此終結!!
總結
以上是生活随笔為你收集整理的C语言-----职工信息管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Mobile开发应该选择
- 下一篇: DataList分页技术-- Paged