null第六章第六章null问题:给一组数排序,这组 数该 如何存放呢??? 这些数据如何存放才便于排序188888888881111111111111118888888888 本章要点 本章要点掌握一维、二维数组的定义和引用
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
、存储结构和初始化方法。
掌握有关一维数组的有关算法
掌握数组的运算。主要内容主要内容6.1 为什么要用数组
6.2 定义和引用一维数组
6.3 二维数组的定义和引用
6.4 字符数组
6.5 提高部分6.1 为什么要用数组6.1 为什么要用数组 C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。一个班学生的学习成绩
一行文字
一个矩阵
这些数据的特点是:
1、具有相同的数据类型
2、使用过程中需要保留原始数据null1.一维数组的定义格式为:
类型说明符 数组名[常量表达式];
例如: int a[10];
它表示定义了一个整形数组,数组名为a,此数组有10个元素。
6.2 定义和引用一维数组
6.2.1 定义一维数组说明:
1.数组名定名规则和变量名相同,遵循标识符定名规则。null2.在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。
3.常量表达式中可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。null例如: int n;
scanf(“%d″,&n); /*在程序中临时输入数
组的大小 */
int a[n];数组说明中其他常见的错误:
① float a[0]; /* 数组大小为0没有意义 */
② int b(2)(3); /* 不能使用圆括号 */
③ int k, a[k]; /* 不能用变量说明数组大小*/ null注意:
定义数组时用到的“数组名[常量表达式]” 和引用数组元素时用到的“数组名[下标]” 是有区别的。
例如∶ int a[10];
t=a[6]; 6.2 一维数组的定义和引用6.2.2 引用一维数组元素1.数组元素的引用方式:
数组名[下标]
下标可以是整型常量或整型表达式。
例如: a[0]=a[5]+a[7]-a[2*3]null2.一维数组元素引用的程序实例例题 6.1 引用数组元素。利用循环给数组元素a[0]~a[9]赋值为0~9,然后按逆序输出各元素的值解题思路 循环给数组元素a[0] ~a[9]赋值0~9,这样,然后按a[9]到a[0]的顺序输出各元素的值。null2.一维数组元素引用的程序实例#include
void main()
{
int i,a[10];
for (i=0; i<=9;i++)
a[i]=i;
for(i=9;i>=0; i--)
printf("%d ″,a[i]);
printf("\n″);
} 运行结果如下:
9 8 7 6 5 4 3 2 1 0
说明:1、第一个for循环的作用是给a数组中的元素赋值。
2、第2个for循环的作用是所按逆序输出a数组中的10个元素
编写程序null对数组元素初始化的实现方法: 1.在定义数组时对数组元素赋以初值。
例如:int a[10]={0,1,2,3,4,5,6,7,8,9};
将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。 6.2 一维数组的定义和引用
6.2.3 一维数组的初始化null 3. 如果想使一个数组中全部元素值为0,可以写成:
int a[10]={0,0,0,0,0,0,0,0,0,0};
或
int a[10]={0}; 2. 可以只给一部分元素赋值。
例如: int a[10]={0,1,2,3,4};
定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。null4. 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
例如:int a[5]={1,2,3,4,5};
也可以写成 int a[]={1,2,3,4,5};
int a[10]={1,2,3,4,5}; 只初始化前5个元素,后5个元素为0。nullFibonacci数列公式:已知: a1=a2=1,an=an-1+an-2
即:1,1,2,3,5,8,13
建立一个数组,将数列中第1个数放在数组第1个的元素中,数列第2个数放在数组第2个的元素中,……。 6.2 一维数组的定义和引用
6.2.4 一维数组程序举例例题 6.2 用数组来处理求Fibonacci数列问题。 解题思路null程序实例:
#include
void main()
{
int i;
int f[20]={1,1};6.2 一维数组的定义和引用
6.2.4 一维数组程序举例编写程序nullfor(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{
if(i%5==0) printf(″\n″);
printf(″%12d″,f[i])
} /*For循环结束*/
} /*程序结束*/运行结果如下:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765if语句用来控制换行,每行输出5个数据。null例题 6.3 假如有n个人,各人年龄不同,希望按年龄将他们从小到大排列。 解题思路 这种问题称为数的排序(sort)。排序的原则有两 类,一类是“升序”,从小到大;一类是“降序”,从大到小。我们可以把这个题目抽象为一般形式:
对n个数按升序排列
对一组数据进行排序的方法很多,本例介绍用“起泡法”排序。“起泡法”的思路是如下null 经过第一趟(共5次比较与交换)后,最大的数9已“沉底” 。然后进行对余下的前面5个数第二趟比较,null如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。null程序流程图如下:null#include
void main()
{
int a[10];
int i,j,t;
printf(″input 10 numbers :\n″);
for (i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n"); 编写程序nullfor(j=0;j<9;j++)
for(i=0;i<9-j;i++)
if (a[i]>a[i+1])
{
t=a[i];a[i]=a[i+1];
a[i+1]=t;
}
printf(″the sorted numbers :\n″);
for(i=0;i<10;i++)
printf(″%d ″,a[i]);
printf(″\n″);
}/*程序结束*/程序运行结果如下:
input 10 numbers:
1 0 4 8 12 65 -76 100 -45 123↙
the sorted numbers:
-76 -45 0 1 4 8 12 65 100 123说明:1、程序中实现起泡法排序算法的主要是10~13行。
2、仔细分析嵌套的for语句。 6.3 二维数组的定义和引用
6.3.1 定义二维数组 6.3 二维数组的定义和引用
6.3.1 定义二维数组二维数组定义的一般形式为
类型说明符 数组名[常量表达式][常量表达式];
例如:定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。如下:
float a[3][4],b[5][10];不能写成 float a[3,4],b[5,10]; 6.3 二维数组的定义和引用
6.3.1 定义二维数组C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,再存放第二行的元素。下图表示对a[3][4]数组存放的顺序。 a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23
6.3 二维数组的定义和引用
6.3.1 定义二维数组6.3 二维数组的定义和引用
6.3.2 引用二维数组的元素6.3 二维数组的定义和引用
6.3.2 引用二维数组的元素二维数组元素的表示形式为:
数组名[下标][下标]
例如: a[2][3]
下标可以是整型表达式,如 a[2-1][2*2-1]数组元素可以出现在表达式中,也可以被赋值
例如:b[1][2]=a[2][3]/26.3 二维数组的定义和引用
6.3.2 引用二维数组的元素常出现的错误有:
int a[3][4]; /* 定义a为3×4的数组 */
┆
a[3][4]=3; 在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。6.3 二维数组的定义和引用
6.3.2 引用二维数组的元素null可以用下面4种方法对二维数组初始化:1.分行给二维数组赋初值。
例如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 2.可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。
例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 6.3 二维数组的定义和引用 6.3.3 二维数组的初始化null3.可以对部分元素赋初值。
例如: int a[3][4]={{1},{5},{9}}; 1 0 0 0
5 0 0 0
9 0 0 0也可以对各行中的某一元素赋初值,如
int a[3][4]={{1},{0,6},{0,0,11}}; 1 0 0 0
0 6 0 0
0 0 0 11 1 0 0 0
5 6 0 0
0 0 0 0也可以只对某几行元素赋初值。如:
int a[3][4]={{1},{5,6}}; null4.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};它等价于:int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。
例如:int a[][4]={{0,0,3},{},{0,10}};0 0 3 0
0 0 0 0
0 10 0 0null 6.3 二维数组的定义和引用 6.3.4 二维数组程序举例例题 6.4 将一个二维数组a的行和列的元素互换(即行列转置),存到另一个二维数组b中。 解题思路 将a数组中第i行j列元素赋给b数组中j行i列元素,例如a[0][0]赋给b[0][0],a[0][1] 赋给b[1][0],a[0][2]赋给b[2][0],……。可以用双层循环来处理,用外循环控制行的变化,内循环控制列的变化。null 6.3 二维数组的定义和引用 6.3.4 二维数组程序举例#include
void main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf(″array a:\n″);
for (i=0;i<=1;i++)
{
for (j=0;j<=2;j++)
{ 编写程序null printf(″%5d″,a[i][j]);
b[j][i]=a[i][j];
}
printf(″\n″);
}
printf(″array b:\n″);
for (i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
printf("%5d″,b[i][j]);
printf(″\n″);
}
} /*程序结束*/运行结果如下:
array a:
1 2 3
4 5 6
array b:
1 4
2 5
3 6 说明:如果把第7行:“for (i=0;i<2;i++)”改为“for (i=0;i<=2;i++)”,意味着什么?结果会怎样?null例题 6.5 有一个班30个学生,己知每个学生有5门课的成绩,要求输出平均成绩最高的学生的成绩以及该学生的序号。 解题思路 对本题而言,宜用二维数组,用一行中的各元素存放一个学生的成绩,即行代表学生,列代表一门课的成绩。要存放30个学生5门课的成绩,要用一个30*5的二维数组。另外,由于要比较各人的平均成绩,因此,对每个学生来说,应该存放6个数据,每人平均成绩要计算出来,并存放在数组中。这样,数组的大小就应该是30*6。
设计算法:(1)求每人平均成绩,放在数组每一行的最后一列中;
(2)找出最高的平均分,和该学生的序号;
(3)输出最高的平均分,和该学生的序号。null程序如下:
#include
void main()
{int i,j,max_i;
float sum,max=0;
float s[6][6]={{78,82,93,74,65},{91,82,72,76,67},{100,90,85,72,98},
{67,89,90,65,78},{77,88,99,45,89},{78,89,76,99.97}};
for (i=0;i<5;i++)
{sum=0; /* 使sum初值为0 */
for (j=0;j<5;j++)
sum=sum+s[i][j]; /* 累加序号为j的学生各门课的成绩 * s[i][5]=sum/5;} /* 求序号为j的学生各门课的的平均分 */
编写程序nullfor (i=0;i<5;i++)
if (s[i][5]>max) /* 逐个将5个学生的平均分与max比较 */
{max=s[i][5];max_i=i;} /* 如果比max大,就用序号为i的学生的平均分取代max的原值,将i的当前值保存在max_I中 */
printf("stu_order=%d\nmax=%7.2f\n",max_i,max); /* 输出最高平均分和该生的序号i */
} 运行结果如下:
max=10,row=2,colum=1 说明: 1、在对数组初始化时,只对各行的前5列赋初值,第6列默认为0。
2、注意第一个for语句的范围。请思考能否不要“sum=0;”这一行?或者把这一句改放到for语句的前面?
3、第三个for语句内嵌了一个if语句,用来将5个学生的平均分逐个与max比较
6.4 字符数组
6.4.1 定义字符数组及对其初始化6.4 字符数组
6.4.1 定义字符数组及对其初始化定义方法与前面介绍的类似。例如:
char c[10];
c[0]=′I′;c[1]=′ ′;c[2]=′a′;
c[3]=′m′;c[4]=′ ′;c[5]=′h′;c[6]=′a′;
c[7]=′p′;c[8]=′p′;c[9]=′y′;null对字符数组初始化,可逐个字符赋给数组中各元素。
例如:
char c[10]={‘I’,’a’,’m’,’h’,’a’,’p’,’p’,’y’} 6.4 字符数组 6.4.1 定义字符数组及对其初始化null如果初值个数小于数组长度,则只将这些字符赋给数
组中前面那些元素,其余的元素自动定为空字符。null如果提供的初值个数与预定的数组长度相同,在定义
时可以省略数组长度,系统会自动根据初值个数确定
数组长度。char c[]={′I′,′ ′,′a′,′m′,′ ′,′h′,
′a′,′p′,′p′,′y′};数组c的长度自动定为10。 null char diamond[5][5]={{′ ′,′ ′,*′},{′ ′,′*′,′ ′,′*′},{′*′,′ ′,′ ′,′ ′,′*′},{′ ′,′*′,′ ′,′*′},{′ ′,′ ′,′*′}}定义和初始化一个二维字符数组 null6.4 字符数组 6.4.2 引用字符数组例题 6.6输出一个菱形图解题思路 先画出准备输出的菱形字符图案,它应当是5行5列,然后逐行写出其中的字符,如第1行应由2个空格字符、一个‘*’ 和2个空格字符组成。第2行由1个空格字符、‘*’、2个空格字符、‘*’ 和2个空格字符组成。依此类推。把这些字符作为初值赋给c数组。 null#include
void main()
{ char diamond[][5]={{′ ′,′ ′,′*′},{′′,′*′,′ ′,′*′},{′*′,′ ′,′ ′,′ ′,′*′},{′ ′,′*′,′ ′,′*′},{′ ′,′ ′,′*′}};
int i,j;
for (i=0;i<5;i++)
{ for (j=0;j<5;j++)
printf(″%c″,diamond[i][j]);
printf(″\n″); }
}运行结果
*
* *
* *
* *
*编写程序说明:请注意怎样构成一个菱形字符数组 null6.4 字符数组 6.4.3字符串和字符串结束标志 为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’。 字符数组并不要求它的最后一个字符为′\0′,甚至可以不包含′\0′。
例如:char c[5]={′C′,′h′,′i′,′n′,′a′};null 但是由于系统对字符串常量自动加一个′\0′。因此,为了使处理方法一致,在字符数组中也常人为地加上一个′\0′。
例如:char c[6]={′C′,′h′,′i′,′n′,′a′,′\0′};6.4 字符数组 6.4.3字符串和字符串结束标志null例如:
定义了如下的字符数组∶
char c[]={“Pascal program”};
现在,想用一个新的字符串代替原有的字符串”Pascal program” ,从键盘向字符数组输入∶Hello
如果不加′\0′的话,字符数组中的字符如下∶
Hellol program6.4 字符数组 6.4.3字符串和字符串结束标志null6.4 字符数组 6.4.4 字符数组的输入输出 字符数组的输入输出可以有两种方法:
逐个字符输入输出。用格式符“%c”输入或输出一个字符。
将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。 null在内存中数组c的状态null说明:
1. 输出字符不包括结束符′\0′。
2.用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
3.如果数组长度大于字符串实际长度,也只输出到遇′\0′结束。
4.如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。
5.可以用scanf函数输入一个字符串。
null 如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。
例如:
char strl[5],str2[5],str3[5];
scanf(″%s %s %s″,str1,str2,str3);
输入数据:
How are you?
数组中未被赋值的元素的值自动置′\0′。null分析图中所示的字符数组
用8进制形式输出数组c的起始地址
printf(″%o″,c);
printf(″%s″,c);6. scanf函数中的输入项如果字符数组名。不要再加地址符&,因为在C语言中数组名代表该数组的起始地址。下面写法不对:
scanf(″%s″,&str);null 在程序中往往需要对字符串作某些操作处理,如把两个字符串连接起来、将两个字符串进行比较等,在C函数库中提供了一些字符串处理函数,用来实现以上功能,使用很方便。下表列出几种常用的函数。6.4 字符数组
6.4.5字符串处理函数 nullnull6.4 字符数组
6.4.6 字符数组应用举例 例题 6.7有3个字符串,要求找出其中最大者 解题思路 在字符串比较中,所谓 “大”者是指按英文字典的排列,在后面出现的为大 。把str[0]、str[1]、str[2]看作3个一维字符数组, 如同一维数组那样进行处理。今用gets函数分别读入3个字符串。经过两次比较,就可得到值最大者,把它放在一维字符数组string中。null程序如下:
#include
#include
void main ( )
{
char string[20];
char str[3][20];
int i;
for (i=0;i<3;i++)
gets (str[i]);编写程序nullif (strcmp(str[0],str[1])>0)
strcpy(string,str[0])
else strcpy(string,str[1]);
if (strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf(″\nthe largest string is∶
\n%s\n″,string);
}编写程序null运行结果如下:
CHINA↙
HOLLAND↙
AMERICA↙
the largest string is∶
HOLLAND说明: 1、 在使用字符串函数时要在本程序的开头要用#include 将头文件包含进来。
2、在输入以上国名字符串时,字母前不加空格
3、这个题目也可以不采用二维数组,而设3个一维字符数组来处理。 null6.4 字符数组
6.4.6 字符数组应用举例 例题 6.8 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 null6.4 字符数组
6.4.6 字符数组应用举例 解题思路null程序如下:
#include
void main()
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for (i=0;(c=string[i])!=′\ 0′;i++) 编写程序nullif(c==′ ′) word=0;
else if(word==0)
{ word=1;
num++;
}
printf(″There are %d words in the
line.\n″,num);
} 运行情况如下:
I am a boy.↙
There are 4 words in the line. nullC语言规定在定义和引用二维数组时采用两对括号:
二维数组定义的一般形式为
类型说明符 数组名[常量表达式][常量表达式];
6.5 提高部分
6.5.1为什么在定义二维数组时采用两对双括号的形式例如:定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。如下:
float a[3][4],b[5][10];这样做有什么好处呢?null注意:我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。
例如:可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。6.5 提高部分
6.5.1为什么在定义二维数组时采用两对双括号的形式null1. gets函数
其一般形式为:gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:
gets(str)
从键盘输入:
Computer↙6.5 提高部分
6.5.2 C语言字符串函数的详细说明null2. puts函数
其一般形式为: puts (字符数组)
其作用是将一个字符串(以′\0′结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为"China"。则执行puts(str);其结果是在终端上输出China。null用puts函数输出的字符串中可以包含转义字符。例如:
char str[]={″China\nBeijing″};
puts(str);
输出结果:
China
Beijing 在输出时,将字符串
结束标志′\0′
转换成′\n′,
即输出完字符串后换行。null将输入的字符串"Computer"送给字符数组str(请注意送给数组的共有9个字符,而不是8个字符),函数值为字符数组str的起始地址。一般利用gets函数的目的是向字符数组输入一个字符串,而不大关心其函数值。
注意:用puts和gets函数只能输入或输出一个字符串,不能写成
puts(str1,str2)
或 gets(str1,str2)null3. strcat函数
其一般形式为:strcat(字符数组1,字符数组2)
Strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。null例如:
char str1[30]={″People′s Republic of ″};
char str2[]={″China″};
print(″%s″,strcat(str1,str2));
输出:
People′s Republic of China null4. strcpy函数
其一般形式为:strcpy(字符数组1,字符串2)
strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:
char str1[10],str2[]={″China″};
strcpy(str1,str2); 关于strcpy函数的几点说明关于strcpy函数的几点说明1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。 2.“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,″China″); null3.复制时连同字符串后面的′\0′一起复制到字符数组1中。 4.可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(str1,str2,2);
作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’。 null5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的:
str1=″China″;
str1=str2;
而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一
个字符型变量或字符数组元素。如下面是合法的:
char a[5],c1,c2;
c1=′A′; c2=′B′;
a[0]=′C′; a[1]=′h′; a[2]=′i′;
a[3]=′n′; a[4]=′a′; null5. strcmp函数
其一般形式为:strcmp(字符串1,字符串2)
strcmp的作用是比较字符串1和字符串2。
例如:strcmp(str1,str2);
strcmp(″China″,″Korea″);
strcmp(str1,″Beijing″);null比较的结果由函数值带回
(1) 如果字符串1=字符串2,函数值为0。
(2) 如果字符串1>字符串2,函数值为一正整数。
(3) 如果字符串1<字符串2,函数值为一负整数。
注意:对两个字符串比较,不能用以下形式:
if(str1>str2) printf(″yes″);
而只能用
if(strcmp(str1,str2)>0) printf(″yes″);null6. strlen函数
其一般形式为:strlen (字符数组)
strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括′\0′在内)。
例如:char str[10]={″China″};
printf(″%d″,strlen(str));
输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,如strlen(″China″); null7. strlwr函数
其一般形式为:strlwr (字符串)
strlwr函数的作用是将字符串中大写字母换成小写字母。 8. strupr函数
其一般形式为:strupr (字符串)
strupr函数的作用是将字符串中小写字母换成大写字母。