C语言教学之数组市公开课一等奖省赛课微课金奖课件_第1页
C语言教学之数组市公开课一等奖省赛课微课金奖课件_第2页
C语言教学之数组市公开课一等奖省赛课微课金奖课件_第3页
C语言教学之数组市公开课一等奖省赛课微课金奖课件_第4页
C语言教学之数组市公开课一等奖省赛课微课金奖课件_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

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

文档简介

C程序设计1/95问题假如需要处理1名学生10门课程成绩,用什么来存放这些数据?

方法一:定义10个变量,每个变量中存放1门成绩。方法二:定义一个能够存放10门成绩一维数组。课程1课程2课程3课程4课程5课程6课程7课程8课程9课程10908193779268798394702/95变量:杯子,一个变量只能存放一个数据数组:带多个杯子托盘,一个数组能够存放多个数据3/95数轴上一维向量x={1,2,-2,1,0,3};

就相当于一维数组

4/95直角坐标系中矩阵就相当于二维数组

5/954.1一维数组4.2二维数组4.3字符数组6/95一维数组定义格式:

类型说明符

数组名[整型常量表示式];比如:int

a[10];就定义了一个包含10个整型元素数组a,它内存大小能够存放10个整型数据。4.1.1一维数组定义7/95类型说明符

数组名[整型常量表示式];int,char等都能够,说明此数组中每个元素都属于这类型命名规则与变量一致不能和其它变量重名指定元素个数,最小为0,不能是变量#defineN3inta[N];√inta[3+5];√inta[1.5];×int

n;scanf(“%d”,&n);inta[n];×int

a;inta[3];×int

a,b[3];√int

n=3;inta[n];×8/95【例4.1】判断以下数组定义是否正当,并说明原因。(1)inta[2.5];(2)inta[-3];(3)inti=3;(4)inti;inta[i];scanf(“%d”,&i);inta[i];(5)#defineN3(6)inta;inta[N];inta[3];(7)inta[2+3];(8)inti,a[3],b['0'];

9/954.1.2一维数组元素引用一维数组引用格式:

数组名[下标]

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]注意:1.数组必须先定义,再使用。2.只能逐一引用数组元素,不能一次引用整个数组。比如:inta[10];能够使用a[0]、a[1]...a[9]。若有a=1;或者a[10]

=1;犯错。a[10]不代表整个数组,它是下标为10元素,越界!110/953.下标能够是常量或变量,它表示元素序号。比如:inti=3,a[10];

a[i]=1;√表示给下标为3元素赋值为1。4.一维数组在内存中连续存放,先存放下标为0元素,再存放下标为1元素,依次直至存放完全部元素。11/95【例4.2】定义一个包含3个整型元素数组a,输出其元素值。只定义数组,不给数组元素赋值,数组元素中存放是随机值。普通要先给数组元素赋值,再使用。12/95数组名a中存放是数组起始元素地址13/95【例4.3】定义一个包含3个整型元素数组

a,从键盘给数组元素输入值,然后输出。14/95【例4.4】定义一个包含10个整型元素数组a,

从键盘给数组元素输入值,然后输出。15/954.1.3一维数组初始化定义一维数组同时给数组元素赋初值称为一维数组初始化。其普通格式为:类型说明符

数组名[N]={初值1,初值2,……,初值N};其中,N是表示数组元素个数常量。16/95一维数组初始化方式有以下几个:(1)全部元素初始化:chara[3]={‘1’,‘2’,’\n’};intb[5]={2,11,3,14,5};intb[]={2,11,3,14,5};intb[4]={2,11,3,14,5};在对数组全部元素赋初值时,能够不指定数组长度。系统自动定义其长度为5初值个数不能超出数组长度。不然,会出现语法错误。17/95(2)全部元素初始化:

inta[10]={0,1,2};chara[10]={‘1’,‘2’};

(3)全部元素初始化为0:inta[10]={0};将a[0]~a[2]依次初始化为0、1、2。未赋值元素a[3]~a[9]值全部被初始化为int中表示假值0。将元素a[0]~a[9]全部初始化为0将a[0]~a[1]依次初始化为’0’、’1’。未赋值元素a[2]~a[9]值全部被初始化为char中表示假值’\0’。若想全部初始化为1inta[10]={1};错误18/95【例4.5】定义一个含有10个元素整型一维数组并全部初始化,将数组中全部元素逆序输出。19/95【例4.6】

:用冒泡法对5个数排序。

解:冒泡排序过程如后面图所表示,其中,红圈以内为已排好序统计。

规则:令相邻位置数依次比较,若上面数大,则交换。20/9541413524>1交换4>3交换34<5不交换525>2交换11<3不交换343<4不交换24>2交换5132451<3不交换3>2交换123451<2不交换结果12345R[]第0趟第1趟

第2趟

第3趟第0次第1次第2次第3次for(i=0;i<4;i++)//外循环假如(R[j]值>R[j+1]值)则交换j增1

for(j=0;j<4−i;j++)//内循环假如(R[j]值<R[j+1]值)则不交换j增1冒泡算法逻辑过程ij21/95R[2]R[1]

i=0,j=1;比较R[j]和R[j+1]大小

inttemp;

//定义新存放单元

假如(R[1]值>R[2]值)

{

tempR[1];

R[1]R[2];

R[2]temp;

}j增加1,比较R[j]和R[j+1]大小

假如(R[j]值<R[j+1]值)j增加1,比较R[j]和R[j+1]大小实现交换43交换R[1]R[2]43不交换4R[2]5R[3]2R[4]temp2.交换过程与核心程序43422/95

inti;

intj;

for(i=0;i<=3;i++)for(j=0;j<=3−i;j++)inttemp;if(R[j]大小>R[j+1]大小)tempR[j];R[j]R[j+1];R[j+1]temp;

3.循环与核心程序组合

inti,j;类型一样,合并在一起外循环,将处理5个数推广处处理n个数

for(i=0;i<=n-2;i++)内循环for(j=0;j<=n−i−2;j++)定义新存放空间,置前,预防重复定义inttemp;比较大小判断是否满足交换条件if(R[j]>R[j+1])满足交换条件,则交换;在程序中将赋值箭头转换为赋值等号temp=R[j];R[j]=R[j+1];R[j+1]=temp;

{}标出交换起始位置标出内循环起始位置{}标出外循环起始位置{}23/954.冒泡算法整理inti,j;//定义int类型变量i,jinttemp;//定义新存放单元temp for(i=0;i<=n-2;i++)//外循环for1

{//外循环for1开始 for(j=0;j<=n-2-i;j++)//内循环for2

{//内循环for2开始if(R[j]>R[j+1])//比较数组R[]中相邻元素值大小

{//开始交换 temp=R[j]; //先将R[j]中值赋给tempR[j]=R[j+1];//再将R[j+1]中值赋给R[j]

R[j+1]=temp;//最终又把temp中值赋给R[j+1]

}//结束交换

}//内循环for2结束}//外循环for1结束//经过n-1=4次循环,完成排序功效24/955.冒泡算法真实程序25/9526/956.优化推广程序27/9528/95改进冒泡排序算法比如:待排序数组元素为:3,1,2,5,429/9531312453>1交换3>2交换22<4不交换4511<3不交换233<4不交换454<5不交换1<2不交换结果12345R[]i=0i=1j=0j=1j=2j=3排好设置一个标识量,若某趟中一次交换也没有进行,设置标识量值,代表数据已完全排好,不需要进行后面排序。30/95【例4.7】改进冒泡排序算法。31/9532/95【例4.8】从键盘输入10个学生成绩,计算出

平均成绩,并输出高于平均分学生成绩。33/9534/95【例】求fibonacci数列前20项,并输出。fibonacci:1,1,2,3,5,8,13,21……

35/954.1一维数组4.2二维数组4.3字符数组36/95问题假如需要处理3名学生期末成绩,每名学生有4门课程成绩,用什么来存放这些数据?方法一:定义12个变量,每个变量存放1个学生1门课程成绩。方法二:为3名学生各定义3个数组,每个数组能够存放4门成绩。方法三:用一个3行4列二维数组来存放。成绩表数学英语计算机C语言学生1928996.580学生288.5679070学生37190886037/954.2.1二维数组定义1.格式:

类型说明符

数组名[常量表示式M][常量表示式N];例:float

a[3][4];0120123M和N只能是正整数38/95例:float

a[3][4]2.二维数组能够看成是由一维数组组成39/953.二维数组在内存中连续存放,先次序存放第一行元素,再存放第二行元素,依次直至存放完全部元素。40/954.2.2二维数组引用引用格式:数组名[行下标][列下标];例:int

a[2][3];a[0][0]、a[0][1]、a[0][2]a[1][0]、a[1][1]、a[1][2]1215365813常出现错误:下标越界!a[2][3]=3;

/*应为a[1][2]=3;*/41/954.2.3二维数组初始化1、分行赋初值:

例:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

12345678

91011122、全部数据写在一个花括号内,按数组排列次序对各元素赋初值:例:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};赋初值时,数组行下标能够省略,比如:inta[][4]=...。42/953、对部分元素赋初值:(1)inta[3][4]={0,1,2};

0

1

2000000000

功效:仅对a[0][0]、a[0][1]、a[0][2]赋值,其余为0(2)inta[3][4]={{1},{5,6},{9}};

10

0

0

5

600

9000

功效:仅对a[0][0]、a[1][0]、a[1][1]、a[2][0]赋值,其余为043/95【例4.9】求一个3*4矩阵最大值及其所在

行列下标。44/9545/95【例4.10】3名学生各有4门课程成绩,计算每个学生平均成绩。46/95【例4.11】打印输出杨辉三角形(输出前10行)47/9548/9549/95多维数组定义格式:

类型

数组名[常量表示式1][常量表示式2]…;例:int

a[3][3][3];注意:多维数组元素在内存中排列次序是按行存放。引用格式:

数组名[下标][下标]…例:a[0][0][0]=100;a[0][1][2]=20;a[2][2][2]=50;一个n维数组能够看成由多个n-1维数组组成。50/954.1一维数组4.2二维数组4.3字符数组51/95在程序中假如要存放姓名、地址等类型数据,例如:“小明”、“成城市高新西区西园大道1号”等需要使用什么样类型呢?这些是字符串,C语言中没有专门字符串变量,假如要存放字符串,需要用到字符数组。字符数组是专门用来存放字符数据。字符数组中一个元素存放一个字符。52/954.3.1字符数组字符数组中能够存放普通字符序列,也能够存放字符串,二者依据字符数组末尾是否有字符串结束符‘\0’来区分。比如:53/95(1)charc[11]={“Iamhappy”};或charc[]={“Iamhappy”};(2)charc[11]=“Iamhappy”;或charc[]=“Iamhappy”;(3)charc[11]={‘I’,‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’,‘p’,‘y’,‘\0’};或charc[]={‘I’,‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’,‘p’,‘y’,‘\0’};(4)charc[11]={‘I’,‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’,‘p’,‘y’};这四种方式,字符数组c存放是字符串54/95(5)charc[10]={‘I’,‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’,‘p’,‘y’};或charc[]={‘I’,‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’,‘p’,‘y’};这种方式,字符数组c存放是普通字符序列55/95若要重新给字符数组(字符串变量)赋值,使它改而存放别字符串,应注意以下几点:

(1)应充分预计新字符串所需最大空间,不要出现越界情况。比如:charc[]=“fish”;数组c长度是5。若要将“chicken”赋给c,新字符串需要8个字节内存空间,就会犯错。为了预防这类错误发生,习惯上将字符数组长度设置大一些。比如:charc[20]=“fish”;56/95(2)不能使用赋值语句对字符串变量集体赋值,而应该使用赋值语句为每个字符数组元素单独赋值。比如:charc[]=“fish”;若要将数组c内容修改为“cat”,直接写为:c=“cat”;或者c[]=“cat”;都是错误。能够对c中元素逐一重新赋值:c[0]=‘c’;c[1]=‘a’;c[2]=‘t’;c[3]=‘\0’;注意:不要省略给c[3]赋值为‘\0’,不然c中新字符串内容为“cath”。57/954.3.2字符数组输入输出一、使用scanf函数输入字符串到字符数组中。(1)以单个字符格式逐一输入。

比如:charc[5];scanf(“%c%c%c%c%c”,&s[0],&s[1],&s[2],&s[3],&s[4]);数组元素跟普通变量一样,前面要加取地址符58/95(2)以字符串格式输入。

比如:charc[5];scanf(“%s”,c);说明:1.‘%s’是字符串格式字符,数组名代表数组起始地址,所以输入表列中只需要给出数组名即可。若写为&c,程序犯错。2.输入字符串时,空格或者回车键是输入结束符,不能作为有效字符输入。

59/95假如从键盘输入cat↙或者cat□↙。数组c中存入cat后,C编译系统会自动在后面补上一个‘\0’。3.输入字符串长度应该比字符数组长度短。比如:从键盘输入catcat↙,数组c中存入catca,没有‘\0’位置,轻易出现内存错误。60/954.能够用scanf输入多个字符串,输入时以空格键或回车键隔开。比如:charc1[5],c2[5],c3[5];scanf(“%s%s%s”,c1,c2,c3);从键盘输入Cat□or□dog?↙61/95二、使用printf函数将字符数组中字符串输出。(1)以单个字符格式逐一输出。

比如:charc[5];printf(“%c%c%c%c%c”,c[0],c[1],c[2],c[3],c[4]);(2)以字符串格式输出,将数组名写在输出表列中。

比如:charc[5];printf(“%s”,c);62/95注意:(1)若数组长度大于字符串实际长度,也只输出到碰到‘\0’结束。比如:charc[10]={“China”};printf(“%s”,c);(2)假如一个字符数组中包含一个以上’\0’,则遇第一个‘\0’时输出就结束。63/95【例4.12】删除字符串中空格,并输出。64/95三、使用scanf和printf为二维数组输入输出字符串二维数组可看作由一维数组组成。假如将一维字符数组看作是存放字符串变量,那么二维字符数组就可以看作是存放字符串一维字符串数组。比如:定义charc[3][5];相当于定义了3个字符串变量。c[0]、c[1]、c[2]分别是3个字符串起始地址。能够使用scanf和printf函数为其输入、输出字符串。65/95【例4.13】利用二维字符数组输入、输出字符串。66/95【例】输出一个菱形图。67/954.3.3字符串处理函数C语言提供了多个惯用字符串处理函数。字符串输入函数、输出函数、比较函数、连接函数及求字符串长度等函数。注意:字符串函数均在头文件string.h中定义,要使用这些函数,需将此文件包含进来。有编译器会自动包含。68/951.字符串输出函数puts格式:puts(字符串)

功能:将字符串结束符‘\0’转换成‘\n’后输出字符串。

比如:charc[6]=“China”;执行函数:puts(c);

等价于:printf("%s\n",c);

puts函数也能够直接输出字符串常量。比如:puts(“China”);69/952.字符串输入函数gets格式:gets(字符数组)

功能:从键盘输入一个字符串到字符数组中。比如:chars[10];执行函数:gets(s);从键盘输入:China↙

将包含‘\0’在内6个字符送到字符数组s中。70/95gets、puts与scanf、printf函数使用区分:(1)gets()、puts()函数一次只能输入输出一个字符串;scanf()、printf()则能够输入输出多个字符串。

比如:chars1[10],s2[10];1.gets(s1);gets(s2);puts(s1);puts(s2);2.scanf(“%s%s”,s1,s2);printf(“%s\n%s\n”,s1,s2);

71/95(2)使用gets函数输入字符串以回车符结束;而scanf函数以空格或回车符结束字符串输入。比如:chars1[30],s2[30];从键盘输入HELLOWORLD!↙,1.执行gets(s1);gets(s2);执行结果:s1中存入字符串“HELLOWORLD!”,光标等候用户再次输入字符串,从键盘输入helloworld!↙s2中取得字符串“helloworld!”。72/95比如:chars1[30],s2[30];从键盘输入HELLOWORLD!↙,2.执行scanf(“%s%s”,s1,s2);执行结果:s1中存入字符串“HELLO”,s2中存入字符串“WORLD!”。73/953.字符串连接函数strcat格式:strcat(字符数组1,字符数组2或字符串)功能:把字符数组2中字符串连接到字符数组1中字符串后面,结果放到字符数组1中。注意:1)数组1必须足够大,以容纳连接后新字符串。2)连接时串1后面‘\0’被覆盖,只在新串后保留1个’\0’字符数组2可为字符串常量,1呢?74/95比如:chars[10]=“te”;strcat(s,“st!”);执行过程中数组s存放情况:75/95【例4.14】使用strcat函数实现两个字符串连

接功效。76/95【例4.15】不使用strcat函数实现两个字符串连接功效。77/954.字符串复制函数strcpy格式:strcpy(字符数组1,字符数组2或字符串)

功能:将字符串2复制到字符数组1中,该字符数组1中原有内容被覆盖。说明:(1)字符数组1必须足够大,能容纳复制过来字符串(2)复制时连同‘\0’一起复制到字符数组1中。78/95(3)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。比如:charstr1[30]=“China”,str2[30];str2=str1;(4)能够用strncpy函数将字符串2中前n个字符复制到字符数组中。字符数组其它位置元素不发生变换。比如:charstr1[30]="Chengdu";charstr2[30]="Beijing";strncpy(str1,str2,2);执行结果:str1为Beengdu。79/95【例4.16】使用strcpy函数实现字符串拷贝。80/95【例4.17】不使用strcpy函数实现字符串拷贝。81/955.字符串比较函数strcmp格式:strcmp(字符串1,字符串2)功能:比较“字符串1”和“字符串2”。比较规则:自左至右逐一字符比较ASCII码,直到遇到不一样字符或‘\0’,比较结果由函数值带回。

①字符串1<字符串2,函数返回负整数,-1②字符串1==字符串2,函数返回0③字符串1>字符串2,函数返回正整数,1比如: strcmp(“a”,“b”);函数返回-1即:“a”<“b” strcmp(“china”,“china”);函数返回为0

温馨提示

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

评论

0/150

提交评论