版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、复习:条件判断表达式,逻辑表达式,分支,循环,1、打星星,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=i;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5-i;j+) printf( ); for(j=1;j=i;j+) printf(*);
2、 printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5-i;j+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=1;i-) for(j=1;j=5-i;j+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n); ,2、循环中套用if判断 #include void main() int i; for(i=10;i=
3、1000;i+) if(i%17=0 ,处理输入数据 例如输入20个数,输出最大值,处理循环变量 输出10到1000之间,能被17整除, 十位数为5的整数。,关于循环套用if语句的方法,一定要熟练 例如: 本题; 最大最小值; 求和求阶乘求平均; 输出奇数(偶数); 素数; 字符处理; ,第六章,利用数组处理批量数据,问题:给一组数排序,这组 数该 如何存放呢,? 这些数据如何存放才便于排序,1,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,本章要点,掌握一维、二维数组的定义和引用方法、存储结构和初始
4、化方法。 掌握有关一维数组的有关算法。 掌握数组的运算。,主要内容,6.1 为什么要用数组 6.2 定义和引用一维数组 6.3 二维数组的定义和引用 6.4 字符数组 6.5 提高部分,6.1 为什么要用数组,C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。,一个班学生的学习成绩 一行文字 一个矩阵 这些数据的特点是: 1、具有相同的数据类型 2、使用过程中需要保留原始数据,1.一维数组的定义格式为: 类型说明符 数组名常量表达式; 例如: int a10; 它表示定义了一个整形数组,数组名为a,此数组有10个元素。,6.2 定义和引用一维数组
5、 6.2.1 定义一维数组,说明: 1.数组名定名规则和变量名相同,遵循标识符定名规则。,标识符 由程序员定义的命名符,语法:以字母或下划线开始,由字母、数字和下划线组成的符号串,注意:,break int 等 不能用于命名程序中的自定义 函数、变量、常量,(1) 不能使用关键字作用户标识符;,(2) C语言中,字母大小写敏感;,(3) C语言没有规定标识符的长度,不同编译系统有不同的识别长度;,(4) 标识符尽可能做到见文知义。,Aa 和 aa 是两个不同的标识符,1.2.2 词汇,main printf等 已经用过的变量名或函数名也不能用于命名程序中的自定义 函数、变量、常量,语法:以字母
6、或下划线开始,由字母、数字和下划线组成的符号串,判断以下标识符的正确性:,合法标识符有:a x1 no_1 _a2c sum Name name 不合法标识符有:2a x+y a,b a int b10+10; scanf(%d, ,数组说明中其他常见的错误: float a0;/* 数组大小为0没有意义 */ int b(2) ; /* 不能使用圆括号 */ int k, ak; /* 不能用变量说明数组大小*/,#include void main() int n=20; /scanf(“%d”, ,注意: 定义数组时用到的数组名常量表达式 和引用数组元素时用到的数组名下标 是有区别的。
7、例如 int a10; 中只能是整型常量(不可含变量) t=a6; 中是值为整型表达式(可含变量) 大小为n的数组,下标范围:0(n-1),6.2 一维数组的定义和引用6.2.2 引用一维数组元素,1.数组元素的引用方式: 数组名下标 下标可以是整型表达式。 例如: a0=a5+a7-a2*3,#include void main() int a3+3; int b=2; /int cb; scanf(%d, ,#include void main() int a5; scanf(%d, ,错误,2.一维数组元素引用的程序实例,例题 6.1,引用数组元素。利用循环给数组元素a0a9赋值为09,
8、然后按逆序输出各元素的值,解题思路,用0到9的循环给数组元素a0 a9赋值09,然后用9到0的循环按a9到a0的顺序输出各元素的值。,2.一维数组元素引用的程序实例,运行结果如下: 9 8 7 6 5 4 3 2 1 0,编写程序,#include void main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); ,对数组元素初始化的实现方法:,1.在定义数组时对数组元素赋以初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9; 将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后,a0=0,a
9、1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。,6.2 一维数组的定义和引用 6.2.3 一维数组的初始化,3. 如果想使一个数组中全部元素值为0,可以写成: int a10=0,0,0,0,0,0,0,0,0,0; 或 int a10=0;,2. 可以只给一部分元素赋值。 例如: int a10=0,1,2,3,4; 定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。,#include void main() int i,a10; for(i=9;i=0; i-) printf(%d ,ai); pri
10、ntf(n); ,#include void main() int i,a10=0; for(i=9;i=0; i-) printf(%d ,ai); printf(n); ,4. 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。 例如:int a5=1,2,3,4,5; 也可以写成 int a=1,2,3,4,5; int a10=1,2,3,4,5; 只初始化前5个元素,后5个元素为0。,Fibonacci数列公式:已知: a1=a2=1,an=an-1+an-2 即:1,1,2,3,5,8,13 建立一个数组,将数列中第1个数放在数组第1个的元素中,数列第2个数
11、放在数组第2个的元素中,。,6.2 一维数组的定义和引用 6.2.4 一维数组程序举例,例题 6.2,用数组来处理求Fibonacci数列问题。,解题思路,#include void 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); printf(n); ,if(i%5=0 int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) printf(%12d,fi);
12、if(i+1)%5=0) printf(n); ,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) printf(%12d,fi); if(i%5=4) printf(n); ,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=1;i=20;i+) printf(%12d,fi-1); if(i%5=0) printf(n); ,程序没有定式 要通过思考形成 解决问题的
13、逻辑 用特定语句实现它 如果程序有错误时 思考找出逻辑缺陷 在什么位置,例题 6.3,假如有n个人,各人年龄不同,希望按年龄将他们从小到大排列。,解题思路,这种问题称为数的排序(sort)。排序的原则有两 类,一类是升序,从小到大;一类是降序,从大到小。我们可以把这个题目抽象为一般形式: 对n个数按升序排列 对一组数据进行排序的方法很多,本例介绍用起泡法排序。起泡法的思路如下,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;ia1) t=a0; a0=a1; a1=t; printf(
14、the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,#include void main() int a10; int i,j,t; printf(
15、input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,for(j=1;j=9;j+) 可以吗?,for(i=1;i=9;i+) 可以吗?,经过第一趟后,最大的数9已沉底 。然后进行对余下的前面5个数第二趟比较,共5次比较与交换即可。,比较相邻的两个数,如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第2趟比较中要进行n-2次两两比较,在第j趟比较中要进
16、行n-j次两两比较。,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,趟,次,关于冒泡排序的讨论:,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai
17、; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,for(j=1;j=9;j+) 可以吗?,for(i=1;i=9;i+) 可以吗?,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%
18、d ,ai); printf(n); ,提高了效率,#include void main() int a10; int i,j,t; int work; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; work=1; if(!work) break; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,提高了效率,#include void main() int a10; int i,j,t,work,coun
19、t=0; printf(input 10 numbers :n); for (i=0;iai+1) t=ai;ai=ai+1;ai+1=t; work=1; if(!work) break; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n);printf(%dn,count); ,数组:一种数据类型,可以按顺序存放同类型的多个数据。 例:在一维数组中存放有某班同学的成绩。提示用户输入一个成绩,程序判断此成绩在数组中的情况,如果有则输出其序号,如果没有则输出No such grade!,#includ
20、e void main() int i,a,flag=0; int s10=60,60,70,80,80,50,50,60,70,70; printf(please input a grade for search:); scanf(%d, ,输入公元后的某一个日期(年月日), 输出该日期是那一年的第几天。 注意,对于年份值,要求大于0, 否则提示用户重新输入; 对于月份值,要求在1到12之间, 否则提示用户重新输入; 对于日期值输入有误的, 提示用户重新输入。,算法: int a12=31,28,31,30,31,30,31,31,30,31,30,31; do 输入年份 while(不合法
21、年份); do 输入月份 while(不合法月份); if(闰年) a1=29; do 输入日期 while(不合法日期); sum=日期; for(i=0;i=月份-2;i+) sum=sum+ai;,#include void main() int a12=31,28,31,30,31,30,31,31,30,31,30,31; int y,m,d,i,sum; do printf(请输入年份:); scanf(%d, ,如何调试程序? Insert breakpoint Go Step (右键 调试 debug) Auto Watch,#include void main() int i
22、,sum; for(i=0;i5;i+); sum=+i; printf(第%d天。n,sum); ,#include void main() int a12=31,28,31,30,31,30,31,31,30,31,30,31; int y,m,d,i,sum; do printf(请输入年份:); scanf(%d, ,练习: 1、数组中存有10个分数,去掉一个最高分,去掉一个最低分,算出最后得分,并输出。 (10分制,有小数),练习: 2、数组中存有20个分数,去掉2个最高分,去掉2个最低分,算出最后得分,并输出。 (10分制,有小数),今天作业: 2.1 2.2 2.3 3.3 3.
23、4,6.3 二维数组的定义和引用 6.3.1 定义二维数组,二维数组定义的一般形式为 类型说明符 数组名常量表达式常量表达式; 例如:定义a为34(3行4列)的数组,b为510(5行10列)的数组。如下: float a34,b510;,不能写成 float a3,4,b5,10;,C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,再存放第二行的元素。下图表示对a34数组存放的顺序。 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,6.3 二维数组的定义和引用 6.3.1 定义二维数组,二维数组元素的表示形式为:
24、数组名下标下标 例如: a23 下标可以是表达式,可以有变量,如 ai-12*j-1,数组元素可以出现在表达式中,也可以被赋值 例如:b12=a23/2,6.3 二维数组的定义和引用6.3.2 引用二维数组的元素,常出现的错误有: int a34; /* 定义a为34的数组 */ a34=3;,在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。,6.3 二维数组的定义和引用6.3.2 引用二维数组的元素,每一维下标范围:0(n-1),可以用下面4种方法对二维数组初始化:,.分行给二维数组赋初值。 例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,.可以
25、将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,6.3 二维数组的定义和引用 6.3.3 二维数组的初始化,.可以对部分元素赋初值。 例如: int a34=1,5,9;,1 0 0 0 5 0 0 0 9 0 0 0,也可对某些行中的某些元素赋初值,如 int a34=1,0,6,0,0,11;,1 0 0 0 0 6 0 0 0 0 11 0,1 0 0 0 5 6 0 0 0 0 0 0,也可以只对某几行元素赋初值。如: int a34=1,5,6;,.如果对全部元素都赋初值,则定义数组时对第一维
26、的长度可以不指定,但第二维的长度不能省。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等价于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;,在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。 例如:int a4=0,0,3,0,10;,0 0 3 0 0 0 0 0 0 10 0 0,算法和程序都是围绕着变量(内存)内容进行处理的!不同类型的变量有不同的特点,可解决不同的问题。例如:二维数组也是一种类型。 如何将二维数组各元素赋值为我们需要的内容?赋初值或使用循环赋值; 例如:都赋值为100;提示用户逐个输入;赋值为一
27、系列有规律的数据(元素的内存序号等) 如何读取二维数组中的数据并处理? 例如:输出其中的素数 如何按照二维的形式输出二维数组的数据?,如何设计算法并实现算法,#include void main() int i,j,k; int s34=0; for (i=0;i3;i+) for (j=0;j4;j+) sij=100; for (i=0;i3;i+) for (j=0;j4;j+) printf(Please input a number:); scanf(%d, ,#include void main() int i,j; int s22; for (i=0;i2;i+) for (j=
28、0;j2;j+) printf(%d ,sij); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;j+) printf(%d ,sij); printf(n); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;j+) printf(%d ,sij); printf(n); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;
29、j+) printf(%d ,sij); printf(n); ,6.3 二维数组的定义和引用 6.3.4 二维数组程序举例,例题 6.4,将一个二维数组a的行和列的元素互换(即行列转置),存到另一个二维数组b中。,解题思路,将a数组中第i行j列元素赋给b数组中j行i列元素,例如a00赋给b00,a01 赋给b10,a02赋给b20,。可以用双层循环来处理,用外循环控制行的变化,内循环控制列的变化。,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=
30、0;j=2;j+) printf(%5d,aij); printf(n); printf(array b:n); for (i=0; ;i+) for(j=0; ;j+) printf(%5d,bij); printf(n); ,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=0;j=2;j+) printf(%5d,aij); bji=aij; printf(n); printf(array b:n); for (i=0;i=2;i+) for(
31、j=0;j=1;j+) printf(%5d,bij); printf(n); ,如果把第7行: for (i=0;i=1;i+) 改为: for (i=0;i=2;i+) b会输出什么?,printf(%5d,aij); printf(%5d,bij); 分别被执行多少遍? 两处 printf(n); 语句 分别被执行多少遍? printf(array a:n); printf(array b:n); 被执行多少遍?,例题 6.5,有一个班30个学生,己知每个学生有5门课的成绩,要求输出平均成绩最高的学生的成绩以及该学生的序号。,解题思路,对本题而言,宜用二维数组,用一行中的各元素存放一个学
32、生的成绩,即行代表学生,列代表一门课的成绩。要存放30个学生5门课的成绩,要用一个30*5的二维数组。另外,由于要比较各人的平均成绩,因此,对每个学生来说,应该存放6个数据,每人平均成绩要计算出来,并存放在数组中。这样,数组的大小就应该是30*6。 设计算法: (1)求每人平均成绩,放在数组每一行的最后一列中; (2)找出最高的平均分,和该学生的序号; (3)输出最高的平均分,和该学生的序号。,#include void main() int i,j,max_i; float sum,max=-1; float s66=70,80,90,70,90,90,90,100,95,100,60,70
33、,80,90,100, 60,60,70,80,80,50,50,60,70,70,40,50,60,70,80; for (i=0;imax) max=si5; printf(stu_order=%dnmax=%7.2fn,max_i,max); ,#include void main() int i,j,max_i; float sum,max=-1; float s66=70,80,90,70,90,90,90,100,95,100,60,70,80,90,100, 60,60,70,80,80,50,50,60,70,70,40,50,60,70,80; for (i=0;imax)
34、max=si5; max_i=i; printf(stu_order=%dnmax=%7.2fn,max_i,max); ,1、在对数组初始化时,只对各行的前5列赋初值,第6列默认为0。 2、注意第一个for语句的范围。请思考能否不要sum=0;这一行?或者把这一句改放到第一个for语句的前面? 3、第三个for语句内嵌了一个if语句,用来将5个学生的平均分逐个与max比较,如果符合条件,则同时记录它的值以及它的序号,如果可以是负分,这道题怎么改?,#include void main() int i,j,k; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b
35、12; for (i=0,k=0;i3;i+) for (j=0;j4; j+,k+) bk=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,#include void main() int i,j; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0;i3;i+) for (j=0;j4;j+) bi*4+j=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,把二维数组中的元素按照内存中存放的顺序导入到一维数组中:,#include voi
36、d main() int i,j,k; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0,k=0;i3;i+) for (j=0;j4; j+,k+) bk=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,#include void main() int i,j; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0;i3;i+) for (j=0;j4;j+) bi*4+j=aij; for(i=0;i12;i+) printf(%
37、d ,bi); printf(n); ,把二维数组中的元素按照内存中存放的顺序导入到一维数组中:,i是从0到2变化的 j是从0到3变化的 k是从0到11变化的 i*4+j也是从0到11变化的 其中的j是变化了3遍,6.4 字符数组6.4.1 定义字符数组及对其初始化,定义方法与其它类型数组类似。例如: char c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h;c6=a; c7=p;c8=p;c9=y;,用字符型变量 char c; 直接表示字符串 怎么样?,对字符数组初始化,可逐个字符赋初值。 例如: char c10=I, ,a, m, ,h, a, p, p, y;
38、,6.4 字符数组6.4.1 定义字符数组及对其初始化,如果初值个数小于数组长度,则只将这些字符赋给数 组中前面那些元素,其余的元素自动定为空字符。,0代表空字符,ASCII码值为0; 这与int型数组初值不足时使用0进行初始化是一致的。,如果提供的初值个数与预定的数组长度相同,在定义 时可以省略数组长度,系统会自动根据初值个数确定 数组长度。,char c=I, ,a,m, ,h, a,p,p,y;数组c的长度自动定为10。,char d55= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*,定义和初始化一个二维字符数组,6.4 字符数组6.4.2 引用字符数组,
39、例题 6.6,输出一个菱形图,解题思路,先画出准备输出的菱形字符图案,它应当是5行5列,然后逐个写出其中的字符。,#include void main() char diamond5= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(%c,diamondij); printf(n); ,6.4 字符数组6.4.3字符串和字符串结束标志,为了测定字符串的实际长度,C语言规定了一个字符串结束标志0,作为字符数组并不要求它的最后一个字符为0 例如: char c5=C,h,i,
40、n,a;,6.4 字符数组6.4.4 字符数组的输入输出,字符数组的输入输出可以有两种方法: 逐个字符输入输出。用格式符%c输入或输出一个字符。 将整个字符串一次输入或输出。用%s格式符,意思是对字符串的输入输出。,#include void main() char a6=h,e,l,l,o,0; int i; for (i=0;i5;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,#include void main() char a5=h,e,l,l,o; int i; for (i=0;i5;i+) printf(%c,ai
41、); printf(n); printf(%s,a); printf(n); ,#include void main() char a10=h,e,l,l,o; int i; for (i=0;i5;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,作为字符数组,并不要求一定要有结束标志0 如果没有0,使用循环逐个字符输出(%c)是没问题的;但是,使用%s作为字符串整体输出,则会有错误,因为系统不知道该字符串到哪里结束,字符串的长度并不总是等于数组的大小,#include void main() char a10; int i; f
42、or (i=0;i5;i+) scanf(%c, ,输入abcde 字符串长度为5 数组大小为10,#include void main() char a10; int i; for (i=0;i5;i+) scanf(%c, ,输入abcde 字符串长度为5 数组大小为10,#include void main() char a10=0; int i; for (i=0;i5;i+) scanf(%c, ,输入abcde 字符串长度为5 数组大小为10,系统对字符串常量自动加一个 0 例如: #include void main() printf(%sn,abcde); ,在内存中数组c的状
43、态,#include void main() char a=a,a,a; printf(%s,a); printf(n); ,#include void main() char a=aaa; printf(%s,a); printf(n); ,数组大小分别是多少?,#include void main() char a10=aaa; printf(%s,a); printf(n); ,#include void main() char a10=a,a,a; printf(%s,a); printf(n); ,数组大小分别是多少?,#include void main() char a10; a
44、=aaa; printf(%s,a); printf(n); ,#include void main() char a10; a=a,a,a; printf(%s,a); printf(n); ,#include void main() char a10; a=aaa; printf(%s,a); printf(n); ,#include void main() char a10; a=a,a,a; printf(%s,a); printf(n); ,都不对!仅限初始化时可以! 其他时候必须单个元素逐一赋值!,关于%s的说明: 1. 输出字符不包括结束符 0(见0 就停止,不输出0 ) 2.用
45、%s格式符输出字符串时,printf函数中的输出项是字符数组名(a),而不是数组元素名(ai) 3.如果数组长度大于字符串实际长度,也只输出到遇0结束 4.如果一个字符数组中包含一个以上0 ,则遇第一个0时输出就结束 5.可以用scanf函数以%s的方式输入一个字符串,输入的字符串带有0。例如输入 abc ,数组中得到的是 a b c 0,#include void main() char a10; int i; scanf(%s,a); for (i=0;i10;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,输入abc 输出结
46、果是什么 为什么,这种情况下,不知道循环需要多少次,可以判断到达0时结束 for (i=0;ai!=0;i+) 或 for (i=0;ai;i+),scanf函数读取字符串,到空格就停止;如果利用一个scanf输入多个字符串,则在输入时以空格分隔即可 例如: #include void main() char str15,str25,str35; scanf(%s%s%s,str1,str2,str3); printf(%s %s %s,str1,str2,str3); printf(n); 输入数据: How are you?,#include void main() char str120
47、; scanf(%s,str1); printf(%s,str1); printf(n); 输入 how are you? 得到什么结果,分析图中所示的字符数组 用8进制形式输出数组c的起始地址 printf(%o,c); printf(%s,c);,6. scanf函数中以%s输入字符串时直接用数组名,不再加地址符 printf(%on,c); printf(%sn,c); /printf(%on, /地址相差1;如果是int数组则相差4,系统对字符串常量自动加一个0 为了使处理方法一致,在字符数组中也常常人为地加上一个0 例如: char c6=C,h,i,n,a,0;,6.4 字符数组,
48、字符数组也是数组,输出时本应使用循环,逐个元素输出(%c);但是字符和其它数据不一样,常常是一串字符代表一个内容,所以引入了字符串统一输出(%s),作为不同于其它数组的特殊处理方式,前提是有0作为结束标志,因为数组大小常常大于字符串真实长度。(例如:定义人名时可以定义为大小为30的字符数组),例如: 定义了如下的字符数组 char c=Pascal program; 现在想用一个新的字符串代替原有的字符串,从键盘向字符数组输入Hello 如果不加0的话,字符数组中的字符如下 Hellol program,如何输入Hello?,单个元素分别读入,#include void main() char
49、 a=Pascal program; int i; for (i=0;i5;i+) scanf(%c, ,#include void main() char a=Pascal program; int i; for (i=0;i5;i+) scanf(%c, ,#include void main() char a=Pascal program; int i; scanf(%s,a); printf(%s,a); printf(n); ,三个程序哪个更好? 为什么? 如果输入的字符数不确定,则,在程序中往往需要对字符串作某些操作处理,如字符串的相互赋值、字符串的连接、字符串的比较等 如: ch
50、ar a6=,b6=; a=b; if(a=b) if(a=b) a=a+b; 可以吗?,6.4 字符数组 6.4.5字符串处理函数,几乎都需要使用循环来解决,如何完成?,对于数组只能操作其元素, 不能进行整体的操作! 直接写数组名代表地址操作!,int 型数组也不能这样做,由于字符串操作十分常用,为了免去每次使用都写循环操作的麻烦,在C函数库中已经提供了一些字符串处理函数,实现以上功能,使用十分方便。 下表列出几种常用的函数:,6.4 字符数组 6.4.5字符串处理函数,string.h,除了前两个之外,全部在 string.h 里面,#include void main() char a2
51、0=China; char b20=China; gets(a); puts(a); scanf(%s,b); printf(%s,b); printf(n); ,gets可接受空格 scanf到空格就结束,#include void main() char a20=Chinanaaaaa; puts(a); /printf(%s,a); ,puts()输出时,自动将字符串结束标志0转换成n , 即输出完字符串后自动换行,#include void main() char a20=Chinanaaaaa; puts(gets(a); gets函数有返回值,返回值就是数组a的地址,所以可以连续进
52、行puts gets得到的字符串也是带结束标志的(0),string.h,除了前两个之外,全部在 string.h 里面,#include #include void main() char a20=China; char b20=China; strcat(a,b); printf(%sn,a); printf(%sn,b); ,strcat的作用是把字符串2接到字符串1的后面,结果放在字符串1中,函数调用后得到一个函数值字符数组1的地址 例如: char str130=Peoples Republic of ; char str2=China; print(%s,strcat(str1,s
53、tr2); 输出: Peoples Republic of China,a=a+b是不行的,string.h,除了前两个之外,全部在 string.h 里面,#include #include void main() char a20=aaaaaaaaaaaaa; char b20=China; strcpy(a,b); printf(%sn,a); printf(%sn,b); ,关于strcpy函数的几点说明,1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。,2.字符数组1必须写成数组名形式(如str1),字符串2可以是字符数组名,也可以是一
54、个字符串常量,如strcpy(str1,China);,3.复制时连同字符串后面的0一起复制到字符数组1中,4.不能用赋值语句将一个字符串直接给一个字符数组。 如下面两行都是不合法的: str1=China; str1=str2; 只能用strcpy函数将一个字符串复制到另一个字符数组中。 用赋值语句只能将一个字符赋给一个字符型变量或字符数 组元素。如下面是合法的: char a5,c1,c2; c1=A; c2=B; a0=C; a1=h; a2=i; a3=n; a4=a;,string.h,除了前两个之外,全部在 string.h 里面,如果不使用strcpy函数,如何实现字符串复制,#
55、include void main() char a20=China; char b20; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函数,如何实现字符串复制,#include void main() char a20=China; char b20; int i; for(i=0; ;i+) bi=ai; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函数,如何实现字符串复制,#include void main() char a20=China; char b20; int i; for(i=0;ai!=0;i+) bi=ai; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函数,如何实现字符串复制,#include void main() char a20=China; char b20; int i; for(i=0;ai!=0;i+) bi=ai; bi=ai; printf(%sn,a); printf(%sn,b); ,#include #include void main() char a20=China; char b20=China; char c20=aaz;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临沂市电商运营行业劳动合同样本
- 代表协议样本
- 交通行业社保劳动合同样本
- 企业流动资金贷款协议书
- 人工智能产品物流中介合同样本
- 传媒劳动合同样板
- 互联网公司水电检修合同
- 个人与企业之间借款合同范例
- 乳制品冷藏加工合同
- 企业车辆买卖合同
- 2024年大巴车租赁合同参考样本(二篇)
- 第六单元 (单元测试)-2024-2025学年语文四年级上册单元速记·巧练系列(统编版)
- 第四单元测试卷(五)(单元测试)-2024-2025学四年级语文上册统编版
- 期中测试卷(试题)-2024-2025学年三年级上册语文统编版
- 河南省2024年中考地理试卷【附参考答案】
- 1.1 公有制为主体 多种所有制经济共同发展 课件高中政治统编版必修二经济与社会
- 浙教版九年级上册数学期中考试试卷含答案
- 期中检测试卷(1-4单元)(试题)-2024-2025学年三年级上册数学人教版
- 第一次月考 (1-2单元)(月考)- 2024-2025学年六年级上册数学人教版
- 2024-2030年中国微生物菌剂行业发展状况及投资前景预测报告
- 大学英语四级考试2022年9月真题(第一套)
评论
0/150
提交评论