《c语言程序设计基础》4数组课件

PPT
  • 阅读 57 次
  • 下载 0 次
  • 页数 67 页
  • 大小 427.523 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
《c语言程序设计基础》4数组课件
可在后台配置第一页与第二页中间广告代码
《c语言程序设计基础》4数组课件
可在后台配置第二页与第三页中间广告代码
《c语言程序设计基础》4数组课件
可在后台配置第三页与第四页中间广告代码
《c语言程序设计基础》4数组课件
《c语言程序设计基础》4数组课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 67
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】《c语言程序设计基础》4数组课件.ppt,共(67)页,427.523 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44443.html

以下为本文档部分文字说明:

第4章数组和字符串2第4章数组4.1一维数组4.2二维数组4.3字符数组4.4数组元素的查找和排序本章内容3第4章数组构造类型数据是由一些基本类型数据按照一定的规则组成。数组类型是构造类型数据的一种。数组是有序数据

的集合,数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。例如:intsum[3];说明一个整型数组,数组名称sum,共有3个int型变量元素:sum[0],sum[1],sum[2]注意:数组名

代表该数组在内存中的首地址。4第4章数组数组的基本概念:所谓数组,是若干个相同类型数据元素的有序集合。所起的名字称为数组名。用对应的序号来区分这个集合中的一个个元素。序号称为数组元素的下标用一个下标来区分其元素的数组,称为一维数组;用两个

或多个下标来区分其元素的数组,称为二维数组或多维数组54.1一维数组本节内容4.1.2一维数组的初始化4.1.3一维数组元素的引用4.1.4一维数组的应用举例4.1.1一维数组的定义64.1一维数组只有一个

下标变量的数组叫做一维数组。数组是一组变量,这组变量具有相同的名字,相同的数据类型,并且在存储器中连续存放。每一个变量称为数组的一个“数组单元”,保存在其中的数据值称为“数组元素”。用“下标变量”来标识﹑区分数组中的各数组元素。数组按下标个数分类有一维﹑二维﹑

三维数组等。一维数组的数组名后只有一对方括号,而二维数组的数组名后面有两对方括号。74.1.1一维数组的定义一维数组的定义方式为:类型说明符数组名[常量表达式];例如:inta[6];如图,编译时分配连续内存单元。a[0]0145a[1

]a[2]a[3]a[4]a[5]23a8注意事项:①数组名的命名遵循标识符命名规则。②类型说明符说明该数组中数组元素的数据类型。③数组名后是用方括号括起来的常量表达式。④方括号中的常量表达式表示数组中元素的个数。⑤C语言规定数组元素的下标从0开始,因此在inta[10]

中的10个元素,分别为a[0]~a[9],不能使用a[10]。⑥方括号中的常量表达式可以是常量或者符号常量,但不能包含变量。94.1.2一维数组的初始化数组的初始化即为数组元素赋初始值⑴用赋值语句为数组元素赋初值。例如:inta[10]

;a[0]=0;a[1]=1;a[2]=2;„„⑵在定义数组时对数组全部元素赋初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};⑶在定义数组时对数组中一部分元素赋值。例如:inta[10]={0,1,2,3,4};⑷在定义数组时给数组全部

元素赋值为0。⑸为全部数组元素赋初值时,可以不指定数组长度。例如:inta[]={0,1,2,3,4};104.1.3一维数组元素的引用数组元素引用的一般形式为:数组名[下标]引用数组元素的几点说明:①下标可以是整型常量或整型表达式。例如

:“a[0]=a[1]+a[2]*a[3]-a[5-2]”②C语言中数组元素的下标从0开始,并且数组元素的下标一定要小于数组的长度。③C语言规定只能逐个引用数组元素,而不能一次引用整个数组。C语言规定,数组名就是分配给该数组存储区的首地址,即

数组第一个元素存放的地址。114.1.3一维数组元素的引用{inta[10];inti,max,min;printf("Pleaseinput:");for(i=0;i<10;i++)scanf("%d",&a

[i]);max=a[0];min=a[0];for(i=0;i<10;i++)if(a[i]>max)max=a[i];elseif(a[i]<min)min=a[i];printf("max=%d;min=%d",max,min);}124.

1.4一维数组的应用举例#include<stdio.h>main(){intscore[10];//10个评委的评分floatmark;//记录最后得分inti;intmax=-1;//最高分intmin=101//最低分i

ntsum=0;//10个评委评分的总和for(i=0;i<10;i++)//输入10个分数{printf("PleaseEntertheScoreofNo.%d:",i+1);scanf("%d",&score[i]);sum=sum+scor

e[i];}134.1.4一维数组的应用举例for(i=0;i<10;i++)//遍历数组,找最高分{if(score[i]>max)max=score[i];}for(i=0;i<10;i++)//遍历数组,找最低分{if(score[i]<min)min=scor

e[i];}mark=(sum-max-min)/8.0;//求平均printf("Themarkofthissingeris%4.2f\n",mark);}144.1.4一维数组的应用举例154.1.4一维数组的应用举例利

用数组计算Fibonacci数列的前10个数,并按每行打印5个数的格式输出。其中:Fibonacci数列计算公式如下:F1=1,F2=1,F3=F1+F2,„,Fn=Fn-2+Fn-1。#include<stdio

.h>voidmain(){inti;intf[10]={1,1};//用数组存储Fibonacci数列,并赋初值//f[0]=1,f[1]=1,f[2]=f[3]=……f[9]=0for(i=2;i<10;i++)//为f[2]~f

[9]按计算公式重新赋值f[i]=f[i-2]+f[i-1];164.1.4一维数组的应用举例for(i=0;i<10;i++)//输出10个Fibonacci数{printf("%d\t",f[i]);if((i+1)%5==0)//i+1为当前输出的Fibonacci数的序

号printf("\n");//每输出五个数换行}}174.1二维数组本节内容4.2.2二维数组的初始化4.2.3二维数组元素的引用4.2.4二维数组的应用举例4.2.1二维数组的定义184.2.1二维数组的定义

二维数组定义的一般形式为:类型说明符数组名[常量表达式1][常量表达式2];例如,“inta[2][3];”(注意,不能写成“inta[2,3];”)定义了数组a。数组a为3行4列的整型数组,即数

组元素为:a[0][0],a[0][1],a[0][2]a[1][0],a[1][1],a[1][2]194.2.1二维数组的定义二维数组可以看作是由一维数组嵌套构成的。我们可以把二维数组看作是一种特殊的一维数组:它的元素

又是一个一维数组。例如,可以把数组a看作一个一维数组,它有三个元素:a[0]、a[1],每一个元素又是一个包含3个元素的一维数组。a[0]a[0][0]a[0][1]a[0][2]a[1]a[1][0]a[1][1]a[1][2]204.2.2二维数组的初始化⑴

按行分段整体初始化。inta[3][4]={{1,4,6,6},{4,6,7,1},{8,4,1,0,}};⑵按行连续整体初始化。inta[3][4]={1,4,6,6,4,6,7,1,8,4,

1,0};⑶按行分段部分初始化。inta[3][4]={{5,7,1},{8,5},{2,5,6}};⑷按行连续部分初始化。inta[3][4]={2,5,8,6,2,4,7,2,1,};⑸如果提供全部的初始值,在定义时可不指明第一维的长度。int[][4]={4

,5,0,1,3,5,7,6,1,0,2,3};214.2.3二维数组元素的引用维数组元素的表示形式为:数组名[下标1][下标2]下标可以是整型常量或整型表达式。要严格区分定义数组时的inta[3][4]和引用元素时的a[3][4]。定义时,a[3][4]

用来定义数组的维数和各维的大小。引用时,a[3][4]中的3和4是下标值,显然引用数组a中第4行第5列位置上的的元素a[3][4]是错误的,因为二维数组的下标和一维数组一样都是从0开始,即数组a的下标1的范围是0~2,下标2的范围是0~3。224.2.4二维数组的应用举例#

include<stdio.h>#defineN3main(){inti,j,n;inta[N][N],b[N][N];printf("pleaseinput:\n");for(i=0;i<=N-1;i++)//循环输入for(j=0;j<=N-1;j++){printf("a[%

d][%d]:",i,j);scanf("%d",&a[i][j]);}for(i=0;i<=N-1;i++)//a行列互换得到转置矩阵存入bfor(j=0;j<=N-1;j++)b[i][j]=a[j][i];234.2.

4二维数组的应用举例for(i=0;i<=N-1;i++)//输出两个矩阵{for(j=0;j<=N-1;j++)//输出数组a的第i+1行{printf("%2d",a[i][j]);}printf("\t");

//矩阵的间隔for(j=0;j<=N-1;j++)//出数组b的第i+1行{printf("%2d",b[i][j]);}printf("\n");}}244.2.4二维数组的应用举例254.3字符数组本节内容4.3.2字符串与字符数组4.3.3字符数组的初始化4.3.4字符数组的引用

4.3.1字符数组的定义264.3字符数组本节内容4.3.6常用字符串处理函数4.3.7综合应用举例4.3.5字符数组的应用举例274.3.1字符数组的定义用来存放字符数据的数组是字符数组,字符数组中的一个数组元素存放一个字符。字符数组的定

义一般形式如下:char数组名[常量表达式]例如“charc[10];”定义了一个一维字符数组c,它的长度为10,可以存放10个字符或一个长度不大于9的字符串。又如“charc[3][5];”定义了一个二维字符数组c,它可以存放15个字符或3个长度不大于4的字符串。284

.3.2字符串与字符数组C语言中有字符串常量,却没有字符串变量,通常用字符数组来存放字符串。字符串是以’\0’作为结束符的字符序列。当一个字符串存入字符数组时,C编译系统会自动将结束符‘\0’存入数组,以此作为该字符串结束的标志,这

要比用字符逐个的给字符数组赋值多占一个字节来存放字符串结束标志‘\0’。如:charc[8]="LiChen";Li□Chen\0294.3.2字符串与字符数组采用‘\0’标志作为字符串的结束标志后,在用字符串赋初值时无需指定数组的长度,可以

由编译系统自动处理。如:charc[]="LiChen";在内存中占8个字节,分别存储‘L’,‘i’,‘’,‘C’,‘h’,‘e’,‘n’和‘\0’。字符串常量“LiChen”,代表字符串所在内存的首地址,而不是字符串序列本身,所以只能在定义数组时用字符串常量初始化,不能给已经定义好的

数组赋字符串常量。如不能:charc[10];C[10]="LiChen";304.3.3字符数组的初始化⑴对字符数组初始化,最容易理解的方式是用字符常量初始化字符数组。如:charc1[10]={'I','','a','m','','h','a','

p','p','y'};⑵用字符串常量初始化字符数组。如:charc4[]="Iamhappy";charc5[11]="Iamhappy";总之,对字符数组赋值可以有以下几种形式:charc6[8]="LiChen";charc7[]="LiChen"

;charc8[]={'L','i','','C','h','e','n'};314.3.3字符数组的初始化区分'0'与'\0''\0'=0逻辑假'0'=48逻辑真'0'与'\0'324.3.3字符数组的初始化区分'A'与"A"'A'"A"1.占1个字节;2.是数值;3.格式符"%c";4

.赋值方式:charch;ch='A';或charch='A';1.占2个字节;2.是地址;3.格式符"%s";4.赋值方式:chars[2];strcpy(s,"A");或chars[2]="A";334.3.4字符数组的引用字符数组的引用和前边介绍过的数组的

引用是一样的,只不过引用字符数组中的一个元素,我们得到的是一个字符。charc[]="LiChen";charf=c[3];f的内容为:‘C‘344.3.5字符数组的应用举例#include<stdio.h>main(){charc[10]={'I','','a','m'

,'','a','','b','o','y'};inti;for(i=0;i<10;i++)printf("%c",c[i]);printf("\n");}354.3.5字符数组的应用举例#include<stdio.h>main(){chardiamond[][5]={{''

,'','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};inti,j;for(i=0;i<5;i++){for(j

=0;j<5;j++)printf("%c",diamond[i][j]);printf("\n");}}364.3.5字符数组的应用举例可以用printf()函数和scanf()函数一次性输入输出一个字符串,而不必使用循环语句逐个地输入输出每个字符。#include<stdio.h>ma

in(){charc[10];scanf("%s",c);printf("%s\n",c);}374.3.5字符数组的应用举例#include<stdio.h>main(){charnum[4],name[20],sex[]="male";inti;printf("Please

inputNum:");for(i=0;i<4;i++)scanf("%c",&num[i]);printf("PleaseinputName:");scanf("%s",name);printf("Num:%s\nName:%s\nSex:%s\n",num,name,sex);}384.3.

5字符数组的应用举例394.3.6常用字符串处理函数C语言标准库提供了丰富的字符串处理的函数,大致可分为字符串基本处理函数和字符串与数值数据的转换函数两类。字符串基本处理函数包含在头文件string.h中,

字符串与数值数据的转换函数包含在头文件stdlib.h中。使用这类函数可以大大减轻编程量。下面介绍几个最常用的字符串函数。404.3.6常用字符串处理函数4.3.6.1gets()函数格式:char*gets(char*string);功

能:从标准输入流中取一个字符串。4.3.6.2puts()函数格式:intputs(char*string);功能:拷贝以空字符'\0'终结的字符串到标准输出流。414.3.6常用字符串处理函数#include<st

dio.h>intmain(void){charstring[80];printf("Inputastring:");gets(string);printf("Thestringinputwas:");puts(string);return

0;}424.3.6常用字符串处理函数如果用scanf函数输入字符串时,空白符用于分隔字符串,所以输入的字符串中不能包含空格。如果用gets函数输入字符串,当输入的字符串中含有空格时,空格是字符串中的有效字符,输出中

包含空格。表示gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束,并把回车转换为’\0’。建议用gets函数输入字符串。434.3.6常用字符串处理函数gets()函数和scanf()函数的区别gets()scanf()输入的字符串中可包含空格

输入的字符串中不可包含空格只能输入一个字符串可连续输入多个字符串不可限定字符串的长度可限定字符串的长度遇到回车符结束遇到空格符或回车符结束444.3.6常用字符串处理函数4.3.6.3strcat()函数格式:strcat(字符数组名1,字符数组名2);功能:

字符串连接函数,把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志‘\0’。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。本函数返回值是字符数组1的首地址。454.3.6常用

字符串处理函数#include<stdio.h>#include"string.h"main(){staticcharst1[30]="Mynameis";charst2[10];printf("inputyourname:\n");gets(

st2);strcat(st1,st2);puts(st1);}464.3.6常用字符串处理函数4.3.6.4strcpy()函数格式:strcpy(字符数组名1,字符数组名2);功能:把字符数组2中的字符串拷贝到字符数组1中。串

结束标志‘\0’也一同拷贝。字符数组名2,也可以是一个字符串常量。这时相当于把一个字符串赋给一个字符数组。前面讲过,字符串常量是个地址,不能直接赋给一个字符数组。要给一个字符数组赋一个字符串常量只能用strcpy()函数。474.3

.6常用字符串处理函数#include<stdio.h>#include"string.h"main(){staticcharst1[15],st2[]="CLanguage";strcpy(st1,st2)

;//或:strcpy(st1,"CLanguage");puts(st1);printf("\n");}484.3.6常用字符串处理函数4.3.6.5strcmp()函数格式:strcmp(字符数组名1,字符数

组名2);功能:字符串比较函数,按照ASCII码逐位比较两个数组中字符串的对应位,并由函数返回值返回比较结果。字符串1=字符串2,返回值=0;字符串1>字符串2,返回值>0;字符串1<字符串2,返回值<0。

本函数也可用于比较两个字符串常量,或比较数组和字符串常量。494.3.6常用字符串处理函数#include<stdio.h>#include"string.h"main(){intk;staticcharst1[15],st2[]="CLanguage";pr

intf("inputastring:\n");gets(st1);k=strcmp(st1,st2);if(k==0)printf("st1=st2\n");if(k>0)printf("st1>st2\n");if(k

<0)printf("st1<st2\n");}504.3.6常用字符串处理函数4.3.6.6strlen()函数格式:strlen(字符数组名);功能:测字符串长度函数,测字符串的实际长度(不

含字符串结束标志'\0')并作为函数返回值。514.3.6常用字符串处理函数#include<stdio.h>#include"string.h"main(){intk;staticcharst[]="Clanguage";

k=strlen(st);printf("Thelenthofthestringis%d\n",k);}524.3.7综合应用举例#defineN100#include<stdio.h>main(){chari,len;chars

tring[N],c;printf("pleaseinputastring:\n");gets(string);printf("pleaseinputachar:\n");scanf("%c",&c);for(i=0;string[i]!='\0';i++)//计算字符串中字

符的个数;//循环体为空len=i;534.3.7综合应用举例for(i=0;string[i]!='\0';i++)//在字符串中查找变量c中所存字符if(string[i]==c)break;//若找到,则退出循环if(i+1<=le

n)printf("found%d\n",i+1);//i从0开始若找到则字符的位置应为i+1elseprintf("notfound\n");}544.3.7综合应用举例#include<stdio.h>#include<string.h>main(){charpassword[]="t

cass";charp[80];inttime=0;do{printf("Enterpassword:");gets(p);if(strcmp(p,password)==0){printf("OK!welcome\n");break;}elsetime++;

}while(time<3);554.3.7综合应用举例if(time==3)printf("Youareillegaluser\n");}564.4数组元素的查找和排序本节内容4.4.2数组元素的排序4.4.1字符元素的查找574.4.1字符元素的查找#include<stdio.h

>voidmain(){inta[10];inti,max,min;printf("Pleaseinput:");for(i=0;i<10;i++)//输入10个数存入数组ascanf("%d",&a[i]);max=a[0];min=a[0];//假定最大最小值均是a[

0]for(i=1;i<10;i++)//遍历数组依次与max和min比较if(a[i]>max)max=a[i];//若a[i]>max,则修改max的值elseif(a[i]<min)min=a[i];//若a[i]<min,

则修改min的值printf("max=%d;min=%d",max,min);}584.4.2数组元素的排序所谓排序(sorting)就是把数组中的元素按其值递增或递减的次序排列排序算法冒泡排序法选择排序法594.4.2数

组元素的排序4.4.2.1冒泡排序法1.第一趟冒泡排序:比较第1个数与第2个数,若为逆序a[0]>a[1],则交换;然后比较第2个数与第3个数;依次类推,直至第n-1个数和第n个数比较为止。结果最大的数被安置在最后一个元素位置上。2.第二趟冒泡排序

:对前n-1个数进行冒泡排序,结果使次大的数被安置在第n-1个元素位置。3.重复上述过程,经过n-1趟冒泡排序后结束。4.在第j趟比较中,要进行n-j次两两比较。604.4.2数组元素的排序for(i=0;i<N;i++)输入a[i]for(j=1;j<N;j++)for(i=0;i<N-j

;i++)a[i]>a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]614.4.2数组元素的排序38496576132730第二趟384965132730第三趟3849132730第四趟38132730第五趟132

730第六趟1327第七趟4938659776132730第一趟3849769713972797309713767676273013652765306513134949304927382738303813每趟结束时,不仅能挤出一个最大值

到最后面位置,还能同时部分理顺其它元素;62数组元素的排序和查找例4.13:将10个整数按照从小到大的顺序排序#include<stdio.h>#defineNUM10voidmain(){inta[NUM],i,j,temp;printf("in

put%dnumbers:\n",NUM);for(i=0;i<NUM;i++)scanf("%d",&a[i]);for(i=1;i<NUM;i++)//趟数,共NUM-1趟for(j=0;j<NUM-i;j++)//实现一次冒泡操作if(

a[j]>a[j+1])//交换a[j]和a[j+1]{temp=a[j];a[j]=a[j+1];a[j+1]=temp;}printf("thesortednumbers:\n");for(i=0;i<NUM;i++)prin

tf("%d",a[i]);}634.4.2数组元素的排序对冒泡排序的改进:在一次冒泡排序过程中如果发现没有交换操作,表明序列已经排好序了,便终止冒泡操作。为了标记在比较过程中是否发生了数据交换,在程序中设立一个标志变

量flag。在每趟比较前,把flag变量置为0;如果在这趟比较过程中发生了交换,把变量flag的值置为1。在这一趟比较结束后判断:如果flag变量取值等于0,表示可以结束排序过程,否则进行下一趟比较。64数组元素的排序和查找例4.13:将10个整数

按照从小到大的顺序排序#include<stdio.h>#defineNUM10voidmain(){inta[NUM],i,j,temp,flag;printf("input%dnumbers:\n",NUM);for(i=0;i<NUM;i++)scanf

("%d",&a[i]);for(i=1;i<NUM;i++)//趟数,共NUM-1趟for(j=0;j<NUM-i;j++)//实现一次冒泡操作{flag=0;if(a[j]>a[j+1])//交换a[j]和a[j+

1]{temp=a[j];a[j]=a[j+1];a[j+1]=temp;flag=1;}if(flag==0)break;}printf("thesortednumbers:\n");for(i=0;i<NUM;i++)printf("%d",a[

i]);}654.4.2数组元素的排序4.4.2.2选择排序法1.将第1个数依次与第2个数、第3个数„第n个数进行比较,若为逆序a[0]>a[i],则交换。第一趟选择排序的结果,最小的数被安置在第一个元素位置上。

2.将第2个数依次与第3个数、第4个数„第n个数进行选择排序。第二趟选择排序的结果,次小的数被安置在第二个元素位置上。3.重复上述过程,经过n-1趟冒泡排序后结束。4.在第j趟比较中,要进行n-j次两两比较。664.4.2数组元素的排序for(i=0

;i<N;i++)输入a[i]for(j=0;j<N-1;j++)for(i=j+1;i<N;i++)a[j]>a[i]TFa[j]与a[i]交换输出a[0]~a[N-1]67数组元素的排序和查找例4.14:将10个整数按照从小到大的

顺序排序#include<stdio.h>#defineNUM10voidmain(){inta[NUM],i,j,temp;printf("input%dnumbers:\n",NUM);for(i=0;i<NUM;i++)//输入NUM个整数{scanf("%d",&a[i]);}for(j=

0;j<NUM-1;j++)//确定基准位置for(i=j+1;i<NUM;i++)if(a[j]>a[i]){temp=a[j];a[j]=a[i];a[i]=temp;}//输出排好序的数据printf("thesortednumbers:\n");for(i=0;i<NU

M;i++)printf("%d",a[i]);}

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 6921
  • 被下载 8
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?