首页 > 编程语言 >c++基础入门自学笔记总结3---结构体

c++基础入门自学笔记总结3---结构体

时间:2022-09-25 09:45:33浏览次数:48  
标签:入门 int age struct c++ --- len student 结构

卷首闲言碎语:大风起兮云飞扬,又到周末兮打卡辽~不过这周并没有学到什么,就学习了结构体,不过学完结构体后c++的学习之旅就要暂时告一段落了,因为这几天也是在忙活于社团还有RM战队的一个报名申请活动,今天上午还去参加了一场考试,刚刚还去参加了社团的面试,还是比较忙的,不过也可能是我时间没有安排到位才导致学习效率的低下,不过c++学习的停止并不意味着学习的停止,接下来我将转向c语言的学习,毕竟社团和战队都是要求的c语言。---记于9.24号晚

结构体基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型//与int ,string 这类一样属于数据类型,不同的在于这种数据类型是我们自己定义的,你想它叫什么它就叫什么,你想它是什么它就是什么(对,就是这么自由)

结构体定义和使用

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

例:struct student

{

int age;

string name;

}

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

  • struct 结构体名 变量名

例:struct student s1;

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

例:struct student s1={ 18,“李华”};

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

例:struct student{string name;int age}s1;

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

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

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

 

结构体数组

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

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

例:struct student sarr[3]={{”张三“,18},{"李四",19}{"王五",20}}

结构体指针

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

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

例:

#include<iostream>
#include<string>
using namespace std;
struct student {
string name;
int age;
int score;
};
int main() {
//创建学生结构体变量
struct student s = { "张三",18,100 };
//通过指针指向结构体变量
struct student* p = &s;
//通过指针访问结构体变量中的数据
//通过结构体指针访问结构体中的属性,需要利用“->”
cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
system("pause");
return 0;
}

运行结果:

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

 结构体嵌套结构体

作用:结构体中的成员可以是另一个结构体

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

#include<iostream>
#include<string>
using namespace std;
//定义学生结构体
struct student {
string name;
int age;
int score;
};
//定义老师结构体
struct teacher {
string name;
int age;
struct student stu;
int id;
};
int main() {
struct teacher t;
t.name = "老李";
t.age = 60;
t.id = 20220609;
t.stu.name = "小吴";
t.stu.age = 18;
t.stu.score = 100;
cout << "指导老师为" << t.name << ",今年" << t.age << "岁,他的员工编号为" << t.id
<< ".他的爱徒" << t.stu.name << "今年" << t.stu.age << "岁,本次大赛中取得了"
<< t.stu.score << "分的好成绩" << endl;
system("pause");
return 0;
}

运行结果:

总结:在结构体中可以定义另一个结构体作为成员,用来解决实际问题

结构体做函数参数

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

传递方式有两种:

  • 值传递

  • 地址传递

例:

#include<iostream>
#include<string>
using namespace std;
//定义学生结构体
struct student {
int age;
int score;
string name;
};
//值传递
void printstudent1(struct student s) {
cout << "姓名为:" << s.name << " 年龄为:" << s.age << " 分数为:" << s.score << endl;
}
//地址传递
void printstudent2(struct student*p){
cout << "姓名为:" << p->name << " 年龄为:" << p->age << " 分数为:" << p->score << endl;
}
int main() {
//结构体做函数参数
//将学生传入到一个参数中,打印学生身上的所有信息
//创建结构体变量
struct student s;
s.age = 18;
s.name = "张三";
s.score = 99;
printstudent1(s);
printstudent2(&s);
system("pause");
return 0;
}

 都能够正常输出,下面来看一下更改数据后的结果有什么不同

在值传递函数中加入 s.name = "李四";改变形参,在main函数中将实参做一个输出 cout << "main函数中" << s.name << endl;结果如下:

 可以看到在值传递函数中形参输出结果发生了改变,不过实参的值并没有发生改变。

同样的方式测试地址传递中的数据改动结果

 可以看到实参和形参的数据都发生了改变。

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

结构体中 const使用场景

作用:用const来防止误操作

例:

//const使用场景
void printStudent(const student *stu) //加const防止函数体中的误操作
{
//stu->age = 100; //操作失败,因为加了const修饰
cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl;

}

结构体案例

8.8.1 案例1

案例描述:

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

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

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

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

代码如下:

#include<iostream>
#include<string>
using namespace std;
//学生结构体定义
struct student {
int score;
string sname;
};
//老师结构体定义
struct teacher {
int age;
string tname;
student tstudent[5];
};
//给老师和学生赋值的函数
void input(struct teacher sarr[], int len) {
       string tname = "教师";
      string sname = "学生";
      string nameseed = "ABCDE";
      for (int i = 0; i < len; i++) {

      sarr[i].tname = tname + nameseed[i];
      for (int j = 0; j < 5; j++) {
      sarr[i].tstudent[j].sname = sname + nameseed[j];
      sarr[i].tstudent[j].score = rand() % 100;
     }
  }
}
void output(struct teacher tarr[], int len) {
      for (int i = 0; i < len; i++) {

      cout << tarr[i].tname << endl;
      for (int j = 0; j < len; j++) {

      cout << " \t姓名:" <<

      tarr[i].tstudent[j].sname <<
      "\t分数:"<<
        tarr[i].tstudent[j].score << endl;
      }
   }
}
int main() {
srand((unsigned int)time(NULL));
//创建3名老师的数组
struct teacher tarr[3];
int len = sizeof(tarr) / sizeof(tarr[0]);
//通过函数给3名老师的信息赋值,并给老师带的学生信息赋值
input(tarr, len);
//打印所有老师及所带的学生信息
output(tarr, len);
system("pause");
return 0;
}

结果如下:

 

案例2

案例描述:

设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。

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

五名英雄信息如下:

        {"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"},
 代码如下:

#include<iostream>
#include<string>
using namespace std;
//设计英雄结构体
struct hero
{
//姓名
string name;
//年龄
int age;
//性别
string sex;
};
void bubblesort(struct hero heroarry[], int len) {
           for (int i = 0; i < len - 1; i++) {
           for (int j = 0; j < len - i - 1; j++) {
           if (heroarry[j].age > heroarry[j + 1].age) {
           struct hero temp = heroarry[j];
           heroarry[j] = heroarry[j + 1];
           heroarry[j + 1] = temp;
          }
       }
   }
}
void printhero(struct hero heroarry[], int len) {
for (int i = 0; i < len; i++) {
     cout << "姓名:" << heroarry[i].name
     << " 性别:" << heroarry[i].sex
     << " 年龄:" << heroarry[i].age << endl;
  }
}
int main() {
//创建数组存放5名英雄
struct hero heroarry[5]{
{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"},
};
int len = sizeof(heroarry) / sizeof(heroarry[0]);
cout << "排序前:" << endl;
for (int i = 0; i < len; i++) {
cout << "姓名:" << heroarry[i].name
<< " 性别:" << heroarry[i].sex
<< " 年龄:" << heroarry[i].age << endl;
}
cout << "排序后" << endl;
//对数组进行排序,按照年龄进行升序排序
bubblesort(heroarry, len);
//将排序后结果打印输出
printhero(heroarry, len);
system("pause");
return 0;
}

结果如下:

好了,结构体的大致内容就是这些,本来还在学习用c++做一个通讯录的项目练习,不过才学到一半,如果可以的话,我是希望学完这一练习后再开始c语言的学习,希望国庆前能学完吧。

标签:入门,int,age,struct,c++,---,len,student,结构
From: https://www.cnblogs.com/shugexia-blogs/p/16726934.html

相关文章

  • Stop Learning English Words by ROTE - guner
    英语单词的最高境界就是不背单词/?来自一本魔性的书,书的作者自称“枪哥”虽然slogan是这样但是实际上书中介绍了一些有关于单词和中文的区别与类同用词根词缀的方式去演......
  • day01 -> MySQL数据库(安装、卸载、配置)
    一、数据库的基本概念(拓展知识):1、数据库的英文:DataBase,简称DB;2、什么是数据库?*用于存储和管理数据的仓库3、数据库的特点:持久化存储数据的,本质上数据库就是一个文件......
  • Macbook pro 2015-mid 15寸 安装Debian时所需无线网卡驱动
    给自己留个备份,防止以后装机找不到。Macbookpro2015-mid15寸安装Debian时所需无线网卡驱动:链接:https://pan.baidu.com/s/1o1oUZhK17fpgxpwH6bBkRQ?pwd=6kpt提取码:6k......
  • 逆向工程核心原理---RVA转RAW
    逆向工程核心原理---RVA转RAWImageBase,基址,如:0x00400000VA,VirtualAddress,虚拟地址,如:0x00418ABCRVA,RelativeVirtualAddress,相对虚拟地址,如:0x00......
  • 注解-自定义注解-元注解和解析注解
    注解-自定义注解-元注解元注解:就是用于描述注解的注解@Target:描述注解能够作用的位置@Retention:苗猪注解被保留的阶段@Documented:描述注解是......
  • 【代码片段】Qt6.2.4 C++ 退出应用程序方式
    转载https://blog.csdn.net/kidults/article/details/78549336正文触发析构函数方式//这种方式不会触发析构函数QApplication::exit(0);不触发析构函数方式(直接......
  • Logstash 入门实战(2)--安装及使用
    本文主要介绍Logstash的安装及简单的使用,相关的环境及软件信息如下:CentOS 7.9、Logstash8.2.2、Elasticsearch8.2.2。1、安装根据环境下载对应的安装包:https://www.......
  • C++源码压缩程序
    C++源码压缩程序一、必做内容:(一)压缩器1.为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以节省磁盘空间,那么你可以......
  • 二--5.经典进程的同步问题
    先申请资源信号量,再申请互斥信号量1.生产者-消费者问题   1.1利用记录型信号量......
  • WPF开发中遇到的新知识 -- 1
    前后台同时启动的方式目的:希望在WPF前台启动后,带动ASP.NETCore后台服务一同启动,在前台关闭后,也一起关闭方法:在打开窗口之前,首先手动打开ASP.NETCore子进程,然后注册......