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;
}
看完我尝试了一下简化,不知道有没有制造出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;
}
关于初始化值的,还有以下要注意: