當前位置:編程學習大全網 - 編程語言 - 通訊錄的編程。功能 : 添加 查詢 刪除 修改 排序 輸出全部信息 寫入和讀取文件 退出 星期二前要 很感謝

通訊錄的編程。功能 : 添加 查詢 刪除 修改 排序 輸出全部信息 寫入和讀取文件 退出 星期二前要 很感謝

#include "stdio.h" /*I/O函數*/

#include "stdlib.h" /*其它說明*/

#include "string.h" /*字符串函數*/

#include "conio.h" /*屏幕操作函數*/

#include "mem.h" /*內存操作函數*/

#include "ctype.h" /*字符操作函數*/

#include "alloc.h" /*動態地址分配函數*/

#define N 3 /*定義常數*/

typedef struct z1 /*定義數據結構*/

{

char no[11];

char name[15];

int score[N];

float sum;

float average;

int order;

struct z1 *next;

}STUDENT;

/*以下是函數原型*/

STUDENT *init(); /*初始化函數*/

STUDENT *create(); /*創建鏈表*/

STUDENT *delete(STUDENT *h); /*刪除記錄*/

void print(STUDENT *h); /* 顯示所有記錄*/

void search(STUDENT *h); /*查找*/

void save(STUDENT *h); /*保存*/

STUDENT *load(); /*讀入記錄*/

void computer(STUDENT *h); /*計算總分和均分*/

STUDENT *insert(STUDENT *h); /*插入記錄*/

void append(); /*追加記錄*/

void copy(); /*復制文件*/

STUDENT *sort(STUDENT *h); /*排序*/

STUDENT *index(STUDENT *h); /*索引*/

void total(STUDENT *h); /*分類合計*/

int menu_select(); /*菜單函數*/

/******主函數開始*******/

main()

{

int i;

STUDENT *head; /*鏈表定義頭指針*/

head=init(); /*初始化鏈表*/

clrscr(); /*清屏*/

for(;;) /*無限循環*/

{

switch(menu_select()) /*調用主菜單函數,返回值整數作開關語句的條件*/

{ /*值不同,執行的函數不同,break 不能省略*/

case 0:head=init();break; /*執行初始化*/

case 1:head=create();break; /*創建鏈表*/

case 2:head=delete(head);break; /*刪除記錄*/

case 3:print(head);break; /*顯示全部記錄*/

case 4:search(head);break; /*查找記錄*/

case 5:save(head);break; /*保存文件*/

case 6:head=load(); break; /*讀文件*/

case 7:computer(head);break; /*計算總分和均分*/

case 8:head=insert(head); break; /*插入記錄*/

case 9:copy();break; /*復制文件*/

case 10:head=sort(head);break; /*排序*/

case 11:append();break; /*追加記錄*/

case 12:head=index(head);break; /*索引*/

case 13:total(head);break; /*分類合計*/

case 14:exit(0); /*如菜單返回值為14程序結束*/

}

}

}

/*菜單函數,返回值為整數*/

menu_select()

{

char *menu[]={"***************MENU***************", /*定義菜單字符串數組*/

" 0. init list", /*初始化*/

" 1. Enter list", /*輸入記錄*/

" 2. Delete a record from list", /*從表中刪除記錄*/

" 3. print list ", /*顯示單鏈表中所有記錄*/

" 4. Search record on name", /*按照姓名查找記錄*/

" 5. Save the file", /*將單鏈表中記錄保存到文件中*/

" 6. Load the file", /*從文件中讀入記錄*/

" 7. compute the score", /*計算所有學生的總分和均分*/

" 8. insert record to list ", /*插入記錄到表中*/

" 9. copy the file to new file", /*復制文件*/

" 10. sort to make new file", /*排序*/

" 11. append record to file", /*追加記錄到文件中*/

" 12. index on nomber", /*索引*/

" 13. total on nomber", /*分類合計*/

" 14. Quit"}; /*退出*/

char s[3]; /*以字符形式保存選擇號*/

int c,i; /*定義整形變量*/

gotoxy(1,25); /*移動光標*/

printf("press any key enter menu......\n"); /*壓任壹鍵進入主菜單*/

getch(); /*輸入任壹鍵*/

clrscr(); /*清屏幕*/

gotoxy(1,1); /*移動光標*/

textcolor(YELLOW); /*設置文本顯示顏色為黃色*/

textbackground(BLUE); /*設置背景顏色為藍色*/

gotoxy(10,2); /*移動光標*/

putch(0xc9); /*輸出左上角邊框┏*/

for(i=1;i<44;i++)

putch(0xcd); /*輸出上邊框水平線*/

putch(0xbb); /*輸出右上角邊框 ┓*/

for(i=3;i<20;i++)

{

gotoxy(10,i);putch(0xba); /*輸出左垂直線*/

gotoxy(54,i);putch(0xba);

} /*輸出右垂直線*/

gotoxy(10,20);putch(0xc8); /*輸出左上角邊框┗*/

for(i=1;i<44;i++)

putch(0xcd); /*輸出下邊框水平線*/

putch(0xbc); /*輸出右下角邊框┛*/

window(11,3,53,19); /* 制作顯示菜單的窗口,大小根據菜單條數設計*/

clrscr(); /*清屏*/

for(i=0;i<16;i++) /*輸出主菜單數組*/

{

gotoxy(10,i+1);

cprintf("%s",menu[i]);

}

textbackground(BLACK); /*設置背景顏色為黑色*/

window(1,1,80,25); /*恢復原窗口大小*/

gotoxy(10,21); /*移動光標*/

do{

printf("\n Enter you choice(0~14):"); /*在菜單窗口外顯示提示信息*/

scanf("%s",s); /*輸入選擇項*/

c=atoi(s); /*將輸入的字符串轉化為整形數*/

}while(c<0||c>14); /*選擇項不在0~14之間重輸*/

return c; /*返回選擇項,主程序根據該數調用相應的函數*/

}

STUDENT *init()

{

return NULL;

}

/*創建鏈表*/

STUDENT *create()

{

int i; int s;

STUDENT *h=NULL,*info; /* STUDENT指向結構體的指針*/

for(;;)

{

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/

if(!info) /*如果指針info為空*/

{

printf("\nout of memory"); /*輸出內存溢出*/

return NULL; /*返回空指針*/

}

inputs("enter no:",info->no,11); /*輸入學號並校驗*/

if(info->no[0]=='@') break; /*如果學號首字符為@則結束輸入*/

inputs("enter name:",info->name,15); /*輸入姓名,並進行校驗*/

printf("please input %d score \n",N); /*提示開始輸入成績*/

s=0; /*計算每個學生的總分,初值為0*/

for(i=0;i<N;i++) /*N門課程循環N次*/

{

do{

printf("score%d:",i+1); /*提示輸入第幾門課程*/

scanf("%d",&info->score[i]); /*輸入成績*/

if(info->score[i]>100||info->score[i]<0) /*確保成績在0~100之間*/

printf("bad data,repeat input\n"); /*出錯提示信息*/

}while(info->score[i]>100||info->score[i]<0);

s=s+info->score[i]; /*累加各門課程成績*/

}

info->sum=s; /*將總分保存*/

info->average=(float)s/N; /*求出平均值*/

info->order=0; /*未排序前此值為0*/

info->next=h; /*將頭結點做為新輸入結點的後繼結點*/

h=info; /*新輸入結點為新的頭結點*/

}

return(h); /*返回頭指針*/

}

/*輸入字符串,並進行長度驗證*/

inputs(char *prompt, char *s, int count)

{

char p[255];

do{

printf(prompt); /*允鞠提示信息*/

scanf("%s",p); /*輸入字符串*/

if(strlen(p)>count)printf("\n too long! \n"); /*進行長度校驗,超過count值重輸入*/

}while(strlen(p)>count);

strcpy(s,p); /*將輸入的字符串拷貝到字符串s中*/

}

/*輸出鏈表中結點信息*/

void print(STUDENT *h)

{

int i=0; /* 統計記錄條數*/

STUDENT *p; /*移動指針*/

clrscr(); /*清屏*/

p=h; /*初值為頭指針*/

printf("\n\n\n****************************STUDENT********************************\n");

printf("|rec|nO | name | sc1| sc2| sc3| sum | ave |order|\n");

printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");

while(p!=NULL)

{

i++;

printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],

p->score[2],p->sum,p->average,p->order);

p=p->next;

}

printf("**********************************end*********************************\n");

}

/*刪除記錄*/

STUDENT *delete(STUDENT *h)

{

STUDENT *p,*q; /*p為查找到要刪除的結點指針,q為其前驅指針*/

char s[11]; /*存放學號*/

clrscr(); /*清屏*/

printf("please deleted no\n"); /*顯示提示信息*/

scanf("%s",s); /*輸入要刪除記錄的學號*/

q=p=h; /*給q和p賦初值頭指針*/

while(strcmp(p->no,s)&&p!=NULL) /*當記錄的學號不是要找的,或指針不為空時*/

{

q=p; /*將p指針值賦給q作為p的前驅指針*/

p=p->next; /*將p指針指向下壹條記錄*/

}

if(p==NULL) /*如果p為空,說明鏈表中沒有該結點*/

printf("\nlist no %s student\n",s);

else /*p不為空,顯示找到的記錄信息*/

{

printf("*****************************have found***************************\n");

printf("|no | name | sc1| sc2| sc3| sum | ave |order|\n");

printf("|----------|---------------|----|----|----|--------|-------|-----|\n");

printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,

p->name,p->score[0],p->score[1],p->score[2],p->sum,

p->average,p->order);

printf("********************************end*******************************\n");

getch(); /*壓任壹鍵後,開始刪除*/

if(p==h) /*如果p==h,說明被刪結點是頭結點*/

h=p->next; /*修改頭指針指向下壹條記錄*/

else

q->next=p->next; /*不是頭指針,將p的後繼結點作為q的後繼結點*/

free(p); /*釋放p所指結點空間*/

printf("\n have deleted No %s student\n",s);

printf("Don't forget save\n");/*提示刪除後不要忘記保存文件*/

}

return(h); /*返回頭指針*/

}

/*查找記錄*/

void search(STUDENT/*當記錄的姓名不是要找的,或指針不為空時*/

{ p=p->next; /*移動指針,指向下壹結點*/

if(p==NULL) /*如果指針為空*/

printf("\nlist no %s student\n",s); /*顯示沒有該學生*/

else /*顯示找到的記錄信息*/

{

printf (*h)

{

STUDENT *p; /* 移動指針*/

char s[15]; /*存放姓名的字符數組*/

clrscr(); /*清屏幕*/

printf("please enter name for search\n");

scanf("%s",s); /*輸入姓名*/

p=h; /*將頭指針賦給p*/

while(strcmp(p->name,s)&&p!=NULL) ("\n\n*****************************havefound***************************\n");

printf("|nO | name | sc1| sc2| sc3| sum | ave |order|\n");

printf("|----------|---------------|----|----|----|--------|-------|-----|\n");

printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,

p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

printf("********************************end*******************************\n");

}

}

}

/*插入記錄*/

STUDENT *insert(STUDENT *h)

{

STUDENT *p,*q,*info; /*p指向插入位置,q是其前驅,info指新插入記錄*/

char s[11]; /*保存插入點位置的學號*/

int s1,i;

printf("please enter location before the no\n");

scanf("%s",s); /*輸入插入點學號*/

printf("\nplease new record\n"); /*提示輸入記錄信息*/

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/

if(!info)

{

printf("\nout of memory"); /*如沒有申請到,內存溢出*/

return NULL; /*返回空指針*/

}

inputs("enter no:",info->no,11); /*輸入學號*/

inputs("enter name:",info->name,15); /*輸入姓名*/

printf("please input %d score \n",N); /*提示輸入分數*/

s1=0; /*保存新記錄的總分,初值為0*/

for(i=0;i<N;i++) /*N門課程循環N次輸入成績*/

{

do{ /*對數據進行驗證,保證在0~100之間*/

printf("score%d:",i+1);

scanf("%d",&info->score[i]);

if(info->score[i]>100||info->score[i]<0)

printf("bad data,repeat input\n");

}while(info->score[i]>100||info->score[i]<0);

s1=s1+info->score[i]; /*計算總分*/

}

info->sum=s1; /*將總分存入新記錄中*/

info->average=(float)s1/N; /*計算均分*/

info->order=0; /*名次賦值0*/

info->next=NULL; /*設後繼指針為空*/

p=h; /*將指針賦值給p*/

q=h; /*將指針賦值給q*/

while(strcmp(p->no,s)&&p!=NULL) /*查找插入位置*/

{

q=p; /*保存指針p,作為下壹個p的前驅*/

p=p->next; /*將指針p後移*/

}

if(p==NULL) /*如果p指針為空,說明沒有指定結點*/

if(p==h) /*同時p等於h,說明鏈表為空*/

h=info; /*新記錄則為頭結點*/

else

q->next=info; /*p為空,但p不等於h,將新結點插在表尾*/

else

if(p==h) /*p不為空,則找到了指定結點*/

{

info->next=p; /*如果p等於h,則新結點插入在第壹個結點之前*/

h=info; /*新結點為新的頭結點*/

}

else

{

info->next=p; /*不是頭結點,則是中間某個位置,新結點的後繼為p*/

q->next=info; /*新結點作為q的後繼結點*/

}

printf("\n ----have inserted %s student----\n",info->name); printf("---Don't forget save---\n"); /*提示存盤*/

return(h); /*返回頭指針*/

}

/*保存數據到文件*/

void save(STUDENT *h)

{

FILE *fp; /*定義指向文件的指針*/

STUDENT *p; /* 定義移動指針*/

char outfile[10]; /*保存輸出文件名*/

printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示文件名格式信息*/

scanf("%s",outfile);

if((fp=fopen(outfile,"wb"))==NULL) /*為輸出打開壹個二進制文件,如沒有則建立*/

{

printf("can not open file\n");

exit(1);

}

printf("\nSaving file......\n"); /*打開文件,提示正在保存*/

p=h; /*移動指針從頭指針開始*/

while(p!=NULL) /*如p不為空*/

{

fwrite(p,sizeof(STUDENT),1,fp);/*寫入壹條記錄*/

p=p->next; /*指針後移*/

}

fclose(fp); /*關閉文件*/

printf("-----save success!!-----\n"); /*顯示保存成功*/

}

/* 從文件讀數據*/

STUDENT *load()

{

STUDENT *p,*q,*h=NULL; /*定義記錄指針變量*/

FILE *fp; /* 定義指向文件的指針*/

char infile[10]; /*保存文件名*/

printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*輸入文件名*/

if((fp=fopen(infile,"rb"))==NULL) /*打開壹個二進制文件,為讀方式*/

{

printf("can not open file\n"); /*如不能打開,則結束程序*/

exit(1);

}

printf("\n -----Loading file!-----\n");

p=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/

if(!p)

{

printf("out of memory!\n"); /*如沒有申請到,則內存溢出*/

return h; /*返回空頭指針*/

}

h=p; /*申請到空間,將其作為頭指針*/

while(!feof(fp)) /*循環讀數據直到文件尾結束*/

{

if(1!=fread(p,sizeof(STUDENT),1,fp))

break; /*如果沒讀到數據,跳出循環*/

p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*為下壹個結點申請空間*/

if(!p->next)

{

printf("out of memory!\n"); /*如沒有申請到,則內存溢出*/

return h;

}

q=p; /*保存當前結點的指針,作為下壹結點的前驅*/

p=p->next; /*指針後移,新讀入數據鏈到當前表尾*/

}

q->next=NULL; /*最後壹個結點的後繼指針為空*/

fclose(fp); /*關閉文件*/

printf("---You have success read data from file!!!---\n");

return h; /*返回頭指針*/

}

/*追加記錄到文件*/

void append()

{

FILE *fp; /*定義指向文件的指針*/

STUDENT *info; /*新記錄指針*/

int s1,i;

char infile[10]; /*保存文件名*/

printf("\nplease new record\n");

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/

if(!info)

{

printf("\nout of memory"); /*沒有申請到,內存溢出本函數結束*/

return ;

}

inputs("enter no:",info->no,11); /*調用inputs輸入學號*/

inputs("enter name:",info->name,15); /*調用inputs輸入姓名*/

printf("please input %d score \n",N); /*提示輸入成績*/

s1=0;

for(i=0;i<N;i++)

{

do{

printf("score%d:",i+1);

scanf("%d",&info->score[i]); /*輸入成績*/

if(info->score[i]>100||info->score[i]<0)printf("bad data,repeat input\n");

}while(info->score[i]>100||info->score[i]<0); /*成績數據驗證*/

s1=s1+info->score[i]; /*求總分*/

}

info->sum=s1; /*保存總分*/

info->average=(float)s1/N; /*求均分*/

info->order=0; /*名次初始值為0*/

info->next=NULL; /*將新記錄後繼指針賦值為空*/

printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*輸入文件名*/

if((fp=fopen(infile,"ab"))==NULL) /*向二進制文件尾增加數據方式打開文件*/

{

printf("can not open file\n"); /*顯示不能打開*/

exit(1); /*退出程序*/

}

printf("\n -----Appending record!-----\n");

if(1!=fwrite(info,sizeof(STUDENT),1,fp)) /*寫文件操作*/

{

printf("-----file write error!-----\n");

return; /*返回*/

}

printf("-----append sucess!!----\n");

fclose(fp); /*關閉文件*/

}

/*文件拷貝*/

void copy()

{

char outfile[10],infile[10];

FILE *sfp,*tfp; /*源和目標文件指針*/

STUDENT *p=NULL; /*移動指針*/

clrscr(); /*清屏*/

printf("Enter infile name,for example c:\\f1\\te.txt:\n");

scanf("%s",infile); /*輸入源文件名*/

if((sfp=fopen(infile,"rb"))==NULL) /*二進制讀方式打開源文件*/

{

printf("can not open input file\n");

exit(0);

}

printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示輸入目標文件名*/

scanf("%s",outfile); /*輸入目標文件名*/

if((tfp=fopen(outfile,"wb"))==NULL) /*二進制寫方式打開目標文件*/

{

printf("can not open output file \n");

exit(0);

}

while(!feof(sfp)) /*讀文件直到文件尾*/

{

if(1!=fread(p,sizeof(STUDENT),1,sfp))

break; /*塊讀*/

fwrite(p,sizeof(STUDENT),1,tfp); /*塊寫*/

}

fclose(sfp); /*關閉源文件*/

fclose(tfp); /*關閉目標文件*/

printf("you have success copy file!!!\n"); /*顯示成功拷貝*/

}

/*排序*/

STUDENT *sort(STUDENT *h)

{

int i=0; /*保存名次*/

STUDENT *p,*q,*t,*h1; /*定義臨時指針*/

h1=h->next; /*將原表的頭指針所指的下壹個結點作頭指針*/

h->next=NULL; /*第壹個結點為新表的頭結點*/

while(h1!=NULL) /*當原表不為空時,進行排序*/

{

t=h1; /*取原表的頭結點*/

h1=h1->next; /*原表頭結點指針後移*/

p=h; /*設定移動指針p,從頭指針開始*/

q=h; /*設定移動指針q做為p的前驅,初值為頭指針*/

while(t->sum<p->sum&&p!=NULL) /*作總分比較*/

{

q=p; /*待排序點值小,則新表指針後移*/

p=p->next;

}

if(p==q) /*p==q,說明待排序點值大,應排在首位*/

{

t->next=p; /*待排序點的後繼為p*/

h=t; /*新頭結點為待排序點*/

}

else /*待排序點應插入在中間某個位置q和p之間,如p為空則是尾部*/

{

t->next=p; /*t的後繼是p*/

q->next=t; /*q的後繼是t*/

}

}

p=h; /*已排好序的頭指針賦給p,準備填寫名次*/

while(p!=NULL) /*當p不為空時,進行下列操作*/

{

i++; /*結點序號*/

p->order=i; /*將名次賦值*/

p=p->next; /*指針後移*/

}

printf("sort sucess!!!\n"); /*排序成功*/

return h; /*返回頭指針*/

}

/*計算總分和均值*/

void computer(STUDENT *h)

{

STUDENT *p; /*定義移動指針*/

int i=0; /*保存記錄條數初值為0*/

long s=0; /*總分初值為0*/

float average=0; /*均分初值為0*/

p=h; /*從頭指針開始*/

while(p!=NULL) /*當p不為空時處理*/

{

s+=p->sum; /*累加總分*/

i++; /*統計記錄條數*/

p=p->next; /*指針後移*/

}

average=(float)s/i;/* 求均分,均分為浮點數,總分為整數,所以做類型轉換*/

printf("\n--All students sum score is:%ld average is %5.2f\n",s,average);

}

/*索引*/

STUDENT *index(STUDENT *h)

{

STUDENT *p,*q,*t,*h1; /*定義臨時指針*/

h1=h->next; /*將原表的頭指針所指的下壹個結點作頭指針*/

h->next=NULL; /*第壹個結點為新表的頭結點*/

while(h1!=NULL) /*當原表不為空時,進行排序*/

{

t=h1; /*取原表的頭結點*/

h1=h1->next; /*原表頭結點指針後移*/

p=h; /*設定移動指針p,從頭指針開始*/

q=h; /*設定移動指針q做為p的前驅,初值為頭指針*/

while(strcmp(t->no,p->no)>0&&p!=NULL) /*作學號比較*/

{

q=p; /*待排序點值大,應往後插,所以新表指針後移*/

p=p->next;

}

if(p==q) /*p==q,說明待排序點值小,應排在首位*/

{

t->next=p; /*待排序點的後繼為p*/

h=t; /*新頭結點為待排序點*/

}

else /*待排序點應插入在中間某個位置q和p之間,如p為空則是尾部*/

{

t->next=p; /*t的後繼是p*/

q->next=t; /*q的後繼是t*/

}

}

printf("index sucess!!!\n"); /*索引排序成功*/

return h; /*返回頭指針*/

}

/*分類合計*/

void total(STUDENT *h)

{

STUDENT *p,*q; /*定義臨時指針變量*/

char sno[9],qno[9],*ptr; /*保存班級號的*/

float s1,ave; /*保存總分和均分*/

int i; /*保存班級人數*/

clrscr(); /*清屏*/

printf("\n\n *******************Total*****************\n");

printf("---class---------sum--------------average----\n");

p=h; /*從頭指針開始*/

while(p!=NULL) /*當p不為空時做下面的處理*/

{

memcpy(sno,p->no,8); /*從學號中取出班級號*/

sno[8]='\0'; /*做字符串結束標記*/

q=p->next; /*將指針指向待比較的記錄*/

s1=p->sum; /*當前班級的總分初值為該班級的第壹條記錄總分*/

ave=p->average; /*當前班級的均分初值為該班級的第壹條記錄均分*/

i=1; /*統計當前班級人數*/

while(q!=NULL) /*內循環開始*/

{

memcpy(qno,q->no,8); /*讀取班級號*/

qno[8]='\0'; /*做字符串結束標記*/

if(strcmp(qno,sno)==0) /*比較班級號*/

{

s1+=q->sum; /*累加總分*/

ave+=q->average; /*累加均分*/

i++; /*累加班級人數*/

q=q->next; /*指針指向下壹條記錄*/

}

else

break; /*不是壹個班級的結束本次內循環*/

}

printf("%s %10.2f %5.2f\n",sno,s1,ave/i);

if(q==NULL)

break; /*如果當前指針為空,外循環結束,程序結束*/

else

p=q; /*否則,將當前記錄作為新的班級的第壹條記錄開始新的比較*/

}

printf("---------------------------------------------

  • 上一篇:防溺水征文
  • 下一篇:機器人的來歷
  • copyright 2024編程學習大全網