c语言程序设计第5章.ppt_第1页
c语言程序设计第5章.ppt_第2页
c语言程序设计第5章.ppt_第3页
c语言程序设计第5章.ppt_第4页
c语言程序设计第5章.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

1、肖 洁 大连工业大学管理学院,高级语言程序设计,第五章 数 组,一 维 数 组,1,字 符 串,2,3,二 维 数 组,5.1 一维数组,一、 一维数组的定义,二、 一维数组元素的引用,三、 一维数组的初始化,五、数组与函数,四、一维数组的程序举例,一、 一维数组的定义,数组是一组有序的、类型相同的数据的集合,这些数据被称为数组的元素。,一、 一维数组的定义,数组是同类型变量的集合,共用一个名字, 用下标区分; 每个变量称作数组元素; 按下标递增顺序在内存中存放; 使用几个下标区分变量,就是几维数组。 一维数组与数学中的数列对应,二维数组 与矩阵对应。,一、 一维数组的定义,一维数组定义格式:

2、 类型标识符 数组名数组大小;,数组必须先定义、后使用。,说明数组元素类型,float mark100; char str200; int student_age10; int x=8,y=3; int ax+y;,一、 一维数组的定义,int student_age10;,下标的序号从0开始,注意没有student_age10元素,二、 一维数组元素的引用,数组元素的引用形式: 数组名下标,整型常量、整型变量或整型表达式。,例:a3= a0 + ai+1;,下标指出在数组中第几个元素,下标不要越界,二、 一维数组元素的引用,数组中的每个元素在功能上等价于一个一般的变量。例如:输入100个学生

3、成绩,并求出总成绩。,m0 m1 m2 m99,85,148,226,316,7950,82,7950,三、 一维数组的初始化,方法:将初值依次写在花括号 内。,如: int a5= 2 , 4 , 6 , 8 , 10 ;,存储形式:,存储单元,三、 一维数组的初始化,(1)给数组中部分元素赋初值,其他元素按0值处理。 如:int a9=1,2; 则 a0= 1, a1= 2, a2a8值全为0。,(2)对数组元素全部赋值可以不指定长度。 如: int a=0,1,2,3,5; 等价于:int a5=0,1,2,3,5;,(3)初值的个数不能超过数组最大元素的个数。 如:int a3= 1,

4、 2,3, 4 ;,说明:,四、一维数组的程序举例,例5.1 用一个数组存储10个学生的年龄,然后分别按正序和反序显示它们。,四、一维数组的程序举例,修改程序段: for(i=Nelements-1;i=0;i-) printf(%6d, student_agei); printf(n); /* 反序输出 */,一次运行结果:,四、一维数组的程序举例,例5.2 顺序查找一个学生年龄的C程序。,#include #include int main(void) int i, aAge; int student_age=10,11,12,13,14,15,16,17,18,19; printf(“请

5、输入要查找的年龄:”); scanf(“%d”, ,四、一维数组的程序举例,例5.2 顺序查找一个学生年龄的C程序。,一次运行结果:,另一次运行结果:,四、一维数组的程序举例,例5.3 用数组来处理求Fibonacci数列问题。 数学表示: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

6、 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,四、一维数组的程序举例,例5.4 冒泡排序。 (由小到大)p165,方法:将两个相邻数比较,大的调到后面。,四、一维数组的程序举例,例5.4 冒泡排序动画演示。,四、一维数组的程序举例,由以上可推知:5 个数要比较4轮 第一轮中要进行两两比较4次 第二轮中要进行两两比较3次 若有n个数,则要进行n-1轮比较 第 i轮比较中要进行n-i次两两比较。,五、数组与函数,数组与函数之间关系: 向函数的形参传送数组元素。 调用函数后返回一个数组元素值。 向函数的形参传送数组名(

7、数组的地址)。 函数对数组操作。,1. 函数对数组操作,void bubbleSort(void) /* 冒泡排序函数 */ int i,j,temp; for(j=0;jai+1) temp=ai;ai=ai+1;ai+1=temp; ,2. 向函数传递数组名(数组名作参数),#include #define N 8 void disp(int ); void bubbleSort(int dN); int main ( ) int xN=9,8,3,7,5,2,6,1; bubbleSort(x); disp(x); return 0; ,函数声明语句中可以没有数组名字和数组大小,函数声明

8、语句中也可以有数组名字和数组大小,用数组名作实参,用数组名作实参,void bubbleSort(int aN) int i,j,temp; for(j=0;jai+1)temp=ai;ai=ai+1;ai+1=temp; void disp(int c ) int i; printf(n排序结果:); for(i=0;i=N-1;i+) printf(%3d, ci); printf(n); ,函数定义中数组可以不写出大小,2. 向函数传递数组名(数组名作参数),函数定义中数组可以写出大小,实参,主调函数,被调函数,传 地 址 值,形参,传送数组名(首元素的地址),数组名,数组名,2. 向函

9、数传递数组名(数组名作参数),由该程序可以得到如下结论: (1)实参向形参传送的是数组首元素的地址,使被调函数可以对主调函数建立的数组中的元素进行读写。 (2)以数组名作参数时,有如下几点规则: 函数原型必须指明数组类型,而数组的大小不是必须的; 实参可以只写数组名,而这个数组名必须是已经定义为具有确定长度的数组名。,2. 向函数传递数组名(数组名作参数),例 编写函数求数组中所有元素的平均值。 double average(int a ,int n) int i; double s=0; for(i=0;in;i+) s=s+ai; return s/n; 主函数如何编写? main() i

10、nt b4=1,2,3,4; double ave; ave=average(b,4); printf(“ave=%f”, ave); ,用另外一个参数表示数组的长度,2. 向函数传递数组名(数组名作参数),5.2 字符串,一、字符数组与字符串,二、字符串的输入输出,三、字符串处理函数,一、 字符数组与字符串,字符数组的定义、初始化和元素的引用与一般的数组相同。,例如: char c10; 则c为字符数组。,1. 字符数组及其初始化 当数组的元素类型为字符型时,被称为字符数组。,char c7=p, r, o, g, r, a, m;,char s =C, h, i, n, a;,2. 字符串

11、及其初始化 在C语言中,把用一对双撇号括起来的零个或多个字符序列称为字符串常量。 如:hello, A,等。,字符串结束标志0为最后一个元素。,一、 字符数组与字符串,一个字符数组只有以0为最后一个元素时被成为字符串。,字符串的定义和初始化可以有如下几种形式: char str16= C,h,i,n,a,0; char str16=“China”; char str16=“China”; char str1 = C,h,i,n,a,0; char str1 =“China”; char str1 =“China”; 应当注意,定义字符串时,一定要注意给定的字符数组的大小要比实际存储的字符串中的

12、有效字符数多1。,一、 字符数组与字符串,二、 字符串的输入输出,使用格式化输入输出函数(printf和scanf),用%c格式输入输出。 使用格式化输入输出函数(printf和scanf),用%s格式输入输出。 使用字符串处理函数puts()和gets()输入输出。,二、 字符串的输入输出,使用格式化输入输出函数(printf和scanf),用%c格式输入输出。,for(i=1;i=10;i+) scanf(“%c”,逐个输入字符串a的每个元素,for(i=1;i=10;i+) printf(“%c”,ai);,逐个输出字符串a的每个元素,采用%s的字符串格式化输入输出,用s格式输出时,输出

13、项为数组名。 如: printf(“%s”, c);,输出: green,二、 字符串的输入输出,c0 c1 c2 c3 c4 c5,c是数组名,注意:输出字符不包括0。,数组输入时,不加地址符“ 因为数组名代表数组的起始地址。,若输入数据是: aaa bbb,遇到输入的字符中有空格、换行或制表符(tab)时本次输入结束。,二、 字符串的输入输出,c0 c1 c2 c3 c4 c5,例5.5 分析下面程序的执行结果。,# include # define N 5 int main(void) char str1N,str2N,str3N; scanf(“%3s%5s%7s”,str1,str2

14、,str3); printf(“str1=%s, str2=%s, str3=%sn”,str1,str2,str3); scanf(“%s%s%s”,str1,str2,str3); printf(“str1=%s, str2=%s, str3=%sn”,str1,str2,str3); return 0; ,二、 字符串的输入输出,执行结果如下:,输入:abcdefghijklmnopqrs 输出:str1=abc,str2=defgh,str3=ijklmno 输入: abcdefghijklmnopqrs 输入: tuvwxyz 输出: str1=pqrs,str2=abcdefghi

15、jklmnopqrs, str3= tuvwxyz,二、 字符串的输入输出,使用字符串处理函数gets和puts实现输入输出,二、 字符串的输入输出,# include # define N 13 int main(void) char strN; printf(“请输入一个字符串n”); gets(str); puts(str); puts(str); return 0; ,运行情况如下: 请输入一个字符串:,Computer char str1N1=“abcdefg”,str2N2=“hijklm”; printf(“nstr1=%s,str2=%sn”,str1,str2); print

16、f(“nstrcat的返回值:%ldn”,strcat(str1,str2); printf(“n连接后的str1=%sn”,str1); printf(“n输入要查找的字符n”); scanf(“%c”, ,三、字符串处理函数,例5.8 程序运行情况如下:,strcmp(字符串1,字符串2): 两个串的比较,注意:不能用if(str1= = str2)形式进行比较,可以用if( strcmp(str1,str2) = = 0)形式。 比较字符串大小的基本规则: 按照串中对应位置字符的ASCII码值的大小确定大小。 例如:“abc” “abadef” 因为字符 c a,三、字符串处理函数,例5

17、.9 输入5个字符串,输出其中最小的字符串。,三、字符串处理函数,# include # include # define N 10 int main(void) char strN,minN; int i; printf(“先输入第1个字符串:”); gets(min); for(i=2;i0) strcpy(min,str); printf(“n最小的字符串是:%sn”,min); return 0;,例5.9 程序运行情况如下:,三、字符串处理函数,例5.10 计算字符串长度。,int strlenth(char s ) int i=0,len=0; while(si+) len+; r

18、eturn len; ,三、 字符串处理函数,d,0,c,b,a,s,例5.11 字符串复制。,三、 字符串处理函数,void strcopy (char dest , char src ) int i=0,j=0; while( (desti+=srcj+)!=0); ,5.3 二维数组,一、二维数组定义,二、二维数组的初始化,三、二维数组元素的引用,四、向函数传送二维数组,五、二维数组的程序举例,例如: int a33;,一、二维数组定义,一、二维数组定义,(1)分行给二维数组赋初值。 如:int a23= 2,3,1,1,2,3; 可以省略第1维的大小。 int a 3= 2,3,1,1

19、,2,3;,(2)将所有数据写在一个 内,按顺序赋值, 即按数组元素在内存中排列的顺序赋初值。 如: int a23=2,3,1,1,2,3;,二、二维数组的初始化,设有数组a23,(3)可以对部分元素赋值。 如: int a33=1,0,1,0,0,1;,int a23=5,6,7,8;,二、二维数组的初始化,二维数组元素表示形式: 数组名下标1下标2 下标1和下标2是整型常量、整型变量或整型表达式。其编号是从0开始的。,例如:若有 int a1012, i=15; 则使用 a3*30, a1i-5都是合法的。,下标不要越界,三、 二维数组的引用,四、向函数传送二维数组,例5.12 成绩分析

20、。,#define STDNUM 4 /*STDNUM表示学生号*/ #define COURNUM 3 /*COURNUM表示课程号*/ double scoreSTDNUMCOURNUM= 89,78,56,88,99,100,72,80,61,60,70,75;,void StudAveScore(double a COURNUM) int row,col; double SumScreCour; for(row=0;row=STDNUM-1;row+) SumScreCour=0; for(col=0;col=COURNUM-1;col+) SumScreCour+= arowcol;

21、 printf(“n学生%d的平均成绩是:%fn”,row+1, SumScreCour/COURNUM); ,计算各学生的平均成绩函数,四、向函数传送二维数组,计算各门课程的平均成绩函数,void CourAveScore(double b COURNUM) int row,col; double SumScreStud=0; for(col=0;col=COURNUM-1;col+) SumScreStud=0; for(row=0;row=STDNUM-1;row+) SumScreStud+=browcol; printf(“n课程%d的平均成绩是:%fn”,col+1, SumScr

22、eStud/STDNUM); ,四、向函数传送二维数组,#define STDNUM 4 #define COURNUM 3 void StudAveScore(double COURNUM); void CourAveScore(double b COURNUM); int main(void) double scoreSTDNUM COURNUM=89,78,56, 88,99,100,72,80,61,60,70,75; StudAveScore(score);/* 传送实际数组名 */ CourAveScore(score); return 0; ,主函数,四、向函数传送二维数组,例1

23、 将一个矩阵a 23中的每个元素乘以2。,for(i=0;i2;i+) for(j=0;j3;j+) aij=aij*2;,五、二维数组程序举例,例2 将一个矩阵a 23转置存到另一个矩阵b 32中。,分析:用数组a、b分别代表矩阵a、b; 执行:bji=aij; 即可完成转换。 涉及到两个下标的,一般用两重循环。,五、二维数组程序举例,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

24、; printf(“n”); ,printf(“array b: n”); for(i=0; i3; i+) for( j=0; j2; j+) printf(“%5d”,bij); printf(“n”); ,运行结果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,五、二维数组程序举例,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; imax) max=aij; row=i; colum=j; printf(“%m

25、ax=%d,row=%d,colum=%dn”,max, row,colum); ,运行结果为: max=9,row=1, colum=0,例3 求34矩阵中最大元素的值及其所在行和列号。,五、二维数组程序举例,例4输出一个钻石图形。,五、二维数组程序举例,main( ) char diamond 5= , , *, , *, , *, *, , , , *, , *, , *, , , *; int i, j; for( i=0; i5; i+) for( j=0; j5; j+) printf(“%c”, diamondij); printf(“n”); ,习题5.17有n 个学生,每人考

26、m 门课,找出每门课成绩最高的学生的学号。,五、二维数组程序举例,#define N1 4/* 学生数 */ #define N2 4 /* 课程数 */ #include int main(void) int noN1; /*成绩最高学生的学号*/ int i,j,num; double pN1N2,max1,sum=0.0;,五、二维数组程序举例,for(j=0;jN2;j+) /*N2 为课程数 */ if(j=0)printf(请输入数学得分:n); else if(j=1)printf(请输入物理得分:n); else if(j=2)printf(请输入化学得分:n); else printf(请输入英语得

温馨提示

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

最新文档

评论

0/150

提交评论