C语言程序设计(第二版)课件第6章 数组_第1页
C语言程序设计(第二版)课件第6章 数组_第2页
C语言程序设计(第二版)课件第6章 数组_第3页
C语言程序设计(第二版)课件第6章 数组_第4页
C语言程序设计(第二版)课件第6章 数组_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

第6章数组掌握一维数组、二维数组的定义、初始化和数组元素的引用掌握字符数组的定义、初始化和数组元素的引用掌握字符串的存储方法和应用掌握有关处理字符串的系统函数的使用方法6.1数组的基本概念【问题】从键盘接收10个数,求平均数并输出所有小于平均数的数。【分析】从键盘接收10个数,求平均数很简单,可以采用边接收边求和的方法,最后根据总和求平均数。下面的程序可以做到:inta,i;floats;for(i=0,s=0;i<10;i++){scanf("%d",&a);s=s+a;} 输出小于平均数的数?6.1数组的基本概念所谓数组,就是一组类型相同的变量。它用一个数组名标识,每个数组元素都是通过数组名和元素的相对位置——下标来引用的。数组可以是一维的,也可以是多维的。inta1,a2,a3,…,a10inta[10];===(a[0],a[1],a[3],…,a[9])

其中下标从0开始,和前面不同的是,这些变量统一共享一个数组名a。6.2一维数组一维数组用于存储一行或一列的数据。定义方式如下:<类型><数组名>[<常量表达式>];<类型>:简单类型或结构体、共用体等复杂类型。<数组名>:数组的标识、命名规则同变量名。<常量表达式>:用来定义数组的长度,因为数组也必须先定义再使用。例如:inta[10];chars[100];C语言不允许对数组的大小作动态定义,即定义行中的数组长度可以包括常量和符号常量,但不能包括变量。例如,下面的定义是错误的。intn=10;inta[n];/*因为n为变量*/而下面的定义是正确的:#defineN10main(){inta[N];/*N为符号常量*/…}定义数组的同时可以对数组初始化。以下初始化的方法都是允许的:inta[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化inta[]={1,2,3,4,5,6,7,8,9,10};//完全初始化,可省略长度inta[10]={1,2,,4,5};//部分元素a[0]、a[1]、a[3]、a[4]初始化数组元素的下标从0开始。数组名不能像变量一样进行赋值操作。以下用法是错误的:inta[10],b[10];a=b;/*错误*/正确的定义:inta[10]; /*定义整型数组a,它有10个元素*/chars[20]; /*定义字符型数组s,它有20个元素*/floatf[5],g[10];/*定义实型数组f和g,f数组有5个元素,g数组有10个元素*/6.3案例:求10个数中的最大值、最小值、平均值voidmain(){ inta[10],i; intmax,min; floats=0,aver; printf("Input10numbers:"); for(i=0;i<10;i++) scanf("%d",&a[i]); s=max=min=a[0]; for(i=1;i<10;i++) { if(a[i]>max) max=a[i]; else if(a[i]<min) min=a[i]; s=s+a[i]; }aver=s/10;printf("maxis%d\n",max);printf("minis%d\n",min);printf("averageis%.2f\n",aver);for(i=0;i<10;i++)if(a[i]<aver)printf("%4d",a[i]);printf("\n");}6.4二维数组和多维数组二维数组用于存放矩阵形式的数据,如二维表格等数据。定义二维数组的格式如下:<类型><数组名>[<常量表达式1>][<常量表达式2>];例如:inta[3][4];/*3×4的矩阵,共12个元素*/floatf[5][10];6.4二维数组和多维数组inta[3][4]

a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]二维数组的初始化完全初始化inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

省略行的完全初始化inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

分行完全初始化,可读性较好inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 部分初始化inta[3][4]={1,2,3,4};【例6-2】演示二维数组的定义及元素引用#include<stdio.h>main(){ inti,j,k=0; inta[3][4]; for(i=0;i<3;i++) /*变量i控制数组a的行下标*/ { for(j=0;j<4;j++) /*变量j控制数组a列下标*/ { a[i][j]=k; printf("a[%d][%d]=%d\t",i,j,a[i][j]); k++; } printf("\n"); }}6.5案例:输入学生成绩,计算每门课程的平均分【例6-3】输入3位学生的计算机、数学成绩,计算每门课程的平均分。

#include<stdio.h>main(){ floatscore[3][2],average[3],temp;charinfo[2][10]={"Computer","English"};inti,j;for(i=0;i<3;i++){ printf("No:%d\n",i+1); for(j=0;j<2;j++) {printf("%s:",info[j]); scanf("%f",&score[i][j]);}}for(i=0;i<2;i++){ temp=0; for(j=0;j<3;j++) temp=temp+score[j][i];average[i]=temp/3;printf("%s:%.2f\n", info[i],average[i]); }}6.6字符数组与字符串字符数组其实就是类型为字符型(char)的数组,每一个元素存放一个字符,主要用于存储和处理字符型数据。字符数组的定义和一般的数组一样,例如:chars[10];charstring[3][10];初始化的方法如下:chars[10]={'H','e','l','l','o','','C','+','+','!'};chars[]={'H','e','l','l','o','','C','+','+','!'};chars[10]={'H','e','l','l','o','!'}; chars[11]={"HelloC++!"};chars[11]="HelloC++!";6.7案例:逆序输出字符串#include<stdio.h>#include<string.h>main(){chars[100];inti=0;printf("Inputastring:");gets(s);while(s[i]!='\0')i++;while(--i>=0)putchar(s[i]);putchar('\n');}6.8字符串函数strlen(字符串)字符串长度函数求字符串s中第一个结束符'\0'前的字符个数。例如:chars[100]="HelloWorld!"; /*长度是12*/chart[100]="12345\06789\0"; /*长度是5*/实际上字符数组s和t实际存储长度都是100。6.8字符串函数strcpy(字符串1,字符串2)字符串复制函数函数将字符串s2复制到字符串s1。例如:chars1[20]; chars2[]="Goodluck";strcpy(s1,s2); puts(s1);/*输出Goodluck*/strcpy函数可以将结束符一起复制过去,以上复制操作也可以直接写成:strcpy(s1,"Goodluck");6.8字符串函数strcat(字符串1,字符串2)字符串连接函数函数将字符串s2连接到字符串s1后面。很显然,s1也必须有足够的空间来存储由原来的s1和s2构成的新s1字符串。例如:chars1[20]="Goodluck";chars2[]="toyou!";strcpy(s1,s2);puts(s1);/*输出Goodlucktoyou!*连接后的s1的有效字符长度为17,包括结束符在内,s1至少需要18个字符长度,否则连接是错误的。6.8字符串函数strcmp(字符串1,字符串2)字符串比较函数函数比较s1和s2字符串的大小,并返回比较的结果。若s1大于s2,则返回一个正整数。若s1等于s2,则返回0。若s1小于s2,则返回一个负整数。字符串比较规则:自左向右按ASCII码值大小进行比较,直至出现一对不同字符或者遇到结束符为止。例如:strcmp("ABC","abc")/*返回负整数,前面字符串小*/strcmp("ABC","ABC\0abc")/*返回0,二者相等*/strcmp("ABC","AB")/*返回正整数,前面的大*/strcmp("AB","ABC")/*返回负整数,前面的小*/6.8字符串函数strlwr(字符串)字符串大写变小写将字符串s的所有大写字母转换成小写字母。strupr(字符串)字符串小写变大写将字符串s的所有小写字母转换成大写字母。除了上面的几个函数以外,经常使用的还有:strncpy(字符串1,字符串2,字符个数)strncmp(字符串1,字符串2,字符个数)strstr(字符串1,字符串2)strncat(字符串1,字符串2,字符个数)6.9案例:查找最大字符串#include<stdio.h>#include<string.h>voidmain(){ chars[5][50]={"HelloWorld!", "Goodlucktoyou!", "Howareyou?", "MoonRiver", "Ilovethisbook."}; inti,max=0; for(i=1;i<5;i++) if(strcmp(s[i],s[max])>0) max=i; printf("maxstringis:%s\n",s[max]);}6.10案例:冒泡排序算法【例6-6】将10个数排序输出(冒泡法排序)【分析】所谓冒泡法,就是指找到的大数或者小数像气泡一样浮出水面被发现。为了理解算法,来看下面的例子。

6.10案例:冒泡排序算法第1次查找,范围:72918第1步:7>2,将7和2交换位置,得到27918第2步:7<9,不交换。第3步:9>1,将9和1交换位置,得到27198第4步:9>8,将9和8交换位置,得到27189第1次查找,将9作为最大数放在最后,结果为271896.10案例:冒泡排序算法第2次查找,范围:2718第1步:2<7,不交换。第2步:7>1,将7和1交换位置,得到:2178

9。第3步:7<8,不交换。第2次查找结果为:217

8

9。6.10案例:冒泡排序算法第3次查找,范围:217第1步:2>1,将2和1交换位置,得到:127

89第2步:2<7,不交换。第3次查找结果为:12

789

6.10案例:冒泡排序算法第4次查找,范围:12第1步:1<2,不交换。第4次查找结果为:12789

6.10案例:冒泡排序算法#include<stdio.h>main(){#defineN5inta[N]={7,2,9,1,8};inti,j,t;for(i=0;i<N-1;i++){for(j=0;j<N-i-1;j++) if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;} } for(i=0;i<N;i++)printf("%5d",a[i]);}变量跟踪6.11案例:字符串的连接、插入和删除#include<stdio.h>voidmain(){ chars1[100]="12345"; chars2[50]="6789"; inti,j; i=j=0; while(s1[i]!='\0')i++; while(s2[j]!='\0') { s1[i]=s2[j]; i++; j++; } s1[i]='\0'; printf("%s\n",s1);}【例6-8】编写程序删除字符串中的指定字符#include<stdio.h>main(){ chars[100]="Ilovethisprogram."; charc; inti,j; printf("Inputc:"); c=getchar(); for(i=j=0;s[i]!='\0';i++){ if(s[i]!=c) {s[j]=s[i];j++;} } s[j]='\0'; printf("%s\n",s);}【例6-8】编写程序删除字符串中的指定字符变量跟踪6.12案例:转置矩阵【例6-9】已知一个3*3的二维数组,编程将行列元素互换,生成它的转置矩阵#include<stdio.h>main(){ intt,a[3][3]={{9,8,7},{6,5,4},{3,2,1}}; inti,j; for(i=0;i<3;i++) for(j=0;j<i;j++) {t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;} for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%5d\t",a[i][j]); printf("\n"); } }6.13案例:杨辉三角形【分析】杨辉三角形是由(x+y)n展开后的多项式系数排列而成,例如:(x+y)1展开后:x+y(x+y)2展开后:x2+2xy+y2(x+y)3展开后:x3+3x2y+3xy2+y3(x+y)4展开后:x4+4x3y+6x2y2+4xy3+y4……6.13案例:杨辉三角形#include<stdio.h>#defineN10voidmain(){ inti,j,a[N][N]; for(i=0;i<N;i++){a[i][i]=1; a[i][0]=1;} for(i=2;i<N;i++) for(j=1;j<=i-1;j++)a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<N;i++) {for(j=0;j<=i;j++)printf("%5d",a[i][j]); printf("\n"); }}6.14案例:日历的打印【例6-12】输入2012年的某个月份,打印该月份的日历。6.14案例:日历的打印#include<stdio.h>voidmain(){ inti;intdaysmonth[12]={31,29,31,30,31,30,31,31,30,31,30,31}; intfirst=0; intmonth;printf("Yearis2012,Pleaseinputthemonth:");

温馨提示

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

评论

0/150

提交评论