1516、倒序(程序文件名:inorder)
【问题描述】从键盘输入一个四位数,将其各位数字倒序输出。 int i; x=3.6;
【输入说明】输入一个四位数。 【输出说明】倒序输出。
【样例输入】1234 【样例输出】4321
1141. 自然数求和(程序文件名:sum)
题目说明:自然数求和:编一个程序,求从1至n(n<1000)的自然数的和。
输入说明:自然数n
输出说明:输出1到n的和 样例输入:3 样例输出:6
1536.累加求和
题目说明:编程将1-n之间(n<=10000)所有能被7整除的数累加并输出结果。 输入说明:输入n 输出说明:输出和
样例输入:10 样例输出:7
附录
一、需要记忆的英语 program 程序 include 包含
#include
using namespace std; 使用标准命名空间,有了它,cin、cout语句才能正常使用
int 整数 int a,b,c; a=5; //说明a、b、c三个整数变量
double 双精度实数 double a,b,c; a=4.5; //说明a、b、c三个实数变量
char 单个字符 char a,b; a='h'; //说明a、b两个字符变量
string 字符串 string a,b; a=\说明a、b两个字符串变量
main 主函数 int main(){ } 每个c++的程序都必须有一个主函数
cin 输入流 cin>>a>>b; 输入两个数据给a和b cout 输出流 cout<
return 返回 return 0; 向调用的函数返回一个值,这里返回的是0值
system(\系统暂停
学校练习网址:http://mail.bashu.cn:8080/bs_oj
强制类型转换。 #include
i=(int)x; //i值为3
cout<<″x=″< 复合的赋值运算符 在赋值符“=”之前加上其他运算符,可以构成复合的运算符。如果在“=”前加一个“+”运算符就成了复合运算符“+=”。例如,可以有 a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8) x%=3 等价于 x=x%3 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。 它的一般形式为 <变量> <赋值运算符> <表达式> 如“a=5”是一个赋值表达式。对赋值表达式求解的过程是:先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量。如下赋值表达式也正确: a=b=c=5 (赋值表达式值为5,a,b,c值均为5) 在面向过程的程序设计中,程序设计者必须指定计算机执行的具体步骤,程序设计者不仅要考虑程序要“做什么”,还要解决“怎么做”的问题,根据程序要“做什么”的要求,写出一个个语句,安排好它们的执行顺序。怎样设计这些步骤,怎样保证它的正确性和具有较高的效率,这就是算法需要解决的问题。 一个面向过程的程序应包括以下两方面内容: (1) 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。 (2) 对操作的描述。即操作步骤,也就是算法(algorithm)。对于面向过程的程序,可以用下面的公式表示: 程序=算法+数据结构 作为程序设计人员,必须认真考虑和设计数据结构和操作步骤(即算法)。 算法是处理问题的一系列的步骤。算法必须具体地指出在执行时每一步应当怎样做。 6 第二节 程序的基本结构 二、分支结构(选择结构) 分支结构程序设计,用到了逻辑判断,根据不同情况执行不同语句。分支结构是计算机智能化的体现。 关系运算和逻辑运算 往往要求根据某个指定的条件是否满足来决定执行的内容。例如,购物在1000元以下的打九五折,1000元及以上的打九折。 C++提供if语句来实现这种条件选择。如 if (amount<1000) tax=0.95; //amount代表购物总额,tax代表折扣 else tax=0.9; //若amount<1000,条件满足,辑表达式也由运算符和值构成,例如?||?运算符称为?逻辑或?,a || b表示a为真,或者b为真。换句话说,a和b只要有一个为真,a || b就为真;如果a和b都为真,则a || b也为真。 提示:if语句的条件是一个逻辑表达式,它的值可能为真,也可能为假。 如果a为真,则无论b的值如何,a || b均为真。换句话说,一旦发现a为真,就不必计算b的值。C++采取了这样的策略,称为短路(short-circuit)。 提示:C++语言中的逻辑运算符都是短路运算符。一旦能够确定整个表达式的值,就不再继续计算。 2、条件表达式 tax=0.95,否则tax=0.9 pay=amount*tax; //pay为实付款 上面if语句中的?amount<1000?实现的不是算术运算,而是关系运算。实际上是比较运算,将两个数据进行比较,判断比较的结果。?amount<1000?就是一个比较式,在高级语言中称为关系表达式,其中?>?是一个比较符,称为关系运算符。 同顺序结构的例题,加一条要求:如果无解,则输出?No answer?(不要引号)。 样例输入:10 16 样例输出:No answer 【分析】 设鸡有a只,兔有b只,则a+b=n,2a+4b=m,联立解得a=(4n-m)/2,b=n-a。在什么情况下此解?不算数?呢?首先,a和b都是整数;其次,a和b必须是非负的。可以通过下面的程序判断: int main(){ int a, b, n, m; cin>>n>>m; a = (4*n-m)/2; b = n-a; if(m % 2 == 1 || a < 0 || b < 0) cout<<\意为换行 else cout< 1、if语句格式 上面的程序用到了if语句,它的一般格式是: if(条件) 语句1; else 语句2; 注意语句1和语句2后面的分号,以及if后面的括号。?条件?是一个表达式,当该表达式的值为?真?时执行语句1,否则执行语句2。另外,?else语句2?这个部分是可以省略的。语句1和语句2前面的空行是为了让程序更加美观,并不是必需的,但强烈推荐使用。 提示:if语句的基本格式为:if(条件) 语句1; else 语句2。 换句话说,m%2==1 || a < 0 || b < 0是一个表达式,它的字面意思是?m是奇数,或者a小于0,或者b小于0?。这句话可能正确,也可能错误。因此这个表达式的值可能为真,也可能为假,取决于m、a和b的具体数值。 这样的表达式称为逻辑表达式。和算术表达式类似,逻 条件表达式主要是由关系运算符和逻辑运算符连接起来的式子。 1)关系表达式 关系运算符:(比较运算) < (小于) > (大于) <= (小于等于) >= (大于等于) = = (等于)!= (不等于) 例:判断a是否大于0:a>0 判断a和b是否相等:a==b int main(){ int a=10,b=20; cout<< (a>=b)< ?<<(a!=b)< cout<<(a*b<=a+b)<?<<(a*b==a+b)< 运行结果: 0 1 0 0 0 1 说明:条件表达式值为真时输出的数值为1,为假时数值为0; 字符以它们在ASCII码表上位置顺序来进行大小比较,排在后面的字母比排在前面的字母大,’b’大于’a’,数值大1 注意:==表示等于关系,=表示赋值号,初学者往往会犯错,提醒注意 2)逻辑表达式 逻辑运算符: &&(与);||(或);!(非); A && B: 只有A、B同时为真是 A &&B 才为真 A || B: A、B任意一个为真则A || B为真 !A: A为真时!A为假,A为假时!A为真 例:表示a为大于等于5小于等于10的数: a>=5 && a<=10 不能写为:10>=a>=5 3)运算的优先顺序 优先级:!>?&& >?|| 各种运算符优先级: !>算术运算符>关系运算符>逻辑运算符>赋值号 关于优先次序: ① 前4种关系运算符(<,<=,>,>=)的优先级别相同,后两种也相同。前4种高于后两种。例如,?>?优先于?==?。而?>?与? c>a+b 等效于 c>(a+b) a>b==c 等效于(a>b)==c 7 a==b 用关系运算符将两个表达式连接起来的式子,称为关系表达式。关系表达式的一般形式可以表示为 表达式 关系运算符 表达式 其中的?表达式?可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式。例如,下面都是合法的关系表达式: a>b, a+b>b+c,(a==3)>(b==5), ′a′<′b′, (4) a,b值同前,!a || b的值为1。 (5) 4 && 0 || 2 的值为1。 在C++中,整型数据可以出现在逻辑表达式中,在进行逻辑运算时,根据整型数据的值是0或非0,把它作为逻辑量假或真,然后参加逻辑运算。 通过这几个例子可以看出: 逻辑运算结果不是0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(?假?)或任何非0的数值(按?真?对待)。如果在一个表达式中的不同位置上出现(a>b)>(b 关系表达式的值是一个逻辑值,即?真?或?假?。例如,关系表达式?5==3?的值为?假?,?5>=0?的值为?真?。在C和C++中都用数值1代表?真?,用0代表?假?。 如果有以下赋值表达式: d=a>b 则d得到的值为1 f=a>b>c f得到的值为0 有时只用一个关系表达式还不能正确表示所指定的条件。 C++提供3种逻辑运算符: (1) && 逻辑与 (相当于其他语言中的AND) (2) || 逻辑或 (相当于其他语言中的OR) (3) ! 逻辑非 (相当于其他语言中的NOT) 逻辑运算举例如下: a && b 若a,b为真,则a && b为真。 a||b 若a,b之一为真,则a||b为真。 !a 若a为真,则!a为假。 在一个逻辑表达式中如果包含多个逻辑运算符,按以下的优先次序: (1) !(非)→ &&(与)→ ?(或),即?!?为三者中最高的。 (2) 逻辑运算符中的?&&?和?||?低于关系运算符,?!?高于算术运算符。 例如: (a>b) && (x>y) 可写成 a>b && x>y (a==b) || (x==y) 可写成 a==b || x==y (!a) || (a>b) 可写成 !a || a>b 将两个关系表达式用逻辑运算符连接起来就成为一个逻辑表达式,上面几个式子就是逻辑表达式。逻辑表达式的一般形式可以表示为 表达式 逻辑运算符 表达式 逻辑表达式的值是一个逻辑量?真?或?假?。前面已说明,在给出逻辑运算结果时,以数值1代表?真?,以0代表?假?,但在判断一个逻辑量是否为?真?时,采取的标准是: 如果其值是0就认为是?假?,如果其值是非0就认为是?真?。例如: (1) 若a=4,则!a的值为0。因为a的值为非0,被认作?真?,对它进行?非?运算,得?假?,?假?以0代表。 (2) 若a=4,b=5,则a && b的值为1。因为a和b均为非0,被认为是?真? 。 (3) a,b值同前,a-b||a+b的值为1。因为a-b和a+b的值都为非零值。 数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象。 实际上,逻辑运算符两侧的表达式不但可以是关系表达式或整数(0和非0),也可以是任何类型的数据,如字符型、浮点型或指针型等。系统最终以0和非0来判定它们属于?真?或?假?。例如′c ′ && ′d′的值为1。 例:三整数排序 输入3个整数,从小到大排序后输出。 样例输入:20 7 33 样例输出:7 20 33 【分析】 a、b、c 3个数一共只有6种可能的顺序:a b c、a c b、b a c、b c a、c a b、c b a,所以最简单的思路是使用6条if语句。 程序:三整数排序(1)(错误) int main(){ int a, b, c; cin>>a>>b>>c; if(a上述程序看上去没有错误,而且能通过题目中给出的样例,但可惜有缺陷:输入1 1 1将得不到任何输出!这个例子告诉我们:即使通过了题目中给出的样例,程序仍然可能存在问题。 提示:算法竞赛的目标是编程对任意输入均得到正确的结果,而不仅是样例数据。 稍微修改一下:把所有的小于符号? 一种解决方案是人为地让6种情况没有交叉:把所有的if改成else if。 程序 三整数排序(2) int main(){ int a, b, c, d, e, f; cin>>a>>b>>c; if(a<=b && b<=c){d=a;e=b;f=c;} else if(a<=c&&c<=b){d=a;e=c;f=b;} else if(b<=a&&a<=c){d=b;e=a;f=c;} else if(b<=c&&c<=a){d=b;e=c;f=a;} else if(c<=a&&a<=b){d=c;e=a;f=b;} else if(c<=b&&b<=a){d=c;e=b;f=a;} 8 cout< 排序2仍然采用变量说明、输入、计算、输出四个部分,顺序即可。 一个很自然的问题产生了:其他检查顺序是否也可以呢?例如先(a,b),然后(b,c),最后(a,c)?这个问题留给上机实验。 计算部分由if语句和赋值语句组成。排序1也可以写成这种形式,请同学们改写一下。 熟练掌握C++的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来表示一个复杂的条件。例如,要判别某一年(year)是否为闰年。闰年的条件是符合下面两者之一: ①能被4整除,但不能被100整除。②能被100整除,又能被400整除。例如2004、 2000年是闰年,2005、 2100年不是闰年。 可以用一个逻辑表达式来表示: (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 当给定year为某一整数值时,如果上述表达式值为真(1),则year为闰年;否则year为非闰年。可以加一个?!?用来判别非闰年: !((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) 若表达式值为真(1),year为非闰年。也可以用下面的逻辑表达式判别非闰年: (year % 4 != 0) || (year % 100 == 0 && year % 400 !=0) 若表达式值为真,year为非闰年。请注意表达式中右面的括号内的不同运算符(%,!,&&,==)的运算优先次序。 提醒: 条件满足或不满足时如有多条语句需要运行,则要用{ }将他们括起来,用{ }括起来的一组语句称为复合语句,if语句格式可以改为 if(条件) { 语句1; … ; 语句n; } else { 语句1; … ; 语句n; } 如果没有加大括号,电脑会认为条件后只有一句话 上面例题最后一条语句还可以简化成单独的?else?(想一想,为什么),不过,幸好程序正确了。 提示:如果有多个并列、情况不交叉的条件需要一一处理,可以用else if语句。 另一种思路是把a、b、c这3个变量本身改成a≤b≤c的形式。首先检查a和b的值,如果a>b,则交换a和b(利用简单算法中的三变量交换法);接下来检查a和c,最后检查b和c,程序如下: 程序 三整数排序(3) int main(){ int a, b, c, t; cin>>a>>b>>c; if(a > b) { t = a; a = b; b = t; } if(a > c) { t = a; a = c; c = t; } if(b > c) { t = b; b = c; c = t; } cout< 为什么这样做是对的呢?因为经过第一次检查以后,必然有a≤b,而第二次检查以后a≤c。由于第二次检查以后a的值不会变大,所以a≤b依然成立。换句话说,a已经是3个数中的最小值。接下来只需检查b和c的 注意上面的程序中唯一的新东西:花括号。前面讲过,if语句中有一个?语句1?和可选的?语句2?,且都要以分号结尾。有一种特殊的?语句?是由花括号括起来的多条语句。这多条语句可以作为一个整体,充当if语句中的?语句1?或?语句2?,且后面不需要加分号。当然,当if语句的条件满足时,这些语句依然会按顺序逐条执行,和普通的顺序结构一样。 提示:可以用花括号把若干条语句组合成一个整体。这些语句仍然按顺序执行。 最后一种思路再次利用了?问题求解?这一目标——它实际上并没有真的进行排序:求出了最小值和最大值,中间值是可以计算出来的。 程序 三整数排序(4) int main(){ int a, b, c, x, y, z; cin>>a>>b>>c; x = a; if(b < x) x = b; if(c < x) x = c; z = a; if(b > z) z = b; if(c > z) z = c; y = a + b + c - x - z; cout< 注意程序中包含的?当前最小值?x和?当前最大值?z。它们都初始化为a,但是随着?比较?操作的进行而慢慢更新,最后变成真正的最小值和最大值。这个技巧极为实用。 提示:在难以一次性求出最后结果时,可以用变量储存?临时结果?,从而逐步更新。 例3.6 求三角形的面积。 #include #include double a,b,c; cout<<″please enter a,b,c:″; cin>>a>>b>>c; if (a+b>c && b+c>a && c+a>b) { //复合语句开始 double s,area; //在复合语句内定义变量 s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); cout<<″area=″< } //复合语句结束 else cout<<″it is not a trilateral!″< 运行情况如下: please enter a,b,c:2.45 3.67 4.89↙ 9 area=4.3565 60~69 <60 例3.7 输入一个字符,判别它是否为大写字母,如果是, error 将它转换成小写字母;如果不是,不转换。然后输出最因此,应该在执行一个case子句后,使流程跳出switch后得到的字符。 结构,即终止switch语句的执行。可以用一个break#include } 最后一个子句(default)可以不加break语句。如果grade的值为′B′,则只输出?70~84?。 在case子句中虽然包含一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case子句中所有的执行语句。 (6) 多个case可以共用一组执行语句,如 ...? case ′A′: case ′B′: case ′C′: cout<<″>60\n″;break; ... 当grade的值为′A′、′B′或′C′时都执行同一组语句。 例3.9 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下: s<250km 没有折扣 250≤s<500 2%折扣 500≤s<1000 5%折扣 1000≤s<2000 8%折扣 2000≤s<3000 10%折扣 3000≤s 15%折扣 设每公里每吨货物的基本运费为p(price的缩写),货物重为w(wright的缩写),距离为s,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为 f = p * w * s * (1 - d) 据此写出程序如下: #include 10