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

階段一上機考試補題報告

階段一上機考試補題報告

1.得分情況

2.(1)題目

最終提交程式碼:

#include<stdio.h>
int main(){
int excellent;
scanf("%d",&excellent);
int good;
scanf("%d",&good);
int medium;
scanf("%d",&medium);
int pass;
scanf("%d",&pass);
int fail;
scanf("%d",&fail);
printf("Rank Number\n");
printf("----------------\n");
printf("Excellent %2d\n",excellent);
printf("Good %3d\n",good);
printf("Medium %4d\n",medium);
printf("Pass %4d\n",pass);
printf("Fail %3d\n",fail);
printf("----------------\n");
printf("Total %4d\n",excellent+good+medium+pass+fail);

return 0;
}

補題完成程式碼:

#include<stdio.h>
int main(){
int excellent;
scanf("%d",&excellent);
int good;
scanf("%d",&good);
int medium;
scanf("%d",&medium);
int pass;
scanf("%d",&pass);
int fail;
scanf("%d",&fail);
printf("Rank Number\n");
printf("----------------\n");
printf("Excellent%7d\n",excellent);
printf("Good%12d\n",good);
printf("Medium%10d\n",medium);
printf("Pass%12d\n",pass);
printf("Fail%12d\n",fail);
printf("----------------\n");
printf("Total%11d\n",excellent+good+medium+pass+fail);
return 0;
}

出錯原因:反覆提示格式錯誤

解決辦法:輸出數字不一定與樣例相同,所以就不能按錯誤的程式碼輸出空格,輸出的每行數字都是靠右對齊,前面的空格沒辦法數,就只能找每行的空格總數,讓系統自動在輸出數字前面自動補空格,輸出每行所需的字元寬度(%nd)。

(2)題目

未通過程式碼:

#include<stdio.h>
int main(){
int year,month;

int tianshu;


while(scanf("%d %d",&year,&month)!=EOF){
if((year%4==0&&year%100!=0)||(year%400==0)){
switch(month){
case 1:tianshu=31;break;
case 2:tianshu=29;break;
case 3:tianshu=31;break;
case 4:tianshu=30;break;
case 5:tianshu=31;break;
case 6:tianshu=30;break;
case 7:tianshu=31;break;
case 8:tianshu=30;break;
case 9:tianshu=31;break;
case 10:tianshu=30;break;
case 11:tianshu=31;break;
case 12:tianshu=30;break;


}
}
else
{
switch(month){
case 1:tianshu=31;break;
case 2:tianshu=28;break;
case 3:tianshu=31;break;
case 4:tianshu=30;break;
case 5:tianshu=31;break;
case 6:tianshu=30;break;
case 7:tianshu=31;break;
case 8:tianshu=30;break;
case 9:tianshu=31;break;
case 10:tianshu=30;break;
case 11:tianshu=31;break;
case 12:tianshu=30;break;


}
}

printf("%d\n",tianshu);

}
return 0;
}

補題程式碼:

#include<stdio.h>
int main(){
int year,month;
int tianshu;
while(scanf("%d %d",&year,&month)!=EOF){
if((year%4==0&&year%100!=0)||(year%400==0)){
switch(month){
case 1:tianshu=31;break;
case 2:tianshu=29;break;
case 3:tianshu=31;break;
case 4:tianshu=30;break;
case 5:tianshu=31;break;
case 6:tianshu=30;break;
case 7:tianshu=31;break;
case 8:tianshu=31;break;
case 9:tianshu=30;break;
case 10:tianshu=31;break;
case 11:tianshu=30;break;
case 12:tianshu=31;break;
}
}
else
{
switch(month){
case 1:tianshu=31;break;
case 2:tianshu=28;break;
case 3:tianshu=31;break;
case 4:tianshu=30;break;
case 5:tianshu=31;break;
case 6:tianshu=30;break;
case 7:tianshu=31;break;
case 8:tianshu=31;break;
case 9:tianshu=30;break;
case 10:tianshu=31;break;
case 11:tianshu=30;break;
case 12:tianshu=31;break;
}
}
printf("%d\n",tianshu);
}
return 0;
}

出錯原因:每月具體多少天記不清楚

解決辦法:查詢每個月的具體天數並改正

(3)題目

補題程式碼:

#include<stdio.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");
return 0;
}
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;
}

解題思路:96個埠分成三部分,輸出一個tag將tag位上置1,因為不能確定tag處於96個埠的哪一個位置,所以就要對tag/32(因為每個整數有32位),來確定對哪一個整數進行置1處理,用switch-case進行下一步運算,對確定的數做處理,tag%32表示在這個整數的哪一位置1,再與原數進行或運算,所得的數就是置1之後的數。

00000000 00000000 00000000 00000001表示數值1,若這是第二個無符號數,tag位在這個數的範圍內,設tag=35,tag/32=1,表示置1的位置在此數上,tag%32=3,表示將這個數從右往左第三位置1,結果為00000000 00000000 00000000 000001000與00000000 00000000 00000000 00000001做或運算表示的就是置1後的置。

(4)題目

補題程式碼:

#include<stdio.h>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i,a,b;
int t=n;
int j=n*2-1;
int kongge,zifu;
if(n%2!=0){
for(i=1;i<=2*n-1;i++){
if(i<=n){
a=2*t-1;
b=i-1;
}
else {
a=2*i-4*(n/2+1)+3;
b=j-1;
}
for(kongge=1;kongge<=b;kongge++){
printf(" ");
}
for(zifu=1;zifu<=a;zifu++){
printf("*");
}
printf("\n");
t--;
j--;
}
}
else{
for(i=1;i<=2*n;i++){
if(i<=n){
a=2*t-1;
b=i-1;
}
else {
a=2*i-4*(n/2+1)+3;
b=j-1;
}
if(i==n+1)continue;
for(kongge=1;kongge<=b;kongge++){
printf(" ");
}
for(zifu=1;zifu<=a;zifu++){
printf("*");
}
printf("\n");
t--;
j--;

}
}

}
return 0;
}

出現的問題:空格和輸出字元找不到條件去控制 思路理不清

解決辦法:找網站上找了相關型別的題去聽,開始有點思路了。

解題思路:找出內迴圈輸出空格k和字元j與外迴圈i輸出行數的關係,對奇數和偶數做特殊處理

學習情況總結:這次考試讓我清晰的認識到了我的問題所在,過於注重數量,而沒有去思考背後的知識,陷入了費時又低效的迴圈,平時作業做的不是很踏實,學習方法不是很好,從這次的考試來講,所考的題目基本都能在老師佈置的作業上找到例子,儘管作業做對了,可能也只是想到哪寫到哪,思路還是亂成一團。另外對於不會的題目就不管了,比如那個96個埠題,第一次聽老師講感覺聽不明白,就放任不管了,考試考到也就只能跳過,之後再去聽,一遍就懂了,對於聽不懂的不會的還是要足夠重視。