第一章 初识C语言
章节内容
- C的历史和特性
- 编写程序所需的步骤
- 关于编译器和链接器的一些知识
- C的标准
1.1 C语言的起源
- 编程语言的目标具有一定的参考意义,可以明白为何采用它。
1.2 使用C语言的理由
- C语言的特性:控制结构、快速、紧凑、可移植、自由度高。
1.3 C语言的应用范围
1.4 计算机能做什么
- 计算机基本组成
中央处理单元CPU(Central Processing Unit):负责绝大多数计算机的计算工作。
随机访问存储器RAM(Random Access Memory):保存运行的程序和文件,与CPU直接诶交换数据。
永久存储器:保存计算机数据。
外围设备:键盘、鼠标、显示器等等,提供人与计算机的交互通信。 - 编译器*
表层过程中高级指令可以使编程者更加便捷的表达,但计算机不易理解这些指令。编译器将高级语言程序解释为计算机需要的详细的低级程序指令,使得编程者可以自在思考并表达想法,并将想法写成的高级语言指令翻译为供计算机执行的一系列低级命令。编译器还可以将一份程序转换为适应各种不同机器的指令,使得编程只需一次。
1.5 高级计算机语言和编译器
1.6 语言标准
1.7 使用C语言的7个步骤
- 步骤并非是从初到末的,而是循环往复或不断变化的。编程步骤1、2比较重要,不能忽视。编写代码应尽量先进行规划,这将节省不少后续时间。
- 定义程序目标
明确编程目标,对程序完成的事情有概念性的认识:希望通过编程对计算机提供什么资料,计算机需要进行何种处理,计算机输出什么结果。在此阶段不需要考虑具体的程序语法和程序代码。 - 设计程序
思考程序矩体实现方法,呈现方式,预估程序编写时间。编写伪代码。 - 编写代码
编写代码。注意编程规范性,适当添加注释。 - 编译
运行编译器,将代码进行编译操作,并进行错误改正以及代码改善。 - 运行程序
对编译通过的程序进行运行。 - 测试和调试程序
对程序进行多种情况下的测试,尽可能发现程序缺陷或错误(Bug)检查程序是否能正常运行并达到预期目标。对错误情况进行调试(Debugging)。 - 维护和修改程序
对程序后期使用进行故障修复、功能改善、功能添加等操作。
1.8 编程机制
文件名组成:基本名.扩展名
编译器与链接器
C编程编写的源代码需要转换为可执行文件(机器语言代码)后才能运行,分两部来完成:编译和链接,分别用到编译器和链接器。编译器*:将编写的各个源代码文件转换为中间代码(此时还不是最终执行的机器代码,仅仅是自己编写的代码相对应的机器代码,也称为目标代码),供后续链接器使用。
链接器*:将目标代码、系统标准启动代码、程序运行需要的库代码三者结合为一个可执行文件。
启动代码*:启动代码作用为连接操作系统与程序之间的接口。将程序需要的操作与操作系统用于实现相关功能的接口对应起来。
库代码*:一些基本或高频的C代码并不需要自己编写去实现,C程序库中自带一些相关代码,在程序中直接通过一些短指令来引用。引用语句并不能被机器直接运行,需要链接器在后期从C库中调出相关短指令代表的命令代码,并将短指令替换。
源代码文件应该是文本文件,不是字处理文件(字处理文件类似于word文件,除了文件本身包含的文字外,还包含许多字体颜色和格式等信息,不是纯文本文件)。
实际编程中易出现的一个问题:程序运行窗口在程序命令运行完之后瞬间消失。
解决方法:在程序命令里的return语句之前添加如下一行代码getchar();
该命令作用为读取一次键盘按键输入,效果为程序运行到此处时候只有按下回车键(Enter键)才继续运行。假若程序中此处已经有需要输入内容并等待回车的命令,则可以连续两次使用该代码
getchar(); getchar();
该重复一次的代码段意为先根据第一次按下的回车键来读取输入的数据,然后按第二行命令等待按下回车键来继续运行程序。(对于入门者此处无需过于理解,入门后自然明白)。
1.9 本书的组织结构
1.10 本书的约定
1.11 本章小结
1.12 复习题
就编程而言,可移植性表示什么?
一个程序的可移植性好,就是指它的源代码不经修改就可以在多种不同的计算机系统上编译成可以成功运行的程序。解释源代码文件、目标代码文件和可执行文件之间的区别。
源代码文件中包含着程序员使用任何语言编写的代码。
目标代码文件包含着机器语言代码,它并不需要是完整的程序代码。
可执行文件包含着组成可执行程序的全部机器语言代码。编程的7个主要步骤是什么?
a.定义程序目标;
b.编写程序代码;
c.编写程序代码;
d.编译程序;
e.运行程序;
f.测试和调试程序;
g.维护和修改程序;编译器的任务是什么?
编译器把源代码(例如,用C语言写成的代码)转换成机器语言代码,也称对象代码。链接器的任务是什么?
链接器把多个来源(例如,已编译的的源代码、库代码和启动代码)的目标代码连接成一个单独的可执行程序。
1.13 编程练习
- 您刚刚被MacroMuscle有限公司(Software for Hard Bodies)聘用。该公司要进入欧洲市场,需要一个将英寸转换为厘米(1英寸=2.54cm)的程序。他们希望建立的该程序可提示用户输入英寸值。您的任务是定义程序目标并设计该程序(编程过程的第1步和第2步)。
第二章 C语言概述
章节内容
- 运算符=
- 函数:main()、printf()
- 编写一个简单的C程序
- 创建整型变量,为其赋值,并在屏幕上显示该值
- 换行字符
- 如何在程序中加入注释,建立包含多个函数的程序,以及造出程序中的错误
- 理解什么是关键字
2.1 简单的C程序示例
经典程序例子及解析
#include <stdio.h> int main (void) //简单C程序例子 { int num; //定义名为num的一个变量 num = 1; //将num赋值为1 printf ("I am a simple "); //使用函数printf()输出内容 printf ("computer.\n"); printf ("My favorite number is %d because it is first.\n",num); return 0; }
2.2 示例解释
C程序的各个部分及简要介绍
告诉编译器编译时包含stdio.h文件的所有内容(此文件对一些C语言的基本功能如输入接受和输出显示提供支持,这些功能的实现并不需要自己亲自编写)。
#include <stdio.h> //包含另一个文件
对函数进行定义,C语言包含至少一个函数,上面的函数为其中比较基本的函数。格式:int是函数类型(函数有多种不同的类型,此处为整数类型函数。);main()是函数的名字;main()括号中的void为函数接收值(函数运行时可以接受特定输入,void代表此函数不需要输入值。)
int main(void) //函数名
这是注释,注释的作用是对代码做一定说明,对于机器没有任何意义,在编译的时候也会被机器全部忽略,只是为了日后查看代码或他人阅读代码的时候容易理解而建立。注释有两种,一种为行注释,一种为块注释。行注释用于简短的,一行或一行不到的注释使用,可以放在任意位置,在一行中,双斜线之后的所有内容均被认为是注释。对于块注释,结构由/和/组成,两者之间的所有内容无论几行,都被认为是注释。第二段代码为两种注释的例子(块注释代码显示效果有问题,代码是正确的)。
// 简单C程序例子 //行注释 /* 块注释 */
2.3 简单程序的结构
2.4 提高程序可读性的技巧
2.5 进一步使用C
2.6 多个函数
2.7 调试程序
- 对于编译器给出的错误提示,不必全部更改后再运行,可以先修改为首的几个,尝试运行后再决定是否继续修改。
- 编译器给出的错误位置一般要比真正的错误位置滞后一行。
- 编译器基本无法检测出语义错误。
- 可以通过在关键点处加入而外的printf()语句来查找语句错误,解决错误之后再删除相关测试用printf()语句。
- 把关键字或保留标识符用作变量名将会引起编译器报错。
2.11 复习题
- 如何称呼C程序的基本模块?
什么是语法错误?给出它的一个英语例子和C语言例子。
什么是语义错误?给出它的一个英语例子和一个C语言例子。
Indiana Sloth已经编好了下面的程序,并想征求您的意见。请帮助他评定。
include studio.h int main{void} /* 改程序可显示出一年中有多少周 /* ( int s s: = 56: print (Tere are s weeks in a year.): return 0:
假设下面的每一个例子都是某个完整程序的一部分,它们每个将输出什么结果?
a.printf("Baa Baa Black Sheep.""); printf("Have you any wool?\n"); b.printf("Begone! \nO vreature of lard!"); c.printf("What?\nNo/nBonzo?\n"); d.int num; num = 2; printf("%d + %d = Td"), num, num, num + num);
下面哪几个是C的关键字?main,int,function,char,=
如何以下面的格式输出words和lines的值:”There were 3020 words and 350 lines”?这里,3020和350代表两个变量的值。
考虑下面的程序:
#include<studio.h> int main(void) { int a, b; a = 5; b = 2; /* 第7行 */ b = a; /* 第8行 */ a = b; /* 第9行 */ printf("%d %d\n", b, a); return 0; }
请问在第7行、第8行和第9行之后程序的状态分别是什么?
2.12 编程练习
编写一个程序,调用printf()函数在一行上输出您的名和姓,再调用一次printf()函数在两个单独的行上输出您的名和姓,然后调用一对printf()函数在一行上输出您的名和姓。输出应如下所示(内容可换为自己的名和姓)
Anton Bruckner Anton Bruckner Anton Bruckner
编写一个程序输出您的姓名和地址
编写一个程序,把您的年龄转换成天数并显示二者的值。不用考虑平年(fractional year)和闰年(leap year)的问题。
编写一个能够产生下面输出的程序:
For he's a jolly good fellow! For he's a jolly good fellow! For he's a jolly good fellow! Which nobody can deny!
程序中除了main()函数之外,要使用两个用户定义的函数:一个用于把上面的夸奖消息输出一次;另一个用于把最后一行输出一次。
编写一个程序,创建一个名为toes的整数变量。让程序把toes设置为10,再让程序计算两个toes的和以及toes的平方。程序应该输出所有的3个值,并分别标识它们。
编写一个能够产生下列输出的程序:
Smile!Smile!Smile! Smile!Smile! Smile!
在程序中定义一个能显示字符串Smile!一次的函数,并在需要时使用该函数。
编写一个程序,程序中要调用名为one_three()的函数。该函数要在一行中显示单词“one”,再调用two()函数,然后再在另一行中显示单词“three”。函数two()应该能在一行中显示单词“two”。main()函数应该在调用one_three()函数之前 显示短语“starting now:”,函数调用之后要显示“done!”。这样,最后的输出结果应该如下所示:
starting now! one two three done!
第三章 数据和C
章节内容
- 关键字:int, short, long, unsigned, char, float, double, _Bool, _Complex, _Imaginary
- 运算符:sizeof
- 函数:scanf()
- C使用的基本数据类型
- 整数类型和浮点数类型的区别
- 对上述类型,如何书写常量和声明变量
- 使用printf()和scanf()函数读写各种类型数据的值
3.1 示例程序
- 错误和警告:编译过程中错误消息标明程序中存在错误,不能对其进行编译。警告则表明尽管代码正确但有可能不是程序员所要的。警告不终止编译过程。
3.4 C数据类型
总结:基本数据类型
- 关键字:基本数据类型使用11个关键字:int、long、short、unsigned、char、float、double、signed、_Bool、_Complex和_Imaginary。