基础实例(2)
C语言编程基础实例2
数组
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类型数据元素的集合称为数组。
在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型,因此按数组元素的类型不同,数组又可以分为数值数组、字符数组、指针数组、结构数组等各种类别。
一维数组
- 一维数组定义方式
一维数组的定义方式如下:
类型说明符 数组名 [常量表达式]
例如:
int a[10];
//说明整型数组a,有10个元素
float b[10],c[20];
//说明实行数组b,有10个元素,实行数组c,有20个元素
char ch[20];
//说明字符数组ch,有20个元素
关于数组类型有几点需要注意:- 数组类型实际指数组元素的取值类型。对于同一数组。其所有元素的数据类型都是相同的。
- 数组名的书写规则应符合标识符的书写规定
- 数组名不能与其他变量名相同
- 方括号中常量表达式表示数组元素的个数,如
a[5]
表示数组a有5个元素。但是其下标是从0开始计算。因此5个元素分布为a[0],a[1],a[2],a[3],a[4]
- 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:
是合法的。#define FD 5 main(){ int a[3+2],b[6+DF]; }
- 允许在同一个类型说明中,说明多个数组和多个变量。例如:
int a,b,c,d,k1[10],k2[20];
- 一维数组元素的引用
数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标标识了元素在数组中的顺序号。
数组元素的一般形式:
数组名[下标]
其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取证。例如:
a[5]
a[i+j]
a[i++]
都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。
实例1
#include<stdio.h>
//数组
int main(){
int i,a[10];
for (i=0;i<10;)
a[i++]=2*i+1;
for (i=0;i<=9;i++)
printf("%d ",a[i]);
printf("\n%d %d\n",a[5],a[6]);
}
结果输出:
- 一维数组的初始化
给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。数值初始化赋值是指在数组定义时给数组元素赋予初值,数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
初始化赋值的一般形式:
类型说明符 数组名[常量表达式]={值,值,...,值};
。例如:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
C语言对数组的初始化赋值有几点规定:- 可以只给部分元素赋初值。
当{}
中值的个数少于元素个数时,只给前面部分元素赋值。例如int a[10] = {0,1,2,3,4};
表示只给a[0]~a[4]
5个元素赋值,而后5个元素自动赋值0. - 只能给元素逐个赋值,不能给数组整体赋值。
例如给十个元素全部赋1值,只能写为:int a[10] = {1,1,1,1,1,1,1,1,1,1};
,而不能写为int a[10]=1;
- 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。
例如:int a[5]= {1,2,3,4,5};
可以写为:int a[] = {1,2,3,4,5};
实例2
- 可以只给部分元素赋初值。
#include<stdio.h>
int main(){
int i, max, a[10];
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
max=a[0];
for (i=1;i<10;i++)
if (a[i]>max)
max = a[i];
printf("max num=%d\n",max);
}
结果输出:
实例3:
#include<stdio.h>
int main(){
int i,j,p,q,s,a[10];
printf("\n input 10 nums:\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\n",a[i]);
}
}
结果输出:
二维数组
- 二维数组定义
二维数组定义的一般形式是:
类型说明符 数组名[常量表达式1][常量表达式2];
例如:int a[3][4];
说明了一个三行四列的数组,数组名为a
,其下标变量的类型为整型。该数组的下标变量共有3*4=12
个,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
- 二维数组元素的引用
二维数组的元素也称为双下标变量,其表示的形式为:
数组名[下标][下标]
例如:a[3][4]
表示a数组三行四列的元素。
#include<stdio.h>
//二维数组
int main(){
int i,j,s=0,ave,v[3],a[5][3];
printf("input the scores \n");
for (i=0;i<3;i++){
for (j=0;j<5;j++){
scanf("%d",&a[j][i]);
s = s + a[j][i];
}
v[i] = s/5;
s= 0;
}
ave = (v[0] + v[1] +v[2])/3;
printf("math:%d\nc language:%d\nbase:%d\n",v[0],v[1],v[2]);
printf("total average:%d\n",ave);
}
结果输出:
- 二维数组的初始化
二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,
也可按行连续赋值。例如对数组a[5][3]:- 按行分段赋值可写为:
int a[5][3]={{80,75,92},{61,65,71},{57,69,80},{85,87,90},{76,77,85}}
- 按行连续赋值可写为:
int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,87}
以上两种赋初值的结果完全一致。
对于二维数组初始化还有几点说明: - 可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:
int a[3][3] = {{1},{2},{3}};
是对每一行的第一个元素赋值,未赋值元素取0。1 0 0 2 0 0 3 0 0
int a [3][3]={{0,1},{0,0,2},{3}};
结果为:0 1 0 0 0 2 3 0 0
- 如对全部元素赋初值,则第一维的长度可以不给出。例如:
int a[3][3] = {1,2,3,4,5,6,7,8,9};
也可以写成:
int a[][3]={1,2,3,4,5,6,7,8,9};
- 数组是一种构造类型的数据。二维数组可以看作是一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成可二维数组。当然,前提是各个元素的类型相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言
允许这种分解。如二维数组a[3][4]
,可以分解为三个一维数组,其数组名分别为a[0],a[1],a[2]
。对这三个一维数组不需另作说明即可使用。这三个一维数组都有4
个元素,例如:
一维数组a[0]
的元素为a[0][0],a[0][1],a[0][2],a[0][3]
。必须强调的是,a[0],a[1],a[2]
不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。
- 按行分段赋值可写为:
- 字符数组
用来存放字符量的数组称为字符数组。- 字符数组的定义
例如:char c[10];
字符数组也可以是二维或多维数组。 - 字符数组的初始化
字符数组也允许在定义时作初始化赋值。例如:
char c[10]={‘c’, ‘ ’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’};
未赋值的元素自动赋''。 char c[]={
c,
,
p,
r,
o,
g,
r,
a,
m};
此时C数组的长度自动定为9。- 字符数组的引用
结果显示:#include<stdio.h> //字符数组赋值 int main(){ int i,j; char a[][5] = {{'B','A','S','I','C'},{'d','B','A','S','E'}}; for (i=0;i<=1;i++){ for(j=0;j<=4;j++) printf("%c",a[i][j]); printf("\n"); } }
- 字符串和字符串结束标志
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'
作为串的结束符。因此当把一个字符串存入一个数
组时,也把结束符'\0'
存入数组,并以此作为该字符串是否结束的标志.有了'\0'
标志后,就不必再用字符数组的长度来判断字符串的长度了。C语言允许用字符串的方式对数组作初始化赋值。例如:
char c[] = {'c', '','p','r','o','g','r','a','m'};
也可以写成char c[] = {"C program"};
或char c[] = "C program;
。用字符串方式赋值比用字符逐个赋值多占一个字节,用于存放字符串结束标志'\0'。上面数组c在内存中的
实际存放情况为
'\0'
是由C编译系统自动加上的。由于采用了'\0'
标志,所以在用字符串赋初值时一般无需指定数组的长度,而由系统自动处理。 - 字符串处理函数
C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、
比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字
符串函数,在使用前应包含头文件"stdio.h"
,使用其它字符串函数则应包含头文件
"string.h"
。- 字符串输出函数:
格式:puts(字符串组名)
。功能是把字符数组中的字符串输出到显示器,即在屏幕上显示该字符串。 - 字符串输入函数:
格式:gets(字符串组名)
。功能是从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。 - 字符串连接函数:
格式:strcat (字符数组名 1,字符数组名 2)
。功能是把字符数组 2 中的字符串连接到字符数组 1 中字符串的后面,并删去字符串1 后的串标志“\0”
。本函数返回值是字符数组1的首地址。 - 字符串拷贝函数:
格式:strcpy(字符数组名1,字符数组名2)
。功能是把字符数组 2 中的字符串拷贝到字符数组 1 中。串结束标志“\0”
也一同拷贝.字符数名 2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 - 字符串比较函数:
格式:strcmp(字符数组名1,字符数组名2)
。功能是按照 ASCII 码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。字符串1=字符串2,返回值=0;字符串 1 〉字符串 2,返回值〉0;字符串 1〈字符串 2,返回
值〈0。 - 测字符串长度函数strlen:
格式:strlen(字符数组名)
。功能是测字符串的实际长度(不包含字符串结束标志'\0'
)并作为函数返回值。
- 字符串输出函数:
- 字符数组的定义