C言語で一次名簿を実現
主題の構築
親愛なる読者の皆様、構造と列挙を研究すると、学んだ知識を使用して名簿の実現を完了することができます。もちろん、これは名簿の静的バージョンにすぎません。フォローアップ記事I名簿の中級版(ダイナミック版)と上位版(ファイル版)を
1つずつリリースしていきますので、少しずつ実装していきましょう!
まず、名簿の本体を作成します。使用する名簿は、連絡先の追加、削除、変更、連絡先の表示などを目的としているため
、前回の記事の地雷除去と同じように、これらに基づいてメインフレームを作成します。最初に2つ作成します。以下に示すように、cファイル、1つの.hファイル、
次にContact.hファイルで2つの構造を定義します。1つは特定の連絡先情報を含む構造であり、もう1つは通信全体を実現するためのものです。レコードの構造、以下のコードに示すように
#include<stdio.h>
#define NAME_MAX 10
#define SEX_MAX 4
#define ADDR_MAX 20
#define TELE_MAX 11
#define MAX 100
struct Peo
{
char name[NAME_MAX];//定义一个字符串来储存名字
char sex[SEX_MAX];//定义一个字符串来存储性别
int age;//定义一个整形用来存储年龄
char addr[ADDR_MAX];//定义一个字符串来存储联系人的地址
char tele[TELE_MAX];//定义一个字符串来存储联系人的地址
};
struct Contact
{
struct Peo Con[MAX];//定义一个结构体数组用来储存每个联系人的信息
int sz;//用来储存通讯录中的人数
};
Contact.hファイルで定義した後、main.cファイルで一般的なフレームワークを構築できます。詳細については、次のコードを参照してください。
#define _CRT_SECURE_NO_WARNINGS
#include "Contact.h"
void menu()
{
printf("*****************************\n");
printf("**** 1.Add 2.Sub *****\n");
printf("**** 3.Mod 4.Show *****\n");
printf("**** 5.Init 0.Exit *****\n");
printf("*****************************\n");
}
enum input
{
Exit,//对应的值是0
Add,//对应的值是1,依次往下类推
Sub,
Mod,
Show,
Init
};
int main()
{
int input = 1;
struct Contact CON;
while(input)//只有当input为0时才能推出循环
{
menu();//写一个菜单函数
scanf("%d", &input);
switch (input)
{
case Add:
AddNumber(&CON);//增加函数
break;
case Sub:
SubNumber(&CON);//删减函数
break;
case Mod:
ModNumber(&CON);//修改函数
break;
case Show:
ShowNumber(&CON);//展示函数
break;
case Init:
InitNumber(&CON);//初始化通讯录函数
break;
case Exit:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
}
フレームワークを設定すると、Contact.cファイルに移動して、各関数を詳細に実装できます。各関数を実装するときは、Contact.hの有名な関数に移動することを忘れないでください。
機能機能の実現
機能の実現を示す
最初にこの関数を実装することをお勧めします。そうすれば、この関数をうまく使用して、関数の追加などが正しく記述されているかどうかを確認できます。具体的なコードは次のとおりです
void ShowNumber(struct Contact *CON)
{
if (CON->sz == 0)
{
printf("通讯录为空\n");//判断一下啊,如果通讯录为空,那么将无法显示
return;
}
else
{
int i = 0;
printf("%s\t%s\t%s\t%s\t%s\n","姓名","年龄","性别","地址","电话");
for (; i < CON->sz; i++)
{
printf("%s\t%-d\t%s\t%s\t%s\n",
(CON->Con + i)->name,
(CON->Con + i)->age,
(CON->Con + i)->sex,
(CON->Con + i)->addr,
(CON->Con + i)->tele);
}
}
}
機能の実現を高める
関数を追加すると、簡単に言えば、連絡先情報を格納すると同時に、数値szを++に格納することになります。次の関数では変数szを使用することに注意してください。これは、名簿に保存されている人最後の連絡先の情報が保存されているアドレスを見つけます。詳細については、以下のコードを参照してください。
void AddNumber(struct Contact *CON)
{
if (CON->sz == MAX)
{
printf("通讯录已满,请先删除联系人\n");//先判断一下通讯录是否已经存满
return;
}
else
{
printf("请输入联系人的名字\n");
scanf("%s",(CON->Con+CON->sz)->name);
printf("请输入联系人的性别\n");
scanf("%s", (CON->Con + CON->sz)->sex);
printf("请输入联系人的年龄\n");
scanf("%d", &((CON->Con + CON->sz)->age));//要注意,这里要加&符号,因为其他成员变量都是字符串,相当于数组名就是地址,所以其他几个不用加。
printf("请输入联系人的地址\n");
scanf("%s", (CON->Con + CON->sz)->addr);
printf("请输入联系人的电话\n");
scanf("%s", (CON->Con + CON->sz)->tele);
++(CON->sz);//添加了之后别忘了自增 sz。
}
}
削減機能の実装
一般的な考え方は、最初に名簿が空かどうかを確認してから、削除する名前を格納する文字列を定義し、比較をループすることです。同じ場合は、i +1構造を使用してiをカバーします。構造体。
void SubNumber(struct Contact *CON)
{
if (CON->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
else
{
char name[NAME_MAX];
printf("请输入你想删除的联系人的名字\n");
scanf("%s",name);
int i = 0;
if (CON->sz == 1)
{
if (strcmp(name, (CON->Con->name)) == 0)
{
memset(CON->Con, 0, sizeof(struct Peo));
printf("删除成功\n");
--(CON->sz);
return;
}
else
{
printf("通讯录中无此人\n");
return;
}
}//因为只有一个联系人的时候,对于后面循环遍历覆盖有点特殊,我们可以选择特殊处理
for (i = 0 ; i < CON->sz; i++)
{
if (strcmp(name, (CON->Con + i)->name) == 0)
{
i += 1;
for (; i < CON->sz;i++)
{
(CON->Con)[i-1] = (CON->Con)[i];//可以直接将相同类型的结构体进行赋值操作
}
printf("删除成功\n");
--(CON->sz);
return;
}
}
printf("通讯录中无此人,无法删除\n");
return;
}
}
関数の実装を変更します
変更された関数は削除関数に似ていますが、それを見つけて変更するだけで済みます。コードは次のとおりです。
void ModNumber(struct Contact *CON)
{
if (CON->sz == 0)
{
printf("通讯录为空,无法修改\n");
return;
}
else
{
char name[NAME_MAX];
printf("请输入你想修改的联系人的名字\n");
scanf("%s", name);
int i = 0;
for (; i < CON->sz; i++)
{
if (strcmp(name, (CON->Con + i)->name) == 0)
{
printf("请输入联系人的名字\n");
scanf("%s", (CON->Con + i)->name);
printf("请输入联系人的性别\n");
scanf("%s", (CON->Con + i)->sex);
printf("请输入联系人的年龄\n");
scanf("%d", &((CON->Con + i)->age));
printf("请输入联系人的地址\n");
scanf("%s", (CON->Con + i)->addr);
printf("请输入联系人的电话\n");
scanf("%s", (CON->Con + i)->tele);
printf("修改成功\n");
return;
}
}
printf("通讯录中无此人\n");
return;
}
}
初期化関数
初期化関数については、memset関数を使用して実装することができます。具体的なコードは次のとおりです。
void InitNumber(struct Contact *CON)
{
if (CON->sz == 0)
{
printf("通讯录为空,无需初始化\n");
return;
}
else
{
memset(CON->Con, 0, MAX*sizeof(struct Peo));
//第一个参数为地址,第二个参数为要设置的字符的ASCII码值,第三个参数为要设置的字节数
CON->sz = 0;
printf("初始化成功\n");
return;
}
}
コードとプログラムの概要
この時点で、おそらく最初に静的バージョンのアドレスブックを実装できるようになります。ここにいくつかのコードリストと実行図を示します。
さようなら、これが記事を読んだあなたに役立つことを願っています!読んでくれてありがとう