C语言第六章:一维数组
C语言_ch06_1_一维数组
}
2013-3-13
12
例6.2 用数组处理求Fibonacci数列问题
解题思路:
例5.8的缺点?
每次输出,都需重新计算。 工作有效率就是做事不重复
如果用数组处理,每一个数组元素代表数列中的一 个数,依次求出各数并存放在相应的数组元素中
2013-3-13
13
#include <stdio.h>
for (i=0; i<10; ++i)
printf("%d ", a[i]); printf("\n");
2013-3-13
24
数组下标丌能越界
下标越界是大忌!
编译器不会报错 使用大于最大下标的下标,将访问数组以外的空间。 那里的数据不是我们所想定的情况,可能带来严重 后果 有时,故意越界访问数组会起到特别效果,但一定 要对自己在做什么了如指掌
2013-3-13
28
本周日实验02
2013-3-13
29
} 2013-3-13
14
例6.3 有10个地区的面积,要求对它们按由小 到大的顺序排列。
解题思路:
把题目抽象为:“对n个数按升序排序”
采用起泡法排序
动画演示
2013-3-13
15
for(i=0; i<5; i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }
打印每个月的天数
/* day_mon1.c -- prints the days for each month */ #include <stdio.h> #define MONTHS 12
C语言第六章_数组_2
if (a[i]>a[i+1])
{temp=a[i];a[i]=a[i+1];a[i+1]=temp;14}
#include <stdio.h> main(){ /*对10个整数排序*/
int a[10]={9, 8, 5, 4, 2, 0, 6, 1, 3, 7}, i, k; for (k=1;k<10;k++)
f0=1 (n=0m) ain(){
f1=1
(n=1) int i; long f [20]={1,1};
0 f1n=fn-1f+[0f]n-2 (nfo2r) (i=2;i<20;i++)
1
1
f[1]
2
2
f[2]
f[i]=f[i-2]+f[i-1];
3
3
f[3]
for(i=0;i<20;i++)
4
数组是具有一定顺序的若干同数据类型变 量的集合体。数组要有名称,要有规模。
一.一维数组定义
类型说明符 数组名[常量];
例如:int a[6]; a = = &a[0]
a
内存映象:编译时分配一片连续的内 存空间,数组名为该空间的首地址— —常量地址。
0 a[0]
1 a[1]
2 a[2]
3 a[3]
1
4 a[4]
4
一行一行地存储所有的数组 5
a[0][1] a[0][2] a[0][3] a[1][0] a[1][1]
元素,数组名为该空间的首 6 a[1][2]
地址——地址常量。
7 a[1][3]
8
一维数组(C语言)ppt课件
printf(“\n〞);
}
B、运用getchar putchar getch getche函数。
字符数组
〔2〕将整个字符串一次输入或输出。用%s格式符。 例:char c[ ]=“china〞; printf(“%s〞,c);
结果为:china
留意: A、输出字符不包括终了符‘\0’; B、用%s格式符输出字符串时,printf 函数中的输出项是字
printf(“请输入数字字符串:〞); Scanf(“%s〞,str);
strlen(str)
main( ) {
insert(str)
char str[10]; scanf(“请输入
数字字符串:%s\n〞,&str);
insert(str);
}
char str[ ]; { int i1;
for(i1=strlen(str[10]);i1>0; i1--) {
一维数组
4、数组元素的初始化 普通方式为:
类型名 数组名[整型常量表达式]={常量1,常量2,…}
例:int a[10]={1,2,3,4,5,6,7,8,9,10}; 该语句定义了一个动态数组,并对该动态数组进展了初始化。
留意: 1、所赋初值的类型必需与阐明的类型一致。 2、在指定初值时,第一个值赋给下标为0的元素。 3、不能够跳过前面的元素给后面的元素赋初值。
scanf(" %d",&a[i]); printf(" \nyou input is :"); for (i=0;i<10;i++) printf(" %d, ",&a[i]); }
一维数组
C语言一维数组
6
例题巩固
在C 语言中,引用数组元素时,其数组下标的 数据类型允许是 。 A)整型常量 B)整型表达式 C)整型常量或整型表达式 D)任何类型的表达式
C语言中,数组名代表 A.数组全部元素的值 B.数组首地址 C.数组第一个元素的值 D.数组元素的个数
合法的数组定义是 A.int a[ ]=”string”; B.int a[5]={0,1,2,3,4,5}; C.char a=”string”; D.char a[ ]={0,1,2,3,4,5};
以下程序的输出结果是________。 main( ) { int i,p=0,a[10]={1,5,9,0,-3,8,7,0,1,2}; for(i=1;i<10;i++) if(a[i]<a[p]) p=i; printf("%d,%d\n",a[p],p); } A) -3,4 B) 0,1 C) 9,2 D) 2,9
35
35
int a[5]
a[0] a[1] 第一轮 21 13 13 13 21 21
a[2] 90 90 90
a[3] a[4] 32 32 32 -1 -1 -1
13 13
21 21
32 32
90 -1
-1 90
第一轮的结果: 将最大的数移到了最后一个位置(n-1)。
int a[5]
a[0] a[1]
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] 0 1 2 3 4 5 6 7 8 a[9] 9
数组a
max = a[0];
32
32
定义
main()
{ int i, max, x[10];
C语言电子教案第六章一维数组
元素:属同一数据类型,用数组名和下标确定
6.1一维数组
一维数组的定义
定义方式:数据类型数组名[常量表达式];
例int a[6];
一维数组的引用
数组必须先定义,后使用
只能逐个引用数组元素,不能一次引用整个数组
数组元素表示形式:数组名[下标]
其中:下标可以是常量或整型表达式
(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置
(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
#include <stdio.h>
main()
{ int a[11],i,j,t;
printf("Input 10 numbers:\n");
for(i=1;i<11;i++)
printf("Minimum value is %d\n",min);
}
例用冒泡法对10个数排序
排序过程:
(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上
c语言电子教案第六章一维数组
2
课
题
一维数组
教学目标
一维数组的定义,调用数组中的元素
教学重点
一维数组定义的方式,调用规则以及初始化
教学难点
一维数组的应用,多种方法对数组中的元素排序
课型
公共课
教学媒体
多媒体
教法选择
讲授,举例,演示
教学过程
教法运用及板书要点
c-chap6一维数组
6.1 总结与回顾
5.求解问题的局限: – 数据抽象的局限 很多客观世界的事物很难抽象到简单 的数据类型上。比如:数列或级数的 抽象。 – 存储能力的局限 – 处理能力的局限 比如对任意数列的排序和查找问题, 依照目前的能力尚不能够进行处理。 • 解决上述问题的基本思路: 增强数据的表达、存储和处理能力。
15
2000H 2004H
2008H
200CH
6.3.2 数组的初始化
二. 数组的初始化 C语言中可利用声明语句对数组元素的值进行初始化 :
元素类型名 数组名[整型表达式]={值,值„„值};
例如: int score[4]={65, 78, 54, 91}; 数组初始化是在编译阶段 进行的。这样将减少运行 时间,提高效率。
1.高级语言的基本能力 - 简单数据类型(整型/实型/字符型) - 程序控制结构(顺序/分支/循环、子程序调 用) 2.算法与算法设计的基本方法 - 算法是求解问题的基本思路和步骤。 - 采用自顶向下/逐步求精的算法设计方法。 3.数据类型(数据结构)+算法=程序
3
6.1 总结与回顾
4.数据类型的内涵(三要素) – 数据的抽象(定义,逻辑结构) 整数/实数/字符等是对客观世界事物(数 据)的抽象,逻辑表达。 – 数据的存储空间(范围,存储结构) 长整型、短整形、浮点数、字符等数据 所分配的存储空间各不相同。 – 数据的操作 算术、逻辑、关系运算。
score[0] score[1] score[2] score[3]
2000H 2004H 2008H 200CH
13
6.3.1 数组的声明
一、数组的声明:(C99标准) 允许声明变长数组 元素类型名 数组名[整型表达式]; int n; scanf("%d",&n); int score[n];//数组长度为变量
C语言程序设计 – 第 06 章课后习题
C语言程序设计– 第六章课后习题电子13-02班王双喜一、选择题1. C语言中一维数组的定义方式为:类型说明符数组名(C)A. [整型常量]B. [整型表达式]C. [整型常量]或[整型常量表达式]D. [常量表达式]2. C语言中引用数组元素时,下标表达式的类型为(C)A. 单精度型B. 双精度型C. 整型D. 指针型3. 若有定义:int a[3][4];,则对a数组元素的非法引用是(D)A. a[0][3*1]B. a[2][3]C. a[1+1][0]D. a[0][4](解释:A、B、C均正确,D看起来引用不太妥当,但其亦有其意义(a[0][4]等价于a[1][0]))4. 若有定义:int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};,则a数组的第一维大小是(C)A. 1B. 2C. 3D. 4(解释:共9个元素,除以3即可得第一维大小是3;若有余数,则应加1)5. 若有定义:int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};,则值为5的表达式是(C)A. a[5]B. a[a[4]]C. a[a[3]]D. a[a[5]]6. 要求定义包含8个int类型元素的一维数组,以下错误的定义语句是(A)A. int N = 8;int a[N]; B. #define N 3while (a[2*N+2];C. int a[] = {0, 1, 2, 3, 4, 5, 6, 7};D. int a[1+7] = {0};(解释:数组的大小必须是整型常量或整型常量表达式)7. 若二维数组a有m列,则在a[i][j]前的元素个数为(A)A. i * m + jB. j * m + iC. i * m + i - 1D. i * m + j - 18. 下面是对数组s的初始化,其中不正确的是(D)A. char s[5] = {"abc"};B. char s[5] = {'a', 'b', 'c'};C. char s[5] = "";D. char s[5] = "abcdef";(解释:D中元素个数太多,算上'\0'共六个,非法)9. 下面程序段的运行结果是(B)char c[] = "\t\v\\\0will\n";printf("%d", strlen(c));A. 14B. 3C. 9D. 字符串中有非法字符,输出值不确定(解释:字符串中第四个是'\0'即结束标志,因此字符串长度是3)10. 判断字符串s1是否等于s2,应当使用(D)A. if (s1 == s2)B. if (s1 = s2)C. if (strcpy(s1, s2))D. if (strcmp(s1, s2) == 0)(解释:对于字符串来讲,其名字的内容是该字符串的起始地址,不能通过比较名字来比较相等,而应该用专用的函数进行逐字符匹配)二、写出程序的执行结果1. 程序一:# include <stdio.h>main(){int a[3][3] = {1, 3, 5, 7, 9, 11, 13, 15, 17};int sum = 0, i, j;for (i = 0; i < 3; i++)for (j = 0; j < 3; j++){a[i][j] = i + j;if (i == j) sum = sum + a[i][j];}printf("sum = %d", sum);}执行结果:打印sum = 6.(解释:a中各个元素的值是其行和列数字之和,sum内保存a中对角线元素之和,即sum = 0 + 2 + 4)2. 程序二:# include <stdio.h>main(){int i, j, row, col, max;int a[3][4] = {{1, 2, 3, 4}, {9, 8, 7, 6}, {-1, -2, 0, 5}};max = a[0][0]; row = 0; col = 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("max = %d, row = %d, col = %d\n", max, row, col);}执行结果:打印max = 9, row = 1, col = 0.(解释:此程序的功能是逐行逐列扫描元素,总是将最大的元素赋给max,并保存该元素的行数和列数;因此执行完毕后,max是最大的元素(9),row是其行数(1),col是其列数(0))3. 程序三:# include <stdio.h>main(){int a[4][4], i, j, k;for (i = 0; i < 4; i++)for (j = 0; j < 4; j++)a[i][j] = i - j;for (i = 0; i < 4; i++){for (j = 0; j <= i; j++)printf("%4d", a[i][j]);printf("\n");}}执行结果:第一行打印0;第二行打印1 0;第三行打印2 1 0;第四行打印3 2 1 0。
第6章数组(一维数组)
9
31
1
for ( i=0; i<n-1; i++ ) for (( j=0; j<n-1-i; j++ ) for j=0; j<n-1; j++ ) 相邻两数比较, ) if ( a[j]>a[j+1] 前小后大 a[j]a[j+1]
• • • • • 其他不变,改变声明项为:int 其他不变,改变声明项为:int 其他不变,改变声明项为:int 其他不变,改变声明项为:int 其他不变,改变声明项为: int n; a[n]={0,1,2,3}; a[4]={0,1,2,3}; a[4]={2,8}; a[4]={2,4,6,8,10}; a[4]={2,4,6,d};
注意: 不能写成 b=a;
•例:(P159)
16
[例] N盏灯排成一排,从1到N按顺序依次编号。有N 个人也从1到N依次编号。第一个人(1号)将灯全部 关闭。第二个人(2号)将凡是2和2的倍数的灯打开。 第三个人将凡是3和3的倍数的灯做相反处理(该灯如 为打开的,将它关闭;如为关闭的,将它打开)。以 后的人都和3号一样,将凡是与自己相同的灯和是自 己编号倍数的灯做相反处理。请问:当第N个人操作 之后,哪几盏灯是点亮的。
17
#include <stdio.h> #define N 10 void main(void) { int lamp[N+1]; int i,j,k; for(i=1;i<=N;i++) /*将灯全部关闭*/ lamp[i]=0; for(i=2;i<=N;i=i+2) /*将凡是2和2的倍数的灯打开*/ lamp[i]=1; for(j=3;j<=N;j++) /*将3和3的倍数的灯做相反处理*/ for(i=j;i<=N;i=i+j) for(i=1,k=j;k<=N;k=i*j,i++) lamp[i]=!lamp[i]; for(i=1;i<=N;i++) if(lamp[i]) printf("%2d", i); }
C语言第六章:一维数组
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
第2轮比较后
第3轮比较后
外循环
第8轮比较后
第9轮比较后
内循环
23 25 34 52 56 78 83 88 100 123
23
25
34
52
56
78
83
88
100
123
for(i=0; i<=8; i++)
问题:如何使用冒
一、顺序查找法
• 假设数组a[0]、a[1]、…、a[N-1]中保存有N个数据,从中 查找一个数据F。若F在数组a中存在,则显示元素下标; 若不存在,显示不存在信息。 顺序查找法:
从数组第1个元素依次向后与要找的数据F比较;若相同,则查找结束 ;若不相同,则继续查找,直至数组最后一个元素。若所有元素均不 等于F,则说明F不在数组a中。
<
“擂台法”也适用于求最小值
一维数组应用举例
例 随机生成10个三位数整数,求其平均值.
例 用数组求Fibonacci数列前30项.
三、常用排序算法
1.选择排序法
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
选择排序法的算法是: (1)第一趟,从N个元素中找出最小者,与第1个元素进行交换 位置. (2)第二趟,从剩下的N-1个元素中,找出最小的元素,与第2个 数进行交换位置. (3)依次类推,选择N-1次后,所有的元素都已按照从小到大的 顺序排列,每次操作都选择最小的与排头位置相交换. 最后,数组A中的数据成升序排列(相对于数组元素下标)。
三、常用排序算法
3. 冒泡排序法
第6章C语言数据结构之一维数组
for (i=0; i<=3; i++)
scanf (“%d”,&a[i]); for (i=3; i>=0; i--)
61 85 93 76
printf(“%d”,a[i]);
return 0; }
6.1.3 一维数组的初始化
基本形式
在定义一维数组的同时给数组元素赋初值称为一维数组的 初始化。
一维数组初始化的一般形式如下: 类型说明符 数组名[数组长度] ={常量表达式0,…,常量表达式n-1};
数组作为函数的参数时 传递的是首地址。
3. 当逐个使用数组中的每一个元素时,通常借助for循环语句。
0123456789
6.1.2 一维数组的引用
实例分析
#include <stdio.h> 此程序的功能? 如果输入76、 93、85和61, 运行结果?
int main()
{ int i,a[4];
C语言程序设计
课程回顾
C语言中控制结构有几种?
有哪3种循环结构?
while、do …while、for循环
while、do…while循环的语句格式 while (表达式) { 循环体语句; }
do { 循环体语句; }while (表达式);
课程回顾
for(表达式1;表达式2;表达式3)
int i,a[10]; for (i=0; i<=9; i++) scanf(“%d”,&a[i]); for (i=0; i<=9; i++) printf(“%d”,a[i]); ……
21
课程回顾
1、下列对一维数组a的说明正确的是( )? A.int a(10); C.int n; scanf(“%d”,&n); int a[n]; B.int n=10, a[n]; D.#define SIZE 10 int a[SIZE];
C语言一维数组的定义和引用数组.ppt
12 3 a=
45 6
00 30 a= 0 0 0 0
0 10 0 0
7.2.4 二维数组程序举例 例T7-4 将一个二维数组的行和列元素互换, 存到另一个二维数组中 。
123 a=
456
14 b= 2 5
36
T7-4.c两数组行列互换 main( )
printf("a[%d][%d]=%f\n",i,j,a[i][j]);}
}
3.多维数组的定义和在内存中的存放顺 序:
如 int a[2][3][4]; 共24个元素,在内存中排列的顺序是 :第三维变化最快,用 形式:数组名[下标][下标] 其中:下标是整型或字符型的常量,变量或表 达式。(定义时不能使用变量)
2. 只给部分元素赋值 如: int a[5]={1, 3, 5};
3. 初始化时给全部元素赋0值 如:int a[5]={0,0,0,0,0}; 或 int a[5]={0};
4. 对全部元素赋初值时可以不指出长度 如:int a[5]={2,4,6,8,10};
或 int a[ ]={2,4,6,8,10}; 效果一样 。
printf (“a[5]=%d\t”,a[5]);
printf (“a[6]=%d\ n”,a[6]);
}
运行结果:
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
a[5]=-30
a[6]=285
4.数组大小的定义只能是常量,而不能是变 量或动态地定义。 例7-0-2. C main( ) { int n=5,a[n];
3.引用方法:针对元素而不是整个数组。 如:a[0]=a[‘b’ - ‘a’] + a[‘ b’ -96] +a[3] - a[2*2]
河南理工大学C语言课后习题答案精解第六章
a[1][1] a[1][2] a[1][3] 1 0 -1
a[2][1] a[2][2] a[2][3] 2 1 0
a[3][1] a[3][2] a[3][3]
0 1 2
0 1
0
第六章 数组
2. 写出程序的运行结果
(4) 程序四:
#include <stdio.h> main( ) { int i, s; i的ASCII码为105 char s1[100], s2[100]; printf(“input string1:\n”); n的ASCII码为110 gets(s1); printf(“input string2:\n”); gets(s2); s=-5 i=0; while((s1[i]==s2[i]) && (s1[i]!=„\0‟)) i++; if((s1[i] ==„\0‟) && (s2[i]==„\0‟)) s=0; 输入数据: aid else s=s1[i]-s2[i]; printf(“%d\n”,s); and }
B.a[a[4]]
C. a[a[3]]
D. a[a[5]]
第六章 数组
1. 选择题 (6) 要求定义包含8个int类型元素的一维数组,以下错误的定义 语句是 A A. int N=8; B. #define N 3 int a[N]; int a[2*N+2]; C. int a[ ]={0,1,2,3,4,5,6,7} D. int a[1+7]={0}
第六章 数组
3. 程序填空 (3)把一个整数转换成 #include <stdio.h> #define M 80 void main() { long int n=1234567; char s[M]; int j=0; while ( n!=0 ) { s[j]= n%10+’0’; n/=10; j++; } s[j]='\0' ; printf("\n%s",s); }
一维数组的定义及引用(精)
6.2.3 二维数组的引用
二维数组引用的一般格式为: 数组名[下标] [下标]; 如:a[2][1]表示引用二维数组a的第2行第1列的元素。
第六章 数组
6.2 二维数组的定义和引用
6.2.4 二维数组初始化 对二维数组初始化方法如下: (1)分行初始化二维数组。如: static int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; (2)按元素在内存中存放顺序依次给全部元素初始化。如: static int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 它的效果同上,二者此时可省略第一维下标。 (3)对部分元素初始化。此时不可省第一维下标。如: static int a[3][4] = {{1},{5},{9}};
它的初始化结果为:
1 0 0 0 5 0 0 0 9 0 0 0
第六章 数组
6.2 二维数组的定义和引用
6.2.5 二维数组应用举例 【例6.3】求3×4矩阵中最大者,并输出其所在行、列。 其思路为:以一个3×4数组存放该矩阵,以变量max标记该矩阵的最大值,以变量row 、 colum标记最大值所在的行、列。设第一个元素a[0][0]最大并将它作为max的初始值,而 后用数组的每一个元素与max比较;若 a[i][j]大于max 则将a[i][j]赋予max ,并且将i、j赋 予row、colum。 源程序如下: main() { int a[3][4]; void inputdata(int a[][]); void bijiao_output(int a[][]); inputdata(a); bijiao_output(a); }
第六章 数组
6.3 字符数组
一维数组的定义及引用(精)
求第几个最大值有关。对10个数由大到小排列的程序如下:
第六章 数组
main() { int i,j,t,a[10]; printf("enter 10 numbers:\n"); for(i=0;i<10;i++) { printf("a[%d]= ",i); scanf("%d",&a[i]); } printf("\n"); for(i=0;i<9;i++) { for(j=i+1;j<10;j++) if(a[i]<a[j]) { t=a[i];a[i]=a[j];a[j]=t; } printf("%d ",a[i]); } printf("%d\n",a[9]); } 本例在给数组各元素键入值时,通过printf() 函数进行动态提示。
数组元素引用的一般形式为:
数组名[下标表达式]; 注意:在引用中,下标表达式可以含有变量,但该变量此时应具有确定的值。 如:
┇
int i = 2,a[20]; a[i] = 100; 就是合法的引用。 /*定义*/ /*引用*/
第六章 数组
6.1.4 一维数组的初始化 定义数组就是为了使用,对数组的使用不外乎这样几种情况: (1)用数组存储数据。 (2)对存储的数据进行加工。 (3)对数组数据的输出。 不管那一种用法都要先定义后引用。 对数组数据的输出只是在输出语句中引用数组元素,如:printf("%d",a[0]); 对数组数据的加工只是对数组元素进行其类型范围内的各种操作。如:对int型数组a, 下面的操作是合法的。 a[0]4+a[1]/a[2]; 用数组存储数据就是要给数组元素赋值。赋值有两种方法:(1) 用赋值语句或输入 语句依次给数组元素赋值;(2) 在定义数组时给其赋值(即初始化)。 C语言规定只有静态的和外部的数组才能对其初始化。 对数组初始化可分以下几种形式: (1)对数组元素全部初始化。这种情况可不指定数组长度。如: static int a[] = {1,2,3,4,5}; 它等价与static int a[5] = {1,2,3,4,5}; (2)对数组元素部分初始化。这种情况必须指定数组长度。如: static int a[5] = {1,2,3};它表示将1,2,3分别赋给数组的前三个元素,后两个元素 系统自动为其赋值为0。 如对静态的和外部的数组不显式初始化,系统自动为其赋值为0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
比较 83 4 100 不交换
第7次比较结果 第8次比较结果 第9次比较结果
23 23 23
56 56 56
52 52 52
83 83 83
88 88 88
78 78 78
25 25 25
比较 100 8 123 34 不交换 比较 100 123 9 34 交换 100 34 123
三、常用排序算法
擂台
23 23
#include<stdio.h> main() { int a[ ]= {23,56,83,52,100,88,78,25,34},max,i; max=a[0]; /* 擂台初值 */ for(i=1,i<=8;i++) /* 循环 */ if(a[i]>max) max=a[i]; /* 让每个数与擂台上的数比较,大者留在擂台上 */ printf(“最大值:%d”, max); }
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
第2轮比较后
第3轮比较后
外循环
第8轮比较后
第9轮比较后
内循环
23 25 34 52 56 78 83 88 100 123
23
25
34
52
56
78
83
88
100
123
for(i=0; i<=8; i++)
二、一维数组的定义与引用
一维数组的定义
数组名的命名规则与 变量的命名规则相同 [
必须是方括号! ]
类型说明 数组名[常量表达式]
空格 至少一个空格! 指定数组元素的个 数,又称数组长度。 必须是已知大小的 常量。
可以是任何一种基本 数据类型或构造类型。 指定数组中所有元素 的共同数据类型。
第六章
一维数组与排序算法
教学目的
理解数组与数组元素概念,掌握一维数组的定义与引用 掌握常用排序算法
讲授提纲
一、数组与数组元素概念 二、一维数组的定义与引用 三、常用排序算法
重点
难点
一、数组与数组元素概念
已经学习的C语言基本数据类型:
整型(short、int、long) 实型(float、double、long double) 字符型(char) 空类型(void) 所谓构造类型:由已存在的
数组 长度
#include<stdio.h> main() { int a[10], i, s=0; for(i=0; i<=9; i++) a[i] = i+1; for(i=0; i<=9; i++) s = s+ a[i]; printf(“a[0]+a[1]+…+a[9]=%d”,s); }
一轮冒泡过程示意图
A[0] A[1] A[2] A[3] 比较 原始状态 23 1 56 83 52 不交换 比较 第1次比较结果 23 56 2 83 52 不交换 比较 3 52 第2次比较结果 23 56 83 交换 第3次比较结果 23 56 52 A[4] A[5] A[6] A[7] A[8] A[9] 100 100 100 88 88 88 88 78 78 78 78 25 25 25 25 123 123 123 123 34 34 34 34
三、常用排序算法
3. 冒泡排序法
原始状态 第1轮比较后 23 23 23 23 56 56 56 56
全程冒泡示意图 for(j=0; j<=9-i-1; j++)
83 52 83 83 52 83 52 52 100 88 88 78 88 78 78 25 78 25 25 34 25 100 34 88 123 34 100 100 34 123 123 123
数据类型构造的(或自定义的) 组合(或复合)数据类型。
等待学习C语言数据类型:
构造类型: 数组、结构体、共同体、枚举类型 指针类型
一ห้องสมุดไป่ตู้数组与数组元素概念
数组又称下标变量,是一组同类型的变量的有序的集合。 数组中的每个变量称为数组的一个元素。可以用数组名称 与数组的下标惟一地确定一个数组元素。 例如:一个班有30个学生,用 s1,s2,s3,‥,s30 来表示30个学生的某科成绩,其中,s15就表示第15个学 生的成绩。S是数组名,下标表示序号。在C语言中用 s[15]表示s15,则s[15]为数组s的一个元素。 在C语言中,数组变 数组包括一维数组和多维数组。 量的下标必须写在方 括号中!!
char c[12];
/* 定义12个字符变量 */
c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9]c[10]c[11]
二、一维数组的定义与引用
一维数组的引用
数组是一种变量,必须先定义后使用,而且只能引用数 组元素,而不能引用整个数组。数组元素引用格式是:
<
“擂台法”也适用于求最小值
一维数组应用举例
例 随机生成10个三位数整数,求其平均值.
例 用数组求Fibonacci数列前30项.
三、常用排序算法
1.选择排序法
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
选择排序法的算法是: (1)第一趟,从N个元素中找出最小者,与第1个元素进行交换 位置. (2)第二趟,从剩下的N-1个元素中,找出最小的元素,与第2个 数进行交换位置. (3)依次类推,选择N-1次后,所有的元素都已按照从小到大的 顺序排列,每次操作都选择最小的与排头位置相交换. 最后,数组A中的数据成升序排列(相对于数组元素下标)。
问题:如何使用选 择排序法实现升序 排序? <
三、常用排序算法
3. 冒泡排序法
例 从键盘输入10个数,然后,按由小到大的次序将它们显示到屏幕上 (要求用冒泡排序法)。
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
冒泡排序法算法: (1) 从A[0]至A[9],依次把两个相邻的元素两两比较, 即 A[0]与A[1]比较、A[1]与A[2]比较、„、A[8]与A[9]比较 如果前元素大于后元素 ,则交换两元素的值;否则,不交换(即大者下 沉、小者上浮)。结果是将最大者交换到A[9]。 (2) 再从A[0]至A[8], A[0]与A[1]比较、A[1]与A[2]比较、…、A[7]与A[8]比较 如果前元素大于后元素 ,则交换两元素的值。结果是将最大者交换到A[8]。 (3) 依次类推,直至比较N-1趟,所有元素则按升序排列.由于大数不断下沉, 小数不断上浮,故称冒泡排序. N个数,用冒泡排序,第一趟要比较N-1次,第2次,比较N-2次,……..,第K趟,要 比较N-K次
二、一维数组的定义与引用
一维数组的定义 例如: int a[10]; /* 定义10个整型变量 */
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
4 字 节
a[9] 4 字 节
float b[8];
b[0] b[1]
/* 定义8个单精度变量 */
b[2] b[3] b[4] b[5] b[6] b[7] 1 字 节
3. 冒泡排序法
例 从键盘输入10个数,然后,按由小到大的次序将它们显示到屏幕上 (要求用冒泡排序法)。
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
#include<stdio.h> 泡排序法实现降序 main() 排序? < { int A[10], i, j, temp; printf(“输入10个整数: ”); for(i=0; i<=9; i++) scanf(“%d”,&A[i]); /* 输入 */ for(i=0; i<=8; i++) /* 冒泡9轮 */ for(j=0; j<=9-i-1; j++) /* 第i轮冒泡,将最值移至A[9-i] */ if(A[j]>A[j+1]) {temp =A[j]; A[j] =A[j+1]; A[j+1] =temp;} printf(“\n升序排序结果是:\n”); for(i=0; i<=9; i++) printf(“%d\t”,A[i]); /* 输出 */ }
for(i=0; i<N-1; i++) if(a[i]==F) break; If(i>=N) printf(“没有找到!\n”); else printf(“%d在a[%d]\n”, F, i);
一、顺序查找法
[例1] 随机产生100个0~99的随机整数存于数组中并显示于屏 幕上。然后从键盘输入一个数,查找其在数组中的位置。
数组名[下标]
数组元 素的名 称
定义时使 用的名称
注意数组元素下 标从0开始。最后 一个元素的下标 是数组长度-1
可以像使用简单变量一样,为数组的某一元素进行赋值, 或者引用数组中某一元素中的值。
二、一维数组的定义与引用
一维数组的引用
[例]:定义一个名称为a并含有10个元素的整型数组,然后依次把 1,2,3,…,10这10个数存入元素a[0], a[1], a[2] ,…, [9],最后求出这 10个数的和。
#include<stdio.h> main() 数组元 { 素下标 int a[10], s; a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; a[5]=6; a[6]=7; a[7]=8; a[8]=9; a[9]=10; s=a[0]+a[1]+a[2]+a[3] +a[4]+a[5]+a[6] +a[7] +a[8]+a[9]; printf(“a[0]+a[1]+…+a[9]=%d”,s); }