【C言語】アドレス帳(静的)

Xiao Zhang は、構造の学習、列挙、関連知識の組み合わせ、練習、そしてアドレス帳の作成を終えたところです。


アドレス帳の特徴

1. アドレス帳には 100 件の情報を保存できます
2. 情報の内容は、名前、性別、年齢、電話番号、住所です
3. 連絡先の追加をサポートします
4. 連絡先の削除をサポートします
5. 連絡先の検索をサポートします
6. 連絡先の変更をサポートします
7 . 連絡先の並べ替えをサポート
8. データの印刷

ファイルの種類

test.c (アドレス帳関連機能のテスト)
contanct.c (アドレス帳機能の実現)
contanct.h (宣言)

個人情報は構造体で定義される

struct peoinfo { 文字名[20];
名前
チャーセックス[5];性別
年齢;
文字電話[12];電話
文字アドレス[20];};住所

为了方便代码的可读性,我们在宏里面定义每个字符串数组的长度,修改如下

struct peoinfo { 文字名[MAX_NAME];
名前
文字 性別[MAX_SEX];性別
年齢;
文字電話[MAX_TEL];電話
文字アドレス[MAX_ADDR];住所};

宏定义如下

#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TEL 12
#define MAX_ADDR 20
#define MAX 1000

連絡先レコードの構造

typedef struct pp{ struct peoinfo arr[MAX]; int sz;}pp; typedef を使用して、操作を容易にするためにアドレス帳の構造タイプの名前を pp に変更します



ここに画像の説明を挿入

メニュー機能メニュー

void menu()
{
    
    
	printf("#######################################\n");
	printf("#*********    1.add    ***************#\n");
	printf("#*********    2.del    ***************#\n");
	printf("#*********    3.search ***************#\n");
	printf("#*********    4.modify ***************#\n");
	printf("#*********    5.sort   ***************#\n");
	printf("#*********    6.print  ****************#\n");
	printf("##########    0.exit   ################\n");

}

関数を選択 function test()

void test()
{
    
    pp pro;//定义一个通讯录
Initcontanct(&pro);//通讯录初始化,具体在下面
int input;
	do {
    
    
		menu();
		scanf_s("%d", &input);
		switch (input)
		{
    
    
		case 1:
			Addcontanct(&pro);
			break;
		case 2:
			Delcontanct(&pro);
			break;
		case 3:
			findcontanct(&pro);
			break;
		case 4:
			modifycontanct(&pro);
			break;
		case 5:
			Sortcontanct(&pro);
			break;
		case 6:
			Printcontanct(&pro);
			break;
		case 7:
			
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
}

switch ステートメントの case1、2、3、および 4 は、対応する関数には適していません。コードの読みやすさを向上させるために、列挙型 enum opion { EXIT, // その値は 0

あり 、以下は 1、2、3 の順で、4、5、6 ADD、DEL、SEARCH、MODIFY、SORT、PRINT };







test()関数の変更

void test()
{
    
    pp pro;
Initcontanct(&pro);
int input;
	do {
    
    
		menu();
		scanf_s("%d", &input);
		switch (input)
		{
    
    
		case  ADD:
			Addcontanct(&pro);
			break;
		case DEL:
			Delcontanct(&pro);
			break;
		case SEARCH:
			findcontanct(&pro);
			break;
		case MODIFY:
			modifycontanct(&pro);
			break;
		case SORT:
			Sortcontanct(&pro);
			break;
		case PRINT:
			Printcontanct(&pro);
			break;
		
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
}

アドレス帳機能の初期化

効果: ランダムな値への初期化を防ぐために、sz を 0 に初期化し、struct peoinfo arr[] を 0 に初期化します。memset 関数は、どのアドレスから始まるバイト数を必要な数に設定できます。最初のパラメータは、どのアドレスから始まりますかリセットを開始します。2 番目のパラメータは設定する内容、3 番目のパラメータは設定するバイト数、memset ヘッダー ファイル stdlib.h

void Initcontanct(pp*p)
{
    
    
	p->sz = 0;
	memset(p->arr, 0, sizeof(p->arr));
}

構造体ポインタ p はアドレス帳 &pro のアドレスを受け取ります

連絡先を追加

void Addcontanct(pp* p)
{
    
    
	if (p->sz == 1000)
	{
    
    
		printf("通讯录已经存满\n");
		return;
	}
	printf("请输入姓名\n");
	scanf("%s",p->arr[p->sz].name);
	printf("请输入性别\n");
	scanf("%s",p->arr[p->sz].sex);
	printf("请输入年龄\n");
	scanf("%d",&(p->arr[p->sz].age));
	printf("请输入电话\n");
	scanf("%s",p->arr[p->sz].tel);
	printf("请输入地址\n");
	scanf("%s",p->arr[p->sz].addr);
	p->sz++;
	printf("录入成功\n");

}

知らせAge は配列ではありません、スキャンするときにアドレス文字を取得するには & を追加する必要があります f、毎回 1 つ追加します、p->sz+1; ==1000 の場合、ストレージがいっぱいであることを意味し、リターンは直接飛び出します。追加プロセスが長くなる

印刷データ機能

void Printcontanct(pp* p)
{
    
    
	int i = 0;
	printf("******************************************************\n");
	printf("%-10s %-5s %-5s %-12s %-20s\n", "姓名","性别","年龄","电话","地址");
	printf("******************************************************\n");
	for (i = 0; i < p->sz; i++)
	{
    
    
		printf("%-10s %-5s %-5d %-12s %-20s\n", p->arr[i].name, p->arr[i].sex, p->arr[i].age, p->arr[i].tel, p->arr[i].addr);
		printf("******************************************************\n");
	}
}

知らせ: 印刷をより美しくするために、印刷は左揃えを採用し、印刷の各行 * がユーザーを区切って見栄えがよくなります。アドレス帳の各メンバーをループして印刷します。各ユーザーを印刷した後、次のことを忘れないでください。ラインを変更する

連絡先を削除する

void Delcontanct(pp* p)
{
    
    
	char name[MAX_NAME];
	printf("请输入要删除朋友的名字\n");
	scanf("%s",name);
	if (find(p, name) == -1)
	{
    
    
		printf("查无此人\n");
	}
	else
	{
    
    
		int k = find(p, name);
		for (int j = k; j < p->sz - 1; j++)
		{
    
    
			p->arr[j] = p->arr[j + 1];
		}
		p->sz--;
		printf("删除成功\n");

}
}

検索関数 find()

int find(pp* p, char name[])
{
    
    
	int i = 0;
	for (int i = 0; i < p->sz; i++)
	{
    
    
		if (!strcmp(p->arr[i].name, name))
			return i;
	}
	return -1;
}

知らせ検索関数の機能は、アドレス帳を走査することであり、そのような人がいる場合はその人の配列の添字を返し、そのような人がいない場合は -1 を返します。strcmp 比較関数を使用してヘッダー ファイル文字列を記憶します。 .h、人を削除するには、削除する名前を入力します。その人の名前を入力します。入力した名前の配列アドレスとアドレス帳のアドレスを find() 関数に渡し、find() 関数を呼び出して走査します。アドレス帳にそのような人がいない場合、find() 関数は -1 を返します。印刷してそのような人が見つかりません。そうでない場合は、 k を使用して削除するユーザーの添字を受け取り、k の添字を持つユーザーを削除します。次に、後続のものを 1 つずつ前方に移動し、1 つを削除し、対応する p->sz- -
ここに画像の説明を挿入

連絡先を探す

void findcontanct(pp* p)
{
    
    
	char name[MAX_NAME];
	if (p->sz == 0)
	{
    
    
		printf("通讯录为空\n");
		return;
	}
	printf("请输入要查找朋友的名字\n");
	scanf("%s", name);
	if (find(p, name) == -1)
	{
    
    
		printf("查无此人\n");
	}
	else
	{
    
    
		int k = find(p, name);
		printf("******************************************************\n");
		printf("%-10s %-5s %-5s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-10s %-5s %-5d %-12s %-20s\n", p->arr[k].name, p->arr[k].sex, p->arr[k].age, p->arr[k].tel, p->arr[k].addr);
		printf("******************************************************\n");
	}
}

知らせ: 検索は基本的に削除と似ています。名前を入力した後、find 関数を呼び出して対応する名前の添え字を見つけ、-1 を返します。これは見つからなかったことを意味します。添え字が返された場合、その名前に対応する情報が返されます。下付き文字が出力されます

連絡先情報を変更する

void modifycontanct(pp* p)
{
    
    
	char name[MAX_NAME];
	printf("请输入修改朋友的名字\n");
	scanf("%s", name);
	if (find(p, name) == -1)
	{
    
    
		printf("查无此人\n");
	}
	else
	{
    
    
		int k = find(p, name);
		printf("请输入要修改朋友的信息\n");
		printf("修改性别->");
		scanf("%s", p->arr[k].sex);
		printf("修改年龄->");
		scanf("%d", &(p->arr[k].age));
		printf("修改电话->");
		scanf("%s", p->arr[k].tel);
		printf("修改地址->");
		scanf("%s", p->arr[k].addr);
		printf("修改成功\n");
     }
}

知らせ連絡先情報を変更するには、引き続き find() 関数で連絡先名を検索する必要があり、find() 関数はその添字を返します。変更する場合は、添字に対応するユーザーを直接操作します。Age は配列ではないため、scanf で追加する必要があります& アドレス文字を取得します

連絡先を並べ替える (年齢順に並べ替える)

void Sortcontanct(pp* p)
{
    
    
	int i = 0;
	for (int i = 0; i < p->sz-1; i++)
	{
    
    
		for (int j = 0; j < p->sz - i-1; j++)
		{
    
    
			if (p->arr[j].age > p->arr[j + 1].age)
			{
    
    
				int tmp = p->arr[j].age;
				p->arr[j].age = p->arr[j + 1].age;
				p->arr[j + 1].age = tmp;
				char name[MAX_NAME];
				strcpy(name, p->arr[j].name);
				strcpy(p->arr[j].name, p->arr[j+1].name);
				strcpy(p->arr[j + 1].name, name);

				char sex[MAX_SEX];
				strcpy(sex, p->arr[j].sex);
				strcpy(p->arr[j].sex, p->arr[j + 1].sex);
				strcpy(p->arr[j + 1].sex, sex);

				char tel[MAX_TEL];
				strcpy(tel, p->arr[j].tel);
				strcpy(p->arr[j].tel, p->arr[j + 1].tel);
				strcpy(p->arr[j + 1].tel, tel);

				char addr[MAX_ADDR];
				strcpy(addr, p->arr[j].addr);
				strcpy(p->arr[j].addr, p->arr[j + 1].addr);
				strcpy(p->arr[j + 1].addr, tel);


             }



		}
}
	printf("按年龄排序成功,快去打印吧\n");
}

知らせバブルソートを使用して、年齢の小さい順から大きい順に並べ替えます。年齢を交換する場合は、2 人の名前、性別、電話番号、住所を交換する必要があります。文字列配列の場合は、strcpy、strcpy ヘッダー ファイル string.h、このアイデアも 3 つの数字の交換からインスピレーションを得ています。

しかし、私の前回の記事では qsort ソートについて説明しました。qsort を使用してShishan コードを拒否してソートすることもできます。

変更: 連絡先の並べ替え

int int_cmp_age(const void* p1, const void* p2)//按年龄比较
{
    
    
	return ((struct peoinfo*)p1)->age - ((struct peoinfo*)p2)->age;
}
void Sortcontanct(pp* p)
{
    
    
	qsort(p->arr, p->sz, sizeof(peoinfo), int_cmp_age);
    printf("按年龄排序成功,快去打印吧\n");
}

コード全体の表示
連絡先.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TEL 12
#define MAX_ADDR 20
#define MAX 1000
enum opion
{
    
    
	EXIT,
    ADD,
	DEL,
    SEARCH,
	MODIFY,
	SORT,
	PRINT
};
typedef struct peoinfo {
    
    
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tel[MAX_TEL];
	char addr[MAX_ADDR];

}peoinfo;

typedef struct pp{
    
    
	struct peoinfo arr[MAX];
	int sz;

}pp;
void Initcontanct(pp*p);
void Addcontanct(pp* p);
void Printcontanct(pp* p);
void Delcontanct(pp* p);
void findcontanct(pp* p);
void modifycontanct(pp* p);
void Sortcontanct(pp* p);

連絡先c

#include"contanct.h"
void Initcontanct(pp*p)
{
    
    
	p->sz = 0;
	memset(p->arr, 0, sizeof(p->arr));
}
void Addcontanct(pp* p)
{
    
    
	if (p->sz == 1000)
	{
    
    
		printf("通讯录已经存满\n");
		return;
	}
	printf("请输入姓名\n");
	scanf("%s",p->arr[p->sz].name);
	printf("请输入性别\n");
	scanf("%s",p->arr[p->sz].sex);
	printf("请输入年龄\n");
	scanf("%d",&(p->arr[p->sz].age));
	printf("请输入电话\n");
	scanf("%s",p->arr[p->sz].tel);
	printf("请输入地址\n");
	scanf("%s",p->arr[p->sz].addr);
	p->sz++;
	printf("录入成功\n");

}
void Printcontanct(pp* p)
{
    
    
	int i = 0;
	printf("******************************************************\n");
	printf("%-10s %-5s %-5s %-12s %-20s\n", "姓名","性别","年龄","电话","地址");
	printf("******************************************************\n");
	for (i = 0; i < p->sz; i++)
	{
    
    
		printf("%-10s %-5s %-5d %-12s %-20s\n", p->arr[i].name, p->arr[i].sex, p->arr[i].age, p->arr[i].tel, p->arr[i].addr);
		printf("******************************************************\n");
	}
}
int find(pp* p, char name[])
{
    
    
	int i = 0;
	for (int i = 0; i < p->sz; i++)
	{
    
    
		if (!strcmp(p->arr[i].name, name))
			return i;
	}
	return -1;
}
void Delcontanct(pp* p)
{
    
    
	char name[MAX_NAME];
	printf("请输入要删除朋友的名字\n");
	scanf("%s",name);
	if (find(p, name) == -1)
	{
    
    
		printf("查无此人\n");
	}
	else
	{
    
    
		int k = find(p, name);
		for (int j = k; j < p->sz - 1; j++)
		{
    
    
			p->arr[j] = p->arr[j + 1];
		}
		p->sz--;
		printf("删除成功\n");

}
}
void findcontanct(pp* p)
{
    
    
	char name[MAX_NAME];
	if (p->sz == 0)
	{
    
    
		printf("通讯录为空\n");
		return;
	}
	printf("请输入要查找朋友的名字\n");
	scanf("%s", name);
	if (find(p, name) == -1)
	{
    
    
		printf("查无此人\n");
	}
	else
	{
    
    
		int k = find(p, name);
		printf("******************************************************\n");
		printf("%-10s %-5s %-5s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-10s %-5s %-5d %-12s %-20s\n", p->arr[k].name, p->arr[k].sex, p->arr[k].age, p->arr[k].tel, p->arr[k].addr);
		printf("******************************************************\n");
	}
}
void modifycontanct(pp* p)
{
    
    
	char name[MAX_NAME];
	printf("请输入修改朋友的名字\n");
	scanf("%s", name);
	if (find(p, name) == -1)
	{
    
    
		printf("查无此人\n");
	}
	else
	{
    
    
		int k = find(p, name);
		printf("请输入要修改朋友的信息\n");
		printf("修改性别->");
		scanf("%s", p->arr[k].sex);
		printf("修改年龄->");
		scanf("%d", &(p->arr[k].age));
		printf("修改电话->");
		scanf("%s", p->arr[k].tel);
		printf("修改地址->");
		scanf("%s", p->arr[k].addr);
		printf("修改成功\n");
     }
}
int int_cmp_age(const void* p1, const void* p2)//按年龄比较
{
    
    
	return ((struct peoinfo*)p1)->age - ((struct peoinfo*)p2)->age;
}
void Sortcontanct(pp* p)
{
    
    
	qsort(p->arr, p->sz, sizeof(peoinfo), int_cmp_age);
    printf("按年龄排序成功,快去打印吧\n");
}

test.c

#include"contanct.h"
void menu()
{
    
    
	printf("#######################################\n");
	printf("#*********    1.add    ***************#\n");
	printf("#*********    2.del    ***************#\n");
	printf("#*********    3.search ***************#\n");
	printf("#*********    4.modify ***************#\n");
	printf("#*********    5.sort   ***************#\n");
	printf("#*********    6.print  ****************#\n");
	printf("##########    0.exit   ################\n");

}
void test()
{
    
    pp pro;
Initcontanct(&pro);
int input;
	do {
    
    
		menu();
		scanf_s("%d", &input);
		switch (input)
		{
    
    
		case  ADD:
			Addcontanct(&pro);
			break;
		case DEL:
			Delcontanct(&pro);
			break;
		case SEARCH:
			findcontanct(&pro);
			break;
		case MODIFY:
			modifycontanct(&pro);
			break;
		case SORT:
			Sortcontanct(&pro);
			break;
		case PRINT:
			Printcontanct(&pro);
			break;
		
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
}

void main()
{
    
    
	test();

}

結果表示
ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
既存の問題点を指摘していただければ、後で動的アドレス帳を共有しますので、たくさんサポートしてください、そして私の訪問はついに 2000 を突破しました、ははははは

ここに画像の説明を挿入
今日の共有はここまでです。また次の共有でお会いしましょう

おすすめ

転載: blog.csdn.net/yyqzjw/article/details/132243298