学生通讯录管理系统(用C语言)
需求分析
(1)输入数据建立通讯录。
(2)查询通讯录中满足要求的信息。
(3)插入新的通讯录信息。
(4)删除不需要的通讯录信息。
(5)查看所有的通讯录信息。
以下是一个简单的C语言代码示例,用于处理你的需求。这个代码使用了switch
语句来根据用户输入的命令执行不同的操作。这个示例中,我们将使用一个结构体数组来存储通讯录信息,并实现了基本的插入和显示操作。
#include <stdio.h>
#include <string.h>
#define MAX_CONTACTS 100
typedef struct {
char name[50];
char phone[20];
} Contact;
Contact contacts[MAX_CONTACTS];
int num_contacts = 0;
void insert_contact() {
if (num_contacts >= MAX_CONTACTS) {
printf("通讯录已满,无法插入新的联系人。\n");
return;
}
printf("请输入联系人的名字:");
scanf("%s", contacts[num_contacts].name);
printf("请输入联系人的电话号码:");
scanf("%s", contacts[num_contacts].phone);
num_contacts++;
printf("联系人已成功插入。\n");
}
void display_contacts() {
int i;
for (i = 0; i < num_contacts; i++) {
printf("联系人:%s,电话号码:%s\n", contacts[i].name, contacts[i].phone);
}
}
int main() {
int command;
while (1) {
printf("请输入命令(1-5):\n");
printf("1. 插入新的通讯录信息\n");
printf("2. 查看所有的通讯录信息\n");
scanf("%d", &command);
switch (command) {
case 1:
insert_contact();
break;
case 2:
display_contacts();
break;
default:
printf("无效的命令\n");
}
}
return 0;
}
这个示例中,我们只实现了插入新的通讯录信息和查看所有的通讯录信息两个功能。你需要自己实现其他的功能,如查询满足要求的信息和删除不需要的通讯录信息。你可能需要使用循环和条件语句来处理这些操作。
//编写一个建立单链表的函数,设链表的表元素信息包含学号、姓名、一门课的成绩;
//写一个按照学号查学生成绩的函数;最后写一个主函数,它先调用建立函数,再调用查询函数,显示查到学生的姓名和成绩。
# include <stdio.h>
# include <math.h>
# include <string.h>
void fun_ini( );
void fun_unini( );
struct stu //定义方式一的结构体
{
char ID[20];
char name [20];
char sex [10];
int age[10];
float gardes[30];
};
//struct stu_un //定义方式二的结构体
//{ char ID[20];
// char name [20];
// char sex [10];
// int age[10];
// float gardes[30];
//};
int main()
{
int c;
char re='Y';
printf("******************************************************************************************\n\n");
printf("\t\t方式一:通过输入学号找出已经初始化的学生信息:\n\t\t方式二:通过键盘输入学生的信息(包括ID、姓名、性别、年龄、分数):\n");
printf("\n******************************************************************************************\n\n");
while(re=='Y') //功能:(1)在输入不是‘1’或者‘2’是进行提醒并提醒用户重新输入 (2)整个程序体是否退出的控制开关
{
printf("方式一请输入'1',方式二请输入'2':\t\t"); //提示用户选择方式
fflush(stdin);
scanf("%d",&c);
if ( c==1) re = 'N',fun_ini( ); //方式一
if(c==2) re = 'N', fun_unini( ); //方式二
else re ='Y', printf("请重新'1'或者‘2’进行选择方式:\n"); //输入错误,即将提醒用户重新输入
if(re=='N') //输入正确情况,已经进入子函数一或者二,重新判断是否重新开始程序
printf("\n========================================================\n");
printf("是否从头开始运行,运行请输入‘Y’,否请输入‘N’\t"),
fflush(stdin),
scanf("%c",&re),
printf("\n========================================================\n");
}
}
void fun_ini( )
{
char number [20];
int i,m=1;
struct stu s[100];
//逐个定义学生的信息
strcpy(s[0].ID,"201920834101");strcpy(s[0].name,"张三");strcpy(s[0].sex,"男");
s[0] .age[0] = 18; s[0].gardes[0]=80;s[0].gardes[1]=90;s[0].gardes[2]=95;
strcpy(s[1].ID,"201920834102");strcpy(s[1].name,"李四");strcpy(s[1].sex,"女");
s[1].gardes[0] = 19; s[1] .gardes[0] = 83;s[1].gardes[1] = 87; s[1].gardes[2] = 80;
strcpy(s[2].ID,"201920834103");strcpy(s[2].name,"三六九");strcpy(s[2].sex,"男");
s[2].age[0] = 20;s[2].gardes[0]= 90; s[2].gardes[1] = 94;s[2].gardes[2] = 97;
printf("\n**************************************** 方式一 **************************************\n\n");
while(m==1)
{
printf("\n___________________________________________________________________________________________________\n");
printf("\n请输入学生的学号:(201920834101或者201920834102或者201920834103)\t");
fflush(stdin);
gets(number);
printf("__________________________________________________\n");
printf("\n\n你查找的学生信息如下:\n");
for (i=0;i<3;i++)
{ if( strcmp(s[i].ID,number)==0)
m++,
printf("\nname:\t%s\n\nscores:\t%7.2f\t%7.2f\t%7.2f\n",s[i].name,s[i].gardes[0],s[i].gardes[1],s[i].gardes[2]);
}
if(m==1) printf("输入学号有误,请重新输入:\n");
printf("_________________________________________________\n");
printf("\n是否继续查找学生信息:是请输入'1',否请输入‘0’:\t");
fflush(stdin);
scanf("%d",&m);
printf("\n_________________________________________________\n");
}
}
void fun_unini ( )
{
int len,i,n,j; //n表示科目的数目,len表示的是学生的个数
struct stu a[100]; //结构体个数代表学生个数
float sum[100]={0.0}; //进行储存总分
char ID[20]; //进行储存学号
char re ='Y';
printf("********************************欢迎使用方式二:**************************************\n\n");
printf("\n你将为多少学生和多少科目录入信息:请输入学生的位数和成科目成绩的位数:\t\t");
fflush(stdin);
scanf("%d%d",&len,&n);
printf("\n========================================================\n");
printf("请输入各位学生的信息:(1)ID、(2)姓名、(3)年龄、(4)性别、(5)各科成绩");
printf("\n========================================================\n");
for(i=0;i<len;i++)
{printf("\n请输入第%d位同学的ID、姓名、年龄、性别:\t",i+1);
fflush(stdin); //清楚缓存
scanf("%s %s %d %s",a[i].ID,a[i].name,a[i].age,a[i].sex); //输入信息
for(j=0;j<n;j++)
{ printf("\n请输入第%d位同学的第%d科成绩:\t",i+1,j+1), //输入成绩
fflush(stdin),
scanf("%f",&a[i].gardes[j]);}
printf("=================================================================\n\n");
}
for(i=0;i<len;i++) //求总分
for(j=0;j<n;j++)
{sum[i]+=a[i].gardes[j];}
while(re=='Y')
{
printf("通过学号查找学生信息,请输入学号:\t"); //提示输入学号进行查找学生信息
fflush(stdin);
gets(ID);
for(i=0;i<len;i++)
{
if(strcmp(a[i].ID,ID)==0) //进行学号检索
{printf("\n姓名:\t%s\n",a[i].name); //打印学生姓名
printf("各科成绩:\t");
for(j=0;j<n;j++) //打印学生各科成绩
printf("\t%7.2f",a[i].gardes[j]);
printf("\n总成绩:\t%7.2f\n",sum[i]); //打印出总成绩
}
}
printf("是否继续学号查找学生信息,是(Y),否(N):\t"); //提示是否继续进行查找学生的成绩
fflush(stdin); //清楚缓存
scanf("%c",&re);
printf("\n==================================================================\n\n");
}
}
解答:
根据需求分析和给出的代码,以下是对每一步骤的解释:
malloc
为每个学生分配一块内存空间,使用指针stu_score[i]指向该空间,用来存储学生的成绩信息。将输入的学生成绩信息存储到通讯录中。
查询通讯录中满足要求的信息:
在aver_fcourse函数中,使用循环遍历通讯录中的每一个学生的第一门课程成绩,累加求和,并通过参数传递的学生数量来计算平均分,最后输出结果。
插入新的通讯录信息:
malloc
为新学生分配一块内存空间,使用指针stu_score[i]指向该空间,用来存储新学生的成绩信息。将输入的新学生信息添加到通讯录中。
删除不需要的通讯录信息:
若不及格的课程数超过等于2门,则输出该学生的学号和全部课程成绩,并通过参数传递的学生数量和课程数量计算平均成绩。
查看所有的通讯录信息:
以上是对给出代码的功能和步骤的解释。根据需求分析,代码实现了一个学生通讯录管理系统,包括输入数据建立通讯录、查询满足要求的信息、插入新的通讯录信息、删除不需要的通讯录信息和查看所有通讯录信息的功能。
代码贴出来
c语言实现通讯录管理系统(附源码和详细注解)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<windows.h>
#include<math.h>
//描述了一个联系人
typedef struct Linkman {
char name[1024];
char gender[1024];
char age[1024];
char number[1024];
char address[1024];
}Linkman;
//描述了一个通讯录,里面包含了多个联系人,size是当前联系人数
typedef struct AddressList {
//把这个数组改成指针,通过malloc来动态分配内存
Linkman* persons;
//表示当前这个指针指向的数组的最大容量
int capacity;
int size;
}AddressList;
//创建一个全局变量
AddressList addressList;
//保存内容到文件(存档)
void save(AddressList* list) {
FILE* fp = fopen("E:/address_list.txt", "w");
//查看是否打开成功
if (fp == NULL) {
printf("打开存档文件失败\n");
return;
}
//使用fwrite来写
fwrite(list->persons, sizeof(Linkman), list->size, fp);
fclose(fp);
printf("存档成功\n");
}
//函数声明
//extern void save(AddressList* list);
//把文件中数据加载到内存中(读档)
void load(AddressList* list) {
FILE* fp = fopen("E:/address_list.txt", "r");
if (fp == NULL) {
printf("打开存档文件失败\n");
return;
}
//写文件中,一共要读多少个元素,直接通过size就知道了
//读文件中,一共要读多少元素就不好确定,只能一个一个读,直到读到文件末尾
while (1) {
if (list->size > list->capacity) {
list->capacity += 100;
list->persons = realloc(list->persons, sizeof(Linkman) * list->capacity);
}
size_t n = fread(&list->persons[list->size], sizeof(Linkman), 1, fp);
if (n == 0) {
//读到文件末尾了
break;
}
list->size++;
}
fclose(fp);
printf("读档成功!\n");
}
//初始化
void init(AddressList* list) {
list->size = 0;
list->capacity = 100;
list->persons = (Linkman*)malloc(sizeof(Linkman) * list->capacity);
//(list->num).name = { 0 };
}
int menu() {
printf("+----------------------------+\n");
printf("| 通讯录管理系统 |\n");
printf("+----------------------------+\n");
printf("| 1、添加联系人 |\n");
printf("| 2、查找一个联系人 |\n");
printf("| 3、修改联系人 |\n");
printf("| 4、删除联系人 |\n");
printf("| 5、展示所有联系人 |\n");
printf("| 6、清空所有联系人 |\n");
printf("| 7、以名字排序所有联系人 |\n");
printf("| 0、退出 |\n");
printf("+----------------------------+\n");
printf("请输入你的选择:");
int choice = 0;
scanf("%d", &choice);
return choice;
}
//添加联系人
void insert(AddressList* list) {
assert(list != NULL);
//通讯录满了的话就返回
/*if (list->size >= 1000) {
printf("通讯录已满\n");
return;
}*/
//进行扩容
if (list->size > list->capacity) {
list->capacity += 100;
list->persons = (Linkman*)realloc(list->persons, sizeof(Linkman) * list->capacity);
}
Linkman person = { 0 };
printf("请输入联系人姓名:");
scanf("%s", person.name);
printf("请输入联系人性别:");
scanf("%s", person.gender);
printf("请输入联系人年龄:");
scanf("%s", person.age);
printf("请输入联系人电话:");
scanf("%s", person.number);
printf("请输入联系人住址:");
scanf("%s", person.address);
//把联系人放在通讯录中
list->persons[list->size] = person;
list->size++;
printf("新增联系人成功\n");
//Sleep(2000); //显示两秒
//system("cls");
save(list);
}
//修改联系人
void change(AddressList* list) {
int id = 0;
printf("请输入你要修改的联系人的序号:");
scanf("%d", &id);
if (id < 0 || id > list->size - 1) {
printf("你的输入有误");
return;
}
Linkman* p = &list->persons[id];
printf("请输入修改后的联系人的姓名:");
scanf("%s", p->name);
printf("请输入修改后的联系人的性别:");
scanf("%s", p->gender);
printf("请输入修改后的联系人的年龄:");
scanf("%s", p->age);
printf("请输入修改后的联系人的电话:");
scanf("%s", p->number);
printf("请输入修改后的联系人的住址:");
scanf("%s", p->address);
printf("修改联系人成功!\n");
save(list);
}
//查找联系人
void find(AddressList* list) {
int id = 0;
printf("请输入要查看联系人的序号:");
scanf("%d", &id);
if (id < 0 || id > list->size - 1) {
printf("你的输入有误");
return;
}
for (int i = 0; i < list->size; i++) {
if (id == i) {
Linkman* p = &list->persons[i];
printf("姓名:%s\t性别:%s\t年龄:%s\t电话:%s\t住址:%s\n", p->name, p->gender, p->age, p->number, p->address);
printf("%s", list->persons[i].name);
}
}
}
//查看所有联系人
void show(AddressList* list) {
//printf("查看所有联系人\n");
for (int i = 0; i < list->size; i++) {
Linkman* p = &list->persons[i];
printf("[%d]\t%s\t%s\n", i, p->name, p->number);
}
printf("一共有%d个联系人\n", list->size);
}
//清空所有联系人
void empty(AddressList* list) {
int i = 0;
printf("确定要清空所有联系人吗,确定请按1,按其余键返回\n");
scanf("%d", &i);
if (i == 1) {
list->size = 0;
printf("删除成功!\n");
}
return;
save(list);
}
//按照姓名排序
void sort(AddressList* list) {
for (int i = 0; i < list->size - 1; i++) {
for (int j = 0; j < list->size - 1 - i; j++) {
Linkman* p1 = &list->persons[j];
Linkman* p2 = &list->persons[j + 1];
if (memcmp(p1->name, p2->name, sizeof(p1->name)) > 0) {
Linkman tmp = list->persons[j];
list->persons[j] = list->persons[j + 1];
list->persons[j + 1] = tmp;
}
}
}
printf("排序成功!\n");
save(list);
}
//删除一个联系人(逻辑删除)
void update(AddressList* list) {
int id = 0;
printf("请输入要删除的联系人的序号:\n");
scanf("%d", &id);
if (id < 0 || id > list->size) {
printf("你的输入有误\n");
return;
}
else if (id == list->size - 1) {//要删除的是最后一个联系人
list->size--;
printf("删除成功!\n");
}
//取出最后一个联系人的地址
Linkman* p = &list->persons[list->size - 1];
list->persons[id] = *p;
list->size--;
printf("删除成功!\n");
save(list);
}
//定义一个函数指针
typedef void(*Func)(AddressList*);
int main() {
init(&addressList);
//定义一个函数指针数组
load(&addressList);//程序启动前进行一次读档即可
//为了降低圈复杂度,采用转移表的方式
Func func[] = { NULL,insert,find,change,update,show,empty,sort };//NULL纯粹为了占位
while (1) {
int choice = menu();
if (choice == 0) {
printf("goodbye\n");
break;
}
else if (choice < 0 || choice > 7) {
printf("你的输入有误,请重新输入\n");
continue;
}
func[choice](&addressList);
system("pause");
system("cls");
//Func func = func[choice]
//func(&addressList)
}
system("pause");
//当前这个数组的生命周期本就应该跟随整个程序,既然这个数组一直不需要用,就不能提前释放
//当程序结束,内存会被系统自动回收
}
你现在的代码好像值实现了一个功能,其他功能还没有实现。
具体代码可以参考:
学生通讯录管理系统【用 结构数组 实现 通讯录管理】【C语言】:https://blog.csdn.net/weixin_44949135/article/details/116310153
c语言实现通讯录管理系统(附源码和详细注解):https://blog.csdn.net/weixin_62042704/article/details/121233195
把已经写好的代码贴出来呀,不要截图