• C++之结构体以及通讯录管理系统


    1,结构体基本概念

    结构体属于自定义的数据概念,允许用户存储不同的数据类型

    2,结构体的定义和使用

    语法:struct  结构体名{ 结构体成员列表};

    通过结构体创建变量的方式有三种:

    1,struct  结构体名  {  结构体成员列表 }

    示例:

    1. //1,创建学生数据类型:包括姓名,年龄,成绩
    2. //自定义数据类型,一些类型集合组成一个类型
    3. struct Student
    4. {
    5. //成员列表
    6. //姓名
    7. string name;
    8. //年龄
    9. int age;
    10. //成绩
    11. char score;
    12. };
    13. int main()
    14. {
    15. //2,通过学生类型创建具体学生
    16. struct Student s1;
    17. //给s1赋值,通过“.”访问结构体变量中的属性
    18. s1.name = "张三";
    19. s1.age = 18;
    20. s1.score = 100;
    21. cout << "姓名:" << s1.name << "年龄:" << s1.age << "成绩:" << s1.score << endl;
    22. system("pause");
    23. return 0;
    24. }

     

    2,struct  结构体名  变量名= {成员1值,成员2值......}

    1. #include<iostream>
    2. using namespace std;
    3. #include<string>
    4. //1,创建学生数据类型:包括姓名,年龄,成绩
    5. //自定义数据类型,一些类型集合组成一个类型
    6. struct Student
    7. {
    8. //成员列表
    9. //姓名
    10. string name;
    11. //年龄
    12. int age;
    13. //成绩
    14. int score;
    15. };
    16. int main()
    17. {
    18. struct Student s2 = { "李四",20,90 };
    19. cout << "姓名:" << s2.name << "年龄:" << s2.age << "成绩:" << s2.score << endl;
    20. system("pause");
    21. return 0;
    22. }

    3,定义结构体时顺便创建变量

    1. #include<iostream>
    2. using namespace std;
    3. #include<string>
    4. //1,创建学生数据类型:包括姓名,年龄,成绩
    5. //自定义数据类型,一些类型集合组成一个类型
    6. struct Student
    7. {
    8. //成员列表
    9. //姓名
    10. string name;
    11. //年龄
    12. int age;
    13. //成绩
    14. int score;
    15. }s3;
    16. int main()
    17. {
    18. s3.name = "王五";
    19. s3.age = 56;
    20. s3.score = 99;
    21. cout << "姓名:" << s3.name
    22. << "年龄:" << s3.age
    23. << "成绩:" << s3.score << endl;
    24. system("pause");
    25. return 0;
    26. }

    总结1:定义结构体时的关键字是struct,不可省略

    总结2:创建结构体变量时,关键字struct可以省略

    总结3:结构体变量利用操作符”.“访问成员 

    建议用前面两种方式

    3,结构体数组

    作用:将自定义的结构他放入到数列中方便维护

    语法:struct  结构体名   数组名[元素个数]={{},{},{}};

    示例

    1. struct student
    2. {
    3. //成员列表
    4. //姓名
    5. string name;
    6. //年龄
    7. int age;
    8. //成绩
    9. int score;
    10. };
    11. int main()
    12. {
    13. //创建结构体数组
    14. struct student StuArr[3] =
    15. {
    16. {"张三",18,100},
    17. {"李四",28,99},
    18. {"王五",28,66}
    19. };
    20. //给结构体数组中的元素赋值
    21. StuArr[2].name = "赵六";
    22. StuArr[2].age = 60;
    23. StuArr[2].score = 82;
    24. //遍历结构体数组
    25. for (int i = 0; i < 3; i++)
    26. {
    27. cout << "姓名:" << StuArr[i].name
    28. << "年龄:" << StuArr[i].age
    29. << "成绩:" << StuArr[i].score << endl;
    30. }
    31. system("pause");
    32. return 0;
    33. }

    4,结构体指针

    作用:通过指针访问结构体成员

    利用->操作符可以通过结构体指针访问结构体属性

    示例:

    1. struct Student
    2. {
    3. //成员列表
    4. //姓名
    5. string name;
    6. //年龄
    7. int age;
    8. //成绩
    9. int score;
    10. };
    11. int main()
    12. {
    13. struct Student s2 = { "李四",20,90 };
    14. struct Student* p = &s2;
    15. p->score = 80;
    16. cout << "姓名:" << s2.name << "年龄:" << s2.age << "成绩:" << s2.score << endl;
    17. system("pause");
    18. return 0;
    19. }

    总结:结构体指针可以通过->操作符来访问结构体中的成员 

    5,结构体嵌套结构体

    作用:结构体中的成员时另一个结构体:

    例如:每个老师辅导一个学生,一个老师的结构体中,记录一个学生的结构体

    示例:

    1. //结构体嵌套结构体
    2. struct student
    3. {
    4. //学生列表
    5. string name;//学生名字
    6. int age; //学生年龄
    7. int score;//学生成绩
    8. };
    9. struct teacher
    10. {
    11. //成员列表
    12. int id;//职工编号
    13. string name;//教师姓名
    14. int age;//年龄
    15. struct student s1;//老师所辅导的学生
    16. };
    17. int main()
    18. {
    19. //结构体嵌套结构体
    20. //创建老师
    21. teacher t;
    22. t.id = 10000;
    23. t.name = "老王";
    24. t.age = 25;
    25. t.s1.name = "小王";
    26. t.s1.age = 18;
    27. t.s1.score = 100;
    28. cout << "老师姓名:" << t.name << endl;
    29. cout << "老师编号:" << t.id << endl;
    30. cout << "老师年龄:" << t.age << endl;
    31. cout << "老师辅导的学生:" << t.s1.name << endl;
    32. cout << "老师辅导的学生的年龄:" << t.s1.age << endl;
    33. cout << "老师辅导的学生的成绩" << t.s1.score << endl;
    34. system("pause");
    35. return 0;
    36. }

    6,结构体做函数参数

    作用:将结构体作为参数向函数中传递

    传递的方式有两种:

       值传递

    1. struct student
    2. {
    3. //学生列表
    4. string name;//学生名字
    5. int age; //学生年龄
    6. int score;//学生成绩
    7. };
    8. void printfstudent1(struct student s)
    9. {
    10. s.age=56;
    11. cout << "子函数中的打印" << endl;
    12. cout << " 姓名:" << s.name << "年龄:" << s.age << "成绩:" << s.score << endl;
    13. }
    14. int main()
    15. {
    16. struct student s;
    17. s.name = "张三";
    18. s.age = 18;
    19. s.score = 100;
    20. cout << "main函数中的打印:" << endl;
    21. cout << " 姓名:"<<s.name << "年龄:" << s.age << "成绩:" << s.score << endl;
    22. printfstudent1(s);//结构体做函数参数
    23. system("pause");
    24. return 0;
    25. }

       地址传递

    1. struct student
    2. {
    3. //学生列表
    4. string name;//学生名字
    5. int age; //学生年龄
    6. int score;//学生成绩
    7. };
    8. void printfstudent2(struct student* p)
    9. {
    10. p->age = 100;
    11. cout << "子函数中的打印" << endl;
    12. cout << " 姓名:" << p->name << "年龄:" << p->age << "成绩:" << p->score << endl;
    13. }
    14. int main()
    15. {
    16. struct student s;
    17. s.name = "张三";
    18. s.age = 18;
    19. s.score = 100;
    20. cout << "main函数中的打印:" << endl;
    21. cout << " 姓名:" << s.name << "年龄:" << s.age << "成绩:" << s.score << endl;
    22. printfstudent2(&s);
    23. system("pause");
    24. return 0;
    25. }

    总结:如果不想修改主函数中的数据,用值传递,反之,用地址传递 

    7,结构体中const的使用场景

    作用:用const来防止操作错误

    示例:

    1. //const 使用场景
    2. //将函数中的形参改为指针,可以减少内存空间,而且不会复制出新的副本出来
    3. void printfstudent2(struct student* p)//加const防止函数体中的误操作
    4. {
    5. //p->age = 100;加了const,不可以修改数据,可以防止我们的误操作
    6. cout << "子函数中的打印" << endl;
    7. cout << " 姓名:" << p->name << "年龄:" << p->age << "成绩:" << p->score << endl;
    8. }

    8,结构体案例

    8.1 案例1

    学校正在做毕设项目,每名老师带领5名学生,总共三名老师,需求如下:

    设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员

    学生的成员有姓名,考试成绩,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值

    最终打印出老师数据以及老师所带的学生数据

    代码展示:

    1. #include<iostream>
    2. using namespace std;
    3. #include<string>
    4. #include<ctime>
    5. //学生的结构体
    6. struct student
    7. {
    8. string sName;
    9. int score;
    10. };
    11. //老师的结构体
    12. struct teacher
    13. {
    14. string tName;
    15. struct student sArray[5];
    16. };
    17. //信息赋值
    18. void allocate_student(struct teacher tArray[], int len)
    19. {
    20. string nameSeed = "ABCDE";
    21. for (int i = 0; i < len; i++)
    22. {
    23. tArray[i].tName = "Teacher";
    24. tArray[i].tName += nameSeed[i];
    25. for (int j = 0; j < 5; j++)
    26. {
    27. tArray[i].sArray[j].sName = "Studemt_";
    28. tArray[i].sArray[j].sName += nameSeed[j];
    29. int random = rand() % 61 + 40;//40~99
    30. tArray[i].sArray[j].score = random;
    31. }
    32. }
    33. }
    34. //打印所有老师及所带的学生信息
    35. void print_Student(struct teacher tArray[], int len)
    36. {
    37. for (int i = 0; i < len; i++)
    38. {
    39. cout << "老师姓名:" << tArray[i].tName << endl;
    40. for (int j = 0; j < 5; j++)
    41. {
    42. cout << "\t学生姓名:" << tArray[i].sArray[j].sName
    43. <<"学生成绩:"<< tArray[i].sArray[j].score << endl;
    44. }
    45. }
    46. }
    47. int main()
    48. {
    49. srand((unsigned)time(NULL));
    50. //1,创建3名老师的数组
    51. struct teacher tArray[3];
    52. //2,通过函数给3名老师赋值,并给老师带的学生信息赋值
    53. int len = sizeof(tArray) / sizeof(tArray[0]);
    54. allocate_student(tArray, len);
    55. //3,打印所有老师及所带的学生信息
    56. print_Student(tArray, len);
    57. system("pause");
    58. return 0;
    59. }

    8.2 案例二

    案例描述:

    设计一个英雄的结构体,包括成员姓名,年龄,性别;

    创建结构体数组,数组中存放5名英雄。

    通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果

    五名英雄信息如下:

    {”刘备“,23,”男“}

    {“关羽”,22,“男”}

    {“张飞”,21,“男”}

    {“赵云”,20,“男”}

    {“貂蝉”,19,“女”}

    代码如下:

    1. #include<iostream>
    2. using namespace std;
    3. #include<string>
    4. //1,设计英雄结构体
    5. struct Hero
    6. {
    7. //姓名
    8. string name;
    9. //年龄
    10. int age;
    11. //性别
    12. string sex;
    13. };
    14. void printsort(struct Hero Array[], int len)
    15. {
    16. cout << "排序后" << endl;
    17. for (int i = 0; i < len; i++)
    18. {
    19. cout << "英雄姓名:" << Array[i].name << "\t"
    20. << "英雄年龄:" << Array[i].age << "\t"
    21. << "英雄性别:" << Array[i].sex << "\t"
    22. << endl;
    23. }
    24. }
    25. void Bubblesort(struct Hero Array[], int len)
    26. {
    27. for (int i = 0; i < len - 1; i++)
    28. {
    29. for (int j = 0; j < len - i - 1; j++)
    30. {
    31. if (Array[j].age > Array[j + 1].age)
    32. {
    33. int temp = Array[j].age;
    34. Array[j].age = Array[j + 1].age;
    35. Array[j+1].age = temp;
    36. }
    37. }
    38. }
    39. }
    40. int main()
    41. {
    42. //2,创建数组存放英雄
    43. struct Hero Array[5] =
    44. {
    45. {"刘备",23,"男" },
    46. { "关羽",22,"男" },
    47. { "张飞",21,"男" },
    48. { "赵云",20,"男" },
    49. { "貂蝉",19,"女" }
    50. };
    51. int len = sizeof(Array) / sizeof(Array[0]);
    52. cout << "排序前" << endl;
    53. for (int i = 0; i < len; i++)
    54. {
    55. cout << "英雄姓名:" << Array[i].name << "\t"
    56. << "英雄年龄:" << Array[i].age << "\t"
    57. << "英雄性别:" << Array[i].sex << "\t"
    58. << endl;
    59. }
    60. //3,创建函数对数组进行排序,按照年龄进行升序排序
    61. Bubblesort(Array, len);
    62. //4,对排序后结果进行打印输出
    63. printsort(Array, len);
    64. system("pause");
    65. return 0;
    66. }

     

    9, 通讯录管理系统

    1. #include<iostream>
    2. using namespace std;
    3. #include<string>//头文件信息
    4. #define MAX 1000
    5. //联系人结构体
    6. struct Person
    7. {
    8. string m_name;//姓名
    9. int m_sex;//性别
    10. int m_age;//年龄
    11. string m_phone;//电话
    12. string m_address;//住址
    13. };
    14. //通讯录结构体
    15. struct Addressbooks
    16. {
    17. struct Person personArray[MAX];//通讯录保存联系人信息
    18. int m_size;//通讯录中人员个数
    19. };
    20. //菜单界面
    21. void showMenu()
    22. {
    23. cout << "**********************" << endl;
    24. cout << "*****1,添加联系人*****" << endl;
    25. cout << "*****2,显示联系人*****" << endl;
    26. cout << "*****3,删除联系人*****" << endl;
    27. cout << "*****4,查找联系人*****" << endl;
    28. cout << "*****5,修改联系人*****" << endl;
    29. cout << "*****6,清空联系人*****" << endl;
    30. cout << "*****0,退出通讯录*****" << endl;
    31. cout << "**********************" << endl;
    32. cout << endl;
    33. }
    34. //添加联系人
    35. void addPerson(Addressbooks * abs)
    36. {
    37. //先判断通讯录是否已满,如果满了后不再添加
    38. if (abs->m_size == MAX)
    39. {
    40. cout << "通讯录已满,无法添加!" << endl;
    41. return;
    42. }
    43. else
    44. {
    45. //添加联系人
    46. //姓名
    47. string name;
    48. cout << "请输入名字:" << endl;
    49. cin >> name;
    50. abs->personArray[abs->m_size].m_name = name;
    51. //性别
    52. cout << "请输入性别" << endl;
    53. cout << "1----男" << endl;
    54. cout << "2----女" << endl;
    55. int sex = 0;
    56. while (true)
    57. {
    58. cin >> sex;
    59. if (sex == 1 || sex == 2)
    60. {
    61. abs->personArray[abs->m_size].m_sex = sex;
    62. break;
    63. }
    64. cout << "输入有误,请重新输入" << endl;
    65. }
    66. //年龄
    67. cout << "请输入年龄" << endl;
    68. int age = 0;
    69. cin >> age;
    70. abs->personArray[abs->m_size].m_age = age;
    71. //联系电话
    72. cout << "请输入电话" << endl;
    73. string phone;
    74. cin >> phone;
    75. abs->personArray[abs->m_size].m_phone = phone;
    76. //家庭住址
    77. cout << "请输入地址" << endl;
    78. string address;
    79. cin >> address;
    80. abs->personArray[abs->m_size].m_address = address;
    81. //更新通讯录人数
    82. abs->m_size++;
    83. cout << "添加成功" << endl;
    84. }
    85. system("pause");//按任意键继续
    86. system("cls");//清屏操作
    87. }
    88. //显示联系人
    89. void showPerson(Addressbooks* abs)
    90. {
    91. //判断如果当前通讯录中没有人员,就提示记录为空
    92. //人数大于0,显示通讯录中信息
    93. if (abs->m_size == 0)
    94. {
    95. cout << "当前记录为空" << endl;
    96. }
    97. else
    98. {
    99. for (int i = 0; i < abs->m_size; i++)
    100. {
    101. cout << "姓名:" << abs->personArray[i].m_name << "\t";
    102. cout << "性别:" << (abs->personArray[i].m_sex == 1 ? "男" : "女" )<< "\t";
    103. cout << "年龄:" << abs->personArray[i].m_age << "\t";
    104. cout << "电话:" << abs->personArray[i].m_phone << "\t";
    105. cout << "地址:" << abs->personArray[i].m_address << endl;
    106. }
    107. }
    108. system("pause");//按任意键继续
    109. system("cls");//清屏操作
    110. }
    111. //如果存在,返回联系人在通讯录中的位置,不存在则返回 - 1
    112. //参数1 通讯录 参数2 对比姓名
    113. int isExist(Addressbooks * abs,string name)
    114. {
    115. for (int i = 0; i < abs->m_size ; i++)
    116. {
    117. //找到用户姓名
    118. if (abs->personArray[i].m_name == name)
    119. {
    120. //返回这个人的下标
    121. return i;
    122. }
    123. return -1;//如果遍历结果都没有找到,则返回-1
    124. }
    125. }
    126. void deletePerson(Addressbooks * abs, string name)
    127. {
    128. int ret = isExist(abs, name);
    129. //ret==-1 未查到
    130. //ret != 1 查到了
    131. if (ret != -1)
    132. {
    133. //查到人,要进行删除操作
    134. for (int i = 0; i < abs->m_size; i++)
    135. {
    136. //数据迁移
    137. //删除:就是将后面每个人的信息的位置替换前一个人的信息
    138. abs->personArray[i] = abs->personArray[i + 1];
    139. }
    140. abs->m_size--;
    141. cout << "删除成功" << endl;
    142. }
    143. else
    144. {
    145. cout << "查无此人" << endl;
    146. }
    147. system("pause");
    148. system("cls");
    149. }
    150. void findPerson(Addressbooks * abs)
    151. {
    152. cout << "输入您要查找的联系人" << endl;
    153. string name;
    154. cin >> name;
    155. //判断联系人是否在通讯录中
    156. int ret = isExist(abs, name);
    157. if (ret != -1)//找到联系人
    158. {
    159. cout << "姓名:" << abs->personArray[ret].m_name << "\t";
    160. cout << "性别:" << (abs->personArray[ret].m_sex == 1 ? "男" : "女") << "\t";
    161. cout << "年龄:" << abs->personArray[ret].m_age << "\t";
    162. cout << "电话:" << abs->personArray[ret].m_phone << "\t";
    163. cout << "地址:" << abs->personArray[ret].m_address << endl;
    164. }
    165. else
    166. {
    167. cout << "查无此人" << endl;
    168. }
    169. system("pause");
    170. system("cls");
    171. }
    172. void modifyPerson(Addressbooks* abs)
    173. {
    174. cout << "输入您要修改的联系人" << endl;
    175. string name;
    176. cin >> name;
    177. int ret = isExist(abs, name);
    178. if (ret != -1)//找到联系人
    179. {
    180. //姓名
    181. string name;
    182. cout << "请输入名字:" << endl;
    183. cin >> name;
    184. abs->personArray[ret].m_name = name;
    185. //性别
    186. cout << "请输入性别" << endl;
    187. cout << "1----男" << endl;
    188. cout << "2----女" << endl;
    189. int sex = 0;
    190. while (true)
    191. {
    192. cin >> sex;
    193. if (sex == 1 || sex == 2)
    194. {
    195. abs->personArray[ret].m_sex = sex;
    196. break;
    197. }
    198. cout << "输入有误,请重新输入" << endl;
    199. }
    200. //年龄
    201. cout << "请输入年龄" << endl;
    202. int age = 0;
    203. cin >> age;
    204. abs->personArray[ret].m_age = age;
    205. //联系电话
    206. cout << "请输入电话" << endl;
    207. string phone;
    208. cin >> phone;
    209. abs->personArray[ret].m_phone = phone;
    210. //家庭住址
    211. cout << "请输入地址" << endl;
    212. string address;
    213. cin >> address;
    214. abs->personArray[ret].m_address = address;
    215. cout << "修改成功" << endl;
    216. }
    217. else
    218. {
    219. cout << "查无此人" << endl;
    220. }
    221. system("pause");
    222. system("cls");
    223. }
    224. void cleanPerson(Addressbooks* abs)
    225. {
    226. abs->m_size = 0;
    227. cout << "通讯录已经清空" << endl;
    228. system("pause");
    229. system("cls");
    230. }
    231. int main()
    232. {
    233. Addressbooks abs;//创建通讯录结构体变量
    234. abs.m_size = 0;//初始化当前人数个数
    235. int select = 0;//创建用户输入变量
    236. while (1)
    237. {
    238. //调用菜单
    239. showMenu();
    240. cout << "请输入:" << endl;
    241. int select = 0;
    242. cin >> select;
    243. switch (select)
    244. {
    245. case 1://1,添加联系人
    246. addPerson(&abs);//利用地址传参,可以修饰实参
    247. break;
    248. case 2://2, 显示联系人
    249. showPerson(&abs);
    250. break;
    251. case 3://3,删除联系人
    252. {
    253. cout << "请输入删除联系人的姓名:" << endl;
    254. string name;
    255. cin >> name;
    256. if (isExist(&abs, name) == -1)
    257. {
    258. cout << "查无此人" << endl;
    259. }
    260. else
    261. {
    262. cout << "找到此人" << endl;
    263. }
    264. deletePerson(&abs, name);
    265. }
    266. break;
    267. case 4://4,查找联系人
    268. findPerson(&abs);
    269. break;
    270. case 5://5,修改联系人
    271. modifyPerson(&abs);
    272. break;
    273. case 6://6,清空联系人
    274. cleanPerson(&abs);
    275. break;
    276. case 0://0,退出通讯录
    277. cout << "欢迎下次使用!" << endl;
    278. system("pause");
    279. break;
    280. default:
    281. break;
    282. }
    283. }
    284. system("pause");
    285. return 0;
    286. }

    通讯录管理系统具体操作请看以下文章:

    本文链接:c++之通讯录管理系统-CSDN博客

  • 相关阅读:
    关于解释型语言和编译性语言的区别
    乱七八糟:程序员(媛)请保护好自己
    世界前沿技术发展报告2023《世界航空技术发展报告》(二)军用飞机技术
    linux安装mysql
    智能自动化输送分拣集成设备|快递自动分拣设备厂家告诉您如何提高10倍分拣效率
    ICCV2023人脸识别TransFace论文及代码学习笔记
    【LeetCode】1838. 最高频元素的频数
    基于Java毕业设计养老机构系统源码+系统+mysql+lw文档+部署软件
    HTML5生成二维码
    【k8s】一、基础实验环境准备
  • 原文地址:https://blog.csdn.net/bai_lan_ya/article/details/136415450