C语言笔记05_数组

C语言笔记 05

本章节涉及《啊哈C》第六章内容。

1.逆序输出
(请看第3节)
2.申请100个小房子怎么办?
我们已经知道定义1个变量怎么表示:

int a;

定义10个变量:

int a,b,c,d,e,f,g,h,i,j;

那如果我们要定义100个1000个变量呢?

int a1,a2,a3,a4,……a99,a100;

不!这样效率太低了!下面介绍一种可以一次写出很多甚至10000个变量的句子:

int a[10];  // 申请一个大小为10的数组

直接定义了a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]这10个变量。
你可能会问为什么是从0开始而不是从1开始呢?
答案是:习惯问题,我们不必深究。

假设现在我们要在10个变量中分别储存0、1、4、9、16、25、36、49、64、81的话,可以这样写:

int a[10],i;
for(i=0;i<=9;i++)
{
    a[i]=i*i;
    printf("%d",a[i]);
}

完整代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    int a[10],i;
    for(i=0;i<=9;i++)
    {
    a[i]=i*i;
    printf("%d\n",a[i]);
    }
    system("pause");
    return 0;
}

上面的代码就是将0、1、4、9、16、25、36、49、64、81分别放在a[0]a[9]中,然后再将a[0]a[9]中的数打印出来。

3.100个数的逆序
回到第1节的问题,怎么对100个数进行逆序输出?
根据第二节我们可以这样写:
1.首先定义5个变量a[0]~a[4],并输入我们想要排序的5数字。

int a[5],i;
for(i=0;i<=4;i++)
{
    scanf("%d\n",&a[i]);
}

2.然后逆序输出,只要将for循环反过来即可:

int a[5],i;
for(i=0;i<=4;i++)
{
    scanf("%d\n",&a[i]);
}
for(i=4;i>=0;i--)
{
    printf("%d\n",a[i]);
}

4.逻辑挑战13:陶陶摘苹果

题目背景介绍:
陶陶家里有一颗苹果树,每年秋天都会结出10个苹果。苹果成熟的时候陶陶就会跑去摘苹果。陶陶有一个30cm高的板凳,当她不能直接用手摘到苹果时,就会踩到板凳上再试试。现已知10个苹果到地面的高度,以及陶陶把手伸直时候能够达到的最大高度,请帮陶陶算一下她能摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

这个题目很简单,题目的输入数据已经给出每个苹果的高度和陶陶的身高。我们只需要依次来判断“每个苹果的高度”是否小于等于“陶陶的身高加板凳的高度”。
陶陶的身高是一个整数,我们可以用一个整型变量h来储存,10个苹果的高度可以用于a[10]来保存。
完整代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int h,a[10],i,sum;
    for(i=0;i<=9;i++)
        scanf("%d",&a[i]);
    scanf("%d",&h);
    sum=0;
    for(i=0;i<=9;i++)
    {
        if( a[i] <= h+30 )
            sum++;
    }
    printf("总共可以摘%d个苹果",sum);
    system("pause");
    return 0;
}

5.逻辑挑战14:一个萝卜一个坑
一个有趣的问题:从键盘输入5个09之间的数,然后输出09中那些没有出现过的。例如,输入2 5 2 1 8 时,输出0 3 4 6 7 9。


#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[10],i,t;
    for(i=0;i<=9;i++)
        a[i]=0;  // 初始化每个空间为0
    for(i=1;i<=5;i++)
    {
        scanf("%d",&t); //依次输入5个数
        a[t]=1;    //把对应的空间改为1
    }
    for(i=0;i<=9;i++)
        if(a[i]==0) //输出没有出现过的数
            printf("%d ",i);
    system("pause");
    return 0;
}

这个方法就是“一个萝卜一个坑”,就好比原来有10个萝卜,我们拔了编号为1 2 2(其实已经被拔走) 5 8的萝卜,那么剩下的萝卜为:0 3 4 6 7 9

拔萝卜前:

拔萝卜后:


另一个问题,如果现在要将输入的5个数从小到大排列,怎么办?
例如:输入2 5 2 1 8 ,则输出 1 2 2 5 8。

首先我们建一个数组,将所有的空间归零;
然后输入哪个数字,哪个空间的数字就增加1;
最后,按照出现过的次数打印,出现几次就打印几次。


完整代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[10],i,j,t;
    for(i=0;i<=9;i++)
        a[i]=0;  // 空间归零
    for(i=0;i<=4;i++)
    {
        scanf("%d",&t); // 输入5个数
        a[t]++;   // 输入哪个数哪个数就+1
    }
    for(i=0;i<=9;i++)  //依次判断0~9这10个空间
        for(j=1;j<=a[i];j++)
            printf("%d",i);
    system("pause");
    return 0;
}

6.逻辑挑战15:选择排序



因为与作者的个人习惯不同,所以我默认从a[0]开始而不是a[1]:

int a[5],i;
for(i=0;i<=4;i++)
    scanf("%d".&a[i]); \\输入5个数,放入a[0]~a[4]中

我的完整代码如下:a[0]存放第一个数字。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[5],i,t,j;
    for(i=0;i<=4;i++)
        scanf("%d",&a[i]); 
    for(i=0;i<=3;i++)   
    {
        for(j=i+1;j<=4;j++) 
        {
            if(a[i]>a[j])   
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;   
            }
        }
    }
    for(i=0;i<=4;i++)
        printf("%d\n",a[i]); 
    system("pause");
    return 0;
}

顺便打上作者的版本:a[1]存放第一个数字,a[0]位闲置。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[6],i,t,j;
    for(i=1;i<=5;i++)
        scanf("%d",&a[i]); 
    for(i=1;i<=4;i++)   
    {
        for(j=i+1;j<=5;j++) 
        {
            if(a[i]>a[j])  
            { t=a[i];a[i]=a[j];a[j]=t; }
        }
    }
    for(i=1;i<=5;i++)
        printf("%d\n",a[i]); 
    system("pause");
    return 0;
}

7.二维数组

int a[3][4];

上面这行语句定义了一个二维数组,它有3行4列,分别是a[0]行、a[1]行、a[2]行。其实你可以把这个二维数组理解为由3个一维数组叠加而成。而每1个
数组又都有4列,分别是第[0]列、第[1]列、第[2]列、第[3]列

《啊哈C》完整代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[3][4],i,j,x;
    x=0;
    for(i=0;i<=2;i++)
    {
        for(j=0;j<=3;j++)
        {
            a[i][j]=x;
            x++;
        }
    }
    for(i=0;i<=2;i++)
    {
        for(j=0;j<=3;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}
(cmd界面效果图)

看完我尝试了一下简化,不知道有没有制造出bug,不过确实可以运行并达到需要的效果,我的版本如下:

我的简化版(未必正确):

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[3][4],i,j,x;
    x=0;
    for(i=0;i<=2;i++)
    {
        for(j=0;j<=3;j++)
        {
            a[i][j]=x;
            printf("%d ",a[i][j]);
            x++;
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

8.剩下的一些东西
关于数组,还有需要补充的内容,可以提高我们的效率!


#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[10]={7,8,9},i;
    for(i=0;i<=9;i++)
        printf("%d",a[i]);
    system("pause");
    return 0;
}

输出:

7890000000
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[10],i;
    for(i=0;i<=9;i++)
        printf("%d",a[i]);
    system("pause");
    return 0;
}

关于初始化值的,还有以下要注意:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,440评论 3 44
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,917评论 2 13
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,651评论 3 71
  • 可惜现实里有些男人不会意识到,他们他们有多幸运能够拥有他们的妻子,我只剩感动。也有点惋惜身在福中不知福。难得糊涂的...
    jane__curry阅读 175评论 0 0
  • 先放最爱的KID撒麻 小小新和小小兰 樱花班的承诺 因为真相永远只有一个!
    萍果派阅读 275评论 3 4