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 
#include 
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 
#include 
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 
#include 
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 
#include 
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 
#include 
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 
#include 
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 
#include 
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 
#include 
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 
#include 
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 
#include 
int main()
{
    int a[10],i;
    for(i=0;i<=9;i++)
        printf("%d",a[i]);
    system("pause");
    return 0;
}

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

你可能感兴趣的:(C语言笔记05_数组)