自考计算机基础与程序设计 ..ppt

上传人:laozhun 文档编号:2568018 上传时间:2023-02-20 格式:PPT 页数:60 大小:2.91MB
返回 下载 相关 举报
自考计算机基础与程序设计 ..ppt_第1页
第1页 / 共60页
自考计算机基础与程序设计 ..ppt_第2页
第2页 / 共60页
自考计算机基础与程序设计 ..ppt_第3页
第3页 / 共60页
自考计算机基础与程序设计 ..ppt_第4页
第4页 / 共60页
自考计算机基础与程序设计 ..ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《自考计算机基础与程序设计 ..ppt》由会员分享,可在线阅读,更多相关《自考计算机基础与程序设计 ..ppt(60页珍藏版)》请在三一办公上搜索。

1、,数 组,共 26 页 第 2 页,第六章 数组,第一节 数组的概念第二节 一维数组第三节 二维数组第四节 字符数组,共 26 页 第 3 页,6-1 数组的概念,C语言里,计算机如何存放一个数据?,一个班学生某一科目的成绩?(80,58,72)一个3*3的矩阵?2 3 5 1 0 1 4 5 7,1)具有相同类型 2)固定的数量 3)存在相互关联,利用变量存放数据,不同数据存放在不同变量中,相互没有关联,如何存放多个相互间存在关联的数据?,数组:具有相同数据类型,数量固定的数据的有序集合数组是一个集合,构成数组的每个数据称为数组元素,把这些具有相同类型,数量固定,相互关联的数据,用一个数组来

2、统一存放,数据特点:,int a;scanf(“%d”,线性关系,行列关系,例如:存储一个班学生成绩用一维数组 float mark46 存储一个3*3的矩阵用二维数组 int a33其中:mark、a 是数组名。内是数组的下标。下标的大小限定数组的长度,表示最多能存放多少数据 不同的数组元素:用共同的名字(数组名)和各自的下标来唯一地标识 例如:mark0,mark1.mark45 float,int是数组的数据类型,它限制了数组元素的类型 例如:mark0=80.0 mark0=a错误,6-1 数组的概念,数组按维度分类:一维数组和二维数组 一维数组:可存储一行或一列数据 二维数组:可存储

3、多行和多列数据,6-1 数组的分类,例如:int a33;,例如:float mark46;,共 26 页 第 6 页,第六章 数组,1)一维数组 数组的定义 数组元素的引用 数组的初始化,数组定义的格式 回顾一下变量定义的格式:数组的定义:,6-2 一维数组,数组的定义,声明存在一个数组,说明其名称,长度和类型,类型说明符 变量名;,类型说明符 数组名常量表达式;,数组的长度,整数,数组元素的类型例如:int,float,例如:int a10;,例如:int a;,数组a可以用于存放10个整数,标识符,1)定义一个数组,可以存放10个整数 int a102)定义一个数组,可以存放5个实数 f

4、loat b5,数组的定义,2)可以同时定义多个数据类型相同的数组,以逗号分隔 例如:int a10,b5;,举例:,类型说明符 数组名常量表达式;,注意:1)常量表达式 不能是变量 例如:int a=10;int ba;错误 可以是符号常量 例如:#define N 10 main()int bN;,等价 int a10;int b5;,数组元素的引用,2.数组元素的引用,数组元素的引用:用共同数组名和各自的下标来唯一地标识 引用格式:数组名下标,例如:int a10;,可引用的数组元素:a0,a1,a9,注意:下标范围是0(长度-1)a0表示第一个数组元素,a9表示最后一个数组元素,常见错

5、误:a10=3;,引用是重点,即如何从数组中提取数据,和存放数据到数组中,提取数据:printf(“%d”,a0);或 int b=a0;存放数据:scanf(“%d”,数组存取数据:输入输出语句和赋值操作,举例:输入任意10个整数,要求按序存放在数组中,并且依次输出,数组元素的引用,main()int a10;int i;for(i=0;i=9;i+)scanf(”%d”,如何对整个数组的数据进行存取?,数据结构:int a10算法:1)输入10个数,依次存放在数组中2)依次输出数组中存放的10个数,循环1:int i=0 to 9 输入第i个数,存放到ai中 i+,循环2:int i=0

6、to 9 输出数组中数据元素ai i+,常用循环对数组中的数组元素逐个输入、输出、或进行处理,数组的输入和输出:数组,只能是逐个存取数组的单个数组元素,不能进行整体操作 1)输入/输出数组:int a10;,数组的引用,错误:直接对整个数组进行输入输出 scanf(”%d%d%d%d%d%d%d%d%d%d”,a);scanf(”%d”,a);printf(”%d”,a);printf(”%d%d%d%d%d%d%d%d%d%d”,a);,正确:用循环对逐个的数组元素进行输入输出,for(k=0;k10;k+)scanf(”%d”,数组的引用,2)修改和提取数组:不能对整个数组进行赋值操作,只

7、能对具体的某个数组元素进行赋值操作和取值操作 例如:赋值:int a10;a=2;错误 a0=2;正确 取值:int b;b=a;错误 b=a0;正确,因为:数组名不是变量,而每个数组元素是变量,可仅对部分元素赋予初值:例:int a5=1,2;结果是 a0=1,a1=2,其他=0 char a5=a,b;结果是 a0=a,其他是0对所有元素赋予初值时,数组长度可省:例:int a=1,2 等价 int a2=1,2,数组的初始化,3.数组初始化,格式:数据类型 数组名 常量表达式 初始化数据;举例:int a5=1,2,3,4,5;结果:a0=1;a1=2;a2=3;a3=4;a4=5,在定

8、义数组时,给数组赋予一个初始值,数组的初始化,3.数组初始化,int a5=1,2,3,4,5;,数组不能作为一个整体被赋值,int a5;a5=1,2,3,4,5;,不等价,举例:int a5=1,2,3,4,5;a1+a4=?,7,常见错误:,数组一旦定义,按照数组元素的先后顺序和数据类型,会在内存分配一片连续的存储空间存放数组元素.,数组的存储,例如:int a5;例如:float a5;,a0,a1,a2,a3,a4,2个字节,存储每个数据元素占多少字节由数组元素的类型决定,int-占2个字节,float-占4个字节,低地址,高地址,2,一共占?字节,int a5=1,2,3,4,5;

9、,数组的概念,数组的初始与数组存储,a0,a1,a2,a3,a4,int b=a0;/取a0=3;/写,数组元素的引用与数组存储,a0,a1,a2,a3,a4,举例:例如:输入10个整数,反向输出这10个数,数组的应用,用数组:main()int a10,i;for(i=0;i=0;i-)printf(“%d”,ai);,不用数组只能正向输出:main()int x,sum=0;for(i=0;i=9;i+)scanf(”%fn”,不用数组只能输入后,立即将数据处理或输出数组的优点是能先保存数据,再进行处理,最后输出处理结果,作业:例如:输入10个整数,求最大值,最小值和平均值,并找出最大值与

10、最小值在这组数中的位置,数组的应用,数据结构?,算法:1)输入数组的数据 2)求最大值及位置,最小值及位置,和总值3)输出结果,int a10,max,min,maxid,minid,循环,循环,排序算法:将无序的数,排成有序数的算法 例如:9 8 4 5 2 0 0 2 4 5 8 9冒泡排序:两两比较,较大数放在后,较小的数往上冒,数组的应用,一共6个数,第一轮需要比较5次,一轮过后,最大的数沉底,按照这种方法可依次得到第二轮、第三轮.的冒泡结果第二轮过后,将第二大的数放在倒数第二位置,数组的应用,第1轮结果,第2轮结果,第3轮结果,第4轮结果,第5轮结果,一共N(6)个数,需要比较m(N

11、-1=5)轮每轮比较(N-m)次:第1轮比较5次,第2轮比较4次.,第5轮比较1次,数据结构采用一维数组,在不断的两两比较过程中,调整各元素的位置即可。,程序设计双重循环用外层循环控制冒泡的轮数m为 N-1(6-1)次用内层循环来控制在第m轮冒泡过程中需要进行的大小比较次数为 N-m(6-m)次;,程序实现要点,6-2 数组应用举例-排序问题,输出6个数,从键盘任意输入6个数,main()int a6;int i,m,t,n;printf(input numbers(N=6):n);for(n=0;nai+1)t=ai;ai=ai+1;ai+1=t;printf(the sorted numb

12、ers:n);for(n=0;n10;n+)printf(%d,an);,6-2 数组应用举例-排序问题,轮,共 26 页 第 23 页,第六章 数组,1)一维数组的定义 int a5;2)一维数组元素的引用 a0a4 提取数组元素:printf(“%d”,a0);b=a0;存放数据元素:scanf(“%d”,小结:,一维数组,用于存放一组存在关联的固定数量的数据,共 26 页 第 24 页,第六章 数组,2)二维数组 数组的定义 数组元素的引用 数组的初始化,二维数组:用于存储多行和多列数据,6-3 二维数组,例如:int a33;,2)4个学生,5门课的成绩,1)矩阵,例如:int a45

13、;,总行数,总列数,二维数组定义的格式,6-3 二维数组,数组的定义,声明存在一个数组,说明其名称,长度和类型,类型说明符 数组名常量表达式1常量表达式2;,第一维的长度,数组总行数,数组a可以用于存放4行5列的数据,第二维的长度,数组总列数,例如:int a45;,67 74 80 76 7070 73 85 70 7465 70 76 80 8777 80 90 86 90,int a45;,int a54;,不等价,数据元素的总个数=常量表达式1*常量表达式2,只需要给出一维的前后次序就能确定一个数组元素,6-3 二维数组,例如:int a33;,要确定行和列两个方向的次序才能确定一个数

14、组元素,例如:mark0,例如:a00,二维数组:,行号,列号,一维数组:,二维数组在概念上是二维的,两个下标可分别在两个方向上变化,第一个下标控制行,第二个下标控制列,2.二维数组元素的引用,引用格式:数组名下标1下标2,例如:int a34;总共3行4列数据,可引用的数组元素:,提取数据:printf(“%d”,a00);或 int b=a00;存放数据:scanf(“%d”,数据所在行0总行数-1,数据所在列0总列数-1,a12:表示第2行第3列数据,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,6-3 二维数组,注意:下标从0开始,a3

15、1,a14,错误,和一维数组一样,只能逐个对数组元素进行存取,举例:输入任意12个整数,存放在一个3行4列的二维数组,并且依次输出,二维数组元素的引用,main()int a34;int I,j;for(i=0;i=2;i+)for(j=0;j=3,j+)scanf(“%d”,如何对整个二维数组的数据进行存取?,数据结构:int a34算法:1)输入12个数,依次存放在数组中2)输出数组,外循环:int i=0 to 2 控制行 i+,内循环:int j=0 to 3 控制列 输入数据,存于数据元素aij j+,常用两重循环对数组中的数组元素逐个输入、输出、或进行处理,输入,2.二维数组元素的

16、初始化,6-3 二维数组,1)将所有数据写在一个内,按顺序赋值 例:int a34=1,2,3,4,5,6,7,8,9,10,11,12;2)按行给数组元素赋初值 例:int a34=1,2,3,4,5,6,7,8,9,10,11,12;3)按行对部分元素赋初值 例:static int a34=1,0,6,0,0,11;4)给所有元素赋初值时,可以省略第一维的长度,但不能省第二维 例:static int a4=1,2,3,4,5,6,7,8,9,10,11,12;,在定义数组时,给数组赋予一个初始值,6-3 二维数组,二维数组的存储,例如:int a34;,二维数组的存储按行存放,a11,

17、a10,a12,a13,a20,a23,从第一行开始,从左到右存放.到行末,转向下一行第一个元素,又从左到右依次存放,直到最后一个元素.,6-3 二维数组,注意:,1)二维数组可以看成是由若干一维数组组成的数组,a0,a1,a2,a0代表一个一维数组,对应二维数组里的一行,a0,可把二维看做一维,举例:已知矩阵A,编程实现矩阵的转置,二维数组元素的引用,main()int a34=2,3,5,8,1,0,1,2,4,5,7,6;int i,j;for(i=0;i=2;i+)for(j=0;j=3,j+)bji=aij;,int a34 初始化 int b43算法:1)转置:将数据逐行逐列的复制

18、过去2)输出结果:A和B,外循环:int i=0 to 2 控制行 i+,内循环:int j=0 to 3 控制列 bji=aij j+,a01 b?,数据结构:,main()int a34=2,3,5,8,1,0,1,2,4,5,7,6;int i,j;for(i=0;i=2;i+)for(j=0;j=3,j+)bji=aij;printf(“A:n”)for(i=0;i=2;i+)for(j=0;j=3,j+)printf(“%4d”,aij);printf(“n”);printf(“B:n”)for(i=0;i=2;i+)for(j=0;j=3,j+)printf(“%4d”,bij);

19、printf(“n”);,三个并列的两重循环,转置,输出A,输出B,作业:输入4行4列的二维数组,求:计算主对角线各元素之和。计算辅对角线各元素之和。,二维数组元素的引用,2 3 5 8 1 0 1 2 4 5 7 6 1 0 2 3,主对角线元素:a00+a11+a22+a33,辅对角线元素:a03+a12+a21+a30,i=j,i+j=3,i=0 to 3 j=0 to 3 if(i=j)sum=sum+aij,共 26 页 第 36 页,第六章 数组,1)二维数组的定义 int a54;2)二维数组元素的引用 a00a43 提取数组元素:printf(“%d”,aij);b=aij;存

20、放数据元素:scanf(“%d”,数组的输入和输出只能逐一对每个数组元素,所以经常用两重循环,外循环控制行,内循环控制列3)二维数组的初始,小结:,二维数组,用于存放多行多列的数据,int a34=1,2,3,4,5,6,7,8,9,10,11,12;,共 26 页 第 37 页,第六章 数组,3)字符数组 字符数组与字符串 字符数组的初始化 字符数组的输入和输出 字符串处理函数,6-4 字符数组,字符数组,字符数组定义:char a8;字符数组初始化:char a8=s,t,u,d,e,n,t,0字符数组引用:a0-a7 每个数组元素存放一个字符 存取字符:char b=a0;a0=b;,字

21、符类型(char)的数组,因可用于存放字符串,所以单独讨论,字符数组与字符串,字符串用字符数组存放 char a8=“student”;,仅一个字符,字符用字符变量存放 char ch=a;,6-4 字符数组,字符数组,一维字符数组存放一个字符串,字符串用字符数组存放 char a8=“student”;,二维字符数组存放若干个字符串,char a38=“student”,“worker”,“teacher”;,a0就是”student”,6-4 字符数组,字符数组的初始化,1)将所有字符逐一写在内,按顺序初始 例:char str8=s,t,u,d,e,n,t;2)用字符串来初始 例:cha

22、r str8=“student”;或者 char str8=“student”;,第一种初始结果和第二种初始结果等价吗?,不一样,因为对于字符串,系统会在最后自动加0,char str8=s,t,u,d,e,n,t,0;等价,这样,数组str中存放的就是”student”,初始化一个字符数组存放一个字符串,末尾加0,6-4 字符数组,字符数组的输入-字符串的输入,1)用循环将单个字符逐个输入 格式说明用%c,char str15;int i;for(i=0;i=14;i+)scanf(“%c”,输入:I am a student回车,2)用%s将整个字符串输入,输入项直接写数组名,char s

23、tr15;scanf(“%s”,特殊,其他类型的数组不能这样输入,这与其他类型的数组输入方式相同,输入:student回车,输入:I am a student回车,%s遇到空格和回车终止,所以只能输入不含空格字符串,结果:str是”I”,结果:str是”student”,6-4 字符数组,字符数组的输入-字符串的输入,3)用函数gets()输入,不用循环就可以输入整个串,char str15;gets(str);,输入:I am a student回车,特有方式,允许字符中包含空格,以回车结束输入,结果:str是”I am a student”,6-4 字符数组,字符数组的输出-字符串的输出,

24、1)用循环将单个字符逐个输出 格式说明用%c,char str15=“I am a student”;int i;for(i=0;i=14;i+)printf(“%c”,stri);,输出:I am a student,2)用%s将整个字符串输出,输出项直接写数组名,char str15=“I am a student”;scanf(“%s”,str);,特殊,其他类型的数组不能这样输出,这与其他类型的数组输出方式相同,输出没有空格的问题,6-4 字符数组,字符数组的输出-字符串的输出,3)用函数puts()输出整个串,char str15=“I am a student”;puts(str)

25、;,输出:I am a student,特有方式,举例:将字符串str2连接到字符串str1之后.str1是”this is a c”.str2是”programe”.,二维数组元素的引用,main()char str125=this is a c;char str29=programe;int i=0,j=0;while(str1i!=0)i+;while(str2j!=0)str1i=str2j;i+;j+;puts(str1);,i=0;while(str1i!=0)i+;,数据结构:,char str125,str29;,char str125=“this is a c”;char s

26、tr29=“programe”;,算法:1)找到str1的末尾2)逐一将str2的字符拷贝到str1后面3)输出str1,”this is a c”,”programe”,j=0;while(str2j!=0)str1i=str2j j+;i+;,举例:用二维字符数组输入输出三个字符串,字符串长度不超过10,二维数组元素的引用,main()char str310;int i,j;for(i=0;i=2;i+)gets(stri);for(i=0;i=2;i+)j=0;while(strij!=0)printf(“%c”,strij);j+;printf(“n”);,for(i=0;i=2;i+

27、)gets(str1i);,数据结构:,char str310;,算法:1)逐个输入每个字符串,并存放到数组用,可用gets,可用双重循环 2)逐一将数组中字符串输出 可用puts,可用双重循环,for(i=0;i=2;i+)j=0;while(str1ij!=0)printf(“%c”,str1ij);j+;printf(“n”);,for(i=0;i=2;i+)puts(str1i);,for(i=0;i=2;i+)printf(“%s”,str1i);,6-4 字符数组,字符串处理函数,1)字符串复制:strcpy(字符数组1,字符数组2),将字符数组2中的字符串复制到字符数组1中,st

28、r1=str2;str1=“I am a student”,可以用strcpy(str1,str2)来实现把字符串2赋给字符串1,char str115;char str215=“I am a student”;strcpy(str1,str2);,strcpy(str1,“I am a student”);,错误,字符串间不能直接赋值,系统提供的实现特定功能的字符串处理函数:strcpy,strcat,strcmp,strlen,6-4 字符数组,2)字符串连接:strcat(字符数组1,字符数组2),将字符数组2中的字符串连接到字符数组1后面,char str125=“I am a”;ch

29、ar str28=“student”;strcat(str1,str2);,结果:str1是I am a student,举例:将字符串str2连接到字符串str1之后.str1是”this is a c”.str2是”programe”.,二维数组元素的引用,main()char str125=this is a c;char str29=programe;strcat(str1,str2);puts(str1);,数据结构:,char str125,str29;,char str125=“this is a c”;char str29=“programe”;,”this is a c”,”

30、programe”,6-4 字符数组,3)字符串长度:strlen(字符数组),求字符数组中实际存放的字符个数,不包括字符串结束标志0.注意:不一定等于数组的长度,char str20=“I am a student”;int i=strlen(str);,结果:i是14,6-4 字符数组,4)字符串比较:strcmp(字符串1,字符串2),比较两个字符串的大小,例如:ctrcmp(str1,str2);,字符串的比较规则:,两个字符串,从左到右逐个字符比较它们的ASCLL码1)字符串1比字符串2大,结果大于0:2)字符串1比字符串2小,结果小于03)字符串1与字符串2相等,结果是0,例:st

31、rcmp(”ACD”,“ABC”),”ACD”,”ABC”,例:strcmp(”ABC”,“Abc”),例:strcmp(”ABC”,“ABC”),字符数量,对应字符完全相等,6-4 字符数组,2)字符串比较:strcmp(字符串1,字符串2),比较两个字符串的大小,例如:ctrcmp(str1,str2);,C语言中不允许对字符串用关系运算符作如下方式的直接比较:str1str2,str1str2 或者 str1=str2,错误,共 26 页 第 53 页,第六章 数组,第一节 数组的概念第二节 一维数组第三节 二维数组第四节 字符数组,6-4 字符数组,补充:,char str=1,2,3

32、,0,4,5,0;printf(“%s”,str);输出结果是:,printf(“%c”,str);,错误,printf(“%c”,str0);,123,1,6-4 字符数组,从键盘输入一个四位整数,把该整数颠倒过来输出,1234 4321,重点:将每一位都拆分出来,算法:,数据结构:用一个整型变量存放这个四位的整数 int n;定义4个变量分别存放每一位的数字,int a,b,c,d;,个位:,a=n%10,十位:,b=n%10,n=n/10;,百位:,c=n%10,n=n/10;,n=1234,a=4,n=123,b=3,n=12,c=2,千位:,d=n or d=n%10,n=n/10;

33、,n=1,d=1,千位-百位-十位-个位,个位-十位-百位-千位,逆序,6-4 字符数组,从键盘输入一个四位整数,把该整数颠倒过来输出,1234 4321,算法:,个位:,a=n%10,十位:,b=n%10,n=n/10;,百位:,c=n%10,n=n/10;,千位:,d=n or d=n%10,n=n/10;,这个算法好,能用循环实现而且先求出个位,所以可以直接输出,不用存放,所以不用为每一位定义变量a,b,c,d,main()int n,i;scanf(%d,6-4 字符数组,从键盘输入一个四位整数,输出它的各位数字之和,重点:将每一位都拆分出来,main()int n,i,sum=0;s

34、canf(%d,6 数组,打印100999内的水仙花数水仙花数指一个三位数,其各位数字的立方和等于该数本身,重点:将每一位都拆分出来,main()int i,x1,x2,x3;for(i=100;i=999;i+)x1=i%10;x2=i/10%10;x3=i/100;if(x1*x1*x1+x2*x2*x2+x3*x3*x3=i)printf(“%dn”,i);,循环:100-900,N=(个位)3+(十位)3+(百位)3,数据结构:int i,x1,x2,x3;,6 数组,插入排序:,P105,第四题2小题:已知数组x中存放一个递增数列,输入一个整数w,将它插入到数组中,使之仍为一个递增数

35、列.,int x11;,插入一个任意输入的整数w,假设是45,45,算法:,1)找到w应该插入的位置,用p表示,用循环,int k=0 to 10,找到第一个比w大的元素位置,用p记录,找到就跳出循环,2)从后往前,从第9个元素到第p个元素,逐一向后移动一位,p,用循环,int k=10 to p,xk+1=xk.,最后将xp=w,递增序列,6 数组,#define N 10#include main()int x_=0,10,20,30,40,50,60,70,80,90,w,k,p;scanf(“%d”,45,p,1.定位,用循环,int k=0 to 10,找到第一个比w大的元素位置,用p记录,找到就,2.移动,用循环,int k=10 to p,xk+1=xk.,最后将xp=w,跳出循环,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号