《Dev-C++基础教程.docx》由会员分享,可在线阅读,更多相关《Dev-C++基础教程.docx(222页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Dev-C+基础教程习题解答庄燕文 王素琴 王碧艳 编著前言这是一本与Dev-C+基础教程配套的习题解析。本书主要针对中小学生学习了DEV-C+ 语法、语义、常用算法后,引导学生用程序设计的思维和逻辑解决问题。本书的习题从题意出发,分析解题的思路和算法,然后给出参考程序,重点帮助读者理解算法原理,教会读者很多实用的编程技巧,培养良好的编程习惯。本书的习题内容丰富,读者可以自己动手实践编写程序,然后和题解中的方法比较,希望读者在理解该书题解的同时,能锐意开掘,探本索源,找到更好的解答办法,写出更高效的程序。该习题涵盖中学生信息学奥林匹克竞赛中的很多基础算法,可以做为中小学生学习程序设计的入门习题
2、,也可以做为本科生初学程序设计的课后习题。1Dev-C+基础教程 习题解析目录第1章 Dev-C+入门第2章 Dev-C+语言简介第3章 顺序结构第4章 选择结构第5章 循环结构第6章 函数第7章 数组第8章 指针第9章 字符串第10章 文件第11章 输入与输出流第12章 链表第1章 Dev-C+入门1.解析 该题考察学生用Dev-C+编写简单的程序和C+的基本语法。参考程序#include /预编译命令 using namespace std; /使用名字空间 const float PI=3.14; /定义一个常数变量pi int main () /主程序 float s,r,c; cou
3、tplease input radius :r; / 输入半径 s=PI*r*r; / 计算面积 c= 2*PI*r; / 计算周长 couts=sendl; coutc=cendl; system(pause); return 0; 输出结果please input radius: / 显示5 / 用户输入,表示圆的半径s = 78.5 / 显示面积c = 31.4 / 显示周长2.问题分析 凡是数学中已经定义的字母,在程序设计中一律沿用。如用a表示边长,用s表示面积,用c表示周长。算法设计 s=a*a,c=4*a.参考程序#include using namespace std;int m
4、ain() float a,s,c; couta; s=a*a; c=4*a; couts=sendl; coutc=cendl; system(pause); return 0;第2章 Dev-C+语言简介1.解析 C+ 标识符命名规则:(1)必须由一个字母(az,AZ)或下划线(_)开头(2)标识符的其它部分可以用字母,下划线或数字(09)组成(3)区分大小写(4) 不能与C+关键字相同参考答案合法标识符:worth,begin,a34非法标识符:false,x*y,$we,char,set2.(1)31/(5%2)解析 这是一个算术表达式。分析其计算结果时首先要掌握两点: 算术运算符的优
5、先级。C+的算术运算符中,()的优先级最高,*、/、%的优先级比+、高,且它们都是从左到右结合的 运算符两侧类型不同的运算数,在运算中给出类型转换的规律。运算所得结果的类型与运算数类型一致。在第一题中,括号的优先级最高,先求5%2 = 1,原表达式变成31/1, 根据规定的除法运算规律,所得结果的类型与运算数类型一致,因为”/”号两侧都是整型,因此结果也应该整型。求得31;答案31(2)17-4*3/7解析 按照优先级的高低,*的优先级比-高,先算*法,4*3=12,原表达式变成17 12/7。/的优先级比-高,再算12/7,根据规定的除法运算规律,所得结果的类型与运算数类型一致,因为”/”号
6、两侧都是整型,因此结果也应该整型。计算得12/7 = 1,原表达式变成17 1,最后算17-1得16答案16(3)31.0/(5%2)解析 括号的优先级最高,先算括号里面的,5%2 =1,原表达式变成31.0/1, 当运算符两侧为一个为整型数,另一个为实型数时,系统首先把着整型数转换为实型数,使运算符两边的类型取得一致然后进行运算,经转换后表达式为31.0/1.0,最终结果是31.0答案 31.0(4)17-4*3.0/7解析 由于*的运算级高于-,先算4*3=12.0,原表达式变成17 12.0/7,/的优先级比-高,计算12.0/7,当运算符两侧为一个为整型数,另一个为实型数时,系统首先把
7、着整型数转换为实型数,使运算符两边的类型取得一致然后进行运算,12.0/7.0=1.71429,原表达式变成17-1.71429,当运算符两侧为一个为整型数,另一个为实型数时,系统首先把着整型数转换为实型数,使运算符两边的类型取得一致然后进行运算,经转换后表达式为17.00000-1.71429,最终结果是15.2857答案 15.28573. (1)解析 在初学者阶段,读者可能只接触到MAIN(主)函数,但作为基础知识,读者应该明确且牢记:c+程序是由函数组成的。每个c+语言的源程序可以包含多个函数,但只能有一个主函数。因此选A是片面的。在c+程序中不存在“过程”这一程序结构。在正确的程序设
8、计中,要求对源程序有详尽的注释,以便于阅读和软件的维护:c+程序中的注释行,由/*开头,由*/结束:”/”和”*”必须紧接着,在这两个字符之间不得插入空格。在选项D中“/“和”*”之间都插有空格,很多初学者常犯这样的错误。 以上分析可知,本题的正确答案是B。(2) 解析 将数学表达式写出c+语言表达式是编写c+程序的基本功之一。此例中给出了一个代数式,用c+语言表示应该是一个算术表达式。在书写算术表达式时,不允许使用分数的形式,只能按运算的先后顺序写在一行上,必须要添加圆括号以保证运算的正确性。由选项可知,同一个数学算式可以写成不同的c+语言表达式。选项A中,由于除号后的c*d两侧未加圆括号,
9、按照运算规则,将先算出(a*b)的乘积,然后被c除,计算的结果再乘上d。它所描述的代数式为,与原算式不符,显然是错误的。选项B中,按优先级应当先做(C*D)运算,然后将它去除a*b的乘积,因此是正确的。 选项C中,按从左到右的顺序,先做a/c的运算,描述的代数式为,与原式等效。 选项D中,按从左到右的顺序,先做a*b然后除c,再除d。运算的过程相当于代数式,因此与原算式等效。题目要求选出不正确的,所以本题的答案是A。(3)解析 C+语言中的表达式种类较多,本章中涉及的就有算术表达式、强制类型转换表达式、赋值表达式以及逗号表达式等。读者应该记清它们各自的特征。本例中选项A末尾有一个分号,从而构成
10、了赋值语句而不是表达式。选项B是由2个表达式构成的逗号表达式:第1个是赋值表达式、第2个是由自加运算符构成的表达式,语法上没有错误。选项C中使用了类型说明符int ,若作为强制类型转换表达式,int 两侧必须带有圆括号,这里没有括号是不合法的。选项D从形式上看似乎是一个赋值表达式,因为c+语言中允许诸如a=b=2这类的赋值表达式。但c+语言也明确规定:赋值运算符(=)左侧只能是变量不允许是常量和算术表达式。选项D的a+7=c+d在赋值号左侧出现了算术表达式,因此是不合法的。本题的正确答案为B。4. (1) 解析 C+语言规定:可以在定义的同时给变量赋初值。其形式为:类型名 变量名=数值,变量名
11、=数值,按此格式可得本例题所要求的定义语句; int a=0,b=0;需要提醒读者的是:对于定义时没有置初值的变量,其值是不确定的随机数,使用时特别加以注意。答案 int a = 0,b = 0;(2)解析 这是一个算术表达式。分析其计算结果时首先要掌握两点:算术运算符的优先级。运算符两侧类型不同的运算数,在运算中给出类型转换的规律。本例中涉及了加、除以及求余三种运算。按运算的优先级先计算1/2,根据规定除法运算所得结果的类型与运算数类型一致,因为”/”号两侧都是整型,因此结果也应该整型。故1/2的结果不是0.5而应舍去小数部分得到结果0;按优先级,接下来做求余运算56%10,56除10以后的
12、余数是6,因此所得结果为整数6,现在表达式变成了3.5+0+6。按+号的综合性,应该自左至右进行运算,因此先做3.5+0,当运算符两侧为一个为整型数,另一个为实型数时,系统首先把着整型数转换为实型数,使运算符两边的类型取得一致然后进行运算,如3.5+0+6,则首先把0转换为实型数0.0,然后进行运算,得3.5;接着进行3.5+6的运算,经转换后表达式为3.5+6.0,最终结果是9.5。(3)解析 在c+语言中,凡是双目运算符都可以和赋值运算符一起组成复合运算符。在赋值表达式中可以包含这些复合运算符,且运算符按“自右至左”的组合顺序进行。因此,表达式k-=k-=k+1的求解过程为:先计算最右边的
13、“k-=k+1”,相当于k=k-(k+1),把7带入表达式中:k=7-(7+1),结果把-1赋给了k。再计算“k+=-1”,相当于k=k+(-1),把当前k的值(-1)带入表达式中,k=-1+(-1),最后把-2赋给了k。故本题的正确答案是-2。(4)解析 先做a=a-a*a;把12带入得到a=12-12*12,a=-132.再a=a+(-132),a=-132-132=-264故本题的正确答案是D。5. (1) 解析 考察C+的基本语法。该题主要有两点问题。 main函数是C+程序的主函数,函数名称后面要有(),函数名称前面有类型说明符int。完整的形式应为int main() cout 插
14、入符的方向有问题,应该为cout v;答案 #include usingnamespace std;int main /改成int main()int a,b,c,v; a=2,b=3,c=4v=a*b*c;coutv; /改成cout v;system(“pause”);return 0;(2)解析 考察C+的基本语法。该题主要有两点需要注意的。 C+的输入输出流头文件中规定了cin,cout是小写形式,若改成大写,系统会默认成变量处理,会出现语法错误 C+变量是区分大小写的,所以使用时要多小心。不然会出现没有定义的错误。答案#include using namespace std;int
15、main()float L,W,H,V;coutLWH;/改为cin L WHv=L*W*H;/改为V = L *W *Hcoutvendl;/改为cout V endl;system(“pause”);return 0;(3) 解析 考察C+的const常量。const常量必须在第一次声明时就初始化,用变量或常量初始化都可以,只是初始化一次以后它的值就不能再改变了。若要改变它的值,使用普通变量即可。答案int main()const int w=5;/const常量不能修改,改为int w = 5float a;a=2*w;w+;coutwaendl;system(“pause”);retu
16、rn 0; 第3章 顺序结构1. 解析 考察变量间的交换,算法如下:(1)开辟工作单元。(2)A;AB;BC;CD;D。交换过程读者可以参考教材第三章例3-1中图3-3。参考程序#include /预编译命令using namespace std; /使用名字空间int main() /主函数 int a = 89, b = 76, c = 95, d = 62, e; /变量申明和初始化cout a= a b = b c = c d = d endl; /输出变量的初始值 e = a; a = b; b = c; c = d; d = e;cout a= a b = b c = c d =
17、d endl; /输出移动后变量的值 system(pause); return 0;输出结果a = 89 b = 76 c = 95 d = 62 /交换前的值a = 76 b = 95 c = 62 d = 89 /交换后的值2. 解析 本题主要考察变量的格式化输出。C+标准库提供的支持格式输出的操作符函数有控制输出宽度、填充字符和精度的方法。需要注意的是在使用这些操作符函数时需要包含头文件iomanip。这里给读者介绍下输出宽度的函数:setw(宽度值)和设置输出填充字符的函数:setfill (填充字符)。输出宽度的函数:setw(宽度值),如输出cout setw(5) 3 endl
18、;就表示将整数3以宽度5的格式输出,当需要的宽度小于5时,左补0。这样就实现了在整数5左边输出4个空格的目的。运行结果为5。设置输出填充字符的函数:setfill (填充字符)此函数常与setw()函数联合使用,达到向不满设置输出宽度的空间填入指定字符的目的,不设置则填充空格。coutsetw(5)setfill(#)123endl,指将整数123以宽度5的格式输出,运行结果为#123。读者可以参考第三章的例题3-3,3-4。这里列举直接输出空格和使用宽度函数输出空格的方法。参考程序方法一:#include /预编译命令using namespace std; /使用名字空间int main
19、() /主函数 int a = 1,b = 2,c = 3,d = 4,e = 5; /变量定义和初始化couta b c d eendl; /直接输出空格 system(pause); return 0; 方法二:#include /预编译命令#include /格式化输出函数的头文件using namespace std; /使用名字空间int main () /主函数 int a=1,b=2,c=3,d=4,e=5; /变量定义和初始化coutsetw(1)asetw(3)bsetw(4)csetw(6)dsetw(10)eendl; /使用输出宽度函数输出空格 system(pause
20、); return 0; 输出结果 12345 /显示结果3. 解析 本题考察格式化输入输出,本题采用宽度函数设置输出宽度。读者可以参考本章习题的第2小题。参考程序#include /预编译命令#include /格式化输出函数的头文件using namespace std; /使用名字空间int main () /主函数 int a,b,c; /变量申明 cout “please input the value a and b:”ab; /输入a,b coutsetw(8) a endl; / 设置a输出的格式 cout+ setw(7)bendl; / 设置+输出的位置 cout-endl
21、; /输出“-” c = a+b; /计算a+b的值赋给c coutsetw(8)cendl; /设置输出的格式 system(pause); return 0; 输出结果please input the value a and b: /显示4587 2124 /用户输入 4587 /显示加法结果+ 2124- 67664. 解析 本题主要考察输出精度,宽度等格式化输出。设置输出精度的函数:setprecision(有效位数)。此函数用来指明显示浮点型数据的有效位数,可用的最后一位的值为是四舍五入的值。如coutsetprecision(3)3.333333endl;运行结果为3.33。本题将
22、输出精度和输出宽度结合就可以实现对齐的目的,读者可以参考第三章例题3-6。参考程序#include /预编译命令#include /格式化输出函数的头文件 using namespace std; /使用名字空间int main () /主函数 float a, b, e; /变量申明 int c, d; /变量申明 cin a b c d; /输入变量cout setiosflags(ios:fixed) setw(8) setprecision(c) a endl;cout setiosflags(ios:fixed) + setw(8 - c + d - 1) setprecision(
23、d) b endl;/以上两行格式化输出a,+,b cout - endl; / 输出“-” e = a + b; /计算e的值 cout setw(8) e endl; /格式化输出e system(pause); return 0;输出结果1.2345 2.3456 3 3 /输入 1.235+ 2.346 /输出- 3.5805. 解析 本题主要考察小时和分钟的转化,转换方式如下:1小时= 60分钟,若要用分钟a表示m小时n分钟,最后的结果a=(m%24)*60+n。若要用小时和分钟表示分钟a,则小时m = a / 60, 分钟n = a m*60。可以参考第三章例题3-10参考程序#i
24、nclude /预编译命令using namespace std; /使用名字空间int main() /主函数 int a,b; /变量申明,a代表小时,b代表分钟cin a b; /输入变量a,bif(a = 24)a = a % 24; /过24点记为0. cout a * 60 + b endl; /输出用分钟表示的结果 system(pause); return 0;输出结果5 34 /输入小时和分钟334 /输出分钟表示的结果6. 解析 本题主要考察华氏温度和摄氏温度的转换。按照转换公式是:C=(5/9)(F-32)进行转换,这里需要注意的一点是,这里的5/9中/两边均是整数,如果
25、将其中之一从整型数化为实型数的话,计算的结果会是0。若将5转化为5.0,原表达式变成C = (5.0/9)(F-32)。计算5.0/9时,运算符两侧为一个为整型数,另一个为实型数时,系统首先把着整型数转换为实型数,使运算符两边的类型取得一致然后进行运算。这样就能得到正确的转换结果。参考程序#include /预编译命令using namespace std; /使用名字空间int main() /主函数 float a,b,c,d,e; /变量申明 cin a b c d e; /输入转换前的变量值cout (float)(5.0/9) *(a - 32) (float)(5.0/9) * (
26、b - 32) (float)(5.0/9) * (c - 32) (float)(5.0/9) *(d - 32) (float)(5.0/9) *(e - 32) endl; /输出转换后的变量值 system(pause); return 0;输出结果-10 0 10 37 100/输入的华氏温度-23.3333 -17.7778 -12.2222 2.77778 37.7778/输出的摄氏温度第4章 选择结构1.解析 该题主要考察if-else来比较变量的大小的方法。参考教材第四章的例4-2,例4-3,这里介绍四种方法。参考程序方法一:逐层判断,这种方法可以锻炼自己的逻辑思维的能力。参
27、考程序如下:#include /预编译命令using namespace std; /使用名字空间int main() /主函数 float a,b,c; /变量申明 cinabc; /输入变量值 if (ab) /比较求的中间值 if (ac) if(bc) coutbendl; else coutcendl; else coutac) if(ac)cout aendl; else coutcendl; else coutbendl; system(pause); return 0; 方法二:假设变量a中存放这些数中最大的值。如不是就交换,这样就保证变量a中存放的是最大值。只要比较b和c,找
28、出他们中的较大数值即可。参考程序如下:#include /预编译命令using namespace std; /使用名字空间int main() /主函数 float a,b,c,d; /变量申明 cinabc; /输入变量值 if(ba) d=a;a=b;b=d; if(ca) d=c;c=a;a=d; /以上四行表示用a存放变量最大值 if(bc) coutbendl; else coutcendl; /以上两行表示输出中间值 system(pause); return 0; 方法三:假设b是之间的数,可能的所有情况。在考虑a是中间数的所有情况,最后考虑c是中间数的所有情况。参考程序如下:
29、#include /预编译命令using namespace std; /使用名字空间int main() /主函数 float a,b,c; /变量申明 cinabc; /输入变量值 if(ab & bc) coutbb & ba) coutba & ac) coutaa & ab) coutac & cb) coutcc & ca) coutc0) coutbb & bc) coutbb & ba) coutbendl;参考程序如下:#include /预编译命令using namespace std; /使用名字空间int main() /主函数 float a,b,c; /变量申明 c
30、inabc; /输入变量值 if(a-b)*(b-c)0)coutb0)coutaendl; /输出中间值 else coutcendl; /输出中间值 system(pause); return 0; 求最大值、最小值的方法同学们可以按照这四种思路编写程序。输出结果2.3 23.4 3.4 /输入的三个实数3.4 /输出的中间值2.解析 该题主要考察一元二次方程求根需注意的地方,考察学生思维的严密性。要注意的地方是:(1)需分别讨论系数a为0和不为0的情况,利用a可以区分该方程是一元一次方程还是一元二次方程。(2)判别式b*b-4*a*c计算出来后赋值给一个变量,这样引用的时候就不需要重新计
31、算,减少了计算时间。利用b*b-4*a*c可以判断该方程有没有实根。参考程序#include /预编译命令#include /加入求平方根函数的头文件using namespace std; /使用名字空间int main() /主函数 float a,b,c; /变量申明,分别表示方程的三个参数 float x1,x2; /变量申明,分别表示方程的两根 cin a b c; /输入变量a,b,c float d = b*b - 4 * a * c; /求判别式的值 if(a = 0) /该方程为一元一次方程 cout 此方程为一元一次方程 endl; cout x1 = x2 = = 0) /该方程为一元二次方程 cout x1 = (-b + sqrt(d) / (2 * a) x2 = (-b - sqrt(d) / (2 * a) endl; else cout 此方程没有实根 关系运算符逻辑运算符,(1) a为真,!a为假,所以&操作结果为假;(2)a&b为假,!(a&b)为真,故整体表达式为真,(3) a为真,!a为假,所以&操作结果为假,(4)=左边得1,右边也是1,故等号成立。答案 (2),(4)4.解析 该题考察一种多路径分支控制语句。在
限制150内