计算器程序讲义
10小时学会 C 语言
☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆
☆★☆★☆ 不要完全相信书上及老师所讲的内容,只有自己实作才是真的。 ☆★☆★☆
☆★☆★☆ 李栋梁 Sep.22,1997 ☆★☆★☆
☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆☆★☆★☆
参考书目:10 小时学会 C 语言[修订版] 施保旭着 儒林出版社 1997 年 6 月初版 3 版
内容
page
■ 第一章 C 语言简介与Turbo C 的使用
2
■ 第二章 C 程序的结构
4
■ 第三章 常数与变数
10
■ 第四章 基本输出入函式
13
■ 第五章
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图与抉择指令
21
■ 第六章 回圈与自动重复
32
■ 第七章 阵列与指针
40
■ 第八章 函数与呼叫
46
■ 第九章 文件存取
55
■ 第一章 C 语言简介与Turbo C 的使用
◎ C 语言的优点:
○ 效率高:C 语言的编译器会产生最小的程序码。
○ 可携性/移植性高:经过些许的修改,可以在不同的平台使用。
○ 功能强而有弹性。
○ 需要记忆的东西很少,易于写作。
◎ Turbo C 的安装:已安装在学校主机。
Turbo C 的环境设置:Turbo C 安装的目录必须设置在 PATH 的系统变数。
如: PATH=C:\TC;C:\DOS;...... 如此 TC 才能正常工作。
◎ Turbo C 的使用
只要设置好 PATH 变数,在 DOS 提示号输入 TC ,就可以执行 Turbo C 的
整合环境了。TC 将编辑(Edit)、编译(Compile)、连结(Link)、除错(Debug)、
文件管理(File)、...等等的功能整合在一起,所以我们称之为整合环境。
最好先用 CD 的指令,变更工作目录到你要写 C 的目录,再执行 TC,这样
所产生的文件,就会里这个目录里面,便于备份与管理。
◎ 移动光标
方向键 ←↑↓→ 可以用来移动光标。
◎ 删除文字
将光标移到你要删除的文字上,再按下 Del 键即可。
将光标移到要删除文字的右边,再按下 BS 退位键也可以。
◎ 载入文字档(C 语言原始码档)
按下功能键 F3 或 按 F10 选 File → Load 就会出现一个询问窗口
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
输入档名:
┌───── Load File Name ─────┐
│*.C │
└──────────────────┘
其中的档名可以使用通配符 * 或 ? ,或直接指定你要的档名。
若是使用通配符,TC 会再秀出一个窗口让你选择所要的文件,
你可以用方向键移动反白光棒,按 Enter 键则是选择反白的文件。
◎ 存贮编辑的文字档
按下功能键 F2 或 按 F10 选 File → Save 就会存贮目前编辑文件。
若你想另外取一个档名,并加以存档,就必须 按 F10 选 File → Write to
就会出现一个询问窗口要求输入档名:
┌────── New Name ──────┐
│_ │
└──────────────────┘
输入新的档名,按下 Enter 即可。
◎ 编译并执行目前的所编辑的程序
Turbo C 是一种编译语言系统,你所写的程序,经过 TC 的编译(pass 1)及
连结(pass 2)后,产生可执行档(.exe),才能在 PC 上执行。
按下 Ctrl + F9 或 按 F10 选 Run → Run ,TC 会编译目前所编辑的程序,
如果没有错误发生,TC 会立即执行所编辑的程序。
TC 在执行完程序后,会立刻切换回到 TC 的整合环境,如果你还想看刚才程序
执行的结果,可以按下 Alt + F5 或 按 F10 选 Run → User screen ,就会
切换到执行画面,再按下任何一键,就会回到 TC 的整合环境。
◎ 结束 Turbo C
按下 Alt + X 或 按 F10 选 File → Quit 便可结束 Turbo C。
若你还有已编修尚未存贮的文件,TC 会问你要不要存。
Verify
NONAME.C not saved. Save? (Y/N)
要存就按 Y ,不想存就按 N 。
■ 第二章 C 程序的结构
◎ C 程序的结构:
┌────────────┐
│hello.c │←─ 范例档名
├────────────┤
1│#include
│←─ 范例原始码
2│main() │
3│{ │
4│ printf("Hello!"); │
5│} │
├────────────┤
│Hello! │←─ 范例执行结果
└────────────┘
第一列: #include
是用来定义一些函式的原型(prototype)、资料结构(struct)或是常数(constant)。 C 在使用变数之前,该变数都要先行宣告(declear)才可使用,而使用函式也是一样,必须先宣告它的原型才可以。宣告函式的原型是为了让 C 能在编辑时作资料的型别检查,以减少错误的发生。 内建的函式原型定义都放在 INCLUDE\*.H 中,用 #include 就会将 INCLUDE\stdio.h 这个档引含。 stdio.h 由档名可知道是跟标准输出入(standard I/O)有关,档内定义了文件输出入、屏幕输出、键盘输入等相关函式的原型、资料结构及常数。 本例中的 printf() 就属于标准输出的函式。 引含 .h 档并不会让你的执行档变大或是变慢,而且还能让编辑器作正确的型别检查,所以要养成写 #include 的习惯。 ☆虽然在某些状况下,不加 #include <> 所产生的执行档,一样可以正常的执行。
第二列: main()
main() 就是主程序。程序在执行时,就是由这个函式开始执行。 在 C 语言中,内定的型别是 int ,所以原来的 main() 相当于是 int main(int)
★ 在这里正确的写法应该是 void main(void), 因为在这个简单的程序中,没有回传值,也没有输入参数。
☆ 回传值,是指一个函式在执行后传回的数值。
☆ 输入参数,是指一个函式可由参数决定执行的结果,这个部分在第八章中有详细的说明。
第三列: {
第五列: }
在第三列及第五列之间,属于 main() 函式的程序码。
{ 表示程序由此开始, } 表示程序到此结束。
第四列: printf("Hello!");
是本程序要求系统做动作的指令,称之为「叙述」。在 C 语言中,每一叙述都以分号(;)做为结束。 在这个程序中,利用缩排的方式,使程序的层次分明,增加可读性。
在 C 语言中,调位字元( 如:空白(space)、定位(tab)及换列字元 )在编译时都会被忽略,所以可适时加入调位字元,使程序好看一点。 要注意的是,别把一个完整的个体拆开,如:main、printf 等,这些字本身是一个完整的个体,不可予以拆开。而在各个个体之间,可以任意加入调位字元。
☆ C 语言中的英文字母是有分大小写的,printf() 与 PrintF() 不同, 内建的函式大多是小写的,你自己写的函式,则可以用大写来做区隔。
◎ printf 的功用
printf() 的功用是在屏幕上输出资料。在 TC 中,在编辑区内输入printf ,再将光标移到 printf 这个字上,按下 Ctrl + F1 就会看到以下Help画面:
┌────────── Help ───────────┐← 这是 TC 的 Help 窗口
│ │
│ printf: formatted output to stdout │← printf 是将格式化的
│ │ 资料输出到 stdout
│ int printf(const char *format, ...); │← printf 的语法
│ │
│ Prototype in stdio.h │← 要用 printf 应该
│ │ #include 的档
│ Print formats a variable number of arguments │← 使用说明:不同的格式
│ according to the format, and sends the output │ 须要不同的参数,这些
│ to stdout. Returns the number of bytes output. │ 资料会送到stdout。传
│ In the event of error, it returns EOF. │ 回值是输出的byte数,
│ │ 若发生错误则传回 EOF
│ See also ecvt fprintf putc │← 可参考相关指令:
│ puts scanf vprintf │ ecvt,fprintf,putc,
│ │ puts,scanf,vprintf
└────────────────────────┘
在用 TC 的整合环境中,只要将光标移到想进一步了解的指令或内建的函式上,按 下 Ctrl + F1 就可以叫出 TC 的 Help 说明窗口,得到该指令或函式的相关说明。
printf 的语法: int printf(const char *format, ...);
其中 const char *format 指的是一个格式化的字串。 const 是常数的意思,在此表示 format 这个字串指针传入 printf 函式后,它的值不会被改变。
... 指的是不定参数,参数的数目取决于 format 字串的内容,这些参数,通常是一些你要秀出来的变数。 简单来说: printf( "输出格式(含控制字串)" , 要印出的资料 );
在 C 语言中是用双引号(")来引含字串,也就是在双引号内的资料,是一个字串。本章只介绍 %d 这个控制字串,其他的控制字串在第四章会讲到。 %d 表示以整数 10 进位的方式秀出资料。在输出格式(含控制字串) 内有几个%d ,在要印出的资料内就要有几个整数来对应。
┌────────────────────────────────┐
│arith.c │
├────────────────────────────────┤
1│#include │
2│void main(void) │
3│{ │
4│ printf("%d + %d = %d\n", 8 , 2 , 8+2 ); │
5│ printf("%d - %d = %d\n", 8 , 2 , 8-2 ); │
6│ printf("%d * %d = %d\n", 8 , 2 , 8*2 ); │
7│ printf("%d / %d = %d\n", 8 , 2 , 8/2 ); │
8│} │
├────────────────────────────────┤
│8 + 2 = 10 │
│8 - 2 = 6 │
│8 * 2 = 16 │
│8 / 2 = 4 │
└────────────────────────────────┘
我们以第四列的叙述作说明:
printf("%d + %d = %d\n", 8 , 2 , 8+2 );
↑ ↑ ↑ │ │ │
│ │ └───│──│──┘
│ └─────│──┘
└────────┘
在 输出格式(含控制字串) 内有 3 个 %d ,所以在 要印出的资料 的部分有
8 , 2 , 及 8+2 三个整数对应,所以输出来的结果就是
8 + 2 = 10
在 输出格式(含控制字串) 的最后有 \n 符号,这是一个控制字元,表示要
更换到下一列,其他的控制字元在第四章会提到。
若将本例中的 \n 都删除,那秀出的结果会像这样子:
8 + 2 = 108 - 2 = 68 * 2 = 168 / 2 = 4
◎ C 的四则运算
电脑语言用的四则运算符号几乎都是相同的:
四则运算符号 意 义 范 例 结 果
============ ===================== ============== ==========
+ 加法 4 + 2 6
- 减法 ( 或代表负号 ) 4 - 2 2
* 乘法 4 * 2 8
/ 除法 4 / 2 2
============ ===================== ============== ==========
相关运算符号 意 义 范 例 结 果
============ ===================== ============== ==========
++ 变数值加 1 i++ 或 ++i i 值加 1
-- 变数值减 1 i-- 或 --i i 值减 1
% 整数除法的余数 4 % 2 0
============ ===================== ============== ==========
在书中提到 C 语言没有提供次方的功能,指的是在某些电脑语言可以用 ** 表示
次方,如: 2 ** 3 ,表示 2 的 3 次方;有的用 ^ 表示,如: 2 ^ 8 ,表示
2 的 8 次方。在 C 语言,没有运算符号可以表示次方,但是 C 语言有提供次方
的函式: pow(), pow( 2 , 3 ) 表示 2 的 3 次方。
一个式子如果有多个运算的话,C 是以先乘除后加减的方法来运算,当然我们也
可以用括号 ( ) 来改变这个法则,只要有括号,就优先运算。另外,在 C 语言内
中括号 [ ] 及 大括号 { } 是有其他的用途,所以在作
数学
数学高考答题卡模板高考数学答题卡模板三年级数学混合运算测试卷数学作业设计案例新人教版八年级上数学教学计划
运算时,只要用括号
,就只能用小括号 ( ),小括号可以多层,C 在运算时,是由最内层开始运算。
范例: ( 1 + 2 * ( 3 + 4 ) ) * 5 - 6 * 7 / 2 + 8
= ( 1 + 2 * ( 7 ) ) * 5 - 6 * 7 / 2 + 8
= ( 15 ) * 5 - 6 * 7 / 2 + 8
= 75 - 42 / 2 + 8
= 75 - 21 + 8
= 62
◎ 注解(Comments)
通常老师会要求初学者在程序的每一列加上注解,这是为了让初学者知道自己在写些什么程序码,了解为什么要这样写,而不只是照着书 Keyin 程序。写注解有助于自己了解程序的内容,便于日后的修改。但写注解对于某些程序设计师而言可说是一种噩梦,因为写注解所花的时间可能会与写程序的时间相去不远,认为写注解只是在浪费时间。 对一个相当好的程序设计师而言,也许写注解真的是浪费时间,因为好的程序码本身就已经隐含了注解,这也是写程序相当高的境界。 对一般的程序设计师而言,写一些注解还是比较好的作法,特别是某些程序码是你花了一段时间才想到的「特殊」方法,加上一些注解,说明一下这个「特殊」的方法,以后要修改才能快速进入状况,否则,你可能会佩服自己当时是如何想到的这个方法,又再花一段时间才知道自己在写些什么程序码。 讲了这么多注解的正反面(正面居多)论调,在 C 语言中要如何写注解呢? 只要用 /* 和 */ 将你要的注解内容包起来就可以了。C 在编译时,会将 /* */ 内的资料略去,就如同调位字元一样。唯一的例外是:当 /* */ 在一组双引号 " 内时,它们就属于这组双引号所包含的字串。 在 C++ 语言中则可用//当注解.
┌────────────────────────────────┐
│comments.c or comments.cpp │
├────────────────────────────────┤
1│#include /* prototype : printf() */ │
2│void main(void) // main program │
3│{ │
4│/* 所有的程序码都变成注解,所以这个程序目前是空的 */ │
5│/* printf("%d + %d = %d\n", 8 , 2 , 8+2 ); */ │
6│/* printf("%d - %d = %d\n", 8 , 2 , 8-2 ); │
7│ printf("%d * %d = %d\n", 8 , 2 , 8*2 ); │
8│ printf("%d / %d = %d\n", 8 , 2 , 8/2 ); // division │
9│*/ │
10│} // end of program │
├────────────────────────────────┤
└────────────────────────────────┘
◎ 嵌套注解(Nested Comments)
┌────────────────────────────────┐
│nestcom0.c │
├────────────────────────────────┤
1│#include /* prototype : printf() */ │
2│void main(void) │
3│{ │
4│/* 这个程序必须把嵌套注解的设置打开,才不会有错误 */ │
5│/* │
6│ printf("%d + %d = %d\n", 8 , 2 , 8+2 ); │
7│/* printf("%d - %d = %d\n", 8 , 2 , 8-2 ); */ │
8│ printf("%d * %d = %d\n", 8 , 2 , 8*2 ); │
9│ printf("%d / %d = %d\n", 8 , 2 , 8/2 ); │
10│*/ │
11│} │
├────────────────────────────────┤
└────────────────────────────────┘
上面的例子,有四组注解 /* */ ,其中第三组及第四组的注解之间有部分重叠。
想要 Compile 没有错误,必须第 5 列的 /* 与 第 10 列的 */ 配,也就是
第 5 列到第 10 列都是注解;另外第 7 列的 /* 与 第 7 列的 */ 配,也就是
第 7 列是注解。这种注解方式,我们称之为嵌套注解。
Turbo C 内定是不可使用嵌套注解的,上面的例子会是第 5 列的 /* 与 第 7 列
的 */ 配,结果在第 10 列的 */ 会变成是多余的,造成 Compile 错误。
打开嵌套注解的方法:
按下 F10 → Options → Compiler → Source → Nested comments Off
将 Off 设为 On 就可以了。
◎ 嵌套注解的使用时机
在前面的例子只是为了说明嵌套注解,也许你会觉得这样的用法是自找麻烦,
但是以下的例子,你就会认为有嵌套注解的功能还是比较好的。
在 nestcom1.c 中,每一列的 printf(); 后面都加上了注解。
若要把这几列程序变成注解,不使用嵌套注解,就会像 nestcom2.c 一样,
必须在每一列的 printf(); 前后再加上 /* */,若是使用嵌套注解,
就像 nestcom3.c 一样,只要在这几列的前后加 /* */ 就可以了。
┌────────────────────────────────┐
│nestcom1.c │
├────────────────────────────────┤
1│#include /* prototype : printf() */ │
2│void main(void) │
3│{ │
4│ /* 这个程序在每一个叙述后都加上了注解 */ │
5│ │
6│ printf("%d + %d = %d\n", 8 , 2 , 8+2 ); /* 8 + 2 = 10 */ │
7│ printf("%d - %d = %d\n", 8 , 2 , 8-2 ); /* 8 - 2 = 6 */ │
8│ printf("%d * %d = %d\n", 8 , 2 , 8*2 ); /* 8 * 2 = 16 */ │
9│ printf("%d / %d = %d\n", 8 , 2 , 8/2 ); /* 8 / 2 = 4 */ │
10│ │
11│} │
├────────────────────────────────┤
└────────────────────────────────┘
┌────────────────────────────────┐
│nestcom2.c │
├────────────────────────────────┤
1│#include /* prototype : printf() */ │
2│void main(void) │
3│{ │
4│/* 这个程序不用把嵌套注解的设置打开,也不会有错误 */ │
5│ │
6│/* printf("%d + %d = %d\n", 8 , 2 , 8+2 ); */ /* 8 + 2 = 10 */ │
7│/* printf("%d - %d = %d\n", 8 , 2 , 8-2 ); */ /* 8 - 2 = 6 */ │
8│/* printf("%d * %d = %d\n", 8 , 2 , 8*2 ); */ /* 8 * 2 = 16 */ │
9│/* printf("%d / %d = %d\n", 8 , 2 , 8/2 ); */ /* 8 / 2 = 4 */ │
10│ │
11│} │
├────────────────────────────────┤
└────────────────────────────────┘
┌────────────────────────────────┐
│nestcom3.c │
├────────────────────────────────┤
1│#include /* prototype : printf() */ │
2│void main(void) │
3│{ │
4│/* 这个程序也必须把嵌套注解的设置打开,才不会有错误 */ │
5│/* │
6│ printf("%d + %d = %d\n", 8 , 2 , 8+2 ); /* 8 + 2 = 10 */ │
7│ printf("%d - %d = %d\n", 8 , 2 , 8-2 ); /* 8 - 2 = 6 */ │
8│ printf("%d * %d = %d\n", 8 , 2 , 8*2 ); /* 8 * 2 = 16 */ │
9│ printf("%d / %d = %d\n", 8 , 2 , 8/2 ); /* 8 / 2 = 4 */ │
10│*/ │
11│} │
├────────────────────────────────┤
└────────────────────────────────┘
■ 第三章 常数与变数
C 语言的资料可分为常数(constant)及变数(variable),常数指的是固定不变的数,
例如:0,1,2 等数值,或是用双引号定义的字串,我们也称之为字串常数。
变数指的是数值可以改变的数,例如:一个整数变数,我们可以把它设成 1,然后再
改为 10,或是其他的整数数值。
一个程序若没有变数,那纯粹只是将常数秀出来而已,好比是用文字编辑器编辑一个
文件,再用 type 把它秀出来一样。有了变数,就可以做不同的变化。
◎ 变数的型态──Char, int, long, float, double etc.。
◎ 变数的命名
如同文件的命名,变数的名字要取得有意义,在 C 中,名字可以取得很长,但是
要用英文的,所以你可以把变数用中翻英来命名。
◎ 变数的命名规则
○ 变数名称的第一个字元必须是英文字母(A 到 Z 或 a 到 z)或是底线( _ )。
○ 第二个字元以后可以使用前述字元,再加上数字 0 到 9 。
○ 变数名称的大小写是不同的。
○ 变数名称的最前面 32 个字元有效。
○ 不可以使用「保留字」当变数的名称,保留字是给编译器使用,不可以当成
变数名称。TC 有以下的保留字:
流程: if else for do while
switch default case break continue
goto return
型别: char int long float double
void register signed unsigned
short near far huge
typedef struct union enum
auto const static volatile extern
interrupt cdecl pascal asm
运算: sizeof
寄存器: _AX _AH _AL _cs _CS
_BX _BH _BL _ds _DS
_CX _CH _CL _es _ES
_DX _DH _DL _ss _SS
_SI _DI _BP _SP
◎ 变数的设置
使用变数时,应该先考量这个数可能的数值范围,用以选定变数的型别,例如:
用一个数来存班上的人数,一个合班的大班级可能超过百人,但最大不太可能
超过千人,所以选一种变数型别可存 1000 以下的数值,在此可选整数。
若是要用一个数来存你的存款,则整数的上限 32767 可能某些同学一个月的薪资
就是它的数倍,所以要选长整数,它的上限是 2147483647 。在数学运算时,
想要有小数的就要用浮点数(float)。
在 C 语言中,变数宣告的语法如下:
┌────────────────────┐
│ 型别 变数名称1 [,变数名称2 [,...]] ; │
└────────────────────┘
例如: int NumberOfStudent; /* 学生人数 */
long MoneyInBank, interest; /* 银行存款 */
float RateOfInterest; /* 利息利率 */
char EndOfString; /* 字串结束 */
char OneStudentName[9]; /* 学生姓名 */
在宣告变数时,我们可以设置变数的初始值(initial value),语法如下:
┌────────────────────────────┐
│ 型别 变数名称1=初始值1 [,变数名称2=初始值2 [,...]] ; │
└────────────────────────────┘
例如: int NumberOfStudent=60; /* 学生人数 */
long MoneyInBank=1000000L; /* 银行存款 */
float RateOfInterest=5.0; /* 利息利率 in % */
char EndOfString='\0'; /* 字串结束 */
char OneStudentName[9]="王大明"; /* 学生姓名 */
注意: 在银行存款的设置数值 1000000 后加上一个 L ,表示这个常数数值
1000000 是一个长整数。因为 C 语言内定的型别是整数,为了防止
不可预期的状况发生,最好是自己把它设置成你想要的型别,不要
假设 TC 会帮你做好好的,要假设 TC 很笨不会帮你做,这样在发展
大程序要除错时,就可以把问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
简化,不必再考虑是不是资料型别错误,
只要把程序流程或演算法搞定就可以了。
在 TC 中,不加 L,结果还是正确的,但是在其它的环境下可能会不同。
多加一个 L 并不会使程序变大或变慢,又能保障正确使用,何乐不为。
○ 复习一下字元与字串:
char 字元只占一个 byte,以一组单引号 ' 引含字元资料,其表示法如下:
单一字元: 'A' 、'a' 、'0' 。
八进位数值: '\101'、'\141'、'\60' 、'\0'
十六进位数值: '\x41'、'\x61'、'\x30'、'\x0'
字串则是由一个以上的字元所组成的,而且以 '\0' 这个字元做为结尾。
表示法: "123"、"ABC"、"abc"。以上的三个例子都是占 4 bytes。
用 strlen() 可以取得字串的长度(不含 '\0' 字元)。
如: int StringLen=strlen("123");
这样,StringLen 就等于 3 。
☆ 在使用 strlen() 时,必须加入 #include
◎ 设置叙述
前面已经说明了变数在宣告时给定初值的方法,接下来是在程序执行的过程中设置变数数值的方法。 即然是变数,表示它的数值可能在程序执行的过程中会改变多次,如果一个变数在整个程序执行中都不会改变,或许你该把它设成常数。
在设置变数时,可以用等号 = 来设置变数新值,语法如下:
┌────────────────────────────┐
│ 变数名称 = 运算式(运算式、函式传回数值或两者混合); │
└────────────────────────────┘
这个意思是等号左边「变数名称」的数值会等于等号右边「运算式」的运算结果。
在 C 中,等号 = 是用来设置变数数值的,所以在等号的左边必须是变数,不可以
是常数。在逻辑上的相等,在 C 中是用两个等号 == 来表示,有关逻辑的表示,
在第五章中会作介绍。以下我们来看一些设置的例子,计算圆的面积:
PI = 3.1415926;
r = 4;
area = PI * r * r ;
以下是用变数的方式表示的范例:
┌────────────────────────────────┐
│var.c │
├────────────────────────────────┤
│#include │
│void main(void) │
│{ │
│ int i,j; │
│ │
│ i = 10; │
│ j = 2; │
│ printf("%d