第一次階段考試補題報告
一.成績統計表
原始碼
#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;
}
錯因:考試時看到題目沒有想出整體思路框架,每行之間的符號個數之間的關係也沒找到,使得迴圈沒有建立起來