《计算机程序设计基础C语言》教案总学时36第21学时一第22学时授课内容第4章数组和指针一维数组数组的基本概念教学目的一维数组定义、初始化、引用;最大值、冒泡排序、选择排序算法。和要求重点:一维数组定义、初始化、引用重点求最大值、冒泡排序、选择排序算法难点难点:冒泡排序、选择排序算法教20分钟讲解分组研讨(四)学引言:安除了int、float、char等基本数据类型外,C语言还提供了构造数据类型,来满排足不同应用的需要。构造数据类型是由基本数据类型按一定规则组成的,也称作"导出类型”。构造数据类型包括数组、结构体、共用体。数组(array)就是1种构造类型。它能将具有相同类型的数据组合在一起,通常是用于处理批量数据。讲授一、数组维数数组中能唯一确定数组元素的下标的个数称为数组的维数一维数组:只用一个下标就能区分数组中的不同元素的二维数组:要用两个下标才能区分数组中的不同元素二、一维数组的定义与初始化1、一维数组定义类型定义符数组名[整型常量表达式];编译时系统分配连续内存内存字节数=数组维数*sizeof(元素数据类型)Aone-dimensionalarraydeclarationisatypefollowedbyanidentifierwithabracketedconstant integral expression.The value of the expression ,which must be positive, is the size of the array.It specifies the number of elements in the array.The array subscripts can range from O to size-1.The lower bound of the array subscripts is O and the upper bound is size-1.【例如】floatscore[50];char name[20];注意:不能用变量定义数组的长度。float score[n];×当定义数组语句中不同时给变量赋值时,方括号内不得为空
《计算机程序设计基础C语言》教案 总学时36 第 21学时 — 第 22学时 授课内容 第4章 数组和指针——一维数组 教学目的 和要求 数组的基本概念 一维数组定义、初始化、引用;最大值、冒泡排序、选择排序算法。 重点 难点 重点: 一维数组定义、初始化、引用 求最大值、冒泡排序、选择排序算法 难点: 冒泡排序、选择排序算法 教 学 安 排 20分钟讲解分组研讨(四) 引言: 除了int、float、char等基本数据类型外,C语言还提供了构造数据类型,来满 足不同应用的需要。 构造数据类型是由基本数据类型按一定规则组成的,也称作"导出类型"。 构造数据类型包括数组、结构体、共用体。 数组(array)就是1种构造类型。它能将具有相同类型的数据组合在一起,通 常是用于处理批量数据。 讲授 一、数组维数 数组中能唯一确定数组元素的下标的个数称为数组的维数 一维数组:只用一个下标就能区分数组中的不同元素的 二维数组:要用两个下标才能区分数组中的不同元素 二、一维数组的定义与初始化 1、一维数组定义 类型定义符 数组名[整型常量表达式] ; 编译时系统分配连续内存 内存字节数=数组维数*sizeof(元素数据类型) A one-dimensional array declaration is a type followed by an identifier with a bracketed constant integral expression. The value of the expression ,which must be positive, is the size of the array. It specifies the number of elements in the array. The array subscripts can range from 0 to size-1. The lower bound of the array subscripts is 0 and the upper bound is size-1. 【例如】 float score[50]; char name[20]; 注意: 不能用变量定义数组的长度。 float score[n]; × 当定义数组语句中不同时给变量赋值时,方括号内不得为空
int a[]; ×数组一旦定义,数组的大小就不能再改变。常用的办法是用符号常量来指定元素个数。#definesize50float score[size];2、一维数组的初始化类型定义符数组名[常量]=[值1,值2,,值n);例如:inta[6]={1,2,3,4,5,6];inta[]={1, 2, 3, 4, 5, 6];两者等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;例如:inta[6]=[1,2];等价于: a[0]=1;a[1]=2;a[2]=0;a[3]=0;a[4]=0;a[5]=6;int c[10]=[0];1/将0赋给c[0]~c[9]inta[]=[1,2];//等价于:a[0]=1;a[1]=2三、一维数组元素的引用与操作1.数组元素的引用数组名[下标]注意:(1)数组元素的下标从0开始(2)引用数组元素时,只能单个引用,不能一次引用整个数组int a[6];a=[3,4,5,6,7]; xa[6]=[3,4,5,6,7]; x(3)下标不要超出数组的范围,否则导致错误的程序结果。2.数组的赋值可以在定义数组时对数组中的全部变量或部分变量赋值(即数组的初始化)。可以在语句中为变量赋值。利用循环依次为每个数组元素赋值或输入值。mainO(int i,a[5]for(i=0;i<5;i++)a[i]=i;l/用循环结构直接对数组赋初值for(i=0;i<5;i++)printf("%d,",a[i]);printf("In");用交互的循环结构对数组赋初值mainotint i,a[5];for(i=0;i<5;i++)printf("a[%d]=",),scanf("%d",&a[i]);for(i=0;i<5;i++)printf("%d,",a[1]);
int a[]; × 数组一旦定义,数组的大小就不能再改变。常用的办法是用符号常量来指定元 素个数。 #define size 50 float score[size]; 2、一维数组的初始化 类型定义符 数组名[常量] ={值1,值2,.,值n}; 例如: int a[6]={1,2,3,4,5,6}; int a[]={1,2,3,4,5,6}; 两者等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6; 例如: int a[6]={1,2}; 等价于:a[0]=1;a[1]=2;a[2]=0;a[3]=0;a[4]=0;a[5]=6; int c[10]={0}; //将0赋给c[0]~c[9] int a[]={1,2}; //等价于:a[0]=1; a[1]=2; 三、一维数组元素的引用与操作 1. 数组元素的引用 数组名[下标] 注意: (1)数组元素的下标从0开始 (2)引用数组元素时,只能单个引用,不能一次引用整个数组 int a[6]; a={3,4,5,6,7}; × a[6]={3,4,5,6,7}; × (3)下标不要超出数组的范围,否则导致错误的程序结果。 2. 数组的赋值 可以在定义数组时对数组中的全部变量或部分变量赋值(即数组的初始化)。 可以在语句中为变量赋值。 利用循环依次为每个数组元素赋值或输入值。 main(){int i,a[5]; for(i=0;i<5;i++) a[i]=i; //用循环结构直接对数组赋初值 for(i=0;i<5;i++) printf("%d,",a[i]); printf("\n"); } 用交互的循环结构对数组赋初值 main(){ int i,a[5]; for(i=0;i<5;i++) printf("a[%d]=",i),scanf("%d",&a[i]); for(i=0;i<5;i++) printf("%d,",a[i]);
printf("n");应用举例例:定义长度为10的整型类型一维数组并完成以下功能(1)从键盘输入10个整数,分别存放在10个数组元素中;(2)输出数组中的各元素值;(3)按逆序输出数组中的各元素值。mainOtint i,a[10];for(i=0;i<10;i++)printf("第%d个数据:",i+1)scanf("%d",&a[i]);for(i=0;i<10;i++)printf("%4d",a[]);printf("In");for(i=9;i>=0;i--)printf("%4d",a[i]);printf("/n");在C语言中,有N个元素的数组其元素下标的允许取值范围为0到N-1,不存在下标为N的元素。例如mainOint i,a[10];for(i=1;i<=10;i++)a[]=0;printf("%d ",a[i])11这段代码本意是要设置数组a中的10个元素均为0。但通常编译器按内存递减方式分配内存,使得内存中a[9]之后的4个字节分配给i。本来计数器的值为10,循环体内将并不存在的a[10]设为0,实际是将值设为0,就陷入死循环!四、数组应用1、比较法排序由键盘输入10个数,按由小到大排序输出解题方法:①将10个数存入数组a②将a(0)与a(1)、a(2)....a(9)依次比较,哪个元素的值比a(0)小,就将它与a(O)的值交换,这样就将最小的数送到了a(0)中。3再将a(1)与a(2)、a(3)......a(9)依次比较,哪个元素的值比a(1)小,就将它与a(1)的值交换,这样就将最小的数送到了a(1)中。④重复以上步骤
printf("\n"); } 应用举例 例:定义长度为10的整型类型一维数组并完成以下功能: ⑴ 从键盘输入10个整数,分别存放在10个数组元素中; ⑵ 输出数组中的各元素值; ⑶ 按逆序输出数组中的各元素值。 main(){ int i,a[10]; for(i=0;i<10;i++) printf("第%d个数据: ",i+1), scanf("%d",&a[i]); for(i=0;i<10;i++) printf("%4d",a[i]); printf("\n"); for(i=9;i>=0;i-) printf("%4d",a[i]); printf("\n"); } 在C语言中,有N个元素的数组其元素下标的允许取值范围为0到N-1, 不存在下标为N的元素。 例如main(){ int i,a[10]; for(i=1;i<=10;i++){ a[i]=0; printf("%d ",a[i]); } } 这段代码本意是要设置数组a中的10个元素均为0。但通常编译器按内存递减方 式分配内存,使得内存中a[9]之后的4个字节分配给i。本来计数器i的值为10, 循环体内将并不存在的a[10]设为0,实际是将i值设为0,就陷入死循环! 四、数组应用 1、比较法排序 由键盘输入10个数,按由小到大排序输出 解题方法: ① 将10个数存入数组a ② 将a(0)与a(1)、a(2).a(9)依次比较,哪个元素的值比a(0)小,就将它 与a(0)的值交换,这样就将最小的数送到了a(0)中。 ③ 再将a(1)与a(2)、a(3).a(9)依次比较,哪个元素的值比a(1)小,就将 它与a(1)的值交换,这样就将最小的数送到了a(1)中。 ④ 重复以上步骤
对于n个数,比较排序法的总运行次数为:(n-1)+(n-2)+... +3+2+1 = n * (n-1) / 2 .#include<stdlib.h>mainOint i,j,a[10];srand(time(O));for(i=0;i<10;i++)a[]=rand0%101;printf("%4d",a[i]);1putch("n');for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(a[i]>a[])a[]=[=[=];7for(i=0;i<10;i++)printf("%4d",a[i]);12、冒泡法排序是一种交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。①首首先将a[0]与a[1]、a[1]与a[2]、a[2]与a[3]、…..a[n-2]与a[n-1]相邻两个数进行比较,若为逆序(比如a[0]>a[1])则两者交换,这样就将将最大的数放在a[n-1]中;②再将a[0]、a[1]、...a[n-2]这n-1个数进行同样的相邻两数比较,若为逆序则两者交换,这样就将这n-1个数中最大的数被放在a[n-2]中;③重复以上步骤,经过n-1趟比较交换完成冒泡法排序。#include<stdio.h>#defineN101/数据的个数mainOkinta[N]={5,12,29,47,9,18,13,50,38,2}int ij,k,t;for(i=0;i<N-1;i++)for(j=O;j<N-i;j++)if(ali]>a[i+1])t=ali];a[]=a[i+1];a[i+1]=t;11printf("ln最后的排序结果:n");for(i=0;i<N;i++)
对于n个数,比较排序法的总运行次数为: (n-1)+(n-2)+ . +3+2+1 = n * ( n-1 ) / 2 . #include <stdlib.h> main(){ int i,j,a[10]; srand(time(0)); for(i=0;i<10;i++){ a[i]=rand()%101; printf("%4d",a[i]); } putch(’\n’); for(i=0;i<9;i++){ for(j=i+1;j<10;j++) if(a[i]>a[j]) a[i]^=a[j]^=a[i]^=a[j]; } for(i=0;i<10;i++) printf("%4d",a[i]); } 2、冒泡法排序 是一种交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有 序。 ① 首先将a[0]与a[1]、a[1]与a[2]、a[2]与a[3]、.a[n-2]与a[n-1]相邻两个 数进行比较,若为逆序(比如a[0]>a[1])则两者交换,这样就将将最大的 数放在a[n-1]中; ② 再将a[0]、a[1]、.a[n-2]这n-1个数进行同样的相邻两数比较,若为逆 序则两者交换,这样就将这n-1个数中最大的数被放在a[n-2]中; ③ 重复以上步骤,经过n-1趟比较交换完成冒泡法排序。 #include <stdio.h> #define N 10 //数据的个数 main(){ int a[N]={5,12,29,47,9,18,13,50,38,2}; int i,j,k,t; for(i=0;i<N-1;i++){ for(j=0;j<N-i;j++) if(a[j]>a[j+1]){ t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } printf("\n最后的排序结果:\n"); for(i=0;i<N;i++)
printf("%5d",a[i)}1、插入向一个有序数组中插入一个数字,插入后不改变原有顺序方法1:找到插入点后再移位。从前向后循环,从第1个元素开始依次将数组元素与要插入的数x比较,当x<a[i]时,将a[i]~a[8]依次向后移动,这时a[i]就可以存放x了。for(i=0;i<9;i++){I将要插入的数与每个元素比较,找插入的位置if(x<a)IⅡ依次将插入点后的元素向后移位for(j=8;j>=i;j--)a[i+1]=a[];a[]=x;Ⅱ插入数据后退出整个循环break;11方法2:边找插入点边移位。从后向前循环,直接从最后1个元素开始,将其与要插入的数x比较,如果x<a[i,说明x要插在ai的前面,那么a[i元素就要向后移位;再将下标i-,做同样的比较,直到找到插入点退出循环,这时的a[]>x,因此x要赋值给a[i+1]。Ⅱ从最后1个元素开始,依次将要插入的数与每个元素比较for(i=8;i>=0;i--)(1如果要插入的数比元素值小,则该元素直接向后移位if(x<a[i])a[i+1]=a[];elsebreak;I/表示找到插入点,退出循环1Ⅱ插入数据a[i+1]=x;2、删除不改变顺序,删除指定的数字mainOtint i,j,del=0,int a[10]={1,2,3,4,5,6,7,8,9,10],x=5;for(i=0;i<10;i++)orintf("%4d",a[i]);putch("\n');for(i=0;i<10-del;i++)I/删除后数组的容量减小一if(x==a[])for(j=i;j<10;j++)a[]=a[i+1]
printf("%5d", a[i]); } 1、插入 向一个有序数组中插入一个数字,插入后不改变原有顺序 方法1:找到插入点后再移位。从前向后循环,从第1个元素开始依次将数组元 素与要插入的数x比较,当x<a[i]时,将a[i]~a[8]依次向后移动,这时a[i]就可以 存放x了。 for(i=0;i<9;i++) { //将要插入的数与每个元素比较,找插入的位置 if(x<a[i]){ // 依次将插入点后的元素向后移位 for(j=8;j>=i;j-) a[j+1]=a[j]; a[i]=x; // 插入数据后退出整个循环 break; } } 方法2:边找插入点边移位。从后向前循环,直接从最后1个元素开始,将其与 要插入的数x比较,如果x<a[i],说明x要插在a[i]的前面,那么a[i]元素就要向后 移位;再将下标i-,做同样的比较,直到找到插入点退出循环,这时的 a[i]>x,因此x要赋值给a[i+1]。 //从最后1个元素开始,依次将要插入的数与每个元素比较 for(i=8;i>=0;i-){ //如果要插入的数比元素值小,则该元素直接向后移位 if(x<a[i]) a[i+1]=a[i]; else break; //表示找到插入点,退出循环 } a[i+1]=x; // 插入数据 2、删除 不改变顺序,删除指定的数字 main(){ int i,j,del=0, int a[10]={1,2,3,4,5,6,7,8,9,10},x=5; for(i=0;i<10;i++) printf("%4d",a[i]); putch(’\n’); for(i=0;i<10-del;i++){ //删除后数组的容量减小一 if(x==a[i]){ for(j=i;j<10;j++) a[j]=a[j+1];