黑马程序员技术交流社区

标题: 为什么程序执行一次后,再次执行就卡住啦 [打印本页]

作者: 81516741    时间: 2015-8-20 15:16
标题: 为什么程序执行一次后,再次执行就卡住啦
//
//  main.c
//  10.通讯录的实现
//
//  Created by mac on 15/8/20.
//  Copyright (c) 2015年 zeng. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#define NAMELEN 22
#define TELNO 12
#define N 100
//定义person结构体
typedef struct{
    char name[NAMELEN];
    char tel[TELNO];
} Person;
//记录联系人个数和人编号
int contactCount = 0,fno = 0;
//创建文件的名称,这样便于修改
char *filePath = "dadada.data";
//用宏定义方便修改
Person person[N];
void doAdd();
void doDelete();
void doUpdate();
void doSearch();
void doList();
void doWrite();
void doInit();
int verify(int,int,int);


int main(int argc, const char * argv[]) {
    //初始化
    doInit();
    int flag = 1;
    printf("请输入你的选择\n");
    while (flag) {
        printf("**************************\n");
        printf("****** 欢迎使用通讯录 ******\n");
        printf("****** 1、添加联系人  ******\n");
        printf("****** 2、删除联系人  ******\n");
        printf("****** 3、修改联系人  ******\n");
        printf("****** 4、查看所有联系人 ****\n");
        printf("****** 5、搜索联系人  ******\n");
        printf("****** 6、退出系统    ******\n");
        printf("**************************\n\n");
        //定义变量接受用户输入的选择
        int no = 0;
        //接受非数字字符
        getchar();
         printf("请再次输入你的选择\n");
        //键盘输入no的值
        scanf("%d",&no);
        //功能选择
        switch (no) {
            case 1:
                doAdd();
                break;
            case 2:
                doDelete();
                break;
            case 3:
                doUpdate();
                break;
            case 4:
               doList();
                break;
            case 5:
                doSearch();
                break;
            case 6:
                printf("您正在推出程序...\n");
                return 0;
               
            default:
                break;
        }

    }
    return 0;
}
/**
*  删除联系人
*/
void doDelete(){
    int pno;
    FILE *fp = fopen(filePath, "w");
    if (fp != NULL) {
        if(contactCount !=0) {
        
            doList();
            printf("请输入要删除人的编号\n");
            scanf("%d",&pno);
            while (!(verify(pno, 1, contactCount))) {
                printf("请输入要修改人的编号\n");
                scanf("%d",&pno);
            }
            for (int i = pno; i < contactCount; i++) {
                person[pno-1] = person[pno];
            }
            contactCount--;
            doWrite();
        
        }
    }
    fclose(fp);
   
}
/**
*  更新联系人
*/
void doUpdate(){
    FILE *fp = fopen(filePath, "w");
    if (fp != NULL) {
        if (contactCount != 0) {
            int flag1,pno;
            printf("修改姓名请按1\n修改号码请按2\n全部修改请按3\n");
            scanf("%d",&flag1);
            while (!(verify(flag1, 1, 3))) {
                printf("操作有误,修改姓名请按1\n修改号码请按2\n全部修改请按3\n");
                scanf("%d",&flag1);
            }
            doList();
            printf("请输入要修改人的编号\n");
            scanf("%d",&pno);
            while (!(verify(pno, 1, contactCount))) {
                printf("无此编号,请重新输入要修改人的编号\n");
                scanf("%d",&pno);
            }
            switch (flag1) {
                case 1:
                    printf("请输入新的姓名\n");
                    scanf("%s",person[pno-1].name);
                    doWrite();
                    break;
                case 2:
                    printf("请输入新的号码\n");
                    scanf("%s",person[pno-1].tel);
                    doWrite();
                    break;
                case 3:
                    printf("请输入新的姓名\n");
                    scanf("%s",person[pno-1].name);
                    printf("请输入新的号码\n");
                    scanf("%s",person[pno-1].tel);
                    doWrite();
                    break;
                default:
                    break;
            }
        }
    }
    fclose(fp);
}
/**
*  增加联系人
*/
void doAdd(){
    FILE *fp = fopen(filePath, "w");
    if (fp != NULL) {
        printf("请输入姓名\n");
        scanf("%s",person[contactCount].name);
        printf("请输入电话\n");
        scanf("%s",person[contactCount].tel);
        contactCount++;
        doWrite();
    }
    fclose(fp);
}
/**
*  按姓名查找人
*/
void doSearch(){

    FILE *fp = fopen(filePath, "r");
    if (fp != NULL) {
        printf("请输入你需要查找人的姓名\n");
        char goal[NAMELEN];
        fgets(goal, NAMELEN, stdin);
        int i = 0;
        for (; i < contactCount; i++) {
            if (!(strcmp(goal, person[i].name))) {
                printf("姓名:%s 电话:%s",person[i].name,person[i].tel);
                break;
            }
        }
        if (i == contactCount) {
            printf("这个人你查不到\n");
        }
    }
    fclose(fp);
}
/**
*  显示所有人
*/

void doList(){
    FILE *fp = fopen(filePath, "r");
    if (fp != NULL) {
        printf("编号\t姓名\t电话\t\n");
        for ( int i = 0; i < contactCount; i++) {
             printf("%d\t%s\t%s\t\n",i+1,person[i].name,person[i].tel);
        }
    }
    fclose(fp);
}



/**
*  初始化
*/
void doInit(){
    FILE *fp = fopen(filePath, "r");
    if (fp != NULL) {
        fread(&contactCount, sizeof(contactCount), 1, fp);
        printf("%d\n",contactCount);
        for (int i = 0; i < contactCount; i++) {
            fread(&person[i], sizeof(Person), 1, fp);
            
        }
    }else {
        fp = fopen(filePath, "wb");
        if (fp != NULL) {
            fwrite(&contactCount, sizeof(contactCount), 1, fp);
        }

    }
    fclose(fp);
   
}

/**
*  将person中的数据写入文件
*/
void doWrite(){
    FILE *fp = fopen(filePath, "w");
    if (fp != NULL) {
        for (int i = 0; i < contactCount; i++) {
            
            fwrite(&person[i], sizeof(Person), 1, fp);
        }
    }
    fclose(fp);
}
/**
*  判定只是否合法
*
*  @param useNo 用户输入的值
*  @param min   合法最小的值
*  @param max   合法最大的值
*
*  @return ;

*/
int verify(int useNo,int min,int max){
    if (useNo > max || useNo < min) {
        return 0;
    }
    return  1;
}

作者: tangbinbin    时间: 2015-8-20 15:51
你在上基础班吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2