#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Staff //資訊結構體
{
char name[10]; //姓名
char sex[5]; //性別
int Cyear; //出生年,月,日
int Cmonth;
int Cday;
int Gyear; //作業年,月,日
int Gmonth;
int Gday;
char XueLi[10]; //學歷
char ZhiWu[10]; //職務
char Adress[10]; //地址
int num; //手機號碼
}Staff;
typedef struct LNode
{
Staff data;
struct LNode *next;
}LNode;
/*typedef struct //輔助結構體
{
Staff data;
struct LNode *next;
}MNode;
*/
void VoidList(LNode *t1) //創建鏈表表頭
{
if(t1=(LNode *)malloc(sizeof(LNode)))
{
exit(1);
}
t1->next=NULL;
}
Status CreatList(LNode *t1) //職工資訊插入以及排序(字典)
{
LNode *a1,*a2,*a3;
a2=t1->next;
if(a1=(LNode *)malloc(sizeof(LNode)))
{
return ERROR;
}
printf("請輸入職工資訊:\n");
printf("姓名:\n");
scanf("%s",a1->data.name);
printf("性別(man或者woman):\n");
scanf("%s",a1->data.sex);
printf("出生年月日(分別以逗號(,)結尾.):\n");
scanf("%d,%d,%d",&(a1->data.Cyear),&(a1->data.Cmonth),&(a1->data.Cday));
printf("作業年月日(分別以逗號(,)結尾):\n");
scanf("%d,%d,%d",&(a1->data.Gyear),&(a1->data.Gmonth),&(a1->data.Gday));
printf("學歷:\n");
scanf("%s",a1->data.XueLi);
printf("職務:\n");
scanf("%s",a1->data.ZhiWu);
printf("住址:\n");
scanf("%s",a1->data.Adress);
printf("電話號碼:\n");
scanf("%d",a1->data.num);
if(t1->next==NULL)
{
t1->next=a1;
t1->next->next=NULL;
}
else
{
for(;a2;a2=a2->next)
{
if(a2->next!=NULL) //在兩者之間插入
{
if((strcmp(a2->data.name,a1->data.name)<0)&&(strcmp(a2->next->data.name,a1->data.name)>0))
{
a1->next=a2->next;
a2->next=a1;
break;
}
}
else
if(strcmp(a2->data.name,a1->data.name)==0) //姓名相同不錄入
{
break;
}
else
if((strcmp(a2->data.name,a1->data.name)<0)&&(a2->next==NULL)) //鏈表非空,且排在最后一個
{
a2->next=a1;
a1->next=NULL;
break;
}
else //鏈表非空,且在頭結點后排列
if(strcmp(a2->data.name,a1->data.name)>0)
{
a3=t1->next;
t1->next=a1;
a1->next=a3;
break;
}
}
}
return OK;
}
void put(LNode *t1,FILE *fp)
{
LNode *m1;
m1=t1->next;
if((fp=fopen("職工資訊.txt","w"))==NULL)
{
//如果沒有該檔案
printf("無法打開'職工資訊.txt'!\n");
exit(0);
}
for(;m1;m1=m1->next)
{//檔案中寫入
fprintf(fp,"%s %s %d %d %d %d% d% d% %s %s %s %d",m1->data.name,m1->data.sex,m1->data.Cyear,m1->data.Cmonth,m1->data.Cday,m1->data.Gyear,m1->data.Gmonth,m1->data.Gday,m1->data.XueLi,m1->data.ZhiWu,m1->data.Adress,m1->data.num);
}
if(fclose(fp))
{
printf("無法關閉'職工資訊.txt'!\n");
exit(0); //正常退出
}
}
void Print(LNode *t1) //列印當前職工資訊
{
int i=0;
LNode *q1;
q1=t1->next;
printf("職工資訊如下:\n");
printf("姓名 性別 出生年月 作業年月 學歷 職務 住址 電話\n");
while(q1!=NULL)
{
printf("%s ",q1->data.name);
printf("%s ",q1->data.sex);
printf("%d %d %d ",q1->data.Cyear,q1->data.Cmonth,q1->data.Cday);
printf("%d %d %d ",q1->data.Gyear,q1->data.Gmonth,q1->data.Gday);
printf("%s ",q1->data.XueLi);
printf("%s ",q1->data.ZhiWu);
printf("%s ",q1->data.Adress);
printf("%d\n",q1->data.num);
q1=q1->next;
i=i+1;
}
printf("一共%d個員工!",i);
}
Status Delete(LNode *t1) //洗掉員工操作
{
char name1[10];
LNode *q2,*q3;
q2=t1;
q3=t1->next;
if(q3==NULL)
return ERROR;
printf("請輸入您要洗掉的員工的姓名:\n");
scanf("%s",name1);
for(;q3;q3=q3->next)
{
if(strcmp(q3->data.name,name1)==0)
{
q2->next=q3->next;
free(q3);
printf("洗掉成功,請繼續操作!\n");
break;
}
q2=q3;
}
if(q3==NULL)
{
printf("無職工資訊,無需洗掉操作.\n");
}
return OK;
}
Status Search(LNode *t1) //查詢某個職工
{
char name2[10];
int select,flag1=0,flag2=0,num1;
LNode *s1;
s1=t1->next;
if(s1==NULL)
return ERROR;
printf("請輸入您要查找的人的條件:");
do
{
printf("***************\n");
printf("1.按姓名查找.\n");
printf("2.按電話查找.\n");
printf("0.結束操作.\n");
printf("***************\n");
scanf("%d",&select);
switch(select)
{
case 1:
printf("請輸入要查找的人的姓名:\n");
scanf("%s",name2);
for(;s1;s1=s1->next)
{
if(strcmp(s1->data.name,name2)==0)
{
printf("這個職工的資訊是:\n");
pirntf("姓名:\n");
printf("%s",s1->data.name);
printf("性別:\n");
printf("%s",s1->data.sex);
printf("出生年月日:\n");
printf("%5d%2d%2d",s1->data.Cyear,s1->data.Cmonth,s1->data.Cday);
printf("作業年月日:\n");
printf("%5d%2d%2d",s1->data.Gyear,s1->data.Gmonth,s1->data.Gday);
printf("學歷:\n");
printf("%s",s1->data.XueLi);
printf("職務:\n");
printf("%s",s1->data.ZhiWu);
printf("住址:\n");
printf("%s",s1->data.Adress);
printf("電話:\n");
printf("%d",s1->data.num);
flag1=1;
break;
}
}
if(flag1=0)
{
printf("對不起,沒有查到那個職工的資訊.\n");
}
break;
case 2:
printf("請輸入要查詢者的電話號碼.\n");
scanf("%d",&num1);
for(;s1;s1=s1->next)
{
if(s1->data.num==num1)
{
printf("這個職工的資訊是:\n");
pirntf("姓名:\n");
printf("%s",s1->data.name);
printf("性別:\n");
printf("%s",s1->data.sex);
printf("出生年月日:\n");
printf("%5d%2d%2d",s1->data.Cyear,s1->data.Cmonth,s1->data.Cday);
printf("作業年月日:\n");
printf("%5d%2d%2d",s1->data.Gyear,s1->data.Gmonth,s1->data.Gday);
printf("學歷:\n");
printf("%s",s1->data.XueLi);
printf("職務:\n");
printf("%s",s1->data.ZhiWu);
printf("住址:\n");
printf("%s",s1->data.Adress);
printf("電話:\n");
printf("%d",s1->data.num);
flag2=1;
break;
}
}
if(flag2==0)
printf("對不起,沒有查詢到那個職工的資訊.\n");
break;
case 0:
printf("結束操作.\n");
break;
default:
printf("輸入選擇出錯!\n");
}
}
while(select!=0);
return OK;
}
void Amend(LNode *t1) //修改某個員工的某些資訊
{
int n,tag=0;
int scyear,scmonth,scday,sgyear,sgmonth,sgday,snum;
char sname[10],ssex[5],sxue[10],szhi[10],sadress[10];
char name3[10];
LNode *s2;
s2=t1->next;
if(t1->next==NULL)
{
printf("沒有可以修改的學生.\n");
return;
}
printf("請輸入要修改員工的姓名:\n");
scanf("%s",name3);
for(;s2;s2->next)
{
if(strcmp(s2->data.name,name3)==0)
{
tag=1;
do
{
printf("請輸入您想更改的部分:\n");
printf("***************\n");
printf("0.退出更改.\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("***************\n");
scanf("%d",&n);
switch(n)
{
case 1:
printf("請輸入想更改的名字:\n");
scanf("%s",sname);
strcpy(s2->data.name,sname);
printf("更改完成,請繼續操作.\n\n");
break;
case 2:
printf("請輸入想更改的性別:\n");
scanf("%s",ssex);
strcpy(s2->data.sex,ssex);
printf("更改完成,請繼續操作.\n\n");
break;
case 3:
printf("請輸入想更改的出生年月日.\n");
scanf("%d%d%d",&scyear,&scmonth,&scday);
s2->data.Cyear=scyear;
s2->data.Cmonth=scmonth;
s2->data.Cday=scday;
printf("更改完成,請繼續操作.\n\n");
break;
case 4:
printf("請輸入要更改的作業時間.\n");
scanf("%d%d%d",&sgyear,&sgmonth,&sgday);
s2->data.Gyear=sgyear;
s2->data.Gmonth=sgmonth;
s2->data.Gday=sgday;
printf("更改完成,請繼續操作.\n\n");
break;
case 5:
printf("請輸入想更改的學歷.\n");
scanf("%s",sxue);
strcpy(s2->data.XueLi,sxue);
printf("更改完成,請繼續操作.\n\n");
break;
case 6:
printf("請輸入想更改的職務.\n");
scanf("%s",szhi);
strcpy(s2->data.ZhiWu,szhi);
printf("更改完成,請繼續操作.\n\n");
break;
case 7:
printf("請輸入想更改的住址.\n");
scanf("%s",sadress);
strcpy(s2->data.Adress,sadress);
printf("更改完成,請繼續操作.\n\n");
break;
case 8:
printf("請輸入想更改的號碼.\n");
scanf("%d",&snum);
s2->data.num=snum;
printf("更改完成,請繼續操作.\n\n");
break;
case 0:
printf("退出操作.\n");
break;
default:
printf("您的選擇出現了問題,請重新選擇.\n");
}
}
while(n!=0);
}
}
if(tag==0)
pirntf("抱歉,您輸入的人不存在.\n");
}
void main()
{
int i;
FILE *fp;
LNode t,*T;
T=&t;
VoidList(T);
do
{
printf("*******************\n");
printf("1.新增一名員工.\n");
printf("2.洗掉一名員工.\n");
printf("3.查詢一名員工(按照名字或號碼)\n");
printf("4.輸入名字,修改對應員工的屬性\n");
printf("0.退出操作.\n");
printf("*******************\n");
printf("請輸入您想操作的數字.\n");
scanf("%d",&i);
switch(i)
{
case 1:
if(CreatList(T)==0)
printf("創建出錯.\n");
else
printf("資訊建立成功.\n");
put(T,fp);
printf("列印輸出當前資訊.\n");
Print(T);
printf("\n");
printf("請繼續操作.\n\n");
break;
case 2:
Delete(T);
//判斷檔案是否寫入.
if((fp=fopen("職工資訊.txt","w"))==NULL)
{
printf("無法打開'職工資訊.txt'!\n");
exit(0);
}
put(T,fp);
if(fclose(fp))
{
printf("無法關閉'職工資訊.txt'!\n");
exit(0);
}
printf("列印輸出當前資訊.\n");
Print(T);
printf("\n");
printf("請繼續操作.\n\n");
break;
case 3:
Search(T);
printf("列印輸出當前資訊.\n");
Print(T);
printf("\n");
printf("請繼續操作.\n\n");
break;
case 4:
Amend(T);
if((fp=fopen("職工資訊.txt","w"))==NULL)
{
printf("無法打開'職工資訊.txt'!\n");
exit(0);
}
put(T,fp);
if(fclose(fp))
{
printf("無法關閉'職工資訊.txt'!\n");
exit(0);
}
printf("列印輸出當前資訊.\n");
Print(T);
printf("\n");
printf("請繼續操作.\n\n");
break;
case 0:
printf("操作已退出,感謝您的使用.\n");
break;
}
}while(i!=0);
//switch
/*
VoidList(T); 創建空鏈表
CreatList(T); 對空鏈表進行賦值,員工資訊
Print(T); 列印輸出員工資訊
Delete(T); 洗掉某個員工資訊
Search(T); 搜尋某個員工資訊
Amend(T); 修改某個員工資訊
*/
}
/*
基本要求:
職工物件包括姓名、性別、出生年月、作業年月、學歷、職務、住址電話等資訊。
(1)新增一名員工:將新增物件按姓名以字典方式職工管理檔案中。
(2)洗掉一名員工:從職工管理檔案中洗掉一名職工物件。
(3)查詢:從職工管理檔案中查詢符合某些條件的職工。
(4)修改:檢索某個職工物件,對其某些屬性進行修改。
(5)排序:按某種需要對職工檔案物件進行排序。(字典順序)
*/
uj5u.com熱心網友回復:
這么長的代碼,建議通過注釋部分功能,然后再逐步放開部分功能,一次來查找問題出在哪個功能函式里,這樣也比較容易解決問題uj5u.com熱心網友回復:
我明天試試,沒什么經驗,我不知道是不是檔案那里用錯了uj5u.com熱心網友回復:
編譯問題90%百度就能解決了,就算論壇上問也貼下編譯錯誤內容啊uj5u.com熱心網友回復:
好的,等下我來貼一下
uj5u.com熱心網友回復:
what?你說什么,沒看懂
uj5u.com熱心網友回復:
最好功能逐個實作,從最基礎的開始,其他的先注釋掉,這種專案不要急于寫一大堆uj5u.com熱心網友回復:
這個專案我感覺不是很大,那樣慢慢寫太浪費時間了
uj5u.com熱心網友回復:
但是一旦出錯就就像你這樣子
uj5u.com熱心網友回復:
最好功能逐個實作,從最基礎的開始,其他的先注釋掉,這種專案不要急于寫一大堆
這個專案我感覺不是很大,那樣慢慢寫太浪費時間了
但是一旦出錯就就像你這樣子
以后寫大的程式都是一個一個功能慢慢實作嗎
uj5u.com熱心網友回復:
那肯定了,除非你特別厲害uj5u.com熱心網友回復:
?什么東西提到了我?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263502.html
標籤:C語言
上一篇:請問一下 這個程式是輸出一組陣列中互換最高分和最低分之后的陣列,可是我這樣寫輸出的還是原來輸入的陣列的順序,請問要怎么改呢
