第3章 三大结构程序设计.docx
《第3章 三大结构程序设计.docx》由会员分享,可在线阅读,更多相关《第3章 三大结构程序设计.docx(45页珍藏版)》请在冰点文库上搜索。
![第3章 三大结构程序设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/c99ca04a-6800-4e79-b9da-ae22b614d20e/c99ca04a-6800-4e79-b9da-ae22b614d20e1.gif)
第3章三大结构程序设计
第3章三大结构程序设计
输入原始数据加工处理输出结果
知识网络图
多分支
考点分析
一、字符输入/输出函数★
切记:
在tc中除了scanf()与printf()之外,其它输入/输出函数在使用前必须在程序的首部使用一条包含命令将头文件“stdio.h”包含到当前程序中来。
在vc++中所有输入/输出函数在使用前均必须使用包含命令将头文件“stdio.h”包含到当前程序中来。
包含命令为:
#include"stdio.h"或#include
注意包含命令后无分号。
(1)字符输入函数getchar()
调用方法:
变量=getchar();
函数功能:
从键盘读取单个字符并将读取的单个字符作为函数的返回值赋给变量。
(2)字符输出函数putchar(c)
调用方法:
putchar(c);例如:
putchar('a');putchar('\x61');putchar(96+1);a
参数c可以是字符常量、字符变量或整型表达式。
函数功能:
将参数c对应的字符输出到显示器上。
例1:
写出程序的输出结果:
(31.c)
#include"stdio.h"
main()
{chara,b,c;
a=getchar();
b=getchar();
c=getchar();
putchar(a);
putchar(b);
putchar(c);}
例2:
写出程序的输出结果:
(32.c)
#include"stdio.h"
main()
{chara,b,c;
a=getchar();
b=getchar();
c=getchar();
putchar(a);
putchar('\n');
putchar(b);
putchar('\n');
putchar(c);
putchar('\n');}
注意:
输入单字符时,空格与回车均为有效的字符输入。
二、格式输入/输出函数★
字符输入输出函数只能用来输入输出单个字符,格式输入输出函数能够输入输出各种基本类型的数据,如整型、短整、长整、无符号数、单精度数、双精度数和单个字符。
1.格式输入/输出函数
(1)格式输入函数
调用方法:
scanf(输入格式字符串,输入变量地址表);
函数功能:
从键盘按照“输入格式字符串”中规定的格式读取若干个数据,按“输入变量地址表”存放到相应的变量中。
函数参数中的输入格式字符串由两类字符组成:
普通字符(要求必须原样输入)
输入格式字符(以%打头)。
输入变量地址表是用逗号分隔的多个变量地址。
变量地址可表示为“&变量名”。
例1:
分析程序的功能:
(33.c)
#include"stdio.h"
main()
{shorta,b;
scanf("a=%d,b=%d",&a,&b);
printf("\n\n%d,%d",a,b);}
例2:
分析程序的功能:
(331.c)
#include"stdio.h"
main()
{shorta,b;
printf("\npleaseinputa,b:
");
scanf("%d,%d",&a,&b);
printf("\n\n%d,%d",a,b);}
注意:
①输入格式控制字符通常为"%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。
需要说明的是:
若表达式序列互相不影响,则自左向右计算也不影响结果。
如:
printf("%d,%d,%d",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;
scanf("%d,%d",&a,&b);/*若输入65535,-1时使a为65535、b为-1*/
printf("%u,%d",a,b);/*输出的结果为:
65535,-1*/
输入格式字符中单精度实型数据与双精度实型数据的控制符有区别(单%f、双%lf),而输出格式字符是没有单双精度的区别,均为%f。
例如:
(38.c)
floata;doubleb;
scanf("%f,%lf",&a,&b);/*若输入2.3,2.3时使a为2.3、b为2.3*/
printf("%f,%f",a,b);/*输出的结果为:
2.300000,2.300000*/
输出时可控制实型数据的小数位数(可利用%-m.nf控制输出精度),但输入时不能控制输入精度(即不能利用%m.nf控制输入精度)。
(381.c,382.c)
%-m.nfm输出总宽:
m<=实际宽度按实际宽度输出
m>实际宽度%m.nf数据右对齐,左补空格
%-m.nf数据左对齐,右补空格
n小数位数,若省略则默认为6位小数。
三、顺序结构
例1:
输入三角形的三边长,求其面积并输出。
分析:
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):
#include"stdio.h"
#include“math.h”
main()
{floata,b,c,d,x,s;
printf(“\n\ninputa,b,c:
”);
scanf(“%f,%f,%f”,&a,&b,&c);
d=(a+b+c)/2;
x=d*(d-a)*(d-b)*(d-c);
s=sqrt(x);
printf(“\narea:
%.2f”,s);
}
例2:
输入一半径,求圆的周长、面积、球的体积并输出。
分析:
1设半径为r,圆的周长、面积、球的体积分别存入变量c、s、v中。
2c=2лrs=лr2v=
лr3
3圆周率л最好用#definePI3.141593定义(PI为符号常量)。
4综上所述,程序中最好定义r,c,s,v四个实型变量。
程序清单如下:
(sx2.c)
#include"stdio.h"
#definePI3.141593
main()
{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)
#include"stdio.h"
main()
{intx,x1,x2,x3,s;
printf(“\n\ninputx(100~999):
”);
scanf(“%d”,&x);
x1=x%10;
x2=x/10%10;
x3=x/100%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比较,若mc?
m:
c;或m=mc:
m;)。
程序清单如下:
(sx4.c)
#include"stdio.h"
main()
{inta,b,c,m;
printf(“\n\ninputa,b,c:
”);
scanf(“%d,%d,%d”,&a,&b,&c);
m=a>b?
a:
b; if(a>b)m=a;elsem=b;
m=mc:
m;if(mprintf(“\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),所以应在程序的首部使用包含命令:
#include“math.h”
4综上所述,程序中最好定义a,b,c,d,x1,x2六个实型变量。
程序清单如下:
(sx5.c)
#include"stdio.h"
#include"math.h"
main()
{floata,b,c,d,x1,x2;
printf("\n\ninputa,b,c:
");
scanf("%f,%f,%f",&a,&b,&c);
d=sqrt(b*b-4*a*c);
x1=(-b+d)/(2*a);
x2=(-b-d)/(2*a);
printf("\nx1=%.2f,x2=%.2f",x1,x2);
}
四、选择结构★
1.单分支:
if
格式:
if(表达式)语句1;
功能:
如果表达式为真则执行语句,否则不执行语句。
其执行流程如右:
说明:
若表达式为真时需要执行多条语句,则必须将
多条语句写成复合语句形式。
{语句1;语句2;}
例1:
写出程序的输出结果。
(dfz1.c)
#include"stdio.h"
main()
{inta=4,b=5;
if(a>4)b++;b++;
printf(“\n%d”,b);}
结果为6
#include"stdio.h"
main()
{inta=4,b=5;
if(a>4){b++;b++;}
printf(“\n%d”,b);}
结果为5
例2:
输入三个整数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"stdio.h"
main()
{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=t;}/*交换z,y的值*/if(y>z)t=y,y=z,z=t;
printf("\nsmalltobig:
%d %d %d\n",x,y,z);}
2.双分支:
if-else
y
格式:
if(表达式)语句1;
else语句2;
功能:
如果表达式为真则执行语句1,否则
执行语句2。
其执行流程如右:
说明:
若语句1或语句2需要多条语句,
则必须将它们写成复合语句形式。
例1:
x>0y=2*x
x<=0y=x2-1(x是由键盘输入)(sfz1.c)
#include"stdio.h"
main()
{intx,y;
printf("\nx=");
scanf("%d",&x);
if(x>0)y=2*x;if(x>0)y=2*x;y=2*x;
elsey=x*x-1;if(x<=0)y=x*x-1;if(x<=0)y=x*x-1;
printf("\ny=%d",y);}
例2:
输入一个5位数,判断它是不是回文数。
即12321是回文数,个位与万位相同,十位与千位相同。
程序清单:
(sfz2.c)
#include"stdio.h"
main()
{
longge,shi,qian,wan,x;printf(“\nx=?
”);
scanf("%ld",&x);
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",x);
}
3.多分支:
if-else的嵌套★※
例1:
x/300
2*x(x>=0&&x<300)0
y=3*x(x>=300&&x<600)1
4*x(x>=600&&x<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;if(x<300)y=2*x;if(x<300)y=2*x;
elseif(x<900)y=4*x;elsey=3*x;elseif(x<600)y=3*x;
elsey=5L*x;elseif(x<900)y=4*x;elsey=4*x;
elsey=5L*x;elsey=5L*x;
方法一(qtdfz1.c)
#include"stdio.h"
main()
{unsignedshortx;longy;
printf("\n\ninputx:
");
scanf("%d",&x);
if(x<300)y=2*x;
elseif(x<600)y=3*x;
elseif(x<900)y=4*x;
elsey=5L*x;
printf("\ny=%ld",y);
}
方法二(qtdfz2.c)
#include"stdio.h"
main()
{unsignedshortx;longy;
printf("\n\ninputx:
");
scanf("%d",&x);
if(x<600)
if(x<300)y=2*x;
elsey=3*x;
else
if(x<900)y=4*x;
elsey=5L*x;
printf("\ny=%ld",y);
}
方法三(qtdfz4.c)
#include"stdio.h"
main()
{unsignedshortx;longy;
printf("\n\ninputx:
");
scanf("%d",&x);
if(x<900)
if(x<300)y=2*x;
elseif(x<600)y=3*x;
elsey=4*x;
elsey=5L*x;
printf("\ny=%ld",y);
}
方法四:
#include"stdio.h"
main()
{unsignedshortx;longy;
printf("\n\ninputx:
");
scanf("%d",&x);
switch(x/300)
{case0:
y=2*x;break;
case1:
y=3*x;break;
case2:
y=4*x;break;
default:
y=5L*x;}
printf("\ny=%ld",y);
}
例2:
给一个不多于5位的正整数,要求:
一、求它是几位数,二、逆序输出各位数字。
1.程序分析:
学会分解出每一位数。
2.程序源代码:
(qtdfz5.c)
#include"stdio.h"
main()
{
longa,b,c,d,e,x;
scanf("%ld",&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!
=0)printf("thereare4,%ld%ld%ld%ld\n",e,d,c,b);
elseif(c!
=0)printf("thereare3,%ld%ld%ld\n",e,d,c);
elseif(d!
=0)printf("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>8)x=2;
elsex=3;
4.多分支:
用switch语句实现★※
格式:
switch(表达式)
{case常量1:
case常量2:
语句组2;break;
┇
┇
case常量n:
语句组n;break;
[default:
语句组n+1;]
}
功能:
计算表达式的值,若和常量i相同,则执行语句组i后遇break语句结束。
若和所有的常量均不相同,则执行语句组n+1后结束。
说明:
(1)表达式的值通常是整型或字符型且表达式的取值互不相同。
(2)此处的break语句是结束switch结构。
若省略,则从表达式与常量相等的位置开始执行后面的所有语句组,直到遇下一个break语句结束。
(3)若表达式与多个常量相同时需要执行同一个语句组,则语句组仅需在最后一个case常量的位置出现即可。
case1:
case2:
语句组;break;case1:
case2:
语句组;break;
(4)该结构特别适合用等式构成条件的多分支结构。
(5)default:
语句组n+1;可以省略。
1程序分析题:
写出运行结果。
(讲完循环结构后再讲该例)
#include"stdio.h"
main()
{charc;
while((c=getchar())!
='\n')
switch(c)
{case'0':
case'1':
putchar(c);
case'2':
putchar(c);break;
case'3':
putchar(c);break;
default:
putchar(c+1);
}
printf("\n");
}
输入1357并回车
【答案】11368
【分析】在switch结构中可以从入口处执行多条语句,直到遇break;才结束。
2.编写一个模拟简单计算器的程序,计算表达式:
a1opa2的值,要求a1、op、a2从键盘输入。
其中a1、a2(作除数时不能为0)为数值,op为运算符+、-、*、/。
【答案】(switch1.c)34*56
#include"stdio.h"
main()
{floata1,a2;charop;
scanf("%f%c%f",&a1,&op,&a2);
switch(op)
{case'+':
printf("\n%f+%f=%f",a1,a2,a1+a2);break;
case'-':
printf("\n%f-%f=%f",a1,a2,a1-a2);break;
case'*':
printf("\n%f*%f=%f",a1,a2,a1*a2);break;
case'/':
if(a2!
=0)printf("\n%f/%f=%f",a1,a2,a1/a2);
elseprintf("\nwrong1!
");break;
default:
printf("\nwrong2!
");
}
}
方法二:
(switch2.c)
#include"stdio.h"
main()
{floata1,a2,y;charop;intf=1;标志变量
scanf("%f%c%f",&a1,&op,&a2);
switch(op)
{case'+':
y=a1+a2;break;
case'-':
y=a1-a2;break;
case'*':
y=a1*a2;break;
case'/':
if(a2!
=0)y=a1/a2;
elsef=0;break;
default:
f=-1;}
if(f==1)printf("\n%.2f%c%.2f=%f",a1,op,a2,y);
elseif(f==0)