赞
踩
1.用const来防止误操作。
2.为了节省空间,选择了地址传递,但地址传递有可能导致被修改,所以加入了const
3.将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来。
void printstudent1( const student * s1) { s1->age = 22; //报错:表达式必须是可修改的左值 //使用const以后不能再函数内修改 cout << "在void函数中打印:" << endl; cout << "学生姓名:" << s1->name << " " << "学生年龄:" << s1->age << " " << "学号:" << s1->id << endl; }
//完整代码 //学生结构体定义 struct student { //成员列表 string name; //姓名 int age; //年龄 int score; //分数 }; //const使用场景 void printStudent(const student *stu) //加const防止函数体中的误操作 { //stu->age = 100; //操作失败,因为加了const修饰 cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl; } int main() { student stu = { "张三",18,100 }; printStudent(&stu); system("pause"); return 0; }
案例描述:
学校正在做毕业设计项目,每名老师带领5个学生,总共有三名老师,需求如下
设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员,学生的成员有姓名,考试分数,创建数组存放三名老师,通过函数给每个老师所带的学生复制,最终打印出老师数据以及老师所带的学生数据。
①通过结构嵌套,如何赋值嵌套数组和主数组中的元素,并访问
②用给字符串student_(abcde)循环赋值
③生成随机数的思想
④按照结构一步一步来
- #include<iostream>
- using namespace std;
- #include<string>
- #include<ctime>
- struct student //创建嵌套结构体(学生)
- {
- string Sname;
- int score;
- };
- struct teacher //创建老师结构体
- {
- string tname;
- struct student Sarr[5]; //嵌套学生的结构体数组
- };
- void fuzhi_information(struct teacher Tarr[], int len)
- { //通过函数进行赋值
- string pname[3] = { "老王","老李","老张" }; //这里自己改装了一下
- string hname = "ABCDE";
- for (int i = 0; i < len; i++)
- {
- Tarr[i].tname = "Teacher_";
- Tarr[i].tname += pname[i]; //这个是技巧(移动下标)
- for (int j = 0; j < 5; j++)
- {
- Tarr[i].Sarr[j].Sname = "student_";
- Tarr[i].Sarr[j].Sname += hname[j];
- //随机生成学生的成绩
- int random = rand() % 61 + 40;
- Tarr[i].Sarr[j].score =random;
- }
- }
- }
- void printinformation(struct teacher Tarr[], int len)
- {
- for (int i = 0; i < len; i++)
- { // \t的应用
- cout << "\t老师姓名:" << Tarr[i].tname << endl;
- for (int j = 0; j < 5; j++)
- {
- cout << "学生姓名:" << Tarr[i].Sarr[j].Sname <<
- " 考试成绩:" << Tarr[i].Sarr[j].score << endl;
- }
- }
- }
- int main()
- {
- //在主函数中定义随机数种子
- srand((unsigned int)time(NULL));
- //创建老师的结构体数组
- struct teacher Tarr[3];
- int len = sizeof(Tarr) / sizeof(Tarr[0]);
- //通过函数给3位老师信息赋值,并给老师带的学生信息赋值
- fuzhi_information(Tarr, len);
- printinformation(Tarr, len);
- //通过打印所有老师及所带学生的信息
- return 0;
- }
案例:设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,
数组中存放五个英雄,通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,
最终打印排序后的结果。代码部分:
#include<iostream> using namespace std; #include<string> //1创建结构体 struct Hero { string name; int age; string sex; }; //2.使用冒泡排序升序 void Heropaopao(struct Hero heroarray[], int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1 - i; j++) { if (heroarray[j].age > heroarray[j + 1].age) { Hero temp = heroarray[j]; heroarray[j] = heroarray[j + 1]; heroarray[j + 1] = temp; } } } } int main() { //创建结构体数组 struct Hero heroarray[5] = { {"刘备",23,"男"}, {"关羽",22,"男"}, {"张飞",20,"男"}, {"赵云",21,"男"}, {"貂蝉",2000,"女"}, }; //排序前输出一次 cout << "使用升序前输出一次" << endl; int len = sizeof(heroarray) / sizeof(heroarray[0]); for (int i = 0; i < len; i++) { cout << "姓名:" << heroarray[i].name << " " << "年龄:" << heroarray[i].age << " " << "性别:" << heroarray[i].sex << endl; } //创建冒泡排序函数 Heropaopao(heroarray, len); //3.排序后再输出一次 cout << " " << endl;//为了更直观分别出两次的区别 cout << "使用升序后输出一次" << endl; for (int i = 0; i < len; i++) { cout << i + 1 << "号英雄:" << endl; cout << "姓名:" << heroarray[i].name << " " << "年龄:" << heroarray[i].age << " " << "性别:" << heroarray[i].sex << endl; } }主要是应用到了冒泡排序
存在三个问题:
① 先有年龄判断大小再交换数组数据,而不是交换年龄
② 用 Hero temp 而不是 int temp 的区别
③?结构体指针传入形参和实参到底怎么应用 (形参实参到底怎么写? 这个问题比较重要)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。