计算机萌新的成长历程——初识C语言13

大家好,很高兴我们又见面啦!今天我们将开始探讨数组的相关内容。

数组——一组相同类型元素的集合。

怎么去理解数组的定义呢?数组就好比咱们养家畜、种果树一样,我现在圈了一块地,这块地是干嘛用的我还不清楚,有一天我放了一群小猪仔进去,那这块地我就叫它猪圈了,因为这块地里面全部都是小猪仔;我放了一群小鸡仔进去,那这里就叫鸡舍了,因为这块地里面全部都是小鸡仔;我种了很多棵苹果树进去,那这块地我就叫它苹果园了,因为里面全部都是苹果树……这里的不管是小猪也好,小鸡也好还是苹果树也好,都是这块地里的元素,这些元素聚集在一起就叫做集合,这块地不管是猪圈也好、鸡舍也好还是苹果园也好,它们就是数组。它叫猪圈时,里面的元素都是小猪;它叫鸡舍时里面的元素都是小鸡;它叫苹果园时里面的元素都是苹果树……我相信看到这里,大家应该都能明白数组的定义了。

下面我如何在计算机中来表示数组呢?这里我们一步一步来分析,首先数组它是一个集合,其次它里面的元素类型还要相同,最后我们根据这两个条件来尝试着定义一个数组:

代码语言:javascript
复制
//整型数组;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//这里是定义了一个整型数组,这个数组里面可以存放10个元素,所以是arr[10];
//里面的元素是10个整数,从后面的大括号可知它们分别是1~10这10个整数;
//字符数组;
char ch[4] = { 'a','b','c','d' };//这里定义了一个字符数组,这个数组里面可以存放4个元素,所以是ch[4];
//里面的元素是4个字符,从后面大括号可知它们分别是a、b、c、d这四个字符;
//浮点型数组
float arr[2] = { 3.14,1.76 };//这里定义了一个单精度浮点型数组,这里面可以存放2个元素,所以是arr[2];
//里面的元素是2个小数,从后面的大括号可知它们分别是“3.14”、“1.76”这两个小数;

不知道大家还有没有印象,我们在字符串那一篇里面有提到过数组,有兴趣的朋友可以翻阅一下——计算机萌新的成长历程——初识C语言7。注意这里的"arr"也好"ch"也好都是可以根据自己的喜好自由定义的,没有固定的搭配哦。

这里我们要提到一个知识点——数组的下标:C语言规定,数组的每一个元素都有下标,下标是从0开始的。数组可以通过下标来访问的。这里我们通过代码将这个整型数组打印出来,代码如下:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1//用来解决在VS编译器中对于scanf、strcpy、strlen、strcat……这些C语言提供的不安全的库函数报错的问题

#include <stdio.h>
#include<string.h>//这里在使用string相关的库函数如:strlen、strcpy、strcat...等函数时需要引用此头文件。

int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", a[0]);
printf("%d\n", a[1]);
printf("%d\n", a[2]);
printf("%d\n", a[3]);
printf("%d\n", a[4]);
printf("%d\n", a[5]);
printf("%d\n", a[6]);
printf("%d\n", a[7]);
printf("%d\n", a[8]);
printf("%d\n", a[9]);
return 0;
}

打印结果如下:

这里大家可以看到,一个数组中的单个元素我们可以通过它的下标来访问它,这个下标怎么来的?我们来监视它一下,让他显出原形:

从这里我们就可以看到,它的下标是从0开始的,通过这两个测试,我们进一步验证了“C语言规定,数组的每一个元素都有下标,下标是从0开始的。数组可以通过下标来访问的。”这两句话。

现在有朋友可能就会问了,像你这样一个一个的进行打印,如果我定义的数组里有100个元素,甚至更多元素,我要将它们打印出来,我不得累死啊!这里我们能不能将之前学的知识给结合起来编写一组代码让他能完成自动打印呢?我们要明确将这些元素全部打印出来是在重复同一个操作,我们马上就联想到了循环语句,那下面我们来通过循环语句将它里面的元素给全部打印出来吧!代码如下:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1//用来解决在VS编译器中对于scanf、strcpy、strlen、strcat……这些C语言提供的不安全的库函数报错的问题

#include <stdio.h>
#include<string.h>//这里在使用string相关的库函数如:strlen、strcpy、strcat...等函数时需要引用此头文件。

int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
//while语句打印
int n = 0;
while(n < 10)
{
printf("%d\n", a[n]);
n++;
}
return 0;
}

运行结果如下:

下面我们尝试一下用for语句打印:

下面我们尝试用do……while语句打印:

这里我们把三种循环语句都复习了一遍,下面我们来探讨一下,它在循环语句中是怎么运行的,这里我们还是用while语句进行监视:

这里我们可以看到代码开始运行时a10里面的元素是随机值,并无定义;

这里我们可以看到,在代码运行到第10行时,a10的各个元素都有了定义,每个元素也都有了对应下标;

到11行,n也有了定义,并将0赋值给了n,然后进行条件判定0<10满足条件开始进入循环;

这里我们可以看到,这里已经执行完printf并将a0成功打印,此时n=0,开始执行n++;

这时已经执行完n++,n的值变为1;

到这里回到while进行条件判定,1<10满足条件,继续进入循环;

在这里打印了a1,此时n=1,并开始执行n++,继续走一步;

在这时成功执行n++,n变为2,然后继续重复条件判定、打印、n++的过程,直到不满足条件时跳出循环。

现在大家应该对数组以及循环语句的工作流程更加了解了吧,下面我们尝试一下能不能编写一组代码将九九乘法表给打印出来:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1//用来解决在VS编译器中对于scanf、strcpy、strlen、strcat……这些C语言提供的不安全的库函数报错的问题

#include <stdio.h>
#include<string.h>//这里在使用string相关的库函数如:strlen、strcpy、strcat...等函数时需要引用此头文件。

int mul(int a, int b)
{
int c = a * b;
return c;
}

int main()
{
int a[9] = { 1,2,3,4,5,6,7,8,9 };
int b[9] = { 1,2,3,4,5,6,7,8,9 };
int m = 0;
int n = 0;
while (m < 9)
{
while (n < 9)
{
int x = mul(a[m], b[n]);
if (m < n)
{
printf("%d*%d=%d ", a[m], b[n], x);
m++;
}
/else if (m > n)
{
printf("%d
%d=%d ", a[m], b[n], x);
n++;
}/
else
{
printf("%d
%d=%d\n", a[m], b[n], x);
n++;
m = 0;
}
}
m++;
}
return 0;
}

打印结果如下:

这里给大家分享一下编写思路:

首先乘法口诀表是需要用到乘法的,我因为刚接触函数不久,为了熟练自定义函数,所以我这里定义了一个乘法函数mul,当然这里也是不需要定义的,这个看个人喜好;

其次,打印九九乘法表肯定是需要重复使用函数以及打印操作的,这里肯定少不了循环语句,所以我选择了使用while语句;

最后考虑到排版问题,具体打印是分情况的,我们可以发现当两个乘数相同时,需要换行,其他情况需要空格,所以这里我使用了选择语句。

以上就是我的一个编写思路的框架,确定了这里需要用到函数、数组、选择语句、循环语句后,就要开始把细节填补了,这里我自己画了流程图来梳理整个过程,流程图如下:

到这一步思路就很清晰了,这里我们可以看到有五个判定,前面两个是循环判定,后面三个是选择判定,总共3个选项,所以用到的选择语句是if……else if……else,这样我们的思路就很清晰了,接下来只需要按步骤编写代码就行了。

(注:最终实验下来会发现m>n这个判定不会生效,我这里默认的是m<n,不过其他朋友可能会尝试打印m>n的情况,所以这里我没有删掉,而是注释掉了。)

咱们今天的内容到这里就结束了,如果这篇文章能够帮助各位朋友更好的理解数组以及循环语句的话,那它就发挥了它的作用,最后感谢各位的翻阅,咱们下一篇见。