C语言程序设计 习题解答

978-7-115-58716-9
作者: [印] 亚沙万特·卡内特卡尔(Yashavant Kanetkar)
译者: 徐波
编辑: 郭媛
分类: C语言

图书目录:

详情

多年来,经典教材《C 语言程序设计》被很多工程和科学研究所及院校指定为学习教材。本书是《C 语言程序设计》的配套习题集,旨在让读者学习基础知识的同时,交叉地检查所做习题的正确性,从而增强读者的信心,改善整个C 语言学习的过程。本书的习题已经过作者认真挑选,集中体现了各个知识要点的具体用法。 本书习题丰富,结构合理,内容深入浅出,建议搭配《C 语言程序设计》使用,非常适合用作高等学校本科生和专科生学习C 语言程序设计的练习手册,也适合用作零基础的程序设计初学者的自学用书。

图书摘要

版权信息

书名:C语言程序设计 习题解答

ISBN:978-7-115-58716-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [印] 亚沙万特·卡内特卡尔(Yashavant Kanetkar)

译    徐 波

责任编辑 郭 媛

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

版权声明

Copyright ©2020 BPB Publications India. All rights reserved.

First published in the English language under the title “Let Us C Solutions” by Yashavant Kanetkar BPB Publications India. (sales@bpbonline.com)

Chinese translation rights arranged with BPB Publications India through Media Solutions, Tokyo, Japan.

本书中文简体版由BPB Publications India授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式或任何手段复制或抄袭本书内容。

版权所有,侵权必究。


内容提要

多年来,《C语言程序设计》被很多工程和科学研究所及院校指定为学习教材。本书是《C语言程序设计》的配套习题集,旨在让读者学习基础知识的同时,交叉地检查所做习题的正确性,从而增强读者的信心,改善整个C语言的学习过程。本书的习题已经过作者认真挑选,集中体现了各个知识要点的具体用法。

本书习题丰富,结构合理,内容深入浅出,建议搭配《C语言程序设计》使用,非常适合用作高等学校本科生和专科生学习C语言程序设计的练习手册,也适合用作零基础的程序设计初学者的自学用书。

作者简介

通过出版著作以及开发关于C、C++、数据结构、VC++(Visual C++的简写)、.NET和嵌入式系统的在线“探索”视频课程,Yashavant Kanetkar使自己过去25年的IT生涯越发光彩夺目。Yashavant的著作和在线课程在为印度乃至全世界培养IT科技人才方面做出了不小的贡献。

Yashavant的著作在全世界范围内受到欢迎,数以百万计的学生和专业人员从中受益。他的著作被翻译为印地语、古吉拉特语、英语、日语、韩语和汉语,分别在印度、美国、日本、韩国和中国出版。

Yashavant是一位极受欢迎的IT领域演说家,在TedEx、印度理工学院(IIT)、印度国家理工学院(NIT)、印度信息技术学院(IIIT)和一些全球软件公司举办过研讨会和讲习班。

Yashavant由于在创业、专业以及教育方面的优异成就,被印度理工学院坎普尔校区授予久负盛名的“杰出校友奖”(distinguished alumnus award)。这个奖已被授予50位最优秀的印度理工学院坎普尔校区的校友,在过去50年里,这些人在自己的专业以及社会改良方面做出了杰出贡献。

由于对印度IT教育做出了杰出贡献,Yashavant连续5年被微软公司授予“最佳.NET技术撰稿人”(best .NET technical contributor)和“最有价值专家”(Most Valuable Professional,MVP)称号。

Yashavant拥有VJTI Mumbai(位于孟买的一所理工学院)的工学学士学位,并拥有印度理工学院坎普尔校区的工学硕士学位。他当前是Kanetkar ICIT Pvt. Ltd实验室的主任。读者也可以通过kanetkar@kicit.com与他进行交流。

前   言

当《C语言程序设计》 (Let Us C)第3版问世时,读者对类似《C语言程序设计 习题解答》(Let Us C Solutions)这种图书的需求便开始出现。对此,我的回应就是撰写本书。后来,我遇到许多读者,根据他们的反馈,Let Us C的每个新版本都应该有配套的两本书—新版本的Let Us C SolutionsLet Us C Workbook。我决定迎合上述需求,从第5版开始同时出版这3本书。

本书之前版本的成功验证了我的想法,如果读者能够检查自己所做习题解答和程序的正确性,这将显著增强他们的信心,并提升他们整体的学习体验。

在本书所有版本的出版过程中,BPB出版社的Manish Jain自始至终为我提供帮助。不管我有什么请求,他总是积极地做出回应。

Amol Tambat、Ajay Daga、Prachi Garaye、Amit Mendhe、Vikrant Sahoo、Shoeb Parvez、 Monali Nikhare和Devshree Satpute对检查本书几个版本的答案做出了不小的贡献。非常感谢他们!我对Let Us C第17版的习题进行了重新组织和优化,这些习题的答案都包含在Let Us C Solutions的这一版本中。

Yashavant Kanetkar

致   谢

本书已经成为我生命中重要的一部分。在过去的20年里,我创作了本书并不断地对它进行完善。在这个过程中,除了赞美之外,我收到很多来自学生、开发人员、教授、出版人和作者的建议。从本书第1版撰稿到第17版出版,他们给我提供了太多的帮助,我恨不得把他们的名字都印在本书的封面上。

我需要特别感谢Manish Jain,他对本书的写作思路充满信心,信任我的写作能力,不断地给我鼓励并不时地向我提供有益的建议。我祝愿每位作家都能拥有一位像Manish这样富有协作精神、知识渊博且不遗余力地提供支持的出版人。

在本书之前的版本中,逐步的修改和完善一直没有停止。在这个过程中,许多人在运行程序和寻找漏洞方面提供了很大的帮助。我相信在集合了他们的智慧之后,本书所有的程序都能够正确地运行。如果书中仍然有错误、疏忽或不一致的情况,那肯定是我自己的责任。

感谢家人的耐心和包容,在本书马拉松式的编写过程中他们忍受我每天工作到深夜,忍受键盘的敲击声及其他烦扰。考虑书的封面思路是一回事,把它落到实处又是另一回事。本书(英文原版)封面的设计是由Vinay Indoria完成的,衷心地向他表示感谢!

最后,我衷心地感谢让我观察到C语言的每一处角落的无数学生,正是因为他们,本书才能够以多种语言在印度、美国、日本、韩国和中国出版。

资源与支持

本书由异步社区出品,异步社区(https://www.epubit.com/)为您提供相关资源和后续服务。

配套资源

本书提供如下资源:

源代码(同《C语言程序设计》源代码)。

要获得以上资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。

提交勘误信息

作者、译者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,再单击“提交”按钮即可(见下图)。本书的作者、译者和编辑会对您提交的勘误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

扫码关注本书

扫描右侧的二维码,您将会在异步社区微信服务号中看到本书信息及相关的服务提示。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/contribute即可)。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近40年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号

预备知识

“工具为我们提供了便利”

为了更好地理解C语言并在使用时充满信心,我们需要输入本书中的程序并让计算机运行它们。为了输入程序,我们需要一种被称为“编辑器”的工具。程序输入之后,还需要转换为机器语言代码(由 0和1组成),这样计算机才能运行。为了实现这种转换,我们还需要另一种被称为“编译器”的工具。编译器厂商为此提供了集成开发环境(Integrated Development Environment,IDE),其中就包含编辑器和编译器。

1. IDE

我们可以使用的IDE有好几种,每种IDE都针对不同的处理器和操作系统组合。下面我们介绍一些流行的IDE。

1)Windows下的Turbo C/C++

如果读者想要使用Turbo C/C++,那么可以从Developer Insider社区下载安装文件。

在 Windows 7、Windows 8、Windows 8.1和 Windows 10(32 位或 64 位)中,以全屏模式或窗口模式安装和使用Turbo C/C++的方法是非常简单的。

2)Windows下的NetBeans

NetBeans并不是编译器,而仅仅是一种IDE。NetBeans的 Windows版本可从Apache NetBeans官网下载。

为了在Windows下使用NetBeans开发C语言程序,我们需要安装Cygwin。Cygwin附带了GCC编译器。Cygwin的安装文件可从Cygwin官网下载。

Apache NetBeans官网上的Download栏目和wikiHow网站上的文章“How to Run C/ C++ Program in NetBeans on Windows”提供了优秀的教程,它们可以帮助我们克服在安装Cygwin 和 NetDeans的过程中面临的困难。

3)Linux下的NetBeans

如果读者想在Linux下使用NetBeans,那么在大多数 Linux系统(如 Ubuntu)中并不需要 Cygwin(这些Linux系统已经预先安装了GCC编译器)。因此,我们只需要下载和安装适用于Linux环境的NetBeans即可。

4)Windows下的Visual Studio Community

如果想要使用 Visual Studio Community,那么可以从Visual Studio官网下载安装文件。

读者可以自由地选择上面提到的IDE来编译本书中的程序。笔者倾向于使用NetBeans + Cygwin组合或 Visual Studio Community。所有的IDE都很容易使用,并且都是免费的。

2. 编译和运行步骤

上面提到的每一种IDE的编译和运行过程都稍有不同。因此,下面我们介绍其中每一种IDE的编译和运行步骤。

1)使用Turbo C++编译和运行程序的步骤

为了使用Turbo C++编译和运行程序,我们需要执行下列步骤。

(1)从Start(开始)菜单中选择All Programs(所有程序)| Turbo C++以启动Turbo C++。

(2)在弹出的对话框中单击“Start Turbo C++(启动Turbo C++)”。

(3)从菜单栏中选择File | New(文件 | 新建)。

(4)输入程序。

(5)按F2功能键,使用一个适当的名称(如Program1.c)保存程序。

(6)按Ctrl + F9快捷键编译和运行程序。

(7)按Alt + F5快捷键观察程序的输出。

2)使用NetBeans编译和运行程序的步骤

为了使用NetBeans编译和运行程序,我们需要执行下列步骤。

(1)从Start(开始)菜单中选择All Programs(所有程序)| NetBeans以启动NetBeans。

(2)从菜单栏中选择File | New Project(文件 | 新建项目),在弹出的对话框中把Project Category(项目分类)选择为C++,把Project Type(项目类型)选择为C/C++ Application(C/C++应用程序),单击Next(下一步)按钮。

(3)在Project Name(项目名称)文本框中输入适当的项目名称(如Program1),单击Finish(完成)按钮。

(4)输入程序。

(5)按Ctrl + S快捷键保存程序。

(6)按F6功能键编译和运行程序。

3)使用Visual Studio Community编译和运行程序的步骤

为了使用Visual Studio Community编译和运行程序,我们需要执行下列步骤。

(1)从Start(开始)菜单中选择 All Programs(所有程序) | Microsoft Visual C++ Community以启动Visual Studio Community。

(2)从菜单栏中选择File | New Project(新建项目),在弹出的对话框中选择Project Type (项目类型)为Visual C++ | Win32 Console Application (控制台应用程序),在Name(名称)文本框中输入适当的文件名称(如Program1),单击OK(确定)按钮和Finish(完成)按钮。

(3)输入程序。

(4)按Ctrl + S快捷键保存程序。

(5)按Ctrl + F5快捷键编译和运行程序。

当我们使用Visual Studio Community创建一个Win32控制台应用程序时,应用程序向导在默认情况下会插入下列代码。

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[ ])
{
      return 0;
}

我们可以删除这些代码,并在原地输入自己的程序。不过,如果现在使用Ctrl+F5快捷键编译和运行程序,我们将得到下面的错误提示。

Fatal error C1010:
unexpected end of file while looking for precompiled header.

产生错误的原因是我们在源代码中忘了添加#include "stdafx.h"这条指令。

在程序的顶部添加#include "stdafx.h"这条指令后,程序就可以成功地编译和运行了。但是,添加这个头文件会使程序以Visual Studio为中心,导致无法用其他编译器编译。这不是件好事,因为程序将不再具有可移植性。

为了消除这种错误,我们需要在Visual Studio中进行一项设置,这项设置可通过执行下列步骤来完成。

(1)进入“Solution Explorer(解决方案资源管理器)”。

(2)右击项目名称,从弹出的菜单中选择“Properties(属性)”,这时会出现一个名为“Property Pages(属性页)”的对话框。

(3)在这个对话框的左窗格中,先选择“Configuration Properties(配置属性)”,再选择“C/C++”。

(4)选择“Precompiled Headers(预编译的头文件)”。

(5)在这个对话框的右窗格中,单击“Create/Use Precompiled Header(创建/使用预编译的头文件)”选项,此时这个选项的值中会出现一个三角形。

(6)单击这个三角形,将会出现一个下拉列表。

(7)从这个下拉列表中选择“Not using Precompiled Header(不使用预编译的头文件)”。

(8)单击“OK(确定)”按钮,使以上设置生效。

默认情况下,Visual Studio认为我们的程序是C++程序而不是C程序。因此,我们还需要通过进行另一项设置来告诉它我们的程序是C程序而不是C++程序,这项设置可通过执行下列步骤来完成。

(1)进入“Solution Explorer(解决方案资源管理器)”。

(2)右击项目名称,从弹出的菜单中选择“Properties(属性)”,打开 “Property Pages(属性页)”对话框。

(3)在这个对话框的左窗格中,先选择“Configuration Properties(配置属性)”,再选择“C/C++”。

(4)选择“Advanced(高级)”。

(5)把“Compile As(编译为)”选项设置为“Compile as C code (/TC)[编译为C代码(/TC)]”。

进行完以上设置后,我们就可以使用Ctrl+F5快捷键编译和运行这个程序了。这一次不会再出现错误提示,程序能够成功地编译和运行。

4)使用Linux命令行编译和运行程序的步骤

C程序甚至可以通过命令行编译和运行,也就是不使用任何IDE。许多程序员倾向于采用这种模式。在这种模式下,我们需要使用编辑器输入程序,然后使用编译器对程序进行编译。例如,如果想在Linux命令行窗口中编译和运行程序,那么我们可以使用像vi或Vim这样的编辑器以及像GCC这样的编译器。在这种情况下,我们需要执行下列步骤以编译和运行自己的程序。

(1)输入程序并使用一个适当的文件名(如hello.c)保存程序。

(2)在Linux命令行窗口中使用cd命令切换到包含hello.c文件的目录。

(3)像下面这样使用GCC编译器编译这个程序。

$ gcc hello.c

(4)在成功编译这个程序之后,GCC会生成a.out文件,这个文件中包含了程序的机器语言代码,可以直接执行。

(5)使用下面的命令运行程序。

$ ./a.out

第1章 起步

“良好的开端是成功的一半”

1. 下面哪些是非法的C语言常量?为什么?

'3.15'         非法。字符常量只能包含1个字符。
35,550         非法。整型常量不能包含逗号。
3.25e2         合法。
2e-3           合法。
'eLearning'     非法。字符常量只能包含1个字符。
"show"         非法。字符常量只能包含1个字符。
'Quest'        非法。字符常量只能包含1个字符。
23             非法。数值无法用这种形式来表示。
4 6 5 2        非法。常量内部不能出现空白。

2. 下面哪些是非法的变量名?为什么?

B'day         非法。变量名中不允许出现“'”。
int           非法。关键字不能作为变量名使用。
$hello        非法。变量名必须以字母或下画线开头。
#HASH         非法。变量名必须以字母或下画线开头。
dot.          非法。变量名中不允许出现“.”。
number        合法。
totalArea     合法。
_main         合法。
temp_in_Deg    合法。
total%         非法。变量名中不允许出现“%”。
1st            非法。变量名必须以字母或下画线开头。
stack-queue     非法。变量名中不允许出现连字符。
variable name   非法。变量名中不允许出现空白。
%name%         非法。变量名必须以字母或下画线开头。
salary         合法。

3. 判断下列说法是正确的还是错误的。

(1)C语言是由Dennis Ritchie开发的。

答案:正确。

(2)像Windows、UNIX、Linux和Android这样的操作系统都是用C语言编写的。

答案:正确。

(3)C语言程序可以很方便地与PC或笔记本电脑的硬件进行交互。

答案:正确。

(4)C语言程序的浮点型常量既可以用小数形式也可以用指数形式表示。

答案:正确。

(5)一个字符变量在任意时刻只能存储1个字符。

答案:正确。

(6)整型常量的最大值因编译器而异。

答案:正确。

(7)通常所有的C语句都是用小写形式书写的。

答案:正确。

(8)C语言中的两个单词之间可以插入空白字符。

答案:正确。

(9)变量名的内部不能插入空白字符。

答案:正确。

(10)C程序可以在编辑器的帮助下转换为机器语言代码。

答案:错误。

(11)大多数开发环境提供了编辑器供用户输入C程序,并提供了编译器来把C程序转换为机器语言代码。

答案:正确。

(12) intcharfloatrealintegercharactercharmainprintfscanf都是关键字。

答案:错误。

4. 对下面的左右两列进行配对。

(a) \n        ④ 转义序列

(b) 3.145      ⑫ 浮点型常量

(c) -6513     ⑦ 整型常量

(d) 'D'       ③ 字符型常量

(e) 4.25e-3     ⑪ 指数形式

(f) main( )     ⑥ 函数

(g) %f%d%c    ⑩ 格式指示符

(h) ;        ② 语句结束符

(i) 常量       ① 文字值

(j) 变量       ⑬ 标识符

(k) &        ⑧ 取址操作符

(l) printf( )    ⑨ 输出函数

(m) scanf( )    ⑤ 输入函数

5. 指出下列程序中可能存在的错误。

(1)int main( )
      {
          int a ; float b ; int c ;
          a = 25 ; b = 3.24 ; c = a + b * b – 35 ;
      }

答案:没有错误。多条C语句可以写在同一行中。

(2)#include <stdio.h>
      int main( )
      {
          int a = 35 ; float b = 3.24 ;
          printf( "%d %f %d", a, b + 1.5, 235 ) ;
      }

答案:没有错误。printf()函数输出的列表中可以包含变量、常量或表达式。

(3)#include <stdio.h>
      int main( )
      {
          int a, b, c ;
          scanf( "%d %d %d", a, b, c ) ;
      }

答案:存在错误。在scanf()函数中,每个变量的前面应该使用&

(4)#include <stdio.h>
      int main( )
      {
          int m1, m2, m3
          printf( "Enter values of marks in 3 subjects" )
          scanf( "%d %d %d", &m1, &m2, &m3 )
          printf( "You entered %d %d %d", m1, m2, m3 )
      }

答案:存在错误。类型声明、printf()scanf()语句的后面应该有分号。

6. 完成下列任务。

(1)假设用户通过键盘输入一个以华氏温度表示的气温。编写一个程序,把这个华氏温度转换为摄氏温度。

程序:

/* 把华氏温度转换为摄氏温度 */
# include <stdio.h>
int main( )
{
    float fr, cent ;
    printf( "\nEnter the temperature(F): " ) ;
    scanf( "%f", &fr ) ;
    cent = 5.0 / 9.0 *( fr - 32 ) ;
    printf( "Temperature in centigrade = %f\n", cent ) ;
    return 0 ;
}

(2)假设矩形的长度和宽度以及圆的半径都是通过键盘输入的。编写一个程序,计算矩形的面积和周长以及圆的面积和周长。

程序:

/* 计算矩形的面积和周长以及圆的面积和周长*/
# include <stdio.h>
int main( )
{
    int l, b, r, area1, perimeter ;
    float area2, circum ;
    printf( "\nEnter Length & Breadth of Rectangle: " ) ;
    scanf( "%d %d", &l, &b ) ;
    area1 = l * b ;                             /* 矩形的面积 */
    perimeter = 2 * l + 2 * b ;                 /* 矩形的周长 */
    printf( "Area of Rectangle = %d\n", area1 ) ;
    printf( "Perimeter of Rectangle = %d\n", perimeter) ;
    printf( "\n\nEnter Radius of circle: " ) ;
    scanf( "%d", &r ) ;
    area2 = 3.14 * r * r ;                      /* 圆的面积 */
    circum = 2 * 3.14 * r ;                     /* 圆的周长 */
    printf( "Area of Circle = %f\n", area2 ) ;
    printf( "Circumference of Circle = %f\n", circum ) ;
    return 0 ;
}

(3)A0纸的大小是1189mm×841mm,后续每种纸A(n)的大小就是把前一种纸A(n – 1)的长边对半截开。因此,A1纸的大小是841mm×594mm。编写一个程序,计算并输出A0、A1、A2……A8纸的大小。

程序:

/* 计算 A0、A1、A2……A8纸的大小 */
# include <stdio.h>
int main( )
{
    int a0ht, a0wd ;
    int a1ht, a1wd, a2ht, a2wd, a3ht, a3wd, a4ht, a4wd ;
    int a5ht, a5wd, a6ht, a6wd, a7ht, a7wd, a8ht, a8wd ;
    a0ht = 1189 ; a0wd = 841 ;
    printf( "Size of A0 paper Ht = %d Width = %d\n", a0ht, a0wd ) ;
    a1ht = a0wd ; a1wd = a0ht / 2 ;
    printf( "Size of A1 paper Ht = %d Width = %d\n", a1ht, a1wd ) ;
    a2ht = a1wd ; a2wd = a1ht / 2 ;
    printf( "Size of A2 paper Ht = %d Width = %d\n", a2ht, a2wd ) ;
    a3ht = a2wd ; a3wd = a2ht / 2 ;
    printf( "Size of A3 paper Ht = %d Width = %d\n", a3ht, a3wd ) ;
    a4ht = a3wd ; a4wd = a3ht / 2 ;
    printf( "Size of A4 paper Ht = %d Width = %d\n", a4ht, a4wd ) ;
    a5ht = a4wd ; a5wd = a4ht / 2 ;
    printf( "Size of A5 paper Ht = %d Width = %d\n", a5ht, a5wd ) ;
    a6ht = a5wd ; a6wd = a5ht / 2 ;
    printf( "Size of A6 paper Ht = %d Width = %d\n", a6ht, a6wd ) ;
    a7ht = a6wd ; a7wd = a6ht / 2 ;
    printf( "Size of A7 paper Ht = %d Width = %d\n", a7ht, a7wd ) ;
    a8ht = a7wd ; a8wd = a7ht / 2 ;
    printf( "Size of A8 paper Ht = %d Width = %d\n", a8ht, a8wd ) ;
    return 0 ;
}

第2章 C语言的指令

“定好目标,出发”

1. 指出下列C语句中可能存在的错误。

(1)x =( y + 3 ) ;

答案:没有错误。

(2)cir = 2 * 3.141593 * r ;

答案:没有错误。

(3)char = '3' ;

答案:错误。关键字不能作为变量名使用。

(4)4 / 3 * 3.14 * r * r * r = vol_of_sphere ;

答案:错误。等号的左边只能出现一个变量。

(5)volume = a3 ;

答案:错误。a3不是合法的语句,可以改为a * a * a

(6)area = 1 / 2 * base * height ;

答案:没有错误。

(7)si = p * r * n / 100 ;

答案:没有错误。

(8)area of circle = 3.14 * r * r ;

答案:错误。area of circle不是合法的变量名。

(9)peri_of_tri = a + b + c ;

答案:没有错误。

(10)slope =( y2 - y1 ) ÷( x2 - x1 ) ;

答案:错误。÷不是合法的操作符。

(11)3 = b = 4 = a ;

答案:错误。=操作符的左边必须是变量。

(12)count = count + 1 ;       

答案:没有错误。

(13)char ch = '25 Apr 12' ;

答案:错误。一个字符变量不能存储多个字符。

2. 对下列表达式进行求值,并说明它们的优先层次。

(1)ans = 5 * b * b * x - 3 * a * y * y - 8 * b * b * x + 10 * a * y ;
      (a = 3b = 2x = 5y = 4,假设ans为int类型)

答案:

ans = 5 * 2 * 2 * 5 - 3 * 3 * 4 * 4 - 8 * 2 * 2 * 5 + 10 * 3 *4  操作: *
ans = 10 * 2 * 5 - 3 * 3 * 4 * 4 - 8 * 2 * 2 * 5 + 10 * 3 * 4    操作: *
ans = 20 * 5 - 3 * 3 * 4 * 4 - 8 * 2 * 2 * 5 + 10 * 3 * 4        操作: *
ans = 100 - 3 * 3 * 4 * 4 - 8 * 2 * 2 * 5 + 10 * 3 * 4           操作: *
ans = 100 - 9 * 4 * 4 - 8 * 2 * 2 * 5 + 10 * 3 * 4               操作: *
ans = 100 - 36 * 4 - 8 * 2 * 2 * 5 + 10 * 3 * 4                  操作: *
ans = 100 - 144 - 8 * 2 * 2 * 5 + 10 * 3 * 4                     操作: *
ans = 100 - 144 - 16 * 2 * 5 + 10 * 3 * 4                        操作: *
ans = 100 - 144 - 32 * 5 + 10 * 3 * 4                            操作: *
ans = 100 - 144 - 160 + 10 * 3 * 4                               操作: *
ans = 100 - 144 - 160 + 30 * 4                                   操作: *
ans = 100 - 144 - 160 + 120                                      操作: -
ans = -44 - 160 + 120                                            操作: -
ans = -204 + 120                                                 操作: +
ans = -84
(2)res = 4 * a * y / c - a * y / c ;
      (a = 4,y = 1,c = 3,假设res是int类型)

答案:

res = 4 * 4 * 1 / 3 - 4 * 1 / 3                                  操作: *
res = 16 * 1 / 3 - 4 * 1 / 3                                     操作: *
res = 16 / 3 - 4 * 1 / 3                                         操作: /
res = 5 - 4 * 1 / 3                                              操作: *
res = 5 - 4 / 3                                                  操作: /
res = 5 – 1                                                      操作: -
res = 4
(3)s = c + a * y * y / b ;
      (a = 2.2,b = 0.0,c = 4.1,y = 3.0,假设s是float类型)

答案:

s = 4.1 + 2.2 * 3.0 * 3.0 / 0.0                                  操作: *
s = 4.1 + 6.6 * 3.0 / 0.0                                        操作: *
s = 4.1 + 19.8 / 0.0                                             操作: /
无法执行除零操作。
(4)R = x * x + 2 * x + 1 / 2 * x * x + x + 1 ;
      (x = 3.5,假设R是float类型)

答案:

R = 3.5 * 3.5 + 2 * 3.5 + 1 / 2 * 3.5 * 3.5 + 3.5 + 1            操作: *
R = 12.25 + 2 * 3.5 + 1 / 2 * 3.5 * 3.5 + 3.5 + 1                操作: *
R = 12.25 + 7.0 + 1 / 2 * 3.5 * 3.5 + 3.5 + 1                    操作: *
R = 12.25 + 7.0 + 1 / 7.0 * 3.5 + 3.5 + 1                        操作: *
R = 12.25 + 7.0 + 1 / 24.5 + 3.5 + 1                             操作: /
R = 12.25 + 7.0 + 0.04081 + 3.5 + 1                              操作: +
R = 19.25 + 0.04081 + 3.5 + 1                                    操作: +
R = 19.29081 + 3.5 + 1                                           操作: +
R = 22.79081 + 1                                                 操作: +
R = 23.79081 

3. 说明下列表达式的求值顺序。

(1)g = 10 / 5 /2 / 1 ;

求值顺序是:

g = 10 / 5 / 2 / 1 ;                                             操作: /
g = 2 / 2 / 1 ;                                                  操作: /
g = 1 / 1 ;                                                      操作: /
g = 1 ;                                                          操作: =
(2)b = 3 / 2 + 5 * 4 / 3 ;

求值顺序是:

b = 3 / 2 + 5 * 4 / 3                                            操作: /
b = 1 + 5 * 4 / 3                                                操作: *
b = 1 + 20 / 3                                                   操作: /
b = 1 + 6                                                        操作: +
b = 7                                                            操作: =
(3)a = b = c = 3 + 4 ;

求值顺序是:

a = b = c = 3 + 4                                                操作: +
a = b = c = 7                                                    操作: =
a = b = 7                                                        操作: =
a = 7                                                            操作: =
(4)x = 2 - 3 + 5 * 2 / 8 % 3 ;

求值顺序是:

x = 2 - 3 + 5 * 2 / 8 % 3                                        操作: *
x = 2 - 3 + 10 / 8 % 3                                           操作: /
x = 2 - 3 + 1 % 3                                                操作: %
x = 2 - 3 + 1                                                    操作: -
x = -1 + 1                                                       操作: +
x = 0                                                            操作: = 
(5)z = 5 % 3 / 8 * 3 + 4 ;

求值顺序是:

z = 5 % 3 / 8 * 3 + 4                                            操作: %
z = 2 / 8 * 3 + 4                                                操作: /
z = 0 * 3 + 4                                                    操作: *
z = 0 + 4                                                        操作: +
z = 4                                                            操作: =
(6)y = z = -3 % 2 – 8 / 2 + 7 ;

求值顺序是:

y = z = -3 % -8 / 2 + 7                                          操作: -
y = z = -3 % -8 / 2 + 7                                          操作: -
y = z = -3 % -8 / 2 + 7                                          操作: %
y = z = -3 / 2 + 7                                               操作: /
y = z = -1 + 7                                                   操作: +
y = z = 6                                                        操作: =
y = 6                                                            操作: =

4. 下列程序的输出是什么?

(1)# include <stdio.h>
      int main( )
      {
          int  i = 2, j = 3, k, l ; float   a, b ;
          k = i / j * j ; 
          l = j / i * i ; 
          a = i / j * j ; 
          b = j / i * i ;
          printf( "%d %d %f %f\n", k, l, a, b ) ; 
          return 0 ;
      }

输出:

0 2 0.000000 2.000000
(2)# include <stdio.h>
      int main( )
      {
          int  a, b, c, d ; 
          a = 2 % 5 ; 
          b = -2 % 5 ; 
          c = 2 % -5 ; 
          d = -2 % -5 ;
          printf( "a = %d b = %d c = %d d = %d\n", a, b, c, d ) ; 
          return 0 ;
      }

输出:

a = 2 b = -2 c = 2 d = -2
(3)# include <stdio.h>
      int main( )
      {
          float a = 5,  b = 2 ; 
          int c, d ;
          c = a % b ;
          d = a / 2 ;
          printf( "%d\n", d ) ; 
          return 0 ;
      }

输出:

Error. Mod( % ) operator cannot be used on floats

以上错误表示求模操作符(%)不能用于浮点类型。

(4)# include <stdio.h>
      int main( )
      {
          printf( "nn \n\n nn\n" ) ; 
          printf( "nn /n/n nn/n" ) ; 
          return 0 ;
      }

输出:

nn
 nn
nn /n/n nn/n
(5)# include <stdio.h>
      int main( )
      {
          int a, b ;
          printf( "Enter values of a and b" ) ; 
          scanf( "  %d %d  ", &a, &b ) ; 
          printf( "a  = %d b = %d", a, b ) ; 
          return 0 ;
      }

输出:

由于scanf()函数中双引号的前后分别有一个空格,因此我们在输入时必须首先输入一个空格,然后输入两个数,接下来再输入一个空格,最后按Enter键。printf()函数将按照输入的样子输出这两个数。

5. 下列说法是正确的还是错误的?

(1)*或/、+是C语言中算术操作符的正确优先层次。

答案:正确。

(2)[]{}可以在算术指令中使用。

答案:错误。

(3)优先层次决定了哪个操作符最先被使用。

答案:正确。

(4)在C语言中,算术指令在=的左边不能包含常量。

答案:正确。

(5)在C语言中,**操作符用于指数运算。

答案:错误。

(6)%操作符不能作用于浮点数。

答案:正确。

6. 填空。

(1)在y = 10 * x / 2 + z ;这条语句中,10 * x操作是最先执行的。

(2)如果a是一个整型变量,a = 11 / 2 ;这条语句将把5存储在a中。

(3)表达式a = 22 / 7 * 5 / 3的结果是5。

(4)表达式x = -7 % 2 – 8的结果是–9。

(5)如果d是一个float变量,d = 2 / 7.0这个操作将把0.285714存储在d中。

7. 完成下列任务。

(1)假设用户通过键盘输入一个5位数,编写一个程序,计算它的各位数字之和。(提示:使用求模操作符%

程序:

/* 计算一个5位数的各位数字之和 */
# include <stdio.h>
int main( )
{
    int num, a, n ;
    int sum = 0 ;
    printf( "\nEnter a 5 digit number(less than 32767): " ) ;
    scanf( "%d", &num ) ;
    a = num % 10 ;       /* 用余数提取第5位数字 */
    n = num / 10 ;       /* 剩余数字 */
    sum = sum + a ;      /* 在加上提取的数字之后,对和进行更新 */
    a = n % 10 ;        /* 第4位数字 */
    n = n / 10 ;
    sum = sum + a ;
    a = n % 10 ;        /* 第3位数字 */
    n = n / 10 ;
    sum = sum + a ;
    a = n % 10 ;        /* 第2位数字 */
    n = n / 10 ;
    sum = sum + a ;
    a = n % 10 ;        /* 第1位数字 */
    sum = sum + a ;
    printf( "Sum of 5 digits of %d is %d\n", num, sum ) ;
    return 0 ;
}

(2)编写一个程序,接收一个点的笛卡儿坐标(x, y),并把它们转换为极坐标(r, θ)。(提示:r = sqrt( x2 + y2 ),θ= arctan( y / x ))

程序:

/* 把笛卡儿坐标转换为极坐标 */
# include <stdio.h>
# include <math.h>
int main( )
{
    float x, y, r, theta ;
    printf( "\nEnter x and y co-ordinates: " ) ;
    scanf( "%f %f", &x, &y ) ;
    r = sqrt( x * x + y * y ) ;
    theta = atan2( y, x ) ;
    theta = theta * 180 / 3.14 ; /* 转换为角度 */
    printf( "r = %f theta = %f\n", r, theta ) ;
    return 0 ;
}

(3)编写一个程序,接收地球上两个地点的纬度(L1, L2)和经度(G1, G2) (用度数表示),并输出这两个地点之间的距离(D,以海里[1]为单位)。以海里表示的距离公式如下。

[1] 1海里≈1852米。

D = 3963 arccos( sin L1 sin L2 + cos L1 cos L2 cos( G2G1 ) )

程序:

/* 以海里为单位计算两个地点之间的距离 */
# include <stdio.h>
# include <math.h>
int main( )
{
    float lat1, lat2, lon1, lon2, d ;
    printf( "\nEnter Latitude and Longitude of Place 1: " ) ;
    scanf( "%f %f", &lat1, &lon1 ) ;
    printf( "Enter Latitude and Longitude of Place 2: " ) ;
    scanf( "%f %f", &lat2, &lon2 ) ;
    lat1 = lat1 * 3.14 / 180 ;
    lat2 = lat2 * 3.14 / 180 ;
    lon1 = lon1 * 3.14 / 180 ;
    lon2 = lon2 * 3.14 / 180 ;
    d = 3963 * acos( sin( lat1 ) * sin( lat2 ) + cos( lat1 ) * cos( lat2 )
        * cos( lon2 - lon1 ) ) ;
    printf( "Distance between Place1 and Place 2: %f\n", d ) ;
    return 0 ;
}

(4)风寒因子是暴露在空气中的皮肤在受到风的影响后测得的温度。风寒温度总是低于空气温度,风寒因子可通过下面这个公式来计算。

wcf = 35.74 + 0.6215t +( 0.4275t - 35.75 ) v0.16

其中,t表示空气温度,v表示风速。编写一个程序,接收tv的值,并计算风寒因子(wcf)。

程序:

/*计算风寒因子 */
# include <stdio.h>
# include <math.h>
int main( )
{
    float temp, vel, wcf ;
    printf( "\nEnter values of temp and velocity: " ) ;
    scanf( "%f %f", &temp, &vel ) ;
    wcf = 35.74 + 0.6215 * temp +( 0.4275 * temp - 35.75 )
            * pow( vel, 0.16f ) ;
    printf( "Wind Chill Factor = %f\n", wcf ) ;
    return 0 ;
}

(5)假设用户通过键盘输入一个角度的值,编写一个程序,输出它的所有三角比。

程序:

/* 输出一个角度的所有三角比 */
# include <stdio.h>
# include <math.h>
int main( )
{
    float angle, s, c, t ;
    printf( "\nEnter an angle: " ) ;
    scanf( "%f", &angle ) ;
    /* 把角度转换为弧度 */
    angle = angle * 3.14 / 180 ;
    s = sin( angle ) ;
    c = cos( angle ) ;
    t = tan( angle ) ;
    printf( "sin = %f cos = %f tan = %f\n", s, c, t ) ;
    return 0 ;
}

(6)用户通过键盘把两个数输入内存位置CD。编写一个程序,交换内存位置CD的内容。

程序:

/* 交换变量c和d的内容 */
# include <stdio.h>
int main( )
{
    int c, d, e ;
    printf( "\nEnter the number at location C: " ) ;
    scanf( "%d", &c ) ;
    printf( "\nEnter the number at location D: " ) ;
    scanf( "%d", &d ) ;
    e = c ;
    c = d ;
    d = e ;
    printf( "New Number at location C = %d\n", c ) ;
    printf( "New Number at location D = %d\n", d ) ;
    return 0 ;
}

相关图书

代码审计——C/C++实践
代码审计——C/C++实践
C/C++代码调试的艺术(第2版)
C/C++代码调试的艺术(第2版)
大规模C++软件开发 卷1:过程与架构
大规模C++软件开发 卷1:过程与架构
C/C++程序设计竞赛真题实战特训教程(图解版)
C/C++程序设计竞赛真题实战特训教程(图解版)
C/C++函数与算法速查宝典
C/C++函数与算法速查宝典
C程序设计教程(第9版)
C程序设计教程(第9版)

相关文章

相关课程