1、共 49 页 第 1 1 页共 49 页 第 2 2 页本章要点本章要点1.1.建立数组的概念;建立数组的概念;2.2.掌握一维数组和二维数组的定义、掌握一维数组和二维数组的定义、3.3.4.4.5.5.掌握用数组进行编程的技术。掌握用数组进行编程的技术。共 49 页 第 3 3 页 如何处理一个班学生的学习成绩?如何处理一个班学生的学习成绩? 一行文字怎样存储?一行文字怎样存储? 一个矩阵怎样存储一个矩阵怎样存储 ?.一组具有一组具有相同数据类型相同数据类型的数据的的数据的 有序集合有序集合 这些数据的特点这些数据的特点:1.1.具有相同的数据类型具有相同的数据类型 2.2.使用过程中需要保
2、留原始数据使用过程中需要保留原始数据 C C语言为这些数据提供了一种语言为这些数据提供了一种构造数据类型:构造数据类型:数组。数组。共 49 页 第 4 4 页其中:其中:markmark、strstr、a a 是数组名。是数组名。 方括号内是数组的方括号内是数组的长度长度。 下标的个数称为数组的下标的个数称为数组的维数维数,markmark、strstr是一是一维数组、维数组、a a是二维数组。是二维数组。 数组的成员称为数组数组的成员称为数组元素元素, ,mark1,mark3mark1,mark3。 数组元素的类型称为该数组的数组元素的类型称为该数组的基类型基类型。数组。数组markma
3、rk的基类型是的基类型是intint,数组,数组strstr的基类型是的基类型是charchar。例如:存储学生成绩用整型数组例如:存储学生成绩用整型数组 mark100mark100, 存储一行文字用字符数组存储一行文字用字符数组 str200str200, 存储一个存储一个4 4* *6 6的矩阵用二维整型数组的矩阵用二维整型数组 a46a46。共 49 页 第 5 5 页 数组数组是一组有序的、类型相同的数据的集合,是一组有序的、类型相同的数据的集合,这些数据被称为这些数据被称为数组的元素数组的元素。共 49 页 第 6 6 页6.2 6.2 一维数组一维数组6.2.1 6.2.1 一维
4、数组的定义和引用一维数组的定义和引用1. 定义一维数组的一般方式:定义一维数组的一般方式: 类型说明符类型说明符 数组名数组名 常量表达式常量表达式 ; ;说明:说明:l类型说明符:数组的类型类型说明符:数组的类型l常量表达式常量表达式:数组元素的个数,即数组元素的个数,即数组长度数组长度。必。必须是大于零的须是大于零的常量常量。不能进行动态定义。不能进行动态定义。l数组名同变量名命名规则相同。数组名同变量名命名规则相同。例如:例如: float mark100;float mark100; char str200; char str200; intint a10; a10;共 49 页 第
5、7 7 页2. 一维数组的引用一维数组的引用数组元素的使用与数组元素的使用与单个单个变量相同变量相同,可以自由地存取。,可以自由地存取。数组元素的表示形式:数组元素的表示形式: 数组名数组名 下标下标 如如a3其中,其中,下标可以是整型常量、整型变量或整型表达下标可以是整型常量、整型变量或整型表达式式。 如:如: a3= a0 + ai+1; 下标指出在数组中第几个元素例:例:main() int i,sum=0,a26; for(i=0;i26;i+) scanf(“%d”,&ai);sum=sum+ai; printf(%d,sum);共 49 页 第 8 8 页数组中的每个元素数组中的每
6、个元素在功能上在功能上等价于一个一般的变量。等价于一个一般的变量。例如:例如:输出输出100100个学生成绩,并求出总成绩。个学生成绩,并求出总成绩。l 引用数组元素的注意事项引用数组元素的注意事项: :float m100,sum=0;float m100,sum=0;for ( i=0; i100; i+ )for ( i=0; i100; i+ ) scanf(”%fn scanf(”%fn”, &”, &m mii );); sum +=sum += m mii ; ; 数组方式数组方式float x, sum=0;float x, sum=0;for (i=0; i100; i+)f
7、or (i=0; i100; i+) scanf(”%fn scanf(”%fn”, &x);”, &x); sum += x; sum += x; 简单变量简单变量85m0m1m2m99sumsum828563789063 851481482263167950优点:优点:数据重用数据重用 数据有序数据有序x xsumsum827950共 49 页 第 9 9 页mark0mark1mark2mark3. . . .mark9986.592.077.552.0. . . .94.02000H2004H2008H200CH。218CH引用数组元素时,根据首引用数组元素时,根据首地址和下标,自动计
8、算出地址和下标,自动计算出该元素的实际地址,取出该元素的实际地址,取出该地址的内容进行操作。该地址的内容进行操作。如引用如引用 mark2:(1)计算计算 2000+2* *4=2008(2)从从取出取出2008的内容的内容l下标与地址的关系下标与地址的关系 为下标运算符为下标运算符, , 数组数组名、数组元素是两种不同性名、数组元素是两种不同性质的数据。质的数据。 数组名是数组的首地址,数组名是数组的首地址,是一个地址常量。是一个地址常量。 数组元素则是数值。数组元素则是数值。共 49 页 第 1010 页方法:将初值依次写在花括号方法:将初值依次写在花括号 内。内。如:如: int a5=
9、 2 , 4 , 6 , 8 , 10 ;存储形式:存储形式:存储单元存储单元共 49 页 第 1111 页 (1)给数组中部分元素赋初值,其他元素按零值处理。给数组中部分元素赋初值,其他元素按零值处理。 如:如: int a9=1,2; 则则 a0= 1, a1= 2, a2a8值全为值全为0。(2) 对数组元素全部赋值可以不指定长度。 intint a=0,1,2,3,5 ; a=0,1,2,3,5 ;等价于:等价于:intint a5=0,1,2,3,5 ; a5=0,1,2,3,5 ; (3)初值的个数不能超过数组最大元素的个数)初值的个数不能超过数组最大元素的个数。 int a3=
10、1, 2,3, 4 ; 说明:说明:共 49 页 第 1212 页利用输入语句利用输入语句main() char as26; int i ; for(i=0; i26; i+) scanf(%c,&asi); .利用赋值语句利用赋值语句main() char as26,ch; for(ch=A;ch=Z;ch+) asch-A=ch; .共 49 页 第 1313 页 例例1 1 从键盘上输入从键盘上输入1010个实型数存入数组,然个实型数存入数组,然 后按输入顺序的逆序输出这后按输入顺序的逆序输出这1010个数。个数。main() float a10; int i; for(i=0 ; i=
11、0 ; i-) printf(“%10.2f”,ai);共 49 页 第 1414 页例例2 用用冒泡法冒泡法对数据进行排序(由小到大)。对数据进行排序(由小到大)。方法:将两个相邻数比较,小的调到前头。方法:将两个相邻数比较,小的调到前头。 9 8 8 8 8 8 8 9 5 5 5 5 5 5 9 4 4 4 4 4 4 9 2 2 2 2 2 2 9 0 0 0 0 0 0 9由以上可推知:由以上可推知:6 个数要比较个数要比较5趟趟 第第一一趟中要进行两两比较趟中要进行两两比较5次次 第第二二趟中比较趟中比较 4次次 若有若有n个数,则要进行个数,则要进行n-1趟比较趟比较 第第 i趟
12、比较中要进行趟比较中要进行n-i次两两比较。次两两比较。共 49 页 第 1515 页#define N 6 main( ) int aN, i, j, n,t ; for( i=0; iN; i+) scanf(“%d”, &ai); for( i=0; iN-1; i+ ) for( j=1; jaj) t=aj-1; aj-1= aj;aj= t ; printf(“The sorted numbers: n”); for( i=0; iN; i+) printf(“%d ”, ai); n n个数比较个数比较n-1n-1趟趟第第i i趟比较趟比较n-in-i次次程序运行演示程序运行演示
13、共 49 页 第 1616 页例例 3 用数组来处理求用数组来处理求FibonacciFibonacci数列问题。数列问题。数学表示:数学表示:f(0)=f(1)=1, f(n)=f(n-2)+f(n-1)程序为:main( ) int i; int f20= 1, 1 ; for( i=2; i20 ;i+) fi= fi-2+fi-1; for( i=0; i20; i+) if( i%5= 0) printf(“n”); printf(“%12d” , fi ); 运行结果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 25
14、84 4181 6765共 49 页 第 1717 页冒泡排序的缺陷:在比较交换的过程中大的数不能冒泡排序的缺陷:在比较交换的过程中大的数不能一次到位,效率低。一次到位,效率低。 选择排序法的基本思想:选择排序法的基本思想: 以冒泡排序法为基础,在两两比较后并不马上进行以冒泡排序法为基础,在两两比较后并不马上进行交换,而是在找到最小的数之后,记住最小数的位置交换,而是在找到最小的数之后,记住最小数的位置(在数组中的下标),待一轮比较完毕后,再将最小(在数组中的下标),待一轮比较完毕后,再将最小的数一次交换到位。的数一次交换到位。共 49 页 第 1818 页 问题问题 将将 2323、1 1、
15、0 0、4343、-3 -3 和和 7 7 从小到大排列。从小到大排列。 选择排序法选择排序法 若有若有N N个数,则需要进行个数,则需要进行N-1N-1轮排序处理。轮排序处理。 第第1 1轮轮排序从排序从1 1N N个数中找出最小的数,然后将它与个数中找出最小的数,然后将它与第第1 1个数交换。第个数交换。第1 1个数则是最小的数。个数则是最小的数。第第2 2轮轮排序从排序从2 2N N个数中找出最小的数,然后将它与个数中找出最小的数,然后将它与第第2 2个数交换。第个数交换。第2 2个数则是次小的数。个数则是次小的数。 经过经过 N-1 N-1 轮处理,完成全部轮处理,完成全部N N个数排
16、序。个数排序。 编程时使用二重循环。外面的大循环控制进行编程时使用二重循环。外面的大循环控制进行N-1N-1轮轮排序,小循环找出第排序,小循环找出第 i i 轮的最小值。轮的最小值。共 49 页 第 1919 页#define N 6main( ) int aN ,i, j,k,t; printf(Input numbers:n); for( i=0; iN; i+) scanf(%d, &ai); for( i=0;iN-1;i+ ) k=i; for(j=i+1;jaj) k=j; if(k!=i) t=ai; ai=ak;ak=t; printf(%The sorted numbers:
17、 n); for( i=0; iN; i+) printf(%d , ai); 程序运行演示程序运行演示共 49 页 第 2020 页 定义二维数组的一般方式:定义二维数组的一般方式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式11常量表达式常量表达式22; 例如例如 int a33 存储形式:存储形式: 二维数组在内存中是二维数组在内存中是按行的顺序存放按行的顺序存放的,即先的,即先存放第一行的元素,再存放第二行的元素。存放第一行的元素,再存放第二行的元素。 例如例如 float a34; float a34; 6.3 6.3 二维数组的定义和引用二维数组的定义和引用6.3.1
18、二维数组的定义二维数组的定义222120121110020100aaaaaaaaaa第一个下标可能取值的个数第二个下标可能取值的个数共 49 页 第 2121 页说明:说明:二维数组除了维数比一维数组多一维外,二维数组除了维数比一维数组多一维外, 其它性质与一维数组是全部类似的。其它性质与一维数组是全部类似的。 下面写法是否正确?下面写法是否正确? int a03; 用于定义数组长度的常量表达式的值必须用于定义数组长度的常量表达式的值必须是大于是大于0的正整数。的正整数。 int i=3 , j=4 ; int aij ; 定义数组元素的个数必须使用常量表达式,定义数组元素的个数必须使用常量表
19、达式,而不能使用变量。而不能使用变量。 共 49 页 第 2222 页6.3.2 二维数组的引用二维数组的引用 二维数组的引用二维数组的引用与引用一维数组元素一样,也用与引用一维数组元素一样,也用下标法引用二维数组元素。下标法引用二维数组元素。 二维数组元素表示形式:二维数组元素表示形式:数组名数组名下标下标1下标下标2 下标下标1和下标和下标2是整型常量、整型变量或整型表达是整型常量、整型变量或整型表达式。其编号是从式。其编号是从0开始的开始的。 例如:若有例如:若有 int a2*53*4, i=15; 则使用则使用 a3*30, a1i-5都是合法的。都是合法的。说明说明:数组名:数组名
20、a代表的是代表的是数组数组a在内存中的首地址在内存中的首地址, 因此,可以用数组名因此,可以用数组名a来代表数组元来代表数组元 素素a00的的地址。数组名是常量,不可对它赋值。地址。数组名是常量,不可对它赋值。共 49 页 第 2323 页6.3.3 二维数组的初始化二维数组的初始化数组定义时初始化采用方法如下:数组定义时初始化采用方法如下:(1)分行给二维数组赋初值。分行给二维数组赋初值。如:int a23= 2,3,1,1,2,3;将所有数据写在一个将所有数据写在一个 内,按顺序赋值内,按顺序赋值 即按数组元素在内存中排列的顺序赋初值。即按数组元素在内存中排列的顺序赋初值。 int a23
21、=2,3,1,1,2,3;共 49 页 第 2424 页(3)可以对部分元素赋值。可以对部分元素赋值。如: int a33=1,0,1,0,0,1;相当矩阵:100010001100000001如果对全部元素赋初值,第一维元素可省,但第二维元素不如果对全部元素赋初值,第一维元素可省,但第二维元素不可省。可省。 如:a34=0,1,3,1,2,1,0,2,1,1,2,0; 可写成 a 4=0,1,3,1,2,1,0,2,1,1,2,0; int a33=1, ,0,0,1;相当矩阵:int a23=5,6,7,8;int a23=5,6,7,8;例得到的数组为: 5 6 0 7 8 0得到的数组
22、为: 5 6 7 8 0 0共 49 页 第 2525 页6.3.4 二维数组程序举例二维数组程序举例例例1 将一个矩阵将一个矩阵a 23转置存到另一个矩阵转置存到另一个矩阵b 32中。中。 635241654321ba,分析:用数组分析:用数组a、b分别代表矩阵分别代表矩阵a、b; a 矩阵的矩阵的行数行数必须要等于必须要等于b 矩阵的矩阵的列数列数。 执行:执行:bji=aij; 即可完成转换。即可完成转换。 涉及到两个下标的,一般用涉及到两个下标的,一般用两重两重循环。循环。 求矩阵转置问题也可以在矩阵本身进行,但应求矩阵转置问题也可以在矩阵本身进行,但应是方阵。是方阵。共 49 页 第
23、 2626 页main( ) int a23=1,2,3,4,5,6; int b32, i , j; printf(“array a: n”); for( i=0; i2; i+) for( j=0; j3; j+) printf(“%5d”, aij); bji=aij; printf(“n”); printf(“array b: n”); for(i=0; i3; i+) for( j=0; j2; j+) printf(“%5d”,bij); printf(“n”); 共 49 页 第 2727 页运行结果如下:运行结果如下: array a: 1 2 3 4 5 6 array b:
24、 1 4 2 5 3 6 共 49 页 第 2828 页程序:main( )int i, j, row=0, colum=0, max; int a34=1,2,3,4,9,7,4,6,-1,2,0,8; max=a00; for( i=0; i=2; i+) for(j=0; jmax) max=aij; row=i; colum=j; printf(“%max=%d,row=%d,colum=%dn”,max, row,colum);运行结果为: max=9,row=1, colum=0例例2 求求34矩阵中最大元素的值及其矩阵中最大元素的值及其所在行和列号。所在行和列号。80216479
25、4321a共 49 页 第 2929 页程序:程序:运行结果为: sum=?例例3 求求34矩阵矩阵a中所有外围元素之和。中所有外围元素之和。802164794321a程序演示共 49 页 第 3030 页例例4 编写求一个整型矩阵编写求一个整型矩阵A3*3的副对角线元素之和的副对角线元素之和程序。程序。程序演示共 49 页 第 3131 页改错练习改错练习:将一个数组的值按逆序重新存放。如原顺序为:3,9,5,7,6。要求改为6,7,5,9,3。define N 5main( )int aN=3,9,5,7,6,i,t; for(i=0;iN;i+); printf(“%4d”,ai); f
26、or(i=0;iN/2;i+) t=ai; ai=aN-i-1; printf(“/n”); for(i=0;iN;i+) printf(“%4d”,ai);共 49 页 第 3232 页6.4 6.4 字字 符符 数数 组组6.4.1 6.4.1 字符数组的定义字符数组的定义 当数组的元素类型为字符型时,被称为当数组的元素类型为字符型时,被称为字符数组字符数组。如: 字符数组的定义、初始化和元素的引用与一般字符数组的定义、初始化和元素的引用与一般的数组相同。的数组相同。char c10; 则c为字符数组。例:main() char ch5=c, h , i , n , a; for(i=0;
27、 i5; i+) printf(“%c”,chi); 共 49 页 第 3333 页6.4.2 6.4.2 字符数组的初始化字符数组的初始化字符数组的初始化与数值型数组的初始化类似字符数组的初始化与数值型数组的初始化类似. .如如: char : char c7=p,r,o,g,r,a,c7=p,r,o,g,r,a,m;m; c0 c1 c2 c3 c4 c5 c6 c0 c1 c2 c3 c4 c5 c6 p r o g r a m注意:大括号提供的初值大括号提供的初值不能超过不能超过字符数组的长度,字符数组的长度, 可以小于字符数组的长度,最后为空字串可以小于字符数组的长度,最后为空字串0
28、。如: char c6=g,r,e,e,n;内存分配为:内存分配为: c0 c1 c2 c3 c4 c5 g r e e n 0 或或char c20=“I am a boy”; 或或 char c = “I am a boy”;共 49 页 第 3434 页6.4.3 字符数组的引用字符数组的引用例例1 输出一个字符串。程序:main( ) char c10= I, ,a,m, ,a, ,b,o,y; int i; for( i=0; i10; i+) printf(“%c”, ci); printf(“n”); 运行结果: I am a boy共 49 页 第 3535 页例例2 输出一个
29、钻石图形。main( ) char diamond 5= , , *, , *, , *, *, , , , *, , *, , *, , , *; int i, j; for( i=0; i5; i+) for( j=0; j5; j+) printf(“%c”, diamondij); printf(“n”); 共 49 页 第 3636 页 字符串常量字符串常量是用双引号括起来的一串字符,由系是用双引号括起来的一串字符,由系统自动加上一个字符串结束标志统自动加上一个字符串结束标志0,0,它占内存,它占内存,但不记入字符串长度。但不记入字符串长度。如:“china” 占内存6个字节,字符串
30、长度是5. 在在C语言中用字符数组来处理字符串,每个语言中用字符数组来处理字符串,每个元素存放一个字符型数据。元素存放一个字符型数据。 字符型数组可用一般数组的初始化方式初始化字符型数组可用一般数组的初始化方式初始化外,还可以使用字符串常量初始化:外,还可以使用字符串常量初始化:如:char message=“Hello”; 或 char message=“Hello”; (这时,字符数组长度是(这时,字符数组长度是6 6,字符串长度是,字符串长度是5 5。)。)共 49 页 第 3737 页注意注意:它与一般初始化方式:它与一般初始化方式: char message=H, e, l, l,
31、o; 初始化的结果是不同的。初始化的结果是不同的。 H e l l o 0 用一般初始化方式结果: H e l l o用字符串常量初始化 :说明:说明:字符数组本身并不要求它的最后一个元素一定字符数组本身并不要求它的最后一个元素一定是是00,例如:,例如:char ch2=A, Bchar ch2=A, B;是;是合法的。当定义字符数组用字符串常量赋初值时,最合法的。当定义字符数组用字符串常量赋初值时,最后有一个元素其值为后有一个元素其值为00。为了使处理方法一致,。为了使处理方法一致,在字符数组中也常常人为地加上一个值为在字符数组中也常常人为地加上一个值为00的元的元素。素。如:char m
32、essage=H, e, l, l, o, 0;共 49 页 第 3838 页6.4.5 字符数组(字符串)的输入输出字符数组(字符串)的输入输出 在学习在学习printf函数和函数和scanf函数时,已学过两种方法:函数时,已学过两种方法: c 表示一次输出表示一次输出 一个字符,一个字符, s 表示一次输出表示一次输出 一个字符串。一个字符串。 注意:输出字符不包括注意:输出字符不包括0。用用S格式输出时,格式输出时,输出项为输出项为数组名数组名不能为数组元素不能为数组元素。 如:如: printf(“%s”, c); c c是数组名是数组名数组长度大于字符串长度,遇到数组长度大于字符串长
33、度,遇到“0”结束;结束; 如:如: char c5=“red”; 输出:输出:red (后边两个后边两个“0”不输出)不输出)数组输入时,不加地址符数组输入时,不加地址符“&”; 如:如:scanf(“%s”, c); ( 因为数组名代表因为数组名代表数组的起始地数组的起始地址址。)。)共 49 页 第 3939 页 puts 输出字符串输出字符串gets 输入字符串输入字符串 (使用时注意前边加使用时注意前边加: #include ) strcat 字符串连接字符串连接strcpy 字符串复制字符串复制strcmp 字符串比较字符串比较strlen 字符串长度字符串长度strlwr 将字符
34、串中的大写字符转换为小写字符将字符串中的大写字符转换为小写字符strupr 将字符串中的小写字符转换为大写字符将字符串中的小写字符转换为大写字符(使用时注意前边加使用时注意前边加: #include )共 49 页 第 4040 页C函数库中提供一些用来处理字符串的函数,下面介函数库中提供一些用来处理字符串的函数,下面介绍常用的几种:绍常用的几种:(1) puts(puts(字符数组字符数组) ) 将一个字符串输出到终端。将一个字符串输出到终端。 若若 str字符数组为字符数组为“book”, 则则 puts(str); 的输出为:的输出为: book - printf(“%s”,str);
35、(2) gets(字符数组字符数组) 输入一个字符串到字符数组,该输入一个字符串到字符数组,该字符数组的起始地址为该函数值。字符数组的起始地址为该函数值。char str30; gets(str); - scanf(“%s”,str);输入:输入:This is a c program.字符串处理函数字符串处理函数共 49 页 第 4141 页(3)strcat(字符数组字符数组1,字符数组,字符数组2) 连接两个字符串,连接两个字符串,把字符数组把字符数组2连到字符数组连到字符数组1上,该数值为字符数组上,该数值为字符数组1的地址。的地址。 如:如: char str1 = “C langu
36、age ”; char str2 = “program”; printf(“%s”, strcat( str1, str2); 输出:输出: C language program(4) strcpy(字符数组字符数组1,字符数组,字符数组2) 将字符数组将字符数组2拷贝到字符数组拷贝到字符数组1中去。中去。 如:如:static char str110, str2 = “red flag”; strcpy(str1,str2); 不能用赋值形式不能用赋值形式 str1=str2共 49 页 第 4242 页(5) strcmp(字符串字符串1,字符串,字符串2) 两个串的比较;两个串的比较;2
37、121210)2, 1(strstrstrstrstrstrstrstrstrcmp负整数正整数 注意:注意:不能用不能用if(str1= = str2)形式进行比较,可以形式进行比较,可以用用if( strcmp(str1,str2) = = 0)形式。形式。 确定字符确定字符串大小的基本规则:串大小的基本规则: 按照串中对应位置字符的按照串中对应位置字符的ASCII码值的大小确定大小。码值的大小确定大小。 例如:例如:”abc” ”b” 因为字符因为字符 a ”abadef” 因为字符因为字符 c a 共 49 页 第 4343 页(6) strlen(字符数组字符数组) 测试字符数组的长
38、度测试字符数组的长度(不包括不包括“0”); 如:如:static char str10= “yellow”; printf(“%d”, strlen(str); 结果:结果: (7) strlwr(字符串字符串) 将大写字符串变小写字符串。将大写字符串变小写字符串。(8) strupr(字符串字符串) 将小写字符串变大写字符串。将小写字符串变大写字符串。共 49 页 第 4444 页 题目:从键盘输入一个字符串,并复制到另一个题目:从键盘输入一个字符串,并复制到另一个字符数组后显示出来。字符数组后显示出来。 分析:分析: 数据结构:数据结构: 字符串的存储需要用字符数组字符串的存储需要用字符
39、数组 算法要点:算法要点: 字符串输入,用字符串输入,用scanf()函数函数 字符串复制方法:将第一个字符串字符逐个字符串复制方法:将第一个字符串字符逐个添加到数组添加到数组str2数组中。去掉第一个串的结数组中。去掉第一个串的结束符束符0,添加第二个数组的结束符,添加第二个数组的结束符0。共 49 页 第 4545 页#include “stdio.h”main() char str120,str220; int i=0; printf(“Input a string:”); scanf(“%s”,str1); while(str1i!=0”) str2i=str1i; i+; str2i
40、=“0”; printf(“%s”,str2);程序运行演示程序运行演示共 49 页 第 4646 页 题目:从键盘输入若干行文本,每行以回车结束题目:从键盘输入若干行文本,每行以回车结束,以,以 ctrl+z 作为输入结束符,统计其行数。作为输入结束符,统计其行数。 分析:分析: 数据结构:数据结构: 由于只统计行数,所以不必使用数组存储文由于只统计行数,所以不必使用数组存储文本内容,只须定义一个字符变量暂存读入的本内容,只须定义一个字符变量暂存读入的字符。字符。 算法要点:算法要点: 读入字符可以用读入字符可以用 getchar() 函数。函数。 每读入一个字符,要判断是否输入结束每读入一
41、个字符,要判断是否输入结束 判断读入的是否回车符,定义一个整型变量判断读入的是否回车符,定义一个整型变量回车符进行计数,以实现统计行数的功能。回车符进行计数,以实现统计行数的功能。共 49 页 第 4747 页#includemain() int c,nl; nl=0; while(c=getchar()!=EOF) if(c=n) +nl; printf(%dn,nl);程序运行演示程序运行演示共 49 页 第 4848 页 题目:题目:接受键盘输入的两个字符串,并将其首尾相接后输接受键盘输入的两个字符串,并将其首尾相接后输出。出。 分析:分析:数据结构:数据结构:字符串的存储需要用字符数组
42、字符串的存储需要用字符数组算法要点:算法要点:字符串输入用字符串输入用scanfscanf()()函数函数字符串拼接方法:先找到第一个字符串的末尾,字符串拼接方法:先找到第一个字符串的末尾,然后将第二个串的字符逐个添加到末尾。注意,然后将第二个串的字符逐个添加到末尾。注意,要去掉第一个串的结束符要去掉第一个串的结束符00,添加添加第二个串的第二个串的结束符结束符00。共 49 页 第 4949 页main() char str150,str220; int i,j; printf(Enter string No.1:n); scanf(%s,str1); printf(Enter string
43、 No.2:n); scanf(%s,str2); i=j=0; while(str1i!=0) i+; while(str1i+=str2j+)!=0) ; printf(string No.1-%sn,str1);程序运行演示程序运行演示共 49 页 第 5050 页本章注意问题本章注意问题1. C1. C语言中数组的下标从语言中数组的下标从0 0开始;开始;2. 2. C C语言不进行下标的越界检查语言不进行下标的越界检查;3 3. . 数组名是地址;数组名是地址;4. 4. 字符数组在定义时必须考虑到串结束符的位置;字符数组在定义时必须考虑到串结束符的位置;5. 5. 注意区别数组与简单变量初始化的方法,特别是字注意区别数组与简单变量初始化的方法,特别是字符数组的初始化方法;符数组的初始化方法;6.6.掌握运用字符串的操作函数。掌握运用字符串的操作函数。