当前位置:首页 >> 工学 >>

何钦铭-用C语言编写程序


Chap 2 用C语言编写程序 语言编写程序
2.1 2.2 2.3 2.4 2.5 在屏幕上显示 Hello World! 求华氏温度 100°F 对应的摄氏温度 ° 计算分段函数 输出华氏—摄氏温度转换表 输出华氏 摄氏温度转换表 生成乘方表与阶乘表

本章要点
怎样编写程序,在屏幕上显示一些信息? 怎样编写程序,在屏幕上显示一些信息? 怎样编写程序,实现简单的数据处理, 怎样编写程序,实现简单的数据处理,例如 将华氏温度转换为摄氏温度? 将华氏温度转换为摄氏温度? 语句计算分段函数? 怎样使用 if 语句计算分段函数? 怎样用 for 语句求 1+2+……+100? ? 如何定义和调用函数生成一张乘方表? 如何定义和调用函数生成一张乘方表?

2.1 在屏幕上显示 在屏幕上显示Hello World!
在屏幕上显示一个短句: 例2-1 在屏幕上显示一个短句 Hello World!

2.1 在屏幕上显示 在屏幕上显示Hello World!
/* 显示“Hello World!” */ 显示“ 注释文本 # include <stdio.h> int main(void) 主函数 { printf(“Hello World! \n”); 语句结束 return 0; } 输出函数 换行符 1.任何程序都有主函数 任何程序都有主函数
2.程序由若干语句组成 程序由若干语句组成 3.语句由;结束 语句由; 语句由

2.1 在屏幕上显示一些信息
在屏幕上显示: 例2-2 在屏幕上显示 Programming is fun! And Programming in C is even more fun! # include <stdio.h> 编译预处理命令 int main(void) { printf("Programming is fun! \n"); printf("And Programming in C is even more fun! \n"); return 0; }

2.2 求华氏温度 100°F 对应的 ° 摄氏温度
摄氏温度 C=(5/9)(F-32) 2.2.1 2.2.2 2.2.3 2.2.4 程序解析 常量、 常量、变量和数据类型 算术运算和赋值运算 格式化输出函数printf 格式化输出函数

2.2.1 程序解析
例2-3 求华氏温度 100°F 对应的摄氏温度。 ° 对应的摄氏温度。
摄氏温度 C=(5/9)(F-32)

#include <stdio.h> int main(void) { int celsius, fahr;

输出: 输出:fahr =100, celsius = 37
变量定义

fahr = 100; 变量使用 celsius = 5 * (fahr - 32) / 9; printf("fahr = %d, celsius = %d\n", fahr, celsius);输出结果 输出结果 return 0; }

2.2.2 常量、变量和数据类型 常量、
int celsius, fahr; celsius = 5 * (fahr - 32) / 9; 数据
常量:在程序运行过程中, 常量:在程序运行过程中,其值不能被改变 变量:在程序运行过程中, 变量:在程序运行过程中,其值可以被改变

数据类型
常量: 是整型常量( 常量:5 和 9是整型常量(整数) 是整型常量 整数) 变量: 变量:在定义时指定

变量的定义
类型名

变量名:小写字母; 变量名:小写字母;见名知义

变量定义的一般形式: 变量定义的一般形式:
变量名表; 变量名表; 定义整型变量 定义单精度浮点型变量 定义双精度浮点型变量

例如: 例如:
int celsius, fahr; float x; double area, length;

double型数据比 型数据比float精度高,取值范围大 精度高, 型数据比 精度高

变量的定义
定义变量时要指定变量名和数据类型
变量名表; 类型名 变量名表; int celsius, fahr; float x; double area, length;

变量名代表内存中的一个存储单元
存放该变量的值

该存储单元的大小由变量的数据类型决定 C语言中的变量代表保存数据的存储单元 语言中的变量代表保存数据的存储单元 数学中的变量代表未知数
x = x+1

变量的定义与使用
变量必须先定义, 使用。 变量必须先定义,后使用。 定义 应该先赋值, 应该先赋值,后引用 #include <stdio.h> int main(void) 一个变量名只能定义一次 { 变量一般都定义在程序的头上 int celsius, fahr;
不能定义在程序的中间或后面

fahr = 100; celsius = 5 * (fahr - 32) / 9; printf("fahr = %d, celsius = %d\n", fahr, celsius); return 0; }

2.2.3 算术运算和赋值运算
fahr = 100; celsius = 5 * (fahr - 32) / 9;

1、算术运算 、
双目算术运算符:+ - * / % 双目算术运算符: 算术表达式: 算术运算符将运算对象连接起 算术表达式:用算术运算符将运算对象连接起 来的符合C语言语法规则的式子 来的符合 语言语法规则的式子 数学式: 数学式:(5/9)(F-32) C表达式:5 * (fahr - 32) / 9 或者: 表达式: 或者: 表达式 数学式: 数学式:s(s-a)(s-b)(s-c) C表达式: 表达式: 表达式

算术运算
双目算术运算符: 双目算术运算符:+ - * / % 算术表达式: 算术运算符将运算对象连接起 算术表达式:用算术运算符将运算对象连接起 来的符合C语言语法规则的式子 来的符合 语言语法规则的式子

注意 / 整数除整数,得整数 整数除整数,
如:1/2 = 0,9/4 = 2 , ?5 * (fahr - 32) / 9 和 5 / 9 * (fahr - 32) 等价吗

% 针对整型数据
如: 5%6=5,9%4=1,100%4=0 % = , % = , % =

双目运算符两侧操作数的类型要相同

赋值运算 赋值运算符 = 赋值表达式: 将一个变量和一个表达 变量和一个 赋值表达式:用 = 将一个变量和一个表达 式连接起来的式子
变量 = 表达式 =的左边必须是一个变量

例如: 例如:
fahr = 100; celsius = 5 * (fahr - 32) / 9; 计算赋值运算符右侧表达式 表达式的值 计算赋值运算符右侧表达式的值 将赋值运算符右侧表达式的值赋给左侧的变量 表达式的值赋给左侧的 将赋值运算符右侧表达式的值赋给左侧的变量

2.2.4 格式化输出函数 格式化输出函数printf
数据输出: 数据输出:格式化输出函数 printf #include <stdio.h>
printf("Hello World! \n"); printf("fahr = %d, celsius = %d\n", fahr, celsius);

printf(格式控制字符串 输出参数 … , 输出参数 格式控制字符串, 输出参数1, 输出参数n); 格式控制字符串

要输出的数据 用双引号括起来,表示输出的格式

printf-格式控制字符串 -
printf("Hello World! \n"); printf("fahr = %d, celsius = %d\n", fahr, celsius); printf("Hi\n", fahr);

格式控制字符串: 格式控制字符串:
普通字符:原样输出 普通字符: 格式控制说明:按指定的格式输出数据 按指定的格式输出数据,%… 格式控制说明 按指定的格式输出数据
与数据类型有关 int型 :%d 型 float double型:%f 型

printf("fahr = %d, celsius = %d\n", fahr, celsius); 输出: 输出:fahr =100, celsius = 37

2.3 计算分段函数
2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 程序解析 关系运算 if-else语句 语句 格式化输入函数scanf 格式化输入函数 常用数学库函数

2.3.1 程序解析
例2-4 分段计算水费
4x ? x ≤ 15 ? y = f ( x) = ? 3 ?2.5 x ? 10.5 x > 15 ?

要解决的问题: 要解决的问题:
输入 计算分段函数 输出,并保留2位小数 输出,并保留 位小数 求ex

2.3.1 程序解析-求分段函数 程序解析-
#include <stdio.h> Enter x (x>=0): int main(void) 9.5 { f(9.500000)=12.67 double x, y; Enter x (x>=0): 15 f(15.000000)=20.00 数据必须输入吗? 数据必须输入吗?

printf("Enter x (x>=0):\n"); /* 输入提示 */ scanf("%lf", &x); /* 调用 调用scanf函数输入数据 */ 函数输入数据 if(x <= 15) /* if – else语句 */ 语句 y = 4 * x / 3; else Enter x (x>=0): y = 2.5 * x - 10.5; 21.3 printf("y = f(%f) = %.2f\n", x, y); f(21.300000)=42.75 return 0; }

2.3.2 关系运算
x <= 15

比较 x 和 15 的大小 比较的结果: 比较的结果:真 假
取值9.5时 的结果是:? 当 x 取值 时, x <= 15的结果是:? 的结果是 取值21.3时, x <= 15的结果是:? 的结果是:? 当 x 取值 时 的结果是

比较运算, 关系运算 — 比较运算,比较两个操作数 关系运算符 x < y x <= y x == y 区分= 区分 和==
x>y x >= y

x != y 关系表达式:用关系运算符将2个表达式连接起来的 关系表达式: 个

式子。 式子。

如:x <= 1

运用关系表达式
表示比较的数学式
x≤10 x≥10 x≠10 x = 10

C关系表达式 关系表达式
x <= 10 x >= 10 x != 10 x == 10

用关系表达式描述条件
判断 x 是否为负数 x<0 判断 x 是否不为零 x != 0

2.3.3 if - else语句 语句
if (表达式 表达式) 表达式 语句1 语句 else 语句2 语句
真 表达式 语句1 语句 语句2 语句

if(x <= 15) y = 4 * x / 3; else y = 2.5 * x - 10.5;


计算二分段函数
?1 ? f ( x) = ? x ?0 ? x≠0 x=0
if(x != 0) y = 1/x; else y = 0;

if (表达式 表达式) 表达式 语句1 语句 else 语句2 语句

源程序
#include <stdio.h> int main(void) { double x, y; #include <stdio.h> /*例2-4 */ 例 int main(void) { double x, y; printf("Enter x (x>=0):\n"); scanf("%lf", &x); if(x <= 15) y = 4 * x / 3; else y = 2.5 * x - 10.5; printf("f(%f) = %.2f\n", x, y); return 0;

printf("Enter x:\n"); scanf("%lf", &x); if(x != 0) y = 1/x; else y = 0; printf("f(%.2f) = %.1f\n", x, y); return 0; } }

运行结果
#include <stdio.h> int main(void) { double x, y; printf("Enter x:\n"); scanf("%lf", &x); if(x != 0) y = 1/x; else y = 0; printf("f(%.2f) = %.1f\n", x, y); return 0; } input x: 2.5 f(2.50)=0.4 input x: 0 f(0.00)=0.0

软件测试的基本思想
if(x != 0) y = 1/x; else y = 0; input x: 2.5 f(2.50)=0.4 input x: 0 f(0.00)=0.0

软件测试
精心设计一批测试用例 [输入数据,预期输出结果 ,然后分 输入数据, 精心设计一批测试用例 输入数据 预期输出结果] 别用这些测试用例运行程序, 别用这些测试用例运行程序,看程序的实际运行结果与预 期输出结果是否一致。 期输出结果是否一致。
Enter x (x>=0): Enter x (x>=0):

if(x <= 15) 9.5 15 y = 4 * x / 3; f(9.500000)=12.67 f(15.000000)=20.00 else Enter x (x>=0): y = 2.5 * x - 10.5; 21.3
f(21.300000)=42.75

2.3.4 格式化输入函数 格式化输入函数scanf
数据输入: 数据输入:格式化输入函数 scanf #include <stdio.h>
scanf("%lf", &x);

scanf(格式控制字符串 输入参数1, … , 输入参数n); 格式控制字符串, 输入参数 输入参数 格式控制字符串

变量地址 用双引号括起来, 用双引号括起来,表示输入的格式

scanf-格式控制字符串 -
格式控制字符串: 格式控制字符串:
格式控制说明: 按指定的格式输入数据, 格式控制说明 按指定的格式输入数据 %…
与数据类型有关 int型 :%d 型 float型:%f 型 double型:%lf 型

尽量不要出现普通字符 普通字符: 普通字符:原样输入 例如: 例如: scanf("x=%lf", &x); scanf("%lf", &x); 输入: 输入: 9.5 输入: 输入 x=9.5

改进例2-3的程序 改进例 的程序
例2-3 求华氏温度 100°F 对应的摄氏温度。 ° 对应的摄氏温度。
摄氏温度 C=(5/9)(F-32) Enter fahr: #include <stdio.h> 100 int main(void) fahr =100, celsius = 37 { int celsius, fahr; printf(“Enter fahr: \n");

scanf("%d", &fahr); fahr = 100; celsius = 5 * (fahr - 32) / 9; printf("fahr = %d, celsius = %d\n", fahr, celsius); return 0;
}

2.3.5 常用数学库函数
库函数
C语言处理系统提供事先编好的函数,供用户在 语言处理系统提供事先编好的函数, 语言处理系统提供事先编好的函数 编程时调用。 编程时调用。scanf(), printf(), exp() 在相应的系统文件(头文件) 在相应的系统文件(头文件)中定义一些必需的 信息。 信息。

#include命令 命令
用户调用库函数时, 用户调用库函数时,将相应的头文件包含到源程 序中。 序中。

例如
调用scanf, printf,需要 #include <stdio.h> 调用 , 调用sqrt,需要 #include <math.h> 调用 ,

常用数学库函数
平方根函数 sqrt(x) 绝对值函数 fabs(x)
fabs(-3.56) 的值为 的值为3.56

幂函数 pow(x, n) :xn
pow(1.1, 2) 的值为 的值为1.21(即1.12) ( )

指数函数 exp(x):ex :
exp(2.3) 的值为 2.3 的值为e

以e为底的对数函数 log(x):ln x 为底的对数函数 :
log(123.45) 的值为 的值为4.815836

以10为底的对数函数 log10(x):log10x 为底的对数函数 :
log10(123.45) 的值为 的值为2.091491。 。

例2-5 计算存款的本息
输入存款金额 money、存期 year 和年利率 、 rate,根据公式计算存款到期时的本息合计 , sum(税前),输出时保留 位小数。 ),输出时保留 位小数。 (税前),输出时保留2位小数 sum = money ( 1 + rate)year sum = money * pow((1 + rate), year)

# include <stdio.h> # include <math.h> int main(void) { int money, year; double rate, sum;

例2-5 程序
Enter money: 1000 Enter year: 3

Enter rate: 0.025 printf(“Enter money:"); sum = 1076.89 scanf("%d", &money); printf(“Enter year: "); scanf("%d", &year); printf(“Enter rate:"); scanf("%lf", &rate); sum = money * pow((1 + rate), year); printf("sum = %.2f", sum); return 0; } scanf("%d%d%lf", &money, &year, &rate);

调用scanf函数输入多个数据 函数输入多个数据 调用
scanf("%d%d%lf", &money, &year, &rate); 输入: 输入:1000 3 0.025 输入参数、格式控制说明、 输入参数、格式控制说明、输入数据

scanf需要多个输入参数和多个格式控制说明 需要多个输入参数和多个格式控制说明
输入参数的类型、个数和位置要与格式控制说明一一 输入参数的类型、 对应 ? scanf("%d%lf%d ", &money, &year, &rate);

程序运行时,输入的多个数据之间必须有间隔。 程序运行时,输入的多个数据之间必须有间隔。
scanf("%d%lf%d ", &money, &rate , &year); 如何输入? 如何输入?

2.4 输出华氏-摄氏温度转换表 输出华氏-
2.4.1 程序解析 2.4.2 for语句 语句 2.4.3 指定次数的循环程序设计

2.4.1 程序解析
输入2个整数 例2-6输入 个整数 输入 个整数lower和 upper,输出一张 和 , 华氏-摄氏温度转换表, 华氏-摄氏温度转换表,华氏温度的取值范 围是[lower, upper],每次增加 °F。 围是 ,每次增加1° 。
fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7

2.4.1 程序解析 温度转换表 程序解析-温度转换表
#include <stdio.h> int main(void) { int fahr, lower, upper; double celsius; printf("Enter lower:"); scanf("%d", &lower); printf("Enter upper:"); scanf("%d", &upper); printf("fahr celsius\n"); for (fahr = lower; fahr <= upper; fahr ++) { celsius = (5.0 / 9.0) * (fahr - 32); printf("%d %6.1f\n", fahr, celsius); } return 0; } Enter lower: 30 Enter upper: 35 fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7

// 温度重复转换:华氏温度从 温度重复转换:华氏温度从lower开始,到upper结束,每次增加 °F 开始, 结束, 开始 结束 每次增加1°

fahr = fahr+1

例2-8中for语句的流程 中 语句的流程
for (fahr = lower; fahr <= upper; fahr ++) { celsius = (5.0 / 9.0) * (fahr - 32); printf("%d %6.1f\n", fahr, celsius); } fahr = fahr+2 输出? 输出?
Enter lower: 30 Enter upper: 35 fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7

2.4.2 for语句-循环语句 语句- 语句
for(表达式1 表达式2 表达式3 for(表达式1;表达式2;表达式3) 循环体语句 实现C语句的重复执行 实现 语句的重复执行
3个表达式、循环体语句 个表达式、 个表达式 !书写顺序和执行顺序不同 表达式1只执行一次 !表达式 只执行一次

for语句中的循环变量 语句中的循环变量
循环(控制 变量 语句中, 循环 控制)变量:for语句中,通过改变或判断某个 控制 变量: 语句中 变量的值来控制循环的执行 for (fahr = lower; fahr <= upper; fahr ++) {
celsius = (5.0 / 9.0) * (fahr - 32.0); printf("%d %6.1f\n", fahr, celsius);

} 赋初值 判断其值 改变其值

for语句的说明 语句的说明
for (fahr = lower; fahr <= upper; fahr ++) {
celsius = (5.0 / 9.0) * (fahr - 32.0); printf("%d %6.1f\n", fahr, celsius);

}
表达式1:给循环变量赋初值,指定循环的起点。 表达式 :给循环变量赋初值,指定循环的起点。
fahr = lower

表达式2:给出循环的条件,决定循环的继续或结束。 表达式 :给出循环的条件,决定循环的继续或结束。
fahr <= upper

表达式3: 设置循环的步长, 改变循环变量的值, 表达式 : 设置循环的步长 , 改变循环变量的值 , 从而可改 变表达式2的真假性。 变表达式 的真假性。 的真假性
fahr++

语句:被反复执行的语句,一条语句。 语句:被反复执行的语句,一条语句。

复合语句{ 和空语句 复合语句 }和空语句 ;
for (fahr = lower; fahr <= upper; fahr ++) {
celsius = (5.0 / 9.0) * (fahr - 32.0); printf("%d %6.1f\n", fahr, celsius);

}

for (fahr = lower ; fahr <= upper; fahr = fahr + 1)

celsius = (5.0 / 9.0) * (fahr - 32.0); printf("%d %6.1f\n", fahr, celsius);
for (fahr = lower ; fahr <= upper; fahr = fahr + 1);

celsius = (5.0 / 9.0) * (fahr - 32.0); printf("%d %6.1f\n", fahr, celsius); !不要在for语句中随意加分号 不要在 语句中随意加分号

2.4.3 指定次数的循环程序设计
求 1+2+……+100 抽取具有共性的算式: 抽取具有共性的算式:sum = sum + i
sum初值为 ,该算式重复 初值为0,该算式重复100次,i从1变到 变到100 初值为 次 从 变到 设i为循环变量,则: 为循环变量, 为循环变量 指定循环起点的表达式1: 指定循环起点的表达式 :i = 1 给出循环条件的表达式2: 给出循环条件的表达式 :i <= 100 设置循环步长的表达式3: 设置循环步长的表达式 :i++ 循环体语句: 循环体语句:sum = sum + i; for(i=1; i<=100; i++)
sum =sum+i;

源程序- 源程序-求 1+2+……+100

sum=5050

/* 计算1 + 2 + 3 + …… + 100 */ 计算 #include <stdio.h> for(i=1; i<=100; i++){ int main(void) sum=0; { sum=sum+i; int i, sum; } sum = 0; /* 置累加和 置累加和sum的初值为 */ 的初值为0 的初值为 for ( i = 1; i <= 100; i++ ) /* 循环重复 循环重复100次 */ 次 sum = sum + i; /* 反复累加 */ printf( “sum = %d\n”, sum); /* 输出累加和 */ return 0; }

求 1+1/2+1/3+……+ 1/100
#include <stdio.h> int main(void) { int i, sum; sum = 0; for ( i = 1; i <= 100; i++ ) sum = sum + i; printf( “sum = %d\n”, sum); return 0; } printf( “sum = %f\n”, sum);

int i; double sum; for(i=1; i<=100; i++) sum=sum+1.0/i;

指定次数的循环程序设计
一般包含四个部分: 一般包含四个部分:
初始化: 初始化:指定循环起点
给循环变量赋初值, 给循环变量赋初值,如i = 1; 进入循环之前,设置相关变量的初值, 进入循环之前,设置相关变量的初值,如sum = 0。 。

条件控制: 条件控制:
只要i 只要 <= 100,循环就继续 ,

工作:指重复执行的语句(循环体) 工作:指重复执行的语句(循环体)。
一条语句,可以是复合语句或空语句。 一条语句,可以是复合语句或空语句。如sum = sum + i。 。

改变循环变量: 改变循环变量:在每次循环中改变循环变量的值
如 i++,以改变循环条件的真假。一旦 > 100,循环结束。 ,以改变循环条件的真假。一旦i ,循环结束。

例2-7 求 1+2+3+……+n
输入一个正整数n,求前n项和,即循环n次 输入一个正整数 ,求前 项和,即循环 次 项和
#include <stdio.h> int main(void) { int i, sum; sum = 0; for ( i = 1; i <= 100; i++ ) sum = sum + i; printf( “sum = %d\n”, sum); return 0; } Enter n: 100 Sum = 5050

printf(“Enter n:"); scanf("%d", &n); for(i=1; i<=n; i++) sum=sum+i;

求1+1/2+1/3+……+ 1/n
#include <stdio.h> int main(void) { int i, sum; #include <stdio.h> int main(void) { int i; double sum; printf(“Enter n: "); scanf("%d", &n); sum = 0; for ( i = 1; i <= n; i++ ) sum = sum + 1.0/i; printf( “sum = %f\n”, sum); return 0;

printf(“Enter n: "); scanf("%d", &n); sum = 0; for ( i = 1; i <= n; i++ ) sum = sum + i; printf( “sum = %d\n”, sum); return 0; } }

的前n项和 求 1+1/3+1/5+… 的前 项和
求前n项和,即循环 次 每次累加1项 求前 项和,即循环n次,每次累加 项。 项和
for (i = 1; i <= n ; i++) sum = sum + item (第i项) 第项 item = 1.0 / (2 * i - 1)

源程序- 源程序-求 1+1/3+1/5+…
#include <stdio.h> int main(void) { int i, n; double item, sum; printf(“Enter n: "); scanf ("%d", &n); sum = 0 ; for ( i = 1; i <= n; i++ ) { item = 1.0 / (2 * i - 1); /* 计算第 项的值 */ 计算第i项的值 sum = sum + item ; /* 累加第 项的值 */ 累加第i项的值 } printf ( "sum = %f\n", sum); return 0; }

的前n项和 例2-8 求 1-1/3+1/5-… 的前 项和
求前n项和,即循环 次 每次累加1项 求前 项和,即循环n次,每次累加 项。 项和
for (i = 1; i <= n ; i++) sum = sum + item (第i项) 第项
item = flag*1.0/(2 * i - 1)

item = flag * 1.0 / denominator denominator = denominator + 2 flag = -flag

#include <stdio.h> int main(void) { int denominator, flag, i, n; double item, sum;

例2-8 源程序

printf(“Enter n: "); scanf ("%d", &n); flag=1; denominator =1; sum = 0 ; for ( i = 1; i <= n; i++ ) { item = flag * 1.0/ denominator; /* 计算第i项的值 */ 计算第 项的值 sum = sum + item ; /* 累加第 项的值 */ 累加第i项的值 flag = -flag; /* 准备下一次循环 */ denominator = denominator +2; } printf ( "sum = %f\n", sum); return 0; }

例2-9 求n!
n! = 1*2*…*n
product = ? for (i = 1; i <= n ; i++) product = product * item (第i项) 第项 item=i

例2-9 源程序
#include <stdio.h> int main(void) { int i, n; double product; printf("input n: \n"); scanf ("%d", &n) ; product=1; /* 置阶乘 置阶乘product的初值为 */ 的初值为1 的初值为 for ( i = 1; i <= n; i++ ) /* 循环重复 次,计算 */ 循环重复n次 计算n! product = product * i ; printf ( "product = %.0f\n", product ); return 0; }

求 xn
输入实数x和正整数 , 输入实数 和正整数n, 和正整数 计算x 计算 n = x * x * … * x for (i = 1; i <= n ; i++) power = power * item (第i项) 第项 item=?

源程序- 源程序-求 xn
#include <stdio.h> int main(void) { int i, n; double x, power ; printf(“Enter x, n: \n"); scanf ("%lf%d", &x, &n) ; power = 1; /* 置power的初值为 */ 的初值为1 的初值为 for ( i = 1; i <= n; i++ ) /* 循环重复n次,计算x的n次幂 */ 循环重复 次 计算 的 次幂 power = power * x; printf( "%0.f\n", power); }

2.5 生成乘方表和阶乘表
2.5.1 程序解析 2.5.2 结构化程序设计思想

2.5.1 程序解析
例2-10(1) ( ) 输入一个正整数n,生成一张2的乘方表 的乘方表, 输入一个正整数 ,生成一张 的乘方表,输出 20到2n的值,可以调用幂函数计算 的乘方。 的值,可以调用幂函数计算2的乘方 的乘方。
for (i = 0; i <= n ; i++){ power = pow(2, i); /*调用幂函数 调用幂函数pow(2,i)计算 的i次 计算2的 次 调用幂函数 计算 方*/ 输出power的值 的值; 输出 的值 }

源程序- 源程序-生成乘方表
Enter n: 4 #include <stdio.h> pow(2,0)= 1 #include <math.h> pow(2,1)= 2 int main(void) pow(2,2)= 4 { pow(2,3)= 8 int i, n; pow(2,4)= 16 double power; printf("Enter n:"); scanf("%d", &n); for (i = 0; i <= n ; i++){ power = pow(2, i); /* 调用幂函数 调用幂函数pow(2,i)计算 的i次方 */ 计算2的 次方 计算 printf("pow(2,%d)= %.0f\n", i, power); } return 0; }

例2-10(2)生成阶乘表 ( )
输入一个正整数n,生成一张阶乘表,输出 ! 输入一个正整数 ,生成一张阶乘表,输出0! 到 n! 的值 。 要求定义和调用函数 ! 的值。 要求定义和调用函数fact(n)计 计 算n!,函数类型是 ,函数类型是double。 。
for (i = 0; i <= n ; i++){ product = fact(i); /* 调用自定义函数 调用自定义函数fact(i)计算 */ 计算i! 计算 输出product的值 的值; 输出 的值 } for (i = 0; i <= n ; i++){ power = pow(2, i); /*调用幂函数 调用幂函数pow(2,i)计算 的i次 计算2的 次 调用幂函数 计算 方*/ 输出power的值 的值; 输出 的值 }

源程序- 源程序-生成阶乘表

#include <stdio.h> double fact(int n); /* 自定义函数的声明 */ int main(void) double fact(int n) /* 函数首部 */ { int i; double product; { int i, n; product = 1; double result;
for (i = 1; i <= n; i++) product = product * i; return product; /* 将结果回送主函

Enter n: 3 0!=1 1!=1 2!=2 3!=6

printf("Enter n:"); 数 */ scanf("%d", &n); } for (i = 0; i <= n ; i++){ result = fact(i); /* 调用自定义函数 调用自定义函数fact(i)计算 */ 计算i! 计算 printf("%d!=%.0f\n", i, result); } return 0; }

2.5.2 结构化程序设计思想
结构化程序设计(Structured Programming) 结构化程序设计
程序设计技术 C语言是结构化程序设计语言 语言是结构化程序设计语言

强调程序设计的风格和程序结构的规范化,提 强调程序设计的风格和程序结构的规范化, 倡清晰的结构, 倡清晰的结构,其基本思路是将一个复杂问题 的求解过程划分为若干阶段, 的求解过程划分为若干阶段,每个阶段要处理 的问题都容易被理解和处理。 的问题都容易被理解和处理。
按自顶向下的方法对问题进行分析、 按自顶向下的方法对问题进行分析、模块化设计和结 构化编码等3个步骤 个步骤。 构化编码等 个步骤。

自顶向下的分析方法
把大的复杂的问题分解成小问题后再解决 面对一个复杂的问题, 首先进行上层( 整体) 面对一个复杂的问题 , 首先进行上层 ( 整体 ) 的分析, 按组织或功能将问题分解成子问题, 的分析 , 按组织或功能将问题分解成子问题 , 如果子问题仍然十分复杂, 再做进一步分解, 如果子问题仍然十分复杂 , 再做进一步分解 , 直到处理对象相对简单,容易处理为止。 直到处理对象相对简单,容易处理为止。 当所有的子问题都得到了解决, 当所有的子问题都得到了解决 , 整个问题也就 解决了。 解决了。 每一次分解都是对上一层的问题进行细化和逐 步求精, 最终形成一种类似树形的层次结构, 步求精 , 最终形成一种类似树形的层次结构 , 来描述分析的结果。 来描述分析的结果。

学生成绩统计程序的层次结构图
学生成绩统计程序

成绩输入

数据计算

数据查找

输出成绩

计算学生平均分

计算课程平均分

模块化设计
将模块组织成良好的层次系统, 将模块组织成良好的层次系统,顶层模块调用 其下层模块以实现程序的完整功能, 其下层模块以实现程序的完整功能,每个下层 模块再调用更下层的模块, 模块再调用更下层的模块,从而完成程序的一 个子功能,最下层的模块完成最具体的功能。 个子功能,最下层的模块完成最具体的功能。 遵循模块独立性的原则, 遵循模块独立性的原则,即模块之间的联系应 尽量简单。 尽量简单。
一个模块只完成一个指定的功能。 一个模块只完成一个指定的功能。 模块之间只通过参数进行调用。 模块之间只通过参数进行调用。 一个模块只有一个入口和一个出口。 一个模块只有一个入口和一个出口。 模块内慎用全局变量。 模块内慎用全局变量。

结构化编码
选用顺序、选择和循环三种控制结构, 选用顺序、选择和循环三种控制结构,使程序 具有良好的风格。 具有良好的风格。
对变量、函数、常量等命名时,要见名知意, 对变量、函数、常量等命名时,要见名知意,有 助于对变量含义或函数功能的理解。 助于对变量含义或函数功能的理解。 在程序中增加必要的注释,增加程序的可读性。 在程序中增加必要的注释,增加程序的可读性。 程序要清晰易懂,语句构造要简单直接, 程序要清晰易懂,语句构造要简单直接,一行写 一条语句,采用缩进格式。 一条语句,采用缩进格式。 程序有良好的交互性,输入有提示,输出有说明, 程序有良好的交互性,输入有提示,输出有说明, 并尽量采用统一整齐的格式。 并尽量采用统一整齐的格式。


相关文章:
c语言
(课堂授课:36 学时 实验:36 学时) 十、教材及主要教学参考用书 教材:何钦铭...用 C 语言编写程序 分支结构 循环结构 函数 数据类型和表达式 数组 指针 结构 ...
C语言程序设计实验指导
C语言程序设计 (何钦铭 ... 10页 免费 C语言程序设计实验指导书... 53页 ...语言实验 实验指导 C 语言实验指导吴元斌 编 重庆三峡学院 计算机科学与工程学院...
c语言程序设计何钦铭习题5
C语言程序设计 (何钦铭 颜... 5页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
《C语言程序设计》课程设计报告
我们应该要对设备的使用 进行详细的调查与分析,在根据这些分析的结果来编写程序...参考文献:【1】何钦铭,颜辉,C 语言程序设计(第二版) ;【2】谭浩强, 《C ...
c语言程序设计 谭浩强版 何钦铭颜晖版习题答案全集
c语言程序设计 谭浩强版 何钦铭颜晖版习题答案全集_IT/计算机_专业资料。c语言学习...例如 6=1+2+3.编程 找出 1000 以内的所有完数。 1. 程序分析:请参照程序<...
C语言程序设计个人通讯录管理
[1]何钦铭 颜晖.《C语言程序设计》.高等教育出版社.2008 年 [2]谭浩强 张基温.《C语言程序设计教程》.高等教育出版社.2006 年 1.本表应在每次实施前一周由...
《C语言程序设计》教学大纲
C语言程序设计》教学大纲_工学_高等教育_教育专区...林冬梅 编写日期:2010 年 12 月 一、课程的性质...大学出版社,2005 (二)教学参考书: [1] 何钦铭,...
c语言课程设计报告288891
参考资料其它说明 [1]何钦铭 颜晖.《C语言程序设计》.高等教育出版社.2008 年...提高学生用高级语言进行程序设计的能力,重点提高用 C 语言 进行文件操作的编程...
C语言实验指导书全教程
[1]何钦铭,颜晖主编.C 语言程序设计,高等教育出版社,十一五规划教材,2008 .1...及自己编写程序,加深对课本中词法、语法的掌 握;②熟悉所用的 C 语言开发...
98分C语言个人通讯录管理系统含正确源程序
[1]何钦铭 颜晖.《C语言程序设计》.高等教育出版社.2008 年 [2]谭浩强 ...1.3 详细的功能分析该系统用下面六个功能模块编写,每个模块执行不同的功能,...
更多相关标签: