导读
C++是大多数学生入门信息学、参加信息学竞赛必备的编程语言。掌握C++,能够有助于孩子未来工作发展,也能提升孩子的综合能力,如抗挫折能力、逻辑分析能力等。
上一篇文章,我们入门讲解了结构体的相关知识,本篇文章中,让我们一起来更加深入了解结构体吧!
1 结构体复习
前面一节课,我们讲解了结构体的基本知识,首先,我们先来复习一下!
结构体我们主要讲解了和结构体有关的重要内容,讲解了结构体变量的相关内容,接下来就让我们围绕结构体和结构体变量进行复习吧!
1 结构体
首先我们先来复习一下结构体。
我们可以使用struct关键字定义一个结构体,在结构体里包括结构体的各个属性。
结构体的定义方式如下:
struct [结构体名] {
属性类型1 属性名1;
属性类型2 属性名2;
……
属性类型n 属性名n;
};
注意,一般结构体名首字母大写。
2 结构体变量
我们可以简单地将结构体理解为自己定义的数据类型, 和C++中自带的数据类型一样,可以定义对应的变量,我们称之为结构体变量。
对于结构体变量,我们主要需要掌握如下内容:
结构体变量定义
结构体变量赋值
结构体变量操作
结构体变量输出
具体内容,请看:
2 结构体、数组与函数
复习完前面的知识我们就可以深入来探讨结构体,数组和函数了。
在后续的信息学竞赛中,我们会越来越认识到,我们的代码,大多是基于结构体、数组和函数这三大块内容展开的。
所以在这里,我们一起来总结一下结构体,数组和函数之间的应用。
1 结构体与数组
前面我们简单举例子说明了可以使用结构体定义结构体数组变量,我们有如下两种方式:
/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;
struct Student {
string name;
bool sex;
int age;
float height,width;
} stu1[10];
int main(){
Student stu2[10];
return 0;
}
这个过程和普通数据类型定义数组是一致的,对于大家来说也比较简单。
有聪明的同学就会想,结构体里面可以定义数组吗?也就是说,结构体能不能包含数组变量?
是可以的,比如我们下面的例子:
我们想要实现一个List表,里面包含List的数据,还有数据的个数(也就是List的长度):
定义一个List表,包含如下数据:
data:List的所有数据
length:List的长度
表的初始长度为0;
给表新增一个数据,然后表长加1。
我们可以写如下代码:
#include<iostream>
using namespace std;
struct List {
float data[100];
int length;
};
int main(){
List l1;
l1.length = 0;
l1.data[0] = 0.1;
l1.length += 1;
cout<<"List 的长度为"<<l1.length<<endl;
cout<<"List 中的第一个元素为"<<l1.data[0]<<endl;
return 0;
}
接下来我们自己练习一下:
有一本书,一共有10页,每一页有一个字符。小明读到了某一页。
现在要求用结构体实现上面的内容。(可以自由发挥,包含上述内容)
完成之后,可以查看老师的例子哦!
(点击空白处查看代码)
▼
#include<iostream>
using namespace std;
struct Book {
char info[10];
int page;
};
int main(){
Book b1;
for(int i = 0;i<10;i++){
cout<<"请输入第"<<i+1<<"页(共10页)的字符:";
cin>>b1.info[i];
}
cout<<"请输入小明同学要读的页数:";
cin>>b1.page;
cout<<"小明读的是第"<<b1.page<<"页"<<endl;
cout<<"这一页的字符为:"<<b1.info[b1.page-1]<<endl;
return 0;
}
2 结构体与函数
结构体还可以做函数的参数类型。具体的使用方法和普通的数据类型做函数参数类型是一致的。
比如上面的书结构,我们可以去实现下面的功能:
定义书的结构,包括书名,作者,页码,出版年份,价格;
在主函数中定义一个书的结构体变量;
定义函数,给上面定义的结构体变量赋值;
定义函数,修改图书的价格;
定义函数,输出图书的信息。
在定义函数的时候,我们要使用结构体作为函数的参数类型。
首先,我们先定义一下结构,包括头文件,结构体,还有主函数:
#include<iostream>
using namespace std;
struct Book {
string bookName, author;
int page, year;
float price;
};
int main(){
Book b1;
return 0;
}
然后我们想要定义函数,并且函数的参数类型有结构体,所以我们就要在主函数之前,结构体之后,定义我们上面说的那几个函数。
第一个函数,给结构体变量赋值:
void initBook(Book &b){
cout<<"请输入书籍信息:"<<endl;
cout<<"--书名:";
cin>>b.bookName;
cout<<"--作者:";
cin>>b.author;
cout<<"--页码:";
cin>>b.page;
cout<<"--出版年份:";
cin>>b.year;
cout<<"--价格:";
cin>>b.price;
cout<<"书籍信息录入结束。"<<endl;
}
要注意的是,我们要把结构体当做参数的类型,其他地方和普通的函数参数都是一致的,因为我们要对数据进行赋值,也就是说,我们要修改结构体变量的值。所以我们要使用参数的引用调用。
后面的也是一样,如果我们需要修改结构体变量的值。就要使用参数的引用调用。
第二个函数是修改价格,我们通过另外一个参数进行赋值:
void changePrice(Book &b, float price){
b.price = price;
}
第三个函数是输出所有的信息,输出信息不需要对结构体变量的值进行改动,所以也不需要参数引用调用。
void printInfo(Book b){
cout<<"书籍信息如下:"<<endl;
cout<<"--书名:"<<b.bookName<<endl;
cout<<"--作者:"<<b.author<<endl;
cout<<"--页码:"<<b.page<<endl;
cout<<"--出版年份:"<<b.year<<endl;
cout<<"--价格:"<<b.price<<endl;
}
将所有的代码放到一起如下:
#include<iostream>
using namespace std;
struct Book {
string bookName, author;
int page, year;
float price;
};
void initBook(Book &b){
cout<<"请输入书籍信息:"<<endl;
cout<<"--书名:";
cin>>b.bookName;
cout<<"--作者:";
cin>>b.author;
cout<<"--页码:";
cin>>b.page;
cout<<"--出版年份:";
cin>>b.year;
cout<<"--价格:";
cin>>b.price;
cout<<"书籍信息录入结束。"<<endl;
}
void changePrice(Book &b, float price){
b.price = price;
}
void printInfo(Book b){
cout<<"书籍信息如下:"<<endl;
cout<<"--书名:"<<b.bookName<<endl;
cout<<"--作者:"<<b.author<<endl;
cout<<"--页码:"<<b.page<<endl;
cout<<"--出版年份:"<<b.year<<endl;
cout<<"--价格:"<<b.price<<endl;
}
int main(){
Book b1;
initBook(b1);
changePrice(b1, 13.5);
printInfo(b1);
return 0;
}
3 数组与函数
数组也是可以用作函数参数的。
举个例子:
#include<iostream>
using namespace std;
void print(int a[10]){
for(int i=0;i<10;i++){
cout<<"a["<<i<<"] = "<<a[i]<<endl;
}
}
int main(){
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
print(a);
return 0;
}
一般来说,我们在定义函数的时候,需要告诉计算机数组的类型,数组名字。数组的大小有无均可。在调用的时候,只需要告诉计算机数组名就可以了。
3 结构体进阶训练
掌握前面的内容,我们一起来做训练吧!通过训练,掌握数组、函数和结构体的用法。
1 List表操作
我们对前面定义的List表做如下几个操作,注意要使用数组、函数和结构体:
初始化表:将表的长度设为0;(表中存的是float类型数据)
数据追加:在表的末尾追加一个数据,表的长度增加1;
尾数据删除:在表的末尾删除一个数据,表的长度减少1;
修改数据:修改某个位置上的某个数据;
获取表长:输出表的长度;
判断表是否为空表:如果表长为0,则为空表,输出True,否则输出False;
输出表中所有元素。
做完的同学就可以看一下老师下面的示例咯:
#include<iostream>
using namespace std;
struct List {
float data[100];
int length;
};
void initList(List &L){
L.length = 0;
}
void addElem(List &L, float e){
L.data[L.length] = e;
L.length++;
}
void subElem(List &L){
--L.length; //删除末尾数据,只需要将长度减1即可。
}
void modifyElem(List &L, int loc, float e){
L.data[loc-1] = e;
}
int getLength(List L){
return L.length;
}
bool isEmpty(List L){
if(L.length == 0) return true;
else return false;
}
void print(List L){
for(int i=0;i<L.length;i++){
cout<<"L.data["<<i<<"] = "<<L.data[i]<<endl;
}
}
int main(){
List l;
initList(l);
if(isEmpty(l)) cout<<"当前表示空表"<<endl;
for(int i = 0;i<5;i++){
addElem(l, i);
}
subElem(l);
modifyElem(l, 2, 5.2);
cout<<"当前表长:"<<getLength(l)<<endl;
print(l);
return 0;
}
欢迎各位同学提出其他做法。
5 习题
希望同学们能够掌握本节课内容,并完成下面这道作业题。
要求能够结合结构体、数组和函数。
1 阿里巴巴的宝藏
题目
阿里巴巴找到了一个宝藏,有n样宝物(1≤n≤100),每样宝物有自己的重量和价格。现在要选出性价比最高的宝物带出去。输出带出宝物的重量和价格。
【输入格式】
第一行一个整数n(10≤m≤n≤100),表示宝物的总数量。
后面n行,每行有两个整数,
--第一个整数a表示宝物的重量,(1≤a≤100)。
--第二个整数b表示宝物的价格,(1≤b≤100)。
【输出格式】
一行两个整数:
第一个整数表示宝物的重量,第二个整数表示宝物的价格。
【输入示例】
5
10 20
15 33
12 36
42 56
21 52
【输出示例】
12 36
AI与区块链技术
长按二维码关注