c语言程序设计(第二版)K&R

5星(超过95%的资源)
所需积分/C币:41 2014-05-27 16:57:49 5.76MB PDF
213
收藏 收藏
举报

传说中的K&R C,c语言创始人编写,最经典的c编程书籍,没有之一!
Cha°de0 下载 第l章基本概念 3 那么C编译器将会产生一个错误信息。 printf函数永远不会自动换行,我们可以多次调用这个函数来分阶段打印一输出行。上面给 出的第一个程序也可以写成如下形式 #include <stdio. h> printf(hello, printf("world")i printf("\n")i 它所产生的输出与前面一样。 请注意,只表示—个字符。诸如n等换码序列为表示不能打印或不可见字符提供了一种通 用可扩充机制。除此之外,C语言提供的换码序列还有:表示制表符的,表示回退符的\b,表 示双引号的",表示反斜杠符本身的。2.3节将给出换码序列的完整列表 练习1-1请读者在自己的系统上运行"helo, world”程序。再做个实验,让程序中遗漏一 些部分,看看会出现什么错误信息。 练习12做个实验,观察一下当prit函数的变元字符串中包合c其中c是上面未列出的某 个字符)时会出现什么情况 1.2变量与算术表达式 下面的程序用公式 C=(5/9)(F-32 打印华氏温度与摄氏温度对照表 20 6 40 4 80 26 100 120 140 160 180 82 200 240 115 260 126 80137 C程序设计语言 Chinapub.com 下载 300 这个程序本身仍只由一个名为main的函数的定义组成,它要比前面用于打印" hello, world"的 程序长,但并不复杂。这个程序中引入了一些新的概念,包括注解、说明、变量、算术表达式、 循环以及格式输出。该程序如下 #include <stdio.h> /*对fahr=0,20 300 打印华氏温度与摄氏温度对照表* main( int fahr, celsius int lower, upper, step lower =0 /*温度表的下限*/ upper=300;/*温度表的上限* step /*步长 fahr = lower whil (fahr celsius =5 *(fahr-32)/9; printf("od\tod\n", fahr, celsius)i fahr = fahr step; 其中的两行 /*对fahr=0,20,..,300 打印华氏温度与摄氏温度对照表* 叫做注解,用于解释该程序是做什么的。夹在/*与*之间的字符序列在编译时被忽略掉,它们可 以在程序中自由地使用,目的是为了使程序更易于理解。注解可以出现在任何空格、制表符或 换行符可以出现的地方。 在C语言中,所有变量都必须先说明后使用,说明通常放在函数开始处的可执行语句之前。 说明用于声明变量的性质,它由一个类型名与若干所要说明的变量组成,例如 int fahr, celsius; int lower, upper, stepi 其中,类型int表示所列变量为整数变量,与之相对, float表示所列变量为浮点变量(浮点数可 以有小数部分)。int与foat类型的取值范围取决于所使用的机器。对于int类型,通常为16位(取 值在-32768~+32767之间),也有用32位表示的。foat类型一般都是32位,它至少有6位有效数 字,取值范围一般在103~103之间。 除int与foat之外,C语言还提供了其他一些基本数据类型,包括 char 字符—单字节 short 短整数 第章基本概念 5 下载 long 长整数 double双精度浮点数 这些数据类型对象的大小也取决于机器。另外,还有由这些基本类型组成的数组、结构与联合 类型、指向这些类型的指针类型以及返回这些类型的函数,我们将在后面适当的章节再分别介 绍它们。 上面温度转换程序计算以4个赋值语句 lower 0 upper =300 step 20; fahr lower 开始,用于为变量设置初值。各个语句均以分号结束。 温度转换表中的每一行均以相同的方式计算,故可以用循环语句来重复产生各行输出,每 行重复一次。这就是 while循环语句的用途 while (fahr < upper) f while循环语句的执行步骤如下:首先测试圆括号中的条件。如果条件为真(fahr小于等于 upper),则执行循环体(括在花括号中的三个语句)。然后再重新测试该条件,如果为真,则再 次执行该循环体。当该条件测试为假(fahr大于 upper)时,循环结束,继续执行跟在该循环语 句之后的下一个语句。在本程序中,循环语句后再没有其他语句,因此整个程序终止执行。 whiler语句的循环体可以是用花括号括住的一个或多个语句(如上面的温度转换程序),也可 以是不用花括号括住的单个语句,例如 while (1< j 在这两种情况下,我们总是把由 while控制的语句向里缩入一个制表位(在书中以四个空格表示), 这样就可以很容易地看岀循环语句中包含那些语句。这种缩进方式强化了程序的逻辑结构。尽 管℃编译程序并不关心程序的具体形式,但使程序在适当位置采用缩进空格的风格对于使程序更 易于为人们阅读是很重要的。我们建议每行只写一个语句,并在运算符两边各放一个空格字符 以使运算组合更清楚。花括号的位置不太重要,尽管毎个人都有他所喜爱的风格。我们从 比较流行的风格中选择了一种。读者可以选择自己所合适的风格并一直使用它。 绝大多数任务都是在循环体中做的。循环体中的赋值语句 celsius =5 *(fahr-32)/9; 用于求与指定华氏温度所对应的摄氏温度值并将值赋给变量 celsius。在该语句中,之所以把表达 式写成先乘5然后再除以9而不直接写成59,是因为在C语言及其他许多语言中,整数除法要进 行截取:结果中的小数部分被丟弃。由于5和9都是整数,59相除后所截取得的结果为0,故这样 所求得的所有摄氏温度都变成0。 这个例子也对 printf数的工作功能做了更多的介绍。 printi是一个通用输出格式化函数,第 7章将对此做详细介绍。该函数的第一个变元是要打印的字符串,其中百分号(%)指示用其他 C程序设计语言 Chinapub.com 下载 变元(第2、第3个..变元)之一对其进行替换,以及打印变元的格式。例如,%d指定一个整数 变元,语句 printf("od\tod\n", fahr, celsius)i 用于打印两个整数fahr与 celsius值并在两者之间空一个制表位(th printf函数第1个变元中的各个%分别对应于第2个、第3个.第n个变元,它们在数目和类型 上都必须匹配,否则将出现错误。 顺便指出, printf函数并不是C语言本身的一部分,C语言本身没有定义输入输出功能。 printf是标准库函数中一个有用的函数,标准库函数一般在C程序中都可以使用。ANSI标准中定 义了 print函数的行为,从而其性质在使用每一个符合标准的编译程序与库中都是相同的。 为了集中讨论C语言本身,在第7章之前的各章中不再对输入输出做更多的介绍,特别是把 格式输入延后到第7章。如果读者想要了解数据输入,请先阅读7.4节对 scanf函数的讨讼。 scanf 函数类似于 printf函数,只不过它是用于读输入数据而不是写输出数据。 上面这个温度转换程序存在着两个问题。比较简单的一个问题是,由于所输出的数不是右 对齐的,输岀显得不是特别好看。这个问题比较容易解决:只要在 printf语句的第1个变元的%d 中指明打印长度,则打印的数字会在打印区域内右对齐。例如,可以用 printf("3d 6d\n", fahr, celsius)i 打印fahr与 celsius的值,使得fahr的值占3个数字宽、 celsius的值占6个数字宽,如下所示 17 40 4 60 80 100 另一个较为严重的问题是,由于使用的是整数算术运算,故所求得的摄氏温度不很精确, 例如,与呷对应的精确的摄氏温度为-17.8℃,而不是-1σ℃C。为了得到更精确的答案,应该用 浮点算术运算来代替上面的整数算术运算。这就要求对程序做适当修改。下面给出这个程序的 第2个版本 #include <stdio.h> /*对fahr=0,20,..,300打印华氏温度与摄氏温度对照表 浮点数版本* main() float fahr, celsius int lower, upper, step lower= 0 /*温度表的下限*/ upper=300;/*温度表的上限* step =20; /*步长*/ 第章基本概念 7 下载 fahr lower while (fahr < upper) t celsius=(5.0/9.0)*(fahr-32.0); printf("3.0f 6.lf\n", fahr, celsius) fahr fahr+step冫 这个版本与前一个版本基本相同,只是把fahr与 celsius说明成foat浮点类型,转换公式的表 达也更自然。在前一个版本中,之所以不用5/9是因为按整数除法它们相除截取的结果为0。然而, 在此版本中5.0/9.0是两个浮点数相除,不需要截取。 如果某个算术运算符的运算分量均为整数类型,那么就执行整数运算。然而,如果某个算 术运算符有一个浮点运算分量和—个整数运算分量,那么这个整数运算分量在开始运算之前会 被转换成浮点类型。例如,对于表达式fahr-32,32在运算过程中将被自动转换成浮点数再参与 运算。不过,在写浮点常量时最好还是把它写成带小数点,即使该浮点常量取的是整数值,因 为这样可以强调其浮点性质,便于人们阅读。 第2章将详细介绍把整型数转换成浮点数的规则。现在请注意,赋值语句 fahr lower 与条件测试 while( fahr < upper 也都是以自然的方式执行—在运算之前先把int转换成oat printf中的转换说明%3.0f表明要打印的浮点数(即fahr)至少占3个字符宽,不带小数点与 小数部分。%61俵表示另一个要打印的数( celsius至少有6个字符宽,包括小数点和小数点后1 位数字。输出类似于如下形式 17.8 20 6.7 在格式说明中可以省去宽度(%与小数点之间的数)与精度(小数点与字母f之间的数)。例 如,%6的意思是要打印的数至少有6个字符宽;%2说明要打印的数在小数点后有两位小数 但整个数的宽度不受限制;%的意思仅仅是要打印的数为浮点数。 打印十进制整数 06d 打印十进制整数,至少6个字符宽 打印浮点数 %6f 打印浮点数,至少6个字符宽 %.2f 打印浮点数,小数点后有两位小数 006.2f 打印浮点数,至少6个字符宽,小数点后有两位小数 此外, printf函数还可以识别如下格式说明:表示八进制数的%o、表示十六进制数的%X、表示 字符的%c、表示字符串的%以及表示百分号%本身的%% C程序设计语言 Chinaopu6. coM 下载 练习1-3修改温度转换程序,使之在转换表之上打印一个标题。 练习1-4编写一个用于打印摄氏与华氏温度对照表的程序。 1.3for语句 对于一个特定任务,可以用多种方法来编写程序。下面是前面讲述的温度转换程序的一个 变种 include <stdio. h> /*打印华氏与摄氏温度对照表* main( int fahr for( fahr =0 fahr <=300; fahr fahr 20 printf("83d#号6.1fn",fahr,(5.0/9.0)*(fahr-32)); 这个版本与前一个版本执行的结果相同,但看起来有些不同。一个主要的变化是它删去了大部 分变量,只留下了一个fahr,其类型为int。本来用变量表示的下限、上限与步长都在新引入的 fori语句中作为常量出现,用于求摄氏温度的表达式现在已变成了 printf函数的第3个变元,而不 再是一个独立的赋值语句 这最后一点变化说明了一个通用规则:在所有可以使用某个类型的变量的值的地方,都可 以使用该类型的更复杂的表达式。由于 printi函数的第3个变元必须为与%6.1f匹配的浮点值,则 可以在这里使用任何浮点表达式。 for语句是一种循环语句,是 while语句的推广。如果将其与前面介绍的 while语句比较,就会 发现其操作要更清楚一些。在圆括号內共包含三个部分,它们之间用分号隔开。第一部分 fahr=0 是初始化部分,仅在进入循环前执行一次。第二部分是用于控制循环的条件测试部分 fahr <=300 这个条件要进行求值。如果所求得的值为真,那么就执行循环体(本例循环体中只包含一个 print函数调用语句)。然后再执行第三部分 fahr fahr 20 加步长,并再次对条件求值。一旦求得的条件值为假,那么就终止循环的执行。像 while语句一 样,for循环语句的体可以是单个语句,也可以是用花括号括住的一组语句。初始化部分(第 部分)条件部分(第二部分)与加步长部分(第三部分)均可以是任何表达式。 至于在 while与for这两个循环语句中使用哪一个,这是随意的,主要看使用哪一个更能清楚 地描述问题。for语句比较适合描述这样的循环:初值和增量都是单个语句并且是逻辑相关的 因为for语句把循环控制语句放在一起,比 while语句更紧凑。 Chinapub.com 第章基本概念 9 下载 练习1-5修改温度转换程序,要求以逆序打印温度转换表,即从300度到0度。 1.4符号常量 在结束对温度转换程序的讨论之前,再来看看符号常量。把300、20等“幻数”埋在程序中 并不是—种好的习惯,这些数几乎没有向以后可能要阅读该程序的人提供什么信息,而且使程 序的修改变得困难。处理这种幻数的一种方法是赋予它们有意义的名字。# define指令就用于把 符号名字(或称为符号常量)定义为一特定的字符串 # define名字替换文本 此后,所有在程序中出现的在# define中定义的名字,该名字既没有用引号括起来,也不是 其他名字的一部分,都用所对应的替换文本替换。这里的名字与普通变量名有相同的形式:它 们都是以字母打头的字母或数字序列。替换文本可以是任何字符序列,而不仅限于数。 include <stdio.h> #define LOWER 0 /*表的下限*/ # define UPPER300*表的上限*/ # define STEP20/*步长*/ /*打印华氏-摄氏温度对照表*/ main int fahr for( fahr= lOWeR; fahr < UPPER; fahr fahr STEP printf("03d 96.1f\n", fahr, (5.0/9.0 fahr -32)) LOWER、 UPPER与STEP等几个量是符号常量,而不是变量,故不需要出现在说明中。符号常 量名通常用大写字母拼写,这样就可以很容易与用小写字母拼写的变量名相区别。注意, # define指令行的未尾没有分号 1.5字符输入输出 接下来讨论一些与字符数据处理有关的程序。读者将会发现,许多程序只不过是这里所讨 论的程序原型的扩充版本, 由标准库提供的输入输岀模型非常简单。文本的输入输岀都是作为字符流处理的,不管它 从何处输入、输出到何处。文本流是由一行行字符组成的字符序列,而每一行字符则由0个或多 个字符组成,并后跟一个换行符。标准库有责任使每一输入输岀流符合这一模型,使用标准库 的C程序员不必担心各字符行在程序外面怎么表示。 标准库中有几个函数用于控制一次读写一个字符,其中最简单的是 getcha和 putcha这两个函 数。 getchar函数在被调用时从文本流中读入下一个输入字符并将其作为结果值返回。即,在执行 getchar 之后,变量c中包含了输入流中的下一个字符。这种输入字符通常是从键盘输入的。关于从文件 10c程序设计语言 Chinapub.coM 下载 输入字符的方法将在第7章讨论。 putcher函数在调用时将打印一个字符。例如,函数 putchar(C) 用于把整数变量c的内容作为一个字符打印,它通常是显示在屏幕上。 putchar与 printf这两个函数 可以交替调用,输出的次序即调用的次序。 1.51文件复制 借助 getchar与 putchar函数,可以在不掌握其他输入输出知识的情况下编写出许多有用的代 码。最简单的程序是一次一个字符地把输入复制到输出,其基本思想如下 读一个字符 hile(该字符不是文件结束指示符 输出刚读进的字符 读下一个字符 下面是其C程序 *include <stdio. h> /*用于将输入复制到输出的程序;第1个版本 main() t getchar hil C!= EOF putchar( c getchar( 其中的关系运算符!=的意思是“不等于” 像其他许多东西一样,—个字符不论在键盘或屏幕上以什么形式岀现,在机器内部都是以 位模式存储的。char类型就是专门用于存储这种字符数据的类型,当然仼何整数类型也可以用于 存储字符数据。由于某种微妙却很重要的理由,此处使用了it类型。 需要解决的问题是如何将文件中的有效数据与文件结束标记区分开来。C语言采取的解决方 法是, getchar函数在没有输入时返回一个特殊值,这个特殊值不能与任何实际字符相混淆。这 个值叫做EOF( end of file,文件结束)必须把c说明成一个大到足以存放 getchar函数可能返回 的各种值的类型。之所以不把c说明成char类型,是因为c必须大到除了能存储任何可能的字符外 还要能存储文件结束符EOF。因此,把c说明成int类型的。 EOF是一个在< stdio. h>库中定义的整数,但其具体的数值是什么并不重要,只要知道它与 char类型的所有值都不相同就行了。可以通过使用符号常量来保证EOF在程序中不依赖于特定的 数值。 对于经验比较丰富的C程序员,可以把字符复制程序编写得更精致些。在C语言中,诸如

...展开详情
试读 127P c语言程序设计(第二版)K&R
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
李圣叹 经典的东西,还是值得看的
2015-09-30
回复
jxmemail 经典,非常不错。
2014-10-20
回复
a13243168981 经典的C语言书籍,值得一看!
2014-09-17
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 签到新秀

  • 分享王者

关注 私信
上传资源赚钱or赚积分
最新推荐
c语言程序设计(第二版)K&R 41积分/C币 立即下载
1/127
c语言程序设计(第二版)K&R第1页
c语言程序设计(第二版)K&R第2页
c语言程序设计(第二版)K&R第3页
c语言程序设计(第二版)K&R第4页
c语言程序设计(第二版)K&R第5页
c语言程序设计(第二版)K&R第6页
c语言程序设计(第二版)K&R第7页
c语言程序设计(第二版)K&R第8页
c语言程序设计(第二版)K&R第9页
c语言程序设计(第二版)K&R第10页
c语言程序设计(第二版)K&R第11页
c语言程序设计(第二版)K&R第12页
c语言程序设计(第二版)K&R第13页
c语言程序设计(第二版)K&R第14页
c语言程序设计(第二版)K&R第15页
c语言程序设计(第二版)K&R第16页
c语言程序设计(第二版)K&R第17页
c语言程序设计(第二版)K&R第18页
c语言程序设计(第二版)K&R第19页
c语言程序设计(第二版)K&R第20页

试读结束, 可继续阅读

41积分/C币 立即下载