书名:【抢鲜版】-C++少儿编程轻松学
ISBN:978-7-115-53200-8
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 左凤鸣
责任编辑 胡俊英
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
科技发展日新月异,我们逐步进入了人工智能时代,编程已经不是一种特殊技能,每个感兴趣的人都可以尝试。编程对人的逻辑思维、动手能力等是一种很好的锻炼,中小学生不仅可以通过编程拓展思维,还可以动手体验科技带来的乐趣,在代码的世界里,提升自身综合实力。
本书由浅入深地引导读者学习C++编程,涉及变量、分支、循环、数组、字符串、函数等重要知识点,同时总结了程序调试技能、编程规范、考试经验等。本书包含丰富实用的代码示例,旨在帮助学生快速入门C++编程,并能够在案例的引导下,进一步夯实C++编程技能,轻松应对各类编程竞赛。除此之外,本书还提供了配套的题库供读者自行练习,并辅以代码作业检测平台,帮助家长和学生做好课后练习与学习效果评估。
当代社会是科技时代,学校和家长越来越重视科技教育以及人工智能方面的课程,编程也逐渐成为新时代青少年的必备技能。我从事青少年编程教育有七年多,也一直从事一线的C++编程教学和课程研发工作,主要面向零基础的中小学生。在这些年的教学过程中,我发现市面上缺少真正适合零基础的中小学生系统性学习C++编程的书籍。面对C++编程教育,许多家长、中小学校、少儿编程机构、机器人培训机构、大学老师以及孩子本人都有很多的苦恼,而本书就可以帮助大家解决这些苦恼。
关于家长的苦恼。在教学的过程中,我意识到大多数让孩子学编程的家长,自己并不懂C++编程。于是当孩子编写了作业程序,家长却不能检查和判断作业的正确性,也无法检验孩子学习编程的阶段性效果。也就是说,孩子学会了没有?学到了多少?学到了什么阶段?家长完全是束手无策。本书专门配套了在线作业检测系统,帮助家长和孩子检测所写程序的正确性,检验学习效果。
关于中小学、青少年编程培训机构和机器人教育机构的苦恼。这些年我和很多编程教育的负责人以及一线老师交流过C++的教学方式和经验,发现很多机构都苦于缺少一本适合教学的图书以及配套的教学课件。本书的编写思路以及知识点的设置和作业的安排都是按照学校和培训机构里良好的教学方式进行设计的。本书有配套的教学课件,中小学校和各个培训机构的老师完全可以按照本书的内容和课件进行教学。
关于学生的苦恼。其实现在很多孩子是喜欢编程的,对编程是感兴趣的。但是他们却苦于没有一本真正适合零基础读者系统性学习的图书。我在多年的教学过程中发现,孩子喜欢通过实例程序的方式学习。如果脱离程序用单纯的文字叙述来讲解,对孩子来说太抽象,他们很难理解,注意力也很难集中。本书在讲解的方式上注重通过大量的程序范例进行知识点的展示、分解和剖析,孩子学习起来会更易于接受和理解。
关于大学老师的苦恼。编程有助于逻辑思维的锻炼和动手能力的提升,在中小学阶段学过编程的学生在大学阶段更容易在专业学习中表现突出。与此同时,老师们也会有一点苦恼,就是很多这类学生在开始学编程的时候没有养成良好的编码规范和编程习惯。这些不好的编码规范和编程习惯对于初级阶段的学习没有太大的影响,但是当进入高级阶段的学习以及需要和他人进行合作交流的时候就会产生比较大的影响了。所以本书在程序范例的呈现上,特意进行了精心的设计,书中的代码展示效果和在编程软件上看到的效果是完全一样的,可以说是真实地在书中还原了程序本来的样子。书中所有代码的颜色和效果都跟编辑环境里的代码一样,代码的风格也严格符合标准的程序规范,让零基础的孩子从最开始学习的时候就养成良好的编码规范和编程习惯。
本书适合的读者对象:
小学四年级以上、零基础且对C++编程感兴趣的学生;
准备参加全国青少年信息学奥林匹克竞赛的学生;
准备参加CSP软件能力认证的学生;
准备参加全国青少年软件编程等级考试的学生;
准备参加蓝桥杯编程竞赛的学生;
准备参加青少年人工智能和编程技术相关考试的学生。
本书按照由浅入深、循序渐进的模式进行设计,内容通俗易懂、实战性强,结合了丰富的编程示例,非常适合零基础的中小学生。
书中的“学前预热”部分特意针对零基础的学生归纳和整理了一些常用的编程英语单词和数学知识。零基础的学生可以先行了解这部分内容,有个大概的了解和印象,在学习后面知识的过程中有不懂的地方可以直接查阅。
编程是一门实践性的学科,必须多动手、多操作。建议读者先按照在本书“学前准备”部分安装好编程工具并关注作业检测公众号。读者从学习本书的第1章开始就要用书中介绍的集成开发环境进行编程练习,并通过公众号进行作业检测。
读者在学习本书时,一定要按照从第1章到第7章的顺序进行阅读和练习。各个章节的知识点环环相扣,后一章的内容会穿插前面章节的知识点。各个章节也都是按照“程序范例→用法→实例讲解→阶段性编程练习→作业”的模式进行知识点的讲解和强化。
在学习的时候,先动手编写并运行最开始的程序范例,使自己有一个初步的体会和理解,然后带着一些疑问再继续后面的学习,学习完知识点后再通过实例讲解进行升华,最后通过阶段性编程练习和作业进行学习效果的检测和巩固。
无论是基于兴趣的编程学习还是为参加信息学奥赛或软件编程等级考试、蓝桥杯等比赛做准备,本书都可以实现顺利引导和教学。本书不但讲解了C++编程的基础知识,而且结合了信息学奥赛和软件编程等级考试的题型,许多例题、练习题、作业题都是直接采纳或模拟比赛的真题。学完本书后,读者能够打下坚实的编程基础,掌握扎实的理论和编程技巧,也有助于大家顺利进入算法和数据结构的高阶学习。
本书在讲解知识点的过程中结合了丰富的程序范例,大家在学习的过程中一定要多动手,在计算机上实践这些代码,动手编写程序。
书中的程序范例和例题不能只是简单地看一下,要把这些程序在自己的计算机上编写并运行一遍,以此加深理解。
每章的练习和作业题目一定要自己动手做出来,可以关注配套的作业检测微信公众号进行作业的检测和判断。只有检测通过,才能说明你写的程序是正确的。另外,除书中的题目以外,有余力的同学还应尽可能地多做题库中的其他编程题目。
虽然作者花了很多时间和精力去核对书中的文字、代码和图片,但仍然难免会有一些错误和纰漏。如果读者发现什么问题或者有任何建议,恳请反馈于我,相关信息可发到我的邮箱zuofengming@foxmail.com。
左凤鸣
虽然中小学生已经在学习英语,但和编程相关的英语基本没有涉及,而程序是全英文编写,如果学生没有相关的英文知识储备,学习起来会比较吃力。所以在正式学习编程之前,本书归纳和整理了一些编程常用的英文单词。
另外,在编写程序的过程中,你会用到很多数学知识,很多题目就是用计算机来解决一些数学问题,因此数学知识的积累对学习编程也非常重要。反过来,学习编程对大家学习数学和英语也都有直接的帮助和促进作用。
(1)程序框架常用单词
英语 |
含义 |
---|---|
include |
包含,包括 |
input |
输入,将……输入计算机(C++里iostream中的i) |
output |
输出(C++里iostream中的o) |
stream |
(数据)流(C++里iostream中的stream) |
using |
使用 |
namespace |
命名空间 |
standard |
标准(C++里简写的std) |
main |
主要的(C++里的主函数) |
return |
返回 |
math |
数学 |
void |
空的 |
error |
错误(当程序编译错误时,在提示信息里会显示) |
before |
在……之前(当程序编译错误时,有时会在提示信息里显示) |
expected |
预期的;期盼(当程序编译错误时,有时会在提示信息里显示) |
(2)数据类型常用单词
英语 |
含义 |
---|---|
int |
整数 |
short |
短的 |
long |
长的 |
float |
浮动,浮点数(单精度) |
double |
两倍,浮点数(双精度) |
bool |
布尔型 |
character |
字符(C++中简写为char) |
string |
字符串;线,一串;(C++里字符串头文件cstring中的string) |
(3)程序命令常用单词
英语 |
含义 |
---|---|
out |
出局,出去,离开(C++里输出命名cout中的out) |
in |
里面,进入(C++里输入命令cin中的in) |
end |
结束(C++里结束换行命令endl中的end) |
line |
行(C++里结束换行命令endl中的l) |
|
打印(C++里格式化输出命令printf中的print) |
format |
格式,使格式化; (C++里格式化输出命令printf中的f) |
scan |
扫描(C++里格式化输入命令scanf中的scan) |
if |
如果 |
else |
否则,另外 |
switch |
开关,转换,交换器 |
case |
情况,实例 |
default |
默认值 |
break |
破坏,终止, 跳出循环 |
continue |
继续,继续(下一次)循环 |
true |
真,真的 |
false |
假,假的 |
for |
为了;for循环 |
while |
在……期间,直到;while循环 |
do |
做 |
get |
获得 |
getchar |
字符输入 |
put |
放,放置 |
putchar |
字符输出 |
length |
长,长度(C++里strlen中的len) |
compare |
比较(C++里strcmp中的cmp) |
number |
数,数字(C++里strncmp中的n) |
copy |
复制(C++里strcpy中的cpy) |
concatenate |
连接(C++里strcat中的cat) |
ceil |
天花板(C++里的向上取整函数) |
floor |
地板(C++里的向下取整函数) |
sqrt |
开平方根(C++里的平方根值函数) |
(1)长方形、梯形、圆形面积、圆柱体体积公式
图形 |
公式 |
描述 |
---|---|---|
长方形 |
面积公式: S = a × b |
公式中的a和b分别是长方形的长和宽,S为面积 |
梯形 |
面积公式: S =(a+c)×h÷2 |
公式中的a和c分别是梯形上下底,h为梯形的高 |
圆形 |
面积公式: S =π× r × r |
公式中的r为圆的半径, π表示圆周率 |
圆柱体 |
体积公式: V =π× r × r × h |
底面积(S)×高(h),先求底面积(圆),然后乘以高 |
(2)平方、立方、开方、次方(乘方/幂运算)
数学运算 |
描述 |
例子 |
---|---|---|
平方 |
一个数连续乘两次就是平方 |
2的平方是2×2,3的平方是3×3,所以2的平方等于4,3的平方等于9;平方又叫二次方 |
立方 |
一个数连续乘三次就是立方 |
2的立方是2×2×2,3的立方是3×3×3,所以2的立方等于8,3的立方等于27;立方又叫三次方 |
次方 (乘方/幂运算) |
设a为某数,n为正整数,a的n次方表示为an,就是n个a连乘所得的结果 |
2的4次方表示4个2相乘,即24=2× 2×2× 2 = 16。次方也称为乘方,求n个相同因数乘积的运算,就叫乘方,乘方的结果叫作幂(power);所以“2的4次方”也可以读作“2的4次幂” |
开方 |
开方,指求一个数的方根的运算,是乘方的逆运算,例如平方或者立方的逆运算 |
2的平方是4,3的平方是9,对于逆运算,4的开方是2(这里的开方默认是开二次方),9的开方(二次方)是3 |
(3)质数(素数)、因数(约数)
质数(prime number)又称素数,是指在大于1的自然数中,除了1和它本身外,不能被其他自然数整除的数。也就是说,该数除了1和它本身以外不再有其他的因数。例如,最小的质数是2,10以内的质数有2、3、5、7。
两个正整数相乘,那么这两个数都叫作积的因数,或称为约数。例如,2× 6 = 12,2和6的积是12,因此2和6是12的因数。
(4)数学绝对值
在数轴上,一个数到原点的距离叫作该数的绝对值。非负数(正数和0)的绝对值是它本身,非正数(负数)的绝对值是它的相反数。例如,3的绝对值为3,−3的绝对值也为3。
(5)等差数列和等比数列
如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个数列就叫作等差数列。例如,1、3、5、7、9就是一个等差数列,它们相邻两个数的差值都等于2。
如果一个数列从第二项起,每一项与它的前一项的比值等于同一个常数,这个数列就叫作等比数列。例如,1、2、4、8、16就是一个等比数列,它们相邻两个数的比值都等于2。
当某人去驾校学开车,驾校不会只给他一本书就让他学,一定会再配一辆可以实际操作的车,才能让他学会开车。小孩学骑自行车也必须要有自行车这个工具,并通过实际的操作练习才能学会。学习编程也一样,如果只是“看”,你是学不会编程的,必须用编程工具去实践才能真正学会编程。下面就一步一步地教大家如何安装和使用C++编程的开发工具。
Dev C++是一个可视化集成开发环境,可以用该软件实现C++程序的编辑、预处理/编译/链接、运行和调试。
(1)关注图1所示的公众号,读者可根据提示下载软件。
图1
(2)如图2所示,找到下载好的安装文件后,在该文件上双击,开始安装。
图2
(3)在图3所示的界面中,单击【OK】按钮。
图3
(4)在图4所示的界面中,单击【I Agree】按钮。
图4
(5)在图5所示的界面中,单击【Next】按钮。
图5
(6)在图6所示的界面中,单击【Install】按钮。
图6
(7)在图7所示的界面中,单击【Finsh】按钮。
(8)在随后出现的界面中,选择【简体中文】,并单击【Next】按钮。
(9)在图8所示的界面中,单击【Next】按钮。
图7
图8
(10)如图9所示,软件已经安装完成,请单击【OK】按钮。
图9
当软件安装好之后,你就可以进行程序的编写和运行等操作了。
要学好编程,自己动手练习、做作业、从题库刷题都是必不可少的。本书每个章节都搭配了阶段性的编程练习和作业,这些题目都需要学生自己编写程序来解答。
但是怎么判断学生是否做了作业,作业的完成情况如何?这又是许多家长、老师和学生面临的一个难题。
本书特意为读者配备了一个用于作业检测的微信公众号,当读者关注公众号后,根据公众号的提示,可以进入在线测评系统,在系统中可以完成作业的提交、检测和判断。此外,系统还会提供配套作业的参考答案。
读者可以扫描图10所示的二维码,关注本书配套的作业检测微信公众号。
图10
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供相关配套资源,要获得该配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
安装好软件后,双击计算机桌面上的Dev C ++(见图1-1),启动编程环境。
图1-1
如图1-2所示,单击【文件】→【新建】→【源代码】(或按组合键Ctrl+N),就可以打开源代码编辑框,我们就可以在里面编写程序了。
图1-2
编写你的第一个程序“Hello,World!”。
在源代码编辑框里输入以下程序(请保证键盘输入法在英文状态)。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello,World!";
return 0;
}
注意
初学者常犯的错误就是编写的程序里包含了中文的符号,在编程的时候一定要用英文输入法,包括括号和标点符号,都要统一为英文的输入法,特别是每行后面的分号“;”一定要用英文的分号。
写好以上程序后,单击【运行】→【编译运行】(见图1-3),或者按F11键,计算机屏幕就会运行出“Hello,World!”的字样。
程序运行结果如图1-4所示。
图1-3
图1-4
小技巧
在弹出的显示框边缘,单击鼠标右键,选择【属性】(见图1-5),可以设置背景和文字的颜色与大小(通常设置为黑色背景绿色文字)。
图1-5
图1-6红框中的内容,对初学者来说可以理解为C++编程的框架。
程序的各部分含义如图1-7所示。
图1-6
图1-7
对于初学者,暂时不用深究头文件、名字空间、主函数、返回值(程序结束)这几个部分,先将其理解为程序的框架,写程序的时候要先把程序框架写出来。
在程序语句cout
<< "Hello,World!"
中 ,cout 是输出命令,""双引号里面的内容会原样输出到计算机屏幕,这次写的是“Hello,World!”,可以把双引号里的内容换成其他的,例如“123”或“C++编程”等,那么就会在计算机屏幕上输出“123”或“C++编程”字样(双引号里面的内容可以是中文)。
cout语句可以形象地理解为计算机的“嘴”,计算机通过cout语句“说话”。
许多刚开始学C++编程的同学,写程序都会或多或少地出现一些错误,当程序报错时,我们怎么处理?
在Dev C++软件上编写好程序,当我们单击软件上的【编译运行】后,程序会先进行编译处理,生成可执行文件(.exe),编译通过后再运行程序。但是如果你写的程序有语法错误,那么就不会编译通过,编译器在编译时会发现错误,并给出相应的错误提示信息。例如,有的读者就会遇到图1-8所示的情况。
图1-8
如果你的程序在编译的时候出现类似这种某一行红色高亮的提示,说明程序有语法错误,没有编译通过。这时候,先看一下红色高亮语句的上一行是否有错。例如,图1-9中的第9行标红了,因为第8行恰好为空,所以就查看第7行哪里出错了。结合编译器下面的提示信息,如图1-9所示。
图1-9
提示信息显示“expected ‘;’ before ‘return’”,翻译成中文的意思就是在return前缺少分号。最后在第7行后面加一个分号“;”就可以解决这个问题。
在编写程序时,出现语法错误导致编译不通过是常见的现象。特别是刚开始学编程或者当你的程序很复杂的时候。如果程序编译不通过,首先不要着急,我们要学会阅读编译器的提示信息,根据程序中的标红显示以及编译器的相关提示信息,找到程序中的错误,并进行有针对性的修改。
当程序编译出错时,我们要养成查看编译器错误提示信息的习惯。
在Dev C++软件上编好一个程序后,可以单独编译这个程序,编译通过后会生成一个可执行文件,具体过程如下。
(1)当程序编好后,先保存源代码。
如图1-10所示,单击保存(或按组合键Ctrl+S)。
图1-10
(2)给程序文件命名。
例如命名为test。test.cpp就是程序的源代码,源代码可以保存在计算机上的任意文件夹里。如图1-11所示,我的代码是保存在计算机D盘一个叫C++的文件夹里(D:\C++)。源代码的名字和保存位置可以自己设置。
图1-11
(3)保存好后,你的计算机里就有了一个test.cpp的源文件(见图1-12)。
图1-12
(4)如图1-13所示,单击编译(或按F9键)。
图1-13
(5)编译通过后,在刚刚保存的源代码文件夹里,就会出现一个test.exe的可执行文件(见图1-14)。程序编译生成了以exe结尾的可执行文件。
图1-14
(6)如图1-15所示,再单击运行(或按F10键),就可以直接运行之前编译好的程序。
图1-15
为了方便读者更好地练习和检测所编写的程序,本书配套搭建了在线题库和测评系统,学生可以把所写的程序提交到题库上,系统会在线判断程序的对错。题库也准备了其他练习题目,读者可在题库中完成其他编程练习。下面就来介绍题库的使用方法和技巧。
(1)扫描图1-16所示的二维码,关注配套的微信公众号,根据提示进入题库。
图1-16
(2)进入题库后,单击【登录】按钮(见图1-17)。
图1-17
(3)根据所分配的账号登录,登录后先修改初始密码。
(4)如图1-18所示,根据题目编号查找题目。
单击【题目】,输入编号,然后按回车键就可以找到对应的题目。
图1-18
如图1-19所示,在题目编号里输入1033后按回车键,就会显示出编号为1033的题目(见图1-20)。
图1-19
图1-20
(5)提交程序。
如图1-21所示,根据题意编写好程序后,单击【提交】。
图1-21
如图1-22所示,选择编译语言。如果用C++编写的就选择C++,如果用C语言编写的就选择C语言。
图1-22
如图1-23所示,把写好的程序复制到程序栏里,再单击【提交】。
图1-23
提交后,读者可以在状态栏里查看自己写的程序是否正确。如果错误可以单击【错误】,会显示出具体的错误(见图1-24)。
图1-24
如图1-25所示,当你单击【错误】,会显示输入数据(data input)、正确的结果(correct output)以及你的结果(your output)。然后可以根据显示的错误进行程序修改和调试。
图1-25
(6)在题目里除了编号,也可以输入题目的关键字查找题目。
如图1-26所示,当输入“鸡兔”后,就会显示和“鸡兔”相关的题目(见图1-27)。
图1-26
图1-27
(7)判断是否完成了作业并进行作业检测。
如图1-28所示,题库会在题目的标号前面自动加上相应的标记。
① 如果正确,则会标记绿色背景的“Y”(表示Yes)。
② 如果错误,则会标记红色背景的“N”(表示No)。
③ 如果没有做过该题目,则是空白,没有任何显示。
图1-28
(8)如图1-29所示,在题目类别里,我们根据不同类型的题目进行了分类,可选择对应类型的题目练习。
图1-29
(9)如图1-30所示,题库还提供了源码暂存功能。
图1-30
如图1-31所示,单击【添加代码】按钮,读者可以把自己还没写完的程序保存到题库中,下次写程序或查看程序的时候就可以直接在题库中查询使用。
图1-31
如图1-32所示,单击【添加代码】按钮后,就可以添加题目ID、标题以及相应的代码。
图1-32
(10)在线保存程序。
我们会为读者在线保存作业程序,方便读者以后查看和复习自己的作业。如图1-33所示,单击【我的提交】按钮可查看自己提交的所有程序。
图1-33
(11)错误程序归类功能
题库可以把读者所有的错误作业集中归类显示,方便读者进行有针对性的复习和练习。单击【我的提交】按钮后,查看自己的所有代码,并且能根据结果再次归类显示。例如想查看自己之前所有的错误程序,请单击结果中的【答案错误】类别(见图1-34),就会显示出所有的错误程序。
图1-34
这样把学生所有的错误程序归类整理,有助于学生的专项突破以及有针对性的学习和练习。
在题库上提交我们的第一个程序题目Hello,World!。
如图1-35所示,读者可以通过题目编号(1400)或者题目关键字查找。
图1-35
ZZ1400:Hello,World!
编写一个能够输出“Hello,World!”的程序,这个程序常常作为每个初学者接触一门新的编程语言时所写的第一个程序,也经常用来测试开发、编译环境是否能够正常工作。
无
一行,仅包含一个字符串:“Hello,World!”
Hello,World!
先在计算机的Dev C++软件上编写程序,再按照1.3.1节介绍的方式,把代码提交到题库进行检测。
如图1-36所示,单击【提交】按钮,准备提交代码。
图1-36
如图1-37所示,把Dev C++软件上编写好的程序复制并粘贴到题库中。注意提交代码的时候要选择C++。提交后,题库会自动判断所写程序的正确性。
图1-37
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
cout << "*****" << endl;
cout << " *** " << endl;
cout << " * " << endl;
return 0;
}
这个程序会在计算机屏幕上输出一个用*组成的倒三角形,程序中的endl是换行命令。
程序运行结果如图1-38所示。
图1-38
试试没加endl的程序的运行效果如何。
#include <iostream>
using namespace std;
int main()
{
cout << "*****";
cout << " *** ";
cout << " * ";
return 0;
}
程序运行结果如图1-39所示。
图1-39
可以看到如果没有endl,那么程序在运行时就不会换行。
我们可以通过编写程序让计算机完成加(+)、减(−)、乘(*)、除(/)、求模(余)(%)等算术运算。
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
cout << 1 + 1;
return 0;
}
程序运行后会输出1+1的结果为2,如图1-40所示。
图1-40
小提示
常量的定义 程序中使用的一些具体的数或者字符等称为常量。常量在程序运行过程中不可以被更改,其值保持不变。例如这个程序中的数字1,以及我们之前输出的“Hello,World!”,其值都不可以被改变。
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
cout << 2 - 1;
return 0;
}
程序运行后会输出2−1的结果为1,如图1-41所示。
图1-41
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
cout << 2 * 2;
return 0;
}
程序运行后会输出2*2的结果为4,如图1-42所示。
图1-42
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
cout << 1 / 2;
return 0;
}
运行的结果是0,如图1-43所示。是不是很奇怪?按照数学算术运算1除以2应该等于0.5,可是计算机为什么会算出结果是0?
图1-43
在这里我们把计算机理解为一个很“死板”的机器,程序做1
除以2
运算的时候,因为我们给计算机的1和2都是整数,那么计算机就会做整除,去掉小数部分,只留整数。例如1除以2的数学运算结果是0.5,但计算机是整除,就会自动把小数部分“.5”去掉,就只剩0了。
可以这样理解:在做除法的时候,如果我们“给”计算机的是整数,那么计算机也只会“给”我们整数。
如果要让计算机在做除法时计算出带有小数的结果,只需要把程序中的任意一个整数改为小数就可以了,如果把整数2改为小数2.0,计算机就会计算出带有小数的结果了。
#include <iostream>
using namespace std;
int main()
{
cout << 1 / 2.0;
return 0;
}
程序运行结果如图1-44所示。
图1-44
总结
计算机编程中的除法和数学中的除法是有区别的。如果除号 “/” 两边都是整数,则表示整除,其结果只保留整数部分,自动舍去小数部分。
小技巧
如果用一个两位数的整数除以10,其结果就是该两位数中十位数上的数值。通过这种方法我们可以求出任意一个两位数上的十位值。例如在程序中运算23/10的结果就是2,即十位上的数字。
想一想
一个3位数的整数想得到百位数上的数值,应该怎么操作?
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
cout << 5 % 2;
return 0;
}
程序运行后输出5除以2的余数为1,如图1-45所示。
图1-45
小技巧
任意一个整数对10求余,余数就等于这个整数中个位的数值,例如23%10的余数就等于个位上的值3,378%10的余数就等于个位上的值8。通过这种方法,我们就可以求出任意一个整数的个位值。
ZZ1407:计算重庆观音桥广场面积
假设广场的长为500米,宽为400米,编写程序求出它的面积。
无
广场的面积。
根据题意可知,该程序是计算长方形的面积,根据长方形的面积公式:面积=长×宽,计算输出。
#include <iostream>
using namespace std;
int main()
{
cout << 500 * 400;
return 0;
}
程序运行结果如图1-46所示。
图1-46
ZZ1513:输出菱形
用“*”输出一个对角线长为5个“*”的菱形(如样例中的图形)。
无
样例中的菱形。
无
*
***
*****
***
*
ZZ1408:计算重庆解放碑广场的面积
重庆解放碑广场中间的圆形半径r = 30米,求解放碑广场圆形的面积(π=3.14)。
无
解放碑广场圆形的面积。
注
完成作业后需根据图1-47所示的公众号的提示进行作业提交,检测所写的程序是否正确。
图1-47
在本章中,我们学习顺序结构程序设计,即在程序中按自上而下的顺序依次执行每条语句。
有的同学喜欢玩游戏,游戏里面人物的生命值、移动速度、攻击力等会根据人物的不同阶段进行变化,并且同一个游戏里不同的人物角色属性也各不相同。你有没有想过这些游戏程序是通过什么来实现人物生命值的变化?这就是我们接下来要学习的变量。
编程解决如下问题。
ZZ1406:任意两个数的和
任意输入两个整数,计算出它们的和。
a b(a和b为整数,范围是−2 147 483 648~2 147 483 647)。
a + b的和。
1 1
2
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a + b;
return 0;
}
程序运行结果如图2-1所示。
图2-1
当程序运行后,在弹出的显示框中输入10和20(中间用空格隔开),再按计算机上的回车键(Enter),就会显示出10+20的结果为30。
该程序的功能是任意输入两个整数(−2 147 483 648~2 147 483 647),程序自动计算并输出这两个数的和。
① int a,b;
这一行是定义两个int
整型的变量a
和b
。a
和b
是变量的名字,类似于每个人都用名字进行区分一样,在程序中也需要给变量取名以进行区分。
② cin >> a >> b;
这一行向往计算机输入任意两个整数,cin是输入命令,“>>”是运算符。在C++中,输入cin
(运算符是>>)和输出cout
(运算符是<<)就是用这种“流”的方式来实现的,使用时需包含头文件,程序语句为#include <iostream>
。一个输入/输出内容对应一个运算符,例如程序输出变量a
和b
的命令为cout << a << " " << b;
,其中<< " "
的作用是用空格把输出的两个数隔开。
我们往计算机中输入数据,需要一个东西来存储它,这时就可以定义一个变量来“存储”这些数据。变量是一个抽象的概念,我们可以把变量理解成现实生活中吃饭用的碗(见图2-2),在日常生活中,碗用来盛饭,在计算机中变量用来存数据。
图2-2
程序会有很多数据,那么就需要很多变量来存储这些数据。这么多变量,我们怎么区分?就像每个人有自己的名字一样,变量也通过取名进行区分,可以命名为a或者b等。例如程序范例中的int a,b; a
、b
就代表两个int整型变量,可以存储输入的两个整数。
其实变量就代表了计算机中的一个存储单元,在程序运行过程中其值可以改变,所以就叫作变量。
我们生活中吃饭用的盘子和碗有不同的存储内容,有的用来放菜、有的用来放饭、有的用来放汤。
在计算机中也有用于存储不同内容的变量。我们往计算机里输入的如果是整数(例如1),那么就需要对应存储整数的变量;如果输入的是小数(例如0.5)或者字符(例如a),也需要对应能存储这些数据的变量。
接下来我们就来介绍C++中常用的变量类型。
(1)整型
整型变量可以存储整数,除了之前用过的int类型外,还有其他整型类型。
常用的8种整型类型如表2-1所示。
表2-1
数据类型 |
定义标识符 |
数值范围 |
---|---|---|
短整型 |
short |
−32 768 ~ 32 767 |
整型 |
int |
−2 147 483 648 ~ 2 147 483 647 |
长整型 |
long |
−2 147 483 648 ~ 2 147 483 647 |
超长整型 |
long long |
−9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
无符号整型 |
unsigned |
0 ~ 65 535 |
无符号短整型 |
unsigned short |
0 ~ 65 535 |
无符号长整型 |
unsigned long |
0 ~ 4 294 967 295 |
无符号超长整型 |
unsigned long long |
0 ~ 18 446 744 073 709 551 615 |
任何变量在使用之前都需要先定义,C++定义变量的形式如下:
类型名 变量名1, 变量名2, ……,变量名n;
例如:
int a, b, c;
long long d;
以上代码定义了a、b、c这3个int整型变量和一个超长整型变量d。
#include <iostream>
using namespace std;
int main()
{
short a;
int b;
long c;
long long d;
cout << "请输入4个整数(用空格隔开):";
cin >> a >> b >> c >> d;
cout << "你刚才输入的4个整数是:";
cout << a << " " << b << " " << c << " " << d;
return 0;
}
以上程序定义了short、int、long、long long 4个整型变量,名字分别为a、b、c、d,然后通过输入流和输出流进行变量的输入输出。程序运行结果如图2-3所示。
图2-3
(2)实型(浮点型)
除了整数,如果向计算机输入或者存储一个小数,就需要定义一个实型(浮点型)变量(见表2-2),例如单精度浮点型float、双精度浮点型double。
表2-2
数据类型 |
定义标识符 |
数值范围 |
---|---|---|
单精度实型 |
float |
−3.4E+38 ~ 3.4E+38 |
双精度实型 |
double |
−1.7E+308 ~ 1.7E+308 |
长双精度实型 |
long double |
−3.4E+4 932 ~ 1.1E+4 932 |
注:表中的“E”表示科学记数法,例如3.4E+38就表示3.4乘以10的38次方。
#include <iostream>
using namespace std;
int main()
{
float a;
double b;
cout << "请输入两个小数(用空格隔开):";
cin >> a >> b;
cout << "你刚才输入的两个小数是:";
cout << a << " " << b;
return 0;
}
以上程序定义了float和double两个浮点型变量a和b。程序运行结果如图2-4所示。
图2-4
(3)字符型
字符型char可以存储字母或者符号,例如a、b、c、感叹号(!)、加号(+)等。
#include <iostream>
using namespace std;
int main()
{
char a;
cout << "输入任意一个字符(输入后按回车键):";
cin >> a;
cout << "你刚才输入的字符是:" << a;
return 0;
}
以上程序定义了一个字符型的变量a,通过键盘向计算机任意输入一个字符,将该字符存储在变量a中。程序运行结果如图2-5所示。
图2-5
(4)布尔型
程序如果只需要用到真或假两个值,这个时候就可以用布尔类型(bool)来描述真和假。
布尔类型只有两种取值——true和false,true表示真,false表示假。在C++中,所有非0的数字都被认定为true,0被认定为false。bool类型也可通过数字赋值,在输出时true输出的结果为1,false输出的结果为0。
例如:
bool r;
以上代码定义了一个布尔型变量r。
在之前的程序里定义变量,例如int a;char c;等,其中的变量名除了叫a、c之外,还可以叫d、e、f、g……或者apple、book等。
例如:
int apple;
char book;
在以上代码中,apple和book就是整型和字符型变量的名字。
程序中的常量名、变量名都称为“标识符”,只要在满足标识符命名规则的前提下,就可以给变量取任意的名字。那么标识符的命名规则是什么?
(1)由字母(大小或小写)、数字或下划线(_)组成。
(2)只能以字母或下划线开头,也就是说,不能以数字开头。
(3)不能是C++的关键字。C++的关键字是类似int、float、double、char等已经被C++使用过的一些词。就好比某个班上的学生,如果有个同学已经叫“小明”了,为了避免重复,那么其他学生就不能再取名“小明”。
例如:定义一个int型的整型变量,可以命名为abc或者abc2、_2abc,但是不能命名为2abc或者float,因为不能以数字开头,也不能使用C++的关键字。
注意
 变量一定要先定义后使用,并且在为变量取名的时候,应该尽量做到“见名知义”,看见变量的名字就大概知道这个变量的含义,以增强程序的可读性。
(1)变量的初始化
在定义变量的同时,可以给该变量指定一个初始值,这个过程就叫作变量的初始化。例如:
int a = 0, b = 0;
double c = 1.5;
char d = 'A';
bool r = true;
注意
 字符型char在初始化的时候要用单引号。
(2)变量的赋值
C++中“=”称为“赋值号”,变量可以通过赋值语句来改变变量的值。赋值语句的一般形式如下:
变量名 = 表达式
该过程也被称为赋值运算。
例如:
int a;
a = 10;
以上两条语句是先定义一个整型变量a,然后将常量10赋值给变量a。
#include <iostream>
using namespace std;
int main()
{
int a = 0, b = 0, c = 0;
a = 10;
b = a;
c = 2 * a + b;
cout << a << " " << b << " " << c;
return 0;
}
程序运行结果如图2-6所示。
图2-6
该程序定义了3个整型变量,并将其初始化为0。然后将10赋值给变量a,再将变量a的值赋值给变量b,最后将表达式2 * a + b
的运算结果赋值给变量c。
ZZ1123:小明卖水果1
小明是一位热爱社会实践的同学。假期作业完成后,他摆了一个自己的水果摊,在他的水果摊里苹果每斤5元。
请编写程序实现以下功能:
输入苹果的重量(仅限整数),输出小明应该收客户多少钱。
苹果重量(仅限整数)。
小明应该收客户多少钱。
2
10
这个程序可以定义两个整型变量a和n,其中a用来存储输入的数据,即苹果的重量a。用苹果的重量a乘以苹果的单价5元,就是应收的费用,把应收的费用赋值给变量n,最后用cout语句将n输出。
#include <iostream>
using namespace std;
int main()
{
int a = 0, n = 0;
cin >> a;
n = a * 5;
cout << n;
return 0;
}
输入2表示苹果的重量,然后按回车键,就会返回应收的钱10。程序运行结果如图2-7所示。
图2-7
ZZ1066:求3个整数的和
输入a、b、c这3个整数,求它们的和。
a b c(a、b、c为3个整数)。
a+b+c的和。
2 3 5
10
定义4个整型变量,分别是a、b、c、s,其中a、b、c用来存储输入的3个整数。s用来存储a+b+c的和,最后输出s。
#include <iostream>
using namespace std;
int main()
{
int a, b, c, s;
cin >> a >> b >> c;
s = a + b + c;
cout << s;
return 0;
}
程序运行结果如图2-8所示。
图2-8
ZZ1127:捡石头
昨天,憨厚的老农夫捡到了3块石头,他想再去捡一块小石头,让这4块石头正好一共20斤,请问他应该去捡一块多少斤的石头?
3个整数a、b、c,是这3块石头的重量(斤)。
一个数,表示农夫应该去捡一个多少斤的石头。
3 5 7
5
ZZ1165:求门票的总价
某景区的门票价格为120元。门票售价规定为:成人全价、小孩半价、老人享受6折优惠。某旅行团有x名成人,y名小孩,z名老人,求该旅行团需要付给景区的门票总额为多少元。
x y z(x表示成人的人数,y表示小孩的人数,z表示老人的人数)。
旅行团需要付给景区的门票总额为多少元。
5 4 10
1560
注
完成练习后,读者需要根据公众号提示进行作业提交,并检测所写的程序是否正确。
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b;
cin >> a;
scanf("%d", &b);
cout << a << endl;
printf("%d", b);
return 0;
}
程序运行结果如图2-9所示。
图2-9
程序定义了两个整型变量a、b,分别用到了C++语言中的流和C语言中的格式化输入/输出方式进行输入和输出。
总结
 ① 目前我们学到了两种输入语句:cin和scanf,其中cin是C++的语法,scanf是C语言的格式化输入。
② 两个输出语句:cout和printf,其中cout是C++的语法,printf是C语言的格式化输出。
③ printf语句可以格式化输出并保留指定的小数位数,例如
printf (“%.2f”, a)
表示输出变量a并保留2位小数。④ 用C++的输入输出流(cin和cout)需要包含头文件:
用C语言的格式化输入输出(scanf和printf)需要包含头文件:
⑤ printf语句可以格式化指定输出类型,例如
printf (“%d”, a)
,%d
表示按int整型输出。
C++语言把数据之间的传输操作称为流。cin代表标准输入设备键盘,也称为cin流或标准输入流。cout代表标准输出显示器,也称为cout流或标准输出流。当进行键盘输入操作时,使用cin流;当进行显示器输出操作时,使用cout流。在使用以上输入/输出流时,需要包含iostream头文件。
C++的流通过重载运算符“<<”和“>>”执行输入和输出操作。在流操作中,将左移运算符“<<”称为插入运算符,即向流中插入一个字符序列,进行输出操作。将右移运算符“>>”称为提取运算符,即从流中提取一个字符序列,进行输入操作。
(1)cout语句的一般格式
cout << 表达式1 << 表达式2 <<……<<表达式n;
#include<iostream>
cout代表显示器,执行cout << a 的操作就相当于把a的值输出到显示器。
(2)cin语句的一般格式
#include<cstdio>
cin >> 变量1 >> 变量2 >>……>> 变量n;
cin代表键盘,执行cin >> a 就相当于把键盘输入的数据赋值给变量。
当从键盘上输入数据时,只有当输入完数据并按下回车键(Enter)后,系统才把该行数据存入到键盘缓冲区,供cin流顺序读取给变量。另外,从键盘上输入的每个数据之间需要用空格或回车符分开,因为cin在为一个变量读入数据时是以空格或回车符作为结束标志的。
C++语言也兼容C语言中的基本语法。scanf和printf是C语言中的输入/输出函数,简称为I/O函数。scanf和printf函数的特点是要按照指定的格式输入/输出值,所以又称为格式输入/输出函数,它们是标准库函数,使用前要加上cstdio头文件。
在时效性上,scanf和printf的运行效率要优于cin和cout,特别是大量数据的输入/输出,使用scanf和printf效率会更高、速度会更快。
scanf函数的格式为:
scanf(格式控制符,地址列表);
printf函数的格式为:
printf(格式控制符,输出列表);
常用格式化指定输出类型如表2-3所示。
表2-3
类型 |
格式控制符 |
---|---|
int |
%d |
long long |
%lld |
float |
%f |
double |
%lf |
char |
%c |
(1)程序实例1
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
float a = 2.222;
cout << a << endl;
printf("%f\n", a);
printf("%.2f", a);
return 0;
}
程序运行结果如图2-10所示。
图2-10
① 程序定义了一个单精度浮点型(float)的变量a,并初始化a = 2.222。
② 通过cout语句输出变量a,对应程序运行结果的第一行2.222。
③ 通过printf语句输出变量a,对应程序运行结果的第二行2.222000,对于语句printf(“%f\n”, a)
,%f
表示输出类型为float,\n
可以理解为换行命令。
④ 通过printf(“%.2f”, a)
指定保留2位小数,然后输出并换行,数字就是控制保留小数的位数,如果想保留3位小数输出则为printf(“%.3f”, a)
。
⑤ 程序中使用printf语句,需要使用#include<cstdio>
包含头文件。如果没有cstdio头文件,程序在我们自己计算机上的Dev C++环境下可能不会报错,但是在信息奥赛、等级考试等比赛环境或者其他环境下,如果没有这个头文件,程序很可能就会报错,所以我们平时在练习的时候一定要严格按照程序要求包含头文件。
⑥ C++中定义了一些字符前加“\”的特殊字符,称为转义字符,例如“\n”的含义就是换行。
注意
 通过格式化输出printf保留特定的小数位数,例如保留2位或者3位小数输出,这在以后的作业和考试中会经常用到,一定要掌握。
(2)程序实例2
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a;
scanf("%d", &a);
printf("%d\n", a);
return 0;
}
程序运行结果如图2-11所示。
图2-11
① 该程序定义了一个int整型变量a。
② 通过scanf语句输入变量a的值。
③ 通过printf语句输出变量a的值。
注意
 在语句
scanf(“%d”, &a
)的变量a前有一个取址符&,初学者很容易漏掉这个符号。
(3)程序实例3
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a;
long long b;
float c;
double d;
char e;
scanf("%d %lld %f %lf %c", &a, &b, &c, &d, &e);
printf("%d %lld %.2f %.2lf %c", a, b, c, d,e);
return 0;
}
程序运行结果如图2-12所示。
图2-12
程序分别定义了一个int
、long
long
、float
、double
、char
类型的变量,并通过格式化输入和输出的方式进行输入和输出。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a;
long long b;
float c;
double d;
char e;
scanf("%d,%lld,%f,%lf,%c", &a, &b, &c, &d, &e);
printf("%d,%lld,%.2f,%.2lf,%c", a, b, c, d, e);
return 0;
}
程序运行结果如图2-13所示。
图2-13
程序实例3是用空格分隔数据,程序实例4是用逗号分隔数据。
ZZ1511:对齐输出
读入3个整数,按每个整数占8个字符的宽度,以右对齐的形式输出它们。
只有一行,包含3个整数,整数之间以一个空格分开。
只有一行,按照格式要求依次输出3个整数,数值之间以一个空格分开。
123456789 0 -1
123456789 0 -1
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
printf("%8d %8d %8d", a, b, c);
return 0;
}
程序运行结果如图2-14所示。
图2-14
① 在程序语句printf(“%8d %8d %8d”, a, b, c)
中,%8d
表示按照8个字符宽度,右对齐输出。当数位不足时,左侧补空格,数位较多时,按实际宽度输出。
② 数字是用来控制字符宽度的,如果想按照其他字符宽度输出,只须修改程序语句中的数字8,例如%9d
就表示按照9个字符宽度进行输出。
③ 如果是左对齐,则需要在前面加一个负号。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
printf("%-9d %-9d %-9d", a, b, c);
return 0;
}
程序运行结果如图2-15所示。
图2-15
程序中的%-9d
表示左对齐,输出的数据占9个字符宽度。
在图2-16的程序中,红框部分表示程序的注释,用双斜线//标记。我们可以理解为该行中只要在双斜线//后面的语句计算机就“看不见”了,可以写任意描述性内容(例如程序注释),程序编译也不会报错。相当于双斜线后面的语句对计算机“隐身了”,只有人类才能看见。
图2-16
双斜线//只能注释一行,如果想一次注释很多行可以用/* */这种方式来注释。
例如:
在图2-17的程序中,/* */之间的内容就会对计算机“隐身”。
图2-17
总结
 为单行程序添加注释用//,为多行程序添加注释用 /* */。
ZZ1141:小明买图书
已知小明有n元,他买了一本书,这本书原价为m元,现在按8折出售。求小明还剩多少钱可以买零食。
n m(n表示小明拥有的钱,m表示图书的原价,n、m都为整数,且0 < n, m < 10 000, n >= m)。
小明还剩多少钱可以买零食(保留两位小数)。
100 100
20.00
这个题主要考察格式化输出的方式,保留两位小数输出要用到printf语句。小数要用浮点型变量float或者double。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double n = 0, m = 0, c = 0, d = 0;
cin >> n >> m;
c = m * 0.8; //书的费用打8折就是乘以0.8的意思
d = n - c; //总的费用减去买书的费用就是剩下的费用
printf("%.2lf", d);//保留两位小数输出,注意double是lf
return 0;
}
程序运行结果如图2-18所示。
图2-18
ZZ1124:小明卖水果2
虽然“小明卖水果1”的程序完成了小明的日常需要。但是当输入的重量为小数时,就无法得到正确的结果。
因此需要对该程序进行修改,要求如下:
苹果5元一斤,输入苹果的重量(重量可以为小数),输出应该收客户多少钱(保留两位小数)。
苹果的重量(重量可以为小数)。
应该收客户多少钱(保留两位小数)。
2.5
12.50
注
完成练习后,读者需要根据公众号提示进行作业提交,检测所写的程序是否正确。
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b;
c = 2 * a * b;
cout << c;
return 0;
}
程序运行结果如图2-19所示。
图2-19
这个程序对输入的变量a、b进行了一个2*a*b
的乘法运算,并将运算的结果赋值给变量c。程序中的+
、−
、*
、/
、%
就称为算术运算符。
复合算术赋值,例如a+=1
相当于a=a+1
;a+=b
相当于a=a+b
。
常用复合运算符如表2-4所示。
表2-4
复合运算 |
符号 |
例子 |
---|---|---|
复合加法 |
+= |
a += b 相当于 a = a + b |
复合减法 |
-= |
a -= b 相当于 a = a – b |
复合乘法 |
*= |
a *= b 相当于 a = a * b |
复合除法 |
/= |
a /= b 相当于 a = a / b |
复合求余 |
%= |
a %= b 相当于 a = a % b |
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
int a = 1, b = 2;
a += b;
cout << a;
return 0;
}
程序运行结果如图2-20所示。
图2-20
① 程序定义了两个int整型变量a、b,并分别初始化为1和2。
② 做了一个 “+=
”的复合运算,a+=b
相当于a=a+b,即把1+2的结果赋值给变量a。
③ 输出变量a的值3。
小提示
表达式的含义 表达式指由数字、运算符、括号、变量等组成,是一种能求得数值的有意义的组合。例如a + b或者a += b就叫作表达式。
自加运算符:“++”,例如a++相当于a自己加了一个1:a = a + 1。
自减运算符:“− −”,例如a− −相当于a自己减了一个1:a = a − 1。
(1)程序实例
编写并运行以下程序。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
a++;
cout << a;
return 0;
}
程序运行结果如图2-21所示。
图2-21
① 定义一个int整型变量a,初始化a=10。
② 运用自加运算符++进行自加运算,a++,相当于做了一个a = a + 1的自加运算,对应到程序中就是 10 + 1。
③ 把自加后的a值输出。
(2)a++和++a的区别
把自加运算符或自减运算符放在变量的前面和后面是有区别的。
例如:
b = ++a;
在以上程序语句中,把自加运算符放在变量的前面,程序是先把a的值增加1,再把a的值赋给b。
b = a++;
在以上程序语句中,把自加运算符放在变量的后面,程序的执行是先把a的值赋给b,然后a再增加1。
(3)对比程序实例
编写并运行以下两个程序。
实例1
#include <iostream>
using namespace std;
int main()
{
int a = 10, b = 0;
b = a++;
cout << b;
return 0;
}
实例2
#include <iostream>
using namespace std;
int main()
{
int a = 10, b = 0;
b = ++a;
cout << b;
return 0;
}
程序运行结果如下。
第一个程序运行结果:10。
第二个程序运行结果:11。
① 这两个程序都定义了两个int整型变量a、b,分别初始化为10和0。
② 第一个程序用b = a++运算赋值,第二个程序用b = ++a运算赋值。
③ 第一个程序运行后b的值为10,第二个程序运行后b的值为11。
计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。例如char类型用于存储字符,但从技术层面看,char是整数类型。因为char类型实际上存储的是整数而不是字符。
最常用的编码是ASCII编码,在ASCII码中,整数65代表大写字母A,存储字母A实际上存储的是整数65。
ASCII码表——常用字符及对应十进制关系表(见表2-5)
表2-5
字符 |
十进制 |
字符 |
十进制 |
字符 |
十进制 |
字符 |
十进制 |
字符 |
十进制 |
字符 |
十进制 |
---|---|---|---|---|---|---|---|---|---|---|---|
32 |
0 |
48 |
@ |
64 |
P |
80 |
` |
96 |
p |
112 |
|
! |
33 |
1 |
49 |
A |
65 |
Q |
81 |
a |
97 |
q |
113 |
“ |
34 |
2 |
50 |
B |
66 |
R |
82 |
b |
98 |
r |
114 |
# |
35 |
3 |
51 |
C |
67 |
S |
83 |
c |
99 |
s |
115 |
$ |
36 |
4 |
52 |
D |
68 |
T |
84 |
d |
100 |
t |
116 |
% |
37 |
5 |
53 |
E |
69 |
U |
85 |
e |
101 |
u |
117 |
& |
38 |
6 |
54 |
F |
70 |
V |
86 |
f |
102 |
v |
118 |
‘ |
39 |
7 |
55 |
G |
71 |
W |
87 |
g |
103 |
w |
119 |
( |
40 |
8 |
56 |
H |
72 |
X |
88 |
h |
104 |
x |
120 |
) |
41 |
9 |
57 |
I |
73 |
Y |
89 |
i |
105 |
y |
121 |
* |
42 |
: |
58 |
J |
74 |
Z |
90 |
j |
106 |
z |
122 |
+ |
43 |
; |
59 |
K |
75 |
[ |
91 |
k |
107 |
{ |
123 |
, |
44 |
< |
60 |
L |
76 |
\ |
92 |
l |
108 |
| |
124 |
- |
45 |
= |
61 |
M |
77 |
] |
93 |
m |
109 |
} |
125 |
. |
46 |
> |
62 |
N |
78 |
^ |
94 |
n |
110 |
~ |
126 |
/ |
47 |
? |
63 |
O |
79 |
_ |
95 |
o |
111 |
[] |
127 |
(1)程序实例1
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a = 65, b = 97;
printf("%d %d\n", a, b);
printf("%c %c", a, b);
return 0;
}
程序运行结果如图2-22所示。
图2-22
① 程序定义了两个int整型变量a、b,并分别初始化为65和97。
② 通过printf格式化输出整型(%d
)。
③ 通过printf格式化输出字符型(%c
)。
① 计算机里数字和字符有一一对应的关系,它们可以相互转换,例如在程序中定义了一个整型变量a=65,可以输出整型数字65,也可以输出对应的字符A。通过ASCII码表可以看出字母‘A’对应的就是65,字母‘a’对应的就是97。
② 如表2-5所示,ASCII码表中不同的字符对应了不同的数字,通过表2-5我们可以看到字符与十进制数之间一一对应的关系,程序里字符与数字之间也可以通过这个对应关系做相互转换。
(2)程序实例2
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char a = 'A'; //注意char型的单字符是用单引号
printf("%d\n", a);
printf("%c", a);
return 0;
}
程序运行结果如图2-23所示。
图2-23
① 该程序定义了一个char字符型变量a,初始化为字符A。单个字符的初始化和赋值要用单引号。
② 用printf分别指定%d和%c输出。
(1)自动转换
高类型变量可以保存低类型的值,并且在运算中能够自动转换为表达式中变量的最高类型。
① 字符既可以使用char类型保存,又可以使用int类型保存。
② 整数既可以使用int类型保存,又可以使用long long类型保存,还可使用float或double类型保存。
③ 浮点数既可以使用float类型保存,又可以使用double类型保存,为提高运算精度,建议优先选用double。
在赋值运算中,右边表达式的值会自动转换为左边变量的类型,并赋给左边的变量。
(2)强制类型转换
除了自动转换,还有强制类型转换。形式为:
(类型名)(表达式)
(类型名)变量
使用强制类型转换会将表达式或者变量的值强制转换为指定类型。例如:
(int)2.5 //把浮点型的2.5强制转换成整型,其结果会去掉小数部分
(double)x //把变量x强制转换成double型
(int)(a+b) //把a+b的值强制转换为int型
(3)程序实例
程序实例1
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a = 'x';
long long b = 'y';
printf("%c\n", a);
printf("%c", b);
return 0;
}
程序运行结果如图2-24所示。
图2-24
程序分别定义了int和long long整型变量,但初始化的不是数字,而是字符x和y,最后通过格式化输出该字符。
程序实例2
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int b = 'A';
b *= 2;
printf("%d", b);
return 0;
}
程序运行结果如图2-25所示。
图2-25
① 程序定义了一个int整型变量b,但是并没有初始化一个整数,而是字符‘A’,通过ASCII码表可以查到A对应的十进制ASCII码值是65。
② 然后做了一个b *= 2
的运算,b = b * 2,即65*2,结果为130。
③ 最后格式化输出整型b的值130。
程序实例3
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
float a = 1;
double b = 2;
printf("%.2f\n", a);
printf("%.2lf", b);
return 0;
}
程序运行结果如图2-26所示。
图2-26
程序定义了float和double两个浮点型变量a、b,但是存储的不是小数,而是整数,最后再按照保留两位小数的形式输出。
程序实例4
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a = 1.23;
printf("%d", a);
return 0;
}
程序运行结果如图2-27所示。
图2-27
程序定义了一个int整型变量a,但初始化的不是整数而是小数1.23,这时候会进行自动类型转换,将1.23转换为int整型,所以只会输出整数部分,即结果1。
程序实例5
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
float a = 1/2;
float b = 1.0/2;
printf("%f\n", a);
printf("%f", b);
return 0;
}
程序运行结果如图2-28所示。
图2-28
① 程序定义了两个float浮点型变量a、b,初始化a=1/2,b= 1.0/2。
② 1/2,因为1和2都是整数,做整除运算,所以a的值等于0,并按照小数的形式输出。
③ 1.0/2,因为1.0是小数,而结果会保留小数部分,所以b的值等于0.5。
程序实例6
编写并运行以下程序。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
float a = (int)2.5;
printf("%f", a);
return 0;
}
程序运行结果如图2-29所示。
图2-29
程序定义了一个float浮点型变量a,在赋值的时候,前面加一个强制类型转换(int)2.5
,这种情况下会把2.5强制转换为整型,去掉小数部分,再把整数2赋值给变量a。
在数学运算中除了+、−、*、/、%,还有乘方、开方等运算,同样在C++中也有这样的运算。在运行乘方(pow)、开方(sqrt)等这类高级运算时,一定要包含math头文件,即#include <cmath>
。
下面我通过程序实例学习几个常用的高级运算。
(1)指数函数程序实例
编写并运行以下程序。
#include <iostream>
#include <cstdio>
#include <cmath> //增加cmath头文件
using namespace std;
int main()
{
int a = 2, b = 3;
double c = pow(a, b);
printf("%.2lf", c);
return 0;
}
程序运行结果如图2-30所示。
图2-30
① 定义两个int整型变量a、b并分别初始化为2和3。
② 运用pow函数进行乘方运算,c = pow(a, b)
表示a的b次方,即2的3次方,值为8。
③ 保留2位小数输出c的结果为8.00。
(2)求平方根函数程序实例
编写并运行以下程序。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
double c = sqrt(9);
printf("%.2lf", c);
return 0;
}
程序运行结果如图2-31所示。
图2-31
① 该程序进行数学开方运算,sqrt(9)表示对9进行开方,结果为3。
② 保留两位小数,输出c的值为3.00。
(3)绝对值函数程序实例
绝对值函数程序实例1
编写并运行以下程序。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int a = abs(-1);
int b = abs(1);
cout << a << endl;
cout << b << endl;
return 0;
}
程序运行结果如图2-32所示。
图2-32
abs()函数返回整型数据的绝对值。
绝对值函数程序实例2
编写并运行以下程序。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
double a = fabs(-2.5);
double b = fabs(2.5);
printf("%.2lf\n", a);
printf("%.2lf\n", b);
return 0;
}
程序运行结果如图2-33所示。
图2-33
fabs()函数返回浮点型数据的绝对值。
(4)向上/向下取整程序实例
编写并运行以下程序。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
double a = ceil(2.5); //向上取整
double b = floor(2.5); //向下取整
cout << a << endl;
cout << b << endl;
return 0;
}
程序运行结果如图2-34所示。
图2-34
① ceil(x)
是向上取整函数,返回不小于实数x的最小整数。
② floor(x)
是向下取整函数,返回不大于实数x的最大整数。
ZZ1079:求两位整数各个位上的数字和
输入一个正整数a(正整数a的位数为两位10a
99),求a各个位上的数字之和。例如:a的值为35,它个位上的数字是5,十位上的数字是3。
因为:5 + 3 = 8,所以输出结果为:8。
a
a各个位上的数字之和。
24
6
(1)要求出一个两位数各个位上的和,就需要分别把个位数和十位数求出来。
(2)计算个位数的方法:一个数对10求余,余数就是这个数的个位值,例如24除以10的余数是4。
(3)计算十位数的方法:一个两位数对10进行整除,其结果就是这个数的十位值,例如24整除10的结果就等于2。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, m, n, s;
cin >> a; //输入一个两位数
m = a / 10; //算出该两位数的十位
n = a % 10; //算出该两位数的个位
s = m + n;
cout << s;
return 0;
}
程序运行结果如图2-35所示。
图2-35
ZZ1070:大写字母转小写字母
请将输入的大写字母转换为小写字母。
大写字母。
大写字母对应的小写字母。
B
b
通过大小写字母的ASCII码之间的差值变换输入的字符。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char a, b;
cin >> a;
b = a + 32;
cout << b;
return 0;
}
程序运行结果如图2-36所示。
图2-36
① 定义两个字符变量a、b。
② 输入一个字符,并存储到变量a。
③ 变量b等于a加上32。通过ASCII码表可以看出小写字母与大写字母之间相差32,例如a是97,A是65,b是98,B是66,它们对应的大小写字母之间都相差32。
④ 输出变量b,变量b就是a对应的小写字母,例如输入的是A,那么输出的就是a。
ZZ1080:求3个整数的平均值
输入3个整数a、b、c,求a、b、c的平均值,结果保留两位小数。
a b c。
a、b、c的平均值,保留两位小数。
2 3 5
3.33
ZZ1044:求字符ASCII码的和
求输入的任意两个字符的ASCII码之和。
a b(a和b是两个指定的字符)。
一个整数(整数为两个字符对应的ASCII码的和)。
y z
243
注
完成练习后,读者需要根据公众号提示进行作业提交,检测所写的程序是否正确。
ZZ1083:求a*b
输入两个整数a、b,求a*b的值。
a b (1<=a和b<=109)。
a*b的值。
1 2
2
ZZ1411:交换十位与个位上的数字
编写程序,输入一个两位数,交换十位与个位上的数字,并输出。
一个两位数。
一行,交换后十位与个位的数字,用空格隔开。
12
2 1
ZZ1084:计算成绩
牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是:
总成绩=作业成绩×20%+小测成绩×30%+期末考试成绩×50%
牛牛想知道,这门课程自己最终能得到多少分。
输入文件只有一行,包含3个非负整数A、B、C,分别表示小明的作业成绩、小测试成绩和期末考试成绩。相邻两个数之间用一个空格隔开,3项成绩满分都是100分。
A、B、C都是10的倍数。
输出文件只有1行,包含一个整数,即小明这门课程的总成绩,满分也是100分。
100 100 80
90
ZZ1043:求等差数列第n项
已知等差数列的第1项a1和第2项a2,求等差数列的第n项。a1、a2、n都是整数。
a1 a2 n(a1、a2、n均大于等于1,小于等于100 000 000)。
等差数列第n项的值。
1 2 4
4
ZZ1163:求圆柱的体积
已知圆柱底面的圆的直径为d,高为h。求该圆柱的体积(保留两位小数)。圆周率的取值为3.14。
d h(d表示圆柱底面圆的直径,h表示圆柱的高。d、h为实数)。
圆柱的体积(保留两位小数)。
4 8
100.48
注
完成作业后,读者需要根据公众号提示进行作业提交,检测所写的程序是否正确。