资源描述
《C 语言程序设计》实训讲义 目录
第一部分 简单程序设计
第 1 单元 顺序结构程序设计(8 课时)
第 6 单元 迭代算法、递归算法和模拟求解 (4 课时) 任务 1 使用迭代算法进行方程求解 17 任务 2 使用递归算法计算阶乘 18
任务 3 模拟求解问题(选做) 20
第三部分 数据的组织
第 7 单元 利用数组来组织数据(6 课时)
任务 1 同类型多个数据的存储 21 任务 2:一维数组应用 21 任务 3 矩阵问题(二维数组的应用) 22 任务 4:冒泡排序法 23
任务 5:插入排序法 24 任务 6:简单排序法(选做) 24 第 8 单元 利用指针来处理数据(6-8 课时) 任务 1:指针的简单应用 25 任务 2:指针函数的简单应用 26 任务3指针与数组 27 第 9 单元 字符串的处理(6-8 课时) 任务 1 字符数组的简单应用 28 任务 2 利用指针处理字符串 29 任务 3:字符串标准函数的应用 任务4命令行参数 30 第 10 单元结构体(4-6 课时) 任务 1 利用结构体类型处理数据 31 任务 2 结构体数组的应用 32 第 11 单元 文件操作(4 课时) 任务 1 文件的读写操作 34 任务2文件的复制 36
任务 1: 任务 2: 任务3: 任务4 第 2 单元 分支结构程序设计(4-6 课时) 任务1数据的比较 5
任务 2 由菜单选择功能实现 6 任务 3:字符分类 7 第 3 单元 循环结构程序设计(6~8 课时)
8
在显示器屏幕上显示一行字符 2 数据的交换 3
基本算术运算 4 展示算术复合赋值运算符特点 5
引例: 在屏幕上显示指定大小长方形 任务 1: 计算 n! 8 任务 2 简单的数据加密程序 9 任务3求素数 10 任务4设置用户登录密码检查(选做) 11 第 4 单元 用函数组织 C 语言程序(4 课时) 任务 1: 简单函数 12
任务 2 函数声明和嵌套调用 13 任务 3 实现函数间参数的传递
14 第二部分 程序设计算法示例
30
第 5 单元 穷举算法(4 课时)
任务 1: 劳动分工问题 15 任务 2: 逻辑推理 16
1
第一部分 简单程序设计
第 1 单元 顺序结构程序设计(8 课时)
任务 1: 在显示器屏幕上显示一行字符 1.题目:输出“This Is My First C Program.”。
2.程序 1 /* 程序名: u101.c*/
2 #include <stdio.h > 3 int main( ) 4{ 5 printf("Hello World.\n") ; 6 return 0;
7}
3.说明 第1行用/*和*/括起来的是注释行, 用于说明程序的功能或程序的名字 第2行是一个文件包含命令。 第3行中, main 是函数名, 表示“主函数”。每个 C 程序都必须有一个 main 函数, 也只能有一个主函数。 它的结构是这样的:
main( ) {
语句
} printf 函数: C 语言提供的标准输入输出库函数 语句: C 语言的函数体由一些语句组成, 每个语句由一个分号结束。本例中, 主函数只有一个语句: printf("This Is My First C Program.\n");
任务 1.1 知识点: 1. 注释 2. 文件包含命令 3. 主函数
4. printf 函数 5. 转义字符 6. 程序的编译和执行 7. 程序书写格式
4.C 语言程序的编译、连接和执行 第一步: 编辑源程序 第二步: 编译 第三步: 链接
第四步: 执行 5.课堂实践/课后作业
(1) 编写一个 C 语言程序, 在屏幕上显示如下图 形。
****************** ** ** ******************
(2) 编写一个C语言程序, 在屏幕上显示如下菜单 *********************
1 计算绝对值 2 计算倒数 3 计算平方值 4 计算平方根
********************* ---------------------------------------------------------------------------------
2
任务 2: 数据的交换
1.题目 酒杯 A 中盛有红酒, 酒杯 B 中盛有白酒。请将两杯中的酒交换。 2 .算法分析 要交换酒杯 A 和酒杯 B 中的酒, 必须借助第三个酒杯。过程如下: · 准备一个空酒杯 Temp ; · 将 A 杯中的红酒倒入 Temp ; · 将B 杯中的白酒倒入A 中; · 将 Temp 中的红酒倒入 B 中。 3.程序
/*程序名: u102.c*/ #include <stdio.h>
int main( ) {
int a=2, b=3, temp; printf("a=%d, b=%d\n", a, b); temp=a; a=b; b=temp; printf("a=%3d, b=%d\n", a, b); return 0;
}
4.知识点 (1) 变量与常量 (2) 变量的类型和变量类型说明符 (3) 变量名和命名规则 (4) 变量的定义 (5) 赋值运算符 (6) printf 函数的格式参数 5.课堂实践/课后练习 (1) 修改本例, 输出两个字符‘w’ 和‘t’ 。 (2) 分析以下程序的输出结果。 main( )
{ char c ='x' ; printf ("c : dec =%d , oct =%o , hex =%x , ASCII =%c\n " , c , c , c , c) ;
以下单词为 C 语言的保留字(关键字),不能 用作其它用途:
int,char,long,float,double,short,unsigned, struct,union,enum,auto,extern,static, register,typedef,void,if,else,switch,case, default,do,while,for,break,continue, return,goto,define,include,undef,ifdef, endif,line
} (3) 以下 printf 语句中的“-”的作用是 #include<stdio.h> main( ) {
1 , 该程序的输出结果是 2 。
int x=12;
3
double a=3.1415926; printf ("%6d\n", x);\\即%md 的格式, m 为修饰符, d 为格式字符 printf ("%-6d\n", x);\\即%-md 的格式, -和 m 为修饰符, d 为格式字符 printf ("%14.10lf\n", a);\\即%m.nlf 的格式, m、n、l 为修饰符, f 为格式字符 printf ("%-14.10lf\n", a);\\即%md 的格式, -、m、n、l 为修饰符, f 为格式字符
} --------------------------------------------------------------------------------------
任务3: 基本算术运算
1.题目 编写一个显示基本算术运算功能的程序, 并了解算术运算过程中涉及的有关向题。 2.程序
/*程序名: u103. c*/ #include <stdio.h>
int main( ) {
printf("\n1: 2%%3 is %d", 2%3); printf("\n2: 2%%-3 is %d", 2%-3); printf("\n3: -2%%3 is %d", -2%3); printf("\n4: 2.0/3 is %f", 2.0/3); printf("\n5: -2.0/3 is %f", -2.0/3); printf("\n6: 2.0/-3 is %f", 2.0/-3); printf("\n7: 2/3*10 is %d", 2/3*10); printf("\n8: 2.0/3*10 is %f", 2.0/3*10); printf("\n9: 2+3*10 is %d", 2+3*10); return 0;
}
3.运行结果: 右框 4.知识点: 右框 5.课堂实践/课后练习 (1) 先将如下两个数学表达式转换为 C 语言的表达式, 然后编写程序验证。
运行结果 1:2%3 is 2 2:2% -3 is 2 3:-2%3 is -2 4:2.0/3 is 0.666667 5:-2.0/3 is -0.666667 6:2.0/-3 is -0.666667 7:2/3*10 is 0 8:2.0/3*10 is 6.666667 9:2+3*10 is 32
任务 1.3 知识点: (1)算术运算符 (2)算术运算符的优先级和结合性 (3)算术表达式 (4)不同类型数据之间的转换
1
2
(2*3+
2
23
3.0 * 4
3.0 -
4+2
12
(2) 求下面算术表达式的值并编程验证结果: x+a%3*(int)(x+y)%2/4 (3) 阅读下面的程序, 修改其中的错误, 并指出造成错误的原因。
#include<stdio. h> main {
x, y, z; x+y=5; printf("x+y=, z=", x, y, z);
) 设 x=2.5, a=7, y=4.7
} ----------------------------------------------------------------------------------------------
4
任务4 展示算术复合赋值运算符特点
1.题目 编写展示算术复合赋值运算符特点的程序。
2.程序 /*程序名: u104.c*/
#include<stdio.h> int main( ) {
int x=2, y=3, t; printf("\nl: x=%d, y=%d", x=x+1, y); x=2; printf("\n2: x=%d", x+=1); printf("\n3: x=%d", x++); x=2; x++; ++y; printf("\n4: x=%d, y=%d", x, y); t=x++; printf("\n5: t=%d, x=%d", t, x); printf("\n6: y=%d", y-=1); printf("\n7: y=%d", --y); t=++y; printf("\n8: t=%d, y=%d", t, y); printf("\n9: x++=%d, ++x=%d", x++, ++x); printf("\n10: --y=%d, y--=%d", --y, y --); return 0;
}
3.输出结果: 右框 4.知识点: 右框 5.课堂实践\课后练习 (1)已知 int x =8 ;分别写出下面两个 printf 语句的输出结果, 并编程验证 1 printf("%d,%d",x=4,x);
2 printf("%d,%d",x,x++); (2)编写一个 c 语言程序, 根据输入的半径值计算和输出圆的周长、面积及球的体积。 ================================== 第 2 单元 分支结构程序设计(4-6 课时)
任务 1 数据的比较
1.题目 从键盘输入三个数, 输出其中最大的一个数。 2.分析 见框图
运行结果: 1 :x =3 ,y =3 2:x =3 3:x =3 4:x =3 ,y =4 5:t =3 ,x =4 6:y =3 7:y =2 8:t =3 ,y =3 9:x ++=5 ,++x =5 10:--y =1 ,y --=3
任务 1.4 知识点 (1) 自增/ 自减运算 (2) 复合赋值运算符 (3) 复合赋值运算符的优 先级和结合性 (4) 赋值表达式 (5) printf 函数中参数的
5
3.程序 /*程序名: u201.c*/
#include<stdio.h> int main( ) { int a, b, c, max;
printf("Please input three integers(a, b, c): \n"); scanf("%d, %d, %d", &a, &b, &c); printf("The three integers is: "); printf("a=%d\tb=%d\tc=%d\n", a, b, c); if(a>b)
max=a;
else
max=b; if(c>max)
max=c; printf("The max is: %d", max); return 0;
}
任务 2.1 知识点
(1) (2) (3) (4) (5)
"交互式"友好界面 格式输入函数 scanf( ) if...else 结构 关系运算符和关系表达式 逻辑运算符和逻辑表达式
4.知识点:右框 5.课堂实践/课后练习 (1) 对于以下函数 y =f(x) ,请编写程序描述之并画出框图。
---------------------------------------------------------------------------------------
任务 2 由菜单选择功能实现
1.题目 在屏幕上输出菜单,并根据用户输入的选择实现对应的功能。 2 .分析 根据用户输入的字符进行功能实现, 输入 a, 则计算正弦值, 输入 b, 则计算余弦值, 输入 c, 则计算绝对值, 输入 d, 则计算平方根。 3.程序
/* 程序名 u202.c */ #include <stdio.h> #include <math.h> int main()
{
char ch; float x; printf("*************************\n"); printf(" a 计算指数函数值\n"); printf(" b 计算对数值 \n");
6
printf(" c 计算绝对值 \n"); printf(" d 计算平方根 \n");
printf("*************************\n"); printf("请输入 a b c d 中任一字符:"); ch=getchar(); printf("您输入的字符是:"); putchar(ch);
printf("\n 请输入进行运算的数: "); scanf("%f",&x);
switch(ch) {
case 'a':printf("\n%f 的指数函数值是%f",x,exp(x));break; case 'b':printf("\n%f 的对数值是%f",x,log(x));break; case 'c':printf("\n%f 的绝对值是%f",x,fabs(x));break; case 'd':printf("\n%f 的平方根是%f",x,sqrt(x));break; default:printf("\n 菜单选择错误!");
} return 0;
任务 2.2 知识点 (1) 字符输入函数 getchar() (2) 字符输出函数 putchar() (3) 多分支 switch 结构 (4) 库函数的使用
}
4.知识点:右框 5.课堂实践/课后练习 (1) 编程实现第 1 单元任务 1 的课后练习(2)的各功能; (2) 根据输入的字符输出成绩区间: 输入 A 或 a, 成绩在[90, 100); 输入 B 或 b,成绩在[80, 90);输入 C 或 c,成绩在[70, 80); 输入 D 或 d, 成绩在[60, 70); 输入 E 或 e, 成绩在[ 0, 60); 输入其它字符, 显示输入错误。 使用 switch 语句编程实现。 ---------------------------------------------------------------------------------
任务 3:字符分类
1.题目 判断由键盘输入的字符是数宇、字母, 还是空白。 2 .分析
根据输入的字符进行判断, 若是数字, 则输出“digiter” , 若是字母, 则输出“char” , 否则输出“white” 3.程序
/*程序名: u203.c*/ #include<stdio.h>
int main( ) {
char c; printf("Please input c=getchar( );/*输入一个字符*/ printf("\nIt\'s a");/*用\'输出撇号*/ if(c>='0'&&c<='9')
a character: ");
7
printf("digiter!"); else if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
printf("char!");
任务 2.3 知识点 (1) 字符型数据的比较和加减运算 (2) 转义字符的使用 (3) if...else 结构的第三种形式 (4) if 结构的嵌套
else
printf("white!"); return 0;
}
4.知识点:右框 5.课堂实践/课后练习 (1)下面的程序是否能求出三个数中的最大值?为 什么?如何修改?
#include<stdio.h> main( ) {
(2)将以下程序段改用嵌套的 if 语句实现。 int s, t, m;
t=(int)(s/10); switch(t) {
case 10: m=5;break; case 9: m=4;break; case 8: m=3;break; case 7: m=2;break; case 6: m=1;break; default: m=0;
} (3) 使用 if 嵌套编程判断某一年是否闰年.(提示: 闰年能被 400 整除或者能被 4 整除但且不能被 100 整除)
int x, y, z, max; if(z>y)
if(z>x) max=z;
if(y>x) max=y;
}
else printf("\nmax=%d ", max);
任务 3.0 知识点 (1) for 循环结构 (2) 转义字符/t
================================
第 3 单元 循环结构程序设计(6~8 课时)
引例: 在屏幕上显示指定大小长方形 1.题目:在屏幕上显示一个长 20 个星, 宽 17 颗星组成的长方形
2.程序
循环开始
i<=n
/* 程序名 u300.c */ #include "stdio.h"
int main() {
假
i=1,p=1
int i; printf("\t********************\n"); for(i=1;i<=15;i++)
printf("\t* printf("\t********************\n");
return 0;
真(非0)
p*=i
*\n");
i++
}
3.知识点: 上页框内 --------------------------------------------------------------------------------
任务1: 计算n!
8
1.题目:使用 C 语言的三种循环语句编程计算 n 的阶乘 2. 分析: 流程框图(右图) 3. 程序
/* 程序名 u301.c */ #include "stdio.h"
int main() {
int i,n;
long p=1; printf("请输入 n 的值:"); scanf("%d",&n); for(i=1;i<=n;i++)
p*=i; printf("%d!=%d",n,p); return 0;
任务 3.1 知识点 (1) while 语句 (2) do while 语句 (3) 三种循环语句的转换
}
/* 程序名 u302.c */ #include "stdio.h"
int main() {
/* 程序名 u303.c */ #include "stdio.h" int main() {
int i=1,n; long p=1; printf("请输入 n 的值:"); scanf("%d",&n); do { p*=i;
i++; } while(i<=n);
printf("%d!=%d",n,p); return 0;
int i=1,n; long p=1; printf("请输入 n 的值:"); scanf("%d",&n); while(i<=n) { p*=i;
i++;
} printf("%d!=%d",n,p); return 0;
}
4.知识点:右框 5. 课堂实践/课后练习 (1) 编程计算 1+2+...+100 的和.(分别使用 3 种循环语句) -----------------------------------------------------------------------------------------
任务 2 简单的数据加密程序
1. 题目 采用某种方法将输入的数据进行转换, 以实现数据加密。 2. 分析
本题采用的是一种最简单的以字符为单位的置换加密方法。这个方法就是在 ASCII 码表中, 把一个要变 换的字符加上(或减去)一个常数使其变成另外一个字符。如字符‘a’ -32 , 变成了‘A’ 。这里“32” 就称为 密钥(key )。
9
3. 程序 /*程序名: u304. c*/
#include<stdio.h> int main( ) {
int key; char ch; printf("请输入密钥: \n"); scanf("%d", &key); printf("输入明文, 将得到对应密文如下: \n"); while((ch=getchar())!='\n')
(ch+key)>122?putchar(ch-122+33+key): ((ch+key)<33?putchar(ch+122+key): putchar(ch+key)); return 0;
}
4.知识点:右框 5.课堂实践/课后练习 (1) 设计一个与本例对应的解密程序。 ------------------------------------------------------------------------------
任务3 求素数
1.题目 输出 100 以内的素数。 2 .分析
素数是除 1 和它本身之外不能被其他任何整数整除的正整数。本题目可以采用穷举法。 3.程序
任务 3.2 知识点 (1) while 语句表达式 (2) 条件运算符和条 件表达式 (3) 字符的存储与运 算
{
/*程序名: u305.c*/ #include<stdio.h> int main( )
int m, n, flag, j=0; printf("\n The primers in 3~100 is: \n"); for(m=3;m<=100;m++) {
flag=1; /*设置标志*/ for(n=2;n<=m/2;n++) {
if(m%n==0) {
flag=0;/*改变标志*/ break;
}
} if(flag==0)/*判断标志*/
运行结果: The primers in 3 ~100 is :
3 17 37 59 79
5 7 11 13 19 23 29 31 41 43 47 53 61 67 71 73 83 89 97
10
continue; printf("%4d", m); j++; if(j%5==0) printf("\n");
} return 0;
任务 3.3 知识点 (1) 循环的嵌套 (2) break 语句 (3) continue 语句 (4) 标志变量的使用 (5) 如何写出好程序的几条建议
}
4.运行结果:右上框 5.知识点:右框 6.课堂实践
(1)阅读下面的程序, 指 (2) 编程打印如下九九乘法表。要求分别采用三种循环语句编程。
出运行结果。
main( ) {
int a=1, b; for(b=1;b<=10;b++) {
if(a>=8) break; if(a%2==1) {
a+=5; continue;
} a-=3;
} printf("%d\n", b);
123456789 ------------------------------------------------------------------------------------------------------------------ 1*1=1 2*1=2
3*1=3 4*1=4 5*1=5 6*1=6 7*1=7 8*1=8 9*1=9
2*2=4 3*2=6 4*2=8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18
3*3=8 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27
4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36
5*5=25 6*5=30 7*5=35 8*5=40 9*5=45
6*6=36 7*6=42 8*6=48 9*6=54
7*7=49 8*7=56 9*7=63
8*8=64 9*8=72
9*9=81
} ---------------------------------------------------------------------------------------------
任务 4 设置用户登录密码检查(选做)
1.题目 设置用户登录密码检查 功能要求: 1提示用户输入一个密码。 2用户输入密码后, 程序对其进行检查: · 密码对, 则告诉用户: “ 欢迎您使用本系统!” ; · 密码不对, 则告诉用户: “ 您无权使用本系统!” 。 3用户有 5 次验证机会。
2.程序 /* 程序名: u306.c*/
#include <stdio.h > #include <stdlib.h >/* 使用转换函数 atoi 必须包含头文件 stdlib.h*/ #define TIMES 5
11
#define PASSWORD "1234" int main( ) {
char password[10]; /* password 为用户输入的密码*/ int i =0;/*i 为计数器, 记录回答密码次数*/
do {
printf("请输入密码: "); scanf("%s", password); if (!strcmp(password,PASSWORD)) break; else i++;
}while(i<TIMES); if(i<TIMES)
任务 3.4 知识点 (1) 符号常量 (2) 字符串常量 (3) 常用字符串操作函数 (4) break 语句
(5) 计数器
printf("欢迎您使用本系统! "); printf("您无权使用本系统!");
else return 0;
}
3.知识点: 右框 4.课堂实践 (1) 设计一个累加求和程序, 不断将用户从键盘输入的数字加起来, 直到输入回车为止。 ======================================= 第 4 单元 用函数组织 C 语言程序(4 课时)
任务 1: 简单函数 1. 题目: 编写函数计算 n!,并通过函数调用, 计算组合数 C(m,n)= 。
2. 分析 本例根据阶乘的相关运算, 可以设计一个函数, 完成求 n! 的操作。 主函数的功能就是调用该函数, 以实现题目要求。
m!
n!(m-n)!
3.程序
/* 程序名: u401.c*/ #include<stdio.h>
int main() {
int m,n,c; printf(“\n 请输入 m 和 n 的值: "); scanf("%d,%d",&m,&n); c=fac(m)/(fac(n)*fac(m-n)); /*三次调用函数 fac,求 m!、n!、(m-n)!*/ printf("\nC(m,n)=%d",c); /*输出计算结果*/ return 0;
} int fac(int k) /*计算一个整数的阶乘*/
/*输入 n、k 的值*/
{ int i,s=1;
12
for(i=1;i<=k;i++) s*=i;
return(s);
任务 4.1 知识点 (1) 函数定义 (2) 函数调用
}
4.知识点: 右框 5.课堂实践/课后练习 (1)编写 2 个函数,分别求三个数的最大值和最小值,在主函数中计算最大值和最小值之差。 (2) 编写程序,用泰勒(Taylor)级数求 e 的近似值,直到最后一项小于 10-6 为止.
e=1+1+1 +...+ 1
----------------------------------------------------------------------------------------
任务 2 函数声明和嵌套调用
1!
2!
n!
1.题目 编写两个函数,分别计算 n!和 P(m,n),并在主函数中输出 P(m,n)和 C(m,n) 2 .分析 (1)P(m,n)=m!/(m-n)! (2)C(m,n)= P(m,n)/n! (3)函数 fac 用于计算 n! 3.程序
/*程序名 u402.c*/ #include"stdio.h"
long fac(long); long perm(long,long); int main() {
long m,n,p,c; printf("\n 请输入 m 和 n 的值: "); scanf("%d,%d",&m,&n); p=perm(m,n); /*调用函数 perm,计算 P(m,n)*/ c=p/fac(n); /*利用上一个语句得到的 P(m,n)并调用函数 fac,计算 C(m,n)*/ printf("\nC(m,n)=%d",c); /*输出计算结果*/ return 0;
} long perm(long m, long n) /*计算 P(m,n)*/ {
return fac(m)/fac(m-n); /*调用 fac 函数计算 P(m,n)*/ long fac(long k) /*计算阶乘*/
(4)函数 perm 用于计算 P(m,n) (5)主函数中计算 C(m,n)和输出 P(m,n)和 C(m,n)
}
{
long i,s=1; for(i=1;i<=k;i++)
s*=i; return(s);
任务 4.2 知识点 (1) 文件包含命令中<>和""的差别 (2) 函数声明的使用 (3) 函数调用的嵌套使用
/*输入 m、n 的值*/
13
}
4. 知识点:右框 5.课堂实践/课后练习 (1) 编写函数, 功能为求圆的周长和面积。编写主函数进行程序调用, 半径从键盘输入。 (2) 设计程序, 可模仿计算器完成加、减、乘、除四则运算: 由键盘输入两个数, 按用户的决定进行一种运 算, 并给出结果。其中, 加、减、乘、除各由一个函数实现。 ---------------------------------------------------------
任务 3 实现函数间参数的传递 1.题目 定义一个函数, 从主调函数接收两个数据, 并使之
交换。 2.程序 /* 程序名: u403.c*/ #include <stdio.h > void swap(int x , int y) { int temp ;
temp =x ; x =y ; y =temp ; printf("in function x =%d , y =%d\n" , x , y) ; }
int main() { int a, b;
3.运行结果: 右图 4.分析 从上面的运行结果可以看出, 并没有达到交换的目的。原因: 实参和形参间的传递是单向值传递。即只能由 实参传递给形参, 形参不能传值给实参。形参值的改变对实参不起作用。 5.采用全局变量解决两数交换 /* 程序名: u404.c*/ #include <stdio.h > int a =2 , b =3 ;
void swap(); int main()
int temp ; temp =a ; a=b; b=temp; printf("in function a=%d, b=%d\n", a, b);
{
}
printf("a=%d, b=%d\n", a, b); swap( ); printf("a=%d, b=%d\n", a, b); return 0;
6.运行结果:右图 7.知识点:变量的类型和作用范围 8.仔细阅读程序 u403.c 和 u404.c,分析哪些变量是全局变量,哪些变量是局数变量,并指出它们的作用 范围和生存周期. ================================
第二部分 程序设计算法示例
void swap( )
{
}
}
printf("input two integers: \n"); scanf("%d, %d", &a, &b); printf("a=%d, b=%d\n", a, b); swap(a, b);
printf("a=%d, b=%d\n", a, b); return 0;
14
第 5 单元 穷举算法(4 课时)
穷举算法的基本思想是: 对问题的所有可能状态一一测试, 直到找到解或全部可能状态都测试完毕为 止(无解)。
任务 1: 劳动分工问题 1. 题目 36 块砖, 36 人搬;男搬 4, 女搬 3, 两个小孩抬一砖, 要求一次全搬完, 问男、女、小孩各若干?
2. 分析 依题意,男人数最多 8 人,女人最多 11 人;男
人(men)、女人(women)、小孩(children)的人数必须 满足以下 3 个条件:␣总人数为 36: men+women+children=36; ␣ 砖 总 数 为 36 : 4*men+3*women+children/2=36; ␣由“两个小孩抬 一块砖”可知:小孩人数为偶数,即 children%2=0.满 足以上条件的men, women, children取值即为该问 题的答案。
本题的穷举过程算法为: 从1开始,列举 men 的各 个可能值,在每个 men 值下找出满足条件的解.
for(men=1;men<=8;men++)
下面进一步用穷举方法来分析 S1: for(women=1;women<=11;women++)
{
S1: 找满足两个方程的解的 women 和 children S2: 输出一组解
} 由于对列举的每个 children 与 women 都可以按下式 children=36-men-women 求出一个 children 因此, 只要该 children 满足另一个方
展开阅读全文