如何備考C語言二級考試之程序運行結果分析篇?

在C語言二級考試中,給出C語言小程序,讓考生分析運行結果的題目比較多,相對來說這方面的題目比較簡單,只要細心推導,得出結果不難。下面就由電仔談談這方面的解題經驗,主要是把我解題的過程寫出來,而不是講解理論。

工具/原料

歷年C語言二級考試真題

方法/步驟

程序:

#include

int main(int argc,char **argv)

{

int x=10,y=20,t=0;

if(x==y)t=x;x=y;y=t;

printf(“%d %d\n”,x,y);

return 0;

}

分析程序運行結果為?

電仔的解題步驟:

把 if(x==y)t=x;x=y;y=t; 語句這樣書寫

if(x==y)

t=x;

x=y;

y=t;

或者乾脆這樣書寫

if(x==y)

{

t=x;

}

x=y;

y=t;

可以看出 x==y 為假, t=x; 語句不執行

x=y,也就是x=20,t不變,也就是t=0

那麼 printf(“%d %d\n”,x,y ); 語句打印輸出

20 0

圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果

如何備考C語言二級考試之程序運行結果分析篇

程序:

#include

main()

{

int i,n[5]={0};

for(i=1;i<=4;i++);

{

n[i]=n[i-1]*2+1; printf("%d",n[i])

}

printf("\n");

}

則程序輸出結果是?

電仔的解題步驟:

for(;1<4;i++);

{

n[1]=n[1-1]*2+1; printf("%d",n[1]);

}

上面是第一次循環,n[1]=0*2+1=1,則 printf("%d",n[i]); 輸出1

for(;2<4;i++);

{

n[2]=n[2-1]*2+1; printf("%d",n[2]);

}

上面是第二次循環,n[2]=n[1]*2+1=3,則 printf("%d",n[i]); 輸出3

for(;3<4;i++);

{

n[3]=n[3-1]*2+1; printf("%d",n[3]);

}

上面是第三次循環,n[3]=n[2]*2+1=3,則 printf("%d",n[i]); 輸出7

for(;4==4;i++);

{

n[4]==n[4-1]*2+1; printf("%d",n[4]);

}

上面是第四次循環,n[4]=n[3]*2+1=3,則 printf("%d",n[i]); 輸出15

結束循環後執行 printf("\n"); 輸出換行

最後我們可以看到的輸出為

13715

圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果

如何備考C語言二級考試之程序運行結果分析篇

程序:

#include

main()

{

char c1,c2;

scanf(“%d”,(int *)&c1);

c2=c1+9;

printf(“%c%c\n”,c1,c2);

}

字符0的ASCII碼值為48,若程序運行時從鍵盤輸入48後回車,則輸出結果為?

電仔的解題步驟:

執行完 scanf(“%d”,(int *)&c1); 後,c1的值為48,對應的ASCII碼為字符0

執行完 c2=c1+9; 後,c2的值為57,對應的ASCII碼為字符9(0+9)

那麼執行 printf(“%c%c\n”,c1,c2); 輸出

09

圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果

如何備考C語言二級考試之程序運行結果分析篇

程序:

#include

main( )

{

int a=1, b=0;

if( !a ) b++;

else if( 0==a) if(a) b+=2;

else b+=3;

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

}

程序運行的輸出結果是?

電仔的解題步驟:

為了方便理解,我把主函數整理為等效的佈局和表達形式

main( )

{

int a=1, b=0;

if( !a )

{

b++;

}

else if( a==0)

{

if(a)

{

b=b+2;

}

else

{

b=b+3;

}

}

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

}

這樣就容易看出, !a 為假, a==0 也為假,所有條件語句括號內的語句都得不到執行,變量b的值不變所有 printf( "%d\n",b ); 輸出

0

對這題還不能理解的讀者歡迎在評論中提出,圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果

如何備考C語言二級考試之程序運行結果分析篇

程序:

#include

main( )

{

int a=1, b=2;

while( a<6 ) { b+=a; a+=2; b%=10; }

printf( "%d, %d\n",a, b );

}

則程序的運行結果是?

電仔的解題步驟:

同理,我也把main函數整理一下

main( )

{

int a=1, b=2;

while( a<6 ) { b=b+a; a=a+2; b=b%10; }

printf( "%d, %d\n",a, b );

}

接著推導while循環何時結束

while( 1<6 ) { b=2+1; a=1+2; b=3%10; }

上面是第一循環,最後 b=3 ,a=3

while( 3<6 ) { b=3+3; a=3+2; b=6%10; }

上面是第一循環,最後 b=6 ,a=5

while( 5<6 ) { b=6+5; a=5+2; b=11%10; }

上面是第一循環,最後 b=1,a=7

while( 1<6 )

條件不成立,循環結束執行 printf( "%d, %d\n",a, b ); 輸出

7, 1

圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果

如何備考C語言二級考試之程序運行結果分析篇

程序:

#include

main( )

{

char s[ ]="rstuv";

printf( "%c\n",*s+2 );

}

電仔的解題步驟:

這題牽涉到指針數組,有時間我再寫個指針數組的專題

*s+2 等效為 (*s)+2

也就是 'r'+2 ,換句話說取出字符ASCII的碼值加2,剛好是 t 的碼值

輸出和"rstuv"的‘t’沒有一點關係, *s+2 要是理解為 *(s+2) 輸出也是 t

但是這樣理解是錯的,比如把對應該語句改為 char s[ ]="rsuuv";

那麼輸出結果是 t 而不是u

圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果

如何備考C語言二級考試之程序運行結果分析篇

注意事項

這是個人的解題思路,讀者如果有更好更快的步驟歡迎反饋

文中可能存在的錯誤,讀者如果發現請務必指出

相關問題答案