资源描述
高2015级信息学竞赛培训资料
程序设计讲稿4
本讲涉及的单词:
1、if 如果 2、else 否则 3、switch 开关
4、case 案例、事例 5、default 缺省、默认 6、break 打断
一、关系运算符及其优先级
1、关系运算符:
程序中经常需要比较两个量的大小关系,以决定程序的下一步工作,比较两个量的大小关系的运算符称为关系运算符,C/C++中有以下关系运算符:
> 大于
< 小于
== 等于
>= 大于等于
<= 小于等于
!= 不等于
关系运算符都是双目运算符,其结合性为左结合型。关系运算符的优先级低于算术运算符,高于赋值运算符。六个关系运算符中,>、<、>=、<=的优先级相同,==和!=的优先级相同,但前者高于后者。
2、关系表达式
关系表达式的一般形式:表达式 关系运算符 表达式
例如:a+b>c+d、 x<=3/2、a<(b>c)、a!=(c==d)
关系表达式运算的结果只有两种:真或假(正确或错误,成立或不成立),用数字1和0表示。
例如:5>3 的运算结果是1(正确),而3<5的结果是0(错误)
int main()
{
char c='k';
int i=1,j=2,k=3;
float x=3e+5,y=0.85;
printf("%d,%d\n",'a'+5<c,-i-2*j>=k+1);
printf("%d,%d\n",1<j<5,x-5.25<=x+y);
printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);
return 0;
}
程序的输出结果是:
解释:
(1) char c=’k’,实质是c=107;因为字符’k’的ASCII码是107。
(2)'a'+5 相当于 97+5,因为字符’a’的ASCII码是97。
(3) 1<j<5 因为关系运算符的左结合性,所以先计算1<j,1<j成立,值为1。再计算1<5,成立,值为1。故表达式值为1
(4)k==j==i+5,先计算k==j,不成立,其值为0,再计算0==i+5,也不成立,值为0,故表达式值为0
二、逻辑运算符及其优先级
1、逻辑运算符
&& 逻辑与(and)
|| 逻辑或(or)
! 逻辑非(not)
&&和||均为双目运算符,具有左结合性,其优先级低于算术运算符和关系运算符,&&的优先级高于||。!是单目运算符,具有右结合性,其优先级高于所有的算术运算符关系运算符,也高于&&和||。
a && b ,只有在a和b都为正确的时候,结果才“正确”,其他情况都为“错误”
例如:如果x=4,那么 (x>4 && x<10) 的结果就是“错误”;
而(x>=2 && x<10) 的结果就是“正确”;
a || b ,只有在a和b都“错误”的时候,结果才“错误”,其他情况都为“正确”
例如:如果x=4,那么 (x>4 || x<10) 的结果就是“正确”;
而(x<=2 || x>10) 的结果就是“错误”;
!a,表示将a的值取反,如果a为正确,则 !a 为错误,如果a为错误,则!a为正确
例如:!(4>5)的结果为正确,而!(4<5)的结果为错误。
2、逻辑表达式
用逻辑运算符、关系运算符构成的式子,成为逻辑表达式:
举例:
数学表达式 -2 <= x < 10 的C语言条件表达式:
x是奇数的条件表达式:
x是偶数的条件表达式:
x能被11整除的条件表达式:
x能被4整除但不能被100整除,或者能被400整除的C语言表达式:
条件表达式: m % 2==1 && m<=20 || m>10
在m=5的时候,表达式的值为:
在m=8的时候,表达式的值为:
在m=13的时候,表达式的值为:
在m=16的时候,表达式的值为:
在m=23的时候,表达式的值为:
在m=30的时候,表达式的值为:
三、分支语句
格式:if(条件) 语句1;
else 语句2;
功能:如果 条件成立 则执行语句1,否则执行语句2;
其中,上面的格式中 ”else 语句2;” 可以省略,上面的格式写成了两行,其实可以写成一行的,这样做只是为了程序更加美观。
例7、编程输入两个整数,输出其中的大数。
解答程序1
解答程序2
int main()
{
int a,b,MAX;
scanf("%d%d",&a,&b);
MAX=a;
if(MAX<b) MAX=b;
printf("MAX=%d\n",MAX);
return 0;
}
int main()
{
int a,b,MAX;
scanf("%d%d",&a,&b);
if(a>b) MAX=a;
else MAX=b;
printf("MAX=%d\n",MAX);
return 0;
}
解答程序1中,先把a的值赋给变量MAX,再用if语句判别MAX和b的大小,如果MAX<b,则把b赋给MAX,这样MAX的值就是a,b中将大的一个。
解答程序2中,如果a>b,则把a的值赋给MAX,否则把b赋给b。这里的否则相当于a<=b。
思考:能否写成下面的形式,如果不能,该怎样修改?
if(a>b) MAX=a;
if(a<b) MAX=b;
例8、编程判断键盘输入的字符的类别:如果是数字字符,则输出“Digit”;如果是大写字母,则输出“Capital”、如果是小写字母,则输出“Small”;如果不是上面三类,则输出“Other”
int main()
{
char c;
scanf("%c",&c);
if(c>='0' && c<='9')
printf("Digit\n");
else if(c>='A' && c<='Z')
printf("Capital\n");
else if(c>='a' && c<='z')
printf("Small\n");
else
printf("Other\n");
return 0;
}
如果c是数字字符则输出”digit”
否则如果c是大写字母则输出”Capital”
否则如果c是小写字母则输出"Small"
否则输出" Other "
四、条件运算符
C/C++中有一个与if ~ else ~ 类似的运算符”? :”,它是三目运算符,其格式为:
表达式1?表达式2:表达式3
其含义是:如果表达式1成立,则以表达式2作为条件表达式的结果,否则以表达式3作为条件表达式的结果。
例如:if(a>b) MAX=a;
else MAX=b;
可以改写为:MAX = a>b? a: b;
条件运算符的优先级高于赋值运算符,低于算术运算符、关系运算符和逻辑运算符。
请用关系运算符改写例7的程序。
五、开关语句
C/C++语言还提供了另一种用于多分支选择的语句——switch语句,其一般形式如下:
形式:
switch(表达式)
{
case 常量表达式1:语句1
case 常量表达式2:语句2
…
case 常量表达式n:语句n
default:语句n+1
}
其含义是:计算表达式的值,然后依次与case后面的常量表达式的值比较。当与某个常量表达式的值相等时,即执行其后面的语句,然后不再判断,转而执行后面的所有case后的语句(包括default语句)。当表达式的值与所有case后面常量表达式的值都不相等时,则执行default后的语句。
例9、编程输入一个数字,输出与这个数字对应星期几的英语单词,比如输入1,则应是星期一,输出“Monday”,7则应是星期日,输出“Sunday”。
解答程序1
int main()
{
int a;
scanf("%d",&a);
switch(a)
{
case 1 : printf("Monday\n");
case 2 : printf("Tuesday\n");
case 3 : printf("Wednesday\n");
case 4 : printf("Tursday\n");
case 5 : printf("Friday\n");
case 6 : printf("Saturday\n");
case 7 : printf("Sunday\n");
default : printf("error\n");
}
return 0;
}
int main()
{
int a;
scanf("%d",&a);
switch(a)
{
case 1 : printf("Monday\n"); break;
case 2 : printf("Tuesday\n");break;
case 3 : printf("Wednesday\n");break;
case 4 : printf("Tursday\n");break;
case 5 : printf("Friday\n");break;
case 6 : printf("Saturday\n");break;
case 7 : printf("Sunday\n");break;
default : printf("error\n");break;
}
return 0;
}
解答程序1:当输入4后,则程序输出:
Tursday
Friday
Saturday
Sunday
error
由此看来,整数上面对switch语句含义的解释,当表达式与某个常量值相等时,则从这里开始所有的case后面的语句都会执行。
解答程序2:当输入4后,程序输出:
Tursday
因为在每条case后面的语句后加上了一个break;这里的break表示中断switch语句的执行。所以当输出Tursday后,再执行break;这时,跳出的switch语句,所以后面case语句再不会被执行。
使用switch语句的要注意以下几点:
1) case语句后的常量表达式的值不能有相同的;
2) case后可以有多条语句,他们不必用{}括起来
3) default可以省略。
思考:请用if语句改写上面的程序。
六、编程实例
例10、打折(P1013)
一件衣服950元,若消费满3000元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。
【输入】
一个整数N,表示顾客购买衣服数量。
【输出】
一个实数,表示需要支付的金额。保留两位小数。
【样例】
4
3230.00
2
1900.00
【数据范围】
0 <= N <= 10000000
【分析】
1、 先计算买n件衣服的钱数:p=950*n;
2、 在判断:如果p>=3000 则输出p*0.85;否则输出p (保留两位小数)
例11、三整数排序(P1015)
输入三个整数a,b,c,从小到大排序后输出。
【输入】
一行三个整数a,b,c。
【输出】
由小到大输出这三个数。整数之间用一个空格分开。
【样例】
20 7 33
7 20 33
解法程序:
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c); // 输入a,b,c的值
if(a>b) { t=a; a=b; b=t; } //如果a>b,则交换a,b的值;
if(a>c) { t=a; a=c; c=t; } //如果a>c,则交换a,c的值;
if(a>c) { t=a; a=c; c=t; } //如果b>c,则交换b,c的值;
printf("%d %d %d\n",a,b,c); //输出答案:输出a,b,c的只值
return 0;
}
关于程序的一点解释:
语句:if(a>b) { t=a; a=b; b=t; }
因为如果满足条件a>b要执行三句话,t=a; a=b; b=t;如果条件不满足,这三句话就不会执行。所以用{}把这三句括起来,这样的语句称为复合语句。
如果写成这样:
if(a>b) t=a; a=b; b=t;
则满足条件a>b,就只会执行t=a;
而不满足,则a=b和b=t;还会照样执行。
例12、三角形 (P1017)
输入三角形三边长度值a,b,c(均为正整数),完成下列任务:
(1)、如果这三边根本无法构成三角形,则输出“not a triangle”。
(2)、如果能构成三角形,则计算这个三角形的面积并输出。
(3)、然后再判断这个三角形是否是直角三角形,如果是则输出“yes”,否则输出“no”。
【输入】
一行三个正整数a,b,c。
【输出】
如果a,b,c不能构成三角形,则输出一行“not a triangle”。 如果能构成一个三角形,则:
第 1 行:一个保留2位小数的实数,表示三角形面积;
第 2 行:如果这个三角形是一个直角三角形,则输出“yes”,否则输出“no”。
【样例输入】
3 4 5
6.00
yes
2 2 2
1.73
no
4 2 7
not a triangle
【数据范围】
1<=a,b,c<=10000
【样例解释】
构成三角形的条件:“任意两边之和大于第三边。”
已知三角形三边,计算面积用海伦公式:
p=(a+b+c)/2;
面积S=sqrt(p*(p-a)*(p-b)*(p-c))。
例13、 鸡兔同笼(P1016)
已知鸡和兔的总量为n,总腿数为m,输入n和m,依次输出鸡的数目和兔的数目。
样例输入1:14 32 样例输出1:12 2
样例输入2:10 16 样例输出2:No answer
分析:按照程序解答问题的三段论:
1、输入数据:n和m;
2、解答方法:设鸡有x只,兔有y只,则列方程:
解方程得: , 这里,x和y必须为正整数。
3、输出答案:如果“m是偶数,且x>0,且y>0”,则该题目解是x和y,否则输出No answer。
x和y必须为正整数
程序的语言描述
用c语言补充完整
定义n,m,x,y四个整数变量;
输入变量n,m的值;
x=(4n-m)/2;
y=(m-2n)/2;
如果m是偶数且x>0且y>0
输出x和y的值,中间隔一个空格
否则
输出No answer
int main()
{
if(m % 2==0 && x>0 && y>0)
else
return 0;
}
课后作业:
题库:P1013~P1035
第8页
展开阅读全文