2008C语言讲义第6章.ppt_第1页
2008C语言讲义第6章.ppt_第2页
2008C语言讲义第6章.ppt_第3页
2008C语言讲义第6章.ppt_第4页
2008C语言讲义第6章.ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第六章 数组,2,上机题,1. P129 6.11 2. P152 7.2 3. 将数组初值设置为:1, 3, 56, 34, 45, 69, 54, 78, 44, 23 将数组中所有能被3整除的数输出到屏幕上。 4. 定义一个具有100个元素的整型数组,从键盘输入数据,求这些数据的累加和,直至从键盘输入的数据为0结束。,3,上机题,P152页: 1. 7.1 2. 7.4 数组赋初值 int a6=1,3,5,7,9;插入4 3. 7.6 4. 输入一行单词,将每个单词的首字母变成大写。 例:输入:we are student. 输出:We Are Student.,4,一维数组的定义

2、和引用,数组是同一类型的一组值(10个 char 或15个 int) ,在内存中顺序存放。,整个数组共用一个名字,而其中的每一项又称为一个元素。,一、定义方式:,类型说明符 数组名常量表达式; int a4; /*表明a数组由4个int型元素组成 */,定义类型,数组名称,元素个数,5,int a4; /*表明a数组由4个int型元素组成*/ 其元素分别为:a0, a1, a2, a3 其序号从0开始。若存放首地址为2000H,则在内存中为:,C语言不允许对数组的大小作动态的定义,即数组的大小不能是变量,必须是常量。,必须是常数,6,如果要根据不同的数值改变数组的大小,可用常量表达式。如:,#

3、define SIZE 50 void main(void) int artSIZE; . ,7,二、一维数组元素的引用,数组必须先定义,具体引用时(赋值、运算、输出)其元素等同于变量。,void main(void ) int i, a10; for ( i=0; i=0 ; i-) printf(%dt,ai); printf(n); ,输出:9_ _8_ _7_ _6_ _5_ _4_ _3_ _2_ _1_ _0,定义,赋值,输出,i=0, a0=0,i=1, a1=1,a,0,1,2,i=2, a2=2,9,i=9, a9=9,8,三、一维数组的初始化,在定义数组的同时给数组元素赋值

4、。,注意: 1、对数组中的一部分元素列举初值,未赋值的部分是0。,int a10= 0,1, 2, 3, 4, 5;,2、不能给数组整体赋值,只能一个一个地赋值。,int a10= 0,1,2,.,9;,非法,int a10= 0,1, 2, 3, 4, 5,6,7,8,9;,int a10= 0,1, 2, 3, 4, 5, 0, 0, 0, 0;,9,3、可以用 int a = 0,1, 2, 3, 4, 5, 6, 7, 8, 9; 给数组赋值,编译器会自动计算出内的元素项数,并将数组定义为该长度。,4、用局部static 或全局定义的数组不赋初值,系统均默认其为0。,static in

5、t a10;(即存储在静态数据区中的数组其元素默认为0),数组在内存中顺序存放,第一个元素位于地址的最低端。,a,10,求Fibonacci数列:1,1,2,3,5,8,.的前20个数,即 F1=1 (n=1) F2=1(n=2) Fn=Fn-1+Fn-2(n=3),f i=f i-1+f i-2,11,下面程序的运行结果是:,void main(void) int a6, i; for (i=1; i3)%5 ; printf(%dt,ai); ,输出:-4 0 4 4 3,1,-4,2,0,3,4,4,4,5,3,12,将一个数组中的值按逆序重新排放。例如,原来顺序为 8,6,5,4,3,

6、2,1 排放后应为:1,2,3,4,5,6,8,将数组中指定的数据删除,如原数组为: 1,2,3,4,5,6,8。删除4后应为: 1,2,3,5,6,8,13,排序算法,用起泡法对6个数排序(由小到大),将相邻的两个数两两比较,将小的调到前头。,14,第五趟 循环1次,for (j=1; jai+1) t=ai; ai=ai+1; ai+1=t; ,15,一般,元素的序号从0开始,因此,程序可以变动如下:,for (j=0; jai+1) t=ai; ai=ai+1; ai+1=t; ,16,例 用简单选择法对10个数排序,排序过程: (1)首先通过n-1次比较,从n个数中找出最小的, 将它与

7、第一个数交换第一趟选择排序,结果最小的数被安置在第一个元素位置上 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换第二趟选择排序 (3)重复上述过程,共经过n-1趟排序后,排序结束,17,例,初始: 49 38 65 97 76 13 27 ,i=1,13,49,一趟: 13 38 65 97 76 49 27 ,i=2,27,38,六趟: 13 27 38 49 65 76 97 ,18,for(i=1;i10;i+) k=i; for(j=i+1;j10;j+) if(ajak) k=j; if(i!=k) x=ai; ai=ak; ak=x; ,fo

8、r (i=0; in-1; i+) k=i; for (j=i; jn ; j+) if (ajak) k=j ; if(i!=k) t=ak; ak=ai; ai=t; ,19,二维数组的定义和引用,一、定义方式: 类型说明符 数组名常量表达式常量表达式;,int a34;,其元素分别为:a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23,表明a数组由34个int型元素组成,定义类型,数组名,行数,列数,20,其行列的序号均从0开始。若存放首地址为2000H,则在内存中为:,即在内存中,多维数组依然是直线顺序排列的,第一个元素

9、位于最低地址处。,其元素分别为:a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23,21,二、二维数组的引用,与一维数组一样,二维数组必须先定义,其维数必须是常量。具体引用时(赋值、运算、输出)其元素等同于变量。,void main(void) int a23, i, j; printf(Input 2*3 numbersn); for (i=0; i2; i+) /* 输入 */ for(j=0; j3; j+) scanf(%d, ,输入:1 2 3 4 5 6,输出: _ _ _1_ _ _2_ _ _3 _ _ _4_

10、_ _5_ _ _6,定义,赋值,输出,22,三、二维数组的初始化,在定义数组的同时给数组元素赋值。即在编译阶段给数组所在的内存赋值。,1、分行赋值,int a34=1,2,3,4,5,6,7,8,9,10,11,12;,2、顺序赋值,int a34=1,2,3,4,5,6,7,8,9,10,11,12; /*依次赋值 */,23,3、部分赋值,int a34=1,5,9; /* a00=1, a10=5, a20=9 其余元素为0 */,int a34=0,1,5; /* a00=0, a01=1, a10=5 */,24,4、分行或全部赋值时,可以省略第一维,第二维不可省。,int a 4

11、=1,2,5,6,7,8,9,10,11,12;,5、不能给数组整体赋值,只能一个一个地赋值。,6、用static 定义的数组不赋初值,系统均默认其为0。,static int a23;,int a23=1,2,3,.,12;,25,void main(void) int a33, i, j; for (i=0; i3; i+) for (j=0; j3; j+) if (i= =2) aij=ai-1ai-1j+1; else aij=j; printf(%dt,aij); printf(n); ,i=0 a00=0 a01=1 a02=2,i=1 a10=0 a11=1 a12=2,a20

12、=a1a10+1=a10+1=1,i=2,a21=a1a11+1=a11+1=2,a22=a1a12+1=a12+1=3,输出:_ _ _0_ _ _1_ _ _ 2,_ _ _0_ _ _1_ _ _ 2,_ _ _1_ _ _2_ _ _ 3,26,有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。,先考虑解此问题的思路。从若干个数中求最大者的方法很多,我们现在采用“打擂台”算法。如果有若干人比武,先有一人站在台上,再上去一人与其交手,败者下台,胜者留台上。第三个人再上台与在台上者比,同样是败者下台,胜者留台上。如此比下去直到所有人都上台比过为止。最后留在台

13、上的就是胜者。,27,程序模拟这个方法,开始时把a00的值赋给变量max,max就是开始时的擂主,然后让下一个元素与它比较,将二者中值大者保存在max中,然后再让下一个元素与新的max比,直到最后一个元素比完为止。max最后的值就是数组所有元素中的最大值。,28,max=a00; /*使max开始时取a00的值*/ for (i=0;imax)/*如果某元素大于max*/ max=aij; /*max将取该元素的值*/ row=i; /*记下该元素的行号i*/ colum=j; /*记下该元素的列号j*/ printf(%dt%dt%dn,row,colum,max);,29,将数组行列式互换

14、。,123 56 789,147 258 369,for (i=0; i3; i+) for (j=0; j3; j+) t=aij; aij=aji; aji=t; ,for (i=0; i3; i+) for (j=0; ji; j+) t=aij; aij=aji; aji=t; ,30,打印杨辉三角形 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1,aij=ai-1j-1+ai-1j,31,以下程序用于从键盘上输入若干个学生的成绩,统计出平均成绩,并输出低于平均成绩的学生成绩。输入负数结束,void main() float x100,sum=0,

15、ave,a; int n=0,i; printf(Input scoren); _; while(_) xn=a; _; _ scanf(%d, ,ave=sum/n; printf(ave=%dn,ave); for( i=0; _;i+) if(_) printf(x%d %dn, i, xi);,scanf(%d, int a100; scanf(%d,for(i=n-1;i=0;i-) printf(%d,ai); printf(n); ,将余数依次存入数组中,34,已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。,输入:scanf(%d, 25,35,a,输

16、入:cinx; 25,78,56,34,25,for(i=n-1;i=0;i-),从后向前循环,36,void main(void) int a6=2,5,8,10,12; int x; for(int i=0;i0;i-) if(aix) ai+1=ai; else break; ,ai+1=x; for(i=0;i6;i+) printf(%dt,ai); printf(n); ,关键!从后面开始循环,从前向后移数,不大于退出循环,赋值,37,用筛选取法求出2200之间的所有素数。,筛法:首先将1n个数为数组置初值。2的倍数不是素数,置0; 3的倍数不是素数,置0;5的倍数不是素数,置0;

17、.,依次类推,最后将数组中不是0的元素输出。,38,字符数组,用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。,一、字符数组的定义,char 数组名常量表达式;,char c4; /*每个元素占一个字节 */,c0=I; c1=m; c2=_;,类型,数组名,数组大小,39,二、字符数组的初始化,与数值数组的初始化相同,取其相应字符的ASCII值。,char c10=I, , a, m, , a, , b, o, y;,40,如果字符个数大于数组长度,做错误处理;如果数值个数小于数组长度,后面的字节全部为0。,如果省略数组长度,则字符数即为数组长度。,static char

18、 c =I, , a, m, , a, , g, i, r,l;,同理,也可定义和初始化一个二维或多维的字符数组。分层或省略最后一维。,char st1 =65, 66, 68;,41,三、字符数组的引用,void main(void) char c10=I, , a, m, , a, , b, o, y; int i; for (i=0; i10; i+) printf(%c, ci); printf(n); ,定义,输出,42,四、字符串和字符串结束标志,C+语言将字符串作为字符数组来处理。 字符串常量:CHINA,在机内被处理成一个无名的字符型一维数组。,C+语言中约定用0作为字符串的结

19、束标志,它占内存空间,但不计入串长度。有了结束标志0后,程序往往依据它判断字符串是否结束,而不是根据定义时设定的长度。,43,字符串与字符数组的区别:,char a =C,H,I,N,A;,char c =“CHINA”;,字符数组,字符串,44,可以用字符串的形式为字符数组赋初值,char c =“I am a boy”; /*长度11字节,以0结尾 */,char a =I, , a, m, , a, , b, o, y; /* 长度10字节 */,如果数组定义的长度大于字符串的长度,后面均为0。,char c10=“CHINA”;,0的ASCII为0,而 (空格)的ASCII为32。,0

20、0000000,00100000,45,char w =T, u, r, b, o, 0;,char w =“Turbo0”;,char w =“Turbo0”;,char w =Turbo0;,非法,46,char a25=“abcd”, “ABCD”;,str为字符数组在内存中存储的地址,一经定义,便成为常量,不可再赋值。,char str12=“The String”;,非法,在语句中赋值,定义数组,开辟空间时赋初值,47,逐个字符输入输出 1、printf ( ) scanf ( ) 中用 %c。 2、使用getchar ( ) 和 putchar ( )函数。,字符数组的输入输出,c

21、har str10; printf(输入十个字符:); for(int i=0;i10;i+) scanf(%c, .,char str10; printf(输入十个字符: ); for(int i=0;i10;i+) stri=getchar(); .,48,字符串整体输入输出,1、printf ( ) scanf ( )中用s。,static char str10=“CHINA”; printf (“%s”, str); /* %s 格式要求地址,即数组名 */,输出:CHINA 输出到0结束。,printf (“%7.3s”, str);,输出:_ _ _ _CHI,%s作为输入格式,遇

22、到空白字符就认为输入结束。,49,char str10 ; scanf (“%s”, str); /* %s 格式要求地址(数组名) */,输入: How are you?,%s作为输入格式,遇到空白字符就认为输入结束。,50,char str110, str10, str10; scanf (“%s%s%s”, str1, str2, str3);,51,2. 使用gets ( ) 和 puts ( ) 函数,gets( )用来从键盘读入字符,直到遇到换行符为止,换行符不属于字符串内容。,char str50; gets(str);,字符串输入后,系统将0置于串尾代替换行符,若输入串长超过定

23、义的长度时系统报错。,输入:I am a student,puts( )函数把字符串的内容显示在屏幕上,遇到第一个0结束。,puts(str);,输出:I am a student,52,从键盘输入一行字符,统计其中分别有多少大小写字母。,从键盘输入一行字符,其中的大写变小写,小写变大写。,53,从键盘接收一行字符,统计有多少个单词数?,we are students.,不能用字母数或空格数来判断,只能用字母和空格状态变化的次数来判断。,设状态变量word , 判别到字母时word为1,判别到非字母时word为0。,word的初始值为0,当从0变为1时,单词数加1。,54,void main(

24、void) char s80; int i=0, word=0,num=0; gets (s); while(si!=0) if(si=a ,表明前一字符非字母,改变状态,防止继续对下一字母计数,改变状态,碰到下一个字母时开始计数,55,六、字符串处理函数,C中没有对字符串变量进行赋值、合并、比较的运算符,但提供了许多字符串处理函数,用户可以调用 #include “string.h”,所有字符串处理函数的实参都是字符数组名,56,1、合并两个字符串的函数 strcat (str1, str2),static char str120=“I am a ”; static char str2 =“

25、boy”; strcat (str1, str2);,将第二个字符串 str2 接到第一个字符串 str1 后。,注意:第一个字符串要有足够的空间。,空间足够大,57,2、复制两个字符串的函数 strcpy (str1, str2),static char str120=“I am a ”; static char str2 =“boy”; strcpy (str1, str2);,strcpy ( str1, “CHINA”);,strcpy (“CHINA”, str1);,str1=str2;,str1=“CHINA”;,字符串正确赋值,均为非法,58,3、比较两个字符串的函数 strc

26、mp (str1, str2),此函数用来比较str1和str2中字符串的内容。函数对字符串中的ASCII字符逐个两两比较,直到遇到不同字符或0为止。函数值由两个对应字符相减而得。,该函数具有返回值,返回值是两字符串对应的第一个不同的ASCII码的差值。,若两个字符串完全相同,函数值为0。,if ( strcmp (str1, str2)=0) . ,用来判断两字符串是否相等,59,static char str120=“CHINA”; static char str2 =“CHINB”; printf(%dn, strcmp (str1, str2);,输出:-1,static char s

27、tr120=“CHINA”; static char str2 =“AHINB”; printf(%dn,strcmp (str1, str2);,输出:2,if (str1= =str2) printf(yesn);,if (strcmp (str1,str2)= =0) printf(yesn);,非法,正确,60,4、求字符串长度的函数 strlen (str1),函数参数为数组名,返回值为数组首字母到0的长度。并非数组在内存中空间的大小。,char s80; strcpy(s, abcd); printf(%dn,strlen(s);,输出: 4,输出: 3,printf(%dn,st

28、rlen(str1);,printf(%dn,siziof(s);,输出: 80,长度不包括0。,61,char str120=“CHINA”; printf(%dn,strlen (str1);,输出:5,char sp =“x69082”; printf(%dn,strlen (sp);,输出:6,char sp =“tv0willn”; printf(%dn,strlen (sp);,输出:3,char str120=“a book”; printf(%dn,strlen (str1);,输出:1,62,5、 strlwr (str1),将str1中的大写字母转换成小写字母。,6、 strupr (str1),将str1中的小写字母转换成大写字母。,63,7、函数strncmp(字符串1,字符串2 , maxlen)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论