C 概念基础讲解1 下载本文

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 //使用数学函数时要包含头文件cmath using namespace std; int main( ) {

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 语句来达到此目的。将上面的switch结构改写如下: using namespace std; switch(grade) int main( ) {case ′A′: cout<<″85~100\n″;break; { case ′B′: cout<<″70~84\n″;break; char ch; case ′C′: cout<<″60~69\n″;break; cin>>ch; case ′D′: cout<<″<60\n″;break; ch=(ch>=′A′ && ch<=′Z′)?(ch+32):ch; default : cout<<″error\n″;break; //判别ch是否大写字母,是则转换 cout<

} 最后一个子句(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 using namespace std; int main( ) {int c,s; float p,w,d,f; cout<<″please enter p,w,s:″; cin>>p>>w>>s; if(s>=3000) c=12; else c=s/250; switch (c) { case 0:d=0;break; case 1:d=2;break; case 2: case 3:d=5;break; case 4: case 5: case 6:

10

case 7:d=8;break; case 8: case 9: case 10:

case 11:d=10;break; case 12:d=15;break; }

f=p*w*s*(1-d/100.0);

cout<<″freight=″<

运行情况如下:

please enter p,w,s:100 20 300↙ freight=588000

练习(分支)

一、选择

1、下列运算符中,优先级最低的是 A.<= B.!= C.&& D.||

2、下列运算符对中,优先级相同的是 A.+=,*= B.!,&& C.&,| D.>>,==

3、已知 int a=5;计算a-=a*=a+=a/a后,变量a的值是 A.0 B.1 C.2 D.3

4、下列关于表达式的描述中,错误的是

A.相同运算符组成的表达式的计算顺序都是从左到右的 B.任何一个合法的表达式都应该有确定的值和类型

C.关系表达式和逻辑表达式的值是逻辑值, 用1或0表示 D.逗号表达式的值和类型取决于组成该表达式的最后一个操作数的值和类型

5、已知 int i,j,k,a;i=j=k=0;a=10,运行下段程序后,a的值是 if(!i) ++a; else if(j); if(k) a=5; else a=8;

A.10 B.11 C.5 D.8

二、看程序写结果。

int main(){//题9 int a; cin>>a;

if (a%2==0) cout<

输入:5

int main(){//题10 int a,b,c;

cin>>a>>b>>c;

if (a

cout<

输入:4 9 7

int main() {//noip2005-p1

int a, b; cin>>a;

b = (a * (a * a)) + 1; if (b%3 == 0) b = b / 3; if (b%5 == 0) b = b / 5; if (b%7 == 0) b = b / 7; if (b%9 == 0) b = b / 9; if (b == 0) b = b / 11; if (b == 0) b = b / 13; if (b == 0) b = b / 15; cout<<(100*a-b) / 2; }

输入:10

int main(){ int a,b; a=b=1;

if (b!=0) a=10; cout<

cout<

三、专项编程练习:顺序结构

行驶了多远(程序文件名:s)

【问题描述】一辆汽车在公路上行驶的速度为 V m/s ,当行驶了t秒后,求小汽车行驶的路程S是多少米?已知v和 t,求s。【样例输入】2 9 【样例输出】18

矩形周长和面积(程序文件名:rec)

【问题描述】输入一个矩形的长和宽,求它的周长和面积。 【样例输入】9 2 【样例输出】22 18

7、阿基米德数字(程序文件名:arch)

【问题描述】所谓?阿基米德特性?是这样的一条性质:对任意两个整数a、b,保证b>a>0,总存在整数m,使得a*m>b 。 请编写一个程序,对输入的a、b,输出最小的m。 【样例输入】2 9 【样例输出】5

作业本问题(程序文件名:exercise)

【问题描述】四年级的时候,老师在课堂上出了一道题:小华和小青都有一些作业本。如果小华给小青a本,两个人的作业本就一样多;如果小青给小华b本,小华的作业本就是小青的c倍,问小华和小青共有多少个作业本。

【输入格式】输入为一行,依次为a、b、c三个整数 【输出格式】输出小华和小青一共有的作业本数量。 【样例输入】3 2 3 【样例输出】20

【数据范围】输入三个数为大于等于0和小于等于10000的整数

(二)选择结构

1518、求分段函数的值(程序文件名:func)

11

【问题描述】编程求解数学中的分段函数。 x+1 (当x>0) y=f(x)= 0 (当x=0) x-1 (当x<0)

【输入说明】输入一行,只有一个整数x(-30000<=x<=30000)。 【输出说明】输出只有一行,包括1个整数(即y)。 【样例输入】3 【样例输出】4

1520.判断一元二次方程有无实根 题目说明:在方程 Ax^2+Bx+C=0 中,任意输入系数A,B,C,(-1000 <= A,B,C <=1000)m判断有无实数根,如有实根则打印“YES”;

1527、发放奖金(程序文件名:bonus)

【问题描述】某车间按工人加工零件的数量发放奖金,奖金分为五个等级:每月加工零件数N < 100者奖金为10元;100 < = N < 110者奖金为30元;110 < = N <120 者奖金为50元;120 < = N <130 者奖金为70元;N > 130者奖金为80元。 请编程,由键盘输入加工零件数量,显示应发奖金数。 【输入说明】输入加工零件数量。 【输出说明】输出应发奖金数。 【样例输入】85 【样例输出】10

无实根则打印“NO SOLUTION”。(B*B-4*A*C的值>=0则表示有实根,<0表示无实根)

输入说明:输入只有一行,包括3个整数。 输出说明:输出只有一行。 样例输入:1 2 0 样例输出:YES

1521、行礼托运价格(程序文件名:price)

【问题描述】某车站行李托运收费标准是:10公斤或10公斤以下,收费2.5元,超过10公斤的行李,按每超过1公斤增加1.5元进行收费。 试编一程序,输入行李的重量,算出托运费。 【输入说明】输入只有一个数,表示行李的重量(<=10000)。 【输出说明】输出只有一行,包括1个数(保留两位小数)。 【样例输入】10 【样例输出】2.50

1522、判断成绩等级(程序文件名:score) 【问题描述】输入某学生成绩(0<=成绩<=100),如果成绩在86分及86分以上则输出?VERY GOOD? ,如果在60到85之间的则输出?GOOD?,小于60的则输出?BAD?。 【输入说明】输入1个数,表示成绩。 【输出说明】输出只有一行。 【样例输入】80 【样例输出】GOOD

1523、求三个数的最大数(程序文件名:max3)

【问题描述】已知有三个不等的数(均小于10000),将其中的最大数找出来。

【输入说明】输入3个整数,之间用一个空格分开。 【输出说明】输出只有一个整数。 【样例输入】1 5 8 【样例输出】8

1524、求三个数的大小顺序(程序文件名:sequence3)

【问题描述】输入三个数(都小于10000),按由大到小顺序打印出来。

【输入说明】输入3个整数。

【输出说明】输出3个整数,之间用空格隔开。 【样例输入】1 2 3 【样例输出】3 2 1

1525、判断某年某月的天数(程序文件名:days) 【问题描述】输入年,月,然后告诉该月有多少天。 【输入说明】输入2个整数,之间用一个空格分开。 【输出说明】输出1个整数。 【样例输入】2000 2 【样例输出】29

5、打折的电池(程序文件名:batt)

【问题描述】信和超市里卖电池,每个电池a角钱,若数量超过b个,则可打c折。根据输入的电池个数d输出应付的金额。 【输入说明】输入4个数,分别表示a,b,c,d 【输出说明】输出一个数据,表示应付的金额。(保留一位小数) 【样例输入】8 10 7.5 12 【样例输出】72.0

6、求最小值(程序文件名:min)

【问题描述】输入四个整数,输出其中的最小数。 【样例输入】2 5 1 9 【样例输出】1

8、判断回文数(程序文件名:palin)

【问题描述】我们将左右对称的自然数称为回文数,如4114,输入一个四位数,如果是回文数则输出yes,否则输出no 【样例输入】4114 【样例输出】yes

1529、模拟计算器(存储文件名:calc)

【问题描述】津津这几天非常高兴,因为放寒假了,也因为有机会接触编程魔法了。几天的时间津津就会编写很多程序了,现在津津正准备编写一个模拟计算器,你能帮助她吗?这个模拟计算机只需要实现对两个实数进行加(+)、减(-)、乘(*)、除(/)四种运算的功能。

【输入说明】输入包括二行数据,第一行数据为进行运算的两个实数,中间用空格隔开,第二行只有一个运算符。

【输出说明】输出运算结果(运算结果保留一位小数,前面不留空格),当除数为0时,运算结果为error。 【样例输入】9 8 + 【样例输出】17.0

12