第一次上机考试补题报告
R7-4 求某月的天数
题目:
输入年份year、月份month,判断该月的天数。闰年:能被4整除但不能被100整除或者能被400整除的年份是闰年。
输入格式:
测试数据有多组,处理到文件尾。对于每组测试,输入两个整数,表示年份year和月份month。
输出格式:
对于每组测试,输出对应年月的天数。
考试时的代码:
#include<stdio.h> int main() { int year=0,month=0; do { scanf("%d %d",&year,&month); if((year%4==0&&year%100!=0)||year%400==0) { if(month==2) { printf("29\n",month); }else if(month==4||month==6||month==9||month==11) { printf("30\n"); }else { printf("31\n"); } }else { if(month==2) { printf("28\n",month); }else if(month==4||month==6||month==9||month==11) { printf("30\n"); }else { printf("31\n"); } } }while(month>0&&month<=12); return 0; }
可以发现该代码未能完成题目中读取到文件尾的要求,加入while(scanf()!=EOF)就能完成题目要求。
改后代码:
#include<stdio.h> int main() { int year=0,month=0; while(scanf("%d %d",&year,&month)!=EOF) { if((year%4==0&&year%100!=0)||year%400==0) { if(month==2) { printf("29\n",month); }else if(month==4||month==6||month==9||month==11) { printf("30\n"); }else { printf("31\n"); } }else { if(month==2) { printf("28\n",month); }else if(month==4||month==6||month==9||month==11) { printf("30\n"); }else { printf("31\n"); } } } return 0; }
R7-6 打印沙漏
题目:
当n=5时,沙漏图形如输出样例所示。请观察并明确沙漏图形的规律。要求输入一个整数n,输出满足规律的沙漏图形。
输入:
测试数据有多组,处理到文件尾。每组测试输入一个整数n(1<n<20)。
输出:
对于每组测试,输出满足规律的沙漏图形。
考试时代码:
#include<stdio.h> int main() { int n=2,f=0,i=0,a=0,t=0; while(n>1&&n<20) { scanf("%d",&n); if(n<=1||n>=20) { break; } f=2*n-1; for(i=1;i<=n;i++) { for(t=1;t<=i;t++) { if(i!=n) printf(" "); } for(a=1;a<=f-(i-1)*2;a++) { if(i!=n) { printf("*"); } } if(i!=n) printf("\n"); } for(i=n;i>=1;i--) { for(t=i;t>=1;t--) { printf(" "); } for(a=f-(i-1)*2;a>=1;a--) { printf("*"); } printf("\n"); } } return 0; }
可以发现该代码不能读取到文件尾,因此也需要同上一题一样加上while(scanf()!=EOF),且该代码输出图形为:
观察可发现:该图形每行都多了一个空格
因此代码可以改成:
#include<stdio.h> int main() { int n=2,f=0,i=0,a=0,t=0; while(scanf("%d",&n)!=EOF) { if(n<=1||n>=20) { break; } f=2*n-1; for(i=1;i<=n;i++) { for(t=1;t<i;t++) { if(i!=n) printf(" "); } for(a=1;a<=f-(i-1)*2;a++) { if(i!=n) { printf("*"); } } if(i!=n) { printf("\n"); } } for(i=n;i>=1;i--) { for(t=i;t>1;t--) { printf(" "); } for(a=f-(i-1)*2;a>=1;a--) { printf("*"); } printf("\n"); } } return 0; }
R7-5 位运算应用
题目:
现有96个端口状态,用3个无符号整型ua(95~64),ub(63~32),uc(31~0)组合起来的96位二进制数来表示,每位二进制数的1、0表示其正常和故障状态。
输入一个tag位,将tag位上二进制数置1.
tag位表示其在96位中所处的位数(在96位中从低向高从0至95)
输入格式:
第一行输入三个无符号整数,表示ua,ub,uc
第二行输入一个整数tag。
输出格式:
若tag值不在0到95之间,则输出Error
,否则输出转换后的ua,ub,uc
考试时没太看懂题目,考完之后写了一下代码
#include<bits/stdc++.h> int main() { unsigned int ua,ub,uc; int tag; scanf("%u %u %u",&ua,&ub,&uc); scanf("%d",&tag); if(tag<0||tag>95) { printf("Error"); } else { switch(tag/32) { case 0:uc|=(unsigned int)1<<tag%32;break; case 1:ub|=(unsigned int)1<<tag%32;break; case 2:ua|=(unsigned int)1<<tag%32;break; } printf("ua=%u,ub=%u,uc=%u",ua,ub,uc); } return 0; }