美文网首页
C语言笔记05_数组

C语言笔记05_数组

作者: flamingocc | 来源:发表于2018-05-19 14:57 被阅读0次

    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;
    }
    

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

    相关文章

      网友评论

          本文标题:C语言笔记05_数组

          本文链接:https://www.haomeiwen.com/subject/ztzodftx.html