学生通讯录管理系统
问题描述
纸质的通讯录已经不能满足大家的要求,容易丢失、查找困难等问题是难克服的缺点。学“生通讯录管理系统”是为了帮助、同学或者其他一些需要使用系统的人员进行管理和分析的一种应用程序。
2.需求分析
(1)输入数据建立通讯录。
(2)查询通讯录中满足要求的信息。
(3)插入新的通讯录信息。
(4)删除不需要的通讯录信息。
(5)查看所有的通讯录信息。
使用数组实现线性表结构,每个通讯录条目作为数组元素
#include <stdio.h>
#include <string.h>
#define N 108
typedef struct telephone
{
char name[25];
char num[25];
char tel[25];
} TEL;
void DisplayMenu(); //显示主菜单
void save(TEL a[], int n);
void CreateList(TEL a[], int n); //1.创建通讯录
void DisplayList(TEL a[], int n); //2.显示通讯录
void InquireListName(TEL a[], int n); //3.按姓名查询通讯录
void InquireListNum(TEL a[], int n); //4.按学号查询通讯录
void ChangeListName(TEL a[], int n); //5.按姓名修改通讯录
void ChangeListNum(TEL a[], int n); //6.按学号修改通讯录
int DelListName(TEL a[], int n); //7.按姓名删除通讯录
int DelListNum(TEL a[], int n); //8.按学号删除通讯录
void UpSortListName(TEL a[], int n); //9.姓名升序排序通讯录
void DownSortListNum(TEL a[], int n); //10.学号逆序排序通讯录
int AddList(TEL a[], int n); //11.添加学生信息
int main()
{
struct telephone a[N];
int i, n;
FILE *fp;
if ((fp = fopen("stu.dat", "r")) != NULL) //如果文件stu.dat已存在
{ // 则把数据从文件加载到数组a(读入记录个数n和n个姓名、学号、电话号码)
fscanf(fp, "%d", &n);
for (i = 0; i < n; i++)
fscanf(fp, "%s%s%s", a[i].name, a[i].num, a[i].tel);
}
else
{
printf("第一次使用该系统,请输入n和n个姓名、学号、电话号码:\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%s%s%s", a[i].name, a[i].num, a[i].tel);
save(a, n);
}
DisplayMenu(); //显示主菜单
while (1)
{
char select;
char name[25];
scanf(" %c", &select);
if (select < 'a' || select > 'l')
{
printf("输入错误!\n");
continue;
}
//if( select=='l' )
// break;
switch (select)
{
case 'a':
DisplayMenu(); //显示主菜单
break;
case 'b':
DisplayList(a, n); //2.显示通讯录
break;
case 'c':
InquireListName(a, n); //3.按姓名查询通讯录
break;
case 'd':
InquireListNum(a, n); //4.按学号查询通讯录
break;
case 'e':
ChangeListName(a, n); //5.按姓名修改通讯录
break;
case 'f':
ChangeListNum(a, n); //6.按学号修改通讯录
break;
case 'g':
if (DelListName(a, n)) //7.按姓名删除通讯录
n--;
break;
case 'h':
if (DelListNum(a, n)) //8.按学号删除通讯录
n--;
break;
case 'i':
UpSortListName(a, n); //9.姓名升序排序通讯录
break;
case 'j':
DownSortListNum(a, n); //10.学号逆序排序通讯录
break;
case 'k':
if (AddList(a, n)) //11.添加学生信息
n++;
save(a, n);
break;
case 'l':
exit(0); //12.退出系统
break;
}
}
return 0;
}
void save(TEL a[], int n)
{
int i;
FILE *fp;
fp = fopen("stu.dat", "w");
fprintf(fp, "%d\n", n);
for (i = 0; i < n; i++)
fprintf(fp, "%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
}
void DisplayMenu() //1.显示主菜单
{
printf(" 学生通讯录管理系统\n\n");
printf("*************************系统功能菜单**************************\n");
printf(" -------------------------------------------------------------\n");
printf(" a.显示主菜单 b.显示通讯录\n");
printf("************************************************************\n");
printf(" c.按姓名查询通讯录 d.按学号查询通讯录\n");
printf("************************************************************\n");
printf(" e.按姓名修改通讯录 f.按学号修改通讯录\n");
printf("************************************************************\n");
printf(" g.按姓名删除通讯录 h.按学号删除通讯录\n");
printf("************************************************************\n");
printf(" i.姓名升序排序通讯录 j.学号逆序排序通讯录\n");
printf("************************************************************\n");
printf(" k.添加学生信息 l.退出系统\n");
printf(" -------------------------------------------------------------\n");
printf("***************************************************************\n\n");
printf("请选择您需要的操作:\n");
}
void DisplayList(TEL a[], int n) //2.显示通讯录
{
int i;
printf("显示通讯录:\n");
for (i = 0; i < n; i++)
printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
printf("\n");
}
void InquireListName(TEL a[], int n) //3.按姓名查询通讯录
{
int i, flag;
char SearchName[25];
printf("按姓名查询通讯录:\n");
scanf("%s", SearchName);
for (i = 0, flag = 0; i < n; i++)
{
if (strcmp(SearchName, a[i].name) == 0)
{
printf("%s\t", a[i].name);
printf("%s\t", a[i].num);
printf("%s\n", a[i].tel);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("未查询到该姓名信息!\n");
}
printf("\n");
}
void InquireListNum(TEL a[], int n) //4.按学号查询通讯录
{
int i, flag;
char SearchID[25];
printf("按学号查询通讯录:\n");
scanf("%s", SearchID);
for (i = 0, flag = 0; i < n; i++)
{
if (strcmp(SearchID, a[i].num) == 0)
{
printf("%s\t", a[i].name);
printf("%s\t", a[i].num);
printf("%s\n", a[i].tel);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("未查询到该学号信息!\n");
}
printf("\n");
}
void ChangeListName(TEL a[], int n) //5.按姓名修改通讯录
{
int i, flag;
char SearchName[25];
printf("按姓名修改通讯录:\n");
scanf("%s", SearchName);
for (i = 0, flag = 0; i < n; i++)
{
if (strcmp(SearchName, a[i].name) == 0)
{
strcpy(a[i].name, SearchName);
printf("请输入要修改的学号:");
scanf("%s", a[i].num);
printf("请输入要修改的电话号码:");
scanf("%s", a[i].tel);
//strcpy(p[i].name,ChangeName);
//strcpy(p[i].name,ChangeTel);
save(a, n);
printf("信息修改完毕!\n");
printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
flag = 1;
break;
}
}
if (flag == 0)
printf("未找到该姓名信息!");
printf("\n");
}
void ChangeListNum(TEL a[], int n) //6.按学号修改通讯录
{
int i, flag;
char SearchNum[25];
printf("按学号修改通讯录:\n");
scanf("%s", SearchNum);
for (i = 0, flag = 0; i < n; i++)
{
if (strcmp(SearchNum, a[i].num) == 0)
{
strcpy(a[i].num, SearchNum);
printf("请输入要修改的名字:");
scanf("%s", a[i].name);
printf("请输入要修改的电话号码:");
scanf("%s", a[i].tel);
//strcpy(p[i].name,ChangeName);
//strcpy(p[i].name,ChangeTel);
save(a, n);
printf("信息修改完毕!\n");
printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
flag = 1;
break;
}
}
if (flag == 0)
printf("未找到该学号信息!");
printf("\n");
}
int DelListName(TEL a[], int n) //7.按姓名删除通讯录
{
int i, j;
char SearchName[25];
printf("按姓名删除通讯录:\n");
scanf("%s", SearchName);
for (i = 0; i < n; i++)
{
if (strcmp(a[i].name, SearchName) == 0)
break;
}
if (i >= n)
{
printf("未查询到该姓名信息!按姓名删除通讯录失败!\n");
return 0;
}
else
{
for (j = i; j < n - 1; j++)
a[j] = a[j + 1];
save(a, n);
printf("按姓名删除通讯录成功!\n");
return 1;
}
}
int DelListNum(TEL a[], int n) //8.按学号删除通讯录
{
int i, j, flag;
char SearchNum[25];
printf("按学号删除通讯录:\n");
scanf("%s", SearchNum);
for (i = 0; i < n; i++)
{
if (strcmp(a[i].num, SearchNum) == 0)
break;
}
if (i >= n)
{
printf("未查询到该学号信息!按学号删除通讯录失败!\n");
return 0;
}
else
{
for (j = i; j < n - 1; j++)
a[j] = a[j + 1];
printf("按学号删除通讯录成功!\n");
save(a, n);
return 1;
}
printf("\n");
}
void UpSortListName(TEL a[], int n) //9.姓名升序排序通讯录
{
int i, j;
TEL temp;
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (strcmp(a[i].name, a[j].name) > 0)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
printf("姓名升序排序通讯录:\n");
for (i = 0; i < n; i++)
printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
printf("\n");
}
void DownSortListNum(TEL a[], int n) //10.学号逆序排序通讯录
{
int i, j;
TEL temp;
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (strcmp(a[i].num, a[j].num) > 0)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
printf("学号逆序排序通讯录:\n");
for (i = n - 1; i >= 0; i--)
printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
printf("\n");
}
int AddList(TEL a[], int n) //11.添加学生信息
{
int i, flag;
char AddNum[25];
printf("添加通讯录:\n");
printf("请输入要添加的学号:");
scanf("%s", AddNum);
for (i = 0, flag = 0; i < n; i++)
{
if (strcmp(AddNum, a[i].num) == 0)
{
flag = 1;
printf("学号重复!\n");
return 0;
}
}
if (flag == 0)
{
//n++;
printf("学号不重复!请添加信息:\n");
printf("请输入要添加的名字:");
scanf("%s", a[n].name);
strcpy(a[n].num, AddNum);
printf("请输入要添加的电话号码:");
scanf("%s", a[n].tel);
//save(a,n);
printf("添加信息成功!\n");
return 1;
//printf("%d",n);
}
printf("\n");
}
基于new bing部分指引作答:
以下是一个使用C语言实现学生通讯录管理系统的代码示例:
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
struct Student {
char name[50];
char phone[20];
};
struct Student contactList[MAX_SIZE];
int contactsCount = 0;
void addContact(const char* name, const char* phone) {
if (contactsCount >= MAX_SIZE) {
printf("通讯录已满,无法添加新的联系人。\n");
return;
}
struct Student newStudent;
strcpy(newStudent.name, name);
strcpy(newStudent.phone, phone);
contactList[contactsCount] = newStudent;
contactsCount++;
printf("成功添加联系人:%s\n", name);
}
void searchContacts(const char* keyword) {
printf("查询结果:\n");
int found = 0;
for (int i = 0; i < contactsCount; i++) {
if (strstr(contactList[i].name, keyword) != NULL || strstr(contactList[i].phone, keyword) != NULL) {
printf("姓名:%s,电话:%s\n", contactList[i].name, contactList[i].phone);
found = 1;
}
}
if (!found) {
printf("未找到符合条件的联系人。\n");
}
}
void deleteContact(int index) {
if (index < 0 || index >= contactsCount) {
printf("索引超出范围,请输入有效的索引值。\n");
return;
}
printf("已删除联系人:%s\n", contactList[index].name);
for (int i = index; i < contactsCount - 1; i++) {
contactList[i] = contactList[i + 1];
}
contactsCount--;
}
void displayContacts() {
if (contactsCount == 0) {
printf("通讯录为空。\n");
return;
}
printf("通讯录列表:\n");
for (int i = 0; i < contactsCount; i++) {
printf("%d. 姓名:%s,电话:%s\n", i, contactList[i].name, contactList[i].phone);
}
}
int main() {
int choice;
while (1) {
printf("\n学生通讯录管理系统\n");
printf("-----------------\n");
printf("1. 添加联系人\n");
printf("2. 查询联系人\n");
printf("3. 删除联系人\n");
printf("4. 显示所有联系人\n");
printf("0. 退出\n");
printf("请输入菜单选项:");
scanf("%d", &choice);
switch (choice) {
case 0:
printf("感谢使用学生通讯录管理系统,再见!\n");
return 0;
case 1: {
char name[50], phone[20];
printf("请输入联系人姓名:");
scanf("%s", name);
printf("请输入联系人电话:");
scanf("%s", phone);
addContact(name, phone);
break;
}
case 2: {
char keyword[50];
printf("请输入查询关键字:");
scanf("%s", keyword);
searchContacts(keyword);
break;
}
case 3: {
int index;
printf("请输入要删除的联系人索引:");
scanf("%d", &index);
deleteContact(index);
break;
}
case 4:
displayContacts();
break;
default:
printf("无效的菜单选项,请重新输入。\n");
break;
}
}
}
在这个示例中,使用了一个结构体Student
来表示每个学生的通讯录条目,其中包括姓名和电话两个字段。
通过数组contactList
来存储所有的通讯录条目,其中每个条目是一个Student
结构体对象。
好的,每一步都做了注释,帮你写一部分代码参考一下下,剩下main函数代码自己试试补全
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAX_SIZE 100 // 最大通讯录容量
// 通讯录条目结构体
typedef struct {
char name[20]; // 姓名
char phone[20]; // 电话号码
char email[30]; // 电子邮箱
} ContactEntry;
// 学生通讯录结构体
typedef struct {
ContactEntry contacts[MAX_SIZE]; // 通讯录数组
int size; // 当前通讯录大小
} StudentContacts;
// 初始化学生通讯录
void initContacts(StudentContacts *contacts) {
contacts->size = 0;
}
// 添加通讯录条目
bool addContact(StudentContacts *contacts, const ContactEntry *entry) {
if (contacts->size >= MAX_SIZE) {
printf("通讯录已满,无法添加新条目!\n");
return false;
}
contacts->contacts[contacts->size] = *entry;
contacts->size++;
return true;
}
// 查询通讯录条目
void searchContacts(const StudentContacts *contacts, const char *name) {
bool found = false;
for (int i = 0; i < contacts->size; i++) {
if (strcmp(contacts->contacts[i].name, name) == 0) {
printf("姓名:%s\n", contacts->contacts[i].name);
printf("电话:%s\n", contacts->contacts[i].phone);
printf("邮箱:%s\n", contacts->contacts[i].email);
found = true;
break;
}
}
if (!found) {
printf("未找到姓名为%s的通讯录条目!\n", name);
}
}
// 删除通讯录条目
bool deleteContact(StudentContacts *contacts, const char *name) {
int deleteIndex = -1;
for (int i = 0; i < contacts->size; i++) {
if (strcmp(contacts->contacts[i].name, name) == 0) {
deleteIndex = i;
break;
}
}
if (deleteIndex == -1) {
printf("未找到姓名为%s的通讯录条目!\n", name);
return false;
}
// 将删除位置后面的元素往前移动
for (int j = deleteIndex; j < contacts->size - 1; j++) {
contacts->contacts[j] = contacts->contacts[j + 1];
}
contacts->size--;
return true;
}
// 显示所有通讯录条目
void displayContacts(const StudentContacts *contacts) {
if (contacts->size == 0) {
printf("通讯录为空!\n");
return;
}
for (int i = 0; i < contacts->size; i++) {
printf("姓名:%s\n", contacts->contacts[i].name);
printf("电话:%s\n", contacts->contacts[i].phone);
printf("邮箱:%s\n\n", contacts->contacts[i].email);
}
}
int main() {
StudentContacts contacts;
initContacts(&contacts); // 初始化通讯录
int choice;
ContactEntry entry;
do {
printf("------------- 学生通讯录管理系统 -------------\n");
printf("1. 添加通讯录条目\n");
printf("2. 查询通讯录条目\n");
printf("3. 删除通讯录条目\n");
printf("4. 显示所有通讯录条目\n");
printf("0. 退出\n");
printf("---------------------------------------------\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入姓名:");
scanf("%s", entry.name);
printf("请输入电话:");
scanf("%s", entry.phone);
printf("请输入邮箱:");
scanf("%s", entry.email);
addContact(&contacts, &entry);
printf("添加成功!\n");
break;
case 2:
printf("请输入要查询的姓名:");
scanf("%s", entry.name);
searchContacts(&contacts, entry.name);
break;
case 3:
printf("请输入要删除的姓名:");
scanf("%s", entry.name);
deleteContact(&contacts, entry.name);
break;
需求发我?稍后看我的博客,每一步的清晰无比
下面是一个用C语言实现学生通讯录管理系统的代码,并解释了每一步的意思。
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // 定义通讯录最大容量
// 定义通讯录条目结构体
struct Contact {
char name[20]; // 姓名
char phone[20]; // 电话号码
char email[30]; // 邮箱地址
};
struct Contact contacts[MAX_SIZE]; // 定义通讯录数组
int count = 0; // 当前通讯录条目数量
// 添加通讯录条目
void add_contact() {
if (count >= MAX_SIZE) { // 判断通讯录是否已满
printf("通讯录已满,无法添加新条目。\n");
return;
}
printf("请输入新条目的姓名、电话号码和邮箱地址(以空格分隔):\n");
scanf("%s %s %s", contacts[count].name, contacts[count].phone, contacts[count].email);
printf("添加成功!\n");
count++; // 更新通讯录条目数量
}
// 查询通讯录条目
void search_contact() {
char keyword[20];
int found = 0; // 标记是否找到匹配的条目
printf("请输入要查询的关键字:\n");
scanf("%s", keyword);
for (int i = 0; i < count; i++) {
if (strstr(contacts[i].name, keyword) ||
strstr(contacts[i].phone, keyword) ||
strstr(contacts[i].email, keyword)) {
printf("%s\t%s\t%s\n", contacts[i].name, contacts[i].phone, contacts[i].email);
found = 1;
}
}
if (!found) {
printf("没有找到匹配的条目。\n");
}
}
// 删除通讯录条目
void delete_contact() {
char name[20];
int found = 0; // 标记是否找到匹配的条目
printf("请输入要删除的条目的姓名:\n");
scanf("%s", name);
for (int i = 0; i < count; i++) {
if (strcmp(contacts[i].name, name) == 0) {
for (int j = i; j < count - 1; j++) {
// 将后面的条目向前移动一位
strcpy(contacts[j].name, contacts[j + 1].name);
strcpy(contacts[j].phone, contacts[j + 1].phone);
strcpy(contacts[j].email, contacts[j + 1].email);
}
printf("删除成功!\n");
found = 1;
count--; // 更新通讯录条目数量
}
}
if (!found) {
printf("没有找到匹配的条目。\n");
}
}
// 显示所有通讯录条目
void show_all_contacts() {
printf("姓名\t电话号码\t邮箱地址\n");
for (int i = 0; i < count; i++) {
printf("%s\t%s\t%s\n", contacts[i].name, contacts[i].phone, contacts[i].email);
}
}
int main() {
int choice;
printf("欢迎使用学生通讯录管理系统!\n");
while (1) {
printf("请选择要执行的操作:\n");
printf("1. 添加通讯录条目\n");
printf("2. 查询通讯录条目\n");
printf("3. 删除通讯录条目\n");
printf("4. 显示所有通讯录条目\n");
printf("5. 退出系统\n");
scanf("%d", &choice);
switch (choice) {
case 1:
add_contact();
break;
case 2:
search_contact();
break;
case 3:
delete_contact();
break;
case 4:
show_all_contacts();
break;
case 5:
printf("感谢使用学生通讯录管理系统!\n");
return 0;
default:
printf("无效的选择,请重新输入。\n");
}
}
}
这个代码定义了一个通讯录条目结构体,使用数组实现线性表结构,每个通讯录条目作为数组元素。主函数中使用一个无限循环,根据用户输入的选项执行相应的操作,包括添加、查询、删除和显示所有通讯录条目。具体每个函数的实现如下:
add_contact()
:向通讯录中添加一条新的条目。首先判断通讯录是否已满,如果未满则要求用户输入新条目的姓名、电话号码和邮箱地址,并将其添加到通讯录数组中,同时更新通讯录条目数量。
search_contact()
:查询通讯录中满足关键字要求的信息。要求用户输入要查询的关键字,然后遍历整个通讯录数组,如果条目的姓名、电话号码或邮箱地址中包含关键字,则将这个条目打印出来,并将标记 found
设为 1。如果没有找到匹配的条目,则输出相应的提示信息。
delete_contact()
:删除不需要的通讯录信息。要求用户输入要删除的条目的姓名,然后遍历整个通讯录数组,如果找到匹配的条目,则将后面的条目向前移动一位,覆盖当前条目,并将标记 found
设为 1。最后更新通讯录条目数量。如果没有找到匹配的条目,则输出相应的提示信息。
show_all_contacts()
:显示所有的通讯录信息。遍历整个通讯录数组,将每个条目的姓名、电话号码和邮箱地址打印出来。
在主函数中,使用 while
循环不断读取用户的操作选项,根据用户输入的选项调用相应的函数。如果用户选择退出系统,则输出相应的提示信息并返回 0。
输入一行一个正整数n。
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用"—>"连接。输出格式可以参见样例。
保证最后生成的数在int范围内。
349
3
349--->1292--->4213--->7337
#include <stdio.h>
#include <math.h>
int isPalindrome(int x) //如果传入的正整数是回文数则返回1,否则返回0
{
if (x < 0) return 0;
else if (x == 0) return 1;
else
{
int i = 0, j = 0, a[100] = { 0 };
while (x > 0)
{
a[i] = x % 10;
i++;
x = x / 10;
}
for (j = 0; j <= (i - 1) / 2; j++)
{
if (a[j] != a[i - 1 - j]) return 0;
}
return 1;
}
}
int fz(int x) //返回翻转后的正整数
{
int a[100] = { 0 }, i = 0, y = 0, j = 0;
while (x > 0)
{
a[i] = x % 10;
i++;
x = x / 10;
}
i--;
for (j = 0; j <= i; j++)
{
y += a[j] * pow(10, i - j);
}
return y;
}
int main(void)
{
int k = 0, i = 0, a[100] = { 0 }, j = 0;
scanf("%d", &k);
while (isPalindrome(k) == 0)
{
a[i] = k;
k += fz(k);
i++;
}
printf("%d\n", i);
for (j = 0; j < i; j++)
{
printf("%d--->", a[j]);
}
printf("%d", k);
return 0;
}
问题:用c语言编写学生通讯录管理系统,并解释每一步的意思。
解决方案:
#include <stdio.h>
#include <stdlib.h>
// 定义学生结构体
struct Student {
int id;
char name[50];
char phone[20];
};
// 定义通讯录结构体
struct AddressBook {
struct Student students[100];
int count;
};
// 初始化通讯录
void initAddressBook(struct AddressBook *addressBook) {
addressBook->count = 0;
}
// 添加学生信息
void addStudent(struct AddressBook *addressBook) {
struct Student student;
printf("请输入学生ID: ");
scanf("%d", &student.id);
printf("请输入学生姓名: ");
scanf("%s", student.name);
printf("请输入学生电话: ");
scanf("%s", student.phone);
addressBook->students[addressBook->count] = student;
addressBook->count++;
printf("学生信息添加成功!\n");
}
// 查询学生信息
void searchStudent(struct AddressBook *addressBook) {
int studentId;
int found = 0;
printf("请输入要查询的学生ID: ");
scanf("%d", &studentId);
for (int i = 0; i < addressBook->count; i++) {
if (addressBook->students[i].id == studentId) {
printf("学生姓名: %s\n", addressBook->students[i].name);
printf("学生电话: %s\n", addressBook->students[i].phone);
found = 1;
break;
}
}
if (found == 0) {
printf("未找到学生信息!\n");
}
}
// 插入学生信息
void insertStudent(struct AddressBook *addressBook) {
int index;
struct Student student;
printf("请输入要插入的位置: ");
scanf("%d", &index);
if (index < 0 || index > addressBook->count) {
printf("插入位置无效!\n");
return;
}
printf("请输入学生ID: ");
scanf("%d", &student.id);
printf("请输入学生姓名: ");
scanf("%s", student.name);
printf("请输入学生电话: ");
scanf("%s", student.phone);
for (int i = addressBook->count - 1; i >= index; i--) {
addressBook->students[i + 1] = addressBook->students[i];
}
addressBook->students[index] = student;
addressBook->count++;
printf("学生信息插入成功!\n");
}
// 删除学生信息
void deleteStudent(struct AddressBook *addressBook) {
int studentId;
int found = 0;
printf("请输入要删除的学生ID: ");
scanf("%d", &studentId);
for (int i = 0; i < addressBook->count; i++) {
if (addressBook->students[i].id == studentId) {
for (int j = i; j < addressBook->count - 1; j++) {
addressBook->students[j] = addressBook->students[j + 1];
}
addressBook->count--;
found = 1;
printf("学生信息删除成功!\n");
break;
}
}
if (found == 0) {
printf("未找到学生信息!\n");
}
}
// 查看所有学生信息
void viewAllStudents(struct AddressBook *addressBook) {
if (addressBook->count == 0) {
printf("通讯录为空!\n");
} else {
for (int i = 0; i < addressBook->count; i++) {
printf("学生ID: %d\n", addressBook->students[i].id);
printf("学生姓名: %s\n", addressBook->students[i].name);
printf("学生电话: %s\n", addressBook->students[i].phone);
printf("--------------------\n");
}
}
}
int main() {
struct AddressBook addressBook;
int choice;
initAddressBook(&addressBook);
do {
printf("1. 输入数据建立通讯录\n");
printf("2. 查询通讯录中满足要求的信息\n");
printf("3. 插入新的通讯录信息\n");
printf("4. 删除不需要的通讯录信息\n");
printf("5. 查看所有的通讯录信息\n");
printf("0. 退出\n");
printf("请输入选择: ");
scanf("%d", &choice);
switch(choice) {
case 1:
addStudent(&addressBook);
break;
case 2:
searchStudent(&addressBook);
break;
case 3:
insertStudent(&addressBook);
break;
case 4:
deleteStudent(&addressBook);
break;
case 5:
viewAllStudents(&addressBook);
break;
case 0:
printf("程序已退出!\n");
break;
default:
printf("无效的选择!\n");
break;
}
} while(choice != 0);
return 0;
}
解释: 1. 定义了两个结构体,struct Student
表示学生信息,包括学生ID、姓名和电话;struct AddressBook
表示通讯录,包括一个存放学生信息的数组和学生数量的计数器。 2. 初始化通讯录函数initAddressBook
,将通讯录中学生数量初始化为0。 3. 添加学生函数addStudent
,依次输入学生的ID、姓名和电话,将学生信息加入通讯录的数组中,并将学生数量计数器加1。 4. 查询学生函数searchStudent
,通过输入要查询的学生ID,在通讯录中查找相同ID的学生信息并输出。 5. 插入学生函数insertStudent
,首先输入要插入的位置,再输入要插入的学生ID、姓名和电话。将插入位置之后的学生信息依次后移一位,将要插入的学生信息插入到指定位置,并将学生数量计数器加1。 6. 删除学生函数deleteStudent
,通过输入要删除的学生ID,在通讯录中查找相同ID的学生信息并将其删除。删除后将删除位置之后的学生信息依次前移一位,并将学生数量计数器减1。 7. 查看所有学生函数viewAllStudents
,依次输出通讯录中的所有学生信息。 8. 主函数main
,通过菜单选择界面,根据用户的不同选择调用相应的函数。直到用户选择退出为止。