分支结构程序设计
例题1-4
鸡兔同笼:
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出No answer。
分析
假设鸡有a只,兔有b只,则a+b=n,2a+4b=m,联立解得a=(4n-m)/2,b=n-a。
怎样判断无解呢?
解出a或者b是负数。或者a或者b不是整数。
#include<stdio.h> int main() { int a, b, n, m; scanf("%d%d", &n, &m); a = (4*n-m)/2; b = n-a; if(m % 2 == 1 || a < 0 || b < 0) //短路的方法计算逻辑表达式 printf("No answer\n"); else printf("%d %d\n", a, b); return 0; }
C语言中的逻辑运算符,都是短路运算符,一旦能确定整个表达式的值,就不再进行计算了。
例题1-5:三个整数排序
输入三个整数,从小到大排序后输出。
样例输入
20 7 33
样例输出
7 20 33
分析
方法一这三个数有可能的六种排序:
abc,acb,bac,bca,cab,cba,所以我们可以利用分支结构一一列出:
(这里需要注意的是,千万不要忽略等于即不仅仅有可能是a<b<c,也有可能a<=b<=c)
#include <stdio.h> int main(void) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if (a<=b && b<=c) printf("%d %d %d \n",a,b,c); else if (a<=c && c<=b) printf("%d %d %d \n",a,c,b); else if (b<=a && a<=c) printf("%d %d %d \n",b,a,c); else if (b<=c && c<=a) printf("%d %d %d \n",b,c,a); else if (c<=a && c<=b) printf("%d %d %d \n",c,a,b); else if (c<=b && c<=a) printf("%d %d %d \n",c,b,a); return 0; }
方法二
利用前面讲过的三变量交换法,先检查a和b,使得a是a和b中最小的数,然后再检查,a和c使得a是a和c中最小的数(即a,b,c中最小的数),然后再检查b和c,使得b是b和c中最小的数。
#include <stdio.h> int main(void) { int a,b,c,t; scanf("%d%d%d",&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("%d %d %d \n",a,b,c); return 0; }
输出实验
转义字符\n
#include <stdio.h> int main(void) { printf("1\n2\n"); printf("1\n\n2\n"); return 0; }
输出’’
#include <stdio.h> int main(void) { printf("\\\n");//编译器会把双斜线理解成单个字符'\' return 0; }
表达式1/0 ,1.0/0.0,0.0/0.0
printf("%d",0.0/0.0); printf("%d",1.0/0.0); printf("%d",1/0);
系统都会报错:
divide or mod by zero
习题
习题1-1平均数(average)
输入3个整数,输出他们的平均值,保留3位整数。
#include <stdio.h> int main(void) { double a,b,c; scanf("%lf%lf%lf",&a,&b,&c); printf("%.3lf\n",(a+b+c)/3); return 0; }
习题1-2温度(temperature)
输入华氏温度f,输出对应的摄氏温度c,保留3位小数。提示:c=5(f-32)/9。
#include <stdio.h> int main(void) { double f; scanf("%lf",&f); printf("%.3lf\n",5*(f-32)/9); return 0; }
习题1-3连续和(sum)
输入正整数n,输出1+2+3+……+n。
#include <stdio.h> int main(void) { int i,n,sum=0; scanf("%d",&n); for (i=1;i<=n;i++) sum+=i; printf("%d\n",sum); return 0; }
习题1-4正弦和余弦(sin和cos)
输入正整数n(n<360),输出n度的正弦、余弦函数值。
#include <stdio.h> #include <math.h> int main(void) { double n; const double PI=3.1415; scanf("%lf",&n); printf("cos(%.1lf)=%lf,sin(%.1lf)=%lf\n",n,cos(n/180*PI),n,sin(n/180*PI)); return 0; }
这里需要注意的是,输入的n是角度,而cos(),sin()函数的参数是弧度制的,所以需要转化。
习题1-5
一件衣服95元,若消费满300元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。
#include <stdio.h> int main(void) { int n; scanf("%d",&n); if (n*95>=300) printf("%.2lf\n",n*95*0.85); else printf("%d\n",n*95); return 0; }
习题1-6 三角形(triangle)
输入三角形3条边的长度值(均为正整数),判断是否能为直角三角形
的3个边长。如果可以,则输出yes,如果不能,则输出no。
如果根本无法构成三角形,则输出not a triangle。
#include <stdio.h> int main(void) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if (a+b<=c || a+c<=b || b+c<=a)//无法构成三角形 printf("not a triangle\n"); else if (a*a+b*b=c*c || a*a+c*c=b*b || b*b+c*c=a*a)//直角 printf("yes\n"); else printf("no\n"); return 0; }
习题1-7年份(year)
输入年份,判断是否为闰年。如果是,则输出yes,否则输出no。
判断闰年
能被4整除但不能被100整除,或者能被100整除。
#include <stdio.h> int main(void) { int n; scanf("%d",&n); if (n/400==0 || (n%4==0 && n/100!=0)) printf("yes\n"); else printf("np\n"); return 0; }