第一章
Hello,C!
2
开始的话
? 我已经能熟练地操作计算机了,
还学什么?
? 计算机能做什么?
? 如何把计算机做为求解问题的工
具,为我服务终身?
3
? 计算机可以做任何事情;只要能把
实际问题抽象, 制作为计算机可求
解的程序 。
? 计算机求解问题的步骤:
实际 问题 求解 编制
问题
问题 模型 算法 程序
实现
计算机能做什么?
分析
抽象
模型
求解
命令
编程
调试
程序
4
问题模型
? 结构分析 ——线性方程组
? 人口预报 ——微分方程
? 优化问题 ——线性规划, 非线性规划
? 震动问题 ——矩阵分析;特征值, 特征向量
? 信息管理 ——二维数据表
? 下棋 —— 树型结构遍历
? 交通管理 ——图型结构遍历
5
下棋问题
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
? ?
? ?
?
? ?
? ?
? ?
?
? ?
? ? ?
?
6
―深蓝”与卡斯帕罗夫
? 国际象棋棋盘有 64格,每方有 16个子。
棋手在思考下一步棋时大约有 35种合法
选择。
? 目前最好的国际象棋程序可以分析到七
八个回合,若要求电脑能思考到第七个
回合,即 14步棋,则需要有 35^14种可
能的结局。
? 下棋程序靠的是基本的行棋知识和强大
无比的检索演算能力。这种信息检索选
择方式好比一棵树;共有 35个枝干,每
个枝干有 35个树杈,…,最终到树叶,
即可供选择的结果。越好的程序,所派
生的树枝树杈就越多。
? 一般来讲,电脑每下一步棋,仍需有
7
教学目标
? 介绍 C语言程序的基本结构
? 介绍在计算机上输入、编译、调试和
运行 C程序的基本方法和步骤。
8
本书的结构
? ―精讲多练C语言”共分十个单元,分别
对应十个教学重点。
? 这十个教学重点又可以分为两组, 前五单
元为一组,介绍C语言的基本内容。 后
五个单元为一组,介绍C语言的高级编
程技术。
9
( 1) C语言的基本内容
? 内容包括:
– 基本数据类型
– 控制结构
– 表达式、函数
– 编译预处理以及C语言的调试技术
? 在学习了这些内容之后,学生应能编写、
调试和运行一般规模和难度的应用程序
(如数值计算类程序 ),并对结构化程序设
计方法有所了解,为编写较大规模的应
用程序打下基础。
10
( 2)C语言的高级编程
技术
? 内容包括:
– 指针应用
– 高级数据结构
– 文件
? 这一部分中,强调对基本概念的理
解和掌握,以及在理解和掌握的基
础上运用这些高级编程技术的方法,
锻炼、培养较大规模、比较复杂的
应用程序的编程能力。
11
单元教学模式(方法)
? 单元教学目标和学习要求
? 授课内容
? 自学内容
? 调试技术
? 实用编程
? 程序设计举例
? 单元上机练习题目
12
( 1)教学目标和学习要求
? 本书的特点是, 精讲多练,,因
此为教师和学生规定明确的教学
和学习目标是非常重要的 。
? 教学目标和学习要求便于教师和
学生检验教学的效果 。
13
( 2)授课内容
? 是教师课堂讲授的内容 。 一般来说,
授课内容是本单元所有教学内容的
,纲,,起着联系本单元所有项目
的作用 。
? 授课内容的份量按一小时 (第二语言 )
或两学时 (第一语言 )组织 。
14
( 3) 自学内容
?,自学内容, 和, 授课内容, 两部分一起
组成了一个单元的基本教学内容 。 这部分
内容通常都是, 授课内容, 的延伸和继续,
由学生在课外时间自学 。 必须强调的是自
学部分并非不重要,也不能省略 。
? 对于作为第一语言的学生来说,教师应在
授课时间中抽出 5-10分钟对自学内容略作
导引,以便利学生自学 。
15
( 4) 调试技术
? 在前五单元中有调试技术栏目,用于介绍
如何调试, 连接和运行C语言程序 。
? 强调编程实践是本书的重要特色 。
? 第一单元的调试技术中的部分内容可以
在授课时间讲授,其他单元的调试技术一
般由学生自学,同时也可以作为学生上
机的实验指导书 。
? 辅导教师在带学生上机时可对这些内容
进行现场辅导 。
16
( 5) 实用编程
? 后五单元中用实用编程栏目代替了调试
技术栏目 。
? 实用编程栏目介绍了界面, 菜单, 中断,
鼠标, 图形等实用编程技术,是编写现
代风格的应用程序不可忽视的基本技术
内容 。
? 这部分内容一般也作为学生自学内容,
在有条件的情况下可以作为习题课和辅
导课的选讲内容 。
17
( 6) 程序设计举例
? 为了补充授课内容和自学内容部分的例题,
专门设置了程序设计举例栏目 。
? 本栏目所有例题均与本单元的授课, 自学
或实用编程等部分的内容相关,且均有算法
和结果分析等内容,是学生学习复习本单元
的重要参考资料 。
18
( 7) 单元上机练习题目
? 每个单元均配有若干上机练习题目,
供学生上机练习 。
? 这些练习题目均为程序设计题目,一
般的做法是先编程,再上机 。
?, 精讲多练, 式教学方法的基本特点
是上机时数较多,所以这部分的习题
工作量较大 。 希望尽量上机实现这些
题目 。
19
课程学习 方法
? 精讲多练
– 讲授 20 小时,上机 34小时(其中 14
小时是自由机时)
? 考教分离
– 引入竞争机制,真正掌握
? 机试为主
– 提高动手求解问题的能力
20
课程特点
? 以学生自学为主
? 以上机多练为主
? 以培养用计算机求解问
题的能力为主
21
本单元授课内容
? C语言的特点
? C程序的基本结构
? 用 C语言解决实际问题的步骤
22
1.1 C语言的特点
? 数据类型丰富多彩
可以处理比较复杂的数据对象
? 控制结构简明清晰
便于调试, 维护和交流
? 高效率的目标代码
运行速度快, 执行效率高
23
1.2 C程序的基本结构
[例 1-1] 在屏幕上显示,Hello,C!”。
程 序,(C0101.C)
/*----------------------------------------
------
程序 HELLO.C, 在屏幕上显示, Hello,C!
-----------------------------------------
-----*/
main()
{
printf("Hello,C!\n");
}
输 出, Hello,C!
24
例 1-1分析
? C的程序由函数组成 。 该程序只由一
个主函数 main( ) 构成 。
? 在主函数中只有一个语句; 在该语
句中调用了格式输出库函数 printf(),
用于向屏幕上输出一个字符串 。
? 一对花括号, { }” 是主函数的定界
符 。
? 程序的头 3行是注解行 。 由, /*”和
,*/”括起来的任何文字是注解行 。
? 语句用分号结束;一行可以写多个语
句 。
? 程序用小写字母, 书写采用自由格式 。
25
C程序的基本结构
[全局变量说明 ]
[#include <头文件,h>]
main( )
{
[局部变量说明 ]
[语句序列 ]
}
[子函数 1 [(形式参数) ]
{
[子函数局部变量说明 ]
[语句序列 ]
}
[。。。。 ]
? C程序由函数组成;至少
包括主函数 mian()和
(或)若干个子函数。
? 一个函数又由变量及参
数说明语句和语句序列
构成。
? 每个语句必须用分号结
尾。一个语句行可以写
多个语句,一个语句可
以写在多行上。
? C语言允许以,/*,..*/‖的
形式在程序中插入注释
行。
? C语言提供了包括 I/O功
能在内的大量标准库函
数,但调用这些函数时,
必须在程序头部包含头
文件。



26
例 1-2 计算太阳和地球间的万
有引力
算法分析, 由普通物理知,两个 质量 分别为 m1和
m2的物体之间的万有引力与两个物体质量的乘
积成正比,与两个物体质心之间的 距离 R的平方
成反比,
m1× m2
F = G --------
R2
式中的 G为 引力恒量 。 如果取质量的单位为克,
距离的单位为厘米,力的单位为达因,则
G ≈ 6.67259× 10-11m ^3*s ^-2*kg ^-1
因此,只要将太阳的质量 1.987× 10^30千克和
地球的质量 5.975× 10^24千克以及两者之间的
距离 1.495× 10^11米代入上式,即可算出太阳
和地球之间的万有引力 。
27
C0102.C分析
? 计算公式中要用三个变化的量:两个物体的质量
m1,m2,两者间距离 r。 子函数设有三个参数:
float grav(float m1,float m2,float distance)
? 在主函数中调用子函数时,要给这三个参数确切
的值,否则,计算时没有数值,将会出错:
float g,Msun, Mearth, Distance;
Distance = 1.495E11; Msun = 1.987E30 ; Mearth = 5.975E24;
g = grav( Msun,Mearth,Distance );
? 程序运行时,主函数中三个实参经调用语句传到
子函数,在子函数经过计算将结果返回主函数:
g = G*m1*m2/(distance*distance);
return g;
? 最后输出结果:
printf("The gravitation between sun and earth is %g Newton
\n",g);
28
例 1-2 程序 (C0102.C)
/* 程序 GRAV.C,计算太阳和地球之间的万有引力 */
float grav(float m1,float m2,float distance)
{ float g,G = 6.67259E-11;
g = G*m1*m2/(distance*distance);
return g;
} //子函数 grav
main( )
{
float g,Msun, Mearth, Distance;
Distance = 1.495E11; Msun = 1.987E30 ; Mearth =
5.975E24;
g = grav( Msun,Mearth,Distance );
printf("The gravitation between sun and earth is
%g Newton \n",g);
}
29
分 析
? 将计算任意两个质点之间的引力公式单
独编写为一个函数 grav(),用于计算太
阳和地球之间的万有引力 。 这样做有两
个好处,
(1),简化了主函数的编写 。 在编写主
函数时,只需按要求填写实际参数, 调
用 grav( ) 就可以得到计算结果 。
例如,g =
grav(Msun,Mearth,1.495E11);
(2),如果还要计算其他物体之间的引力,
例如地球和月球之间的万有引力,就不
必再次编写相应的程序段了,只需在调
用 grav()函数时换上相应的实际参数即
可 。
30
1.3 求解实际问题的步骤


有无


31
1.4 C语言的发展
? 在 C语言的基础上又派生了各种
C++语言; C++语言是面向对象
( OO— Object Oriented)的程序
设计语言。
? 如今,OO的程序设计方法已成
为流行、主流的程序设计方法。
32
1.5 I/O函数 printf与 scanf
? printf()函数和 scanf()函数是C语言中最基本的两个库
函数 。
? printf()函数的功能是通过标准输出设备 (通常
被设定为终端显示器 )输出一组数据,scanf()函
数的功能是通过标准输入设备 (通常被设定为
终端键盘 )输入一组数据 。
? printf()函数和 scanf()函数的原型为,
int printf(char *format,...);
int scanf(char *format,...);
? 其中参数 format被称为格式字符串,由要输出
的文字和数据格式说明组成 。 文字说明中除了
可以使用字母, 数字, 空格和一些数学符号以
外,还可以使用一些转义字符表示特殊的含义 。
33
表 1-1,常用的转义字符
转义字符 含 义
\ n 回车符
\ r 换行符
\ t 制表符
\ f 换页符
\ b 退格符
\ \ 反斜线
\ ‘ 单引号
\, 双引号
\ 0 0
\ nnn 码值为 nnn的 ASCII码,表示 3位 8进制数
34
举例 C0106.C
mian()
{
printf( ―\‖ \\* \‘ \101 \‘ is a character *\\ \‖
\n‖);
printf(―1\t12\t123\n‖);
printf(―1234567890\bA‖);
printf(―\rb\n‖);
}
输出结果为:
,\* ?A‘ is a character *\‖
1 12 123
b23456789A
35
表 1-2 常用的格式说明符
格式符 含 义
c 输出数据为单个字符
d 输出数据为整型
ld 输出数据为长整型
u 输出数据为无符号整型
lu 输出数据为无符号长整型
x 按 16进制格式输出整型数据
f 输出数据为浮点型
lf 输出数据为双精度型
e 按带指数形式输出浮点数据
s 输出数据为字符串数组
% 此处输出一个, %”号
一般格式,%<数据输出宽度说明 ><格式符 >
36
举例 C0107.C
mian()
{
int a = 1; float b = 10.12 ; char c = ?A‘;
printf(― a = %d ; \n b = %5.2f ; \n c = %c ; \n‖,a,b,c);
}
输出结果为:
a = 1 ;
b = 10.12 ;
c = A ;
37
C0107.C分析
? 输出三个类型分别为整形、浮点型、字
符型的数据,要定义三个不同类型的变
量。例中定义如下:
int a = 1; float b = 10.12 ; char c = ?A‘;
? 执行输出时不同的输出对象,要用不同
的格式说明符,例中使用了:
printf(― a = %d ; \n b = %5.2f ; \n c = %c ; \n‖,a,b,c);
38
建立 C语言环境
f:\>login guest
c:\>md c:\tc
c:\>Ncopy h:\tc c:\tc /s
39
验证
c:\tc>tc hello.c
40
课件及作业所在路径
? 数字化课件
,JEC253\USER2\TOOLS\LZQ\C‖
? 数字化作业
,JEC251\DATAROOM\HOMEWORK\YD91‖
41
TC 环境设置
TC 菜单如下:
File Edit Run Compile Project Options Debug Break/watch
42
启动 /退出 TC或装载文件
? 启动 TC
C:\>TC [程序名,C] <Enter>
即进入 TC操作环境;可编辑、运行程序。
? 退出 TC
按,Alt+X‖ 或, Alt+F―,在弹出的文件
菜单中选,Quit‖。
? 装载 C源程序
C:\TC>TC C0101.C
43
编辑操作 (简单)
? 移动光标
? ? ? ? 上下左右移动光标
? 输入程序行
按一个回车键 <Enter>定义一行,按一次
空格键 <Space>空出一列。
? 修改
先将光标移至出错处,输入正确字符,
删除错误字符。
? 删除
按一次,Backspace” 键删除光标左边的
一个字符,按,Del” 键删除光标处的一
个字符,按,Ctrl+Y” 删除当前行。
44
编译、连接、运行程序
? 所有用高级语言编写的源程序必须经编译、
连接产生可执行文件(,exe),才可以
运行(计算机才能识别)。
? 编译是进行语法检查,若正确,则产生目
标代码(,obj)。
? 连接是将目标代码程序和库函数(若调用
了的话)进行装配连接,产生可执行程序。
? 运行程序就是将可执行程序当作命令 发
出即可。
? 举例示意:
hello.C hello.obj
hello.exe
编译 连接
45
程序设计举例
? [例 1-1]hello( C0101.C)
? [ 例 1-2] 计算万有引力
(C0102.C)
? [例 1-3]加法器 (C0103.C)
? [例 1-4]显示生日卡 (C0104.C)
? [ 例 1-5] 计算梯形积分
(C0105.C)
46
[例 1-3]加法器( C0103.C)
分析
? 程序中要调用标准 I/O函数,它们的定义在
,stdio.h‖ 中,因此用了,#include <stdio.h>
? 定义三个变量 a,b,c; a和 b存放加数和被加
数,c存放结果; float a,b,c;
? 屏幕上提示信息:
printf("Please input two numbers,");
? 从键盘上输入 a和 b,C语言规定,输入操作只
能对地址,因此,要用地址运算符,&‖:
scanf("%f %f",&a,&b);
? a加 b的结果送 c,要用赋值语句:
c = a+b;
? 要想输出,xxxx.xx +xxxx.xx = xxx.xx‖的格式,
用:
printf("\n%7.2f + %7.2f = %7.2f\n\n",a,b,c);
47
[例 1-3]加法器 (C0103.C)程序
/* 程序 CALC.C,加法计算器程序 */
#include <stdio.h>
main()
{
float a,b,c;
printf("Please input two numbers,");
scanf("%f %f",&a,&b);
c = a+b;
printf("\n%f + %f = %f\n\n",a,b,c);
}
? 输 入, Please input two numbers,12.0 34.0
? 输 出, 12.000000 + 34.000000 = 46.000000
48
[例 1-4]显示生日卡分析
? 贺卡上要出现朋友和本人的名字,这个程序要
有通用性;为此,设置两个字符数组变量,例
中用:
char name1[41],name2[41];
printf("Please input your friend's name,");
scanf("%s",name1);
printf("\nPlease input your name,");
scanf("%s",name2);
? 任何图形都是绘制出来的。这里只是用字符简
单的“写出”一个图形来。例中用:
printf("\n\n\n====================================\n);
printf( "My dearest %s,\n",name1);
printf( " Happy birthday to you!\n");
printf( " yours,\n");
printf( " %s\n",name2);
printf( "====================================\n);
49
显示生日卡( C0104.C)程序
/* 程序 HAPPY.C,显示生日卡 */
#include <stdio.h>
main()
{ char name1[41],name2[41];
printf("Please input your friend's name,");
scanf("%s",name1);
printf("\nPlease input your name,");
scanf("%s",name2);
printf("\n\n\n====================================\n);
printf( "My dearest %s,\n",name1);
printf( " Happy birthday to you!\n");
printf( " yours,\n");
printf( " %s\n",name2);
printf( "====================================\n);
}
50
[例 1-4]程序结果
输 入,
Please input your friend's name,Zhang Hua
Please input your name,Li Ming
输 出,
==============================
======
My dear Zhang Hua,
Happy birthday to you!
yours,
Li Ming
51
[例 1-5]计算梯形积分
(C0105.C)
? 使用梯形法计算定积分 ∫f(x)dx,其中 a=0,
b=1,被积函数为 sin(x),取积分区间等
分数为 1000。
a b x
y f( x)
xi xi+1
h
梯型面积 =
(上底 +下低) x高
2
52
[例 1-5]续
? 计算原理和方法,
将积分区间等分为 n份,其中第 i个小区间上的
定积分可以用如下梯形的面积来近似替代:
∫f(x)dx≈(f(a+i*h)+f(a+(i+1)*h))*h/2
因此整个积分区间上的定积分可表示为
∫f(x)dx≈Σ(f(a+i*h)+f(a+(i+1)*h))*h/2
= ((f(a)+f(b))/2+Σf(a+i*h))*h
a+( i+1) h
a+ih
a
b
53
[例 1-5]程序
/* 程序 INTE.C,用梯形法计算定积分 */
#include <stdio.h>
#include <math.h>
/* 定义被积函数 */
double f(double x)
{
return sin(x);
}
/*注,sin( x) 是 C语言提供的标准库函数,
它的定义和说明在, math.h‖中 。 */
54
[例 1-5]主程序main()
{
double a,b,h,sum; /*积分的下限和上限, 步长, 结
果 */
int n,i; /* 积分区间等分数, i是循环变量 */
a = 0.0; b = 1.0; n = 1000;
h = (b-a)/n; /*计算小区间长度 */
/*---- 为工作变量赋初值, 先计算不易循环运算的部分 ----
*/
sum = (f(a)+f(b))/2;
/*---- 循环计算公式中的 Σ和式 -------------------------*/
for(i=1;i<n;i=i+1)
sum = sum+f(a+i*h);
sum = sum*h;
printf("The result is %f.\n",sum);
}
55
单元上机练习题目
? 1,在计算机上通过运行本单元的各例题,
熟悉 Turbo C集成环境的使用方法 。
? 2,乘法计算器程序, 请同学们根据例 1-3自
行改编 。
? 3,修改例 1-4的生日卡程序,使其能够输入
和显示日期 。
? 4,使用梯形法计算定积分 ∫abf(x)dx,其中
a=0,b=1,被积函数为 sin(x),取积分区间等
分数为 1000。
56
结束语
? ―纸上谈兵”学不出程序设计本领;
只有大量上机、编程、调试,才能
掌握。
? 学好程序设计语言的唯一途径是上
机。
? 你的编程能力和你在机器上投入的
时间成正比。