1.简单if语句
if(表达式) 语句1;
其语义是先计算表达式的值,若为“真”,则执行语句1,否则跳过语句1执行if语句的下一条语句。
【例】输入3个整数x、y、z,请把这3个数由小到大输出。
算法分析:
(1)先将x与y比较,把小者放x中,大者放y中;
(2)再将x与z比较,把小者放x中,大者放z中,此数x已是三者中最小的;
(3)最后将y与z比较,大者放z中,小者放y中,此时x、y、z已按从小到大的顺序排列好。
#include
int main()
{
int a,b,c,d;
printf("\n请输入两个整数(a,b,c):");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
{
d=a;
a=b;
b=d;
}
if(a>c)
{
d=a;
a=c;
c=d;
}
if(b>c)
{
d=b;
b=c;
c=d;
}
printf("该3个数由小到大的顺序为:%d,%d,%d\n",a,b,c);
return 0;
}
2.if-else语句
if-else语句的形式如下:
if (表达式)语句1;
else 语句2;
其语句是:如果表达式的值为真,则执行语句1,并跳过语句2,继续执行if语句的下一条语句;若表达式的值为假,执行语句2,然后继续执行if语句后的下一条语句。
【例1】判断给定的某一年是否是闰年。
分析:如果某年能被4整除而不能被100整除,或者能被400整除,那么该年就是闰年,否则就是平年。
#include
int main()
{
int year,leap=0;
printf("\n请输入年份(yyyy):");
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%100==0)
printf("%d年是闰年\n",year);
else
printf("%d年是平年\n",year);
return 0;
}
【例2】制作简单的猜数字游戏。程序运行时自动产生1~5的随机数,接着等待键盘输入猜的数字。如果猜对了,显示“猜对了”相关信息;否则显示“猜错了”相关信息。
(1)随机数产生。C语言提供srand()函数,配合rand()函数可产生介于0~32767的随机数(srand()、rand()函数均包含在stdlib.h中,time()函数包含在time.h中)。
(2)1~5的随机数。首先用rand()函数产生的随机数对5求余(rand()%5),产生0 ~4之间的整数,然后再加1,即rand()%5+1就产生1 ~5的整数。
(3)判断程序结构为二路选择结构。
#include
#include /*包含产生随机数的srand()、rand()函数*/
#include
int main()
{
int data,guess;
srand((unsigned)time(NULL)); /*做随机数产生器的种子*/
data=rand()%5+1; /*将随机数对5求余(rand()%5),产生0~4之间的整数,然后再加1,产生1~5的整数*/
printf("请输入要猜的数字(限1~5):");
scanf("%d",&guess);
if (guess==data) /*guess=rand();为以上面得到的种子产生0~32767的整数*/
printf("猜对了!,正确数字为 %d !\n",data);
else
printf("猜错了!,正确数字为 %d !\n",data);
return 0;
}
【例3】一个五位数,判断它是不是回文数,如65456是个回文数,即该数的个位与万位相同、十位与千位相同。
分析:
(1)题目要求是一个五位数,由于五位数超过了int类型的范围,所以应该用long int类型,那么在输入时一定要用对应的“%ld”格式。
(2)判断输入的数是否为五位数,即是否在10000~100000。
(3)分解出该数的每一位数(万位、千位、十位和个位),然后按要求进行判断,即个位与万位相同、十位与千位相同。
#include
int main()
{
long x;
int ge,shi,qian,wan;
printf("\n请输入一个五位数:");
scanf("%ld",&x);
if(x>=10000&&x<100000)
{
wan=x/10000; /*分解出万位*/
qian=x%10000/1000; /*分解出千位*/
shi=x%100/10; /*分解出十位*/
ge=x%10; /*分解出个位*/
if(ge==wan&&shi==qian)
printf("该数是回文数!\n");
else
printf("该数不是回文数!\n");
}
else
{
printf("抱歉,该数不是一个五位数!\n");
int exit(1); /*出错退出*/
}
return 0;
}
exit()函数的原型如下:void exit(程序状态值);
功能:结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当程序状态值为0时,表示程序正常退出;为非0值时,表示程序出错退出。
【例4】输入一个三角形的三边长A、B、C,然后判断此三角形是否为直角三角形。
分析:
(1)满足三角形边长的基本条件为:边长不能为负数,且两边之和必须大于第三边。
(2)直角三角形的三边长应满足A^2+B ^2=C或A ^2+C ^2=B ^2或B ^2+C ^2=A ^2其中之一。
(3)C语言提供pow(a,b)函数可返回a^b的值,该函数包含在头文件math.h中。
#include
#include /*包含pow(a,b)函数*/
int main()
{
int A,B,C;
printf("请输入三角形的三个边长(A,B,C):");
scanf("%d,%d,%d",&A,&B,&C);
if(A<0||B<0||C<0) /*边长不为负数*/
{
printf("抱歉,边长不能为负数!");
int exit(1); /*出错退出*/
}
if(A+B<=C||A+C<=B||B+C<=A) /*三角形任意两边和大于第三边*/
{
printf("抱歉,三角形任意边之和应该大于第三边!");
int exit(1); /*出错退出*/
}
if((pow(A,2)+pow(B,2))==pow(C,2)||(pow(A,2)+pow(C,2))==pow(B,2)||(pow(B,2)+pow(C,2))==pow(A,2)) /*C语言pow(a,b)函数可返回a^b的值*/
printf("是直角三角形!\n");
else
printf("不是直角三角形!\n");
return 0;
}
3.if-else-if语句
当有多个分支选择时,可采用if-else-if语句,其一般形式如下。
if(表达式1) 语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;
…
else if(表达式n-1) 语句n-1;
else 语句n;
其语义是:依次判断表达式1至n-1的值,当表达式中某个值为逻辑真是,则执行其相应的语句,然后跳到整个if语句之外继续执行后续语句。如果所有的表达式均为假,则执行语句n,然后继续执行后续语句。if-else-if语句的执行过程如图所示。
【例1】假设一年四季中春季为2~4月,夏季为5 ~7月,秋季为8 ~10月,冬季为11 ~次年1月。编写程序,根据输入的月份打印出所属的季节。
#include
int main()
{
int a;
printf("请输入月份(1~12):");
scanf("%d",&a);
if(a>=2&&a<=4)
printf("现在是春季!");
else if(a>=5&&a<=7)
printf("现在是夏季!");
else if(a>=8&&a<=10)
printf("现在是秋季!");
else if(a==11||a==12||a==1)
printf("现在是冬季!");
return 0;
}
【例2】编写程序,要求判别键盘输入字符的类别。
分析:根据输入字符的ASCII码来判断类型。由附录I中的ASCII码表可知ASCII码值小于32的为控制字符,在’0’(48)和’9’(57)之间的字符为数字,在’A’(65)和’Z’(90)之间的字符为大写字母,在’a’(97)和’z’(122)之间的字符为小写字母,其余归为其他字符。这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。
#include
int main()
{
char c;
printf("\n请输入一个字符:\n");
c=getchar(); /*从键盘上读入字符直到回车结束*/
if(c<32)
printf("这是一个控制字符!\n");
else if(c>='0'&&c<='9') /*也可以用ASCII码值进行判断。即也可写为if(c>=48&&c<=57),只是前者程序的可读性更强*/
printf("这是一个数字!\n");
else if(c>='A'&&c<='Z')
printf("这是一个大写字母!\n");
else if(c>='a'&&c<='z')
printf("这是一个小写字母!\n");
else
printf("这是其他字符!\n");
return 0;
}
【例3】给不多于五位的正整数,求出它的位数并按逆序打印出各位数字。
#include
int main()
{
long x;
int wan,qian,bai,shi,ge;
printf("请输入一个不多于五位的正整数:");
scanf("%ld",&x);
if(x>100000)
{
printf("\n抱歉,该数已超过五位数!");
int exit(1);
}
else if(x<0)
{
printf("\n抱歉,该数不是正数!");
int exit(1);
}
else
{
wan=x/10000; //分解出万位
qian=x%10000/1000; //分解出千位
bai=x%1000/100; //分解出百位
shi=x%100/10; //分解出十位
ge=x%10; //分解出个位
if(wan!=0)
printf("该数有五位,个位:%d,十位:%d,百位:%d,千位:%d,万位:%d\n",ge,shi,bai,qian,wan);
else if(qian!=0)
printf("该数有四位,个位:%d,十位:%d,百位:%d,千位:%d\n",ge,shi,bai,qian);
else if(bai!=0)
printf("该数有三位,个位:%d,十位:%d,百位:%d\n",ge,shi,bai);
else if(shi!=0)
printf("该数有二位,个位:%d,十位:%d\n",ge,shi);
else if(ge!=0)
printf("该数有一位,个位:%ld\n",ge);
else
printf("该数为0.");
}
return 0;
}
if语句的嵌套
当if语句中执行语句又是if语句时,则构成了if语句嵌套的情形。其一般形式可表示如下。
if(表达式)
if语句;
或者:
if(表达式) if语句;
else if语句;
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如:
if(表达式1)
if(表达式2) 语句1;
else 语句2;
为了避免二义性,C语言规定,else总是与在它前面、据它最近、且尚未匹配的if配对。强烈建议:将内嵌的if语句一律用花括号括起来。
【例】有一个函数如下:
y=x+1 (x<10)
y=x^2 (10<=x<20)
y=6x+9 (x>=20)
编写一个程序,输入任意x值,输出对应的y值。
方法一:
#include
int main()
{
float x,y;
printf("\n请输入x:");
scanf("%f",&x);
if(x<10)
y=x+1;
else if(x>=10&&x<20)
y=x*x;
else if(x>=20)
y=6*x+9;
printf("y=%f\n",y);
return 0;
}
方法二(改进)
#include
#include
int main()
{
float x,y;
printf("\n请输入x:");
scanf("%f",&x);
if(x<10)
y=x+1;
else if(x<20)
y=pow(x,2);
else
y=6*x+9;
printf("y=%f\n",y);
return 0;
}
switch语句的一般形式
switch(表达式)
{
case 常量1: 语句1;
case 常量2: 语句2;
…
case 常量n: 语句n;
defauly: 语句n+1;
}
其语义是:首先计算switch后圆括号内表达式的值,然后用该值逐个与case后面的常量值进行比较。当与某个case后的常量值想等时,则执行该case后的语句,然后顺序执行后面所有的case后的语句。如果圆括号内表达式的值与所有case后的常量值均不相等时,如果存在default则执行其后的语句序列,否则什么都不做。
【例1】理解switch语句的执行过程。
#include
int main()
{
int j=10;
switch(j)
{
case 9:j+=1;
case 10:j+=2;
case 11:j+=3;
default:j+=4;
}
printf("j=%d\n",j);
return 0;
}
分析:首先得到j=10,所以用10和case后的常量比较发现相同的便执行其后的语句j+=2,然后不再进行比较,顺序执行后面所有case后的语句j+=3,j+=4,所以运行结果如下。
j=19
switch-break语句
switch(表达式)
{
case 常量1: 语句1;break;
case 常量2: 语句2;break;
…
case 常量n: 语句n;break;
default: 语句n+1;break;
}
其语义为:首先计算表达式的值,若该值与某个case后面的常量值相等,则执行其后的语句序列。遇到break语句时,跳出整个switch结构。如果表达式的值与所有常量值都不相等,若存在default则执行其后的语句序列,否则什么也不做。将【例1】修改如下。
#include
int main()
{
int j=10;
switch(j)
{
case 9:j+=1;break;
case 10:j+=2;break;
case 11:j+=3;break;
default:j+=4;break;
}
printf("j=%d\n",j);
return 0;
}
运行结果:
j=12
在使用switch语句时还应注意以下几点。
(1)在case后的各常量表达式的值不能相同,否则会出现错误。
(2)在case后,允许有多个语句,可以不用{}括起来。
(3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果(前提是每个case语句中都存在break语句)。
(4)default子句可以省略不用。
switch语句的嵌套
【例】理解switch语句嵌套结构并分析其执行过程。
#include
int main()
{
int a=1,b=0;
switch(a)
{
case 1:switch(b)
{
case 0:printf("***");break;
case 1:printf("@@@");break;
}
case 2:printf("$$$");break;
default:printf("###");
}
return 0;
}
分析:首先得到a=1,那么执行对应的case 1之后的语句,又是一个switch语句。先得到b=0,执行相应的case 0语句,打印“***”之后碰到break,跳出其所在的switch语句,即switch(b)。然后顺序执行case 2之后的语句,打印“$$$”之后碰到break,跳出所在的switch(a),进而程序结束。
运行结果:
***$$$
【例1】查询自动贩卖机中商品的价格。假设自动贩卖机中出售6种商品:绿茶、可乐、芬达、矿泉水、爆米花和瓜子,售价分别为4元、3.5元、3元、1.5元、5元和2.5元。
#include
int main()
{
int a;
printf("\n ******自动贩卖机查询系统******\n");
printf("查询价格请按商品前的序号,按0退出查询。\n");
printf(" 1.绿茶\n");
printf(" 2.可乐\n");
printf(" 3.芬达\n");
printf(" 4.矿泉水\n");
printf(" 5.爆米花\n");
printf(" 6.瓜子\n");
printf(" 0.退出\n");
printf("您要查询:");
scanf("%d",&a);
switch(a)
{
case 1:printf("绿茶: 4元/瓶");break;
case 2:printf("可乐: 3.5元/瓶");break;
case 3:printf("芬达: 3元/瓶");break;
case 4:printf("矿泉水: 1.5元/瓶");break;
case 5:printf("爆米花: 5元/杯");break;
case 6:printf("瓜子: 2.5元/袋");break;
case 0:return 0;
}
printf("\n");
return 0;
}
运行结果:
您要查询:1
绿茶:4元/瓶
您要查询:5
爆米花:5元/杯
【例2】某地出租车的收费方法为:起步价7元,最多可行驶3公里(不包含3公里);3~8公里(不包含8公里)按1.7元/公里计算(不足1公里,按1公里计算);8公里以后按2.0元/公里计算(不足1公里,按1公里计算)。编写程序,输入所行使里程数,计算并输出车费。
#include
int main()
{
double a,b;
printf("请输入公里数:");
scanf("%lf",&a);
if(a<0)
{
printf("抱歉,格式出错!");
}
else
{
if(a<3) b=7;
else if(a<8) b=7+((int)(a-2+1))*1.7; /*不足1公里的部分按照1公里计算,即为(a-2+1)。(int)定义(a-2+1)部分为整型,即舍弃小数部分*/
else b=7+5*1.7+((int)(a-7+1))*2.0;
}
printf("您的出租车费用为:%8.2lf元。\n",b); //%8.2lf表示,输出的宽度为8,输出2为小数//
return 0;
}
运行结果:
请输入公里数:0
抱歉,出错!
请输入公里数:3.2
您的出租车费用为:10.40元
【例3】求ax^2+bx+c=0方程的解。
分析:求解此方程的解,应该考虑到各种可能的情况。
当a=0时,不是二次方程,没有二次方根,否则:
(1)当b^2-4ac=0时,方程有两个相等的实根。
(2)当b^2-4ac>0时,方程有两个不相等的实根。
(3)当b^2-4ac<0时,方程有两个共轭的复根。
#include
#include
int main()
{
float a,b,c,disc,x1,x2,realpart,imagpart;
printf("\n请输入方程的3个系数:(a=,b=,c=)\n");
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
if(fabs(a)<=1e-6) printf("该方程没有二次方根。\n"); /*在怕判断disc是否为0时,由于此值为实数,而实数在计算和储存时会存在一定误差,
因此不能直接进行if(disc==0)的判断,所以在这里是用判别disc的绝对值(fabs(disc))是否小于一个很小的数(10^6),如果小于此数,就近似认为disc等于0.*/
else disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf("该方程有两个相等的实根:x1=x2=%8.4f\n",-b/(2*a)); //%8.4f表示,输出的宽度为8,输出4位小数//
else if(disc>1e-6)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("该方程有两个不相等的实根:\n x1=%8.4f,x2=%8.4f\n",x1,x2);
}
else
{
realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
printf("该方程有两个复根:\n");
printf("x1=%8.af+%8.4fi\n",realpart,imagpart);
printf("x2=%8.4f-%8.4fi\n",realpart,imagpart);
}
return 0;
}
运行结果:
a=0,b=1,c=1
该方程没有二次方根
a=1,b=2,c=1
该方程有两个相等的实根:x1=x2=-1.0000
a=2,b=6,c=1
该方程有两个不相等的实根:x1=-0.1771,x2=-2.8229
a=1,b=2,c=2
该方程有两个复根:
x1=-1.0000+1.0000i
x2=-1.0000-1.0000i