c语言_通讯录(非初级版)

23 篇文章 0 订阅
19 篇文章 1 订阅

之前说写一个改良版的通讯录,一直没有时间来写,下面我就讲一下这个要怎么写,只要跟着我的思路,相信你读完一定会有所收获(大佬请忽视这句话-.-!)

涉及知识:
1.C语言_多文件编程
2.数据结构_双向链表
3.设计模式_测试驱动开发(TDD)

设计思路:我把这个项目抽象为三层来设计。
第一层:应用层,直接面向用户,一般怎么用怎么写,直接设计这个项目需要的业务流程代码,不需要关心所使用函数的具体实现,直接用就行。
第二层:实现层,这一层来具体实现应用层所用到的函数。
第三层:结构底层和工具层,这一层提供实现层的底层所用到的数据结构和工具函数。

由于处理同名同姓这种情况过于复杂,这个版本的通讯录就先不做这个处理
后面如果有机会,再做一个有界面的通讯录,到时候再处理所言情况

下面我一层一层来讲解:

第一层、应用层

#include<stdio.h>
#include<Windows.h>
#include"head.h"//第二层的头文件

int main()
{
    char option; //用char来接收选项比int型更省空间
    while (1)
    {
        Menu();//打印通讯录的菜单
        Init();//初始化通讯录
        printf("\n请选择要进行的操作:>");
        scanf("%c", &option);
        switch (option)
        {
        case '1':
            FindHuman();//查找指定联系人
            break;
        case '2':
            ChangeHuman();//修改指定联系人
            break;
        case '3':
            DeleteHuman();//删除指定联系人
            break;
        case '4':
            AddHuman();//添加指定联系人
            break;
        case '5':
            PrintHuman();//打印所有联系人
            break;
        case '6':
            Destroy();//清空通讯录
            break;
        case '7':
            return 0;//退出通讯录
        default:
            printf("输入错误,请重新选择!\n");
            break;
        }
        system("cls");//结束一次操作后清屏
    }

    return 0;
}

第二层、实现层

//head.h
#pragma once 
#include"ListTable.h"//第三层的头文件

//用宏来定义文件路径是一个技巧,方便以后修改
#define FILENAME "MailList.data"

PNode header;//将头指针设置为全局变量
FILE *fp;

void Menu();
void Init();
void FindHuman();
void ChangeHuman();
void DeleteHuman();
void AddHuman();
void PrintHuman();
void Destroy();

//head.c
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include"head.h"
#include"tools.h"//第三层的头文件

void Menu()
{
    printf("###-----------------------------###\n");
    printf("###      1.>查找指定联系人      ###\n");
    printf("###-----------------------------###\n");
    printf("###      2.>修改指定联系人      ###\n");
    printf("###-----------------------------###\n");
    printf("###      3.>删除指定联系人      ###\n");
    printf("###-----------------------------###\n");
    printf("###      4.>添加指定联系人      ###\n");
    printf("###-----------------------------###\n");
    printf("###      5.>显示所有联系人      ###\n");
    printf("###-----------------------------###\n");
    printf("###      6.>删除所有联系人      ###\n");
    printf("###-----------------------------###\n");
    printf("###      7.>退出通讯录          ###\n");
    printf("###-----------------------------###\n");
}

void Init()
{
    HumanInfo human;
    TableInit(&header);//初始化链表
    if ((fp = fopen(FILENAME, "rb+")) == NULL && (fp = fopen(FILENAME, "wb+")) == NULL){
        printf("Error on open %s file!", FILENAME);//pause
        getch();
        exit(1);
    }
    if (getFileSize(fp))
    {//如果文件不为空,则将文件内容加载到内存,用链表管理
        while (fread(&human, 1, sizeof(HumanInfo), fp))
        {
            if (TablePushBack(header, human) != 1){
                printf("初始化失败!\n");
                //用getch()接收一个无回显的空格作为暂停,以至于用户可以看见
                //“初始化失败!”这句话,下面的所有getch()用法均为此
                getch();
                exit(1);
            }
        }
    }
}

//每次写操作后需要更新文件,将链表内容重新写回文件
//否则在程序运行期间进行的更改不会影响文件的实际内容
void UpdataFile()
{
    PNode str;
    freopen(FILENAME, "wb+", fp);
    for (str = header->_next; str != header; str = str->_next)
    {
        fwrite(&(str->_human), sizeof(HumanInfo), 1, fp);
    }
    fflush(fp);
}

void FindHuman()
{
    char name[30];
    printf("\n输入要查找联系人的姓名:");
    fflush(stdin);//每次输入前都要清空输入缓冲区
    //fgets这个函数相比gets要更加安全,推荐实际中使用这个函数
    fgets(name, 30, stdin);
    PNode pos;
    if (pos = TableFind(header, name))
    {
        Print(pos);
    }
    else
    {
        printf("没有找到该联系人的信息!\n");
    }
    getch();//暂停
}

void AddHuman()
{
    HumanInfo dest;
    printf("\n输入需要添加联系人的信息\n");
    printf("姓名:");
    fflush(stdin);//清空输入缓冲区
    fgets(dest.name, 30, stdin);
    printf("性别:");
    fflush(stdin);
    fgets(dest.sex, 10, stdin);
    printf("手机号码:");
    fflush(stdin);
    fgets(dest.phonen, 15, stdin);
    printf("住址:");
    fflush(stdin);
    fgets(dest.site, 40, stdin);
    if (TablePushBack(header, dest) == 1)
    {
        printf("\n添加成功!\n");
        UpdataFile();//每次更改链表内容后,都要将更新写回文件
    }
    else
    {
        printf("\n添加失败!\n");
    }
    getch();//暂停
}

void PrintHuman()
{
    PNode str = header->_next;
    if (str != header){
        //如果通讯录不为空,则清屏。提供更好的显示效果
        system("cls");
    }
    printf("------------------\n");
    for (;str != header;str = str->_next)
    {
        Print(str);
        printf("------------------\n");
    }
    getch();//暂停
}

void ChangeHuman()
{
    char name[30] = { 0 };
    printf("\n输入需要修改的联系人的姓名:");
    fflush(stdin);
    fgets(name, 30, stdin);
    PNode pos;
    if (pos = TableFind(header, name))
    {
        printf("输入需要修改的联系人的信息\n");
        printf("姓名:");
        fflush(stdin);
        fgets(pos->_human.name, 30, stdin);
        printf("性别:");
        fflush(stdin);
        fgets(pos->_human.sex, 10, stdin);
        printf("手机号码:");
        fflush(stdin);
        fgets(pos->_human.phonen, 15, stdin);
        printf("住址:");
        fflush(stdin);
        fgets(pos->_human.site, 40, stdin);
        UpdataFile();//更新文件
        printf("修改成功!\n");
    }
    else
    {
        printf("未找到该联系人,修改失败!\n");
    }
    getch();//暂停
}

void DeleteHuman()
{
    char name[30];
    printf("\n输入需要删除联系人的姓名:");
    fflush(stdin);
    fgets(name, 30, stdin);
    PNode del;
    if (del = TableFind(header, name))
    {
        del->_pre->_next = del->_next;
        del->_next->_pre = del->_pre;
        free(del);
        UpdataFile();//更新文件
        printf("删除成功!\n");
    }
    else
    {
        printf("未找到该联系人!\n");
    }
    getch();//暂停
}

void Destroy()
{
    if (!TableIsEmpty(header))
    {
        TablePopBack(header);
    }
    UpdataFile();
    printf("销毁成功!\n");
    getch();//暂停
}

第三层、管理空间层和工具层

//tools.h
#pragma once
#include<stdio.h>
#include<Windows.h>

//获取文件大小(以字节计)
long getFileSize(FILE *fp){
    long fsize;
    fpos_t fpos;  //当前位置
    fgetpos(fp, &fpos);  //获取当前位置
    fseek(fp, 0, SEEK_END);
    fsize = ftell(fp);
    fsetpos(fp, &fpos);  //恢复之前的位置

    return fsize;
}

//ListTable.h
#pragma once

typedef struct HumanInfo
{
    char name[20];
    char sex[10];
    char phonen[15];
    char site[40];
}HumanInfo;

//用双链表来管理底层的空间
typedef struct Node
{
    HumanInfo _human;
    struct Node* _next;
    struct Node* _pre;
}Node,*PNode;

PNode BuyNewNode(HumanInfo data);
void TableInit(PNode *head);
_Bool TablePop(PNode head, PNode pos);
_Bool TablePushBack(PNode head, HumanInfo data);
_Bool TablePopBack(PNode head);
PNode TableFind(PNode head, char* name);
_Bool TableIsEmpty(PNode head);

void Print(PNode pos);

//ListTable.c
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<malloc.h>
#include"ListTable.h"

//申请节点
PNode BuyNewNode(HumanInfo data)
{
    PNode new_node = (PNode)malloc(sizeof(Node));
    new_node->_human = data;
    new_node->_pre = NULL;
    new_node->_next = NULL;
    return new_node;
}

//链表初始化
void TableInit(PNode *head)
{
    assert(head);
    HumanInfo temp = { "","","",""};
    *head = BuyNewNode(temp);
    (*head)->_pre = *head;
    (*head)->_next = *head;
}

//在链表的指定位置删除操作
_Bool TablePop(PNode head, PNode pos)
{
    assert(head);
    assert(pos);
    if (head->_next == head){
        return 0;
    }
    PNode str = head;
    while (str->_next != str)
    {
        if (str->_next == pos)
        {
            str->_next->_next->_pre = str;
            str->_next = str->_next->_next;
            free(str->_next);
            return 1;
        }
    }
    return 0;
}

//链表的尾插操作
_Bool TablePushBack(PNode head, HumanInfo data)
{
    assert(head);
    if (head->_next == head)
    {
        PNode new_node = BuyNewNode(data);
        new_node->_pre = head;
        new_node->_next = head;
        head->_next = new_node;
        head->_pre = new_node;
    }
    else
    {
        PNode new_node = BuyNewNode(data);
        new_node->_next = head;
        new_node->_pre = head->_pre;
        head->_pre->_next = new_node;
        head->_pre = new_node;
    }
    return 1;
}

//链表的尾删操作
_Bool TablePopBack(PNode head)
{
    assert(head);
    if (head->_next == head){
        return 1;
    }
    PNode temp = head->_pre;
    head->_pre = head->_pre->_pre;
    head->_pre->_pre->_next = head;
    free(temp);
    return 1;
}

//链表的节点查找操作
PNode TableFind(PNode head, char *name)
{
    assert(head);
    PNode str = head->_next;
    while ((str != head) && strcmp(str->_human.name, name) != 0)
    {
        str = str->_next;
    }
    if (head == str){
        return NULL;
    }
    else{
        return str;
    }
}

//判断链表是否为空的操作
_Bool TableIsEmpty(PNode head)
{
    return head->_pre == head;
}

//链表的节点数据打印操作
void Print(PNode pos)
{
    printf("姓名:%s\n", pos->_human.name);
    printf("性别:%s\n", pos->_human.sex);
    printf("电话:%s\n", pos->_human.phonen);
    printf("住址:%s\n",pos->_human.site );
}

//运行结果示例
主界面
主界面
添加联系人
添加联系人

查找操作
Find

修改操作

修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言编写的通讯录管理程序设计 #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define HEADER1"------------------------------------------MESSAGE MENU--------------------------------------------------------------\n" #define HEADER2" | num | name | phonenumber | address |\n" #define HEADER3" |-------------------------------------------------------------------|\n" #define FORMAT " | %-10s %-10s %-15s %-20s |\n" #define DATA p->num,p->name,p->phonenum,p->address #define END " ------------------------------------------------------------------------------------------------------------------\n" #define N 100 int saveflag=0; /*是否需要存盘的标志变量*/ typedef struct record /*标记为record*/ { char num[4]; /*编号*/ char name[10]; /*姓名*/ char phonenum[15]; /*电话*/ char address[20]; /*地址*/ } RECORD; RECORD tele[N]; void menu(); void Disp(); void Qur(); void Modify(); void SelectSort(); void Wrong(); void Save(); void main() { RECORD tele[N]; /*定义RECOED结构体*/ FILE *fp; /*文件指针*/ int select; /*保持内选择结果变量*/ char ch; /*保存y,Y,n,N*/ int count=0; /*保存文件中的记录条数(或元素个数)*/ fp=fopen("C:\\record.txt","a+"); /*以追加方式打开文本文件c;\record,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) { printf("\n=>Can not open file!\n"); exit(0); } while(!feof(fp)) { if(fread(&tele[count],sizeof(RECORD),1,fp)==1) /*一次从文件中读取一条通讯记录*/ count++; } fclose(fp); /*关闭文件*/ printf("\n=>Open file success,the total records number is:%d.\n",count); getchar(); menu(); while(1) { system("cls"); menu(); cprintf("\n Please input your choice(0-8):"); /*显示提示信息*/ ch=getch(); if(ch=='0') { if(saveflag==1) /*若对数组的数据有修且未进行存盘操作,则此标志为1*/ { getchar(); printf("\n==>Whether save the modified record to file?(y/n):"); scanf("%c",&ch); if(ch=='y'||ch=='Y') Save(tele,count); } printf("\n=>Thank you for useness!"); getchar(); break ; } switch(ch) { case'0':break; case'1':count=Add(tele,count);break; /*增加通讯记录*/ case'2':system("cls");Disp(tele,count);break; /*显示通讯记录*/ case'3':count=Del(tele,count) ;break; /*删除通讯记录*/ case'4':Qur(tele,count);break; /*查询通讯记录*/ case'5':Modify(tele,count);break; /*修改通讯记录*/ case'6':count=Insert(tele,count);break; /*插入通讯记录*/ case'7':SelectSort(tele,count);break;/*排序通讯记录*/ case'8':Save(tele,count);break; /*保存通讯记录*/ default: Wrong();getchar();break; /*按键有误,必需为0~8*/ } } } void menu() { system("cls"); /*调用DOS命令清屏,与clrscr()功能相同*/ textcolor(63); /*在文本模式中选择新的字符颜色*/ gotoxy(10,5); /*在文本窗口中设置光标*/ printf(" The communication management system\n"); gotoxy(10,8); printf(" ****Menu**** \n"); gotoxy(10,9); printf("\n"); gotoxy(10,10); printf("\* 1. Add record\n"); /*增加*/ gotoxy(10,11); printf("\* 2. Display record\n"); /*展览*/ gotoxy(10,12); printf("\* 3. Delete record\n"); /*删除*/ gotoxy(10,13); printf("\* 4. Search record\n"); /*查找*/ gotoxy(10,14); printf("\* 5. Modify record\n"); /*更改*/ gotoxy(10,15); printf("\* 6. Insert record\n"); /*插入*/ gotoxy(10,16); printf("\* 7. Sort record\n"); /*整理*/ gotoxy(10,17); printf("\* 8. Save record\n"); /*保存*/ gotoxy(10,18); printf("\* 0 Quit system\n"); /*退出*/ gotoxy(10,19); printf(" ************ \n"); /*cprintf()送格式话输出至文本窗口屏幕中*/ } /*格式化输出表头*/ void printheader() { printf(HEADER1); printf(HEADER2); printf(HEADER3); } /*格式化输出表中数据*/ void printdata(RECORD q) { RECORD *p; p=&q; printf(FORMAT,DATA); } void Disp( RECORD temp[],int n) /*显示数组temp[]中存储的通讯记录,内容为record结构中定义的内容*/ { int i; if(n==0) /*表示没有通讯记录*/ { printf("\n=>No menu record!\n"); getchar(); return ; } printf("\n\n"); printheader(); /*输出表格头部*/ i=0; while(i<n) /*逐条输出数组中存储的通讯记录*/ { printdata(temp[i]); i++; printf(HEADER3); } getchar(); } void Wrong() /*输出按键错误信息*/ { printf("\n\n\n\n\n**********Error:input has wrong! press any key to continue***********\n"); getchar(); } void Nofind() /*输出未查找到此记录的信息*/ { printf("\n=>Not find this menu record!\n"); } int Locate(RECORD temp[],int n,char findmess[],char nameorphonenum[]) { int i=0; if(strcmp(nameorphonenum,"phonenum")==0) /*按电话号码查询*/ { while(i<n) { if(strcmp(temp[i].phonenum,findmess)==0) /*若找到findmess值的电话号码*/ return i; i++; } } else if(strcmp(nameorphonenum,"name")==0) /*按姓名查询*/ { while(i<n) { if(strcmp(temp[i].name,findmess)==0) /*若找到findmess值的姓名*/ return i; i++; } } return -1; /*若未找到,返回一个整数-1*/ } void stringinput(char *t,int lens,char *notice) { char n[255]; do { printf(notice); /*显示提示信息*/ scanf("%s",n); /*输入字符串*/ if(strlen(n)>lens) printf("\n Exceed the required length! \n"); /*进行长度检测,超过lens值重新输入*/ } while(strlen(n)>lens); strcpy(t,n); /*将输入发字符串拷贝到字符串t中*/ } int Add(RECORD temp[],int n) /*增加通讯记录*/ { char ch,num[10]; int i,flag=0; system("cls"); Disp(temp,n); /*先打印出已有的通讯录信息*/ while(1) /*一次可输入多条记录,直至输入编号为0的记录才结束添加操作*/ { while(1) /*输入记录编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/ { stringinput(num,10,"Input number(press '0' return menu):"); /*格式化输入编号并检验*/ flag=0; if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/ { return n; } i=0; while(i<n) /*产寻该编号是否已经存在,若存在则要求重新输入一个未被占用的编号*/ { if(strcmp(temp[i].num,num)==0) { flag=1; break; } i++; } if(flag==1) /*提示拥护是否重新输入*/ { getchar(); printf("==>The number %s is existing,try again?(y/n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else return n; } else {break;} } strcpy(temp[n].num,num); /*将字符串num拷贝到temp[n].num中*/ stringinput(temp[n].name,15,"Name:\n"); stringinput(temp[n].phonenum,15,"Telephone:\n"); stringinput(temp[n].address,15,"Address:\n"); saveflag=1; n++; } return n; } void Qur(RECORD temp[],int n) /*按编号或姓名查询通讯记录*/ { int select; /*按1:按姓名查,2:按电话号码查,其他:返回住界面(菜单)*/ char searchinput[20]; /*包寻用户输入的查询内容*/ int p=0; if(n<=0) /*若数组为空*/ { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("\n =>1 Search by name =>2 Search by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按姓名查询*/ { stringinput(searchinput,10,"Input the existing name:"); p=Locate(temp,n,searchinput,"name"); /*在数组temp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/ if(p!=-1) /*若找到该记录*/ { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else if(select==2) /*按电话号码查询*/ { stringinput(searchinput,15,"Input the existing telephone number:"); p=Locate(temp,n,searchinput,"phonenum"); if(p!=-1) { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else Wrong(); getchar(); } int Del(RECORD temp[],int n) { int sel; char findmess[20]; int p=0,i=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return n; } system("cls"); Disp(temp,n); printf("\n =>1 Delete by name =>2 Delete by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&sel); if(sel==1) { stringinput(findmess,10,"Input the existing name:"); p=Locate(temp,n,findmess,"name"); getchar(); if(p!=-1) { for(i=p+1;i<n;i++) /*删除此记录,后面记录向前移*/ { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf("\n=>Delete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } else if(sel==2) /*先按电话号码查询到该记录所在的数组元素的下标值*/ { stringinput(findmess,15,"Input the existing telephone number:"); p=Locate(temp,n,findmess,"phonenum"); getchar(); if(p!=-1) { for(i=p+1;i<n;i++) /*删除此记录,后面的记录向前移*/ { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf("\n=>Delete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } return n; } void Modify(RECORD temp[],int n) { char findmess[20]; int p=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("modify menu book recorder"); Disp(temp,n); stringinput(findmess,10,"Input the existing name:"); /*输入并检验该姓名*/ p=Locate(temp,n,findmess,"name"); /*查询到该数组元素,并返回下标值*/ if(p!=-1) /*若p!=-1,表明已经找到该数组元素*/ { printf("Number:%s,\n",temp[p].num); printf("Name:%s,",temp[p].name); stringinput(temp[p].name,15,"Input new name:"); printf("Name:%s,",temp[p].phonenum); stringinput(temp[p].name,15,"Input new telephone:"); printf("Name:%s,",temp[p].address); stringinput(temp[p].address,30,"Input new address:"); printf("\n=>modify success!\n");getchar(); Disp(temp,n); getchar();saveflag=1; } else { Nofind(); getchar(); } return ; } int Insert(RECORD temp[],int n) { char ch,num[10],s[10]; /*s[]保存插入点位置之前的记录编号,num[]保存输入的新记录的编号*/ RECORD newinfo; int flag=0,i=0,m=0; system("cls"); Disp(temp,n); while(1) { stringinput(s,10,"Please input insert location after the Number:"); flag=0;i=0; while(i<n) /*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(temp[i].num,s)==0) { m=i; flag=1; break; } i++; } if(flag==1) break; /*若编号存在,则进行插之前的新记录输入操作*/ else { getchar(); printf("\n=>The number is not existing,try again?(y\n):",s); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } } /*以下新记录的输入操作与Add()相同*/ while(1) { stringinput(num,10,"Input new Number:"); flag=0;i=0; while(i<n) /*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(temp[i].num,num)==0) { flag=1; break; } i++; } if(flag==1) { getchar(); printf("\n=>Sorry,The number %s is existing,try again?(y\n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } else break; } strcpy(newinfo.num,num); /*将字符串num拷贝到newinfo.num中*/ stringinput(newinfo.name,15,"Name:"); stringinput(newinfo.phonenum,15,"Telephone:"); stringinput(newinfo.address,15,"Address:"); saveflag=1; /*在main()中有对该全局变量的判断,若为1,则进行存盘操作*/ for(i=n-1;i>m;i--) /*从最后一个组织元素开始往前移一个元素位置*/ { strcpy(temp[i+1].num,temp[i].num); strcpy(temp[i+1].name,temp[i].name); strcpy(temp[i+1].phonenum,temp[i].phonenum); strcpy(temp[i+1].address,temp[i].address); } strcpy(temp[m+1].num,newinfo.num); strcpy(temp[m+1].name,newinfo.name); strcpy(temp[m+1].phonenum,newinfo.phonenum); strcpy(temp[m+1].address,newinfo.address); n++; Disp(temp,n); printf("\n\n");getchar(); return n; } void SelectSort(RECORD temp[],int n) { int i=0,j=0,flag=0,indexmin,select; char charflag[10]; RECORD newinfo; if(n<=0) { system("cls"); printf("\n=>Not record!\n"); getchar(); return ; } system("cls"); Disp(temp,n); /*显示排序前的所有记录*/ printf("\n =>1 SORT by num =>2 SORT by another way \n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按记录编号排序*/ { for(i=0;i<n-1;i++) { flag=32767; indexmin=0; for(j=i;j<n;j++) { if(atoi(temp[j].num)<flag) { flag=atoi(temp[j].num); indexmin=j; } } strcpy(newinfo.num,temp[i].num); /*利用结构变量nesinfo实现数组元素的交换*/ strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[i].num,temp[indexmin].num); strcpy(temp[i].name,temp[indexmin].name); strcpy(temp[i].phonenum,temp[indexmin].phonenum); strcpy(temp[i].address,temp[indexmin].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } Disp(temp,n); /*显示排序后的所有记录*/ saveflag=1; printf("\n=>Sort complete!\n");getchar(); return; } else if(select==2) { for(i=0;i<n-1;i++) { charflag[0]=255; indexmin=0; strcpy(newinfo.num,temp[i].num); /*利用结构变量nesinfo实现数组元素的交换*/ strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[i].num,temp[indexmin].num); strcpy(temp[i].name,temp[indexmin].name); strcpy(temp[i].phonenum,temp[indexmin].phonenum); strcpy(temp[i].address,temp[indexmin].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } Disp(temp,n); /*显示排序后的所有记录*/ saveflag=1; printf("\n=>Sort complete!\n");getchar(); return; } else { Wrong(); getchar(); getchar(); return; } } void Save(RECORD temp[],int n) { int i=0; FILE *fp; fp=fopen("c:\\record.txt","w"); /*以只写方式打开文本文件*/ if(fp==NULL) /*打开文件失败*/ { printf("\n=>Open file error!\n"); getchar(); return; } for(i=0;i<n;i++) { if(fwrite(&temp[i],sizeof(RECORD),1,fp)==1) /*每次写一条记录或一个结构数组元素至文件*/ { continue; } else { break; } } if(i>0) { getchar(); printf("\n\n=>Save file complete,total saved's record number is:%d\n",i); getchar(); saveflag=0; } else { system("cls"); printf("The current link is empty,no menu record is saved!\n"); getchar(); } fclose(fp); /*关闭此文件*/ }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值