清华大学C语言教学(共16个)第4个

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <stdio.h>
void main()
// 主函数
{
float sheep[10];
// 数组,有10个浮点类型元素,
// 用于存10只羊每一只的重量
float max;
// 浮点类型变量,存放最肥羊的重量
int i,k; //整型变量,i用于计数循环,k用于记录最肥羊的号
max = 0.0;
sum = sum + 1;
a = a + 2.0;
// 计算每一项的分母
b = -b;
// 分子变正负号
c = b / a;
// 计算每一项
}
// 循环体结束
while ( fabs(c) > 1e-6 ); // 当c的绝对值大于10的-6次方时,继续
// 执行循环体,否则退出
pi = 4 * pi;
21
21
2 1 j=3
21
21
21
2 1 j=4 21
21
2
1
j=5
24
冒泡排序算法分析:
从表中可以看出最小的一个数第一遍扫描就交换到a[6] 中。如果将a[1]视为水底,a[6]视为水面:
➢最轻的(最小的)一个数 1 最先浮到水面,交换到a[6]; ➢次轻的 2 第二遍扫描交换到a[5]; ➢再轻的 3 第三遍扫描交换到a[4];
…1 1 9 9 10 1 0 0
方法的依据:
1至100这些自然数可以分为三类:
➢ 单位数:仅有一个数1。 ➢ 素数: 是这样一个数,它大于1,且只有1和它自身这样两
个正因数。 ➢ 合数: 除了1和自身以外,还有其他正因数。
1不是素数,除1以外的自然数,当然只有素数与合数。 筛法实际上是筛去合数,留下素数。
}
21
自学与比较 请同学们去比较三种循环的异同之处
➢ 1. for 循环(计数型循环) ➢ 2. 当型循环(while循环) ➢ 3. 直到型循环(do while 循环)
上机将挑肥羊的程序和筛出素数的程序完成
22
问题:将几个数从大到小排序并输出,介绍冒泡排序法
i=1 i=2 i=3 i=4 i=5 i=6
// 赋初值0
for ( i=0; i<10; i=i+1 )
// 计数循环
{
// 循环,开始
printf(“请输入羊的重量sheep[%d]=”, i); // 提示用
scanf(“%f”, &(sheep[i])); // 输入第i只羊的重量
if ( max < sheep[i] )
{
max = sheep[i];
yes
p rim e [k ] = = 0
k = k + d;
W h ile ( k < = 1 0 0 )
p rim e [k ] = 1 ; k = k + d;
d = d + 1;
d o … w h ile d < = s q rt ( 1 0 0 )
fo r ( c= 2 ; c< = 1 0 0 ; c= c+ 1 )
a[1] a[2] a[3] a[4] a[5] a[6]
初始值 1 8 3 2 4 9
1<8; 1,8互换 1 8 3 2 4 9
1<3; 1,3互换 8 1 3 2 4 9 1<2; 1,2互换 8 3 1 2 4 9 j=1
1<4; 1,4互换 8 3 2 1 4 9
1<9; 1,9互换 8 3 2 4 1 9
for ( i= 0; i< 10; i= i+ 1 ) 提示输入第 i只羊的重量; 键 入 第 i 只 羊 的 重 量 sheep[i];
m ax < sheep[i]


Βιβλιοθήκη Baidu
m ax = sheep[i];
k = i; 存重者,记录第 i只。
输 出 m ax ( 最 重 的 羊 的 重 量 )
输出 k
yes
p rim e [c ] = = 0
p rin tf (“ % d ;” , c );
no
no
12
上述框图很清晰地描述了筛法的思路:
➢ 1.第一块是一个计数型的循环语句,功能是将prime数
组清零。
prime[c] = 0;
c = 2, 3,… ,100
➢ 2.第二块是正因数d初始化为 d = 2。
➢因此在第二遍搜索时,j=2, i=1,2,…,n-j,即 i=1,2,3,4。比较4次之后次小的一个数到达了a[5]。这 时a[5]不必再参与比较了。
➢因此,j=3时,i=1,2,3;j=4时,i=1,2;j=5时,i=1。
理出上述规律后,程序就不难编了 26
冒泡排序算法设计: 为了表述方便,定义以下3个变量:
思路
➢ 1.想象将100个数看作沙子和小石头子,让小石头子权 称素数;让沙子当作非素数。弄一个筛子,只要将沙 子筛走,剩下的就是素数了。
➢ 2.非素数一定是2、3、4 …… 的倍数。 ➢ 3.使用数组,让下标就是100以内的数,让数组元素的
值作为筛去与否的标志。比如筛去以后让元素值为1。
0 0 1 01 0 0 1 2 3 45 6 7
// 得到最终结果
printf(“pi=%f\n”, pi); // 输出pi值
printf(“sum=%d\n”, sum); // 输出总项数
16
}
运行结果 pi = 3.141594, sum = 500001
提问:这种循环当表达式的值永远为真时,
会如何?
答:会构成死循环,即无休止地执行循环体
➢ 2. z = kx, k = 1,2,… ➢ 3. z 一定会被 y 整除
用两个最简单的数试一下就可以找到算法. 比如 x=5, y=3.
19
➢ 第一步 z = x, z % y != 0 不能整除 = 5, 5 % 3 != 0
➢ 第二步 z = z + x
不能整除
= 10, 10 % 3 != 0
int a[5] = { 3, 5, 4, 1, 2 };
a
35 41 2
下 标 0 1 2 3 4
a[0] = 3; a[1] = 5; a[2] = 4; a[3] = 1; a[4] = 2;
7
请自己上机做6个实验
➢ 1.#include <stdio.h>
void main()
{
int a[4];
int sum;
// 整型变量,总项数
float pi, a, b, c;
// 浮点变量,a为分母,b为分子,c为b除以a
pi = 0; sum = 0;
// 初始化
a = 1.0; b = 1.0; c = 1.0; // 初始化
do
// 直到型循环
{
// 循环体,开始
pi = pi + c;
// 累加每一项
8>3;顺序不动 8 3 4 9 3<4; 3,4互换 8 3 4 9 3<9; 3,9互换 8 4 3 9
3到达位置 8 4 9 3 8>4;顺序不动 8 4 9 3 4<9; 4,9互换 8 4 9 3
4到达位置 8 9 4 3 8<9; 8,9互换 8 9 4 3
8到达位置 9 8 4 3
i=5 i=6 a[5] a[6]
➢ 3.第三块是循环筛数。这里用了一个 do while 语句, 属于一种直到型循环,其一般形式为:
do
{ 循环体语句块
}
while ( 表达式 )
13
直到型循环框图如下:
循环体 语句块
真 表达式

循环体 语句块
当表达式为真时 继续循环
直到表达式为假时才退出循环
14
三、数组
例.求π的近似值
41111
请实验:
➢ 1.将b定义为int型看看执行结果并分析为什么 ➢ 2.将1e-6变为1e-7或1e-4看看结果
17
下面还要介绍另一种循环“当循环”
一般形式: while ( 表达式 )
{ 语句块;(循环体)
}
假 表达式

循环体 语句块
While (表达式)
循环体 语句块
18
举例:求两个整数的最小公倍数 分析:假定有x,y且x>y,设最小公倍数为z ➢ 1. z 一定会 >= x
a
下 标 0 1 2 3 4
例如
int a[5] 定义了5个数组元素如下:
a[0], a[1], a[2], a[3], a[4]
这是5个带下标的变量,这5个变量的类型是相同的
➢ 5.常量表达式中不允许包含变量;
例如
int n;
n = 5;
int a[n];
不合法!
6
三、数组
数组初始化
是定义数组完成赋初值的任务 例如
➢ 4.其他不变,改变声明项为 int a[4] = { 2, 4, 6, 8, 10 };
➢ 5.其他不变,改变声明项为 int a[4] = { 2, 4, 6, d };
➢ 6.其他不变,改变声明项为 int n=4; int a[n] = { 0, 1, 2, 3 };
9
三、数组
讨论问题:使用筛法求100以内的所有素数
// 键盘输入两整数 x, y
if ( x < y )
// 让 x 表示两者中的大数
{
w = x;
x = y;
y = w;
}
z = x;
// 将一个大数赋给 z
while ( z % y != 0 )
// 当z不能被y整除时,就让z累加x
{
z = z + x;
}
printf(“%d\n”, z);
// 输出最小公倍数
// 声明项
printf(“a[0]=%d; a[1]=%d; a[2]=%d;
a[3]=%d\n”, a[0], a[1], a[2], a[3]);
}
➢ 2.其他不变,改变声明项为 int a[4] = { 0, 1, 2, 3 };
8
➢ 3.其他不变,改变声明项为 int a[4] = { 3, 8 };
… 依此类推,有6个数,前5个数到位需5遍扫描,第6个最 重的数自然落在a[1]中。因此,6个数只需5遍扫描,即 j=n-1, n=6。
25
冒泡排序算法分析:
再看在每遍扫描中,相邻两数组元素的比较次数。
➢当j=1时,i=1,2,…,n-j。n=6时,比较5次之后a[6]中 有一个最小数到达,这时a[6]不必再参与比较了。
为了提高筛选法效率,注意到: 令n为合数(这里是100),c为n的最小正因数,则据 初等数论
1c n
只要找到c就可以确认n为合数,将其筛去。
11
程序框图如下:
fo r ( c= 2 ; c< = 1 0 0 ; c= c+ 1 )
p rim e [c ] = 0 ;
d = 2;
( 初始化 )
k = d;
➢ n —— 待排序的数的个数,这里 n=6 ➢ j —— 扫描遍数,j=1,2,…,n-1 ➢ i —— 第j遍扫描待比较元素的下标,i=1,2,…,n-j
// 让第i只羊为当前最肥羊
k=i;
// 纪录第i只羊
}
}
// 循环结束
printf(“max=%f\n”, max); // 输出最肥羊的重量
printf(“number=%d\n”, k);// 输出最肥羊的编号
3
}
程序框图
m ax = 0 .0 ; 将 记 录 最 重 的 羊 的 重 量 置 0
1到达位置 8 3 2 4 9 1
8>3;顺序不动 8 3 2 4 9 1
3>2;顺序不动 8 3 2 4 9 1
2<4; 2,4互换 8 2<9; 2,9互换 8
3 3
2 4
4 2
9 9
1 1
j=2
2到达位置
8 3 4 9 2 1 23
i=1 i=2 i=3 i=4 a[1] a[2] a[3] a[4] 中间结果 8 3 4 9
计算机程序设计基础
第四讲 数组
1
三、数组
问题:哪只羊最重?
中秋佳节,有贵客来到草原,主人要从羊 群中选一只肥羊宴请宾客,当然要选最重 者。这样就要记录每只羊的重量,如果有 成千上万只羊,不可能用一般变量来记录 。可以用带有下标的变量,也就是这里要
讲的数组。
2
我们先看例子:用键盘输入10只羊的重量存放到一个 名为sheep的数组中
357
用变量pi表示π的值。
令 c b 表示括号中的每个项 a
a 为 , 3 , 5 , 1 7 , ,b 1
当最后一项的绝对值小于等于 10 6 时,忽略掉以后的项
15
参考程序如下:
#include <stdio.h>
#include <math.h>
void main()
// 主函数
{
➢ 第三步 z = z + x = 15, 15 % 3 == 0 能整除
找到了 z ,15就是5和3的最小公倍数
20
参考程序如下:
#include <stdio.h>
#include <math.h>
void main()
// 主函数
{
int x, y, z, w;
// 整型变量
scanf(“%d%d”, &x, &y);
( 最重的羊是第 k只 ) 4
三、数组
数组的定义
类型说明符 数组名 [ 常量表达式 ] 例: float sheep[10];
int a2001[1000];
说明
➢ 1.数组名的第一个字符应为英文字母;
➢ 2.用方括号将常量表达式括起;
➢ 3.常量表达式定义了数组元素的个数;
5
三、数组
➢ 4.数组下标从0开始。如果定义5个元素,是从第0个元 素至第4个元素;
相关文档
最新文档