第3章 三大结构程序设计Word文件下载.docx
《第3章 三大结构程序设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《第3章 三大结构程序设计Word文件下载.docx(45页珍藏版)》请在冰点文库上搜索。
(1)格式输入函数
scanf(输入格式字符串,输入变量地址表);
从键盘按照“输入格式字符串”中规定的格式读取若干个数据,按“输入变量地址表”存放到相应的变量中。
函数参数中的输入格式字符串由两类字符组成:
普通字符(要求必须原样输入)
输入格式字符(以%打头)。
输入变量地址表是用逗号分隔的多个变量地址。
变量地址可表示为“&
变量名”。
分析程序的功能:
(33.c)
main()
{shorta,b;
scanf("
a=%d,b=%d"
&
a,&
b);
printf("
\n\n%d,%d"
a,b);
(331.c)
\npleaseinputa,b:
"
%d,%d"
①输入格式控制字符通常为"
%m字母"
格式。
其中m用于指定输入数据的宽度(例如“%2d%3d”),若省略m则可用非格式字符作为输入数据的间隔(例如“%d,%d”),也可用空格、Tab、回车作为两个输入数据的间隔(例如“%d%d”)。
(见例34.c341.c342.c)
②用%c输入单个字符时,空格和回车均作为有效的输入。
(2)格式输出函数
printf(输出格式字符串,表达式序列);
按照“输出格式字符串”中规定的格式输出给定各个表达式的值。
函数参数中的输出格式字符串由三类字符组成:
普通字符(原样输出)
转义字符(按相应的含义输出)
输出格式字符(以%打头)。
表达式序列是用逗号分隔的若干个表达式。
表达式序列的计算顺序是自右向左的。
例如:
若定义了inta=6;
则printf("
%d,%d,%d"
a,a++,++a);
的输出结果为8,7,7。
需要说明的是:
若表达式序列互相不影响,则自左向右计算也不影响结果。
如:
a+1,a+2,a+3);
2.格式字符★※
(1)输入格式字符:
短整型数据 %d%u 长整型数据 %ld%lu
单精度实型数据 %f 双精度实型数据%lf(38.c)
字符型数据 %c (39.c) 字符串数据%s(391.c遇空格、Tab、回车结束)
(2)输出格式字符:
带符号短整型数据 %d 带符号长整型数据 %ld
无符号短整型数据 %u 无符号长整型数据 %lu
实型数据 %f %lf 字符型数据 %c
字符串数据 %s
3.注意输入格式字符与输出格式字符的区别:
①输入格式字符中%d%u%ld%lu,而输出格式字符中%d与%u、%ld与%lu是有区别的。
unsigneda;
intb;
/*若输入65535,-1时使a为65535、b为-1*/
%u,%d"
/*输出的结果为:
65535,-1*/
输入格式字符中单精度实型数据与双精度实型数据的控制符有区别(单%f、双%lf),而输出格式字符是没有单双精度的区别,均为%f。
(38.c)
floata;
doubleb;
%f,%lf"
/*若输入2.3,2.3时使a为2.3、b为2.3*/
%f,%f"
2.300000,2.300000*/
输出时可控制实型数据的小数位数(可利用%-m.nf控制输出精度),但输入时不能控制输入精度(即不能利用%m.nf控制输入精度)。
(381.c,382.c)
%-m.nfm输出总宽:
m<
=实际宽度按实际宽度输出
m>
实际宽度%m.nf数据右对齐,左补空格
%-m.nf数据左对齐,右补空格
n小数位数,若省略则默认为6位小数。
三、顺序结构
输入三角形的三边长,求其面积并输出。
分析:
1设三边长分别存入变量a、b、c中,面积存入变量s中。
2求解三角形面积的公式为海伦公式:
s=
其中d=
3数学函数
是用c语言系统函数sqrt(x)表示,而数学函数均在头文件math.h中定义的,所以应在程序的首部使用包含命令:
#include“math.h”
4综上所述,程序中最好定义a,b,c,d,x,s六个实型变量。
程序清单如下(sx1.c):
{floata,b,c,d,x,s;
printf(“\n\ninputa,b,c:
”);
scanf(“%f,%f,%f”,&
b,&
c);
d=(a+b+c)/2;
x=d*(d-a)*(d-b)*(d-c);
s=sqrt(x);
printf(“\narea:
%.2f”,s);
输入一半径,求圆的周长、面积、球的体积并输出。
1设半径为r,圆的周长、面积、球的体积分别存入变量c、s、v中。
2c=2лrs=лr2v=
лr3
3圆周率л最好用#definePI3.141593定义(PI为符号常量)。
4综上所述,程序中最好定义r,c,s,v四个实型变量。
程序清单如下:
(sx2.c)
#definePI3.141593
{floatr,c,s,v;
printf(“\n\ninputr:
scanf(“%f”,&
r);
c=2*PI*r;
s=PI*r*r;
v=4.0/3*PI*r*r*r;
printf(“\nc=%.2f”,c);
printf(“\ns=%.2f”,s);
printf(“\nv=%.2f”,v);
例3:
输入一3位整数,求各位数字的平方和并输出。
分析:
1设输入的3位整数存入变量x中,对x分解的各位数字分别存入变量x1、x2、x3中,分解方法为:
x789
x1=x/1%10;
9
x2=x/10%10;
8
x3=x/100%10;
7
规律为:
相应位上的数字=x/位权%10
2设平方和存入变量s中,故应定义5个整型变量。
3程序清单如下:
(sx3.c)
{intx,x1,x2,x3,s;
printf(“\n\ninputx(100~999):
scanf(“%d”,&
x);
x1=x%10;
s=x1*x1+x2*x2+x3*x3;
printf(“\ns=%d”,s);
例4:
输入三个整数,求出最大值并输出。
1设三个整数分别存入变量a、b、c中,最大值存入变量m中。
2可以先将a、b中的较大值存入变量m中(m=a>
b?
a:
b;
),然后将m与c比较,若m<
c,则将c赋值给m即可(m=m>
c?
m:
c;
或m=m<
c:
m;
)。
程序清单如下:
(sx4.c)
{inta,b,c,m;
printf(“\n\ninputa,b,c:
scanf(“%d,%d,%d”,&
m=a>
if(a>
b)m=a;
elsem=b;
m=m<
if(m<
c)m=c;
printf(“\nmax=%d”,m);
}
例5:
输入一个一元二次方程ax2+bx+c=0(设b2-4ac>
=0)的三个系数,求出方程的根并输出。
1设一元二次方程的三个系数分别存入变量a、b、c中,两个实根存入变量x1、x2中。
2求解:
x1=(-b+d)/(2*a);
X2=(-b-d)/(2*a);
其中d=sqrt(b*b-4*a*c)
3因为用到了数学函数sqrt(x),所以应在程序的首部使用包含命令:
4综上所述,程序中最好定义a,b,c,d,x1,x2六个实型变量。
(sx5.c)
math.h"
{floata,b,c,d,x1,x2;
\n\ninputa,b,c:
%f,%f,%f"
d=sqrt(b*b-4*a*c);
x1=(-b+d)/(2*a);
x2=(-b-d)/(2*a);
\nx1=%.2f,x2=%.2f"
x1,x2);
四、选择结构★
1.单分支:
if
格式:
if(表达式)语句1;
功能:
如果表达式为真则执行语句,否则不执行语句。
其执行流程如右:
说明:
若表达式为真时需要执行多条语句,则必须将
多条语句写成复合语句形式。
{语句1;
语句2;
写出程序的输出结果。
(dfz1.c)
{inta=4,b=5;
if(a>
4)b++;
b++;
printf(“\n%d”,b);
结果为6
4){b++;
结果为5
输入三个整数x,y,z,请把这三个数由小到大输出。
1.我们想办法把最小的数放到x中,先将x与y进行比较,如果x>
y则将x与y的值进行交换,然后再用x与z进行比较,如果x>
z则将x与z的值进行交换,这样能使x最小。
然后将y与z比较,若y>
z则交换,使y为y、z中的较小值。
2交换a、b:
{t=a;
a=b;
b=t;
}t=a,a=b,b=t;
3.程序清单:
(dfz3.c)
#include"
{intx,y,z,t;
printf(“\ninputxyz:
scanf("
%d%d%d"
x,&
y,&
z);
if(x>
y){t=x;
x=y;
y=t;
}/*交换x,y的值*/if(x>
y)t=x,x=y,y=t;
if(x>
z){t=x;
x=z;
z=t;
}/*交换x,z的值*/if(x>
z)t=x,x=z,z=t;
if(y>
z){t=y;
y=z;
}/*交换z,y的值*/if(y>
z)t=y,y=z,z=t;
printf("
\nsmalltobig:
%d %d %d\n"
x,y,z);
2.双分支:
if-else
y
else语句2;
如果表达式为真则执行语句1,否则
执行语句2。
若语句1或语句2需要多条语句,
则必须将它们写成复合语句形式。
例1:
x>
0y=2*x
x<
=0y=x2-1(x是由键盘输入)(sfz1.c)
{intx,y;
\nx="
%d"
if(x>
0)y=2*x;
if(x>
y=2*x;
elsey=x*x-1;
if(x<
=0)y=x*x-1;
\ny=%d"
y);
输入一个5位数,判断它是不是回文数。
即12321是回文数,个位与万位相同,十位与千位相同。
程序清单:
(sfz2.c)
{
longge,shi,qian,wan,x;
printf(“\nx=?
%ld"
wan=x/10000%10;
qian=x/1000%10;
shi=x/10%10;
ge=x%10;
if(ge==wan&
&
shi==qian) printf("
\n%ldisahuiwen\n"
x);
else printf("
\n%ldisnotahuiwen\n"
3.多分支:
if-else的嵌套★※
x/300
2*x(x>
=0&
x<
300)0
y=3*x(x>
=300&
600)1
4*x(x>
=600&
900)2
5*x(x>
=900)3,4,5,6,…
if(x<
300)y=2*x;
if(x<
600)if(x<
900)
elseif(x<
600)y=3*x;
900)y=4*x;
elsey=3*x;
elseif(x<
elsey=5L*x;
elsey=4*x;
方法一(qtdfz1.c)
{unsignedshortx;
longy;
\n\ninputx:
if(x<
\ny=%ld"
方法二(qtdfz2.c)
600)
else
方法三(qtdfz4.c)
elsey=5L*x;
方法四:
switch(x/300)
{case0:
y=2*x;
break;
case1:
y=3*x;
case2:
y=4*x;
default:
y=5L*x;
}
给一个不多于5位的正整数,要求:
一、求它是几位数,二、逆序输出各位数字。
1.程序分析:
学会分解出每一位数。
2.程序源代码:
(qtdfz5.c)
longa,b,c,d,e,x;
a=x/10000%10;
/*分解出万位*/
b=x/1000%10;
/*分解出千位*/
c=x/100%10;
/*分解出百位*/
d=x/10%10;
/*分解出十位*/
e=x%10;
/*分解出个位*/
if(a!
=0)printf("
thereare5,%ld%ld%ld%ld%ld\n"
e,d,c,b,a);
elseif(b!
thereare4,%ld%ld%ld%ld\n"
e,d,c,b);
elseif(c!
thereare3,%ld%ld%ld\n"
e,d,c);
elseif(d!
thereare2,%ld%ld\n"
e,d);
elseprintf("
thereare1,%ld\n"
e);
设inta=8,b=7,c=6,x=1;
执行语句if(a>
6)if(b>
7)if(c>
8)x=2;
elsex=3;
后x的值是[B]
A.0 B.1C.2D.3
if(a>
6)
if(b>
7)
if(c>
elsex=3;
4.多分支:
用switch语句实现★※
switch(表达式)
{case常量1:
case常量2:
语句组2;
break;
┇
┇
case常量n:
语句组n;
[default:
语句组n+1;
]
}
计算表达式的值,若和常量i相同,则执行语句组i后遇break语句结束。
若和所有的常量均不相同,则执行语句组n+1后结束。
(1)表达式的值通常是整型或字符型且表达式的取值互不相同。
(2)此处的break语句是结束switch结构。
若省略,则从表达式与常量相等的位置开始执行后面的所有语句组,直到遇下一个break语句结束。
(3)若表达式与多个常量相同时需要执行同一个语句组,则语句组仅需在最后一个case常量的位置出现即可。
case2:
语句组;
case1:
(4)该结构特别适合用等式构成条件的多分支结构。
(5)default:
可以省略。
1程序分析题:
写出运行结果。
(讲完循环结构后再讲该例)
{charc;
while((c=getchar())!
='
)
switch(c)
{case'
0'
:
case'
1'
2'
3'
putchar(c+1);
\n"
输入1357并回车
【答案】11368
【分析】在switch结构中可以从入口处执行多条语句,直到遇break;
才结束。
2.编写一个模拟简单计算器的程序,计算表达式:
a1opa2的值,要求a1、op、a2从键盘输入。
其中a1、a2(作除数时不能为0)为数值,op为运算符+、-、*、/。
【答案】
(switch1.c)34*56
{floata1,a2;
charop;
%f%c%f"
a1,&
op,&
a2);
switch(op)
{case'
+'
printf("
\n%f+%f=%f"
a1,a2,a1+a2);
-'
\n%f-%f=%f"
a1,a2,a1-a2);
*'
\n%f*%f=%f"
a1,a2,a1*a2);
/'
if(a2!
\n%f/%f=%f"
a1,a2,a1/a2);
elseprintf("
\nwrong1!
\nwrong2!
方法二:
(switch2.c)
{floata1,a2,y;
intf=1;
标志变量
y=a1+a2;
y=a1-a2;
y=a1*a2;
=0)y=a1/a2;
elsef=0;
f=-1;
if(f==1)printf("
\n%.2f%c%.2f=%f"
a1,op,a2,y);
elseif(f==0)