首页 > 其他分享 >C语言数组

C语言数组

时间:2022-11-22 22:38:43浏览次数:35  
标签:int C语言 ii 数组 字符串 girl 超女


文章目录

  • ​​一、数组​​
  • ​​二、占用内存的大小​​
  • ​​三、数组的初始化​​
  • ​​四、注意事项​​
  • ​​五、在for循环中数组​​
  • ​​六、二维数组​​
  • ​​七、多维数组​​
  • ​​八、字符串​​
  • ​​1、字符串的概念​​
  • ​​2、字符串的初始化​​
  • ​​3、字符串的赋值​​
  • ​​4、关于字符串结束符0的讨论​​
  • ​​5、字符串数组​​
  • ​​十、课后作业​​
  • ​​十一、获取视频教程​​
  • ​​十二、版权声明​​


先来看一个需求,超女选秀一共有5人参加,输入每位超女的体重并保存在变量中,最后计算出超女的的平均体重。

示例(book40.c)

/*
* 程序名:book40.c,此程序用于演示没有数组的情况下的多个变量求和
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>

int main()
{
double aa,bb,cc,dd,ee; // 定义5个变量存放5名超女的体重
aa=bb=cc=dd=ee=0;

printf("请输入第1名超女的体重(公斤):");
scanf("%lf",&aa);
printf("请输入第2名超女的体重(公斤):");
scanf("%lf",&bb);
printf("请输入第3名超女的体重(公斤):");
scanf("%lf",&cc);
printf("请输入第4名超女的体重(公斤):");
scanf("%lf",&dd);
printf("请输入第5名超女的体重(公斤):");
scanf("%lf",&ee);

printf("超女的平均体重是:%lf\n",(aa+bb+cc+dd+ee)/5);
}

如果有100名超女,这个程序将会很长很烦锁。

一、数组

数组(array)是一组数据类型相同的变量,可以存放一组数据,它定义的语法是:

数据类型 数组名[数组长度];

例如:

double money[20];

money是一个数组,包含了20个元素,每个元素都一个double类型的变量,可以通过下标访问数组中元素(element),数组下标的编号从0开始,数组的第1个元素是money[0],第2个元素是money[1],以此类推,直到第20个元素money[19]。

给每个元素赋double类型的值,可以这样写:

money[0] = 10.55;
money[1] = 32.54;
money[2] = 2055.65;
……
money[19] = 2055.65;

定义数组的时候,数组的长度必须是整数,可以是常量,也可以是变量。

数据的下标也必须是整数,可以是常量,也可以是变量。

使用数组元素和使用同类型的变量一样。

scanf("%lf", &money[4]);   // 把一个值读入数组的第5个元素

数组的类型可以是任意数据类型。

int      no[22];    // 可储存22个int类型整数的数组
char actors[26]; // 可储存26个字符的数组
double big[500];  // 可储存500个double类型整数的数组

二、占用内存的大小

我们已经知道如何获取单个变量占用内存大小的方法。

int ii;       // 定义一个整型变量
printf("sizeof(ii)=%d\n",sizeof(ii)); // 输出结果:sizeof(ii)=4
printf("sizeof(ii)=%d\n",sizeof(int)); // 输出结果:sizeof(ii)=4

数组是有多个变量组成,占用内存总空间的大小为多个变量占用的内存空间之和,用sizeof(数组名)就可以得到整个数组占用内存的大小,如下:

int ii[10];    // 定义一个整型数组变量
printf("sizeof(ii)=%d\n",sizeof(ii)); // 输出结果:sizeof(ii)=40

三、数组的初始化

采用memset函数对数组进行初始化,如下:

int no[10];
memset(no,0,sizeof(no));

第一个参数是数组名,第二个参数填0,第三个参数是数组占用的内存总空间,用sizeof(变量名)获取。

四、注意事项

1)定义数组的时候,数组的长度必须是整数,可以用常量和变量。

int size=100;
int numbers[size];

2)使用数组的时候,数组的下标也必须是整数,可以用常量和变量。

3)使用数组的时候,编译器不会检查数组的下标是否正确,但是在程序中下标一定不能越界,如果程序运行时数组下标越界,就相当于访问了其它程序的内存,可能会导致程序异常中断(Core dump),后果非常严重。

示例(book41.c)

/*
* 程序名:book41.c,此程序演示数组下标越界的后果
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>

int main()
{
int ii=0;
int sum[5]; // 定义一维数组

for (ii=0;ii<100;ii++)
{
printf("ii=%d\n",ii);
sum[ii]=ii;
}

return 0;
}

运行效果

C语言数组_数组

段错误,就是程序非法操作内存,引起程序的崩溃。

如果数组的下标越界了,是不是一定会引起程序的崩溃呢?不一定,如果把book41.c的循环改为6,可能就不会出现段错误。

五、在for循环中数组

在学习了数组的知识以后,本章节开始时的那个需求有了更好的解决方法,程序book40.c必须修改。

示例(book42.c)

/*
* 程序名:book42.c,此程序演示采用for循环语句和数组结合使用
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>

int main()
{
int ii=0; // 用于循环的计数器
int total=5; // 超女的总人数,初始化为5
double weight[total]; // 定义数组,用于存放超女的体重
double sum=0; // 存放超女体重的和

memset(weight,0,sizeof(weight)); // 初始化数组为0

// 循环输入超女的体重,并计算体重的总和
for (ii=0;ii<total;ii++)
{
printf("请输入第%d名超女的体重:",ii+1); // 输入提示信息
scanf("%lf",&weight[ii]); // 接受从键盘输入的体重
sum=sum+weight[ii]; // 计算超女体重的和
}

printf("超女的平均体重是:%lf\n",sum/total); // 输出平均体重
}

运行效果

C语言数组_c语言_02

for循环提供了一个简单直接的方法来使用数组下标,使用数组和for循环处理数据,这比使用5个单独的scanf语句方便得多。不管是5个还是100个超女,程序也不会再增加代码。

六、二维数组

二维数组定义的语法是:

数据类型 数组名[第一维的长度][第二维的长度];

在我们现实生活中,二维数组到处都是,例如超女选秀,一共有5个小组,每组4人,如果要指明某位超女,必须同时指明该超女的小组编号和她在组内序号。

int girl[5][4];
girl[0][0] girl[0][1] girl[0][2] girl[0][3]
girl[1][0] girl[1][1] girl[1][2] girl[1][3]
girl[2][0] girl[2][1] girl[2][2] girl[2][3]
girl[3][0] girl[3][1] girl[3][2] girl[3][3]
girl[4][0] girl[4][1] girl[4][2] girl[4][3]

也可以将二维数组看成一个坐标系,有 x 轴和 y 轴,要想在一个平面中确定一个点,必须同时指定 x 和 y 值。

二维数组的初始化也是用memset,例如:

memset(girl,0,sizeof(girl));

把本章节刚开始的那个需求增加一点难度:超女选秀有3个组,每组有5名选手,请提供一个界面,输入每个超女的体重,最后计算每组的超女的平均体重。

示例(book43.c)

/*
* 程序名:book43.c,此程序演示采用for循环语句和二维数组结合使用
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>

int main()
{
int ii=0; // 用于组别循环的计数器
int jj=0; // 用于超女人数循环的计数器
int class=3; // 小组总数,初始化为3
int total=5; // 每个组超女的总人数,初始化为5
double weight[class][total]; // 定义二维数组,存放超女的体重
double sum[class]; // 定义一维数组存放超女体重的和

memset(weight,0,sizeof(weight)); // 初始化数组为0
memset(sum,0,sizeof(sum)); // 初始化数组为0

// 采用两个循环,第一级循环为小组数,第二级循环为超女人数
for (ii=0;ii<class;ii++)
{
for (jj=0;jj<total;jj++)
{
printf("请输入第%d组第%d名超女的体重:",ii+1,jj+1);
scanf("%lf",&weight[ii][jj]); // 接受从键盘输入的体重
sum[ii]=sum[ii]+weight[ii][jj]; // 计算小组超女体重的和
}
}
}

运行效果

C语言数组_数组_03

七、多维数组

从二维数组可以类推出多维数组的用法,在实际开发中,二维以上的数组应用场景很少。

对初学者来说,建议先不要把这个问题复杂化,能掌握一维和二维数组就可以了,等功力提升之后,会发现多维数组其实也很容易。

八、字符串

1、字符串的概念

字符串就是一个以空字符’\0’结束的字符数组,是一个特别的字符数组,这是约定,是规则。

空字符’\0’也可以直接写成0。

C语言数组_c语言_04

因为字符串需要用0结束,所以在定义字符串的时候,要预留多一个字节来存放0。

char name[21];  // 定义一个最多存放20个字符或10个汉字的字符串

2、字符串的初始化

字符串是数组,当然可以用初始化数组的方法来初始化字符串。

char strname[21];
memset(strname,0,sizeof(strname));

3、字符串的赋值

如果想在strword中存入字符串“hello”,可以用strcpy函数,也可以采用以下代码:

strcpy(strword,"hello");
// 或者用以下代码
char strword[21];
memset(strword,0,sizeof(strword));
strword[0]='h';
strword[1]='e';
strword[2]='l';
strword[3]='l';
strword[4]='o';
strword[5]='\0'; // 或者 name[5]=0;

4、关于字符串结束符0的讨论

您可能会问,如果字符串不用0结束,会有什么样的结果,我们用代码来演示一下。

示例(book44.c)

/*
* 程序名:book44.c,此程序用于演示字符串没有用0结束的后果
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>

int main()
{
char name[3];
memset(name,0,sizeof(name));

name[0]='a';
name[1]='b';
name[2]='c';

printf("name=%s=\n",name);
}

运行效果

C语言数组_初始化_05

可以看到,输出abc之后,有乱码,并且每次执行程序输出的结果不可预知。

您可能还会问,如果字符串以0结束了,但是后面的内容并不是0,怎么办?后面的内容将被丢弃。

5、字符串数组

以0结束的一维字符数组是一个字符串。

char strname[21];       // 可以存放20个字符的字符串
memset(strname,0,sizeof(strname));
strcpy(strname,"我真的可以存十个汉字");

给一维字符数组加上一维,就是字符串数组了。

char strname[10][21];   // 10个字符串,每个字符串可以存放20个字符
memset(strname,0,sizeof(strname));
strcpy(strname[0],"坦已");
strcpy(strname[1],"褒似");
strcpy(strname[2],"西施");
strcpy(strname[3],"王昭君");
strcpy(strname[4],"貂婵");
……
strcpy(strname[9],"陈圆圆");

十、课后作业

1)编写示例程序,从界面上输入一个字符串,计算字符串的长度。如果输入的是"abcdaaf",显示的结果是7。

2)编写示例程序,从界面上输入一个字符串,把字符串的每个字符从左到右一个一个的显示出来,如果输入的是"abcdaaf",显示的结果是:a b c d a a f。

3)编写示例程序,从界面上输入一个字符串,把字符串的每个字符从右到左一个一个的显示出来,如果输入的是"abcdaaf",显示的结果是:f a a d c b a。

4)编写示例程序,某班有10个学生,定义一个一维数组,从界面上输入每个学生的成绩,最后显示这个班的平均成绩。

5)编写示例程序,某年级有两个班,每班有8名学生,定义一个二维数组,从界面上输入每个学生的成绩,最后显示每个班的平均成绩和年级的平均成绩。

6)编写示例程序,定义一个可以存放10个字符串的数组,字符串的有效长度是30个字符,从界面上输入10个字符串并存放在数组中,然后把这10个字符串显示出来。

以下题难难度较大,可以等到以后功力提升的时候再做。

7)如果还觉得不过隐,可以挑战一下三维数组,某学校有两个年级,每个年级有三个班,每个班有四名学生,从界面上输入每个学生的成绩,最后显示每个班的平均成绩、年级的平均成绩和全校的平均成绩。

别玩三维以上的数组,没什么意义。

十一、获取视频教程

十二、版权声明

作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!


标签:int,C语言,ii,数组,字符串,girl,超女
From: https://blog.51cto.com/u_13748800/5878558

相关文章

  • C语言函数
    文章目录​​一、函数的概念​​​​1、函数的概念​​​​2、函数的分类​​​​二、自定义函数的声明​​​​三、自定义函数的定义​​​​四、自定义函数代码的组织​​......
  • C语言变量的作用域
    文章目录​​一、变量的作用域​​​​二、全局变量​​​​三、局部变量​​​​四、函数的参数​​​​五、注意事项​​​​六、课后作业​​​​七、获取视频教程​​​......
  • C语言指针
    文章目录​​一、变量的地址​​​​二、指针​​​​三、对指针赋值​​​​四、通过指针操作内存变量​​​​五、再来讨论函数的参数传递​​​​六、空指针​​​​七、......
  • C语言字符
    文章目录​​一、ASCII码表​​​​1、ASCII控制字符(字符编码:0-31)​​​​2、ASCII可打印字符(字符编码:32-127)​​​​3、转义字符​​​​二、字符就是整数​​​​......
  • C语言浮点数
    文章目录​​一、浮点数的概念​​​​二、占用内存的情况​​​​三、浮点数的精度​​​​1、测试float类型​​​​2、测试double类型​​​​3、测试longdouble类型​......
  • C语言文件操作
    文章目录​​一、文本数据和二进制​​​​1、文本数据​​​​2、二进制数据​​​​3、文本文件和二进制文件​​​​二、打开文件​​​​1、文件指针​​​​2、打开文......
  • C语言目录操作
    文章目录​​一、获取当前工作目录​​​​二、切换工作目录​​​​三、目录的创建和删除​​​​四、获取目录中的文件列表​​​​1、包含头文件​​​​2、相关的库函数......
  • C语言目录和文件操作扩展
    文章目录​​一、access库函数​​​​二、stat库函数​​​​1、stat结构体​​​​2、stat库函数​​​​三、utime库函数​​​​四、rename库函数​​​​五、remove库......
  • C语言时间操作
    文章目录​​一、time_t别名​​​​二、time库函数​​​​三、tm结构体​​​​四、localtime库函数​​​​五、mktime库函数​​​​在这里插入图片描述六、程序睡眠​......
  • C语言获取系统错误
    文章目录​​一、strerror函数​​​​二、errno的细节​​​​1、调用库函数失败不一定会设置errno​​​​2、errno不能作为调用库函数失败的标志​​​​3、程序员可以不......