集训一:二维数组与结构体
前言
因众多学长学姐已经详细出过集训的答案,故在此不做补充,谨提供课堂笔记以作参考。(大一新生一枚,所写内容不够严谨,望多多包涵互相进步)
提示:以下是本篇文章正文内容,下面案例可供参考
一、了解C++的部分基础
首先我们需要知道c++对c语言是100%的兼容,即c语言我们所学的在c++里都可以用。
**C++的头文件和输入输出:**1.万能头文件(放在第一行)
#include <bits/stdc++.h>
此句一写即可以调用其他所有的函数,无需再写其他头文件,如:
#include <stdio.h>
但头文件后要紧跟内存的调用
using namespace std;
2.输入输出与换行
输入:cin>>
输出:cout<<
换行:<<endl
如:我们表达输入x,输出x并换行
int x;
cin>>x;
cout<<x<<endl;
3.备注
a.c++的输入输出不限类型,即无论单双精度或是整型均可统一输入输出。
b.输出时仍以printf(“%f”,x)
的形式输出小数(方便表达,c++不易)。
否则需要采用格式控制符
setprecision(n)
控制;或者是流对象的成员函数
precision(n)
为此我们简便仍以c语言表达。
c.c语言的输入输出比c++的速度快了近三分之一。
(这一点在后续的代码提交超时中体现的十分明显)
d.定义变量时可以直接写在内部,如:
for(int i=0;i<10;i++)
后续这个变量我们仍然可以使用,此处仅在for语句内起作用。
e.连续的输入:while(cin>>n)
即可。
二、二维数组
1.什么是二维数组?
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。
格式:类型说明符 数组名[常量表达式1][常量表达式2];
如:int a[10][2]
表示10行2列。
要求:定义时,可以省略第一维的大小,但第二维的大小不可省略。
二维数组行优先。
2.二维数组的初始化(下标一般从0开始)
a.二维数组的初始化可以按行分段赋值,也可以按行连续赋值。
以a[2][2]为例:下标从1开始
按行分段赋值为:
int a[2][2] = { { 1 , 2 }, { 3 , 4 } };
按行连续赋值为:
int a[2][2] = { 1 , 2 , 3 , 4 };
这两种赋初值的结果是完全相同的。
从a[1][1]-a[1][2]-a[2][1]-a[2][2]
b.可以只对部分元素赋初值,未赋初值的元素自动取 0 。
int a[3][3] = { {1} , {2} , {3} };
赋值后各元素的值为:
1 0 0
2 0 0
3 0 0
c.例题一份
二维矩阵最大值(林大oj951)
【问题描述】 有一个n × m 的矩阵,要求找出其中最大元素所在的行号和列号,以及该元素之值。
【输入格式】 多组输入,每组第一行有2个正整数n和m(2<=n,m<=10),接下来有n行m列的数据a(ij),(1<=a(i,j)<=100);
【输出格式】 在一行内输出最大元素所在的行号和列号,及该元素的值。
【输入样例】
2 2
100 2
3 18
【输出样例】
1 1 100
【问题分析】
定义一个二维数组 a[11][11] 存储矩阵,用循环嵌套来读入,读入时更新最大值,并记录最大值的下标。
【核心代码】#include <bits/stdc++.h> using namespace std; int main() { int n,m,i,j,k,l,a[100][100]; while(cin>>n>>m) { int max1=-9999; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>a[i][j]; if(max1<a[i][j]) { k=i;l=j;max1=a[i][j]; } } } cout<<k<<" "<<l<<" "<<max1<<endl; } return 0; } ```
三、结构体
在存储和处理大批量数据时,一般会使用数组来实现,但是每一个数据的类型及含义必须一样。如果需要把不同类型、不同含义的数据当作一个整体来处理,如 1000 个学生的姓名、性别、年龄、体重、成绩等,怎么处理呢?
C++ 提供了结构体(struct)来解决这类问题。
1.结构体的定义
C++ 中的结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。结构体类型的声明格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
…
};(一定要注意此处有个;)
2.结构体变量的定义
定义结构体变量格式如下:
struct 结构体类型名 变量名列表;
struct studenr stu1;
也可以把结构体类型声明和变量定义合在一起,格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
…
} 变量名;
struct student
{
char name[100];
int num;
double score;
}stu1,stu2;//变量名列表
3.结构体的使用
结构体变量具有以下特点:
a.可以对结构体变量的整体进行操作。
例如:swap(a[i],a[j])
b.可以对结构体变量的成员进行操作。
引用结构体变量中成员的格式为:
结构体变量名. 成员名
c.结构体变量的初始化法与数组类似。
d.例题一份
学生信息
【问题描述】 输入一个学生的信息,包括姓名、性别、年龄、体重,再输出这些信息。
【输入格式】
一行,依次是学生的姓名、性别、年龄、体重。
【输出格式】 一行,依次是姓名、性别、年龄、体重(体重保留一位小数)。
【输入样例】
zhangsan m 20 90.5
【输出样例】
zhangsan m 20 90.5
【核心代码】
4.结构体数组
所谓结构体数组,是指数组中的每个元素都是一个结构体。
在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
例如:
结构体数组的输入输出在初学时让人头大!!
为此我特地标明出来:
#include <bits/stdc++.h>
using namespace std;
struct sa
{
int a;
int b;
}data[100];
int main()
{
for(int i=1;i<=5;i++)
cin>>data[i].a>>data[i].b;//注意这个“."
for(int i=1;i<=5;i++)
cout<<data[i].a<<" "<<data[i].b<<endl;
return 0;//其中a,b为结构体数组中的成员名,即变量名。
}
四、总结
以上即为我的整理
其中我认为至关重要的是结构体的应用,刚刚学完后的做题初期会有很大的问题,而这需要我们保持耐心多次练习,相信最终我们都能熟练应用。
以上内容参考:林大ACM寒假集训第一讲