C语言培训教材课件第4章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
24
2013-8-7
25
实验 和作业
上机实验: 调试例题 1~10 实验 8
习题作业: 一 、二 、三 、四 五 (1 , 2,4,8 ,10)(作业本)
2013-8-7
4.2 二维数组
4.2.1 二维数组的定义
26
数据类型 数组名[常量表达式1][常量表达式2];
例如: float x[2][3];
8
2013-8-7
数组在内存的存放
9
数组下标从0开始。 一维数组的数组元素 低地址 在内存里按顺序存放。 数组名代表数组的首 地址,即score的值 与score[0] 的地址 值相同。 高地址
score数组
91.5 34.5 67.5 72.0
84.0
score[0]
score[1]
score[2] score[3] score[4]
84.0
score[0]
score[1]
score[2] score[3] score[4]
2013-8-7
13
#define N 141 main() { float score[N],average; int n,i; Please input score:73.5 average=0; for(i=0;i<N;i++) Please input score:97 { printf("Please input score:"); average=85.25 scanf("%f",&score[i]); average=average+score[i]; n=1 } average=average/N; n=0; for(i=0;i<N;i++) if (score[i]>average) n++; printf("average=%5.2f\nn=%d\n",average,n); }
2013-8-7
4.1.1 一维数组的定义(续)
以下数组定义是正确的: #define N 10 …… float score1[N], score2[N]; int num[10+N]; char c[26]; 以下数组定义是不正确的: int array(10); int n; float score[n]; double b['a'.. 'd']; char str[ ];
printf(“Please input the score of student:”); scanf(“%f”,&score1); printf(“Please input the score of student:”); scanf(“%f”,&score2); ...... printf(“Please input the score of student:”); scanf(“%f”,&score141); ...... }
19
2013-8-7
冒泡法排序 (续)
从上述过程可以看到:n个数要比较n-1趟,而 在第j趟比较中,要进行n-j次两两比较。 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] T a[i]与a[i+1]交换 输出a[0]~a[N-1]
说明:
① 下标从0开始(下界为0),数组的最大下标 (上界)是数组长度减1。 例如: int a[10]; scanf ("%d",&a[10]); /* 下标越界 */ C编译系统不做越界检查,如果引用的数组元素 超出数组范围会破坏其他变量的值。
11
2013-8-7
4.1.2 数组元素的引用(续)
2013-8-7
冒泡法排序 (续)
第二趟排序情况如下:
356708 第一次 3和5比较,不交换 3 5 6 7 0 8 第二次 5和6比较,不交换 3 5 6 7 0 8 第三次 6和7比较,不交换 3 5 6 7 0 8 第四次 7和0比较,交换 356078 在第二趟排序中,最大数8不用参加比较,其余的5个数比 较了4次,把其中的最大数7排在最后,排出7 8。 以此类推: 第三趟比较3次,排出 6 7 8 第四趟比较2次,排出 5 6 7 8 第五趟比较1次,排出 3 5 6 7 8 最后还剩下1个数0,不需再比较,得到排序结果: 035678
2013-8-7
【例4.5】选择法排序(从小到大)。
以6个数:3、7、5、6、8、0为例。
思路: 第一趟:将第一个数依次和后面的数比较,如 果后面的某数小于第一个数,则两个数交换,比较 结束后,第一个数则是最小的数。
22
第二趟:将第二个数依次和后面的数比较,如 果后面的某数小于第二个数,则两个数交换,比较 结束后,第二个数则是次小的数;…… 。
2013-8-7
第4章 数组
4
如何解决下面的问题?
定义多少个变量? 计算一门课的平均成绩并统计 采用哪种程序结构?
成绩高于平均分的人数?
如何接收并保存多个成绩? 如何计算平均分? 如何统计人数?
应该注意的问题:
1. 2. 3.
2013-8-7
5
程序超过300行, main() 重复严重,但 { 无法用循环结 float score1,score2,......score141,average,number; 构。
X[0][0] X[0][1] X[0][2] X[1][0] X[1][1] X[1][2] int a[3,4],b(3,4),c[ ][ ],d(3)(4);
67 74 89 92 34 67 83 95 73 78 78.0 73.0 95.0 83.0 67.0 34.0 92.0 89.0 74.0 67.0
2013-8-7
【例4.2】输入5个整数,找出最大数和最小数 所在位置,并把二者对调,然后输出。
思路: 求最大/小值采用打擂台的方法。 定义一维数组a存放被比较的数。 定义变量max:最大值, min:最小值, k:最大值下标 , j:最小值下标 。 各数依次与擂主进行比较, 若a[i]>max 则: max=a[i]; k=i; 否则判断: 若a[i]<min 则: min=a[i]; j=i; 当所有的数都比较完之后,将a[j]=max; [k]=min; 输出a数组。
#define N 5 main( ) { int a[N]; 程序运行情况如下: int i,j,t; 96 78 65 86 40 for (i=0; i<N; i++) The sorted numbers: scanf("%d",&a[i]); 40 65 78 86 96 printf("\n"); for (j=0; j<N-1; j++) /*确定基准位置 */ for(i=j+1; i<N; i++) if (a[j]>a[i]) { t=a[j];a[j]=a[i];a[i]=t; } printf("The sorted numbers: \n"); … }
冒泡法排序
20
F
2013-8-7
21
#define N 6 main( ) { int a[N]; 程序运行情况如下: 3 7 5 6 8 0 int i,j,t; 0 3 5 6 7 8 for (i=0; i<N; i++) scanf("%d",&a[i]); for (j=1; j<=N-1; j++) /*控制比较的趟数 */ for (i=0; i<N-j; i++) /*两两比较的次数 */ if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } printf("The sorted numbers: \n"); …… }
2013-8-7
【例4.5】选择法排序(续)
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] T F a[j]与a[i]交换 输出a[0]~a[N-1] 图6.3 选择法排序
23
2013-8-7
2013-8-7
4.1.2 数组元素的引用
格式:
10
数组名[下标表达式]
例如:输入学生成绩 for(i=0;i<5;i++) scanf("%f",&score[i]);
例如:fib[n]=fib[n-1]+fib[n-2]; 下标表达式的值必须是整型表达式。
2013-8-7
4.1.2 数组元素的引用(续)
1
第4章
数 组
刘培华
烟台大学 计算机学院
作业与实验
1. 2.
2
实验 p110
实验7: 例4.1-4.15
1.
作业
习题:p107 一、 二、 三、 四、 2、作业本:五(2、3、5、7、9、10)
2013-8-7
第4章 数组
3
本章重点介绍 :
4.1 一维数组 4.2 二维数组 4.3 字符数组与字符串
14
2013-8-7
4.1.4 一维数组应用举例
15
【例4.1】将10个人的成绩输入计算机后按逆序显示。 #define N 10 main( ) { int i;float score[N]; for (i=0; i<N; i++) scanf("%f",&score[i]); for (i=N-1; i>=0; i--) printf("%6.1f",score[i]); } 运行情况如下:
2013-8-7
数组
是由相同的数据类型按照一定顺序排列的 一组变量的集合。 是一种构造数据类型。 其中的数据可以是基本类型 (int,flaot,char,…)、指针类型和结构类 型等。 其中的数组元素通过下标来引用。 适用于处理大量同类型数据。 占用内存中连续的存储单元。
6
2013-8-7
4.1 一维数组
4.1.1 一维数组的定义
7
Fra Baidu bibliotek
数据类型 数组名[常量表达式];
例如: int a[10]; float score[5];
“数据类型”: 是数组元素的数据类型。 “数组名”: 遵循C语言标识符规则。 “常量表达式”:表示数组中有多少个元素,即数 组的长度。它可以是整型常量、整型常量表达式 或符号常量。
2013-8-7
【例4.4】冒泡法排序(从小到大)。
以6个数:3、7、5、6、8、0为例。
18
第一趟排序情况如下:
375680 第一次 3和7比较,不交换 3 7 5 6 8 0 第二次 7和5比较,交换 357680 第三次 7和6比较,交换 356780 第四次 7和8比较,不交换 3 5 6 7 8 0 第五次 8和0比较,交换 356708 在第一趟排序中,6个数比较了5次,把6个数中 的最大数8排在最后。
2013-8-7
4.1.3 一维数组的初始化
初始化:在定义数组时给数组元素赋初值。
1.在定义数组时,对全部数组元素赋初值 例如:int a[5]={0,1,2,3,4}; 此时可以省略数组长度,例如:int a[ ]={0,1,2,3,4}; 2.在定义数组时,对部分数组元素赋初值 例如:int a[5]={1,2,3};系统为其余元素赋 0 。 3.当初值的个数多于数组元素的个数时,编译出错 例如: int a[5]={0,1,2,3,4,5};
② [ ]是下标运算符, 引用数组元素时, 根据数组的首地址 和下标数,计算出 该元素的实际地址, 取出该地址的内容 进行操作。 如引用 score[2]: (1)计算 2000+2*4=2008 (2)取出2008的内容
12
2000H 2004H 2008H 200CH 218CH
91.5 34.5 67.5 72.0
16
2013-8-7
17
main( ) { int a[5],max,min,i,j,k; 程序运行情况如下: for(i=0; i<5; i++) 5 7 2 3 1 scanf("%d",&a[i]); 5 1 2 3 7 min=a[0]; max=a[0]; j=k=0; for (i=1; i<5; i++) if (a[i]<min) { min=a[i]; j=i; } else if (a[i]>max) { max=a[i]; k=i ; } a[j]=max; a[k]=min; for (i=0; i<5; i++) printf("%5d",a[i]); printf("\n"); }