C语言程序设计Chapter6数组.ppt_第1页
C语言程序设计Chapter6数组.ppt_第2页
C语言程序设计Chapter6数组.ppt_第3页
C语言程序设计Chapter6数组.ppt_第4页
C语言程序设计Chapter6数组.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第6章 数 组,例:输入5个人的成绩后按逆序输出显示。,float score1,score2,score3,score4,score5;,scanf(“%f“,scanf(“%f“,scanf(“%f“,scanf(“%f“,scanf(“%f“,printf(“%f“,score5);,printf(“%f“,score4);,printf(“%f“,score3);,printf(“%f“,score2);,printf(“%f“,score1);,main() ,score5;,scanf(“%f“,for(i=1;i=5;i+),printf(“%f“, scorei);,for(i=4;i=0;i-),for(i=0;i=4;i+),int i;,引 言,C语言用同名的带下标的变量组成一个数组, 带下标的变量由数组名和用方括号括起来的下标来表示, 称为数组元素, 同一数组的各个元素只是下标不同, 通过数组名和下标可直接访问数组的每个元素。,数组是由具有固定数目的同类型的 变量按一定顺序排列而构成的。,像简单变量一样, 数组元素必须先定义后引用。,一维数组的定义和引用,定义:,当数组的元素只带一个下标时,形式:,元素类型名 数组名常量表达式,例:int a5;,说明:,1、 元素类型名指定该数组各元素的类型。,2、数组名命名方法同变量名,应符合标识符命名规则。,3、方括号 括起来的常量表达式的值为该数组含数组 元素的个数, 即数组长度; 表达式可含常量和符号常 量, 不允许有变量。数组元素的下标都从0开始编排。,例:int a(20);,float b10.0;,int n=5; int an;,存储方式:,一维数组各元素按下标的顺序 连续地分配在内存单元之中。,引用方式:,数组名下标,其中下标为整型表达式,由它确定了引用元素的 序号,下标从0开始,最大等于定义的数组长度减1。 在程序中数组元素等价一个同类型的变量。,例:int m10; m9=m0*5+m2*4*6;,初始化:,1、全部赋初值。,int m10=10,11,12,13,14,15,16,17,18,19;,2、部分数组元素赋初值,剩余部分系统自动置0。,int m10=0,1,2,3,4;,3、在对全部元素赋初值时,可以不指定数组长度。,int m =0,1,2,3,4,5;,/*a5a9系统设置为0*/,4、当初值个数多于数组元素个数时,编译出错。,int a5=0,1,2,3,4,5; /*error: too many initializers in main function*/,一维数组应用举例,例.将任意一个十进制数转换成二进 制数,然后以二进制数形式输出。,把10进制数59转换成2进制数,59,2,29,2,14,2,7,2,3,2,1,2,0,(59)10=(111011)2,1,1,1,0,1,1,main() int i, x, arr20; printf(“nPlease input an integer:”); scanf(“%d”, ,思考:任意进制之间的转换实现?,例:Fibonacci(斐波纳契)数列定义如下 Fib1=1; (n=1) Fib2=1; (n=2) Fibn=Fibn-1+Fibn-2 (n=3) 即数列为:1,1,2,3,5,8, 13, ,long Fib12=1,1; for(i=2;i12;i+) Fibi=Fibi-1+Fibi-2;,main() long FibN=1,1; int i; for(i=2;i12;i+) Fibi=Fibi-1+Fibi-2; for(i=0;i12;i+) printf(“%5d“,Fibi); printf(“n“); ,例: 输入10个整数,找出其中最大值和最 小值,并把二者值对调后全部打印输出。,#define N 10 #include main() int i, arrN, max, min,maxi,mini; printf(“Please input %d integers:n“,N); for(i=0; iN; i+) scanf(“%d“, ,/*找最大和最小值,并交换*/ max=min=arr0; maxi=mini=0; for(i=1;imax) / 找最大值 max=arri; maxi=i; else if(arrimin) /找最小值 min=arri; mini=i; printf(“max=%d,min=%dn“, max,min); arrmaxi=min; arrmini=max;,思考:找其中两个最小或最大的数?,简单选择排序法的算法思想如下: (1) 首先通过n-1次比较,从数组的a0 an-1中找出最小的, 将它与a0 交换第一趟选择排序,结果最小的数被安置在第一个元素位置上 (2) 再通过n-2次比较,从剩余的a1 an-1个数中找出次小的数, 将它与第二个数a1交换第二趟选择排序。 (3) 重复上述过程,共经过n-1趟排序后,排序结束,数组排序,-简单选择排序法,98,38,14,55,77,35,62,48,98,38,48,55,77,35,62,14,48,38,98,55,77,35,14,98,62,48,55,77,38,35,14,62,/* 简单选择排序算法 */ for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(akaj) k=j; if(k!=i) t=ai; ai=ak; ak=t; ,#define N 10 main() int i, j, k, n, aN, t; printf(“nInput the number of integers to sort:“); scanf(“%d“, ,数组排序,-冒泡排序法,是一种简单的交换排序方法。其算法思想如下: (1) 比较第一个数与第二个数,若a0a1,则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止第一趟冒泡排序,结果最大的数被交换到最后一个元素位置上。 (2) 接着对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置。 (3) 重复上述过程,经过 n-1趟后,排序结束。,(相邻逆序交换),62,77,35,98,98,14,55,38,思想:在扫描的过程 中顺次比较相邻的两 个元素的大小,若逆序 就交换位置。,第一趟 共7次,第二趟 共6次,55,38,77,77,48,35,62,14,第i趟 共n-i次,第n-1趟 排序结束,/* 冒泡排序算法 */ for(i=0; i aj+1 ) t=aj; aj=aj+1; aj+1=t; ,思考:效率可 否改进?,main() int i, j, k, n, a50, t; printf(“nInput the number of integers to sort:“); scanf(“%d“, ,二维数组的定义和引用,定义:,每个元素都带两个下标,形式:,元素类型名 数组名常量表达式1 常量表达式2,说明:,1、元素类型名、数组名同一维数组定义。,2、常量表达式1的值表示数组行数, 常量表达式2的值表示数组列数。,存放方式:,按行、按列两种方式,可将二维数组的元素看成若干个特殊的一维数组。,如: int b3 4;,则: 有三个特殊的一维数组b0,b1, b2, 每个一维数组又有四个元素:,b00, b01, b02, b03, b10, b11, b12, b13, b20, b21, b22, b23,引用方式:,数组名行下标列下标,其中的行下标和列下标均为整型表达式, 最小下标都是0, 最大下标分别等于数组 定义的行数减1和列数减1, 引用时行下标 和列下标都不得越界。,初始化:,1、按行给二维数组赋初值:,int b34=1,2,3,4,5,6,7,8,9,10,11,12,;,2、可以对部分元素赋初值,但需表达清楚。,int a34=1,2,3,8;,3、可通过赋初值决定数组大小。,如为二维,则只可省略第一维的大小.,int a 4=1,2,3,12;,例: 求两个矩阵a与b之和,将计算结果仍然放在a中。,+,a00=a00+b00;,a01=a01+b01;,a02=a02+b02;,a03=a03+b03;,for(j=0;j4;j+),a0j=a0j+b0j;,for(j=0;j4;j+),a1j=a1j+b1j;,for(j=0;j4;j+),a2j=a2j+b2j;,for(i=0;i3;i+) for(j=0;j4;j+) aij=aij +bij;,aij+=bij;,main() int a34= 1, 2, 3, 4,3, 4, 5, 6,5, 6, 7, 8; int b34= 1, 2, 3, 4, 5, 6 ; int i, j; for(i=0;i3;i+) for(j=0;j4;j+) aij+=bij; for(i=0; i3; i+) for(j=0; j4; j+) printf(“%6d”, aij ); printf(“n”); ,例: 求矩阵a的转置矩阵b。转置矩阵是指将一个 二维数组行和列元素互换,存到另一个二维数组中,b00=a00,b01=a10,bij=aji,a,b,for (i=0; i3; i+) for (j=0; j2; j+) bij=aji; ,b10=a01,b11=a11,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); printf(“n“); for (i=0; i3; i+) for (j=0; j2; j+) bij=aji; printf(“array b:n“); for (i=0; i3; i+) for (j=0; j2; j+) printf(“%5d“, bij); printf(“n“); ,/*数组a是2行3列*/,/*数组b是3行2列*/,例: 求两个矩阵a和b的乘积c,c00=a00*b00 +a01*b10 +a02*b20,c01=a00*b01 +a01*b11 +a02*b21,77,32,32,14,for(k=0;k3;k+) c00+=a0k*bk0;,for(k=0;k3;k+) c01+=a0k*bk1;,for(j=0;j2;j+) for(k=0;k3;k+) c0j+=a0k*bkj; for(j=0;j2;j+) for(k=0;k3;k+) c1j+=a1k*bkj;,for(i=0;i2;j+) for(j=0;j2;j+) for(k=0;k3;k+) cij+=aik*bkj;,main() int a23=1,2,3,4,5,6; int b32=1,4,2,5,3,6; int c22=0,0,0,0; int i,j,k; for(i=0;i2;i+) for(j=0;j2;j+) for(k=0;k3;k+) cij=cij+aik*bkj; printf(“the array a * array b is :n“); for(i=0;i2;i+) for(j=0;j2;j+) printf(“%4d“,cij); printf(“n“); ,例. 输出杨辉三角形。,for(i=0;iN;i+) yi0=1; yii=1; ,int yNN;,for(i=2;iN;i+) for(j=1;ji;j+) yij=yi-1j+yi-1j-1;,#define N 6 main() int i,j,yNN; for(i=0;iN;i+) yi0=1; yii=1; for(i=2;iN;i+) for(j=1;ji;j+) yij=yi-1j+yi-1j-1; for(i=0;iN;i+) for(j=0;j=i;j+) printf(“%5d“,yij); printf(“n“); ,例. 输出杨辉三角形。,int yN;,=1;,y1=y1+y0;,y1=y1+y0;,y2=y2+y1;,y1=y1+y0;,y2=y2+y1;,y3=y3+y2;,顺序可以 颠倒吗?,for(i=0;i=1;j-) yj=yj+yj-1;,#define N 6 main() int i,j,yN=1; for(i=0;i=1;j-) yj=yj+yj-1; for(j=0;j=i;j+) printf(“%5d“,yj); printf(“n“); ,例:从键盘输入5个学生三门课程的成绩求每个 学生各门课的平均分,并按平均分从高到低的 顺序输出每个学生各门课程的成绩和平均成绩。,问题分析: 排序方法: 简单选择排序 冒泡排序等 排序注意: 交换时应整行交换,87,88,99,93,70,80,69,63,70,33,20,50,93,70,89,91.3,81.0,67.3,34.3,84.0,84.0,91.3,93,70,89,87,88,99,排序过程成绩的交换:,averi averk scorei0 scorek0 scorei1 scorek1 scorei2 scorek2,for(m=0;m3;m+) scoreim scorekm,/*排序部分代码*/ for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(averkaverj) k=j; if(k!=i) t=averi; averi=averk; averk=t; for(m=0;m3;m+) a=scoreim; scoreim=scorekm; scorekm=a; ,/*输入部分代码*/ for(i=0;in;i+) for(j=0;j3;j+) scanf(“%d“, c,/*输出部分代码*/ printf(“the sorted score is :n“); for(i=0;in;i+) printf(“nthe average is %.1f. “,averi); printf(“the score is “); for(j=0;j3;j+) printf(“%d “,scoreij); ,/*主函数部分代码*/ #include #define N 100 main() int n, i, j, j, m; int scoreN3, a; float averN, t; printf(“please input the total number: “); scanf(“%d“, /*输入部分代码*/ /*计算平均值部分代码*/ /*排序部分代码*/ /*输出部分代码*/ ,input_array(score,n);,cal_average(score,aver,n);,sort(score,aver,n);,output_array(score,aver,n);,字符数组,存放字符数据的数组,它的每个元素存放一个 字符。字符串就是用字符数组存放的。,定义:,形式:,char 数组名常量表达式,元素类型名,数组名,长度,例如: char c20;,初始化:,1、直接给出字符数组中的各字符。,char a5=G, o, o, d;,2、可以去掉定义时的长度设置, 此时字符数组的长度 等于 中的字符数。后面不会自动加字符串结束符0。,char x =I, ,a,m, ,a, ,s,t,u,d,e,n,t,.;,3、可以用字符串常量对字符数组初始化。,char x20=“I am a student.”;,char x20=“I am a student.”;,也可以去掉定义时的长度设置,此时会自动加0,char x=“I am a student.”,例:对于如下声明的数组 char a =“Hello!”; char b =H,e,l,l,o,!; 正确的描述是_ A. a数组和b数组完全相同 B. a数组比b数组长度长 C. a数组和b数组长度相同 D. b数组比a数组长度长,B,字符数组的输入输出,用scanf( )和printf( )输入/输出时, 可用如下两种格式符:,%c 逐个元素输入/输出字符(char),%s 整体输入/输出字符串(string),1.用格式符%c逐个元素输入/输出字符,输入时系统不会自动加0。,例:main() char b10; int i; for(i=0;i10;i+) scanf(“%c“, ,2.用格式符%s整体输出字符数组,在printf( )中用格式串“%s”, 输出项直接写数组名,例如: char c =“I am a student“; printf(“%s“, c);,注意:,(1)若数组长度大于字符串长度, 则遇到0即结束;,例如: char c12=“student“; printf(“%s!“, c);,(2)结束符0不显示。若数组中有多个0, 输出时 遇到第一个0即结束。,(3)如果数组中没有0, 当用此格式整体输出数组时 结果可能不对, 最好改用%c格式输出各元素。,3.用格式符%s整体输入字符串,在scanf( )中用格式串“%s”, 输入项直接用数组名,例如: char c20; scanf(“%s“, c);,注意:,(1)数组名本身就代表该数组的首地址(0号元素的地址), 所以scanf( )中数组名前不允许再加地址符& 。,(2)输入字符串时, 系统自动加上0。,(3)输入多个字符串,可用空格隔开。,例如: scanf(“%s%s%s“, s1, s2, s3);,输入 You are happy! ,则: s1: “You “ s2: “are “ s3: “happy!“,例如:输入一个学生的名字,并输出。,#include /*按字符形式输入输出*/ main() int count=0 ,i; /*count用于统计姓名的字符个数*/ char name20; printf(“nInput your name:“); for(i=0; ;i+) scanf(“%c“, ,for(i=0;namei!=0;i+),printf(“%s“,name);,scanf(“%s“,name);,#include main() char name20; printf(“nInput your name:“); scanf(“%s“,name); printf(“Your name is:“); printf(“%s“,name); ,不能加空格?,gets(name);,char name310;,for(i=0; i3; i+) printf(“nPlease Input %d students name:“,i+1); gets(namei); printf(“n students name:n“); for(i=0; i3; i+) puts(namei); printf(“n”); ,例如:输入1个学生的姓名并输出。,3,一维字符数组常用于处理一个字符串。 二维字符数组常用于处理多个字符串。,字符串处理函数,C语言程序库中提供了一些专门处理字符串的函数:,gets(字符数组); 输入一行字符序列到字符数组 puts(字符串); 将字符串输出到终端 strcat(字符数组1,字符串2); 字符串连接 strcpy(字符数组1,字符串2); 复制字符串 strcmp(字符串1, 字符串2); 两个字符串比较 strlen(字符串); 测字符串长度 strlwr (字符串); 将字符串大写字母转换为小写 strupr (字符串); 将字符串小写字母转换为大写,1.字符串整行输入函数gets( ),格式:,gets(字符数组),功能:,从键盘将带空格的字符序列(以回车键结束)全 部输入到指定的字符数组中,并自动加字符串结 束符0。该函数的返回值是字符数组的首地址。,例如: char str20; gets(str);,运行时: I am a student. ,结果将此字符序列15个字符和0共16个字符存入str。,2.字符串整体输出函数puts( ),格式:,puts(字符串),功能:,将指定的字符串作为一行输出到终端。,此功能可以用printf( )实现。字符串可以是字符串 常量或字符数组(存有0),字符串中可以有转义字符。,例如: char s =“I am a student.n You are a worker.“; puts(s); puts(“He is a teacher.“);,输出: I am a student. You are a worker. He is a teacher.,3.字符串连接函数,格式:,strcat(字符数组1, 字符串2);,功能:,将字符串2连接到字符数组1中的字符串后面, 字符串2可以是字符串常量、字符型数组名, 而字符数组1只能是字符型数组名。此函数 的返回值是字符数组1的首地址。,显然字符数组1应该有足够的长度, 以便能存放下连接 后的新字符串。连接时字符串1后面的0取消, 在字符 数组中新字符串的最后保留一个0。,例如: char s120= “Hello, “; puts(strcat(s1,“Bill Gates.“););,输出: Hello, Bill Gates.,4.字符串复制函数,格式:,strcpy(字符数组1,字符串2);,功能:,将字符串2复制到字符数组1中, 字符串2可以是字符 串常量、字符型数组名, 而字符数组1只能是字符型 数组名。此函数的返回值是字符数组1的首地址。,字符数组1应该有足够的长度, 以便能存放下字符串2。,例如: char s120; puts (strcpy(s1,“teacher.“);,输出: teacher.,5.字符串比较函数,格式:,strcmp(字符串1, 字符串2);,功能:,字符串比较, 返回比较结果。对字符串1和字符串2 从左向右逐个字符, 按其ASCII码值进行比较, 直到 字符值不相等或遇到字符串结束符0为止。,char s120= “tea.“; printf(“%d %d“, strcmp(s1,“tea.“) ,strcmp(“cd“,“ccd“);,输出: 0 1,例: 输入三个整数,并求最大值。,#include ma

温馨提示

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

评论

0/150

提交评论