//常量的定义方式:
//1、#define 定义宏常量. 宏常量定义在函数外面,无法修改;
//2、const 修饰的变量. 一般写在函数内部,无法修改。
// 定义宏常量
#define Day 7
//字符数据类型
// char ch = 'a'; 只能使用单引号单字符;
//字符串类型
// char ch[] = "asdfasdf"; C风格,使用char定义字符串变量时,必须要有[], 此时赋值的字符串也要用双引号;
// string ch = "asfasdf"; C++风格,直接使用string来定义字符串变量;需先include <string> 导入;
// 一维数组定义的三种方式:
// 1、数据类型 数组名 [数组长度];
// 2、数据类型 数组名 [数组长度] = {val1, val2, ...},初始化时未完全填充数组长度,自动填充0;
// 3、数据类型 数组名 [] = {val1, val2, ...},根据初始化值来自动确定数组长度;
// 特点:连续内存空间,相同数据类型。
/* 二维数组定义的4种方式:
* 1、数据类型 数组名[行数][列数];
* 2、数据类型 数组名[行数][列数] = {{val1, val2}, ... {valn, valm}};
* 3、数据类型 数组名[行数][列数] = {val1, val2, val3, val4}; 根据shape来自动reshape;
* 4、数据类型 数组名[][列数] = {val1, val2, ..., valn}; 自动reshape;
*
* 由上面可知,行数可省略,但是列数必须要在。
* 一般推荐第二种定义方式。
*/
// 函数定义五要素:
/* (1)返回类型,特殊地,void表示不需要返回值;
* (2)函数名;
* (3)参数;
* (4)函数体,即函数功能实现代码;
* (5)返回值。
*
* 返回类型 函数名(参数){函数体 返回值}
*/
/* 函数的声明
* 作用:告诉编译器函数名称以及如何调用函数。函数的实际主体可以单独定义。
*
* 函数声明可以有多次,但是定义只能有一次
*/
/* 函数的分文件编写
* 作用:让代码结构更加清晰
*
* 函数分文件编写一般有4个步骤:
* (1)创建后缀名为.h的头文件;
* (2)创建后缀名为.cpp的源文件;
* (3)在头文件中写函数声明;
* (4)在源文件中写函数的定义。
*/
/* 指针
* 作用:通过指针间接访问内存,利用指针变量保存地址。
* 定义: 数据类型 * 变量名;
* 占用内存:在32位系统中占用4个字节,而在64位系统中则是占用8个字节。
*
* 指针和普通变量的区别:
* - 普通变量存放的是数据,而指针存放的是地址;
* - 指针变量可以通过 "*" 操作符,操作指针变量指向的内存空间,这个过程称为解引用;
*
* 小结:
* (1)我们可以通过 &符号获取变量的地址;
* (2)利用指针可以记录地址;
* (3)对指针变量解引用,可以操作指针(地址)指向的内存;
*
*
* 空指针和野指针
* 空指针:指向内存中编号为0的空间。(内存编号0~255位系统保留地址,不可访问)
* 用途:初始化指针变量;
* 注意:空指针指向的内存是不可以访问的。
*
* 野指针:指向非法的内存空间(非申请空间)。
*
* 空指针和野指针都不是我们申请的空间,访问会报错。
*
*
* const修饰指针,分三种情况:
* (1)const修饰指针————常量指针。const int * p,const修饰的是指针,指针指向可以改变,但是其指向的值不能改变;
* (可以等价理解为const *p, *p为指向的值,因此指向的值不能改变,下面理解类同)
* (2)const修饰常量————指针常量。int * const p,const修饰的是常量,指针指向的值可以改变,但是其指向不能改变;
* (3)const既修饰指针,又修饰常量。const int * const p,const既修饰指针又修饰常量,指针指向和指向的值都不能改变。
*
* 技巧:看const右侧紧跟着的是指针还是常量,是指针就是常量指针,是常量就是指针常量。
*/
/* 结构体
* 基本概念:结构体属于用户自定义的数据类型,允许用户储存不同的数据类型;
*
* 结构体的定义和使用
* 定义语法:struct 结构体名称 {结构体成员列表(可理解为属性)};
* 通过结构体创建变量的方式有三种:
* (1)struct 结构体名称 变量名;
* (2)struct 结构体名称 变量名 = {成员1值,成员2值,...}
* (3)定义结构体时顺便创建变量:struct 结构体名称 {成员列表}变量名;
*
* 在创建结构体变量是,关键字struct可以省略。
*
*
* 结构体数组
* 作用:将自定义的结构体放入到数组中方便维护。
* 语法:struct 结构体名称 数组名[元素个数] = {{}, {}, ..., {}}
*
*
* 结构体指针
* 作用:通过指针访问结构体中的成员,利用操作符->可以通过结构体指针访问结构体属性。
*
* 嵌套结构体
* 定义:在一个结构体中定义另一个结构体。
* struct 结构体名称A {成员1,成员2, struct 结构体名称B(即成员3)};
*/
通讯录管理系统实战
//
// Created by shexuan on 2020/12/31.
//
#include <iostream>
#include <string>
#include<stdlib.h>
using namespace std;
#define MAX 1000 // 通讯录中最大人数
/* 创建一个通讯录管理系统,其功能主要包括:
* 1、添加联系人:向通讯录中添加新联系人,信息包括(姓名,性别,年龄,联系电话,家庭住址),最多纪录1000人;
* 2、显示联系人:显示通讯录中所有联系人的信息;
* 3、删除联系人:按照姓名进行删除指定联系人;
* 4、查找联系人:按照姓名查找指定联系人;
* 5、修改联系人:按照姓名重新修改联系人;
* 6、清空联系人:清空通讯录中所有信息;
* 7、退出通讯录:退出当前使用的通讯录。
*
*/
struct Person{
string m_Name; // 姓名
int m_Sex; // 性别:1男 2女
int m_Age; // 年龄
string m_Phone; // 电话
string m_Addr; // 住址
};
struct Addressbooks{
struct Person personArray[MAX]; // 通讯录中保存的联系人;
int m_Size;
};
// 添加联系人
void addPerson(Addressbooks * abs){
// 判断通讯录是否已满,如果满了就不再添加
if (abs->m_Size==MAX){
cout << "通讯录已满,无法添加!" << endl;
return;
}else{ // 添加具体联系人
//姓名
string name;
cout << "请输入姓名:";
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
// 性别
int sex = 0;
while (true){
cout << "请输入性别(1--男,2--女):";
cin >> sex;
if (sex==1 || sex==2){
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
cout << "输入有误,请重新输入!" << endl;
}
// 年龄
int age;
cout << "请输入年龄:";
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
// 电话
string phone;
cout << "请输入电话号码:";
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
// 住址
string addr;
cout << "请输入住址:";
cin >> addr;
abs->personArray[abs->m_Size].m_Addr = addr;
}
// 更新通讯录人数
abs->m_Size ++;
cout << "添加成功!" << endl;
// system("pause"); // Windows操作系统使用此代码
// system("cls"); // Windows操作系统使用此代码
cin.get(); // macOS 使用此代码
system("clear"); // macOS 使用此代码
}
// 显示联系人
void showPerson(const Addressbooks abs){
int size = abs.m_Size;
for (int i=0; i<size; i++){
cout<< "姓名:" << abs.personArray[i].m_Name << "\t";
cout<< "性别:" << (abs.personArray[i].m_Sex==1?"男性":"女性") << "\t";
cout<< "年龄:" << abs.personArray[i].m_Age << "\t";
cout<< "电话:" << abs.personArray[i].m_Phone << "\t";
cout<< "住址:" << abs.personArray[i].m_Addr << "\t";
cout << endl;
}
}
// 判断联系人是否存在
int isExist(const Addressbooks abs, string name){
if (abs.m_Size==0){
return -1;
}
for (int i=0; i<abs.m_Size; i++){
// 若找到了联系人,则返回其index
if (abs.personArray[i].m_Name == name){
return i;
}
}
// 遍历完都没找到,说明不存在此联系人,返回-1
return -1;
}
// 删除联系人
void DelPerson(Addressbooks * abs, int index){
// 数值为顺序储存,删除一个元素后,后面的元素都要前移
for (int i=index; i<abs->m_Size-1; i++){
abs->personArray[i] = abs->personArray[i+1];
}
// 现有联系人数量也要减一
abs->m_Size--;
cout << "删除成功!" << endl;
}
// 查找联系人
void findPerson(const Addressbooks abs, string name){
int exist_code = isExist(abs, name);
if (exist_code!=-1){
cout<< "姓名:" << abs.personArray[exist_code].m_Name << "\t";
cout<< "性别:" << (abs.personArray[exist_code].m_Sex==1?"男性":"女性") << "\t";
cout<< "年龄:" << abs.personArray[exist_code].m_Age << "\t";
cout<< "电话:" << abs.personArray[exist_code].m_Phone << "\t";
cout<< "住址:" << abs.personArray[exist_code].m_Addr << "\t";
cout << endl;
}else{
cout << "您所要查找的联系人不存在!" << endl;
}
}
// 修改联系人
void modifyPerson(Addressbooks * abs, string name){
if (abs->m_Size==0){
cout << "您所要修改的联系人不存在!" << endl;
}
for (int i=0; i<abs->m_Size; i++){
if (abs->personArray[i].m_Name==name){
cout<< "姓名:" ;
cin >> abs->personArray[i].m_Name;
int sex = 0;
while (true){
cout << "请输入性别(1--男,2--女):";
cin >> sex;
if (sex==1 || sex==2){
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
cout << "输入有误,请重新输入!" << endl;
}
cout<< "年龄:";
cin >> abs->personArray[i].m_Age;
cout<< "电话:";
cin >> abs->personArray[i].m_Phone;
cout<< "住址:";
cin >> abs->personArray[i].m_Addr;
return;
}
}
cout << "您所要修改的联系人不存在!" << endl;
}
void showMenu(){
cout << "***********************" << endl;
cout << "***** 1、添加联系人 *****" << endl;
cout << "***** 2、显示联系人 *****" << endl;
cout << "***** 3、删除联系人 *****" << endl;
cout << "***** 4、查找联系人 *****" << endl;
cout << "***** 5、修改联系人 *****" << endl;
cout << "***** 6、清空联系人 *****" << endl;
cout << "***** 0、退出通讯录 *****" << endl;
cout << "***********************" << endl;
}
int main(){
// 创建通讯录结构体变量
Addressbooks abs;
abs.m_Size = 0;
int select;
while (true){
showMenu();
cout << "请选择功能:";
cin >> select;
switch (select){
case 1: // 添加联系人
addPerson(&abs);
break;
case 2: // 显示联系人
showPerson(abs);
// system("pause"); // Windows操作系统使用此代码
// system("cls"); // Windows操作系统使用此代码
cin.get(); // macOS 使用此代码
system("clear"); // macOS 使用此代码
break;
case 3: { // 删除联系人
string name;
cout << "请输入待删除联系人姓名:";
cin >> name;
int exist_code = isExist(abs, name);
if (exist_code==-1){
cout << "您要删除的联系人不存在!" << endl;
}else{
DelPerson(&abs, exist_code);
}
break;
}
case 4: {// 查找联系人
string name;
cout << "请输入待查找联系人姓名:";
cin >> name;
findPerson(abs, name);
break;
}
case 5: {// 修改联系人
string name;
cout << "请输入待修改联系人姓名:";
cin >> name;
modifyPerson(&abs, name);
break;
}
case 6: // 清空联系人
abs.m_Size = 0;
cout << "通讯录已清空!";
break;
case 0: // 退出通讯录
cout << "欢迎下次使用!" << endl;
// system("pause"); windows系统的用法
cin.get();
return 0;
break;
default:
break;
}
}
}