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

*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)//想象一下有一个矩阵周围都是0
                    scanf("%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 100
    void 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);//名字中间有空格可用gets
            cin >> 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.结构体数组的使用。

扫描二维码关注公众号,回复: 8514151 查看本文章
#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函数

发布了8 篇原创文章 · 获赞 73 · 访问量 4778

猜你喜欢

转载自blog.csdn.net/qq_45899321/article/details/103797737
今日推荐