为了处理方便,把具有相同类型的变量按有序的形式组织起来。这些同类数据元素的集合称之为数组。数组可分为数值数组、字符数组、指针数组、结构数组等。
01--一维数组
在使用数组前需要先定义:
类型说明符 数组名[常量表达式];
类型说明符是基本数据类型或者构造数据类型
常量表达式表示数组元素的个数,或者说是数组的长度。
eg: float x[4]; 说明实型数组x,有4个元素,分别为x[0],x[1],x[2],x[3].下标从0开始
数组元素的一般形式为:
数组名[下标]
必须先要定义数组,才能使用下标变量
在C中只能逐个使用下标变量而不能一次用整个数组
例如有5个元素的数组必须使用循环语句逐个输出各个下标变量
for(i=0;i<4;I++) printf("%d",a[i]);
而不允许直接使用 printf("%d",a);
#include <stdio.h>
int main(){int i,a[10];for(i=0;i<=9;i++){ a[i]=i;printf("%d ",a[i]);}for(i=9;i>=0;i--)printf("%d ",a[i]);return 0;
}
#include <stdio.h>
int main(){int i,a[10];for(i=0;i<10;)a[i++]=i;for(i=9;i>=0;i--)printf("%d",a[i]);return 0;}
#include <stdio.h>
int main(){int i,a[10];for(i=0;i<10;i++)a[i]=2*i+1;for(i=0;i<=9;i++)printf("%d ",a[i]);printf("\n%d %d\n",a[2],a[8]);return 0;
}
1.一维数组的初始化
一般形式为: 类型说明符 数组名[常量表达式]={值,值......,值};
int a[4]={0,1,2,3}; 相当于a[0]=0,a[1]=1,a[2]=2,a[3]=3;
1)可以只赋值给部分元素
int a[5]={0,1}; 表示只给a[0]=0,a[1]=1,其他元素均为0
2)只能逐个元素赋值,不可整体赋值
int a[3]={2,2,2}; 不可写为int a[3]=2;
3)若给所有元素赋值,可不写出元素个数
int a[3]={2,2,2}; 可写为int a[]={2,2,2};
#include <stdio.h>
int main(){int i,max,a[5];printf("input 5 numbers:\n");for(i=0;i<5;i++)scanf("%d",&a[i]);max=a[0];for(i=1;i<5;i++)if(a[i]>max) max=a[i];printf("maxmum=%d\n",max);return 0;
}
#include <stdio.h>
int main(){int i,j,p,q,s,a[10];printf("\n input 10 numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<10;i++){p=i;q=a[i];for(j=i+1;j<10;j++)if(q<a[j]) { p=j;q=a[j]; }if(i!=p){s=a[i];a[i]=a[p];a[p]=s; }printf("%d ",a[i]);}return 0;
}
02--二维数组
一般形式:
类型说明符 数组名[常量表达式1][常量表达式2]
常量表达式1表示第一维下表长度,常量表达式2表示第二维下标长度
例: int x[2][3] 表示一个2行3列的数组,数组名为x,下标变量的类型为整型
共有2*3=6个元素 分别为:x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],每个元素占用的空间都为int类型的大小
1.二维数组元素的引用
假设有4位同学的语数外成绩如下,打印出来求每科成绩的平均分及每个人的总分。
#include <stdio.h>
int main()
{int i,total;float c;int a[4][3]={{95,89,99},{93,92,95},{99,95,92},{91,97,94}};printf("Here are the scores of all the students!\n");printf(" 穆山 穆川 沐枫 沐玥\n");printf("语文: "); for(i=0;i<4;i++)printf("%d ",a[i][0]);printf("\n数学: "); for(i=0;i<4;i++)printf("%d ",a[i][1]);printf("\n英语: "); for(i=0;i<4;i++)printf("%d ",a[i][2]);for(i=0,c=0;i<4;i++)c=c+a[i][0];c=c/4;printf("\n\n语文的平均分为:%4.2f ",c);for(i=0,c=0;i<4;i++)c=c+a[i][1];c=c/4;printf("\n数学的平均分为:%4.2f ",c);for(i=0,c=0;i<4;i++)c=c+a[i][2];c=c/4;printf("\n英语的平均分为:%4.2f ",c);for(i=0,total=0;i<3;i++)total=total+a[0][i];printf("\n穆山的总分为:%d ",total);for(i=0,total=0;i<3;i++)total=total+a[1][i];printf("\n穆川的总分为:%d ",total);for(i=0,total=0;i<3;i++)total=total+a[2][i];printf("\n沐枫的总分为:%d ",total);for(i=0,total=0;i<3;i++)total=total+a[3][i];printf("\n沐玥的总分为:%d ",total);
}
上述如果用二维的变量表示可以改为如下代码,最后运行结果与上面一致
#include <stdio.h>
int main()
{int i,j;float c=0,s=0,v[3],t[4];int a[4][3]={{95,89,99},{93,92,95},{99,95,92},{91,97,94}};printf("Here are the scores of all the students!\n");printf(" 穆山 穆川 沐枫 沐玥\n");printf("语文: "); for(i=0;i<4;i++)printf("%d ",a[i][0]);printf("\n数学: "); for(i=0;i<4;i++)printf("%d ",a[i][1]);printf("\n英语: "); for(i=0;i<4;i++)printf("%d ",a[i][2]);for(i=0;i<3;i++){for(j=0;j<4;j++)c=c+a[j][i];v[i]=c/4;c=0;}printf("\n\n语文的平均分为:%4.2f ",v[0]);printf("\n数学的平均分为:%4.2f ",v[1]);printf("\n英语的平均分为:%4.2f ",v[2]);for(i=0;i<4;i++){for(j=0;j<3;j++)s=s+a[i][j];t[i]=s;s=0;}printf("\n穆山的总分为:%.2f ",t[0]);printf("\n穆川的总分为:%.2f ",t[1]);printf("\n沐枫的总分为:%.2f ",t[2]);printf("\n沐玥的总分为:%.2f ",t[3]);
}
1)可以只对部分元素赋初值,没有被赋值的元素自动取0
如: int a[2][3]={{1},{2}};
各个元素的值为
1 0 0
2 0 0
2)如果对全部元素赋值了,则一维的长度可以不写
如: int a[2][3]={0,1,2,3,4,5}; 可写为int a[][3]={0,1,2,3,4,5};
3)C语言允许二维数组分解为多个一维数组
如二维数组a[3][4]可以分为3个一维数组,其数组名分别为:
a[0] , a[1] , a[2]
上面每个数组又有4个元素,比如a[0]有 a[0][0],a[0][1],a[0][2],a[0][3]
03--字符数组
形式与前面的数值数组相同
char c[5];
字符数组也可以数二维或者多维数组
char c[2][3]
字符数组的初始化
char c[]={'a','f','c',' ','l'}; 长度为5
#include <stdio.h>
int main()
{int i,j;char a[][5]={{'H','e','l','l','o',},{'W','o','r','l','d'}};for(i=0;i<=1;i++){for(j=0;j<=4;j++)printf("%c",a[i][j]);printf("\n");}return 0;
}
C语言允许用字符串的方式对数组作初始化赋值
例如:
char c[]={'H','e','l','l','o'};
可以写为:char c[]={"Hello"};
或者为char c[]="Hello"
用字符串方式赋值要比用字符逐个赋值要多占一个字节,多个字节用于存放字符串结束标志'\0'
#include <stdio.h>
int main(){char c[]="Hello\nWorld";printf("%s\n",c);return 0;
}
由于使用的是"%s"字符串进行输出,只用写数组名就可以了,不可写为
printf("%s\n",c[]);
#include <stdio.h>
int main(){char st[15];printf("input string:\n");scanf("%s",st);printf("%s\n",st);return 0;
}
当用scanf函数输入字符串时,中间不能有空格,否则空格将作为结束符
可作如下改进:
#include <stdio.h>
int main(){char st1[6],st2[6],st3[6],st4[6];printf("input string:\n");scanf("%s%s%s%s",st1,st2,st3,st4);printf("%s %s %s %s\n",st1,st2,st3,st4);return 0;
}
scanf一般以地址的方式出现,但在上面例子中没有使用&,这是因为C语言规定,数组名就代表了该数组的首地址
如: char c[5]; 写作scanf("%s",&c);是错误的,只能写为scanf("%s",c);或者scanf("%s",&c[0]);
04--字符串处理函数
用于输入输出的字符串函数,需要包含头文件"stdio.h"
其他字符串函数需要包含头文件"string.h“
1.字符串输出函数 puts
格式: puts(字符数组名)
功能:把字符数组中的字符串输出到显示器
#include"stdio.h"int main(){char c[]="Hello\nWorld";puts(c);return 0;
}
2.字符串输入函数 gets
格式: gets(字符数组名)
功能:输入设备上输入一个字符串
#include"stdio.h"int main(){char st[15];printf("input string:\n");gets(st);puts(st);return 0;
}
3.字符串连接函数 strcat
格式: strcat(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串连接到字符数组1中字符串后面,并删去字符串1后的"\0"
#include"stdio.h"
#include"string.h"
int main()
{static char st1[30]="My name is ";char st2[10];printf("input your name:\n");gets(st2);strcat(st1,st2);puts(st1);return 0;
}
4.字符串拷贝函数 strcpy
格式: strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串拷贝到字符数组1中,串结束标志"\0"一起拷贝。相当于把一个字符串赋予一个字符数组。
#include"stdio.h"
#include"string.h"int main(){char st1[15]="I love you",st2[]="C Language";strcpy(st1,st2);puts(st1);printf("\n");return 0;
}
5.字符串比较函数 strcmp
格式: strcmp(字符数组名1,字符数组名2)
功能:按照ASCII顺序比较两个数组中的字符串,字符串1=字符串2,返回值=0;
字符串1>字符串2,返回值>0;字符串1<字符串2,返回值<0;
#include"stdio.h"
#include"string.h"int main()
{ int k;static char st1[15],st2[]="C Language";printf("input a string:\n");gets(st1);k=strcmp(st1,st2);if(k==0) printf("st1=st2\n");if(k>0) printf("st1>st2\n");if(k<0) printf("st1<st2\n");return 0;
}
6.字符串长度函数 strlen
格式: strlen(字符数组名)
功能:测字符串的实际长度(不含结束标志'\0')并作为函数返回值
#include"stdio.h"
#include"string.h"int main(){ int k;static char st[]="C language";k=strlen(st);printf("The lenth of the string is %d\n",k);return 0;
}
#include"stdio.h"
#include"string.h"
int main(){char st[20],cs[5][20];int i,j,p;printf("input country's name:\n");for(i=0;i<5;i++)gets(cs[i]);printf("\n");for(i=0;i<5;i++){ p=i;strcpy(st,cs[i]);for(j=i+1;j<5;j++)if(strcmp(cs[j],st)<0) {p=j;strcpy(st,cs[j]);}if(p!=i){strcpy(st,cs[i]); strcpy(cs[i],cs[p]); strcpy(cs[p],st);}puts(cs[i]);}printf("\n");return 0;
}