C言語学習summary_upgradedアドレスブック

名簿の実現名簿は
、一定の容量を持つ人の情報を保存するために使用できます。最大容量が保存されると、名簿は自動的に拡張され、プログラム内の名簿はハードディスクまたはプログラムが閉じられるたびにデータベース。
プロビジョニング:
1、連絡先情報の追加
2、指定した連絡先の削除
3、すべての連絡先の表示
4、連絡先情報の変更
5の指定、すべての連絡先の表示
6、すべての連絡先のクリア
0、名簿プログラムの終了
関連取得したナレッジポイント:
複数のファイル、構造内のアプリケーション、柔軟な配列のアプリケーション、静的キーワードの使用、動的メモリ管理、データを永続化および読み取るためのファイルポインタの使用など。
ヘッダーファイルは次のとおりです。

#include "contact.h"

int main()
{
    
    
	//初始化通讯录
	contact_t* ct = InitContact();
	int quit = 0;
	int select = 0;
	while (!quit){
    
    
		Menu();
		printf("please input your select:");
		scanf("%d", &select);
		switch (select)
		{
    
    
		case 1:
			AddPerson(&ct);
			break;
		case 2:
			DelPerson(ct);
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			ShowContact(ct);
			break;
		case 6:
			Clear(ct);
			break;
		case 7:
			break;
		default:
			quit = 1;
			SaveContact(ct);//在通讯录退出的时候保存通讯录到硬盘
			break;
		}
	}
	printf("ByeBye!\n");
	system("pause");
	return 0;
}

ヘッダーファイル内の関連関数の定義:

#include"contact.h"

void Menu()
{
    
    
	printf("###################################\n");
	printf("##1.Add  2.Del   3.Search 4.Mod####\n");
	printf("##5.Show 6.Clear 7.Sort   0.Exit###\n");
}
//初始化结构体
contact_t* InitContact(){
    
    
	contact_t *ct = NULL;
	FILE* fp = fopen(SAVE_FILE, "rb");
	if (NULL == fp)
	{
    
    
		printf("use default:init Contact ing...\n");
		int size = sizeof(contact_t)+sizeof(person_t)*NUM;
		ct = (contact_t*)malloc(size);
		if (NULL == ct){
    
    
			printf("Contact malloc error!\n");
			exit(1);
		}
		ct->cap = NUM;
		ct->size = 0;
		printf("use default:init Contact done!\n");
	}
	else{
    
    
		//读入通讯录
		printf("read in contact from disk ing....\n");
		contact_t temp;
		fread(&temp, sizeof(contact_t), 1, fp);
		int size = sizeof(contact_t)+sizeof(person_t)*temp.cap;
		 ct = (contact_t*)malloc(size);
		if (NULL == ct){
    
    
			printf("Contact malloc error!\n");
			exit(1);
		}
		ct->cap = temp.cap;
		ct->size = temp.size;
		//先把通讯录头读进来,知道cap和size,就可以申请空间了,
		//申请完空间再把柔性数组中的人读到我申请的堆空间里
		fread(ct->persons, sizeof(person_t), temp.size, fp);
		fclose(fp);
		printf("read in contact from disk done....\n");
	}

	return ct;
}
static int FindPerson(contact_t* ct, const char* tel){
    
    
	assert(ct&&tel);
	int i;
	for (i = 0; i < ct->size; i++){
    
    
		if (strcmp(ct->persons[i].tel, tel) == 0){
    
    
			return i;
		}
	}
	return -1;
}
static int IsFull(contact_t* ct){
    
    
	return ct->cap == ct->size;
}
static int Inc(contact_t ** ct){
    
    
	printf("contact is full,incing....\n");

	*ct = (contact_t *)realloc(*ct, sizeof(**ct) + INC_SIZE*sizeof(person_t));

	if (NULL == *ct){
    
    
		return 0;
	}

	((*ct)->cap) += INC_SIZE;
	printf("contact is full,inc done....\n");
	return 1;
}
void AddPerson(contact_t** ct){
    
    
	if (!IsFull(*ct) || Inc(ct)){
    
    
		//正常添加
		person_t* p = &((*ct)->persons[(*ct)->size]);
		//姓名,性别,年龄,电话,住址
		printf("姓名:");
		scanf(" %s", p->name);
		printf("性别:");
		scanf(" %c", &(p->sex));
		printf("年龄:");
		scanf(" %d", &(p->age));
		printf("电话:");
		scanf(" %s", p->tel);
		printf("住址:");
		scanf(" %s", p->addr);
		
		(*ct)->size += 1;
		
	}
	else{
    
    
		//空间满了,申请又失败了
		printf("inc error!\n");
	}

}

void ShowContact(contact_t* ct){
    
    
	assert(ct);
	printf("| %10s|%10s\n |\n", "姓名", "电话");
	for (int i = 0; i < ct->size; i++){
    
    
		printf("| %10s | %10s\n |\n", ct->persons[i].name, ct->persons[i].tel);
	}
}
static int IsEmpty(contact_t* ct){
    
    
	return ct->size == 0;//1为空,0为非空
}

void DelPerson(contact_t* ct){
    
    
	assert(ct);
	if (!IsEmpty(ct)){
    
    
		printf("请输入你要删除人的电话:");
		char tel[SIZE / 6] = {
    
    0};
		scanf(" %s", tel);
		int pos = FindPerson(ct, tel);
		if (pos >= 0){
    
    
			ct->persons[pos] = ct->persons[ct->size - 1];
			ct->size -= 1;
		}
		else{
    
    
			printf("你要删除的人不存在!\n");
		}

	}
	else{
    
    
		printf("通讯录为空!\n");
	}
}

void Clear(contact_t* ct){
    
    
	ct->size = 0;
}

void SaveContact(contact_t* ct){
    
    
	assert(ct);
	FILE* fp = fopen(SAVE_FILE, "wb");
	if (NULL == fp){
    
    
		printf("file open error and save failure!\n");
	}
	//将用通讯录结构体和里面的柔性数组分别写入到硬盘中
	fwrite(ct, sizeof(contact_t), 1, fp);
	fwrite(ct->persons, sizeof(person_t), ct->size, fp);
	fclose(fp);
}
``

main.c主要框架的设计

```c
#include "contact.h"

int main()
{
    
    
	//初始化通讯录
	contact_t* ct = InitContact();
	int quit = 0;
	int select = 0;
	while (!quit){
    
    
		Menu();
		printf("please input your select:");
		scanf("%d", &select);
		switch (select)
		{
    
    
		case 1:
			AddPerson(&ct);
			break;
		case 2:
			DelPerson(ct);
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			ShowContact(ct);
			break;
		case 6:
			Clear(ct);
			break;
		case 7:
			break;
		default:
			quit = 1;
			SaveContact(ct);//在通讯录退出的时候保存通讯录到硬盘
			break;
		}
	}
	printf("ByeBye!\n");
	system("pause");
	return 0;
}

一部の関数の設計はそれほど厳密ではありません。興味のある友人は私のコードに基づいて関数を改善できます。たとえば、性別を入力するとき、入力の精度をチェックせず、fとmのみを入力しました。

おすすめ

転載: blog.csdn.net/CZHLNN/article/details/110389696