C语言学习笔记之(数组)
一、一维数组
1.格式
类型说明符 数组名 [常量表达式];
int ch[20]; /*定义整型数组ch,有20个元素*/
float b[10],c[20]; /*定义实型数组b,有10个元素;实型数组c,有20个元素*/
2.赋值
对数组进行初始化赋值的一般形式为:
类型说明符 数组名[常量表达式]={数值1,数值2,…,数值n};
其中,在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:
int a[3]={0,1,2};
经过以上初始化后,a[0]=0,a[1]=1,a[2]=2。
3.定义
例如:定义语句“int a[15];”说明了以下几个问题:
① 数组名为a。
② 数组元素的数据类型为int整型。
③ 数组元素的下标值从0开始。数组元素的个数为15个,分别是a[0],a[1],a[2]…,a[13],a[14]。
④ 数组名a是数组存储区的首地址,即存放数组第一个元素的地址:a→&a[0],因此,数组名是一个地址常量,不能对数组名进行赋值和运算。数据元素的存储形式如图所示,在Visual C++中,一个整型变量的存储空间为4个字节,所以此空间大小为4*15=60字节。
4.例子1:实现从键盘中输入10个互不相同的整数,输出这10个数并求其中的最小数。
#include <stdio.h>
int main()
{
int a[10]; /*数组定义,定义数组a*/
int i,min; /*定义循环变量i和最小值min*/
for(i=0;i<=9;i++) /*循环10次*/
scanf("%d",&a[i]); /*数组引用,给数组元素赋值*/
for(i=0;i<=9;i++) /*循环10次*/
printf("%4d",a[i]); /*数组引用,输出数组元素的值*/
min=a[0]; /*数组引用,给min变量赋初值*/
for(i=1;i<=9;i++) /*循环9次*/
if(min>a[i]) /*数组引用,如果min大于a[i]*/
min=a[i]; /*数组引用,将较小的赋给min*/
printf("\n最小值为%d\n",min); /*输出最小值*/
return 0;
}
5.例子2:给定任意n个整数,按由小到大次序对其进行排序,并输出结果。
#include <stdio.h>
#define N 10 /*定义符号常量,N为排序数字个数*/
int main()
{
int a[N]; /*定义数组a*/
int i,j,t; /*定义变量*/
printf("请输入10个整数:\n"); /*输出提示语*/
for(i=0;i<N;i++) /*从键盘接收N个数据放入数组a中*/
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
for(i=0;i<N;i++) /*i是趟次循环变量(外循环变量)*/
for(j=i+1;j<N;j++) /*j是每趟中比较的次数变量(内循环变量)*/
if(a[i]>a[j]) /*比较相邻两数大小,将较小的数放在前面*/
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
printf("排序后的顺序为:\n"); /*输出提示语*/
for(i=0;i<N;i++) /*将排序好的数组输出*/
printf("%d\t",a[i]);
printf("\n"); /*输出回车符*/
return 0;
}
二、二维数组
1.格式
类型说明符 数组名[常量表达式1][常量表达式2];
其中,常量表达式1表示行下标,常量表达式2表示列下标。数组元素个数为:常量表达式1常量表达式2。与一维数组相同,下标值从0开始。例如:
int x[2][3];
x是二维数组名,这个二维数组共有6个元素(2×3=6),分别是:x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],其全部元素数据类型均为整型。
二维数组在概念上是二维的,但在存储器中是按一维线性排列的。在C语言中,二维数组是按行排列的。例如,二维数组x[2][3],先放第一行,即x[0][0],x[0][1],x[0][2];再放第二行,即x[1][0],x[1][1],x[1][2];
2.赋值
二维数组的初始化有两种方法:
(1)把初始化值括在一对大括号内,例如:
int x[2][3]={1,2,3,4,5,6};
初始化结果是:x[0][0]=1,x[0][1]=2,x[0][2]=3,x[1][0]=4,x[1][1]=5,x[1][2]=6。
(2)把二维数组看作是一种特殊的一维数组,该数组的每个元素又是一个一维数组。例如:定义了二维数组x[2][3],可以把数组x看成是具有两个元素的一维数组,其元素是x[0]和x[1];而每个元素x[0]和x[1]又都是具有三个元素的一维数组。
因此,二维数组的初始化也可以分解成多个一维数组的初始化,例如:
int x[2][3]={{1,2,3},{4,5,6}};
3.例子1:求一个3*3矩阵的两条对角线元素之和(注意:两条对角线交叉点处的元素只计算一次)。
#include <stdio.h>
int main()
{
int a[3][3]; /*定义3*3矩阵*/
int i,j,sum,result1=0,result2=0; /*定义变量*/
for (i=0;i<3;i++) /*外循环*/
{
printf("输入一行: "); /*输出提示信息*/
for(j=0;j<3;j++) /*内循环*/
{
scanf("%d",&a[i][j]); /*逐行输入矩阵*/
if(i==j) /*如下标相同,则累加到result1*/
result1+=a[i][j];
if(i+j==2&&i!=j) /*如下标不同且和为2,则累加到result2*/
result2+=a[i][j];
}
}
sum=result1+result2; /*将result1和result2相加*/
printf("sum=%d\n",sum); /*输出结果*/
}
4.例子2:一个学习小组有6个人,每个人有3门课(数学、语文和英语)的考试成绩,如表所示。求每门课的平均分和每个人的平均分。
可设一个二维数组a[3][6]存放6个人3门课的成绩。再设一个一维数组v[3]存放每门课的平均分,设一个一维数组w[6]存放每个人的平均分。
| 课程 | 王笑 | 李鹏 | 吴欣 | 张平 | 赵明 | 张晓娜 |
|---|---|---|---|---|---|---|
| 数学 | 85 | 93 | 84 | 85 | 95 | 86 |
| 语文 | 79 | 95 | 95 | 80 | 100 | 98 |
| 英语 | 80 | 91 | 93 | 75 | 97 | 90 |
#include <stdio.h>
int main()
{
int i,j,s=0,v[3],w[6]; /*定义变量*/
int a[3][6]={{85,93,84,85,95,86},{79,95,95,80,100,98},{80,91,93,75,97,90}};
/*初始化*/
for(i=0;i<3;i++) /*外循环*/
{
for(j=0;j<6;j++) /*内循环*/
s=s+a[i][j]; /*各科的分数累加*/
v[i]=s/6; /*各科平均分*/
s=0; /*s重新赋初值0*/
}
for(j=0;j<6;j++) /*外循环*/
{
for(i=0;i<3;i++) /*内循环*/
s=s+a[i][j]; /*各人的分数累加*/
w[j]=s/3; /*各人平均分*/
s=0; /*s重新赋初值0*/
}
printf("数学:%d\t语文:%d\t英语:%d\n",v[0],v[1],v[2]);
/*输出各科平均分*/
printf("王笑:%d\t李鹏:%d\t吴欣:%d\t张平:%d\t赵明:%d\t张晓娜:%d\n",
w[0],w[1],w[2],w[3],w[4],w[5]); /*输出每个人的平均成绩*/
return 0;
}
三、字符数组
1.格式
前面介绍的都是数值型数组,即数组元素都是数值型。那么还有一种数组,其每个元素都是一个字符,也就是说,数组元素的数据类型都是char类型,称为字符数组。定义字符数组的方法与定义数值型数组的方法类似。例如:
char a[5]; /*定义字符数组a*/
char b[3][4]; /*定义二维字符数组b*/
2.赋值
字符数组的引用也与数值型数组引用方式一样,可使用下标的形式。例如,为上面定义的数组a中的第1个元素赋值,可以用如下方式描述:
a[0]='H';
字符数组同样允许在定义时进行初始化赋值。字符数组初始化的过程与数值型数组初始化的过程相似。例如:
char a[5]={'H','e','l','l','o'};
赋值后各元素的值为:a[0]='H',a[1]='e',a[2]='l',a[3]='l',a[4]='o'。
字符数组与数值型数组在初始化时的区别在于:如果字符数组在初始化时提供的数据个数少于数组元素个数,则多余的数组元素初始化为空字符'\0',而数值型数组是0。例如:
char b[9]={'G','o','o','d'};
初始化后各元素的值为:b[0]='G',b[1]='o',b[2]='o',b[3]='d',b[5]='\0',b[6]='\0',b[7]='\0',b[8]='\0'。
3.例子1:编写程序,将字符I love C!存放在一维数组中并输出。
#include <stdio.h>
int main()
{
char c[9]={'I',' ','l','o','v','e',' ','C','!'}; /*初始化字符数组c*/
int i; /*定义循环变量i*/
for(i=0;i<9;i++) /*输出字符数组c中每个元素的值*/
printf("%c",c[i]); /*格式化输出语句中,输出字符用%c*/
printf("\n"); /*输出换行符*/
return 0;
}
四、字符串
1.格式
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此,当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。
存放字符串的字符数组的初始化有两种方法。
用字符常量初始化数组。用字符常量给字符数组赋初值时,要用花括号将赋值的字符常量括起来。例如:
char str[6]={'C','h','i','n','a','\0'};
数组str[6]被初始化为“China”,其中,最后一个元素的赋值'\0'可以省略。
用字符串常量初始化数组。例如:
char string[6]={"China"};
还可将“{}”去掉,写成:
char string[6]="China";
2.例子1:编程实现从键盘输入一个字符串,存放于一个数组中,并将该数组输出。用不同的输入/输出函数实现。
用格式化输入输出字符实现如下
#include <stdio.h>
int main()
{
char a[10]; /*定义数组a能够存放10个元素*/
int i; /*定义循环变量i*/
for(i=0;i<10;i++) /*循环实现逐个输入a[i]的值*/
scanf("%c",&a[i]); /*用scanf()对字符数组进行赋值*/
for(i=0;i<10;i++) /*循环实现逐个输出a[i]的值*/
printf("%c",a[i]); /*用printf()输出字符数组中的内容*/
printf("\n"); /*输出回车符*/
return 0;
}
用字符输入输出函数实现如下
#include <stdio.h>
int main()
{
char a[10]; /*定义数组a能够存放10个元素*/
int i; /*定义循环变量*/
for(i=0;i<10;i++) /*循环实现逐个输入a[i]的值*/
a[i]=getchar(); /*用getchar()对字符数组进行赋值*/
for(i=0;i<10;i++) /*循环实现逐个输出a[i]的值*/
putchar(a[i]); /*用putchar()输出字符数组中的内容*/
printf("\n"); /*输出回车符*/
return 0;
}
3.字符串输入输出函数
① gets函数为字符串输入函数,函数调用格式为:
gets(字符串数组名)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始位置。如执行函数:
gets(a); /*a为已定义的字符数组*/
② puts函数为字符串输出函数,函数调用格式为:
puts(字符串数组名)
其作用是将一个字符串(以'\0'结束的字符序列)输出到终端。
例子:编写程序,将字符I love C!存放在一维数组中并输出。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[30]="I love ",str2[]="C!"; /*初始化str1和str2*/
strcat(str1,str2); /*调用strcat函数*/
puts(str1); /*输出str1*/
return 0;
}
4.字符串拷贝函数strcpy函数
格式
其一般格式为:
strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志'\0'也一同拷贝。字符数组2,也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。
例子:编写程序实现将字符串2中的字符拷贝到字符串1中
#include <stdio.h>
#include <string.h>
int main()
{
char str1[15],str2[]="C Language"; /*定义两个字符数组,并为str2赋初值*/
strcpy(str1,str2); /*调用strcpy函数*/
puts(str1); /*输出字符串1*/
return 0;
}
5.大小写转换函数strlwr函数和strupr函数
格式
① strlwr函数的一般格式为:
strlwr(字符数组名)
功能:将字符串中的字符转换成小写。
② strupr函数的一般格式为:
strupr(字符数组名)
功能:将字符串中的字符转换成大写。
例子:编程实现将一字符串中的字符转换成小写输出,再转换成大写输出。
#include <stdio.h>
#include <string.h>
int main()
{
char s[]="how ARE You?"; /*初始化字符串s*/
strlwr(s); /*将s中的字符转换成小写*/
puts(s); /*输出s*/
strupr(s); /*将s中的字符转换成大写*/
puts(s); /*输出s*/
return 0;
}
6.字符串比较函数strcmp函数
格式
其一般格式为:
strcmp(字符数组名1,字符数组名2)
功能:将两个数组中的字符串从左至右逐个相比较,比较字符的ASCII码大小,并由函数返回值返回比较结果。
(1)如果字符串1=字符串2,则返回值为0。
(2)如果字符串1>字符串2,则返回值为一个正整数。
(3)如果字符串1<字符串2,则返回值为一个负整数。
例子:比较两字符串的大小,并输出结果。
#include <stdio.h>
#include <string.h>
int main()
{
int k; /*定义变量k用于存放strcmp函数的返回值*/
char str1[15],str2[15]; /*定义字符数组*/
printf("请输入第一个字符串:"); /*输出提示语*/
gets(str1); /*输入字符串1*/
printf("请输入第二个字符串:"); /*输出提示语*/
gets(str2); /*输入字符串2*/
k=strcmp(str1,str2); /*调用strcmp函数*/
if(k==0) printf("str1=str2\n"); /*返回值为0,那么字符串1=字符串2*/
if(k>0) printf("str1>str2\n"); /*返回值>0,那么字符串1>字符串2*/
if(k<0) printf("str1<str2\n"); /*返回值<0,那么字符串1<字符串2*/
return 0;
}
C语言学习笔记之(数组)
https://www.wsjj.top/archives/c10
评论