第一次阶段考试补题报告

一.成绩统计表
原代码
#include <stdio.h>
int main(){
int n,a,b,c,d,e;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
n=a+b+c+d+e;
printf("Rank Number\n----------------\nExcellent %d\nGood %d\nMedium %d\nPass %d\nFail %d\n----------------\nTotal %d\n",a,b,c,d,e,n);
return 0;
}
改正后
#include <stdio.h>
int main(){
int n,a,b,c,d,e;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
n=a+b+c+d+e;
printf("Rank Number\n----------------\nExcellent%7d\nGood%12d\nMedium%10d\nPass%12d\nFail%12d\n----------------\nTotal%11d\n",a,b,c,d,e,n);
return 0;
}
错因:1.没有考虑到输出时的字符宽度
二.
求某月的天数
原代码
#include <stdio.h>
int main(){
int i,year,month;
scanf("%d %d",&year,&month);
while(year>0){
scanf("%d %d",&year,&month);
if(year%4!=0)
{
switch(month){
case 1:i=31;break;
case 3:i=31;break;
case 2:i=28;break;
case 5:i=31;break;
case 4:i=30;break;
case 6:i=30;break;
case 7:i=31;break;
case 8:i=31;break;
case 9:i=30;break;
case 10:i=31;break;
case 11:i=30;break;
case 12:i=31;break;
}
}
else {
if(month==2) i=29;
}
}
printf("%d",i);
return 0;
}
改正后
#include <stdio.h>
int main()
{
int y,m;
while(scanf("%d %d",&y,&m)!=EOF){
if(y%400==0||y%4==0&&y%100!=0){
switch(m){
case(1):case(3):case(5):case(7):case(8):case(10):case(12):{
printf("31");
break;
}
case(2):{
printf("29");
break;
}
default:{
printf("30");
break;
}
}
}else{switch(m){
case(1):case(3):case(5):case(7):case(8):case(10):case(12):{
printf("31");
break;
}
case(2):{
printf("28");
break;
}
default:{
printf("30");
break;
}
}
}
printf("\n");
}
return 0;
}
错因:没有理解EOF,输入时无法正确的使用EOF,使程序超时,无法正常运行
三.位运算应用
原代码
#include <stdio.h>
int main(){
unsigned int ua,ub,uc,tag;
int a=1;
scanf("%d %d %d\n%d",&ua,&ub,&uc,&tag);
if(tag<0||tag>95){
printf("Error");
} else {
a=a<<tag;
if(tag>=0&&tag<32){
uc=uc^a;
} else if(tag>=32&&tag<64){
a=a>>32;
ub=ub^a;
} else {
a=a>>64;
ua=ua^a;
}
printf("ua=%d,ub=%d,uc=%d",ua,ub,uc);
}
return 0;
}
改正后
#include <stdio.h>
int main(){
unsigned int ua,ub,uc,tag;
scanf("%u %u %u\n%d",&ua,&ub,&uc,&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;
}
错因:在边界点的考虑欠佳,对位运算的理解还不够
四.打印沙漏
原代码
无。。
重做后
#include<stdio.h>
#include<math.h>
int main()
{
int number;
char ch;
int n;
int i,a,b;
int x;
scanf("%d %c",&number,&ch);
n=sqrt((number+1)/2);
x=number - (2*n*n-1);
for (i=n; i>= 1; i--)
{
for (b=1; b<= n-i; b++) {
printf(" ");
}
for (a=1; a<= 2*i-1; a++) {
printf("%c",ch);
}
printf("\n");
}
for (i =2; i <= n; i++)
{
for (b=1; b<= n-i; b++) {
printf(" ");
}
for (a=1; a<= 2*i-1; a++) {
printf("%c",ch);
}
printf("\n");
}
printf("%d\n",x);
return 0;
}
错因:考试时看到题目没有想出整体思路框架,每行之间的符号个数之间的关系也没找到,使得循环没有建立起来
浙公网安备 33010602011771号