书名: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 Solutions和Let 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),其中就包含编辑器和编译器。
我们可以使用的IDE有好几种,每种IDE都针对不同的处理器和操作系统组合。下面我们介绍一些流行的IDE。
如果读者想要使用Turbo C/C++,那么可以从Developer Insider社区下载安装文件。
在 Windows 7、Windows 8、Windows 8.1和 Windows 10(32 位或 64 位)中,以全屏模式或窗口模式安装和使用Turbo C/C++的方法是非常简单的。
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的过程中面临的困难。
如果读者想在Linux下使用NetBeans,那么在大多数 Linux系统(如 Ubuntu)中并不需要 Cygwin(这些Linux系统已经预先安装了GCC编译器)。因此,我们只需要下载和安装适用于Linux环境的NetBeans即可。
如果想要使用 Visual Studio Community,那么可以从Visual Studio官网下载安装文件。
读者可以自由地选择上面提到的IDE来编译本书中的程序。笔者倾向于使用NetBeans + Cygwin组合或 Visual Studio Community。所有的IDE都很容易使用,并且都是免费的。
上面提到的每一种IDE的编译和运行过程都稍有不同。因此,下面我们介绍其中每一种IDE的编译和运行步骤。
为了使用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快捷键观察程序的输出。
为了使用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功能键编译和运行程序。
为了使用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快捷键编译和运行这个程序了。这一次不会再出现错误提示,程序能够成功地编译和运行。
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. 下面哪些是非法的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) int
、char
、float
、real
、integer
、character
、char
、main
、printf
和scanf
都是关键字。
答案:错误。
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 ;
}
“定好目标,出发”
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 ;
答案:错误。a
3不是合法的语句,可以改为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 = 3
,
b = 2
,
x = 5
,
y = 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( G2 – G1 ) )
程序:
/* 以海里为单位计算两个地点之间的距离 */
# 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表示风速。编写一个程序,接收t和v的值,并计算风寒因子(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)用户通过键盘把两个数输入内存位置C和D。编写一个程序,交换内存位置C和D的内容。
程序:
/* 交换变量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 ;
}