谭浩强c程序设计教程学习笔记第4章.docx
- 文档编号:29637677
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:21
- 大小:28.61KB
谭浩强c程序设计教程学习笔记第4章.docx
《谭浩强c程序设计教程学习笔记第4章.docx》由会员分享,可在线阅读,更多相关《谭浩强c程序设计教程学习笔记第4章.docx(21页珍藏版)》请在冰豆网上搜索。
谭浩强c程序设计教程学习笔记第4章
第4章选择结构程序设计
4.1关于算法
4.1.1算法的概念
一个程序包含以下两方面内容:
(1)对数据的描述。
在程序中指定数据的类型和数据的组织形式,即数据结构(datastructure)。
(2)对操作的描述,即算法(algorithm)。
数据结构+算法=程序
计算机算法分两大类别:
数值运算算法和非数值运算算法。
4.1.2怎样表示算法
1.用自然语言表示。
2.用流程图表示算法。
3.用N-S流程图表示算法。
4.用伪代码(pseudocode)表示算法。
4.2条件判断
4.2.1关系运算和关系表达式
1.关系运算符及其优先次序
(1)
<
(2)<=优先级相同(高)
(3)>
(4)>=
(5)
==优先级相同(低)
(6)!
=
说明:
(1)前四种关系运算符的优先级高于后四种。
(2)关系运算符的优先级低于算术运算符。
(3)关系运算符的优先级高于赋值运算符。
2.关系表达式:
用关系运算符将两个表达是连接起来的式子。
关系表达式的值是一个逻辑值。
4.2.2逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来的的式子就是逻辑表达式。
1.逻辑运算符及其优先次序
(1)&&逻辑与
(2)||逻辑或
(3)!
逻辑非
逻辑运算符的优先次序:
(1)!
——>&&——>||。
(2)逻辑运算符中的&&和||低于算术运算符,!
则高于算术运算符。
3.逻辑表达式
判断year是否为闰年
(1)能被4整除,但不能被100整除。
(2)能被400整除。
(year%4==0&&year%100!
==0||year%400==0)
4.3用if语句实现选择结构
4.3.1if语句的3种形式
(1)if(表达式)语句
(2)If(表达式)语句1else语句2
(3)If(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
.
.
elseif(表达式m)语句m
else语句n
例4.1输入两个实数,按代数值由小到大的顺序输出两个数。
#include
intmain()
{
floata,b,t;
printf("Pleaseenteraandb:
\n");
scanf("%f,%f",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("%7.2f,%7.2f",a,b);
return0;
}
例4.2输入三个数a,b,c,要求按从小到大的的顺序输出。
#include
intmain()
{
floata,b,c,t;
printf("Pleaseentera,b,c:
\n");
scanf("%f,%f,%fl",&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;
}
printf("%7.2f,%7.2f,%7.2f",a,b,c);
return0;
}
4.3.2if语句的嵌套
注意:
else总是与它上面的最近的未配对的if配对。
例4.3有意函数
-1(x<0)
Y=0(x=0)
1
编一程序,输入x值求y值。
#include
intmain()
{
floatx;
inty;
printf("Pleaseinputx:
");
scanf("%f",&x);
if(x<0)
y=-1;
else
{
if(x==0)
y=0;
else
y=1;
}
printf("y=%d",y);
return0;
}
4.3.3条件运算符和条件表达式
条件表达式一般形式:
表达式1?
表达式2:
表达式3
说明:
(1)先求解表达式1,若为非0则求解表达式2,此时表达式2的值就是整个条件表达式的值。
若表达式1为0,则求解表达式3,表达式3的值就是整个条件表达式的值。
(2)条件运算符优先于赋值运算符。
(3)条件运算符的结合方向为“自右向左”。
(4)a>b?
(a=100):
(b=100)或a>b?
printf("%d",a):
printf("%d",b)
(5)条件表达式1的类型可以和条件表达式2和表达式3的类型不同。
例4.4输入一个字符,判别它是否大写字母,若果是,将它转换成小写字母;如果不是,不转换。
然后输出最后得到的字符。
#include
intmain()
{
charch;
printf("pleaseinputachar:
\n");
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z')?
(ch+32):
ch;
printf("%c",ch);
return0;
}
4.4利用switch语句实现多分枝选择结构
Switch(表达式)
{
case常量表达式1:
语句1
case常量表达式2:
语句2
.
.
case常量表达式n:
语句n
default:
语句n+1
}
说明:
(1)在执行switch语句时,根据switch后面的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
因此,应该在执行一个case分枝后,使流程跳出switch结构,即终止switch语句的执行。
可以用一个break语句来达到此目的。
Switch(表达式)
{
case常量表达式1:
语句1;break;
case常量表达式2:
语句2;break;
.
.
case常量表达式n:
语句n;break;
default:
语句n+1
}
(2)多个case可以共用一组执行语句。
Switch(表达式)
{
case常量表达式1:
case常量表达式2:
.
case常量表达式n:
语句1
default:
语句2
}
4.5程序举例
例4.5写程序判断某一年是否为闰年
简便写法
#include
intmain()
{
intyear,leap;
printf("Pleaseenterayear:
\n");
scanf("%d",&year);
if(year%4==0&&year%100!
=0||year%400==0)
leap=1;
else
leap=0;
if(leap)
printf("%dis",year);
else
printf("%disnot",year);
printf("aleapyear\n");
return0;
}
例4.6求ax2+bx+c=0方程的解。
#include
#include
intmain()
{
floata,b,c,x1,x2,real_part,imag_part,disc;
printf("Pleaseentera,b,c:
\n");
scanf("%f,%f,%f",&a,&b,&c);
if(fabs(a)<=1e-6)
printf("Theequationisnotaquadratic\n");
else
{
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf("Theequationhastwoequalroots:
%8.4f\n",-b/(2*a));
elseif(disc>1e-6)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("Theequationhastwodistinctroots:
\nx1=%8.4f\nx2=%8.4f\n",x1,x2);
}
else
{
real_part=-b/(2*a);
imag_part=sqrt(-disc)/(2*a);
printf("Theequationhascomplexroots:
\n");
printf("x1=%8.4f+%8.4fi\n",real_part,imag_part);
printf("x2=%8.4f-%8.4fi\n",real_part,imag_part);
}
}
return0;
}
4.7运输公司对用户计算运费。
路程(以s表示,单位为Km)越远,每吨.千米运费越低。
标准如下:
S<250没有折扣
250<=S<500%2折扣
500<=s<1000%5折扣
1000<=s<2000%8折扣
2000<=s<300010%折扣
3000<=s15%折扣
设每吨每千米货物的基本运费为p,货物重为w,距离s,折扣d,则总运费f的计算公式为
f=p*w*s*(1-d)
#include
intmain()
{
intc,s;
floatp,w,d,f;
printf("Pleaseenterprice,weight,distance\n");
scanf("%f,%f,%d",&p,&w,&s);
if(s>=3000)
c=12;
else
c=s/250;
switch(c)
{
case0:
d=0;
break;
case1:
d=2;
break;
case2:
case3:
d=5;
case4:
case5:
case6:
case7:
d=8;
break;
case8:
case9:
case10:
case11:
d=10;
break;
case12:
d=15;
break;
}
f=w*s*p*(1-d/100.0);
printf("freight=%10.2f\n",f);
}
习题
4.2c语言指定1代表真,0代表假。
4.3
(1)0
(2)1
(3)1
(4)0
(5)1
4.4#include
intmain()
{
intmax(int,int,int);
inta,b,c,m;
printf("Pleaseentera,b,c:
\n");
scanf("%d,%d,%d",&a,&b,&c);
m=max(a,b,c);
printf("Themaxis%d",m);
return0;
}
intmax(intx,inty,intz)
{
intt;
if(x>y)
t=x;
else
t=y;
if(t t=z; returnt; } 4.5 #include intmain() { floatx,y; printf("Pleaseenterx: \n"); scanf("%f",&x); if(x<1) y=x; elseif(x>=1&&x<10) y=2*x-1; else y=3*x-1; printf("y=%8.4f",y); return0; } 4.6 #include intmain() { floatscore; intgrade; printf("pleaseenterscore: \n"); scanf("%f",&score); if(score>=90) printf("ThegradeisA\n"); else grade=score/10; switch(grade) { case0: case1: case2: case3: case4: case5: printf("ThegradeisE\n"); break; case6: printf("ThegradeisD\n"); break; case7: printf("ThegradeisC\n"); break; case8: printf("ThegradeisB\n"); break; } return0; } 4.7 #include intmain() { longintnum; intx1,x2,x3,x4,x5; printf("pleaseinputapositivenum: \n"); scanf("%ld",&num); x1=num/10000; x2=num%10000/1000; x3=num%10000%1000/100; x4=num%10000%1000%100/10; x5=num%10000%1000%100%10; if(x1==0&&x2==0&&x3==0&&x4==0&&x5! =0) { printf("Thenumisaunitsdigit\n"); printf("Thenumis%d\n",x5); printf("Thereverseorderis%d\n",x5); } if(x1==0&&x2==0&&x3==0&&x4! =0&&x5! =0) { printf("Thenumisatensdigit\n"); printf("Thenumis%d,%d\n",x4,x5); printf("Thereverseorderis%d%d\n",x5,x4); } if(x1==0&&x2==0&&x3! =0&&x4! =0&&x5! =0) { printf("Thenumisapercentile\n"); printf("Thenumis%d,%d,%d\n",x3,x4,x5); printf("Thereverseorderis%d%d%d\n",x5,x4,x3); } if(x1==0&&x2! =0&&x3! =0&&x4! =0&&x5! =0) { printf("Thenumisathousands\n"); printf("Thenumis%d,%d,%d,%d\n",x2,x3,x4,x5); printf("Thereverseorderis%d%d%d%d\n",x5,x4,x3,x2); } if(x1! =0&&x2! =0&&x3! =0&&x4! =0&&x5! =0) { printf("Thenumisamilliondigit\n"); printf("Thenumis%d,%d,%d,%d,%d\n",x1,x2,x3,x4,x5); printf("Thereverseorderis%d%d%d%d%d\n",x5,x4,x3,x2,x1); } return0; } 4.8 (1) #include intmain() { doublei,reward; printf("pleaseenterprofiti: \n"); scanf("%lf",&i); if(i<=100000) reward=i*0.1; if(i<=200000&&i>100000) reward=(i-100000)*0.075+100000*0.1; if(i<=400000&&i>200000) reward=(i-200000)*0.05+100000*0.075+100000*0.1; if(i<=600000&&i>400000) reward=(i-400000)*0.03+200000*0.05+100000*0.075+100000*0.1; if(i>600000&&i<=1000000) reward=(i-600000)*0.015+200000*0.03+200000*0.05+100000*0.075+100000*0.1; if(i>1000000) reward=(i-100000)*0.01+400000*0.015+200000*0.03+200000*0.05+100000*0.075+100000*0.1; printf("Therewardis%8.4lf",reward); return0; } (2) #include intmain() { doublei,reward; intn; printf("pleaseenterprofiti: \n"); scanf("%lf",&i); if(i>100000) reward=(i-100000)*0.01+400000*0.015+200000*0.03+200000*0.05+100000*0.075+100000*0.1; else n=i/10000; switch(n) { case0: reward=i*0.1; break; case1: reward=(i-100000)*0.075+100000*0.1; break; case2: case3: reward=(i-200000)*0.05+100000*0.075+100000*0.1; break; case4: case5: reward=(i-400000)*0.03+200000*0.05+100000*0.075+100000*0.1; case6: case7: case8: case9: reward=(i-100000)*0.01+400000*0.015+200000*0.03+200000*0.05+100000*0.075+100000*0.1; break; } printf("Therewardis%8.4lf",reward); return0; } 4.9 #include intmain() { inta,b,c,d,t; printf("pleaseentera,b,c,d: \n"); scanf("%d,%d,%d,%d",&a,&b,&c,&d); if(a>b) { t=a; a=b; b=t; } if(a>c) { t=a; a=c; c=t; } if(a>d) { t=a; a=d; d=t; } if(b>c) { t=b; b=c; c=t; } if(b>d) { t=b; b=d; d=t; } if(c>d) { t=c; c=d; d=t; } printf("Theorderis%d,%d,%d,%d",a,b,c,d); return0; } 4.10 #include #include intmain() { doublex,y,x1,y1,t; printf("pleaseentercoordinatex,y: \n"); scanf("%lf,%lf",&x,&y); x1=(2-fabs(x))*(2-fabs(x)); y1=(2-fabs(y))*(2-fabs(y)); t=sqrt(x1+y1); if(t<=1) printf("Theheightis10m\n"); else printf("Theheightis0m\n"); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 谭浩强 程序设计 教程 学习 笔记