3- 利用数组处理同类型的批量数据_第1页
3- 利用数组处理同类型的批量数据_第2页
3- 利用数组处理同类型的批量数据_第3页
3- 利用数组处理同类型的批量数据_第4页
3- 利用数组处理同类型的批量数据_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

教学内容: 第1章:C语言语法基础第2章:C程序设计基础第3章:利用数组处理同类型的批量数据第4章:利用函数实现模块化程序设计第5章:灵活使用指针第6章:结构体、共用体、枚举类型及其应用第7章:常用的三种线性数据结构第8章:利用文件进行数据管理第9章:嵌入式技术基础实践方法C语言程序设计【学习内容】3.1一维数组

3.2二维数组

3.3字符数组 第3章利用数组处理同类型的批量数据【学习目标】1.掌握数组的定义、初始化和引用的方法;

2.能利用数组解决实际问题,了解数组在嵌入式系统中的应用;

3.理解并掌握冒泡排序算法和选择排序算法;

4.掌握字符数组的输入输出方法以及字符串处理函数的应用方法。

在C语言中,数据类型除了基本类型(整型、实型、字符型),还有构造类型,包括数组、结构体、共用体和枚举类型。其中,数组是将相同类型的若干数据按序组合在一起,即数组是有序同类型数据的集合。

思考:若用基本数据类型,如何解决20个整型数据的存放问题?第3章利用数组处理同类型的批量数据3.1一维数组3.1.1定义一维数组的方法数组和变量一样,要先定义后使用。定义一维数组的形式:类型标识符数组名[常量表达式];说明:(1)类型标识符可以是基本类型或

构造类型。(2)常量表达式表示数据元素的个数,也称为数组长度。

例如:

inta[10];

该数组有10个整型元素:a[0]~a[9]。

元素编号是从0开始。C语言规定,数组名可以代表数组的首地址(数组首元素a[0]的地址)。

系统为数组a分配连续的10个整型内存空间,用来存储10个数组元素。3.1一维数组3.1.2一维数组的初始化

在定义数组时,对数组元素赋初值。初值用{}括起来,初值之间用逗号隔开。(1)对全部元素赋初值

inta[5]={1,2,3,4,5};

(2)对部分元素赋初值

inta[5]={1,2,3};

注意:初值个数不能超过指定的元素个数。

此时,也可写成:

inta[]={1,2,3,4,5};inta[5]={1,2,3,4,5,6};

在定义数组之后,不能一次性对整个数组的所有元素赋值,而只能对每个元素逐个赋值。例如:inta[5];//定义数组a[5]={1,3,5,7,9};

//错误a[0]=1;a[1]=3;a[2]=5;a[3]=7;a[4]=9;//正确//错误

结果:a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5

结果:a[0]=1,a[1]=2,a[2]=3,a[3]=0,a[4]=0

3.1一维数组3.1.3一维数组元素的引用C语言规定,只能引用某个数组元素而不能一次引用整个数组的全部元素。

一维数组元素的引用形式:数组名[下标]

下标就是数组元素的编号。

【例3.1】一维数组元素的引用:将一组数据倒序输出。#include<stdio.h>intmain(void){inti,a[10];

for(i=0;i<=9;i++)

a[i]=i;

for(i=9;i>=0;i--)

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

printf("\n");}

将数组和循环结构相结合,可有效处理同类型的批量数据,大大提高工作效率。3.1一维数组3.1.4一维数组的应用

一维数组广泛应用于对多个同类型的数据进行存取、排序等操作的场合。用一维数组还可构造出软件设计中常用的堆栈、队列等数据结构。【例3.4】对n个数进行排序(由小到大)。

由于是对多个数进行排序,自然会想到利用数组来保存和管理参与排序的多个数据。排序算法有多种,在此只介绍冒泡排序法。

在嵌入式软件设计中,一维数组可用于数码管显示的笔形码、键盘的键码等编码的存取。3.1一维数组用冒泡法对5个数(如:9、7、5、8、0)进行由小到大排序的过程:9758075988900975805787809708975975895780第1次9579第2次第3次第4次第1次7570第1次第2次第3次7570050550第1次第2次a[0]a[1]a[2]a[3]a[4]第1轮第2轮第3轮第4轮3.1.4一维数组的应用冒泡排序法的思路:从第1个数开始,和下邻数比较,小数上浮,大数下沉。【例3.4】对n个数进行排序(由小到大)。

3.1一维数组3.1.4一维数组的应用冒泡排序法的思路:从第1个数开始,和下邻数比较,小数上浮,大数下沉。【例3.4】对n个数进行排序(由小到大)。

3.1一维数组3.1.4一维数组的应用【例3.4】对n个数进行排序(由小到大)。

swap_flag=1;

若参与排序的多个数据在某轮比较前,恰好已经按照由小到大排序,则上述程序有无需要改进之处?swap_flag=0;//交换标志:0-无交换,1-有交换

if(swap_flag==0)break;//若本轮无交换,则结束比较

#defineN5

//宏定义参与排序的数据个数inta[N];

//存放待排序的一组数据inti,j,t;

for(i=1;i<N;i++)

//N个数,共需比较N-1轮{

for(j=0;j<N-i;j++)//第i轮需要比较N-i次{if(a[j]>a[j+1])

//依次比较两个相邻的数,将大数放后面{ t=a[j];a[j]=a[j+1];a[j+1]=t;

//交换

}}

},swap_flag;3.1一维数组3.1.4一维数组的应用练习:【例3.2】输入一个整数,输出该整数从高位到低位的各位数字。【例3.3】输入若干名学生的成绩,输出成绩单,并统计输出最高分、最低分和平均分。【例3.4】利用选择排序法对n个数进行排序。

并且对冒泡排序法和选择排序法进行比较。3.2二维数组

我们可用1个一维数组存放1名同学的语文、数学、英语3门课的成绩,而如何存放多名同学的语文、数学、英语3门课成绩呢?在C语言中,可用二维数组解决此类问题。在嵌入式软件设计中,二维数组可用于点阵显示码、液晶显示码等编码的存取。3.2二维数组3.2.1定义二维数组的方法定义二维数组的一般形式:

类型标识符数组名[常量表达式1][常量表达式2];其中,常量表达式1表示行数,常量表达式2表示的列数。例如:

inta[3][4];//定义3行4列的整型数组,共有3×4个元素

每个元素的编号:系统会为数组a分配连续的12个整型内存空间,用来存储12个数组元素。

在C语言中,二维数组中元素排列的顺序是按“行”存放的,即在内存中先顺序存放第1行的元素;

再顺序存放第2行的元素;

最后顺序存放第3行的元素。3.2二维数组3.2.1定义二维数组的方法

它有3个行元素:a[0]、a[1]、a[2],而每个行元素又是一个包含4个列元素的一维数组,此时把a[0]、a[1]、a[2]看作一维数组名。例如第一行元素:a[0][0]a[0][1]a[0][2]a[0][3]C语言中,又可以把二维数组a看作是一个特殊的一维数组。3.2二维数组3.2.2二维数组的初始化在定义二维数组时,对其元素初始化赋值。(1)分行给二维数组赋初值(一行对应一个花括号)例如:inta[3][4]={{1,2,3,4},

{5,6,7,8},

{9,10,11,12}};

(2)将所有数据写在一个花括号内,按顺序给元素赋初值例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

效果与第(1)种方法相同。但不如第(1)种方法直观。(4)对全部元素都赋初值时,行数可以不指定,但列数不能省略。

例如:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};(3)可只给部分元素赋初值。例如:inta[3][4]={{1},{5},{9}};

注意:在定义二维数组之后,不能一次性对整个数组的所有元素赋值,而只能对数组的每个元素逐个赋值。例如:inta[3][4];//定义数组a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

//错误3.2二维数组3.2.3二维数组元素的引用C语言规定,只能引用某个数组元素而不能一次引用整个数组的全部元素。

二维数组元素的引用形式:数组名[下标][下标]

下标就是数组元素的编号。

【例3.5】二维数组元素的引用:二维数组元素的赋值和输出。

#include<stdio.h>intmain(void){

inta[3][4];

//定义二维数组inti,j;printf("请输入12个整数:");

for(i=0;i<3;i++)

//二维数组的行{

for(j=0;j<4;j++)

//二维数组的列scanf("%d",

&a[i][j]);//向数组a赋值}for(i=0;i<3;i++){for(j=0;j<4;j++)printf("a[%d][%d]=%d\n",

i,

j,

a[i][j]);//输出数组a的12个元素值}}3.2二维数组3.2.4二维数组的应用练习:【例3.7】输入两个矩阵的数值,输出这两个矩阵的乘积。【例3.6】输出3×4矩阵,并求出值最大的元素值,及其所在的行号和列号。

#include<stdio.h>intmain(void){ inti,

j,

max,

row=0,

col=0;//变量i表示行,j表示列

inta[3][4]={{1,2,3,4},

{5,6,7,8},

{9,10,11,12}};for(i=0;i<3;i++){

for(j=0;j<4;j++)printf("%3d",

a[i][j]);

printf("\n");

//每输出一行,换行}

max=a[0][0];for(i=0;i<3;i++){for(j=0;j<4;j++){ if(a[i][j]>max){ max=a[i][j];row=i;col=j; }}}printf("最大值=%d,行=%d,列=%d\n",

max,

row+1,

col+1);}3.3字符数组

用来存放字符型数据的数组是字符数组,字符数组中的每个元素存放一个字符。在嵌入式网络通信软件设计中,可用字符数组存放待发送或待接收的数据。3.3.1定义字符数组的方法

系统为数组c分配连续的10字节内存空间,用来存储10个字符型数据。例如:

charc[10];数组名c代表该数组的首地址。

3.3字符数组

3.3.2字符数组的初始化1、逐个字符赋值法(1)对全部元素赋初值

charc[5]={'a','b','c','d','e'};

结果:c[0]='a',c[1]='b',c[2]='c',c[3]='d',c[4]='e'。

也可写成:

charc[]={'a','b','c','d','e'};

(2)对部分元素赋初值

charc[6]={'a','b','c','d','e'};

最后1个元素由系统自动赋空字符'\0'。3.3字符数组

2、字符串常量赋值法(将字符串常量赋给字符数组:用数组处理字符串)3.3.2字符数组的初始化也可写成:charc[]="abcde";

charc[]={"abcde"};

字符串常量"abcde"在内存中的存储:因此,数组c的长度是6。【思考】

下面两种赋值方式是否有区别?如何等价?

①charc[]={'a','b','c','d','e'}; ②charc[]="abcde";

注意:在定义字符数组之后,不能一次性对整个数组的所有元素赋值,而只能对数组的每个元素逐个赋值。例如:char

c[5];//定义数组c[5]={'a','b','c','d','e'};

//错误c[5]="abcd";

//错误3.3字符数组3.3.3字符数组元素的引用

字符数组的引用形式与数值数组相同,可以引用字符数组中的一个元素而得到一个字符。【例3.8】字符数组元素的引用:输出字符数组元素的值。

#include<stdio.h>intmain(void){

chara[5]={'a','b','c','d','e'};

//定义字符数组并初始化

charb[6]="12345";inti;printf("字符数组a:");

for(i=0;i<5;i++)printf("%c",a[i]);

//字符数组a元素的引用printf("\n");printf("字符数组b:");

for(i=0;i<6;i++)printf("%c",b[i]);

//字符数组b元素的引用printf("\n");}3.3字符数组3.3.4字符数组的输入、输出1、用格式符“%c”逐个字符输入、输出【例3.9】字符数组逐个字符的输入、输出。在输入字符时,系统将输入的空格、换行符作为有效字符赋给数组元素。

#include<stdio.h>intmain(void){ inti;charc[5];

//定义字符数组printf("请输入5个字符:");

for(i=0;i<5;i++)scanf("%c",&c[i]);

//逐个字符输入printf("字符数组元素:");

for(i=0;i<5;i++)printf("%c",c[i]);

//逐个字符输出printf("\n");}3.3字符数组2、用格式符“%s”对整个字符串一次输入、输出3.3.4字符数组的输入、输出【例3.10】字符串的格式化输入、输出

(1)用“%s”输入、输出字符串时,scanf、printf中的地址项、输出项都是字符数组名(首地址)。说明:

(2)用scanf

输入字符串时,若输入空格或换行,系统则认为是字符串结束符'\0'

。若输入字符串“abcdef”时,运行结果:

可见,系统只将空格前的字符串“abc”送入数组str中。如何将含有空格的字符串送给一个字符数组呢?——用后续介绍的gets函数来实现。#include<stdio.h>intmain(void){ charstr[10];printf("请输入字符串:");

scanf("%s",str);

//输入字符串

printf("%s\n",str);

//输出字符数组对应的字符串}3.3字符数组2、用格式符“%s”对整个字符串一次输入、输出3.3.4字符数组的输入、输出【例3.11】多个字符串的格式化输入、输出

用scanf函数输入多个字符串时,在字符串之间可用空格、换行符或Tab符作分隔。

#include<stdio.h>intmain(void){ charstr1[10],str2[10],str3[10];printf("请输入3个字符串:");

scanf("%s%s%s",str1,

str2,

str3);

//输入3个字符串

printf("%s%s%s\n",str1,

str2,

str3);

//输出3个字符串

}3.3字符数组3.3.5字符串处理函数C语言提供了若干个字符串字符串处理函数。

其中,字符串输入、输出函数,在使用前应包含头文件“stdio.h”;而其他字符串处理函数,在使用前应包含头文件“string.h”。3.3字符数组1、字符串输出函数:puts(字符串或字符数组名)

●将字符串或字符数组中存放的字符串输出到显示终端,并换行。3.3.5字符串处理函数2、字符串输入函数:gets(字符数组名)

●从键盘输入一个字符串(可含空格)到字符数组中,换行符作为输入的结束符。3.3字符数组3、字符串连接函数:strcat(字符数组名1,字符串或字符数组名2)

3.3.5字符串处理函数

●将字符串或字符数组2中的字符串连接到字符数组1中字符串的后面,结果放在字符数组1中。

说明:(1)字符数组1必须足够大,能够容纳连接后的新字符串。

(2)连接时将原字符串1最后的'\0'取消,只在新字符串最后保留'\0'。3.3字符数组4、字符串复制函数:strcpy(字符数组名1,字符串或字符数组名2)

3.3.5字符串处理函数

●将字符串或字符数组2中的字符串复制到字符数组1中。

说明:(1)字符数组1的长

温馨提示

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

最新文档

评论

0/150

提交评论