*acm新手小白必看系列之(1)——二维数组及结构体

** c++准备工作**
(可能小白像我一样也是学习的c语言)

  • 万能头文件,放在第一行
  • #include<bits/stdc++.h>
  • 输入 cin>>
  • 输出 cout<< “hello world”;
  • 换行 <<endl
  • c语言中的输入输出
  • %d-以十进制形式输出带符号整数;
    scanf("%d",&n);
    printf("%d\n",n);
    %f-以小数形式输出单、双精度实数;
    scanf("%f",&num);
    printf("%f\n",num);
    %c-输出单个字符;
    scanf("%c",&ch);
    printf("%c\n",ch);
    %s-输出字符串;
    scanf("%s",str);
    printf("%s\n",str);

-*

二维数组

  •  二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。
    

    格式:类型说明符 数组名[常量表达式1][常量表达式2];
    要求:定义时,可以省略第一维的大小,但第二维的大小不可省略
    &&二维数组的初始化
    二维数组的初始化可以按行分段赋值,也可以按行连续赋值
    以a[2][2]为例:
    按行分段赋值为
    int a[2][2] = { { 1 , 2 }, { 3 , 4 } };
    按行连续赋值为
    int a[2][2] = { 1 , 2 , 3 , 4 };
    这两种赋初值的结果是完全相同的。
    切未赋值的元素自动取0。

结构体

  • 如果需要把不同类型、不同含义的数据当作一个整体来处理,如 1000 个学生的姓名、性别、年龄、体重、成绩等,怎么处理呢?
    C++ 提供了结构体(struct)来解决这类问题。
    使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。结构体类型的声明格式如下
    struct 类型名{
    数据类型1 成员名1;
    数据类型2 成员名2;

    };

    struct 类型名{
    数据类型1 成员名1;
    数据类型2 成员名2;

    } 变量名;

结构体数组

  • 所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。

  • 二维数组例题

1.计算m×m的方阵的对角线所有元素的和。
Input
输入数据有多组,每组第1行为m( 2<=m<=10),接下来有m行m列的数据1<=a(i,j)<=100;
Output
对于你刚输入的这个矩阵,输出方阵的对角线所有元素的和。(交叉位置元素要多次计算的)
Sample Input
3
1 2 3
4 5 6
7 8 9
Sample Output
30
Hint
交叉位置元素要多次计算的

#include <stdio.h>
#include <stdlib.h>
int main()
{int max=0,min=0;//随便定义两个int x=0,y=0,a[11][11],m,n,i,j;while(scanf("%d",&m)!=EOF){max=0;min=0;for(i=1; i<=m; i++){for(j=1; j<=m; j++){scanf("%d",&a[i][j]);}}//输入二维数组for(x=1,y=1; x<=m; x++,y++)max=max+a[x][y];//主对角线for(x=m,y=1; y<=m; x--,y++)min=min+a[x][y];//副对角线printf("%d\n",min+max);}return 0;
}

2.计算2个方阵的乘积!
Input
输入数据有多组,每组第1行为m (1 <m<10),表示方阵的大小,接下来为2个m行m列的数据data(i,j);( 1<data(i,j)<100)
Output
输出这2个方阵的乘积,具体见样例
Sample Input
2
1 2
1 2
3 1
1 3
Sample Output
5 7
5 7

#include <stdio.h>
#include <stdlib.h>
#define M 30
int main(void)
{int i,j,k,matrix1[M][M],matrix2[M][M],row1=M,col1=M,row2=M,col2=M,matrix[M][M],n;/*为需要相乘的两个矩阵赋值:*/while(scanf("%d",&n)!=EOF){for(i=0; i<n; i++){for(j=0; j<n; j++){scanf("%d",&matrix1[i][j]);}}for(i=0; i<n; i++){for(j=0; j<n; j++){scanf("%d",&matrix2[i][j]);}}/*初始化matrix:*/for(i=0; i<n; i++){for(j=0; j<n; j++){matrix[i][j]=0;}}//方阵相乘参见线性代数,一行乘一列for(i=0; i<n; i++){for(j=0; j<n; j++){for(k=0; k<n; k++)//可以理解为在遍历二维的同时做乘法{matrix[i][j]=matrix[i][j]+matrix1[i][k]*matrix2[k][j];//核心代码,仔细理解}}}for(i=0; i<n; i++){for(j=0; j<n; j++){if(j!=n-1)//最后一个输出无空格printf("%d ",matrix[i][j]);else printf("%d\n",matrix[i][j]);}}}return 0;
}

3.五人帮
5人帮的含义就是数字和该数字所对应的上、下、左、右和自己本身的数值之和,请求出矩阵中5人帮的最大值是多少?
Input
输入数据只有多组,每组第1行为2个数m和n(1 <m,n<10),代表行数和列数; 接下来输入这m行和n列个数data(i,j)(1< data(i,j)<100)
Output
输出该矩阵5人帮的最大值!
Sample Input
3 4
1 2 3 4
3 4 5 6
2 3 3 9
Sample Output
24

#include <iostream>
#include <bits/stdc++.h>//万能头文件
using namespace std;int main()
{int m,n,i,j,k,a[11][11],s,max;while(scanf("%d%d",&m,&n)!=-1){max=0;for(i=0; i<=m+1; i++){for(j=0; j<=n+1; j++){if(i>=1&&i<=m&&j>=1&&j<=n)//想象一下有一个矩阵周围都是0scanf("%d",&a[i][j]);else a[i][j]=0;//想象一下有一个矩阵周围都是0}}for(i=0; i<=m+1; i++){for(j=0; j<=n+1; j++){if(i>=1&&i<=m&&j>=1&&j<=n){s=a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1];//上下加法if(s>max)max=s;//找最大值}}}printf("%d\n",max);}return 0;
}

4.逆时针旋转90度
现在有一个n*m行的矩阵A 逆时针旋转90度形成一个新的矩阵B,将B矩阵输出来。
快敲代码,动作!
Input
多组样例,每行两个整数n,m( 1<=n<=100, 1<=m<=100 )
Output
输出矩阵B
Sample Input
3 5
1 2 3 4 5
2 4 9 2 1
3 4 5 7 9
Sample Output
5 1 9
4 2 7
3 9 5
2 4 4
1 2 3

#include <stdio.h>
#include <stdlib.h>
#define M 100void Rotation(int a[M][M],int m,int m)//此处m可以换成n就可以变成两个不同阶数的矩阵再改动{int tem[M][M];//此题只演示方阵的求法int i,j,k = 0;for(j=n-1; j>=0; j--){for(i=0; i<m; i++)tem[k][i] = a[i][j];//核心代码——旋转90°k++;}for(i=0; i<n; i++)for(j=0; j<m; j++)a[i][j] = tem[i][j];//赋值回去}int main(){int m,n;int i,j;int a[100][100];scanf("%d %d",&m,&n);for(i=0; i<m; i++)for(j=0; j<n; j++)scanf("%d",&a[i][j]);Rotation(a,m,n);//调用函数for(i=0; i<n; i++){for(j=0; j<m; j++)if(j!=m-1)//注意输出printf("%d ",a[i][j]);else printf("%d\n",a[i][j]);}return 0;}

结构体例题

1.读入信息
简化读入学生的信息:学号(8位整数)、姓名(20个字符)、1门课的成绩(2位小数)。
要求用输入、输出函数实现部分子功能。
Input
输入数据有1组,每组有n个学生信息。
Output
输出读入的学生信息,每行1个学生信息,各信息之间用2个空格分隔。
Sample Input
5
20140101
Li Ming
85
20140202
Zhao Li
98
20140013
Qiao En
92.5
20140404
Tian Ya
88.5
20140015
Lu Yao
89.4
Sample Output
20140101 Li Ming 85.00
20140202 Zhao Li 98.00
20140013 Qiao En 92.50
20140404 Tian Ya 88.50
20140015 Lu Yao 89.40

#include <bits/stdc++.h>
using namespace std;
int main()
{struct student{int num;char name[20];double grade;} stu1;//结构体int n;while(~scanf("%d",&n))//看好此处输入与等价 while(scanf("%d",&n)!=EOF){for(int i=0; i<n; i++){cin >> stu1.num;//输入数字getchar();//吃回车gets(stu1.name);//名字中间有空格可用getscin >> stu1.grade;//输入成绩printf("%d  %s  %.2f\n",stu1.num,stu1.name,stu1.grade);}}return 0;
}

2.身高问题
输入 n 个学生的信息,每个学生信息包括姓名、身高、学号。编程输出身高最高的学生的信息。
Input
第 1 行一个正整数 n,表示学生个数,n≤100。
以下 n 行,每一行依次输入学生的姓名、身高、学号。
Output
输出最高的学生信息,如存在身高一样的请输出学号小的那个同学。
Sample Input
5
John 172 20160302
David 173 20160306
Jason 168 20160309
Jack 152 20160311
Kitty 147 20160319
Sample Output
David 173 20160306

#include <bits/stdc++.h>
using namespace std;
struct node
{string name,h,num;//调用函数string与char用法差不多
} p[101];
bool cmp(node a,node b)//此处注意!!!bool
{if(a.h==b.h)return a.num<b.num;else return a.h>b.h;
}
int main()
{int n,i;cin>>n;for(i=0; i<n; i++)cin>>p[i].name>>p[i].h>>p[i].num;sort(p,p+n,cmp);printf("%s %s %s\n",p[0].name.c_str(),p[0].h.c_str(),p[0].num.c_str());//加后缀return 0;
}

3.学生等级成绩
兴趣小组收集学员成绩信息,每个学员的成绩有两种表示方法,一种用 best、good、poor 三种等级来表示,还有一种就是直接用分数来表示(百分制)。请保存学员成绩信息,并且统计有多少人是用等级来表示成绩的,用分数来表示成绩的人的平均分是多少(取整就行)。
Input
第 1 行一个正整数 n,表示学员人数,n≤1000。
第 2~n+1 行,每行一个字符和一个字符串,中间用一个空格隔开。第一个字符表示这个学生成绩类型,有 C、N 两种分别代表等级表示和分数表示,第二个字符串表示成绩信息。
Output
一行两个整数,分别表示用等级表示成绩的人数和用分数表示成绩时人的平均分(取整),中间用一个空格隔开。
Sample Input
5
C best
C good
N 90
C poor
N 98
Sample Output
3 94

#include <bits/stdc++.h>
using namespace std;
int main()
{int n,x,sum,y;while(~scanf("%d",&n)){struct student{char qu;char grade[5];int cheng;} stu[n];x=sum=y=0;for(int i=0; i<n; i++){cin >> stu[i].qu;if(stu[i].qu=='C'){cin >> stu[i].grade;x++;}else{cin >> stu[i].cheng;y++;sum+=stu[i].cheng;}}sum=sum/y;cout << x << ' ' << sum<<endl;//空格的输出}return 0;
}

4.优秀学生
读入学生的信息(最多不超过100个):学号(不超过八位)、姓名(不超过20个字符)、C语言成绩(用整数表示)。统计优秀学生的信息(成绩在90分以上,包括90分)及个数。(要求用结构体实现)
Input
输入数据有多组,每组为n个学生的信息;
Output
输出数据优秀学生的信息及个数。
Sample Input
5
2015001
ZhangSan
90
2015002
LiMing
80
2015003
WangHong
70
2015004
ZhangXiao
95
2015005
WangFang
100
3
2015001
ZhangSan
60
2015002
LiMing
80
2015003
WangHong
85
Sample Output
2015001 ZhangSan 90
2015004 ZhangXiao 95
2015005 WangFang 100
3
0
Hint
按要求做答,否则无分!
comment
题目难度系数 :3分 难度适中;
本题目考核知识点:
1.结构体定义。
2.结构体数据的输入和输出。
3.结构体数组的使用。

#include <bits/stdc++.h>
using namespace std;
int main()
{int n,i,x;while(~scanf("%d",&n)){x=0;struct student{string num,name;//字符int chengji;//数字} p[101];for(int i=0; i<n; i++){cin>>p[i].num>>p[i].name>>p[i].chengji;if(p[i].chengji>=90){x++;printf("%s %s %d\n",p[i].num.c_str(),p[i].name.c_str(),p[i].chengji);}}cout <<x<< endl;}return 0;
}

下节提示
acm新手小白必看系列之(2)——排序及cmp函数

acm新手小白必看系列之(1)——二维数组及结构体精讲附带例题相关推荐

  1. acm新手小白必看系列之(7)——快速幂取模精讲及例题

    acm新手小白必看系列之(7)--快速幂取模精讲及例题 性质1:(a+b)%m=(a%m+b%m)%m 性质2:(ab)%m=(a%mb%m)%m 给你一个数a,让你求其b次连乘后的结果 当b很小时, ...

  2. acm新手小白必看系列之(5)——枚举进阶例题精讲

    acm新手小白必看系列之(5)--枚举进阶例题精讲 1.牛奶碑文(暴力枚举) 小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和 ...

  3. acm新手小白必看系列之(8)——二分法精讲及例题

    acm新手小白必看系列之(8)--二分法精讲及例题 二分,分的是答案,直接在答案在的区间范围中二分,分出一个值,就判断是不是答案,并进行转移 如果已知候选答案的范围(min,max)(单调有序),(无 ...

  4. acm新手小白必看系列之(9)——栈精讲及例题

    acm新手小白必看系列之(9)--栈精讲及例题 先进栈后出栈 可以把栈想象成一个上端开口的杯子.... 栈只能定义为在一端进行插入和删除操作 1.程序员问题 程序员输入程序出现差错时,可以采取以下的补 ...

  5. acm新手小白必看系列之(3)——暴力枚举精讲及例题

    acm新手小白必看系列之(3)--暴力枚举精讲及例题 暴力枚举说白了就是列举所有情况,然后一个一个排查. 这节多说无益直接上题(这节假的精讲) 1·大乐透 在小明曾经玩过的一种对号码的纸牌游戏(乐透) ...

  6. acm新手小白必看系列之(10)——队列精讲及例题

    acm新手小白必看系列之(10)--队列精讲及例题 队列其实是很复杂的,有很多种队列的情况 下面只讲基础能用上的 队列:先进先出 在这里,我将引入两个整型变量head和tail.head用来记录队列的 ...

  7. 2020-12-22 ACM集训一(二维数组与结构体)

    ACM集训一 NEFU 1064 B题:(矩阵外围数字之和) Problem:B Time Limit:1000ms Memory Limit:65536K Description 在军事训练中,战士 ...

  8. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导

    爬虫是大家公认的入门Python最好方式,没有之一.虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就能实现基本的爬虫,零基础也能快速入门,让新手小白体会更大的成 ...

  9. 计算机新手教程装系统,新手小白必看电脑重装系统教程 四种方法至少会一种就够用!...

    电脑买来时间久了,就会出来卡顿.蓝屏等很多问题.你的电脑有这些问题吗?当电脑出现这些问题时,我们该怎么做呢?当然就是给电脑重装系统,那么你会给电脑重装系统吗?小白必看的电脑重装系统教程哦! 给电脑装系 ...

最新文章

  1. 【python】 web开发入门
  2. struts2和hibernate的简单新闻发布系统_企业做不好新闻软文营销,原因都在这里!...
  3. 发布:NetBeans IDE 8.1 Beta
  4. 二、Merge sort
  5. 机器翻译学习1:pytorch官方教程与代码逐行详解
  6. 查看数据库表空间.md
  7. sql etl_使用SQL TRY函数进行ETL优化
  8. matlab用mkdir在指定的文件夹下创建新的文件夹,并把图像保存在该文件夹内
  9. 开启win7笔记本自带无线功能
  10. spring boot项目发送邮件
  11. c语言贪吃蛇设计实验报告引言,C语言实现贪吃蛇游戏设计
  12. 软件项目的全生命周期
  13. sql的casewhen
  14. celeste第二章_《蔚蓝(Celeste)》全水晶之心收集攻略
  15. 学习...笔记05:时间,空间,时空傅里叶变换的基本技巧、获取自旋波的频谱图和色散图
  16. 探探这只反语言暴力公益短片 提供了一个新视角
  17. android 遥控器方向,android万能遥控器之一--前言及发射部分的简单实现
  18. 亿玛大数据揭秘“钻石网购密码” 最高单价超15万
  19. 自动化技术实现目录全览
  20. android go怎么安装,Android studio3.0安装教程-Go语言中文社区

热门文章

  1. html5获得麦克风音量
  2. github + jsdeliver + picgo 搭建免费cdn
  3. opencc在linux环境中,linux - 安装OpenCC(简体繁体转换)
  4. LayaAir2.13.0
  5. 数据预处理-样本分布(正态分布、偏态分布)
  6. 框架设计–第十八章 BOOT客户管理系统–习题答案
  7. yourenduwanglai的鬼话连篇(八)
  8. 学硕VS专硕,到底该选哪个?
  9. [旧闻三]传英特尔近日宣布收购Nvidia 股价涨10%
  10. TightVNC Java Viewer