1、编程实现通讯录的查找,通讯录信息保存在一个menu.txt文件中,内容包含信息如下 【姓名 性别 出生年月 地址 电话】 要求: 1)设计一个结构体类型,用于存储每条的信息。 2)根据从文件中读入的第一数据,采用结构体类型的动态内存分配,实现n个人的信息的存储。 3)从文件中依次读入n个用户的信息。 4)写一个函数,实现结构体类型数组的参数传递,把所有出生于2000年的通讯记录按照读入的倒叙输出到显示器上。
时间: 2024-02-09 08:12:07 浏览: 23
好的,这是一个不错的编程问题。我可以帮你解答。
对于这个问题,我们可以按照以下步骤来解决:
1. 定义结构体类型
我们需要定义一个结构体类型来存储每个人的信息。例如:
```
struct Contact {
char name[20];
char gender[10];
char birthdate[20];
char address[50];
char phone[20];
};
```
2. 动态内存分配
我们需要根据从文件中读入的第一行数据,也就是人数n,动态分配内存来存储n个人的信息。例如:
```
int n;
fscanf(fp, "%d", &n); // 从文件中读入n的值
Contact *contacts = (Contact*) malloc(n * sizeof(Contact));
```
3. 从文件中读入信息
我们需要从文件中读入n个人的信息,并保存到动态分配的内存中。例如:
```
for (int i = 0; i < n; i++) {
fscanf(fp, "%s %s %s %s %s", contacts[i].name, contacts[i].gender, contacts[i].birthdate, contacts[i].address, contacts[i].phone);
}
```
4. 过滤出符合条件的记录
我们需要编写一个函数来过滤出出生于2000年的记录,例如:
```
void filter(Contact *contacts, int n, Contact **filtered, int *m) {
*m = 0;
for (int i = n - 1; i >= 0; i--) {
if (strstr(contacts[i].birthdate, "2000") != NULL) {
(*m)++;
*filtered = (Contact*) realloc(*filtered, *m * sizeof(Contact));
(*filtered)[*m - 1] = contacts[i];
}
}
}
```
这个函数会把所有出生于2000年的记录过滤出来,并保存到一个新的数组中。
5. 输出结果
最后,我们需要把过滤出来的记录按照倒序输出到屏幕上。例如:
```
Contact *filtered = NULL;
int m;
filter(contacts, n, &filtered, &m);
for (int i = m - 1; i >= 0; i--) {
printf("%s %s %s %s %s\n", filtered[i].name, filtered[i].gender, filtered[i].birthdate, filtered[i].address, filtered[i].phone);
}
free(filtered);
```
这样就完成了通讯录的查找功能。完整代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Contact {
char name[20];
char gender[10];
char birthdate[20];
char address[50];
char phone[20];
};
void filter(Contact *contacts, int n, Contact **filtered, int *m) {
*m = 0;
for (int i = n - 1; i >= 0; i--) {
if (strstr(contacts[i].birthdate, "2000") != NULL) {
(*m)++;
*filtered = (Contact*) realloc(*filtered, *m * sizeof(Contact));
(*filtered)[*m - 1] = contacts[i];
}
}
}
int main() {
FILE *fp = fopen("menu.txt", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 0;
}
int n;
fscanf(fp, "%d", &n);
Contact *contacts = (Contact*) malloc(n * sizeof(Contact));
for (int i = 0; i < n; i++) {
fscanf(fp, "%s %s %s %s %s", contacts[i].name, contacts[i].gender, contacts[i].birthdate, contacts[i].address, contacts[i].phone);
}
Contact *filtered = NULL;
int m;
filter(contacts, n, &filtered, &m);
for (int i = m - 1; i >= 0; i--) {
printf("%s %s %s %s %s\n", filtered[i].name, filtered[i].gender, filtered[i].birthdate, filtered[i].address, filtered[i].phone);
}
free(filtered);
free(contacts);
fclose(fp);
return 0;
}
```