首頁 > 軟體

C語言實現簡易通訊錄完整流程

2022-02-11 13:01:28

目標:通訊錄可以存放1000個人資訊,人的資訊:性別名字年齡電話住址 選單列印

1.增加聯絡人

2.刪除聯絡人

3.查詢聯絡人(修改)

4.名字排序聯絡人

5.展示

6.清空

分析:

首先通訊錄存放聯絡人資訊,還需知曉聯絡人個數,因此是個結構體型別

其次人的資訊型別多,因此每個聯絡人也應為結構體型別

說明:

每個標題下展示的程式碼順序:test.c (主函數測試執行)  ->  contact.h  (功能函數宣告) ->  contact.c  (功能函數實現)

選單列印:

void menu()
{
	printf("***************************n");
	printf("***  1.add    2.del     ***n");
	printf("***  3.serch  (modify)  ***n");
	printf("***  4.sort   5.show    ***n");
	printf("***  0.exit   6.clear   ***n");
	printf("***************************n");
}
 
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇->");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			//增加資訊
			break;
		case 2:
			//刪除
			break;
		case 3:
			//查詢(修改)
			break;
		case 4:
            //按名字排序
			break;
		case 5:
			//顯示聯絡人資訊
			break;
		case 6:
			//清空聯絡人
			break;
		case 0:
			//退出通訊錄
			break;
		dafault:
			break;
		}
	} while (input);
}

列舉優化:

上述選單可以用列舉對程式碼可讀性進行優化,改進如下:

enum Oprion
{
	Exit,
	Add,
	Del,
	Serch,
	Sort,
	Show,
	Clear
};
 
void menu()
{
	printf("***************************n");
	printf("***  1.add    2.del     ***n");
	printf("***  3.serch  (modify)  ***n");
	printf("***  4.sort   5.show    ***n");
	printf("***  0.exit   6.clear   ***n");
	printf("***************************n");
}
 
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇->");
		scanf("%d",&input);
		switch (input)
		{
		case Add:
			//增加資訊
			break;
		case Del:
			//刪除
			break;
		case Serch:
			//查詢(修改)
			break;
		case Sort:
            //按名字排序
			break;
		case Show:
			//顯示聯絡人資訊
			break;
		case Clear:
			//清空聯絡人
			break;
		case Exit:
			//退出通訊錄
			break;
		dafault:
			break;
		}
	} while (input);
}

定義結構體 

#define Max 1000
#define name_Max 20
#define sex_Max 5
#define addr_Max 30
#define phone_Max 12
 
//結構體人的資訊
typedef struct Peoinfo
{
	char name[name_Max];
	int age;
	char sex[sex_Max];
	char addr[addr_Max];
	char phone[phone_Max];
}Peoinfo;
 
//結構體通訊錄的資訊
typedef struct Contact
{
	Peoinfo data[1000]; //存放資料
	int sz;  //通訊錄中有效資訊的個數(裡面有幾個人)
}Contact;

初始化

//完善選單主函數部分
int main()
{
	int input = 0;
	Contact con;//通訊錄
	InitContact(&con);//初始化通訊錄
	do
//初始化通訊錄
void InitContact(Contact* pc);
 
 
//初始化通訊錄
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data,0,sizeof(pc->data));   //將陣列初始化為0
}

增加資訊 

	case Add:
		//增加資訊
		AddContact(&con);
		break;
 
 
//增加資訊到通訊錄
void AddContact(Contact* pc);
 
 
//增加資訊
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz==Max)
	{
		printf("通訊錄滿了,無法新增n");
		return 0;
	}
	//輸入資訊
	printf("請輸入名字:");
	scanf("%s",pc->data[pc->sz].name);  //增加的資訊應該在原有效資訊位置後,用pc->sz指向對應位置
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[pc->sz].age)); //age是個變數,注意需要取地址
	printf("請輸入性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[pc->sz].phone);
 
	pc->sz++;    //元素個數加一
	printf("新增成功n");
}

這裡要注意通訊錄已滿的情況,並且新增資訊時要注意是在原有效資訊後得地址開始新增,防止重複。

刪除資訊 

	case Del:
		//刪除
		DeletContact(&con);
		break;
 
 
//刪除
void DeletContact(Contact* pc);
 
 
int FindByname(Contact*pc, char name[])
{
	int i = 0;
	for (i = 0;i<pc->sz;i++)
	{
		if (strcmp(pc->data[i].name, name)==0)
		{
 
			return i;
		}
	}
	printf("沒找到n");
	return -1;
}
 
//刪除資訊
void DeletContact(Contact* pc)
{
	char name[name_Max];
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法刪除n");
	}
	printf("請輸入要刪除人的名字:");
	scanf("%s",name);
	//實現查詢函數
	int pos=FindByname(pc,name); //若找到返回下標,找不到則返回-1
	if (pos==-1)
	{
		printf("無此人n");
	}
	else
	{
		//刪除--要刪除元素後面的元素依次向前覆蓋
		int j = 0;
		for (j = pos;j<pc->sz-1;j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		printf("刪除成功n");
	}
}

這裡要注意一個查詢函數,輸入名字來查詢聯絡人,找到才能刪除。

查詢(修改) 

	case Serch:
		printf("請輸入要查詢人的名字:");
		scanf("%s", name);
		FindByname(&con,name);
		break;
 
 
//查詢
int FindByname(const Contact*pc, char name[]);
 
 
int FindByname(Contact*pc, char name[])
{
	int i = 0;
	for (i = 0;i<pc->sz;i++)
	{
		if (strcmp(pc->data[i].name, name)==0)
		{
			int put = 0;
			printf("%-10st%-5dt%-5st%-15st%-20sn", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
            //找到後可以將內容展現出來
			printf("找著了n請選擇是否修改:1.是   0.否n");
			scanf("%d",&put);
			if (1 == put)
			{
				Modify(pc->data,i);
			}
			return i;
		}
	}
	printf("沒找到n");
	return -1;
}

這裡我將第二項刪除功能的查詢函數進行宣告使用,並且將修改函數加入到查詢函數中,兩個功能聯合到一起,但是在使用刪除功能的時候會出現重複,這裡要注意。

修改函數如下:

//修改
void Modify(Contact* pc,int i)
{
	int bud = 0;
	do
	{
		printf("請選擇需要修改的內容n1.名字     2.年齡     3.性別     4.地址     5.電話     0.取消n請輸入:");
		scanf("%d", &bud);
		switch (bud)
		{
			char chars[30] = { 0 };
		case 1:
		{
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].name , chars);
		}
			break;
		case 2:
		{
				  int num = 0;
				  printf("請輸入內容->");
				  scanf("%d", &num);
				  pc->data[i].age = num;
		}
			break;
		case 3:
		{
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].sex , chars);
		}
			break;
		case 4:
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].addr , chars);
			break;
		case 5:
		{
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].phone , chars);
		}
			break;
		dafault:
			break;
		}
	} while (bud);
}

修改用到了字串函數strcpy

名字排序 

	case Sort:
		Sortname(&con);
		break;
 
 
//名字排序
void Sortname(Contact* pc);
 
 
//name排序
int cmp_int(const void*e1,const void*e2)
{
	return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name));
}
 
void Sortname(Contact* pc)
{
	qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int);
	ShowContact(pc);
}

按名字排序這裡,我用到了快速排序qsort函數來進行。排序後呼叫展示函數進行列印,來觀察排序效果。

展示資訊 

	case Show:
		//顯示
		ShowContact(&con);
		break;
 
 
//展示資訊
void ShowContact(const Contact* pc);
 
 
//展示資訊
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	for (i = 0;i < pc->sz;i++)
	{
		printf("%-10st%-5dt%-5st%-15st%-20sn", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
		//加負號左對齊,加/t統一每個元素間的距離
	}
}

清空聯絡人 

	case Clear:
	    ClearContact(&con);
		break;
 
 
//清空所有聯絡人
void ClearContact(Contact* pc);
 
 
//清空所有聯絡人
void ClearContact(Contact* pc)
{
	InitContact(pc);
}

清空聯絡人,相當於再進行一遍初始化通訊錄。

標頭檔案統一在contact.h裡面包含:

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

 test.c 和 contact.c 統一參照標頭檔案 contact.h

#include "contact.h"

總程式如下

test.c

#include "contact.h"
 
enum Oprion
{
	Exit,
	Add,
	Del,
	Serch,
	Sort,
	Show,
	Clear
};
 
void menu()
{
	printf("***************************n");
	printf("***  1.add    2.del     ***n");
	printf("***  3.serch  (modify)  ***n");
	printf("***  4.sort   5.show    ***n");
	printf("***  0.exit   6.clear   ***n");
	printf("***************************n");
}
 
int main()
{
	int input = 0;
	Contact con;//通訊錄
	InitContact(&con);//初始化通訊錄
	do
	{
		char name[name_Max];
		menu();
		printf("請選擇->");
		scanf("%d",&input);
		switch (input)
		{
		case Add:
			//增加資訊
			AddContact(&con);
			break;
		case Del:
			//刪除
			DeletContact(&con);
			break;
		case Serch:
			printf("請輸入要查詢人的名字:");
			scanf("%s", name);
			FindByname(&con,name);
			break;
		//case 4:
		//	//修改
		//	Modify(&con);
		//	break;
		case Sort:
			Sortname(&con);
			break;
		case Show:
			//顯示
			ShowContact(&con);
			break;
		case Clear:
			ClearContact(&con);
			break;
		case Exit:
			printf("退出通訊錄n");
			break;
		dafault:
			break;
		}
	} while (input);
}

contact.h

//宣告
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
 
#define Max 1000
#define name_Max 20
#define sex_Max 5
#define addr_Max 30
#define phone_Max 12
 
//結構體人的資訊
typedef struct Peoinfo
{
	char name[name_Max];
	int age;
	char sex[sex_Max];
	char addr[addr_Max];
	char phone[phone_Max];
}Peoinfo;
 
//結構體通訊錄的資訊
typedef struct Contact
{
	Peoinfo data[1000]; //存放資料
	int sz;  //通訊錄中有效資訊的個數(裡面有幾個人)
}Contact;
 
//初始化通訊錄
void InitContact(Contact* pc);
 
//增加資訊到通訊錄
void AddContact(Contact* pc);
 
//展示資訊
void ShowContact(const Contact* pc);
 
//刪除
void DeletContact(Contact* pc);
 
//查詢
int FindByname(const Contact*pc, char name[]);
 
//名字排序
void Sortname(Contact* pc);
 
 
//修改
void Modify(Contact* pc, int i);
 
//清空所有聯絡人
void ClearContact(Contact* pc);

contact.c

#include "contact.h"
 
//初始化通訊錄
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data,0,sizeof(pc->data));   //將陣列初始化為0
}
 
//增加資訊
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz==Max)
	{
		printf("通訊錄滿了,無法新增n");
		return 0;
	}
	//輸入資訊
	printf("請輸入名字:");
	scanf("%s",pc->data[pc->sz].name);  //增加的資訊應該在原有效資訊位置後,用pc->sz指向對應位置
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[pc->sz].age)); //age是個變數,注意需要取地址
	printf("請輸入性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[pc->sz].phone);
 
	pc->sz++;    //元素個數加一
	printf("新增成功n");
}
 
//展示資訊
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	for (i = 0;i < pc->sz;i++)
	{
		printf("%-10st%-5dt%-5st%-15st%-20sn", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
		//加負號左對齊,加/t統一每個元素間的距離
	}
}
 
 
int FindByname(Contact*pc, char name[])
{
	int i = 0;
	for (i = 0;i<pc->sz;i++)
	{
		if (strcmp(pc->data[i].name, name)==0)
		{
			int put = 0;
			printf("%-10st%-5dt%-5st%-15st%-20sn", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
			printf("找著了n請選擇是否修改:1.是   0.否n");
			scanf("%d",&put);
			if (1 == put)
			{
				Modify(pc->data,i);
			}
			return i;
		}
	}
	printf("沒找到n");
	return -1;
}
 
//刪除資訊
void DeletContact(Contact* pc)
{
	char name[name_Max];
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法刪除n");
	}
	printf("請輸入要刪除人的名字:");
	scanf("%s",name);
	//實現查詢函數
	int pos=FindByname(pc,name); //若找到返回下標,找不到則返回-1
	if (pos==-1)
	{
		printf("無此人n");
	}
	else
	{
		//刪除--要刪除元素後面的元素依次向前覆蓋
		int j = 0;
		for (j = pos;j<pc->sz-1;j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		printf("刪除成功n");
	}
}
 
 
//name排序
int cmp_int(const void*e1,const void*e2)
{
	return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name));
}
 
void Sortname(Contact* pc)
{
	qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int);
	ShowContact(pc);
}
 
//修改
void Modify(Contact* pc,int i)
{
	int bud = 0;
	do
	{
		printf("請選擇需要修改的內容n1.名字     2.年齡     3.性別     4.地址     5.電話     0.取消n請輸入:");
		scanf("%d", &bud);
		switch (bud)
		{
			char chars[30] = { 0 };
		case 1:
		{
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].name , chars);
		}
			break;
		case 2:
		{
				  int num = 0;
				  printf("請輸入內容->");
				  scanf("%d", &num);
				  pc->data[i].age = num;
		}
			break;
		case 3:
		{
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].sex , chars);
		}
			break;
		case 4:
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].addr , chars);
			break;
		case 5:
		{
				  printf("請輸入內容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].phone , chars);
		}
			break;
		dafault:
			break;
		}
	} while (bud);
}
 
//清空所有聯絡人
void ClearContact(Contact* pc)
{
	InitContact(pc);
}

到此這篇關於C語言實現簡易通訊錄完整流程的文章就介紹到這了,更多相關C語言 簡易通訊錄內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com