第3章 选择语句和循环语句
程序设计题
1、编写程序,输入年份和月份,判断是否闰年,什么季节以及该月有多少天
#include<stdio.h>
/*输入年份和月份,判断该年是不是闰年,并根据月份判断是什么季节和这个月有多少天*/
int main(){
int y,m,leap,season,days;
printf("年份,月份");
scanf("%d,%d",&y,&m);
if((y%4==0&&y%100!=0) ||(y%400==0))
leap==1;
else
leap=0;
if(m>=3&&m<=5)
season=1;
else if(m>=6&&m<=8)
season=2;
else if(m>=9&&m<=12)
season=3;
else season=4;
switch(m){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:days=31;break;
case 4:case 6:case 9:case 11:days=30;break;
case 2:if(leap=1) days=29;else days=28;
}
printf("%d年%S闰年\n",y,(leap==1?"是":"不是"));
printf("该季节是:");
switch(season){
case 1:printf("春季");break;
case 2:printf("夏季");break;
case 3:printf("秋季");break;a
case 4:printf("冬季");break;
}
printf("当月天数:%d\n",days);
return 0;
}
2、编写程序,根据用户输入的三角形的三边长判定是何种三角形,对于有效三角形,求出面积
#include<stdio.h>
#include<math.h>
int main(){
float a,b,c;
float s,area;
printf("a,b,c=");
scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a){
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("三角形的面积为area=%f\n",area);
if(a==b&&b==c){
printf("等边三角形\n");
}
if(a==b||b==c||a==c)printf("等腰三角形\n");
else if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))printf("直角三角形\n");
}else{
printf("不能组成三角形\n");
}
return 0;
}
3、编写一个程序将十进制数n转化为二进制数,要求从低位到高位输出二进制数的各位
#include<stdio.h>
#include<math.h>
int main(){
int n,i=0;
printf("n=");
scanf("%d",&n);
printf("对应的二进制数为:\n");
while(n){
printf("%d",n%2);
n=n/2;
}
return 0;
}
4、编写一个层序,输入若干个整数,以-1标记输入结束,输出其中的最大数和最小数
#include<stdio.h>
#include<math.h>
int main(){
int n,min,max,first=1;
printf("输入数序\n");
while(1){
scanf("%d",&n);
if(n==-1)break;
if(first){
first=0;
min=max=n;
}else{
if(max<n)max=n;
else if(n<min)min=n;
}
}
if(!first)printf("max=%d,min=%d\n",max,min);
else printf("没有输入任何有效数\n");
return 0;
}
5、编写一个程序,输出菱形图案,第一行为一个字母A,第二行为三个字母B,依此类推
①方法1:
#include<stdio.h>
#include<math.h>
int main(){
char c;
int i,j,k,n;
printf("输入n:\n");
scanf("%d",&n);
c='A';
for(k=1;k<=n;k++){
for(i=1;i<=n-k;i++)printf(" ");
for(j=1;j<=k*2-1;j++)printf("%c",c);
c++;
printf("\n");
}
for(k=1;k<n;k++){
for(i=0;i<k;i++)printf(" ");
for(j=2*(n-k);j>0;j--)printf("%c",c);
c++;
printf("\n");
}
return 0;
}
②方法2:
#include<stdio.h>
#include<math.h>
int main(){
char c;
int i,j,k,n;
printf("输入n:\n");
scanf("%d",&n);
c='A';
for(k=1-n;k<=n-1;k++){
i=n-abs(k);
for(j=1;j<=n-i+1;j++)
printf(" ");
for(j=1;j<=2*i-1;j++)
printf("%c",c);
printf("\n");
c++;
}
return 0;
}
6、编写一个程序,对输入的正整数n,输出{0,1,…,n-
1}的所有子集,例如输入3时,输出如下:
{},{0},{1},{0,1},{2},{0,2},{1,2},{0,1,2}
#include<stdio.h>
#include<math.h>
int main(){
char c;
int i,j,k,n,m;
printf("输入n:\n");
scanf("%d",&n);
m=pow(2,n);
m=m-1;
for(i=0;i<m;i++){
printf("{");
j=i;
k=0;
while(j){
if(j%2==1)printf("%d",k);
k++;
j=j/2;
}
printf("}");
}
return 0;
}
7、编写一个程序,利用公式求出e的近似值,n由用户输入
#include<stdio.h>
#include<math.h>
int main(){
int n,i,j,k,s,temp=1;
float e=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
k=i;
temp=temp*k;
e+=1.0/temp;
}
printf("%f",e);
return 0;
}
8、有甲、乙、丙三人对一块矿石进行判断,每人判断两次,,甲认为这块矿石不是铁也不是铜;乙认为这块矿石不是铁,是锡;并认为这块矿石不是锡,是铁;老工人两次判断都对,普通队员两次判断一对一错,实习生两次判断都错。则矿石是什么矿?甲乙丙身份分别是什么?
#include<stdio.h>
//铁0铜1锡2
int main(){
int a,a1,a2,b,b1,b2,c,c1,c2;
int x;
for(x=0;x<3;x++){
a1=(x!=0);
a2=(x!=1);
a=a1&&a2;
b1=(x!=0);
b2=(x==2);
b=b1&&b2;
c1=(x!=2);
c2=(x==0);
c=c1&&c2;
if((a+b+c==1)&&a1+b1+c1+a2+b2+c2==3){
switch(x){
case 0:printf("矿石是铁矿\n");break;
case 1:printf("矿石是铜矿\n");break;
case 2:printf("矿石是锡矿\n");break;
}
if(a1==a2&&a1==1)printf("甲是老工人\n");
else if((a1==0&&a2==1)||(a2==0&&a1==1))printf("甲是普通工人\n");
else if(a1==a2&&a1==0)printf("甲是实习生\n");
if(b1==b2&&b1==1)printf("乙是老工人\n");
else if((b1==0&&b2==1)||(b2==0&&b1==1))printf("乙是普通工人\n");
else if(b1==b2&&b1==0)printf("乙是实习生\n");
if(c1==c2&&c1==1)printf("丙是老工人\n");
else if((c1==0&&c2==1)||(c2==0&&c1==1))printf("丙是普通工人\n");
else if(c1==c2&&c1==0)printf("丙是实习生\n");
}
}
return 0;
}