面向对象程序设计
C++大作业
题目:C++通信录
专业:计算机科学与技术
班级:信息A16xx
组号:第一小组
内容:
(1)输入信息; (2)显示信息;
(3)删除记录; (4)查询、修改记录;
(5)界面优化等;
五大主功能函数:
/*显示全部。通过循环调用show()函数输出全部联系人*/
void show_all();
/*查询某人。输入名字,循环比较找出对应记录。若无则输出没有此人,若有则调用show()函数*/
void search_name();
/*增加记录。增加一条联系人记录,通过依次调用set_name(),set_sex(),set_phone(),set_email()等函数实现*/
void add();
/*修改记录。输入名字,循环比较找出对应记录。若无则输出没有此人,若有则调用四个set_xxxx()函数输入*/
void modify();
/*删除某人记录。输入名字,循环比较找出对应记录。若无则输出没有此人,若有循环覆盖删除此记录*/
void del_one();
二、主功能函数外的功能函数:
/*打印出欢迎页面*/
void welcome();
/*打印出主菜单页面*/
void first_menu();
/*将用户选择转化为数字返回。调用first_menu()打印主菜单,通过用户的输入,返回数值作为调用功能的依据。若输入错误,再次循环*/
int menu();
/*根据用户选择的功能调用相应的功能函数。调用menu()函数,调用数字相对应的功能函数。不断循环,直至选择退出函数*/
void work();
/*函数的逻辑顺序操作与选择等*/
void main();
- 分工合作任务表:
小组长 戴x超
学号 | 姓名 | 主要任务 | 占比 | 等级 |
1 | 蒋x杰 | 主功能函数3,增加函数void add();的编写 | 8% | B |
2 | 万x | 主功能函数5,删除某人void del_one();的编写 | 8% | B |
3 | 陈x | 与丰金诚共同参与主功能函数4,修改信息void modify();的编写 | 9% | A |
4 | 施x婷 | 主函数1,显示所有人 void show_all();的编写 | 9% | B |
5 |
戴x超 | 程序整理汇总,调试结果汇总,主函数与外部功能函数void welcome,thanks_for_use,menu();的编写等 |
16% |
A |
6 | 张x宇 | 主功能函数2,搜查信息void search_name();的编写 | 9% | B |
7 | 赵x梅 | 程序功能说明的文档编写 | 8% | B |
8 | 丰x诚 | 与陈欣共同参与主功能函数4,修改信息void modify();的编写 | 9% | B |
9 | 汪x东 | 心得体会编写,调试结果汇总,主函数参与,帮助组员查找错误 | 7% | C |
10 | 龚x | 界面设计,主功能函数main();编写 | 10% | A |
11 | 肖x洋 | 心得体会编写,主函数参与,帮助组员查找错误 | 7% | C |
- 功能展示:
欢迎界面:
主界面:
增加联系人:(以2个为例)
显示所有人:(也可以只显示某一个)
修改某人信息:(按名字查找并修改,后显示)
删除某人:(按名字删除并显示)
五、源代码:
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<conio.h>
#include<cmath>
using namespace std;
int Num; //联系人总数
class Person{ //建立联系人的类
//private成员如下
private:
char name[20];
char sex[10];
char phone[20];
char email[30];
public:
char* get_name();
char* get_sex();
char* get_phone();
char* get_email();
void set_name();
void set_sex();
void set_phone();
void set_email();
void show();
~Person(){};
};
Person people[300]; //定义对象数组
//功能函数声明
void show_all();
void search_name();
void add();
void modify();
void del_one();
void welcome();
void first_menu();
int menu();
//类内函数,返回name
char* Person::get_name(){
return name;
}
//类内函数,返回sex
char* Person::get_sex(){
return sex;
}
//类内函数,返回phone
char* Person::get_phone(){
return phone;
}
//类内函数,返回email
char* Person::get_email(){
return email;
}
//类内函数,设置name
void Person::set_name(){
memset(name,'\0',20); //memset设置格式
cin>>name;
}
//类内函数,设置sex
void Person::set_sex(){
memset(sex,'\0',10);
cin>>sex;
}
//类内函数,,设置phone
void Person::set_phone(){
memset(phone,'\0',20);
cin>>phone;
}
//类内函数,,设置email
void Person::set_email(){
memset(email,'\0',30);
cin>>email;
}
//类内函数,打印全部私有成员
void Person::show(){
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"phone:"<<phone<<endl;
cout<<"email:"<<email<<endl;
}
//增加一位联系人
void add(){
cout<<"name:"<<endl;
people[Num].set_name();
cout<<"sex:"<<endl;
people[Num].set_sex();
cout<<"phone:"<<endl;
people[Num].set_phone();
cout<<"email:"<<endl;
people[Num].set_email();
cout<<"输入成功!"<<endl<<endl;
Num++;
cout<<"按任意键继续..."<<endl;
getch();
}
//修改联系人
void modify(){
char a[20],s;
int flag_find=0,i;
cout<<"请输入要修改的名字:"<<endl;
cin>>a;
for(i=0;i<Num;i++){ //从所有联系人中循环查找
if(!strcmp(people[i].get_name(),a)){ //采用strcmp函数比较查找出来的名字与输入的名字是否相同
cout<<"此联系人详细信息如下"<<endl;
people[i].show(); //调用show函数显示该联系人的所有信息
cout<<"是否要修改姓名?(y/n)"<<endl; //使用if语句确认是否要修改姓名 性别 电话 电子邮件
cin>>s;
if(s=='y'||s=='Y'){
cout<<"name:";
//调用set函数,确认修改时使用memset函数按字节对内存块进行初始化,相当于清零操作
people[i].set_name();
}
cout<<"是否要修改性别?(y/n)"<<endl;
cin>>s;
if(s=='y'||s=='Y'){
cout<<"sex:";
people[i].set_sex();
}
cout<<"是否要修改电话?(y/n)"<<endl;
cin>>s;
if(s=='y'||s=='Y'){
cout<<"phone:";
people[i].set_phone();
}
cout<<"是否要修改邮箱?(y/n)"<<endl;
cin>>s;
if(s=='y'||s=='Y'){
cout<<"email:";
people[i].set_email();
}
cout<<endl;
flag_find=1; //修改好后将flag立为1做标志
}
}
if(flag_find==0){
cout<<"对不起,没有此人!"<<endl;
}
cout<<"按任意键继续..."<<endl;
getch(); //将读取的字符返回
}
//删除一个联系人
void del_one(){
char a[20],c;
int flag_find=0,i,j;
cout<<"输入要删除的名字:"<<endl;
cin>>a;
for(i=0;i<Num;i++){
if(!strcmp(people[i].get_name(),a)){
cout<<"此联系人详细信息如下"<<endl;
people[i].show();
cout<<"是否要删除?(y/n)"<<endl;
cin>>c;
if(c=='Y'||c=='y'){
for(j=i;j<Num-1;j++){
strcpy(people[j].get_name(),people[j+1].get_name());
strcpy(people[j].get_sex(),people[j+1].get_sex());
strcpy(people[j].get_phone(),people[j+1].get_phone());
strcpy(people[j].get_email(),people[j+1].get_email());
}
memset(people[Num-1].get_name(),'\0',20);
memset(people[Num-1].get_sex(),'\0',10);
memset(people[Num-1].get_phone(),'\0',20);
memset(people[Num-1].get_email(),'\0',30);
Num--;
}
flag_find=1;
cout<<endl;
}
}
if(flag_find==0){
cout<<"对不起,没有此人!"<<endl<<endl;
}else{
cout<<endl;
}
cout<<"请按任意键继续..."<<endl;
getch();
}
//打印所有联系人
void show_all(){
int i,flag_stop=0;
char c;
for(i=0;i<Num;i++){
cout<<"此联系人详细信息如下"<<endl;
people[i].show();
}
cout<<"此系统共有"<<Num<<"人信息。"<<endl;
if(flag_stop==0)
cout<<"全部信息已输出!"<<endl;
cout<<endl;
cout<<"请按任意键继续..."<<endl;
getch();
}
//搜索联系人
void search_name(){
char a[20];
int i,flag_find=0;
cout<<"请输入您要查询的人名:"<<endl;
cin>>a;
for(i=0;i<Num;i++){
if(!strcmp(people[i].get_name(),a)){
cout<<"此联系人详细信息如下"<<endl;
people[i].show();
flag_find=1;
}
}
if(flag_find==0){
cout<<"对不起,没有此人!"<<endl<<endl;
}else{
cout<<endl;
}
cout<<"请按任意键继续..."<<endl;
getch();
}
void welcome(){
printf(" \n");
printf(" **************************\n");
printf(" **欢迎使用通讯录管理系统**\n");
printf(" **************************\n");
printf(" \n");
printf(" -------按任意键继续-------\n");
printf(" \n");
printf(" ");
getch(); //读取字符但不显示
system("cls"); //system函数 清屏
}
void first_menu(){
system("cls");
cout<<" 主菜单 "<<endl;
cout<<"----------------------------"<<endl;
cout<<"查询F 增加A 修改M 删除D "<<endl;
cout<<"----------------------------"<<endl;
}
int menu(){
char s,t;
int choice;
while(true){
while(true){
first_menu();
cin>>s;
switch(s){
case 'F':
cout<<"a 显示全部信息"<<endl<<"b 查询某人信息"<<endl;
cin>>t;
if(t=='a'||t=='A'){
choice=1;
}else if(t=='b'||t=='B'){
choice=2;
}else{
choice=0;
}
break;
case 'f':
cout<<"a 显示全部信息"<<endl<<"b 查询某人信息"<<endl;
cin>>t;
if(t=='a'||t=='A'){
choice=1;
}else if(t=='b'||t=='B'){
choice=2;
}else{
choice=0;
}
break;
case 'A':
choice=3;
break;
case 'a':
choice=3;
break;
case 'M':
choice=4;
break;
case 'm':
choice=4;
break;
case 'D':
cout<<"a 删除某人信息"<<endl;
cin>>t;
if(t=='a'||t=='A'){
choice=5;
}
else{
choice=0;
}
break;
case 'd':
cout<<"a 删除某人信息"<<endl;
cin>>t;
if(t=='a'||t=='A'){
choice=5;
}
else{
choice=0;
}
break;
default :{
cout<<"输入错误,请重新选择功能!"<<endl;
cout<<"按任意键继续..."<<endl;
getch();
}
}
if(s=='F'||s=='f'||s=='A'||s=='a'||s=='M'||s=='m'||s=='D'||s=='d'){
break;
}
}
if(choice==0){
cout<<"输入错误,请重新选择功能!"<<endl;
cout<<"按任意键继续..."<<endl;
getch();
}else{
break;
}
}
return choice;
}
int main()
{
welcome();//调用欢迎界面
int choice;
while(true){
choice=menu();
switch(choice){
case 1: show_all();
break;
case 2: search_name();
break;
case 3: add();
break;
case 4: modify();
break;
case 5: del_one();
break;
}
}
return 0;
}
六、总结:
程序优点:
1.较为完善的做出了通讯录的功能,达到了基本要求。
2.流畅的交互界面,考虑到许多误操作并给予提示。
3.灵巧运用节点跳转,写有许多flag,case等选择,条理清晰。
4.所有信息均以char类型存储,十分的统一,且没有使用顺序表的那些算法操作去增删改查,而是另辟蹊径的运用字符型的特点,使用字符数组,总体思路便于理解。
5.小组自学新知识点,尝试运用memset函数设置字符的初始格式,方便快捷。
(memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘/0’;例:char a[100];memset(a, '/0', sizeof(a));)
程序缺点:
1.代码的可重用性不足,没有用到函数模板。
2.功能不够有特色,是为简单的增删改查,没有涉及到文件的存储读写等操作,且目前只考虑到姓名、性别、电话、邮箱。个人认为此四项最为重要,其余项用处不大且占用代码空间。可以后期写生日、备注等项。