天天看点

结构体当中的变量scanf输入是否需要取地址_第一课--数据结构first&first

写在前面:因为本人已上大学且目前的专业与暂时与编程(大类通史)无关,所以为了确保质量,更新频率不定期,且难度会由浅入深(也算是给自己复习吧)。这几期会以先写数据结构,再写算法的方式交错进行

这篇文章适用于已经会“Hello World”之类基操的童鞋,请按需食用

(文章默认使用C++语言)

大家应该对于定义一个变量,循环这类的基础储存应该已经有所了解,今天我主要介绍两个方面——数组和结构体

先来说数组

在你学习数组之前,你要读取并储存10个数字

画面是这样的

#include<iostream>
#include<cstdio>
using namespace std;
int a,b,c,d,e,f,g,h,i,j;
int main()
{
    scanf("%d%d%d%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j);
    return 0;
}
           

老费劲了

而且代码的可读性很差……

用了数组后

#include<iostream>
#include<cstdio>
using namespace std;
int a[11];
int main()
{
    for(int i=1;i<=10;i++)
    {
        scanf("%d",&a[i]);
    }
    return 0;
}
           

是不是简洁又明了?

数组,顾名思义,就是以组的形式存储数据的行为

不够明了?看下面

比如说,int a 是这样的(火车的原图来自网络)

结构体当中的变量scanf输入是否需要取地址_第一课--数据结构first&amp;amp;first

数组就是这样的

结构体当中的变量scanf输入是否需要取地址_第一课--数据结构first&amp;amp;first

我们来就此看一看数组的结构

定义时,是这样(略去了数组内容物的类型):

结构体当中的变量scanf输入是否需要取地址_第一课--数据结构first&amp;amp;first

使用时,则是这样

结构体当中的变量scanf输入是否需要取地址_第一课--数据结构first&amp;amp;first

要注意的一点是,数组的下标从0开始

也就是说,第一节火车,在表示时是第0节

不过,我们当然可以规避这个问题

你看,我要存1000个数

如果我这么定义的话

int a[1000];
           

数组会是a[0],a[1],a[2]……a[999];

我为啥不能这么来:

int a[1001];
           

这样数组的下标就是

a[0],a[1],a[2]......a[1000];

你完全可以直接放弃a[0]

使用a[1]-a[1000]不就好了?qwq

说完数组,咱们再来看看结构体

首先:结构体是干啥的呢?

我们再看一下上图

int这类的定义型语言 在什么位置?

火车头!

也就是说,换一种数组的定义方式,就像换了一个火车头

不同的火车头可以拉不同的东西,比如int拉整型,long long 拉长整型,char拉字符

但是,如果这些东西不够用呢?

比如说我想在车厢里同时放多个相同的东西

或者车厢里的货物我想放成不一样的

这时,c++的原装火车头就不够用了

我们得新造一些

而结构体解决的问题就是在“int”,“long long”这些标准化火车头的基础上,造一些属于你自己的火车头

那么,怎么造呢?

我们先看一看结构体的主体结构

结构体当中的变量scanf输入是否需要取地址_第一课--数据结构first&amp;amp;first

看到没,结构体的内部其实很简单

那么,结构体造好了,我们又该如何使用呢?

这里我只讲初级的

比如这样

#include<iostream>
#include<cstdio>
using namespace std;
struct a{
    int x,y;
}
int main()
{
    a b;
}
           

这样一来,我就声明了一个变量名为b的a型结构体;

下一步,我们又该怎样利用声明好的b变量呢?

我们从上面可以得知,a型结构体里面会有两个参数

x和y

那么,我们利用时自然也就不能忘了这两个东西

请看下面

b.x=10;
    b.y=11;
           

很简单是吧?就是这样

我们在使用给结构体赋值时

只需要“声明的变量.结构体参数=数值”就好了!

下面找一道题练练手

【深基7.例11】评等级 - 洛谷​www.luogu.com.cn

题面我放在下面

题目描述

现有 N(N≤1000) 名同学,每名同学需要设计一个结构体记录以下信息:学号(不超过 100000 的正整数)、学业成绩和素质拓展成绩(分别是 0 到 100 的整数)、综合分数(实数)。每行读入同学的姓名、学业成绩和素质拓展成绩,并且计算综合分数(分别按照 70% 和 30% 权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。

然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分

大于

140 分,且综合分数

不小于

80 分。

输入格式

第一行一个整数 N。

接下来 N 行,每行 3 个整数,依次代表学号、学业成绩和素质拓展成绩。

输出格式

N 行,如果第 i 名学生是优秀的,输出

Excellent

,否则输出

Not excellent

输入输出样例

输入 1

4

1223 95 59

1224 50 7

1473 32 45

1556 86 99

输出 1

Excellent

Not excellent

Not excellent

Excellent

显然,这是一道结构体的入门练习题

设计一个结构体

装下后两个内容

然后按需进行比较即可

不多说,上代码,不懂得看注释

#include<iostream>
#include<cstdio>
using namespace std;
struct stu{
	float zh;
    int xy,sz,zf; //设计一个结构体,放下学生的学业成绩,素质拓展程序以及总分
}xs[1005];
int n;//总人数
int main()
{
    scanf("%d",&n);//读取总人数
    for(int i=1;i<=n;i++)
    {
        int xh;
        scanf("%d%d%d",&xh,&xs[i].xy,&xs[i].sz);//读取个人信息
        xs[i].zf=xs[i].xy+xs[i].sz;//计算总分
        xs[i].zh=xs[i].xy*0.7+xs[i].sz*0.3;//计算综合 
    }
    for(int i=1;i<=n;i++)
    {
        if(xs[i].zf>140&&xs[i].zh>=80)//判断是否合格
        {
            cout<<"Excellent"<<endl;
        }
        else
        {
            cout<<"Not excellent"<<endl;
        }
    }
    return 0;
}
           

还有别的练习题同学们也可以去看看哦

【深基7.例10】旗鼓相当的对手 - 加强版​www.luogu.com.cn 【深基7.例9】最厉害的学生 - 洛谷​www.luogu.com.cn

完结撒花

新专栏的第一篇文章,还请大家包涵,如有问题,欢迎大佬指正!