在编写程序的过程中,我们经常会遇到使用很多数据量的情况,处理每一个数据量都应该有一个与之相对应的变量,如果每一个变量都要单独定义的话就会使得程序极为繁琐,而利用数组则可以便利的解决这个问题。
一维数组
一维数组是计算机科学中最基础的数据结构之一,它是在一块连续的内存空间中存储的相同类型数据元素的集合(可以类比为数学中的数列),通过一个索引(下标) 来访问其中的元素。
其一般形式如下:
类型说明符 数组标识符(常量表达式);例如定义一个数组:
intiarray[5];在数组iarry[5]中,包含iarry[0],iarry[1],iarry[2],iarry[3],iarry[4]5个元素。若使用iarry[5]则会出现下标越界的错误。
一维数组初始化
1.在定义数组时,直接对数组元素赋值
例如:
intiarry[5]={1,2,3,4,5};2.只给一部分元素赋值,未赋值部分元素值为0
例如:
intiarry[4]={1,2,3];数组共有4个元素,其中前3个元素的值为1,2,3,第4个元素值为0。
3.在对全部元素赋初值时可以不指定数组长度
例如:
intiarray[]={1,2,3,4}上述数组中有4个元素,系统会根据给定的元素的个数而规定数组的长度,因此该数组长度为4。
例:
编写一个C语言程序,使用一维数组保存 10名学生的C语言成绩(成绩范围0~100的整数),并实现以下功能:
1.从键盘输入10个成绩存入数组
2.计算并输出平均分
3.找出并输出最高分和最低分
4.统计及格人数(≥60分)和不及格人数
5.将成绩按从高到低排序后输出
#include<stdio.h>#defineN10intmain(){intscore[N];inti,j,temp;intsum=0,max,min,pass=0;/* 1. 输入成绩 */printf("请输入%d名学生的成绩(0~100):\n",N);for(i=0;i<N;i++){scanf("%d",&score[i]);sum+=score[i];}/* 2. 初始化最值 */max=min=score[0];/* 3. 遍历统计:最值 + 及格人数 */for(i=0;i<N;i++){if(score[i]>max)max=score[i];if(score[i]<min)min=score[i];if(score[i]>=60)pass++;}/* 4. 输出统计结果 */printf("平均分: %.2f\n",(double)sum/N);printf("最高分: %d, 最低分: %d\n",max,min);printf("及格人数: %d, 不及格人数: %d\n",pass,N-pass);/* 5. 冒泡排序(从高到低) */for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(score[j]<score[j+1]){temp=score[j];score[j]=score[j+1];score[j+1]=temp;}/* 6. 输出排序结果 */printf("成绩从高到低排序: ");for(i=0;i<N;i++)printf("%d ",score[i]);printf("\n");return0;}二维数组
一般形式
数据类型 数组名[常量表达式1][常量表达式2];通常,常量表达式1被称为行下标,常量表达式2被称为列下标。
二维数组array[n][m]下标取值如下:
行下标取值范围为:0-n-1
列下标取值范围为:0-m-1
二维数组最大下标为:array[n-1][m-1]
例如定义一个3行4列数组
intarray[3][4];二维数组初始化:
1.将所有元素写在一个大括号内
array[2][2]={1,2,3,4};如果大括号内的数据个数小于数组元素个数,则系统将默认后面的数据为0
2.可以省略行下标,但不能省略列下标
intarray[][3]={1,2,3,4,5,6};系统会根据数据个数进行分配
3.分行给数组元素赋值
intarray[2][3]={{1,2,3},{4,5,6}};在分行对元素赋值时,可以只对部分元素赋值
intarray[2][3]={{1,2},{3,4}};在上述代码中,array[0][0]为1,array[0][1]为2,array[0][2]为0,array[1][0]为3,array[1][1]为4,array[1][2]为0
4.直接对二维数组元素赋值
inta[2][2];a[0][0]=1;a[0[[1]=2;.....实例:求矩阵每行每列的和
编写一个C语言程序,完成以下功能:
1.定义一个 3×3 的二维整型数组,从键盘输入 9 个整数;
2.打印这个矩阵(每行 3 个数);
3.分别求出每一行元素的和,以及每一列元素的和,并输出。
代码
#include<stdio.h>#defineN3intmain(void){inta[N][N];inti,j;/* 1. 输入矩阵 */printf("请输入 %d 个整数:\n",N*N);for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);/* 2. 打印矩阵 */printf("\n矩阵:\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%3d",a[i][j]);printf("\n");}/* 3. 求每行的和 */printf("\n每行的和:\n");for(i=0;i<N;i++){intsum=0;for(j=0;j<N;j++)sum+=a[i][j];printf("第%d行: %d\n",i+1,sum);}/* 4. 求每列的和 */printf("\n每列的和:\n");for(j=0;j<N;j++){intsum=0;for(i=0;i<N;i++)sum+=a[i][j];printf("第%d列: %d\n",j+1,sum);}return0;}字符数组
数组中元素类型为字符型时称为字符数组。字符数组中每一个元素可以存放一个字符。
一般形式:
char数组标识符[常量表达式]例如:
chararray[5]初始化:
1.逐个字符赋值
chararray[5]={'h','e','l','l','0'};2.在定义字符数组时初始化,可省略数组长度
chararray[]={'h','e','l','l','0'};3.利用字符串给字符数组赋初值
chararray[]={"hello"}或者
chararray[]="hello"实例:统计字符串中的字符类别
编写一个C语言程序,从键盘输入一行字符串(不超过 100 个字符,可包含空格),完成以下功能:
1.统计字符串中英文字母、数字字符、空格和其他字符的个数;
2.将字符串中的所有小写字母转换为大写字母,其余字符不变,输出转换后的字符串;
3.统计该字符串的实际长度(不包含结尾的 ‘\0’);
4.将字符串逆序输出。
代码:
#include<stdio.h>#include<string.h>#defineMAX100intmain(void){charstr[MAX];inti,len;intletters=0,digits=0,spaces=0,others=0;/* 1. 输入字符串(可含空格) */printf("请输入一行字符串:\n");fgets(str,MAX,stdin);/* 去掉 fgets 可能读入的换行符 */len=strlen(str);if(len>0&&str[len-1]=='\n'){str[len-1]='\0';len--;}/* 2. 统计各类字符 */for(i=0;i<len;i++){charc=str[i];if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))letters++;elseif(c>='0'&&c<='9')digits++;elseif(c==' ')spaces++;elseothers++;}printf("\n原字符串: %s\n",str);printf("字母个数: %d\n",letters);printf("数字个数: %d\n",digits);printf("空格个数: %d\n",spaces);printf("其他字符个数: %d\n",others);/* 3. 小写转大写(就地修改) */for(i=0;i<len;i++){if(str[i]>='a'&&str[i]<='z')str[i]=str[i]-'a'+'A';}printf("\n转换为大写: %s\n",str);printf("字符串长度: %d\n",len);/* 4. 逆序输出 */printf("\n逆序输出: ");for(i=len-1;i>=0;i--)putchar(str[i]);printf("\n");return0;}