C语言编程练习:建立一个同学通讯录,输入学号、姓名、电话号码、住址等信息,然后 对通信录进行显示、查找、添加、修改。 编写一个菜单驱动的通讯录,其功能要求: (1)通讯录的每一条信息包括学号、姓名、家庭住址、电话、分类(如 同事、朋友、同学、家人等)、EMAIL、QQ等。 (2)输入功能:可以一次完成若干条信息的输入。 (3)显示功能:完成全部通讯录信息的显示。(4)查找功能:可以按姓名或按类别等多种方式查找通讯信息 (5)修改功能:根据需要完成通讯录信息的更新、修改 (6)排序功能:可按照所有学生的学号从小到大进行排序; (7)通讯录数据要能够保存,可采用文件读写技术存放于专门的数据文 件如xxx.txt,在程序开始运行时,可以通过读取该文件获得记录数据。
时间: 2023-07-10 12:32:32 浏览: 147
n个同学建立一个通讯录,包括学号、姓名、年龄、电话、寝室等个人信息
3星 · 编辑精心推荐
好的,这是一个非常实用的 C 语言编程练习!下面是一个简单的实现方案。
首先,我们需要定义一个结构体来表示每个同学的通讯录信息:
```c
typedef struct {
int id; // 学号
char name[20]; // 姓名
char address[50]; // 家庭住址
char phone[20]; // 电话号码
char category[20]; // 分类,如同事、朋友、同学、家人等
char email[50]; // 邮箱
char qq[20]; // QQ号码
} Contact;
```
然后,我们可以定义一个 Contact 数组来存储所有同学的通讯录信息:
```c
Contact contacts[100];
int count = 0; // 当前通讯录中同学的数量
```
接下来,我们可以编写一个菜单,让用户可以选择不同的功能:
```c
int main() {
while (1) {
printf("通讯录菜单:\n");
printf("1. 输入\n");
printf("2. 显示\n");
printf("3. 查找\n");
printf("4. 修改\n");
printf("5. 排序\n");
printf("6. 保存\n");
printf("7. 退出\n");
printf("请选择功能(输入数字1-7):\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
input();
break;
case 2:
display();
break;
case 3:
search();
break;
case 4:
modify();
break;
case 5:
sort();
break;
case 6:
save();
break;
case 7:
exit(0);
default:
printf("无效的选择,请重新输入。\n");
break;
}
}
return 0;
}
```
其中,每个功能对应一个函数,下面我们来逐个实现。
### 输入功能
输入功能可以一次完成若干条信息的输入,我们可以使用一个循环来实现。在循环中,我们可以提示用户输入每个同学的信息,并将其保存到 Contact 数组中:
```c
void input() {
printf("请输入同学的信息:\n");
while (1) {
Contact c;
printf("学号:");
scanf("%d", &c.id);
printf("姓名:");
scanf("%s", c.name);
printf("家庭住址:");
scanf("%s", c.address);
printf("电话号码:");
scanf("%s", c.phone);
printf("分类:");
scanf("%s", c.category);
printf("邮箱:");
scanf("%s", c.email);
printf("QQ号码:");
scanf("%s", c.qq);
contacts[count++] = c;
printf("是否继续输入?(y/n):");
char ch;
scanf("%s", &ch);
if (ch != 'y') {
break;
}
}
printf("输入完成!\n");
}
```
### 显示功能
显示功能可以完成全部通讯录信息的显示,我们可以使用一个循环来遍历 Contact 数组,并将每个同学的信息打印出来:
```c
void display() {
printf("当前通讯录中共有%d个同学的信息:\n", count);
for (int i = 0; i < count; i++) {
Contact c = contacts[i];
printf("学号:%d, 姓名:%s, 家庭住址:%s, 电话号码:%s, 分类:%s, 邮箱:%s, QQ号码:%s\n",
c.id, c.name, c.address, c.phone, c.category, c.email, c.qq);
}
}
```
### 查找功能
查找功能可以按姓名或按类别等多种方式查找通讯信息。我们可以让用户输入查找的关键字,然后遍历 Contact 数组,找到匹配的同学信息并打印出来:
```c
void search() {
printf("请选择查找方式:\n");
printf("1. 按姓名查找\n");
printf("2. 按分类查找\n");
printf("请选择(输入数字1或2):\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
searchByName();
break;
case 2:
searchByCategory();
break;
default:
printf("无效的选择,请重新输入。\n");
break;
}
}
void searchByName() {
printf("请输入同学的姓名:\n");
char name[20];
scanf("%s", name);
int found = 0;
for (int i = 0; i < count; i++) {
Contact c = contacts[i];
if (strcmp(c.name, name) == 0) {
printf("学号:%d, 姓名:%s, 家庭住址:%s, 电话号码:%s, 分类:%s, 邮箱:%s, QQ号码:%s\n",
c.id, c.name, c.address, c.phone, c.category, c.email, c.qq);
found = 1;
}
}
if (!found) {
printf("未找到同学信息。\n");
}
}
void searchByCategory() {
printf("请输入同学的分类:\n");
char category[20];
scanf("%s", category);
int found = 0;
for (int i = 0; i < count; i++) {
Contact c = contacts[i];
if (strcmp(c.category, category) == 0) {
printf("学号:%d, 姓名:%s, 家庭住址:%s, 电话号码:%s, 分类:%s, 邮箱:%s, QQ号码:%s\n",
c.id, c.name, c.address, c.phone, c.category, c.email, c.qq);
found = 1;
}
}
if (!found) {
printf("未找到同学信息。\n");
}
}
```
### 修改功能
修改功能可以根据需要完成通讯录信息的更新、修改。我们可以让用户输入要修改的同学的学号,然后让用户输入新的信息,并将其更新到 Contact 数组中:
```c
void modify() {
printf("请输入要修改的同学的学号:\n");
int id;
scanf("%d", &id);
int found = 0;
for (int i = 0; i < count; i++) {
Contact *c = &contacts[i];
if (c->id == id) {
printf("请输入同学的新信息:\n");
printf("姓名:");
scanf("%s", c->name);
printf("家庭住址:");
scanf("%s", c->address);
printf("电话号码:");
scanf("%s", c->phone);
printf("分类:");
scanf("%s", c->category);
printf("邮箱:");
scanf("%s", c->email);
printf("QQ号码:");
scanf("%s", c->qq);
found = 1;
break;
}
}
if (!found) {
printf("未找到同学信息。\n");
} else {
printf("修改完成!\n");
}
}
```
### 排序功能
排序功能可以按照所有学生的学号从小到大进行排序。我们可以使用冒泡排序来实现:
```c
void sort() {
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (contacts[j].id > contacts[j + 1].id) {
Contact temp = contacts[j];
contacts[j] = contacts[j + 1];
contacts[j + 1] = temp;
}
}
}
printf("排序完成!\n");
}
```
### 保存功能
保存功能可以将通讯录数据保存到文件中。我们可以使用文件读写技术存放于专门的数据文件如 `contacts.txt`。在程序开始运行时,我们可以通过读取该文件获得记录数据。
```c
void save() {
FILE *fp = fopen("contacts.txt", "w");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
for (int i = 0; i < count; i++) {
Contact c = contacts[i];
fprintf(fp, "%d,%s,%s,%s,%s,%s,%s\n",
c.id, c.name, c.address, c.phone, c.category, c.email, c.qq);
}
fclose(fp);
printf("保存完成!\n");
}
```
在程序开始运行时,我们可以通过读取该文件获得记录数据:
```c
int main() {
// 读取文件中的记录数据
FILE *fp = fopen("contacts.txt", "r");
if (fp != NULL) {
char line[100];
while (fgets(line, sizeof(line), fp) != NULL) {
Contact c;
sscanf(line, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%s",
&c.id, c.name, c.address, c.phone, c.category, c.email, c.qq);
contacts[count++] = c;
}
fclose(fp);
}
// 显示菜单
while (1) {
// ...
}
return 0;
}
```
至此,一个基本的同学通讯录程序就完成了,你可以试着运行一下,看看是否能够正常工作。当然,这只是一个最基本的实现方案,你可以根据自己的需要进行扩展和优化。
阅读全文