1. 程式人生 > 其它 >第一次階段考試補題報告

第一次階段考試補題報告

一.成績統計表

原始碼

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

錯因:考試時看到題目沒有想出整體思路框架,每行之間的符號個數之間的關係也沒找到,使得迴圈沒有建立起來