C语言通讯录电话本(数组实现,精简版)

目录

代码展示

2021/9/20 22:45        第一次更新 

2021/9/25 17:30        第二次更新

2021/9/26 18:11        第三次更新(最终版)

效果展示

主界面

查看联系人 

添加联系人

修改联系人 

删除联系人

结束界面

检验结果


代码展示

2021/9/20 22:45        第一次更新 

  • 发现问题:如果输入字符,会一直重复弹出菜单和“错误指令”。
  • 问题原因:输入字符,scanf("%d",option); 读不到输入缓冲区内容。因为option默认初始化为0,后续的switch中,0对应了“错误指令”。进入死循环。
  • 进入死循环的原因: 当 scanf()变换失败的时候(比如,尽管你指定了%d,但是输入的却是英文字符),scanf()会将导致失败的部分遗留在流中。——《征服C指针》
  • 解决方案:在输出“错误指令”后,用 fflush(stdin); 清除输入缓冲区。
#include
#include 
void menu();
void select();

int main(){	
	int option;	
		
	do{
		menu();
		scanf("%d",&option);
		switch(option){
		case 1:
			select();
			break;
		case 2:
			printf("添加\n");
			break;
		case 3:
			printf("修改\n");
			break;
		case 4:
			printf("删除\n");
			break;
		case 5:
			printf("查询\n");
			break;
		case 6:
			printf("退出\n");
			break;
		default:
			printf("错误指令\n");
            fflush(stdin);        //   这里避免进入死循环输出"错误指令"
		}		
	}while(option != 6);
	
	
	return 0;
}


void menu(){
	printf("\n\n\n\n");
	printf("\t\t\t\t-----------电话本-----------\n");
	printf("\t\t\t\t*******查看 联系人(1)*******\n");
	printf("\t\t\t\t*******添加 联系人(2)*******\n");
	printf("\t\t\t\t*******修改 联系人(3)*******\n");
	printf("\t\t\t\t*******删除 联系人(4)*******\n");
	printf("\t\t\t\t*******查询 联系人(5)*******\n");
	printf("\t\t\t\t*******退 出 程 序(6)*******\n");
	printf("\n\n\n\n");
} 

void select(){
	system("cls");
	fflush(stdin);
	
	printf("查看\n");
	system("pause");
	
	system("cls");
	fflush(stdin);	
} 

2021/9/25 17:30        第二次更新

  • 写了个Demo,结构体数组来存储数据。完成了简单的 增删改查、文件读写。
  • 文件读写部分代码参考:C语言文件读写(结构体文件)_weixin_34258078的博客-CSDN博客
#include
#include
#include 
#include 
#define Len 5

int n = 0; 	//	有几行数据 

typedef struct node{
	char name[20];
	int num;
}Node;

void show(Node a[],int len);	//	展示数组 
void intailize(Node a[],int len);	//	数组初始化 
void add(Node a[],int len);	// 添加 
void del(Node a[],int len);//	删除 
void mod(Node a[],int len);//	修改 
void sea(Node a[],int len);//	查找 
void Write(Node nodes[],int len);	//	写文件 
void Read(Node nodes[]);	//	读文件 

int main(){
	//	定义数组,初始化 
	Node a[Len];
	intailize(a,Len);
	Read(a);
    //	//录入信息 
    //	for(int i = 0; i < Len - 1;i++){
    //		add(a,Len);
    //	}
	
	
	show(a,Len);
	//Write(a,Len); 

	return 0;
}


void Write(Node nodes[],int len){	//	写文件 
  // 定义一个文件指针
  FILE *fp ;
  
  // 打开文件,没有文件自动创建
  fp = fopen("node.dat","wb"); // b:表示以二进制写入
  // 写入数据
  fwrite( (char*)nodes,sizeof(Node),len,fp); // len:表示将数组中len行写入文件
  fclose(fp);

}

void Read(Node nodes[]){	//	读文件 
  // 定义一个文件指针
  FILE *fp ;
  // 定义一个buf结构体,用于得到文件内容
  struct stat buf;

  // 求文件中的行数(用全局变量n收取)
  stat("node.dat",&buf);
  n = buf.st_size/sizeof(Node);

  // 打开文件
  fp = fopen("node.dat","rb");
  // 读取数据到数组中
  fread((char *)nodes,sizeof(Node),n,fp);
  // 关闭文件
  fclose(fp);

  // 遍历数组,打印数据信息
  for(int i=0;i

C语言通讯录电话本(数组实现,精简版)_第1张图片

2021/9/26 18:11        第三次更新(最终版)

  • 用结构体数组存储信息(存储上限为1000)
  • 联系人结构体含:姓名、性别、电话号码 三个变量。
  • 可以进行基本的增删改查操作。
  • 启动程序会自动读取文件,退出后会自动保存文件。
  • 没有输入的容错。
#include
#include
#include
#include
#define LEN 1000

int n = 0;	//	数据有效行数 

typedef struct person{	
	char name[20];	//	姓名 
	char sex[20];	//	性别 
	char num[20];	//	手机号		 
}Person; 

void menu();//	主界面 
void select(Person person[]);//	查看联系人 
void add(Person person[]);//	添加联系人 
void mod(Person person[]);//	修改联系人 
void del(Person person[]);//	删除联系人 
void sea(Person person[]);//	查询联系人 
void Read(Person person[]);//	读文件 
void Write(Person person[],int len);//	写文件 
void intailize(Person person[],int len);//	初始化
void thanks();//	结束界面 

int main(){
	system("color e1");	//	更换背景、文字颜色 
	
	int option;	
	Person person[LEN];
	intailize(person,LEN);	//	初始化数组 
	Read(person);		//	程序启动时自动读取文件,Read中会读取行数赋值给 n 
	 
	do{
		menu();
		scanf("%d",&option);
		switch(option){
		case 1:
			select(person);
			break;
		case 2:
			add(person);
			break;
		case 3:
			mod(person);
			break;
		case 4:
			del(person);
			break;
		case 5:
			sea(person);
			break;
		case 6:
			Write(person,n);	//	退出时自动保存
			system("pause");
			thanks(); 
			break;
		default:
			system("cls");
			fflush(stdin);
		}		
	}while(option != 6);
	
	return 0;
}

void menu(){
	printf("\n\n\n\n");
	printf("\t\t\t\t-----------电话本-----------\n");
	printf("\t\t\t\t*******查看 联系人(1)*******\n");
	printf("\t\t\t\t*******添加 联系人(2)*******\n");
	printf("\t\t\t\t*******修改 联系人(3)*******\n");
	printf("\t\t\t\t*******删除 联系人(4)*******\n");
	printf("\t\t\t\t*******查询 联系人(5)*******\n");
	printf("\t\t\t\t*******退 出 程 序(6)*******\n");
	printf("\n\n\n\n");
} 

void select(Person person[]){	//	查看 
	system("cls");
	fflush(stdin);	
	printf("\n\n\t\t\t\t=========通讯录名单=========\n");
	
	for(int i = 0;i < n;i++){
		printf("\t\t\t\t%s \t %s \t %s\n",person[i].name,person[i].sex,person[i].num);
	}
	
	printf("\n\n");					
	system("pause");
	system("cls");
	fflush(stdin);	
}

void add(Person person[]){		//	添加 
	system("cls");
	fflush(stdin);
	printf("★添加联系人★\n\n");
	
	printf("请按此格式添加信息(每条信息以一个空格隔开):\n例:小明 男 11648618462\n\n");	
	scanf("%s %s %s",&person[n].name,&person[n].sex,&person[n].num);
	n++;	// 先输入,再 n++ 
	
	system("pause");
	system("cls");
	fflush(stdin);
}

void mod(Person person[]){	//修改 
	system("cls");
	fflush(stdin);
	printf("★修改联系人★\n\n");
	
	printf("输入修改联系人的人名:");
	char name[20];
	scanf("%s",name); 
	for(int i =0;i < n; i++){
		int cmp = strcmp(person[i].name,name);
		if(cmp == 0){
			printf("输入修改信息(0人名)(1性别)(2号码):"); 
			int choose;
			scanf("%d",&choose);
			printf("修改后的结果:");
			switch(choose){
				case 0:
					char tempName[20];
					scanf("%s",tempName);
					strcpy(person[i].name,tempName);
					break;
				case 1:
					char tempSex[20];
					scanf("%s",tempSex);
					strcpy(person[i].sex,tempSex);
					break;
				case 2:
					char tempNum[20];
					scanf("%s",tempNum);
					strcpy(person[i].num,tempNum);
					break;
			}			
			printf("修改第 %i 条数据!\n",i+1);
		}
	}
	
	system("pause");
	system("cls");
	fflush(stdin);
}

void del(Person person[]){	//	删除 
	system("cls");
	fflush(stdin);
	printf("★删除联系人★\n\n");
	
	printf("输入删除联系人的人名:");
	char name[20];
	scanf("%s",name); 
	for(int i =0;i < n; i++){
		int cmp = strcmp(person[i].name,name);
		if(cmp == 0){
			for(int j =i; j < n-1;j++){
				person[j] = person[j+1];
			}						
			n--;
			printf("删除第 %i 条数据!\n",i+1);
		}
	}
	
	system("pause");
	system("cls");
	fflush(stdin);
}

void sea(Person person[]){		//	查询 
	system("cls");
	fflush(stdin);
	printf("★查询联系人★\n\n");
	
	printf("输入要查找联系人的人名:");
	char name[20];
	scanf("%s",name);
	for(int i =0;i < n; i++){
		int cmp = strcmp(person[i].name,name);
		if(cmp == 0){
			printf(" 姓名:%s\n 性别:%s\n 电话号码:%s\n",person[i].name,person[i].sex,person[i].num);
		}
	}
	
	system("pause");
	system("cls");
	fflush(stdin);
}

void Read(Person person[]){	//	读文件 
  FILE *fp ;
  
  struct stat buf;// 定义一个buf结构体,用于得到文件内容

  stat("person.dat",&buf);
  n = buf.st_size/sizeof(Person);  // 求文件中的行数(用全局变量n收取)

  fp = fopen("person.dat","rb"); 
  fread((char *)person,sizeof(Person),n,fp);// 读取数据到数组中
  fclose(fp);
	printf("\n\n\n\n");
}

void Write(Person person[],int len){	//	写文件 
  FILE *fp ;
  
  fp = fopen("person.dat","wb");
  fwrite( (char*)person,sizeof(Person),len,fp); // len:表示将数组中len行写入文件
  fclose(fp);
  
  printf("保存成功!");
}

void intailize(Person person[],int len){	//	初始化 
	for(int i = 0;i < len; i++){
		strcpy(person[i].name,"未录入");
		strcpy(person[i].sex,"未录入");
		strcpy(person[i].num,"未录入");
	}
}

void thanks(){	//	结束界面 
	system("cls");
	printf("\n感谢使用!\n");
	printf("\n                                                     *\n");
    printf("                                                *  ***  ****\n");
    printf("                                              *** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                              **** ******* ****\n");
    printf("                                                *************\n");
    printf("                                                    *****\n");
    printf("\n作者:Goodrain7");
} 

效果展示

主界面

C语言通讯录电话本(数组实现,精简版)_第2张图片

查看联系人 

C语言通讯录电话本(数组实现,精简版)_第3张图片

添加联系人

C语言通讯录电话本(数组实现,精简版)_第4张图片

修改联系人 

C语言通讯录电话本(数组实现,精简版)_第5张图片

删除联系人

C语言通讯录电话本(数组实现,精简版)_第6张图片

结束界面

C语言通讯录电话本(数组实现,精简版)_第7张图片

检验结果

C语言通讯录电话本(数组实现,精简版)_第8张图片

你可能感兴趣的:(C语言,c语言)