-
2022-04-05 16:22:57
大一c++练习作业黑框程序,由链表实现,所有功能都测试通过。应该没有太大的问题,仅供参考。
#include<iostream> #include<string> using namespace std; struct Student {//学生信息结构体 int s_number;//学号 string s_name;//姓名 string s_sex;//性别 string s_phone;//电话 string s_school;//所属学院 Student* next; }; void myprint() {// 显示通讯录主菜单函数定义 cout << "************************" << endl; cout << "***** 1.创建通讯录 *****" << endl; cout << "***** 2.显示通讯录 *****" << endl; cout << "***** 3.查询通讯录 *****" << endl; cout << "***** 4.添加通讯录 *****" << endl; cout << "***** 5.修改通讯录 *****" << endl; cout << "***** 6.删除通讯录 *****" << endl; cout << "***** 7.排序通讯录 *****" << endl; cout << "***** 0.退出通讯录 *****" << endl; cout << "************************" << endl; } Student* mycreat() {// 创建通讯录信息函数定义 Student* head, * p1, * p2; int n = 0; head = NULL; p1 = p2 = new Student; cout << "请依次输入学生的学号,姓名,性别,手机号码,所属学院(最后一组数据全输入0退出)" << endl; cin >> p1->s_number >> p1->s_name >> p1->s_sex >> p1->s_phone >> p1->s_school; while (p1->s_number != 0) { n = n + 1; if (n == 1)head = p1; else p2->next = p1; p2 = p1; p2->next = p1; p1 = new Student; cin >> p1->s_number >> p1->s_name >> p1->s_sex >> p1->s_phone >> p1->s_school; } p2->next = NULL; cout << "已成功创建一个学生通讯录" << endl; system("pause"); system("cls"); return head; } void mydisplay(Student *head) {// 显示通讯录信息函数定义 Student* p1; p1 = head; while (p1 != NULL) { cout << p1->s_number <<"\t" << p1->s_name << "\t" <<p1->s_sex << "\t" << p1->s_phone << "\t" << p1->s_school << endl; p1 = p1->next; } system("pause"); system("cls"); } void mysearch(Student* head) {// 查询通讯录信息函数定义 int ans; cout << "请选择根据何种方式查询(1.学号 2.姓名 3.性别 4.电话 5.学院)" << endl; cin >> ans; void search1(Student *head); void search2(Student * head); void search3(Student * head); void search4(Student * head); void search5(Student * head); switch (ans) { case 1:search1(head); break; case 2:search2(head); break; case 3:search3(head); break; case 4:search4(head); break; case 5:search5(head); break; } } void search1(Student* head) {//学号查找 int num; Student* p; p = head; cout << "************************" << endl; cout << "请输入需要查找学生的学号" << endl; cin >> num; bool finded = false; while (p != NULL) { if (p->s_number == num) { finded = true; cout << p->s_number << "\t" << p->s_name << "\t" << p->s_sex << "\t" << p->s_phone << "\t" << p->s_school << endl; } p = p->next; } if (!finded) { cout << "没有查询到该同学的信息" << endl; } system("pause"); system("cls"); } void search2(Student* head) {//姓名查找 string name; Student* p; p = head; cout << "************************" << endl; cout << "请输入需要查找学生的姓名" << endl; cin >> name; bool finded = false; while (p != NULL) { if (p->s_name == name) { finded = true; cout << p->s_number << "\t" << p->s_name << "\t" << p->s_sex << "\t" << p->s_phone << "\t" << p->s_school << endl; } p = p->next; } if (!finded) { cout << "没有查询到该同学的信息" << endl; } system("pause"); system("cls"); } void search3(Student* head) {//性别查找 string sex; Student* p; p = head; cout << "************************" << endl; cout << "请输入需要查找学生的性别" << endl; cin >> sex; bool finded = false; while (p != NULL) { if (p->s_sex == sex) { finded = true; cout << p->s_number << "\t" << p->s_name << "\t" << p->s_sex << "\t" << p->s_phone << "\t" << p->s_school << endl; } p = p->next; } if (!finded) { cout << "没有查询到该同学的信息" << endl; } system("pause"); system("cls"); } void search4(Student* head) {//电话查找 string phone; Student* p; p = head; cout << "************************" << endl; cout << "请输入需要查找学生的电话" << endl; cin >> phone; bool finded = false; while (p != NULL) { if (p->s_phone == phone) { finded = true; cout << p->s_number << "\t" << p->s_name << "\t" << p->s_sex << "\t" << p->s_phone << "\t" << p->s_school << endl; } p = p->next; } if (!finded) { cout << "没有查询到该同学的信息" << endl; } system("cls"); } void search5(Student* head) {//学院查找 string school; Student* p; p = head; cout << "************************" << endl; cout << "请输入需要查找学生的学院" << endl; cin >> school; bool finded = false; while (p != NULL) { if (p->s_school == school) { finded = true; cout << p->s_number << "\t" << p->s_name << "\t" << p->s_sex << "\t" << p->s_phone << "\t" << p->s_school << endl; } p = p->next; } if (!finded) { cout << "没有查询到该同学的信息" << endl; } system("pause"); system("cls"); } Student *myadd(Student *head,int number,string name,string sex,string phone,string school) {// 添加通讯录信息函数定义 Student* p0, * p1, * p2; p1 = head; p2 = new Student; p0 = new Student; // 插入节点 p0->s_number = number;// 插入数据 p0->s_name = name; p0->s_sex = sex; p0->s_phone =phone; p0->s_school = school; if (head == NULL) { head = p0; p0->next = NULL; } else while (p0->s_number > p1->s_number && p1->next != NULL) { p2 = p1; p1 = p1->next;// p0,p1和p2位置: p2->p1->p0 } if (p0->s_number <= p1->s_number) { if (p1 == head) {// 头部前段插入 p0和p1位置: p0->p1->... head = p0; p0->next = p1; } else {// 插入中间节点 p0,p1和p2位置: p2-> p0 -> p1 p2->next = p0; p0->next = p1; } } else { // 尾部插入节点 p0,p1和p2位置: p2->p1->p0->NULL p1->next = p0; p0->next = NULL; } cout << "已成功添加该学生的信息" << endl; system("pause"); system("cls"); return head; } void mymodify(Student *head) {// 修改通讯录信息函数定义 int ans; cout << "请先查询需要修改信息的同学(1.姓名 2.学号)" << endl; cin >> ans; if (ans == 1) { string name,sex,phone,school; int ans2,number; Student* p; p = head; cout << "************************" << endl; cout << "请输入需要查找学生的姓名" << endl; cin >> name; bool finded = false; while (p != NULL) { if (p->s_name == name) { finded = true; cout << p->s_number << "\t" << p->s_name << "\t" << p->s_sex << "\t" << p->s_phone << "\t" << p->s_school << endl; cout << "请输入需要修改的信息(1.学号 2.姓名 3.性别 4.电话 5.学院)" << endl; cin >> ans2; switch (ans2) { case 1:cout << "请输入修改后的学号" << endl; cin >> number; p->s_number = number; break; case 2:cout << "请输入修改后的姓名" << endl; cin >> name; p->s_name = name; break; case 3:cout << "请输入修改后的性别" << endl; cin >> sex; p->s_sex = sex; break; case 4:cout << "请输入修改后的电话" << endl; cin >> phone; p->s_phone = phone; break; case 5:cout << "请输入修改后的学院" << endl; cin >> school; p->s_school = school; break; } break; } p = p->next; } cout << "已成功修改该学生的信息" << endl; if (!finded) { cout << "没有查询到该同学的信息" << endl; } } else if (ans == 2) { string name, sex, phone, school; int ans2, number; Student* p; p = head; cout << "************************" << endl; cout << "请输入需要查找学生的学号" << endl; cin >> number; bool finded = false; while (p != NULL) { if (p->s_number == number) { finded = true; cout << p->s_number << "\t" << p->s_name << "\t" << p->s_sex << "\t" << p->s_phone << "\t" << p->s_school << endl; cout << "请输入需要修改的信息(1.学号 2.姓名 3.性别 4.电话 5.学院)" << endl; cin >> ans2; switch (ans2) { case 1:cout << "请输入修改后的学号" << endl; cin >> number; p->s_number = number; break; case 2:cout << "请输入修改后的姓名" << endl; cin >> name; p->s_name = name; break; case 3:cout << "请输入修改后的性别" << endl; cin >> sex; p->s_sex = sex; break; case 4:cout << "请输入修改后的电话" << endl; cin >> phone; p->s_phone = phone; break; case 5:cout << "请输入修改后的学院" << endl; cin >> school; p->s_school = school; break; } break; } p = p->next; } cout << "已成功修改该学生的信息" << endl; if (!finded) { cout << "没有查询到该同学的信息" << endl; } } system("pause"); system("cls"); } Student *mydelete(Student *head) {// 删除通讯录信息函数定义 int ans; char c; cout << "请选择根据何种方式确定需要删除学生(1.学号 2.姓名)" << endl; cin >> ans; if (ans == 1) { int number; cout << "请输入需要删除的学生学号" << endl; cin >> number; struct Student* p1, * p2 = NULL; if (head == NULL) { cout << "通讯录为空\n"; } p1 = head; while (number!= p1->s_number && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (number == p1->s_number) { cout << p1->s_number << "\t" << p1->s_name << "\t" << p1->s_sex << "\t" << p1->s_phone << "\t" << p1->s_school << endl; cout << "确定要删除该同学的信息吗?(是:y,否:n)" << endl; cin >> c; if (c == 'n') return head; else { if (number == head->s_number)head = p1->next; else p2->next = p1->next; } cout << "已成功删除该同学的信息" << endl; } else cout << "通讯录中没有录入该同学的信息\n"; system("pause"); system("cls"); return head; } else if(ans==2) { string name; char c; cout << "请输入需要删除的学生姓名" << endl; cin >> name; struct Student* p1, * p2 = NULL; if (head == NULL) { cout << "通讯录为空\n"; } p1 = head; while (name != p1->s_name && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (name == p1->s_name) { cout << p1->s_number << "\t" << p1->s_name << "\t" << p1->s_sex << "\t" << p1->s_phone << "\t" << p1->s_school << endl; cout << "确定要删除该同学的信息吗?(是:y,否:n)" << endl; cin >> c; if (c == 'n') return head; else { if (name == head->s_name)head = p1->next; else p2->next = p1->next; } cout << "已成功删除该学生的信息" << endl; } else cout << "通讯录中没有录入该同学的信息\n"; system("pause"); system("cls"); return head; } } void mysort(Student *head) {// 通讯录信息排序函数定义 Student* p; int temp, temp3; string temp1, temp2; int flag; while (true) { flag = 0; for (p = head; p->next != NULL; p = p->next) { if (p->s_number > p->next->s_number) { temp = p->s_number; p->s_number = p->next->s_number; p->next->s_number = temp; string temp2 = p->s_name; p->s_name = p->next->s_name; p->next->s_name = temp2; string temp3 = p->s_sex; p->s_sex = p->next->s_sex; p->next->s_sex = temp3; string temp4 = p->s_phone; p->s_phone = p->next->s_phone; p->next->s_phone = temp4; string temp5 = p->s_school; p->s_school = p->next->s_school; p->next->s_school = temp5; flag = 1; } } if (flag == 0)break; } cout << "已完成按照学号(从小到大)排序" << endl; system("pause"); system("cls"); } int main() { cout << "欢迎使用学生通讯录管理系统^_^" << endl; int select = 0;//创建用户选择的变量 Student* head = NULL; int number; string name, sex, phone, school; while (true) { myprint();//菜单的调用 cin >> select; switch (select) { case 1://1.创建通讯录 head=mycreat(); break; case 2://2.显示通讯录 mydisplay(head); break; case 3://3.查询通讯录 mysearch(head); break; case 4://4.添加通讯录 cout << "请输入需要添加的学生信息(学号,姓名,性别,电话,学院)" << endl; cin >> number >> name >> sex >> phone >> school; head = myadd(head, number, name, sex, phone, school); break; case 5://5.修改通讯录 mymodify(head); break; case 6://6.删除通讯录 head=mydelete(head); break; case 7://7.排序通讯录 mysort(head); break; case 0://0.退出通讯录 cout << "欢迎下次使用!^_^" << endl; system("pause"); return 0; break; default: break; } } system("pause"); return 0; }
更多相关内容 -
学生通讯录管理系统
2020-12-01 21:39:45本系统可实现学生通讯录的信息管理,便于老师、同学进行管理、分析和使用。系统的主要功能如下: ①输入数据建立通讯录。建立通讯录系统,可以一次输入多个成员通讯录的信息,建立通讯录; ②查询通讯录中满足要求的... -
学生通讯录管理系统-数据结构课程设计.doc
2021-10-20 21:30:44学生通讯录管理系统-数据结构课程设计.doc 纸质通讯录已经不能满足大家的要求,容易丢失、查找困难等问题是纸质通讯录所有能克服的缺点。“学生通讯录管理系统”是为了帮助老师、同学等管理和分析的一种应用程序。 -
基于C++的学生通讯录管理系统课程设计报告+源代码
2019-12-26 21:06:22学生通讯系统的设计与实现 学生通讯系统信息包括:姓名、学号、性别、家庭住址、联系电话、等信息。现要求编写程序来完成如下功能: 1.学生通讯信息的输入 2.学生通讯信息的显示 3.学生通讯信息的统计 4.学生... -
数据结构 课程设计报告城市链表学生通讯录管理系统.pdf
2020-06-10 10:55:23数据结构课程设计报告 数据结构课程设计报告 ( 20122013 年度第一学期) 课程名称 数据结构课程设计 题 目一 2.2 学生通讯录管理系统 题 目二 2.4.3 城市链表 院 系 计算机科学系 班 级 10 级软件本一 姓 名 学 号 ... -
学生通讯录管理系统.c
2020-03-25 18:55:48学生通讯录管理系统 主要内容: 本系统可实现学生通讯录的信息管理,便于老师、同学进行管理、分析和使用。系统的主要功能如下: ①输入数据建立通讯录。建立通讯录系统,可以一次输入多个成员通讯录的信息,建立... -
C++控制台学生通讯录管理系统(类实现)
2015-05-13 11:28:22C++控制台学生通讯录管理系统,用面向对象方式编写,的利用类,指针,单链表,文件读取等C++的知识,功能有建立通讯录,添加,修改,插入,查询,删除,保存等功能其中数据库保存功能自动实现;采用多文件连编。用... -
用C++语言实现学生通讯录管理系统-课程设计正文和源代码
2019-12-26 19:47:56摘 要:本课程设计设计一个实用的小型通讯录管理系统,用文件来存储学生的姓名、电话、QQ号码、邮编、地址等信息,完成对信息的添加、删除、查询、显示所有信息,退出及用双向链表来处理修改等操作。 在本课程设计中,... -
学生通讯录管理系统学生通讯录管理系统.doc
2022-07-02 22:26:12学生通讯录管理系统学生通讯录管理系统 -
《学生通讯录管理系统》
2021-06-19 16:34:05《学生通讯录管理系统》一、需求二、设计内容三、设计要求四、总体设计五、详细设计①输入模块设计思路②查找模块设计思路③删除模块设计思路④修改模块设计思路⑤排序模块设计思路⑥显示模块设计思路⑦菜单模块设计...《学生通讯录管理系统》
一、需求
设计出通讯录信息管理系统所需要的基本功能,并设计出合理选择的界面。
二、设计内容
- 1.通过提示菜单选择操作
- 2.输入信息
- 3.显示所有信息,要求输出格式美观
- 4.按学号排序
- 5.插入一个学生通讯信息
- 6.查找指定学号的学生通讯信息
- 7.删除指定学号的学生通讯信息
三、设计要求
- 1.必须采用结构体数组实现
- 2.必须有菜单选项
- 3 .必须用c语言完成
- 4.必须使用文件保存数据
四、总体设计
- 本次设计包含菜单模块、输入模块、查找模块、删除模块、修改模块、排序模块、显示模块七大模块。 - 利用七大模块实现学生通讯录信息的增删改查及用户操作和数据的显示。
五、详细设计
①输入模块设计思路
1、 定义指向文件的指针变量用来创建文件储存输入的学生信息;
2、 定义两个整型变量,用来标记所含用户的个数,方便后续对数据的重新录入;
3、 根据用户输入的学号来判别输入的信息是否重复;
4、 采用结构体数组保存用户信息;
5、 录入信息后,用选择语句检测用户是否需要继续录入;②查找模块设计思路
1、 定义指针变量指向保存数据的文件,用来对数据的读取;
2、 定义两个整型变量,用来标记用户个数,以及对数据的遍历以及用于判断该学号联系人是否存在;
3、 通过对学号的比较对用户进行查找;③删除模块设计思路
1、 定义指向文件的指针变量指向保存数据的文件,用来对数据的读写;
2、 定义三个整型变量,分别用来标记用户个数,删除数据后新数组的构成;
3、 通过学号查找想要删除学生;
4、 显示所有人的信息方便用户选择自己想要删除的对象④修改模块设计思路
1、 定义指针变量指向文件,用于获取和录入修改后数据;
2、 定义三个整型变量,用来标记用户个数,以及后续的录入;
3、 通过指定的学号查找通讯录成员,并对其的数据重新录入;⑤排序模块设计思路
1、 定义指针变量指向文件,录入数据;
2、 定义三个整型变量,用来对排序步骤数据交换的处理,以及标记个数;
3、 定义同类型的结构体作为排序时候的中间变量;⑥显示模块设计思路
1、 定义宏,用于数据输出格式的固定化,提高代码可读性;
2、 定义指向文件的指针变量,实现数据的录入;
3、 定义整型变量,标记用户个数以及对数据的输出;⑦菜单模块设计思路
1、 采用清屏,提高界面的简洁;
2、 利用输出函数打印菜单;六、各函数功能模块的介绍
①main函数
1、 首先用printf函数打印出进入时候的一个界面;
2、 用while语句实现各功能模块的重复选择;
3、 用switch-case语句实现菜单各功能的控制;②input函数
1、 固名思义,input函数用来实现联系人的录入功能;
2、 首先将文件中的数据录入数组中,然后根据数组的数据与用户输入的数据进行比较,判断该联系人是否已经存在;
3、 若不存在,则进行数据的录入;
4、 将数据录入文件中保存;③search函数
1、 用search函数实现对联系人的查找;
2、 根据用户输入的学号,遍历数据,若找到则提示用户是否需要输出,若未找到则输出提示用户无该联系人信息;④deleted函数
1、 利用deleted函数实现对数据的删除;
2、 根据用户输入的学号,查找联系人,若无,则提示用户该联系人不存在,若存在,则输出联系人的信息,提示用户是否确定删除;
3、 对删除后的数据进行重新整合,并录入文件中保存;⑤update函数
1、 利用update函数实现数据的修改更新;
2、 根据用户输入的学号查找联系人,若联系人存在,则提示用户重新输入联系人的信息,实现对数据的修改。若不存在,则提示用户联系人不存在;
3、 对修改后的数据进行整合,并录入文件中保存;⑥sort函数
1、 利用sort函数实现数据的排序;
2、 根据学号的大小进行选择排序;⑦display函数
1、 利用display函数实现数据显示;
2、 将文件中的数据读取到数组中,依次将数组的各个元素输出;
3、 采用宏定义输出格式,提高代码简洁度;⑧menu函数
1、 利用menu函数对用户菜单的打印;
2、 使用printf函数打印界面;
3、 使用system(“cls”)进行清屏,使页面整洁;七、实验结果
1、进入界面 2、菜单选择界面 3、输入模块 4、排序模块和显示模块 5、查找模块 6、修改模块 7、数据删除模块 8、退出界面
八、总结体会
- 本次设计完成了课程设计题目全部内容和要求的实现。实现了对学生通讯录的增删改查,界面的设计以及菜单选择功能。在对代码的不断的修改和改进的过程中,使通讯录系统功能越加完善,体验感越来越强。本次设计初步计划使用链表来实现,可结构体数组对于通讯录系统的查找和排序等功能更加容易实现且运行速度更快,故改变使用结构体数组来实现通讯录系统的数据保存。此次课程设计的制作过程,在项目之前要提前计划好所要实现的功能,需要什么模块来实现这些功能,实现这些功能需要什么知识,如何才能够将这些功能连接起来,这样你实现它的时候就能有一个清楚的认识,不至于迷茫。对于一个系统,我们首先要搭建它的功能模块,而不是一个模块一个模块的全部先写出来。而对于此次设计,还有一些想法由于时间和知识的欠缺还未能实现,比如,如何更好的实现用户的修改,对用户想要更改的特定数据进行特定更改;如何对数据的实时保存,本次课设的在使用功能模块时不能中途关闭程序,否则数据会丢失,而对于用户不小心退出程序,数据丢失这个bug如何修复是后续改进的重点。
九、参考文献
1、谭浩强第五版《c语言程序设计》
十、附录(代码清单)
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h> #define LEN sizeof(struct student) //定义结构体的长度// #define DATAOUT "%-10s%-20s%-15s%-25s%-20s%\n" //这个宏规定了输出的格式// #define DATA stu[i].name,stu[i].id,stu[i].tel,stu[i].email,stu[i].address //代表结构体数组元素中的各个成员// //定义结构体成员// struct student { char name[10]; char id[20]; char tel[15]; char email[25]; char address[30]; }; struct student stu[100]; //定义结构体数组// //声明程序中要用到的函数// void input (); void search (); void update (); void deleted(); void display(); void sort (); void menu (); //菜单打印模块 // void menu() { system("cls"); //清屏// printf("\n\n"); //控制主功能菜单设计// printf("\t\t\t\t\t============学生通讯录管理系统==============\n\n"); printf("\t\t\t\t\t********************************************\n\n"); printf("\t\t\t\t\t\t\t0. 退出系统\t\t\t\n\n"); printf("\t\t\t\t\t\t\t1. 记录数据\t\t\t\n\n"); printf("\t\t\t\t\t\t\t2. 查找数据\t\t\t\n\n"); printf("\t\t\t\t\t\t\t3. 修改数据\t\t\t\n\n"); printf("\t\t\t\t\t\t\t4. 删除数据\t\t\t\n\n"); printf("\t\t\t\t\t\t\t5. 数据排序\t\t\t\n\n"); printf("\t\t\t\t\t\t\t6. 查看数据\t\t\t\n\n"); printf("\t\t\t\t\t********************************************\n\n"); printf("\t\t\t\t\t============学生通讯录管理系统==============\n\n"); printf("\t\t\t\t\t请输入你的选择(0-6):"); } //输入模块 // void input() { int i,count=0; //记录通讯录中联系人个数的变量// char ch[2]; //记录用户的输入// FILE *fp; //定义指向文件的指针变量// if((fp=fopen("D:\\data.txt","a+"))==NULL) //调用fopen函数创建一个新的文本来保存联系人信息// { printf("创建文件失败!\n"); return; } while (!feof(fp)) //判断文件是否结束// { if (fread(&stu[count], LEN, 1, fp)==1) //使用fread函数将文件中的记录逐条读取到结构体数组// count++; } fclose(fp); //关闭文件// if (count==0) //判断当前通讯录是否为空// printf("通讯录为空!\n"); else { display(); //显示联系人的所有信息// } if ((fp=fopen("D:\\data.txt", "wb"))==NULL) //如果打开文件失败// { printf("无法打开文件!\n"); return; } //将数据重写入磁盘// for (i = 0; i < count; i++) fwrite(&stu[i], LEN, 1, fp); printf("是否继续输入(y/n):"); //提示用户输入// scanf("%s",ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) //判断用户是否需要输入// { printf("学号:"); scanf("%s", &stu[count].id); //判断用户输入学号在通讯录中是否存在// for(i=0;i<count;i++) if (strcmp(stu[i].id, stu[count].id) == 0) { printf("该用户已经存在!\n"); fclose(fp); return; } printf("姓名:"); scanf("%s", &stu[count].name); printf("电话:"); scanf("%s", &stu[count].tel); printf("邮箱:"); scanf("%s", &stu[count].email); printf("地址:"); scanf("%s", &stu[count].address); if (fwrite(&stu[count], LEN, 1, fp) != 1) //将新建联系人信息保存到磁盘// { printf("无法保存数据!"); getch(); } else { printf("学号为%s的学生信息保存成功!\n", stu[count].id); count++; } printf("是否继续输入?(y/n):"); loop1:scanf("%s",ch); } if(strcmp(ch,"N") != 0 && strcmp(ch,"n") != 0) { printf("输入错误,请重新输入(y/n):"); goto loop1; } else { printf("录入联系人信息完成!!!\n"); fclose(fp); return ; } fclose(fp); printf("录入联系人信息完成!!!\n"); } //查找模块// void search() { FILE *fp; int i, count = 0; char ch[2], id[20]; //定义数组接收用户的输入信息// //打开磁盘,并将磁盘中的通讯录逐条读取到内存结构体数组// if ((fp = fopen("D:\\data.txt","rb")) == NULL) { printf("无法打开文件!\n"); return; } while (!feof(fp)) //判断是否到达文件的尾部// if (fread(&stu[count], LEN, 1, fp) == 1) count++; //count终值为通讯录条目// fclose(fp); if (count == 0) { printf("通讯录为空!\n"); return; } printf("请输入学生学号:"); scanf("%s",id); //查找通讯录指定信息,运用字符比较函数// for(i=0;i<count;i++) if (strcmp(id, stu[i].id) == 0) { printf("此人信息存在,是否显示?(y/n):"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("姓名\t 学号\t\t 电话 \t 邮箱 \t\t 地址\t\n"); printf(DATAOUT,DATA); } break; } //判断循环结束是因为没有找到联系人还是因为找到了但是没有显示联系人信息// if (i == count) printf("查询不到该联系人!\n"); } //修改模块 void update() { FILE* fp; int i, j, count = 0; char id[20]; if ((fp = fopen("D:\\data.txt", "r+")) == NULL) { printf("无法打开!\n"); return; } while (!feof(fp)) if (fread(&stu[count], LEN, 1, fp) == 1) count++; if (count == 0) { printf("通讯录为空!\n"); fclose(fp); return; } display(); //修改联系人信息// printf("请输入要修改联系人的学号!\n"); printf("学号:"); scanf("%s", &id); for (i = 0; i < count; i++) { if (strcmp(id, stu[i].id) == 0) { printf("该联系人存在!请输入修改信息!\n"); printf("姓名:"); scanf("%s", &stu[i].name); printf("学号:"); scanf("%s", &stu[i].id); printf("电话:"); scanf("%s", &stu[i].tel); printf("邮箱:"); scanf("%s", &stu[i].email); printf("地址:"); scanf("%s", &stu[i].address); printf("修改成功!"); //打开磁盘,将修改后的联系人信息写入磁盘// if ((fp = fopen("D:\\data.txt", "wb")) == NULL) { printf("无法打开文件!\n"); return; } for (j = 0; j < count; j++) if (fwrite(&stu[j], LEN, 1, fp) != 1) { printf("保存失败!"); getch(); } fclose(fp); return; } } printf("该联系人不存在!\n"); //没有找到该条联系人信息// } //删除模块 void deleted() { FILE* fp; int i, j, count = 0; char ch[2]; char id[15]; if ((fp = fopen("D:\\data.txt", "r+")) == NULL) { printf("无法打开文件!\n"); return; } while (!feof(fp)) if (fread(&stu[count], LEN, 1, fp) == 1) count++; fclose(fp); if (count == 0) { printf("通讯录为空!\n"); return; } display(); //删除联系人信息// printf("请输入要删除联系人的学号:"); scanf("%s",id); for (i = 0; i < count; i++) { if (strcmp(id, stu[i].id) == 0) { printf("该联系人的身份信息如下:\n"); printf("姓名\t 学号\t\t 电话 \t 邮箱 \t\t 地址\t\n"); printf(DATAOUT, DATA); printf("确定要删除吗?(y/n)"); loop2:scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { for (j = i; j < count; j++) stu[j] = stu[j + 1]; count--; printf("删除成功!\n"); } else if(strcmp(ch,"N") != 0 && strcmp(ch,"n") != 0) { printf("输入错误,请重新输入(y/n):"); goto loop2; } else printf("取消删除!\n"); //将删除后的通讯录写入对应的磁盘文件// if ((fp = fopen("D:\\data.txt", "wb")) == NULL) { printf("无法打开!\n"); return; } for(j=0;j<count;j++) if (fwrite(&stu[j], LEN, 1, fp) != 1) { printf("保存失败!\n"); getch(); } fclose(fp); return; } } printf("查询不到该联系人!\n"); } //排序模块 void sort() { FILE* fp; struct student p; int i = 0, j = 0, count = 0; if ((fp = fopen("D:\\data.txt", "r+")) == NULL) { printf("无法打开文件!\n"); return; } while (!feof(fp)) if (fread(&stu[count], LEN, 1, fp) == 1) count++; fclose(fp); if (count == 0) { printf("通讯录为空!\n"); return; } for(i=0;i<count-1;i++) for(j=i+1;j<count;j++) if (strcmp(stu[i].id, stu[j].id) > 0) { p = stu[i]; stu[i] = stu[j]; stu[j] = p; } if ((fp = fopen("D:\\data.txt", "wb")) == NULL) { printf("无法打开文件!\n"); return; } for(i=0;i<count;i++) if(fwrite(&stu[i],LEN,1,fp)!=1) { printf("保存失败!\n"); getch(); } fclose(fp); printf("排序成功!\n"); } //显示模块 void display() { FILE* fp; int i, count = 0; fp = fopen("D:\\data.txt", "rb"); //以只读的方式打开文件// //读取文件通讯录// while (!feof(fp)) { if (fread(&stu[count], LEN, 1, fp) == 1) count++; } fclose(fp); //关闭文件// system("cls"); printf("以下为全部联系人的信息:\n"); printf("\n"); printf("姓名\t 学号\t\t 电话 \t 邮箱 \t\t 地址\t\n"); for (i = 0; i < count; i++) printf(DATAOUT, DATA); } //主函数// int main() { printf("\n\n\n\n\n\n\n"); printf("\t\t\t\t==============================================\n\n"); printf("\t\t\t\t**********************************************\n\n"); printf("\t\t\t\t**********欢迎使用学生通讯录管理系统**********\n\n"); printf("\t\t\t\t*************期待你有个好的体验 !!************\n\n"); printf("\t\t\t\t**********************************************\n\n"); printf("\t\t\t\t==============================================\n\n"); printf("\t\t\t\t\t 按任意键进入主菜单\n"); getch(); int n; menu(); //调用主菜单// while (1) //选择相应的功能// { loop:scanf("%d",&n); //用户选择功能// switch (n) { case 0: printf("\n\t\t\t\t\t\t ***欢迎下次使用***\t\t\t\n"); printf("\t\t\t\t\t=============================================\n"); exit(0); break; case 1: input(); //输入模块// break; case 2: search(); //查找模块// break; case 3: update(); //修改模块// break; case 4: deleted(); //删除模块// break; case 5: sort(); //排序模块// break; case 6: display(); //显示模块// break; default:printf("您的输入有误,请重新输入(0~6):\n"); //重新输入 goto loop; break; } system("pause"); menu(); //再次调用主菜单// } return 0; }
-
学生通讯录管理系统的设计与实现
2022-04-23 22:47:101. 学生通讯录管理系统的设计与实现 1.1 问题的描述 学生通讯录管理系统是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和分析的一种应用程序。 1.2 问题分析和任务定义 (1)输入数据建立...1. 学生通讯录管理系统的设计与实现
1.1 问题的描述
学生通讯录管理系统是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和分析的一种应用程序。
1.2 问题分析和任务定义
(1)输入数据建立通讯录;
(2)查询通讯录中满足要求的信息;
(3)插入新的通讯录信息;
(4)删除不需要的通讯录信息;
(5)查看所有的通讯录信息。
1.3 数据类型和系统设计
(1)存储结构设计
采用链表来存储“学生通讯信息”,其中链表结点有4个分量构成:通讯录成员学号、姓名、电话号码、指向下一个成员的指针。
(2)系统功能设计
本系统设置了5个子功能菜单,5个子功能的设计描述如下:
① 建立通讯录系统。可以一次输入多个成员通讯录的信息,建立通讯录。该功能有由creatIncreLink() 函数实现。
② 插入通讯录记录。每次可以插入一个成员通讯录的信息,如果要连续插入多个成员通讯录信息必须多次选择该功能。该功能由insertYouXu() 函数实现。
③ 查询通讯录记录。可以按两种方式查询所需要的通讯录成员记录,一是按学号查询,而是按姓名查询。分别由searchNum() 和searchName() 函数实现。
④ 删除通讯记录。可以对通讯录中不再需要的信息进行删除。有三种删除方式,按序号进行删除,按学号进行删除和按姓名进行删除。分别由deleteElem() ,delNum() 和delName() 三个函数实现。
⑤ 显示通讯录记录。可以查看通讯录中所有通讯录成员记录。该功能由printList() 函数实现。
(3)系统主界面的设计
为了实现学生通讯管理系统各功能的管理,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。本系统主控菜单运行界面如图1所示。
图1 “学生通讯录管理系统”主菜单
1.4 编码实现
(1)链表结点类型的定义
typedef struct LNode
{ int number;
double telenum;
char name[20];
struct LNode *next;
}LNode,*LinkList;
(2)建立链表的函数,主要用来建立通讯录。
LinkList creatIncreLink() //创建一个存放通讯录成员的非递减有序表,返回头结点地址
{ LinkList L=(LinkList)malloc(LEN); //头结点
L->next=NULL;
LinkList p;
int num=1;
int number;
double telenum;
char name[20];
printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结束标志\n");
printf("请输入学号 %d:",num);
scanf("%d",&number);
printf("请输入姓名 %d: ",num);
char temp=getchar();
gets(name);
printf("请输入电话号码 %d:",num);
scanf("%lf",&telenum);
while (number>=0)
{
p=(LinkList)malloc(LEN); //新结点
p->number=number;
p->telenum=telenum;
strcpy(p->name,name);
insertYouXu(L,p); //有序的插入新结点
num++;
printf("请输入学号 %d:",num);
scanf("%d",&number);
printf("请输入姓名 %d: ",num);
temp=getchar();
gets(name);
printf("请输入电话号码 %d:",num);
scanf("%lf",&telenum);
} return(L);
}
(3)插入通讯记录
void insertYouXu(LinkList L,LinkList Elem)
{ //插入一个元素,使原有序表仍为有序
LinkList p=L->next;
while(p!=NULL && Elem->number>=p->number)
{
if(p->number==Elem->number)
{ printf("重复输入!!\n");return;
}
p=p->next;
} //确定Elem插入的位置
if(p==NULL)
{
p=prior(L,p); Elem->next=NULL;p->next=Elem;
}
else //若为空表,插到头结点之后
{ p=prior(L,p); Elem->next=p->next; p->next=Elem;
}
}
(4)按学号查询通讯录记录
int searchNum(LinkList L,int n)
{ // 按学号查找通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL) printf("该链表中没有元素,查找失败\n");
else {
while(p !=NULL)
{
if(p->number<=n)
if(p->number==n)
{ flag=1;
printf("要查找的是第%d位通讯者:\n",seat);
printf(" 学号: %d 姓名: %s 电话号码.:%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;seat++;//!!!!
}
}
return flag;
}
(5)按姓名查询通讯录记录
int searchName(LinkList L,char n[])
{ // 按姓名查找通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL||L==NULL)
printf("该通讯录中没有元素,查找失败\n");
else {
while(p !=NULL)
{
if(!strcmp(p->name,n))
{
flag=1;
printf("要查找的是第%d位通讯者:\n",seat);
printf(" Number: %d Name: %s TeleNo.:%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;seat++;//!!!!!
}
} return flag;
}
(6)按序号进行删除,删除通讯录第i个元素
void deleteElem(LinkList L,int i) //从通讯录中删除第i个元素
{
LinkList p=L;
int j=0;
while (p->next&&j<i-1)
{
p = p->next;j++;
}
if(!(p->next))
{printf("第%d个元素删除失败\n",i);return ;}
//判断i是否合法,i既不能大于元素的个数,也不能小于等于0
LinkList q = p->next;
p->next = q->next;
free(q); //释放删除的结点
}
(7)按学号删除通讯者
int delNum(LinkList L,int n)
{ // 按学号删除通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,删除失败\n");
else {
while(p !=NULL)
{
if(p->number<=n)
{
if(p->number==n)
{ flag=1;
printf("%d ",p->number);
p=p->next;
deleteElem(L,seat);
}
}
else {p=p->next;seat++;}
}
printf("被删除\n");
}
return flag;
}
(8)按姓名删除通讯者
int delName(LinkList L,char n[])
{ // 按姓名删除通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,查找失败\n");
else {
while(p !=NULL)
{
if(!strcmp(p->name,n))
{
flag=1;
printf("%s ",p->name);
p=p->next;
deleteElem(L,seat);
}
else {p=p->next;seat++;}
}
if(flag)printf("被删除\n");
} return flag;
}
(9)显示通讯录
void printList(LinkList L)
{ // 打印头结点地址为L的通讯录
printf("\n ---------------------------------------\n");
printf(" 学号 姓名 电话号码\n");
printf(" ----------------------------------------\n");
LinkList p=L;
int n=1;
if(L==NULL||L->next==NULL) printf("该通讯录中没有元素\n");
else
while(p->next !=NULL)
{
printf(" %2d %-9d",n,p->next->number);
printf(" %-5s %.0f\n",p->next->name,p->next->telenum);
p=p->next;
n++;
}
printf(" ----------------------------------------\n");
return ;
}
(10)主菜单,main函数
void main(){
system("color 1f");
LinkList L=NULL;
printf("\n ***************** ^@^欢迎使用通讯录系统***********\n");
printf(" * 1 通讯录的建立 *\n");
printf(" * 2 插入通讯记录 *\n");
printf(" * 3 查询通讯记录 *\n");
printf(" * 4 删除通讯记录 *\n");
printf(" * 5 显示通讯录信息 *\n");
printf(" * 0 退出管理系统 *\n");
printf(" **************** ^@^欢迎使用通讯录系统************\n");
int flag=0;
int menu;
printf("请选择0-5:");
scanf("%d",&menu);
while(menu!=0)
{
switch(menu) {
case 1: {
L=creatIncreLink();
printf("建立通讯录:");
printList(L);
flag=1;
break;
}
case 2: { if(flag==1)
{int number,telenum;
char name[20];
printf("请输入通讯者的学号和姓名:\n");
printf("请输入学号: ");
scanf("%d",&number);
printf("请输入姓名: ");
char temp=getchar();
gets(name);
printf("请输入电话号码: ");
scanf("%d",&telenum);
LinkList p=(LinkList)malloc(LEN); //新结点
p->number=number;
strcpy(p->name,name);
p->telenum=telenum;
insertYouXu(L,p); //有序的插入新结点
printf("插入后:");
printList(L);
}
else printf("\nERROR: 通讯录还没有建立,请先建立通讯录\n");
break;
}
case 3:{ int way,n;
char na[20];
int s;
if(L!=NULL)
{
if(flag) {
printf("选择查找方式:\n");
printf(" 1.按学号 2.按姓名");
scanf("%d",&way);
if(way==1)
{
printf("\n请输入学号:");
scanf("%d",&n);
s=searchNum(L,n);
if(s==0) printf("无此通讯者,查找失败!\n");
}
else if(way==2)
{ printf("\n请输入姓名:");
char temp=getchar();
gets(na);
s=searchName(L,na);
if(s==0) printf("无此通讯者,查找失败!\n");
}
else printf("通讯录中无记录!\n");
}
break;
}
else printf("通讯录中无记录!\n");break;
}
case 4:{
int way;
printf("选择删除方式:1.按序号 2. 按学号 3.按姓名 \n");
scanf("%d",&way);
if(way==1)
{
int n;
printf("请输入通讯录序号: ");
scanf("%d",&n);
printf("删除后:\n");
deleteElem(L,n);
printList(L);
}
else if(way==2)
{
int n,f;
printf("请输入学号: ");
scanf("%d",&n);
f=delNum(L,n);
if(f!=0)
{
printf("删除后:\n");
printList(L);
}
else printf("无该学号,删除失败!\n");
}
else if(way==3)
{
char na[20];
int f;
printf("\n请输入姓名:");
char temp=getchar();
gets(na);
f=delName(L,na);
if(f!=0)
{
printf("删除后:\n");
printList(L);
}
else printf("无该学号,删除失败!\n");
}
else printf("ERROR!!\n");
break;
}
case 5: {
printf("当前通讯录内容如下:\n");
printList(L);
break;
}
case 0: exit(0);
default: printf("\n没有此功能,重新输入\n");
}
printf("选择功能:");
scanf("%d",&menu);
}
}
1.5 测试结果
1.建立通讯录
2.插入通讯记录
3.查询通讯记录
4.删除通讯记录
5.显示通讯录信息
6.退出管理系统
-
学生通讯录管理系统(链表实现)
2021-08-22 23:10:08使用C或C++实现一个通讯录管理系统,具有实现通讯录的建立和输出、通讯者的插入、 删除和查询等几种操作功能。 1.2 需求分析 1.2.1 需求概述 通讯录管理系统是一个比较实用的小型管理系统。随着生活节奏的加快,...第一章 设计要求
1.1 问题描述
使用C或C++实现一个通讯录管理系统,具有实现通讯录的建立和输出、通讯者的插入、 删除和查询等几种操作功能。
1.2 需求分析
1.2.1 需求概述
通讯录管理系统是一个比较实用的小型管理系统。随着生活节奏的加快,人们追求丰富便捷的电子产品体验,因此也提高对便捷方式的喜爱。当今社会下人们的交际范围越来越广泛,通讯录系统的出现,方便了人们存储通讯录,便于人们日常的交际。为方便广大人们对通讯管理系统的使用,本设计采用控制语句来改变程序各项功能的实现。主菜单部分主要解决的问题是程序开始选择问题,以及循环选择问题,其余各部分根据其实现功能完成代码设计。
1.2.2 环境需求
本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:
(1)硬件要求:一台计算机。
(2)软件配置:Windows、MinGW 32、CLion2020.2 IDE编译工具。
1.2.3 功能需求
本课程设计是利用数据结构的相关知识在 MinGW编译工具和CLion IDE下用 C++ 实现一个通讯录管理系统。具有实现通讯录的建立和输出、通讯者的插入、删除和查询等几种操作功能。第二章 概要设计
2.1 主界面设计
主界面设计代码如下图2.1.1所示:
图 2.1.1主界面代码图
主界面设计图如下图2.1.2所示:
图 2.1.2 主界面图
2.2 存储结构设计
声明一个结构体作为链表单个节点,其中存储的内容有学号、姓名、出生日期、电话号和家庭住址,这些节点利用指针连接起来。存储结构设计代码如下图2.2所示:
图 2.2存储结构设计图
2.3 系统功能设计
(1) 菜单功能:输出菜单界面,并提供一个菜单来实现各个函数的调用以及提示用户。
(2) 添加功能:包含输入功能,第一次可以一次完成若干条记录的输入,此后可每次完成一条记录的输入,增加通讯录的基本信息。
(3) 修改功能:根据联系人的名字,修改指定联系人的信息。
(4) 删除功能:根据联系人的名字,删除指定联系人的信息。
(5) 查询功能:根据联系人的名字,查找指定联系人的信息并输出。
(6) 显示功能:将目前所有的联系人的信息输出。
(7) 读取功能:从保存的文件中读取通讯录信息;
(8) 保存功能:保存现有通讯录到文件中,防止程序退出数据丢失;
(9) 关闭功能:退出程序。第三章 模块设计
3.1 模块设计
3.1.1 功能模块设计
系统的功能模块包括通讯录链表的建立、通讯者结点的插入、通讯者结点的查询、通讯者结点的删除、通讯者结点的修改、通讯录链表的输出、向/从文件中写入或读取通讯录和退出通讯录管理系统,如下图3.1.1所示:
图3.1.1 功能图3.1.2 系统流程图
系统流程如下图3.1.2所示:
图 3.1.2系统流程图
3.2 系统子程序及功能设计
系统子程序功能设计一览表如下表3.2.1:函数名 功能 void Menu(); 显示菜单 Node *Create(); 新建通讯录链表 bool InsertStudent(Node *head); 插入学生信息 bool DeleteStudent(Node *head, const string& id); 删除学生信息 Node *ReadFromFile(); 从文件中读取通讯录 bool WriteToFile(Node *head); 向文件写入通讯录 Node * FindStudent(Node *head, const string& id); 查询学生信息(学号) Node* FindStuInformation(const string& pName, Node* pHead); 查询学生信息(姓名) void PrintStudent(Node *head); 输出全部学生信息 void PrintStudentSingle(Node *pNode); 输出单个学生节点信息 bool ChangeInformation(Node* pNode); 修改学生信息 void SYS_CONTROL(); 系统控制函数 表3.2.1 功能函数一览表
(1) 创建通讯录方法如下图3.2.1所示:
图3.2.1 Create方法(2) 删除信息方法如下图3.2.2所示:
图3.2.2 deletestudent方法
(3) 查询学生信息方法如下图3.2.3所示:
图3.2.3 Findstudent方法
(4) 插入学生信息方法如下图3.2.4所示:
图3.2.4 Insertstudent
(5) 打印学生信息功能如下图3.2.5所示:
图3.2.5 Printstudent(6) 从文件中读取通讯录功能如下图3.2.6所示:
图3.2.6 Readfromfile
(7) 保存通讯录功能如下图3.2.7所示:
图3.2.7 Writeinfile
(8) 修改功能流程图如下图3.2.8所示:
图3.2.8 修改功能流程图3.3 函数主要调用关系图
函数主要调用关系如下图3.3所示:
图3.3.1 函数主要关系调用图第四章 详细设计
4.1 数据定义
系统的数据定义如下图4.1所示:图4.1 链表节点数据定义图
4.2 系统主要子程序详细设计
4.2.1 通讯录链表建立Node *Create() { int i = 1; char ch = 'Y'; // 是否继续输入学生通讯录信息 Node *head = new Node(); // 头结点,不存放数据 if(nullptr == head) { cerr << "内存空间分配失败" << endl; exit(1); } head->next = nullptr; while(ch == 'Y'||ch == 'y') { cout << "请输入第" << i << "位学生的学号、姓名、出生日期、姓别(1:表示是男生,0:表示是女生)、电话和地址(以空格隔开):" << endl; Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } cin >> newNode->id >> newNode->name >> newNode->birthday >> newNode->sex >> newNode->phone >> newNode->address; newNode->next = nullptr; // 采用头插入 newNode->next = head->next; // 新结点的next保存首结点(头结点的下一个结点) head->next = newNode; // 头指针往前移 i++; cout << "是否继续输入学生的通讯录信息?(Y/N):"; cin >> ch; } return head; }
4.2.2 插入节点学生信息
bool InsertStudent(Node *head) { cout << "请输入学生的学号、姓名、出生日期、姓别(1:表示是男生,0:表示是女生)、电话和地址(以空格隔开):" << endl; Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } cin >> newNode->id >> newNode->name >> newNode->birthday >> newNode->sex >> newNode->phone >> newNode->address; newNode->next = head->next; // 新结点的next保存首结点(头结点的下一个结点) head->next = newNode; // 头指针往前移 return true; // 插入成功 }
4.2.3 删除节点学生信息
bool DeleteStudent(Node *head, const string& id) { Node *prev = head; Node *p = head->next; while(p != nullptr && p->id != id) { //注意二者不可交换位置 prev = p; p = p->next; } if(p == nullptr)return false; prev->next = p->next; delete p; p = nullptr; return true; //删除成功 }
4.2.4 查询节点学生信息
// 在通讯录中查询学生信息(按学号查询) Node* FindStudent(Node *head, const string& id) { Node *p = head; int count = 0; while(p != nullptr && id != p->id) { //注意二者不可交换位置 p = p->next; ++count; } for (int i=0;i<count-1;i++) //查找对应节点指针 { head = head->next; } if(p == nullptr)return p; else return head; //分情况返回,防止野指针 } // 在通讯录中查询学生信息(按姓名查询) Node* FindStuInformation(const string& pName, Node* pHead) { Node *p = pHead; int count = 0; while(p != nullptr && pName != p->name) { //注意二者不可交换位置 p = p->next; ++count; } for (int i=0;i<count-1;i++) //查找对应节点指针 { pHead = pHead->next; } if(p == nullptr)return p; else return pHead; //分情况返回,防止野指针 }
4.2.5 修改节点学生信息
bool ChangeInformation(Node *pNode) { Node* p = pNode->next; int ch = -1; string str = "INIT"; cout<<"按编号选择需要修改的项目,【按0】退出"<<endl; while(ch != 0){ cin>>ch; switch (ch) { case 1: cout<<"修改学号为:"<<endl; cin>>str; p->id = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 2: cout<<"修改姓名为:"<<endl; cin>>str; p->name = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 3: cout<<"修改出生日期为:"<<endl; cin>>str; p->birthday = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 4: p->sex = !(p->sex); str = "Changed by [4](sex)"; cout<<"性别已修改!"<<endl; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 5: cout<<"修改电话号为:"<<endl; cin>>str; p->phone = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 6: cout<<"修改家庭地址为:"<<endl; cin>>str; p->address = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 0: break; default: cout<<"选择错误,请重新选择!"<<endl; } } if ( str == "INIT")return false; else return true; }
4.2.6 保存通讯录
bool WriteToFile(Node *head) { if (head == nullptr){PLCR return false;} Node *p = head->next; int ch = 0,flag = 1; while (flag){ cout<<"[0]覆盖原有通讯录 [1]添加到原有通讯录"<<endl; cin>>ch; switch (ch) { case 0: flag = 0; break; case 1: flag = 0; break; default: cout<<"选择错误"<<endl; } } // 以写模式打开文件 ofstream outFile; if(ch){outFile.open("StuMessageFile/student.txt",ios::out|ios::app);}else{outFile.open("StuMessageFile/student.txt", ios::out);}; if(!outFile) { cout << "Error: opening file fail" << endl; exit(1); } while(p != nullptr) { // 写入文件 outFile << p->id << " " << p->name << " " << p->birthday << " " << p->sex << " " << p->phone << " " << p->address << endl; p = p->next; // 往后移 } return true; }
4.2.7 读取通讯录
Node *ReadFromFile() { Node *head = new Node(); // 头结点,不存放数据 if(nullptr == head) { cerr << "内存空间分配失败" << endl; exit(1); } ifstream inFile; inFile.open("StuMessageFile/student.txt", ios::in); // 以读的方式打开文件 if(!inFile.is_open()) { cout << "Error: opening file fail" << endl; exit(1); } Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } while(!inFile.eof()) { // 当未到文件尾 Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } // 从文件中输入数据 inFile >> newNode->id >> newNode->name >> newNode->birthday >> newNode->sex >> newNode->phone >> newNode->address; newNode->next = head->next; // 新结点的next保存首结点(头结点的下一个结点) head->next = newNode; // 头指针往前移 } inFile.close(); // 关闭文件 head = head->next; return head; }
第五章 测试分析
5.1 遇到的问题及解决方法
- 问题:
(1) 在未创建或未读取通讯录的情况下,选择其他功能程序会崩溃;
(2) 保存通讯录后,覆盖原有学生信息文件;
(3) 查询并打印时,打印出被查询学生后的所有学生信息;
(4) 打印通讯录所有学生信息时,未存储任何信息的头结点被打印;
(5) 程序测试时,控制台乱码显示中文字符。 - 解决办法:
(6) 在主程序Switch()case……中添加头结点判断;
(7) 修改文件的打开方式为:追加写入方式;
(8) 重写PrintStudentSingle函数,取消while(p != nullptr)循环条件;
(9) 将头结点跳过,从下一个开始,head = head->next;
(10) 编写程序选择UTF-8编码格式,控制台调试选择GBK编码。
5.2 经验和体会
(1)通过本次项目使我们进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
(2)使我们掌握软件设计的基本内容和设计方法,并培养了我们进行规范化软件设计的能力。
(3)使我们能掌握使用各种计算机资料和有关参考资料,提高我们进行程序设计的基本能力。5.3 测试功能展示
(1) 主界面如下图5.3.1所示:
图5.3.1 主界面(2) 通讯录链表建立(1. 新建学生通讯录)功能测试如下图5.3.2所示:
图5.3.2 新建通讯录(3) 插入节点学生信息(2. 在通讯录插入学生信息)测试如下图5.3.3所示:
图5.3.3 插入信息(4) 删除节点学生信息功能(3. 在通讯录删除学生信息)测试如下图5.3.4所示:
图5.3.4 删除信息(5) 查询节点学生信息功能(6. 在通讯录按学号查询信息)测试如下图5.4.5所示:
图5.4.5 查询信息(6) 修改节点学生信息(8. 修改学生信息)功能测试如下图5.4.6所示:
图5.4.6 修改学生信息(7) 保存通讯录(5. 向文件写入通讯录信息)功能如下图所示:
图5.4.7 保存通讯录(8) 读取通讯录(4. 从文件读取通讯录信息)功能测试如下图5.4.8所示;
图5.4.8 读取通讯录第六章 源程序清单
6.1 main.cpp
#include "student.h" using namespace std; int main() { SYS_CONTROL(); return 0; }
6.2 student.cpp
// // Created by Today me on 2021/6/21. // #include "student.h" //string id; // 学生的学号 //string name; // 姓名 //string birthday; // 出生日期:如1995-01-01 //int sex; // 1:表示是男生,0:表示是女生 //string phone; // 电话 //string address; // 地址 // 新建学生通讯录信息 // 如:1110618014058 Thomas 2000-01-01 1 13521469978 陕西汉中 // 菜单界面 void Menu() { SYSTEMTIME sys; GetLocalTime(&sys); cout << "\t\t************************************\n\t\t**^_^欢迎使用学生通讯录管理系统^_^**\n\t\t************************************\n\t\t\t "<<sys.wYear<<"年"<<sys.wMonth<<"月"<<sys.wDay<<"日";cout<<"\n****************************************************************\n**\t\t\t通讯录管理主菜单\t\t **\n**------------------------------------------------------------**\n"; cout << "**| 1.新建学生通讯录\t\t 5.向文件写入通讯录信息 |**\n"; cout << "**| 2.在通讯录插入学生信息\t 6.在通讯录按学号查询信息 |**\n"; cout << "**| 3.在通讯录删除学生信息\t 7.在屏幕打印全部学生信息 |**\n"; cout << "**| 4.从文件读取通讯录信息\t 8.修改学生信息\t\t |**\n**------------------------------------------------------------**\n****************************************************************\n"; cout << "**\t\t请输入选择(1-8):【0】退出系统 **\n****************************************************************\n"; } // 创建通讯录 Node *Create() { int i = 1; char ch = 'Y'; // 是否继续输入学生通讯录信息 Node *head = new Node(); // 头结点,不存放数据 if(nullptr == head) { cerr << "内存空间分配失败" << endl; exit(1); } head->next = nullptr; while(ch == 'Y'||ch == 'y') { cout << "请输入第" << i << "位学生的学号、姓名、出生日期、姓别(1:表示是男生,0:表示是女生)、电话和地址(以空格隔开):" << endl; Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } cin >> newNode->id >> newNode->name >> newNode->birthday >> newNode->sex >> newNode->phone >> newNode->address; newNode->next = nullptr; // 采用头插入 newNode->next = head->next; // 新结点的next保存首结点(头结点的下一个结点) head->next = newNode; // 头指针往前移 i++; cout << "是否继续输入学生的通讯录信息?(Y/N):"; cin >> ch; } return head; } // 向学生通讯录插入学生信息 bool InsertStudent(Node *head) { cout << "请输入学生的学号、姓名、出生日期、姓别(1:表示是男生,0:表示是女生)、电话和地址(以空格隔开):" << endl; Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } cin >> newNode->id >> newNode->name >> newNode->birthday >> newNode->sex >> newNode->phone >> newNode->address; newNode->next = head->next; // 新结点的next保存首结点(头结点的下一个结点) head->next = newNode; // 头指针往前移 return true; // 插入成功 } // 在通讯录中删除学生信息 bool DeleteStudent(Node *head, const string& id) { Node *prev = head; Node *p = head->next; while(p != nullptr && p->id != id) { //注意二者不可交换位置 prev = p; p = p->next; } if(p == nullptr)return false; prev->next = p->next; delete p; p = nullptr; return true; } // 从文件中读取通讯录信息 Node *ReadFromFile() { Node *head = new Node(); // 头结点,不存放数据 if(nullptr == head) { cerr << "内存空间分配失败" << endl; exit(1); } ifstream inFile; inFile.open("StuMessageFile/student.txt", ios::in); // 以读的方式打开文件 if(!inFile.is_open()) { cout << "Error: opening file fail" << endl; exit(1); } Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } while(!inFile.eof()) { // 当未到文件尾 Node *newNode = new Node(); // 新建结点 if(nullptr == newNode) { cerr << "内存空间分配失败" << endl; exit(1); } // 从文件中输入数据 inFile >> newNode->id >> newNode->name >> newNode->birthday >> newNode->sex >> newNode->phone >> newNode->address; newNode->next = head->next; // 新结点的next保存首结点(头结点的下一个结点) head->next = newNode; // 头指针往前移 } inFile.close(); // 关闭文件 head = head->next; return head; } // 向文件写入学生通讯录信息 bool WriteToFile(Node *head) { if (head == nullptr){PLCR return false;} Node *p = head->next; int ch = 0,flag = 1; while (flag){ cout<<"[0]覆盖原有通讯录 [1]添加到原有通讯录"<<endl; cin>>ch; switch (ch) { case 0: flag = 0; break; case 1: flag = 0; break; default: cout<<"选择错误"<<endl; } } // 以写模式打开文件 ofstream outFile; if(ch){outFile.open("StuMessageFile/student.txt",ios::out|ios::app);}else{outFile.open("StuMessageFile/student.txt", ios::out);}; if(!outFile) { cout << "Error: opening file fail" << endl; exit(1); } while(p != nullptr) { // 写入文件 outFile << p->id << " " << p->name << " " << p->birthday << " " << p->sex << " " << p->phone << " " << p->address << endl; p = p->next; // 往后移 } return true; } // 在通讯录中查询学生信息(按学号查询) Node* FindStudent(Node *head, const string& id) { Node *p = head; int count = 0; while(p != nullptr && id != p->id) { p = p->next; ++count; } for (int i=0;i<count-1;i++) { head = head->next; } if(p == nullptr)return p; else return head; } // 在屏幕中输出全部学生信息 void PrintStudent(Node *head) { Node *p = head->next; while(p != nullptr) { cout << "学号:" << p->id << " 姓名:" << p->name << " 出生日期:" << p->birthday; if(p->sex == 1) cout << " 性别:男"; else cout << " 性别:女"; cout << " 电话:" << p->phone << " 地址:" << p->address << endl; p = p->next; } } // 单行输出功能 void PrintStudentSingle(Node *pNode) { Node* p = pNode->next; cout << "【1】学号:" << p->id << " 【2】姓名:" << p->name << " 【3】出生日期:" << p->birthday; if(p->sex == 1) cout << " 【4】性别:男"; else cout << " 【4】性别:女"; cout << " 【5】电话:" << p->phone << " 【6】地址:" << p->address << endl; } // 在通讯录中查询学生信息(按姓名查询) Node* FindStuInformation(const string& pName, Node* pHead) { Node *p = pHead; int count = 0; while(p != nullptr && pName != p->name) { p = p->next; ++count; } for (int i=0;i<count-1;i++) { pHead = pHead->next; } if(p == nullptr)return p; else return pHead; } //查找所有符合条件的学生 void FindAll(Node* pNode,const string& pName) { Node* p = pNode; while (pNode != nullptr) { if (pName == pNode->name)PrintStudentSingle(p); p = pNode; pNode = pNode->next; } } // 修改学生信息 bool ChangeInformation(Node *pNode) { Node* p = pNode->next; int ch = -1; string str = "INIT"; cout<<"按编号选择需要修改的项目,【按0】退出"<<endl; while(ch != 0){ cin>>ch; switch (ch) { case 1: cout<<"修改学号为:"<<endl; cin>>str; p->id = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 2: cout<<"修改姓名为:"<<endl; cin>>str; p->name = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 3: cout<<"修改出生日期为:"<<endl; cin>>str; p->birthday = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 4: p->sex = !(p->sex); str = "Changed by [4](sex)"; cout<<"性别已修改!"<<endl; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 5: cout<<"修改电话号为:"<<endl; cin>>str; p->phone = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 6: cout<<"修改家庭地址为:"<<endl; cin>>str; p->address = str; cout<<"继续按编号选择需要修改的项目,或【按0】退出"<<endl; break; case 0: break; default: cout<<"选择错误,请重新选择!"<<endl; } } if ( str == "INIT")return false; else return true; } // 系统控制函数 void SYS_CONTROL() { SetConsoleTitle("学生通讯录管理系统"); int choice; string name; string id; bool Changed = false; bool finished = false; Node *head = nullptr; while(!finished) { Menu(); cin >> choice; switch(choice) { case 1: head = Create(); // 新建学生通讯录 break; case 2: if(head == nullptr){PLCR cout<<"【提示】:<插入失败>"<<endl;}else { if (InsertStudent(head)) // 向学生通讯录插入学生信息 cout << "插入学生信息成功!" << endl; else cout << "插入学生信息失败!" << endl; } break; case 3: // 在通讯录删除学生信息 if(head == nullptr){PLCR}else { cout << "请输入要删除的学生通讯录信息的学号:"; cin >> id; if (DeleteStudent(head, id)) cout << "删除成功!" << endl; else cout << "删除失败!" << endl; } break; case 4: // 从文件中读取通讯录信息 if (head = ReadFromFile()) { cout<<"【提示】:<读取成功>"<<endl; }else cout<<"【提示】:<读取失败>"<<endl; break; case 5: // 向文件写入通讯录信息 if (WriteToFile(head)) { cout<<"【提示】:<写入成功>"<<endl; } else{cout<<"【提示】:<写入失败>"<<endl;} break; case 6: // 在通讯录中查询学生信息(按学号查询) if (head == nullptr){PLCR}else{ cout << "请输入要查找的学生信息的学号:"; cin >> id; if(FSPTRID != nullptr) { PrintStudentSingle(FSPTRID); break; }else{ cout << "查无此人!" << endl; } } break; case 7: // 在屏幕中输出全部学生信息 if (head == nullptr){PLCR }else { PrintStudent(head); } break; case 8: // 修改学生信息 if (head == nullptr){PLCR }else { cout << "请输入要修改的学生信息的姓名:"; cin >> name; if(FindStuInformation(name,head) != nullptr) { Node* pTemp = FindStuInformation(name,head); PrintStudentSingle(pTemp); Changed = ChangeInformation(pTemp); if (Changed){cout<<"修改后该生通讯录信息为:"<<endl;PrintStudentSingle(pTemp);}else cout<<"【提示】:未修改任何信息"<<endl; }else{ cout << "查无此人!" << endl; } } break; case 0: finished = true; break; default: system("cls"); cout << "输入选择错误,请重新输入!" << endl; } } }
6.3 student.h
// // Created by Today me on 2021/6/21. // #ifndef STUDENT_MANGER_SYS_STUDENT_H #define STUDENT_MANGER_SYS_STUDENT_H #include <iostream> #include <fstream> #include <string> #include <windows.h> #define FSPTRID FindStudent(head, id) #define PLCR system("cls");cout<<"【提示】:<请先读取或者创建通讯录>"<<endl; using namespace std; struct Node { string id; // 学生的学号 string name; // 姓名 string birthday; // 出生日期:如1995-01-01 int sex; // 1:表示是男生,0:表示是女生 string phone; // 电话 string address; // 地址 Node *next; }; void Menu(); // 显示菜单函数 Node *Create(); // 新建同学录 bool InsertStudent(Node *head); // 向学生通讯录插入学生信息 bool DeleteStudent(Node *head, const string& id); // 在通讯录中删除学生信息 Node *ReadFromFile(); // 从文件中读取通讯录信息 bool WriteToFile(Node *head); // 向文件写入学生通讯录信息 Node * FindStudent(Node *head, const string& id); // 在通讯录中查询学生信息(按学号查询) void PrintStudent(Node *head); // 在屏幕中输出全部学生信息 void PrintStudentSingle(Node *pNode); // 在屏幕中输出单个学生节点信息 Node* FindStuInformation(const string& pName, Node* pHead); // 在通讯录中查询学生信息(按姓名查询) bool ChangeInformation(Node* pNode); // 修改学生信息 void SYS_CONTROL(); // 系统控制函数 void FindAll(Node* pNode,const string& pName); //打印所有符合条件的学生信息 #endif //STUDENT_MANGER_SYS_STUDENT_H
第七章 用户手册
7.1 操作步骤
7.1.1 创建通讯录
(1)按1,创建通讯录,按照提示输入学生信息,输入完成后,选择是否继续插入。
(2)按7,在屏幕中打印已有的学生信息。
(3)按6,查询已有的学生信息。
(4)按3,删除学生信息。
(5)按2,根据提示插入学生信息。
(6)按5,保存该通讯录。
(7)按8,退出系统。
7.1.2 读取通讯录
(1)按4,从文件中读取已保存的通讯录。
(2)按7,在屏幕中打印已有的学生信息。
(3)按6,查询已有的学生信息。
(4)按3,删除学生信息。
(5)按2,根据提示插入学生信息。
(6)按5,保存该通讯录。
(7)按8,退出系统。 - 问题:
-
C语言课程设计论文(学生通讯录管理系统)优秀哦。。。
2021-05-18 17:10:58C语言课程设计论文题目:学生通讯录管理系统班 级:0524092班组 号:第十小组姓名(学号):朱会彬(052409257)吴江波(052409251)吴建鹏(052409250)高阳阳(052409240)姚浩(052409253)谢敬奇(052409252)指导教师:... -
C语言课程设计——通讯录管理系统(源代码+详细注释).zip
2021-10-01 15:47:53具有数据的插入、修改、删除、显示和查询功能的通讯录管理系统。 (1)数据包括:人名、城市、省、国家、电话号码等。 (2)可对记录中的姓名进行查询。 (3)可对记录中的姓名进行删除。 (4)可显示所有的保存记录。 ... -
Python学生通讯录管理系统案例(文件版)
2022-03-16 12:40:331.打印输出学生通讯录管理系统的菜单 2.接收用户从键盘输入的选择序号 3.根据输入的选择序号,判断并执行不同的功能 注意:本例中,要想保存所以学生的通讯信息,需要用到字典。 1.打印输出学生通讯录管理... -
C++控制台学生通讯录管理系统
2015-04-21 23:02:43用VC++6以及VC++2010 编译通过的控制台学生通讯录管理系统,利用结构体,指针,单链表,文件读取等C++的知识,功能有建立通讯录,添加,修改,插入,查询,删除,保存等功能其中数据库保存功能自动实现。VC++6 ... -
C语言简单的学生通讯录管理系统,已调试完美运行
2022-05-10 13:22:58项目名称:学生通讯录管理系统 功能:添加,删除,修改,打印通讯录 采用结构:链表 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Student { int no; char... -
[转载]C语言课程设计论文(学生通讯录管理系统)优秀哦。。。
2021-05-20 06:46:48C语言课程设计论文题目:学生通讯录管理系统班 级:0524092班组 号:第十小组姓名(学号):朱会彬(052409257)吴江波(052409251)吴建鹏(052409250)高阳阳(052409240)姚浩(052409253)谢敬奇(052409252)指导教师:... -
C++实现的学生通讯录管理系统实现文档附代码
2019-12-26 19:42:16学生通讯录管理系统实现文档附代码-c++课程设计。 -
python基础项目实践之学生通讯录管理系统1.0
2022-06-06 21:56:58python基础项目实践之学生通讯录管理系统1.0 主要是为了锻炼学生对集合和列表的应用以及python死循环的应用与退出 -
学生通讯录管理系统(c++链表easyx界面)
2022-04-21 20:36:49先前发过有关通讯录的博客,从结构体数组到链表,如今也是终于完成了界面化,小组作业也是终于完成了,现在把我的最终结果分享出来(由于时间有限,前期确实浪费了很多时间,导致本管理系统并不是很完美,还有需要... -
基于JAVA的学生通讯录管理系统设计和实现[文献综述].docx
2022-05-29 11:45:49基于JAVA的学生通讯录管理系统设计和实现[文献综述].docx基于JAVA的学生通讯录管理系统设计和实现[文献综述].docx基于JAVA的学生通讯录管理系统设计和实现[文献综述].docx基于JAVA的学生通讯录管理系统设计和实现...