第一次阶段考试补题报告

一.成绩统计表

原代码

#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;
}

错因:考试时看到题目没有想出整体思路框架,每行之间的符号个数之间的关系也没找到,使得循环没有建立起来

posted @ 2021-10-30 16:37  刘代伟  阅读(31)  评论(0)    收藏  举报