20160202.CCPP體系詳解(0012天)

尹成發表於2016-02-16

內容概要:C語言控制語句題庫.doc


第三章 控制語句

一、選擇題
1. 以下語句中無限迴圈語句是【B】。
A)for(;2&5;);            B)while(1,2,3); -> while(3)     
C)while(‘\0’);         D)for(;’\0’;);
解析過程:
    A選項:
010
101
    B選項:
        While(3);
    C,D選項:
        ‘0’ ‘\00
        %d:48  0   0
        %c:0   NUT NUT(不可見字元)
2. 若有程式段如下:
a=b=c=0;x=35;
if(!a)x--;      if(!0)  35--;
else if(b);     else if(0);   
if(c)x=3;       if(c!=0) x=3;
else x=4;       else x=4;
執行後,變數x的值是【B】。
A.34    B.4    C.35    D.3
解析過程:else和最近的一個if進行配對
3. 下列if語句中,不正確的是【A】。
   A.if (x<y)scanf (“%d”,&x); else scanf (“%d”, &y);
   B.if (x<y);
   C.if (x==y)x+=y;
   D.if (x<y){x++;y++;}
解析過程:分支語句if-else和三元運算子之間的區別,分支語句當中每一塊兒語句的結束
必須使用分號,三元表示式當中每個區域性語句的結束不需要使用分號標識結束
4. 若有int x,y;,執行程式段:
for(x=1,y=1;y<50;y++)
{
    if (x>=10)  
        break;
    if(x%2==1)   奇數
    {
        x+=5;
        continue;
    }
    x-=3;
}
變數x的值最終為【D】。
  A.11    B.12    C.13    D.10
解析過程:
    X:6     3       8       5       10
    Y:1     2       3       4       5
5. 若有int x=3;,執行程式段:
do
{
    printf("%3d",x-=2);
}while(!(--x));
輸出的結果是【C】。
A.1  3    B.1  -1    C.1  -2    D.1  -3
x   3   0                           
x-=2    1   -2                          
--x 0   !(-3)=0                         

6. 有程式段:
int a;
for (scanf (“%d”,&a);!a;)
    printf (“continue”);
則for語句中的!a等價於【C】。
(A)a!=0  (B)a= =0  (C)a>0 (D)a>=0
解析方式:
    !a   1  0
    a!=0 0  1
    a==0 1  0
7. 有如下程式段:
int x=1,y=1;
int m,n;
m=n=1;
switch (m)
{
    case 0:x=x*2case 1:
    {
        switch (n)
        {
            case 1:x=x*2; -> x=2
            case 2:y=y*2;break; -> y=2
            case 3:x++;
        }
    }
    case 2:x++;y++;->x=3;y=3
    case 3:x*=2;y*=2;break;->x=6;y=6
    default:x++;y++;
}
執行完成後,x和y的值分別是【A】。
(A)x=6  y=6    (B)x=2  y=1  (C)x=2  y=2   (Dx=7  y=7
8. 以下描述不正確的是【C】。
A.使用while和do-while迴圈時,迴圈變數初始化的操作應在迴圈體語句之前完成
B.while迴圈是先判斷表示式,後執行迴圈語句
C.do-whilefor迴圈均是先執行迴圈語句,後判斷表示式
D.forwhile 和do-while迴圈中的迴圈體均可以由空語句構成
9. 若x是int型變數,以下程式的輸出結果是【D】。
for (x=3;x<6;x++)
  printf ((x%2)?(“**%d”):( “##%d\n”),x);
printf (“\n”);
A.* * 3        B.# # 3      C.# # 3       D.* * 3 # # 4
   # # 4           * * 4          * * 4# # 5       * * 5
   * * 5           # # 5
10.與“for (i=0;i<10;i++)putchar ('a'+i);”功能不同的語句是【A】。
A)for (i=0;i<10;)putchar ('a'+(++i));
B)for (i=0;i<10;) putchar ('a'+(i++));
C)for (i=0;i<10;putchar ('a'+i),i++);
D)for (i=0;i<=9;i++)putchar ('a'+i);
11.迴圈控制語句“while (!scanf (“%d”,&i))getchar ( );”執行的情況是【C】。
A)迴圈輸入字元,遇檔案結束符EOF退出     
B)迴圈條件有錯,不能執行     
C)若輸入資料i有錯,繼續輸入資料
D)鍵入i值後,回車退出迴圈
解析過程:
    !scanf(“%d”,&i);判斷資料輸入是否正確
    getchar();如果資料掃描錯誤,就吸收掉錯誤資料
12. 已知x=3、y=2,則表示式 x*=y+8的值為【C】。
A)3    B)2     C)30    D)10
13. 設x為int型變數,則執行以下語句後,x的值為【B】。
x=10;x+=x- =x-x;
A)10    B)20     C)40    D)30
解析過程:嚴格區分賦值運算子和複合運算子,只有最後一次才是真正的賦值操作,其餘過程   都是在獲取運算表示式的資料
14. 在下列描述中,正確的一條是【C】。
A)if (表示式)語句中,表示式的型別只限於邏輯表示式
B)語句“goto 12;”是合法的
C)for(;;)語句相當於while1)語句 
D)break語句可用於程式的任何地方,以終止程式的執行
解析過程:
    A選項中,關係表示式
    B選項中,識別符號的命名法則
    D選項中,break只能用於迴圈結構和switch分支結構當中
15. 下面程式的輸出結果是【C】。
#include <stdio.h>
void main( )
{
    int i,j,m=0,n=0;
    for (i=0;i<2;i++)
        for (j=0;j<2;j++)
            if (j>=i)m=1;n++;
                printf("%d\n",n);
}
A)4    B)2     C)1    D)0
16. 若輸入字串:abcde<回車>,則以下while迴圈體將執行【C】次。
While ((ch=getchar ( ))= = ' e ')printf(" * ");
A)4    B)5     C)0    D)任意
17. 設j為int型變數,則下面for 迴圈語句的執行結果是【B】。
for (j=10;j>3;j--)
{
    if (j%3)j--;
    --j;--j;
    printf ("%d",j);
}
 A)6 3    B)7 4     C)6 2    D)7 3
18. 以下迴圈體的執行次數是【C】。
#include <stdio.h>
void main()
{
    int i,j;
    for (i=0,j=1;i<=j+1;i+=2,j--)0<=2
        printf ("%d\n",i);       2<=1
}
 A)3    B)2     C)1    D)0
19. 以下程式的輸出結果是【C】。
#include <stdio.h>
void main( )
{  
    int a=-1,b=1,k;
    if((++a<0)&&!(b--<=0))  printf("%d %d\n",a,b);
    else printf("%d %d\n", b, a);
}
A)-1 1       B)0 1     C)1 0        D)0 0
20. 下面程式的功能是輸出以下形式的金字塔圖案:
4   1
3   3
2   5
1   7
#include <stdio.h>
void main( )
{
int i,j;
for(i=1;i<=4;i++)-->1,2,3,4
{
for(j=1;j<=4-i;j++)printf(" ");-->3,2,1,0
for(j=1;j<=      ;j++)printf("*");
printf("\n ");-->
}
}
在下劃線處應填入的是【B】.
A)i       B)2*i-1     C)2*i+1        D)i+2
21. 以下程式的輸出結果是【A】。
#include <stdio.h>
void main( )
{  
    int i;
    for(i=1;i<6;i++)
    {  
        if(i%2)
{
printf("#");
continue;
}
        printf("*");
    }
    printf("\n");
}
A)#*#*#       B)#####     C)*****        D)*#*#*
22. 在下列選項中,沒有構成死迴圈的程式段是【C】。
A)int i=100       B)for(;;);     C)int k=1000;       D)int s=36;
   while(1)                         do                  while(s);空語句
   {i=i%100+1;                     {++k;}                   --s;
    if(i>100)break;                  while(k>=10000);
   }
答案:C

23. 執行下面的程式:
#include <stdio.h>
void main( )
{  
    char c[6]; a b \n c \n d e f
    int i=0;
    for(;i<6;c[i]=getchar( ),i++);
    for(i=0;i<6;i++)putchar(c[i]);
    printf("\n");
}
如果從鍵盤上輸入:
    ab<回車>
    c<回車>
        def<回車>
則輸出結果為【C】。
A)a       B)a     C)ab       D)avcdef
   b          b         c                 
   c          c         d                    
   d         d                              
   e
   f
24. 下面程式的輸出結果是【C】
#include <stdio.h>
void main( )
{  
    int x=5,a=0,b=0;
    if(x!=(a+b)) printf("x=5\n");
    else printf("a=b=0\n");
}
A)有語法錯,不能通過編譯       B)通過編譯,但不能連線
C)x=5                          D)a=b=0
25. 當輸入為”right?”時,下面程式的執行結果是【C】。
#include <stdio.h>
void main( )
{    
    char c;
    c=getchar( );
    while((c=getchar())!='?')
        putchar(++c);
}
A)Right                 B)jhiu
C)right                          D)sjhiu?
26. 下面程式的輸出結果是【D】。
#include <stdio.h>
void main( )
{
    int x=3;
    do{
        printf("%3d",x+=1);4 4
    }while(--x);3 3
}
A)4                 B)4 4
C)4 4 4                  D)死迴圈
27. 若變數已正確定義,要求程式段寫成5!的計算,不能完成此操作的程式段是【B】。
A)for(i=1,p=1;i<=5;i++) p*=i;                
B)for(i=1;i<=5;i++){p=1;p*=i;}            
C)i=1;p=1;while(i<=5){p*=i;i++;}                    
D)i=1;p=1;do{p*=i;i++;}while(i<=5);
28. 有以下程式:
#include <stdio.h>
void main( )
{  
    int i=1,j=2,k=3;
    if(i++==1&&(++j==3||k++==3))    
        printf("%d %d %d\n",i,j,k);
}
程式執行後的輸出結果是【D】(20054月)
(A)1 2 3      (B)2 3 4      (C)2 2 3      (D)2 3 3
29. 有如下程式:
#include <stdio.h>
void main( )
{  
    int i,sum;
    for(i=1;i<=3;sum++)  
        printf("%d\n",sum);
}
該程式的執行結果是【C】。
(A)6       (B)3       (C)死迴圈     (D)0
30. 執行以下程式後,如果從鍵盤上輸入china#<回車>,則輸出結果為【C】。
A)20   (B)50  (C)55  (D)25
#include <stdio.h>
void main( )
{  
    int v1=0,v2=0;
    char ch;
    while ((ch=getchar( ))!= '#')
        switch (ch)
        {  
            case 'a':
            case 'h':
            default:v1++;->1 2 3 4 5
            case '0':v2++;->1 2 3 4 5
        }
    printf("%d,%d\n",v1,v2);
}
31. 下面程式執行結果是【A】。
#include <stdio.h>
void main()
{ 
    int a,b,c,d,x;
    a=c=0;
    b=1;d=20;
    if(a) d=d-10;
    else if(!b)
        if(!c)x=15;
        else x=25;
    printf("%d\n",d);
}
(A)20   (B)25    (C)15     (D)10
32. 寫出下列程式的執行結果【B】。
#include <stdio.h>
void main()
{  
    int k=0;char c='A';
    do
    { 
        switch(c++) 
        {
            case 'A':k++;break;
            case 'B':k--;
            case 'C':k+=3;break;
            case 'D':k=k%2;continue;
            case 'E':k=k*6;break;
            default:k=k/4;
        }
        k++;2 5 9 1 7 
    }while (c<'G');B C D E F G
    printf("k=%d\n",k);
}
(A)2   (B)k=2   (C)k=3     (D)k=6
33. 定義:int x=7,y=8,z=9;後,則下面表示式為0的是【D】。
A)' x ' && ' y '            B)x<=y
C)x||(y+z&&y-z)               D)!((x<y) &&!z||1)
34. 若w=1,x=2,y=3,z=4,則條件表示式w<x?w:y<z?y:z的值是【D】。
A)4           B)3           C)2          D)1
解析過程:三元運算子所組成的三元表示式巢狀情況,從右往左進行運算(類似於新增括號的
修改運算子優先順序特點)
35. 以下程式:
#include <stdio.h>
void main()
{  
    int w=4,x=3,y=2,z=1;
    printf("%d\n",(w<x?w:z<y?z:x));
}

其輸出結果是【A】。
A)1      B)2      C)3      D)4
36. 若a和b均是正整數變數,正確的switch語句是【D】。
A)  switch(pow(a,2)+pow(b,2))   (注:呼叫求冪的數學函式)
{->pow();函式的運算結果是實數型別
case 1case 3:y=a+b;break;
case 0case 5:y=a-b;
}
B)  switch(a*a+b*b)  
{
case 3case 1: y=a+b;break;
case 0: y= b - a;break;->兩個正整數的平方和不可能等於0
}
C)  switch  a ->switch關鍵字後面的表示式必須採用小括號括上
{
default:x=a+b;
case 10: y=a-b;break;
case 11: x=a*d;break;
}
D)  switch (a+b) 
{
case 10: x=a+b;break;
case 11: y=a-b;break;
}
37. 對以下程式:
#include <stdio.h>
void main()
{ 
        int c;
    while((c=getchar())!='\n')->getchar();函式所獲取的輸入都是字元型別
        { 
            switch(c-'2')->字元型別和整數型別之間的轉換
        { 
                case 0:
                case 1:putchar(c+4);
                case 2:putchar(c+4);break;
            case 3:putchar(c+3);
                default:putchar(c+2);break;
            }
    }
printf("\n");
}
從第一列開始輸入資料:2473<CR>(<CR>代表回車符),程式的輸出結果是【A】。
A)668977      B)668966      C)66778777      D)6688766
38. 以下程式:
#include <stdio.h>
void main()
{  
    int n[2]={0}, i,j,k=2;
    for(i=0;i<k;i++)
        for(j=0;j<k;j++) n[j]=n[i]+1;
    printf("%d\n",n[k]);
}
其輸出結果是【A】。
A)不確定的值      B)3      C)2      D)1
39. 有以下程式
#include <stdio.h>
void main()
{  
    int i=1,j=1,k=2;
    if((j++||k++)&&i++)  printf("%d,%d,%d\n",i,j,k);
}
執行後輸出結果是【C】。
A)112      B)221      C)222      D)223
40. 以下程式的輸出結果是【C】。
#include <stdio.h>
void main()
{  
    int a= -1,b=1,k;
    if((++a<0)&&!(b--<=0))
        printf("%d %d\n",a, b);
    else
        printf("%d %d\n",b, a);
}
A)-1 1      B)0 1      C)1 0      D)0 0
41. 閱讀以下程式:
#include <stdio.h>
void main()
{  
    int x;
    scanf ("%d",&x);
    if (x--<5) printf("%d",x);
    else printf("%d",x++);
}
程式執行後,如果從鍵盤上輸入5,則輸出結果是【B】(20019月)
A)3      B)4      C)5      D)6
42. 以下程式的輸出結果是【A】。
#include <stdio.h>
void main()
{  
    int n=4;
    while(n--) printf("%d",--n);->2,0
}
A)2 0      B)31      C)321      D)210
43. 設有以下定義
int a=0;double b=1.25;char c= 'A'
#define d 2->預編譯指令在預處理階段得到處理,因此程式實質為2++,錯誤,非變數
則下面語句中錯誤的是【B】。
A)a++;      B)b++;      C)c++;      D)d++;
44. 有以下程式
#include <stdio.h>
void main()
{  
    int a=3,b=4,c=5,d=2;
    if(a>b)
        if(b>c)
            printf("%d",d+++1);
        else 
            printf("%d",++d+1);
    printf("%d\n",d);
}
程式執行後的輸出結果是【A】。(20049月)
A)2      B)3      C)43      D)44
45. 下列條件語句中,功能與其他語句不同的是【D】。
A)if(a) printf("%d\n",x);else printf("%d\n",y);  
B)if(a==0) printf("%d\n",y);else printf("%d\n",x);
C)if(a!=0) printf("%d\n",x);else printf("%d\n",y);
D)if(a==0) printf("%d\n",x);else printf("%d\n",y);
解析過程:a<==>a!=0;   !a<==>a==0;
46. 有以下程式
#include <stdio.h>
void main()
{  
    int i;
    for(i=0;i<3;i++)
        switch(i)
        {
            case 1:printf("%d",i);
            case 2:printf("%d",i);
            default:printf("%d",i);
        }
}
執行後輸出結果是【A】。
A)011122     B)012      C)012020      D)120
47. 有以下主程式
#include <stdio.h>
void main()
{  
    int a=15,b=21,m=0;
    switch(a%3)
    {
        case 0:m++;break;
        case 1:m++;
        switch(b%2)
        {
            default:m++;
            case 0:m++;break;
        }
    }
    printf("%d\n",m);
}
程式執行後的輸出結果是【A】。
A)1     B)2      C)3     D)4
48. 以下程式的功能是:按順序讀入10名學生4門功課的成績,計算出每位學生的平均分並輸出。程式如下:
#include <stdio.h>
void main()
{
    int n,k;
    float score,sum,ave;
    sum=0.0;
    for(n=1;n<=10;n++)
    {
        for(k=1;k<=4;k++)
        {
            scanf("%f",&score);sum+=score;
        }
        ave=sum/4.0;
        printf("No%d:%f\n",n,ave);
    }
}
上述程式執行後結果不正確,除錯中發現有一條語句出現在程式中的位置不正確。這條語句是【A】。
A)sum=0.0;   B)sum+=score;    C)ave=sum/4.0;   D)printf(“NO%d:%f\n”,n,ave);
49. 有以下程式
#include <stdio.h>
void main()
{ 
    int i,n=0;
    for(i=2;i<5;i++)
    {
        do
        { 
            if(i%3) continue;
            n++;
        }while(!i);
        n++;
    }
    printf("n=%d\n",n);
}
程式執行後輸出結果是【D】。
A)n=5      B)n=2       C)n=3      D)n=4
50. 執行下面的程式後,a值為【A】。
#include <stdio.h>
void main( )
{  
    int a,b;
    for(a=1,b=1;a<=10;a++)
    {  
        if(b>=5) break;
        if(b%3==1)
        { 
            b+=3;continue;
        }
        b-=5;
    }
    printf("%d",b);
}
A)7      B)8      C)9      D)10
51. 若有以下定義:
float x;int a,b;
則正確的switch語句是【C】。
A)switch(x)                       B)switch(x)      
   { case 1.0:printf(“*\n”);     {       case 1,2:printf(“*\n”);
     case 2.0:printf(“**\n”);            case 3:printf(“**\n”);
   }                                 }
C)switch(a+b)                     D)switch(a+b)
{ case 1:printf(“\n”);         {      case 1:printf(.”*\n”);
      case 1+2:printf(“**\n”);            case 2:printf(“**\n”);
    }                                 }
52. 執行下面程式段的結果是【B】。
#include <stdio.h>
void main( )
{  
    int x=23;
    do
    {
        printf("%2d",x--);
    }while(!x);
}
A)列印出321      B)列印出23      C)不列印任何內容       D)陷入死迴圈
53. 下面程式的輸出是【D】。
#include <stdio.h>
void main( )
{   
    int x=3,y=6,a=0;
    while(x++!=(y-=1))4,5 5 4 
    {
        a+=1;1 2 
        if(y<x)
            break;
    }
    printf("x=%d,y=%d,a=%d\n",x,y,a);
}
A)x=4,y=4,a=1    B)x=5,y=5,a=1    C)x=5,y=4,a=3    D)x=5,y=4,a=1
54. 下面程式段的執行結果是【C】。
    int n=0;
    while (n++<=2);
    printf ("%d",n);
A)2           B)3           C)4          D)有語法錯誤
55. 已知x、a、b、c、d均為int型變數,則執行如下程式段後x的值是【D】。
a = 1; b = 2; c= 3; d = 4;
x = (a<b) ? a : b;
x = (a<c) ? a : c;
x = (a<d) ? a : d;
A)4             B)3           C)2              D)1
56. 若有以下定義語句float x; int a,b;則以下正確是【C】。
A)switch(x)                      B)switch(x) 
{                                {
case 1.0: printf(“*”);                case 1,2: printf(“*”);
case 2.0: printf(“* *”) ;              case 2: printf(“**”) ;
}                                }  
C)switch(a+b)                      D)switch(a)
{                                {
case 1: printf(“*”);          case 1,2: printf(“*”);->逗號表示式
case 2: printf(“* *”) ;       case 2: printf(“**”) ;
}                                }  
57. 執行下列程式段後x的值是【A】。
int a,b,c,x;
a = 0; b = 0; c= 0; x = 7;
if (!a) x--;  else if (b);
if(c) x=3;  else x=4;
A)4             B)6           C)7              D)3
58. 執行下列程式段後x的值是【B】。
int a,b,c,d;
a = 1; b = 7; c= 15; d = 10;
if (a<b) x--; 
if(c<d) x=1;
else 
if (a<c)
if(b<d) x=2
else x=3;4
else x=6;
else x=7;
A)1             B)2           C)6              D)7
59. 如下程式的輸出結果是【C】。
#include <stdio.h>
void main()
{
    int a,b,c,d;
    a = 2; b = -6; c= 5;
    if (a<b)  if(b<0)  c=0; 
    else c++;
    printf (" %d \n", c);
}
A)0             B)1           C)5              D)6
60. 以下五條語句中有【D】是合法的。
if (a=b) x++;   if (a=<b) x++;   if (a-b) x++;   if (a<=b<=c) x++;  if(1) x++;
A)1             B)2           C)3              D)4
61. 以下結論中正確的是【B】。
A)break語句是switch語句中的一部分
B)switch語句中可以根據需要使用或不使用break語句
C)break語句只能用於迴圈結構中
D)以上三個結論中沒有一個正確
62. 執行下列程式段後x的值是【C】。
int a=10;
switch (a)
{
case 9: a++;
case 10: a++;
case 11: a++;
default: a++;
}
A)11             B)12           C)13              D)10
答案:C

63. 關於以下三條語句的描述中,正確的是【A】。
 if(a) a=1;else a=2;   if(a= =0) a=2;else a=1;   if(a!=0) a=1;else a=2;
A)三條語句相互等效               B)三條語句中與等效
C)三條語句中與等效          D)三條語句各不等效
64. 如下程式的輸出結果是【A】。
#include <stdio.h>
void main()
{
    int x=1,a=0,b=0;
    switch (x)
    {
        case 0: b++;
        case 1: a++;
        case 2: a++; b++;
    }
    printf ("a=%d , b=%d \n", a,b);
}
A)a=2 , b=1       B)a=1 , b=1       C)a=1 , b=0       D)a=1 , b=2
65. 下面的4段程式都試圖求解整數1一l0的和,不能滿足要求是【C】。
A)  #include <stdio.h>                  B)  #include <stdio.h>
void main()                             void main()
{                                       { 
int i,sum;                              int i,sum
for(i =1,sum=0;i<=10;++ i)              i =1,sum=0; 
sum+= i;                            for( ; i<=10;)
printf(" i=%d sum=%d\n ",i,sum);            sum+=i++;        
}                                       printf("i=%d sum=%d\n ",i,sum); 
}
C)  #include <stdio.h>                   B)#include <stdio.h>
void main()                             void main()
{                                       { 
int i,sum;                              int i,sum
i =1,sum=0;                             i =1,sum=0; 
for(;i<=10;++i,sum=sum+i);              for( ; i<=10; sum=sum+i;++i)
printf("i=%d sum=%d\n",i,sum);    printf("i=%d sum=%d\n",i,sum);
}                                       }
66. 下面程式的執行結果為【C】。
#include <stdio.h>
void main()
{
    int i,sum;
    i=1,sum=0;
    for (;i<=10;)
        ++i;
    sum=sum+i;
    printf("i=%d sum=%d\n",i,sum);
}
A) i=11,sum=55                  B) i=10,sum=55
C) i=11,sum=11                  D) 形成死迴圈
67. 下面程式的執行結果為【D】。
#include <stdio.h>
void main()
{
    double sum=0.0,x;
    for(x=0.0;x!=3.0;x+=0.1)
        sum+=x;
    printf("\n x=%f", x);
}
A) x=3.0                        B) x=2.0
C) 會提示出錯                    D)形成死迴圈
68. 下面程式的執行結果為【A】。
#include <stdio.h>
void main()
{
    int sum=0,x;
    for(x=0;x!=3;x+=1)
        sum+=x;
    printf("\n x=%d, x=%d ",x,sum);
}
A) x=3, sum=3                   B) x=2, sum=3
C) 會提示出錯                    D)形成死迴圈
69. 定義如下變數int n=10;則下列迴圈的輸出結果是【B】。
while(n>=7)
{
n--;
printf(“%d\n”,n);
}
        A)10             B)9           C)10              D)9
           9                  8              9                   8
           8                  7              8                   7
           7                  6   
70. 有以下程式段,w和k都是整型變數,則不能與它等價的迴圈語句是【C】。
    w=k;
A: 
    if(w==0) goto B;
    w--;
    printf("*");
    goto A;
B:
    printf("f");
A)for(w=k;w!=0;w--)  printf(“*”);
B)w=k;  while(w--!=0) printf(“*”);
C)w=k;  do{w--;printf(“*”);}while(w!=0);
D)for(w=k;w;--w) printf(“*”);
71. 若i、j已定義為int型,則以下程式段中內迴圈體的總的執行次數是【B】。
for(i=6;i;i--)
for(j=0;j<5;j++)
{……}
A)25             B)30           C)36              D)死迴圈
72. 設x和y為int型變數,則執行下面的迴圈後,y的值為【C】。
    for(y=1,x=1;y<=50;y++)
    {
        if (x>=10) break;
        if (x%2==1)->1 2 3 4 5 6
        {
            x+=5; 
            continue;
        }
        x-=3;
    }
A)2              B)4            C)6               D)
73. 設a和b為int型變數,則執行下而的迴圈後,b的值為【C】。
a=1; b=10;
do 
{
b-=a; 
a++;
}while(b--<10)->2 8
A)-1              B)-2            C)8               D)9
74. 當執行以下程式段時【A】。
x=-1;
do 
{
x=x*x;
}while(!x)
A)迴圈體將執行一次              B)迴圈體將執行兩次
C)迴圈體將執行無限次         D)會提示有語法錯誤
75. 以下敘述正確的是【D】。
A)do-while語句構成的迴圈不能用其它語句構成的迴圈代替
B)do-while語句構成的迴圈只能用break語句退出
C)用do-while語句構成的迴圈,在while後的表示式為非0時結束迴圈
D)用do-while語句構成的迴圈,在while後的表示式為0時結束迴圈
76. 在以下程式段中,while迴圈體執行的次數是【C】。
int k=0;
while(k=1)  k++;
A)迴圈體將執行一次                 B)迴圈體將一次也不執行
C)迴圈體將執行無限次               D)會提示有語法錯誤
77. 以下程式執行後,sum的值是【A】。
#include <stdio.h>
void main()
{   
    int n,sum;
    for(n=1;n<6;n++)
        sum+=n;
    printf("%d\n",sum);
}
A)15            B)14              C)0          D)不確定
78. 以下程式執行後,輸出結果是【A】。
#include <stdio.h>
void main()
{
    int n=0;
    while(n<=2)
    {
        n++;
        printf("%d\n",n);
    }
}
        A)1            B)1              C)2          D)2
           2               2                  3
           3 
79.當把以下四個表示式用作if語句的控制表示式時,有一個選項與其它三個選項含義不同,這個選項是【D】。
A)k%2    B)k%2==1    C)(k%2)!=0  D)!k%2==1
80.有以下程式
#include <stdio.h>
void main()
{ 
    int k=5,n=0;
    while(k>0)
    { 
        switch(k)
        { 
            default : break;
            case 1 : n+=k;
            case 2 :
            case 3 : n+=k;->3,5,7
        }
        k--;
    }
    printf("%d\n",n);
}
程式執行後的輸出結果是【D】。
A)0  B)4     C)6     D)7
81.有以下程式
#include <stdio.h>
void main()
{
    int i=1,j=2,k=3;
    if(i++==1&&(++j==3||k++==3))
        printf("%d %d %d\n",i,j,k);
}
程式執行後的輸出結果是【D】。
A)1 2 3  B)2 3 4     C)2 2 3     D)2 3 3
82.若整型變數a、b、c、d中的值依次為:1432。則條件表示式a<b?a:c<d?c:d的值是【A】。
A)1  B)2     C)3     D)4
83.有以下程式
#include<stdio.h>
void main()
{ 
    int i, s=0;
    for(i=1; i<10; i+=2)  
        s+=i+1;
    printf("%d\n", s);
}

程式執行後的輸出結果是【D】。
A)自然數19的累加和     B)自然數110的累加和
C)自然數19中奇數之和    D)自然數110中偶數之和
86.有如下程式:
#include<stdio.h>
void main()
{ 
    int s=0,a=1,n;
    scanf("%d",&n);
    do
    { 
        s+=1;
        a=a-2;
    }while(a!=n);
    printf("%d\n",s);
}
若要使程式輸出值為2,則應該從鍵盤輸入的值是【B】。
A)-1     B)-3    C)-5    D)0
87.有以下程式段
int n,t=1,s=0;
scanf("%d",&n);
do{ s=s+t; t=t-2; }while (t!=n);
為使此程式段不陷入死迴圈,從鍵盤輸入的資料應該是【D】。
A)任意正奇數     B)任意負偶數
C)任意正偶數     D)任意負奇數
88.有以下程式
#include<stdio.h>
void main()
{ 
    int a=1,b;
    for(b=1;b<=10;b++)
    { 
        if(a>=8) break;
        if(a%2==1) {a+=5;continue;}
        a-=3;
    }1->2->3->4->
    printf("%d\n",b);
}
程式執行後的輸出結果是【B】。
A)3  B)4     C)5     D)6
二、填空題
1. 下面程式的功能是在螢幕上顯示圖形:
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
填空:
#include <stdio.h>
void main( )
{
    int i,j;
   for(i=1;i<=5;i++)
   {  
        printf("\n");
        for(j=i; j>=1 ;j--)
             printf("%2d ", j); 
    }
}
2. 執行下面程式:
#include<stdio.h>
void main( )
{
    int x;
    scanf("%d",&x);
    if(x++>5)
        printf("%d\n", x);
    else
        printf("%d\n", x--);
}
若輸入5,其輸出結果是 63. switch語句中的表示式允許是 任何 表示式,其值必須是 整型 ,或 字元型 ,或 列舉
行 。switch語句中的常量表示式,其限制是: 常量表示式中的運算元必須是常量,嚴
謹變數出現;它的值型別必須是整型,或字元型,或列舉型,且要與switch後的表示式匹
配;各常量表示式值不能相同 。
4. while、do whilefor語句正常退出迴圈的條件是 在迴圈體內必須有修改控制迴圈結
束的表示式指語句,使其值從非0變為0 ,否則會造成 死迴圈 。
5.三種重複結構能相互巢狀嗎? 能 。使用迴圈巢狀結構的要點是: 內層和外層的迴圈控
制變數不能相同;巢狀迴圈的執行,總是從內迴圈到外迴圈,即內迴圈完整地執行一次,
外迴圈只執行一次 。
6. 程式填空:
程式功能:求e=1+1/1!+1/2!+1/3!+ …的近似值,誤差小於1×10-8。請將正確答案寫在橫線處。
#include <stdio.h>
 #include <math.ch>  
# define EPS le-8
void main ( )
{
  double e= 1 , fact=1;  long n=0;
  do
  {
     n++;
      fact=fact*n ;
      e=e+1/fact;
  }while ( fabs(1/fact)>=EPS  );
  printf (“計算e值:%0.8f\n”,e);
  printf (“調庫函式:%0.8f\n”,exp (1,0));
}
7. break語句只能用於 switch多分支結構 語句和 迴圈結構  語句。
8. 在迴圈控制中,break語句用於結束 本層迴圈 ,continue語句用於結束 本次迴圈  。
9. 有如下程式段
int n=0;
int sum=0;
while (n++,n<50)
{ 
    if (n= =(n/2)*2)
    continue;
    sum+=n;
}
printf (“%d\n”,sum);
此段程式執行的輸出結果為       ,while迴圈共執行了       次。
答案:62549

10. 下列程式執行後的輸出結果是      。
# include <stdio.h>
void main ( )
{
    int i,j,k;
    for (i=1;i<=6;i++)
    {
        for (j=1;j<=20-2*i;j++)
            printf (" ");
        for (k=1;k<=i;k++)
            printf ("%4d",i);
        printf ("\n");
    }
}
程式外迴圈執行6次,列印6行。對於第i次外迴圈:內迴圈輸出數字i共i個。程式執行結果如下:








11. 有以下程式:
#include <stdio.h>
void main ( )
{ 
    int i=1,j=1,k=2;
    if ((j++||k++)&&i++)    printf ("%d,%d,%d\n",i,j,k);
}

執行後輸出的結果是      。
A)112      B)221      C)222      D)223
答案:C

12. 以下程式執行後的輸出結果是      。
#include <stdio.h>
void main ( )
{ 
    int a=1,b=3,c=5;
    if (c=a+b) printf ("yes\n");
    else printf ("no\n");
}

答案:yes

13. 以下程式的功能是:從鍵盤上輸入若干個學生的成績,統計計算出平均成績,並輸出低於平均分的學生成績,用輸入負數結束輸入。
#include <stdio.h>
void main ( )
{
float x[1000],sum=0.0,ave,a;
int n=0,i;
printf ("Enter mark:\n ");scanf ("%f ",&a);
while (a>=0.0&& n<1000)
{   
sum+   【1】   ;x[n]=    【2】   ;
n++;scanf ("%f ",&a);
}
ave=   【3】   ;
printf ("Output:\n ");
printf ("ave=%f\n ",ave);
for (i=0;i<n;i++)
if (   【4】  ) printf ("%f\n ",x[i]);
}
答案:【1】=a  【2】a  【3sum/n  【4】x[i]<sve

14. 以下程式將兩個數從小到大輸出。
#include <stdio.h>
void main ( )
{
float a,b,   【1】   ;
scanf (   【2】   ,&a,&b);
    if (a>b)
{
t=a;
   【3】   ;
b=t;
}
printf ("%5.2f,%5.2f\n",a,b);
}
答案:【1】t  【2" %f  %f "3】a=b

15. 若有以下程式:
#include <stdio.h>
void main( )
{
    int a=4,b=3,c=5,t=0;
    if(a<b)t=a;a=b;b=t;
    if(a<c)t=a;a=c;c=t;
    printf("%d%d%d\n",a,b,c);
}
執行後輸出結果是         。
答案:503

16.下面的if語句與y=(x>=10)?3*x-11:(x<1)?x:2*x-1;的功能相同,請補充完整。
if (   【1】   )
if (   【2】   )y=2*x-1;
else y=x;
else y=3*x-11;
答案:【1】x<102】x>=1

17. 有以下程式:
#include <stdio.h>
void main( )
{  
int i=0,s=0;
do
{  
if(i%2){i++;continue;}
i++;
s+=i;
}while(i<7);
printf(" %d\n ",s):
}
執行後的輸出結果是         。
A)16       B)12     C)28        D)21
答案:A

18. 以下主程式執行後的輸出結果是       (20039月)
#include <stdio.h>
void main( )
{  
    int i,m=0,n=0,k=0;
    for(i=9;i<=11;i++)
        switch(i%10)
        {
            case 0:m++;n++;break;
            case 10: n++;break;
            default:k++;n++;
        }
    printf("%d  %d  %d \n",m,n,k);
}
答案:1  3  2

19. 以下程式是利用公式π=4*(1/1-1/3+1/5-1/7+…)來計算π的值。其中,變數k表示當前符號項,t表示當前項,n表示當前項的序號,要求精度控制在0.00001內。試分析程式,完成空標號處應填的內容。
# include <math.h>
# include <stdio.h>
void main( )
{  
float pi,t,n,k;
pi=0.0;n=k=t=1.0;
while(     (1)      )
{  
pi+=t;k=-k;t=      (2)      ;n++;
}
pi=      (3)      :
printf("pi=%f\n",pi);
}
答案:(1)fabs(t)>0.000012)s/(2*n+1)  (34*pi

20. 寫出程式段的輸出結果      。
int a=100;
if (a>100) printf ("%d\n ",a>100);
else printf ("%d\n ",a<=100);
答:1。a>100不成立,輸出表示式a<=100的邏輯值真。

21. 若變數已正確定義,以下語句段的輸出結果是       。
x=0; y=2; z=3;
switch(x)
{
    case 0:
        switch(y==2)
        {
            case 1: printf("*");break;
            case 2: printf("%");break;
        }
    case 1:
        switch(z)
        {
            case 1: printf("$");
            case 2: printf("*");break;
            default: printf("#");
        }
}
答案:*#

22. 以下程式執行後的輸出結果是      。
#include <stdio.h>
void main()
{  
    int p=30;
    printf("%d\n",(p/3>0?p/10:p%3));
}
答案:3

23. 有以下程式
#include <stdio.h>
void main()
{  
    int a=5,b=4,c=3,d=2;
    if(a>b>c)
        printf("%d \n",d);
    else if ((c-1>=d)==1)
        printf("%d\n",d+1);
    else
        printf("%d\n",d+2);
}
執行後輸出結果是      。(20034月)
A)2      B)3      C)4      D)編譯時有錯,無結果
答案:B

24. 下面程式段是找出整數的所有因子,請填空。
    scanf ("%d",&x);
    i=1;
    for (;        ;)
    {
        if (x%i==0)
            printf ("%3d",i);
        i++;
    }
答:i<=x。所有因子包括1和整數本身。

25. 執行了以下程式片斷後,若原來x = 9,則輸出結果為_【_1_】_;若原來x = 6,則輸出結果為_【_2_】_。
    if(x++>8) printf("%d",x);  
    else printf("%d",x--);
答:【110; 【27

26. C語言提供了6種關係運算子_【_1_】__、_【_2_】__、_【_3_】__、_【_4_】__、_【_5_】__、_【_6_】__。
答:【1】>;【2】<;【3】>=;【4】<=;【5】= =;【6】!=

27. C語言中,關係表示式的值是一個_【_1_】__即真或假,一般以_【_2_】__代表真,以_【_3_】__代表假。
答:【1】邏輯值;【2】非0;【30

28. C語言提供三種邏輯運算子,包括_【_1_】__、_【_2_】__、_【_3_】__,這三種邏輯運算子中_【_4_】__的優先順序最高。
答:【1】&&     【2】||       【3】!    【4】!    

29.if-else結構中,else子句不能作為語句單獨使用,必須與_【_1_】__配對使用,且若ifelse後面有多條語句,則需用_【_2_】__將其成為一個複合語句。
答:【1if2】大括號

30. C語言中唯一的一個三目運算子是_【_1_】__,其一般形式為_【_2_】__。
答:【1】條件運算子;【2】表示式1?表示式2:表示式3

31. 以下兩條if語句可以合併成一條if語句是_【_1_】__。
答:if(a<b)  
{
    x=5; 
    printf("#%d#",x);
}
else  
{
    x=7; 
    printf("*%d*",x);
}

32. 執行程式片斷,當輸入n為1時,flag的值為_【_1_】__,當輸入n為7時,flag的值為_【_2_】__。
switch(n)
{
    case 1: 
    case 2:
    case 3: flag=1; break;
    case 4: flag=2; break;
    default: flag=3;
}
答:【1123

33. while迴圈結構中,當表示式為_【_1_】__時執行其中的內嵌語句;迴圈體如果包含一個以上的語句,應該用_【_2_】__括起來。
答:【1】非0;【2】花括弧

34. for迴圈語句的一般表達形式為“for(表示式1;表示式2;表示式3) {語句;}”若要省略表示式1,則必須_【_1_】__;若省略表示式2則認為表示式2始終為_【_2_】__;若省略表示式3則迴圈不能_【_3_】__。
答:【1】在for語句之間給迴圈變數賦初值;【2】真;【3】正常結束

35. for( ; ; )語句的等價while語句是_【_1_】__。
答:【1while (1)

36. while迴圈結構中,可以用_【_1_】__退出迴圈;用_【_2_】__退出本次迴圈。
答:【1break;【2continue

37. break語句,只能用於_【_1_】__和_【_2_】__語句中。
答:【1】迴圈語句;【2switch

38. 程式功能:下面程式求陣列a[3][3]主對角線上的元素之和,並按矩陣的形式輸出陣列及求得的結果。請填空,將程式補充完整。
#include <stdio.h>
void main()
{
    int a[3][3],i,j,s=0;
    printf("輸入矩陣元素:\n");
    for (i=0;i<3;i++)
        for (j=0;j<3;j++)
            scanf("%d,",    【1】    );
    printf("\n");
    for (i=0;i<3;i++)
            【2】    ;
    for (i=0;i<=2;i++)
    {
        for (j=0;j<=2;j++)
            printf("%5d",a[i][j]);
            【3】    
    }
    printf("主對角線和為:%d.\n",s);
}
答案:
【1】&a[i][j]     【2】s+=a[i][i]       【3】printf("\n");

39. 程式功能:以下程式是求如下所示分數序列的前20項之和。請填空,將程式補充完整。
2/13/25/38/513/8 ……
#include <stdio.h>
void main()
{ 
    int n,t;
    float x=2,y=1,s=0;
    for (n=1;n<=20;n++)
    { 
            【1】    
            【2】    
            【3】    
            【4】    
    }
    printf("the sum is:%f\n",s);
}
答案:
【1】s+=x/y;  【2】t=x; 【3】x=x+y;       【4】y=t;

40. 程式功能:從鍵盤上輸入若干個學生的成績,統計並輸出最高成績和最低成績,當輸入負數時結束輸入。請填空,將程式補充完整。
#include <stdio.h>
void main()
{
    float x,xmax,xmin;
    printf("輸入成績:\n");
    scanf("%f",&x);
    xmax=x;
        【1while(    【2】    )
    {
        if(x>xmax)  xmax=x;
        if(    【3】    )  xmin=x;
        scanf(    【4】    );
    }
    printf("max=%f,min=%f",xmax,xmin);
}
答案:【1】xmin=x;       【2】x>03】x<xmin       【4】“%f”,&x

41. 程式功能:輸出100以內能被3整除且個位數為6的所有正整數。請填空,將程式補充完整。
#include <stdio.h>
void main()
{
    int i,j;
    for(i=0;    【1】    ;i++)
    {
        j=    【2】    ;
        if(    【3】    )  continue;
        printf("%d",j);
    }
}
答案:【1】i<=92】i*10+63】i%3!=0

42. C語言編譯系統在給出邏輯運算結果時,以數值_【_1_】_代表“真”,以_【_2_】_代表“假”。
答案:【11;【20

43. C語言編譯系統在判斷一個量是否為“真”時,以_【_1_】_代表“真”,以_【_2_】_代表“假”。
答案:【1】非0;【20

44. 邏輯運算副兩側的運算物件可以是任何型別的資料,系統最終以0和非0來判斷它們屬於“真”或“假”。此說法正確嗎?_【_1_】_。
答案:【1】正確

45. 如果表示式x>y為真或a<b為真,則表示式(x>y&&a<b)為真。對嗎?_【_1_】_。
答案:【1】不正確

46. 如果至少有一個運算元為真,則包含||運算子的表示式為真。對嗎?_【_1_】_。
答案:【1】正確

47. 【_1_】_語句用於進行判斷。
答案:【1if

48. _【_1_】_選擇結構用於在條件為真時執行一個操作,條件為假時執行另一個操作。
答案:【1ifelse

49. else總是與_【_1_】_配對,必要時,可以通過加花括號來確定配對關係。
答案:【1】它前面的最近的if

50. switch後面括號內的表示式可以是整型表示式、_【_1_】_、_【_2_】_。
答案:【1】字元表示式;【2】列舉型資料

51. switch選擇結構中必須有default語句。此說法正確嗎?_【_1_】_。
答案:【1】不正確

52. switch選擇結構的default中必須有break語句才能正確退出這個結構。此說法正確嗎?_【_1_】_。
答案:【1】不正確

53. case後面只能是_【_1_】_常量表示式。
答案:【1】整型

54. 多個case可以共用一組執行語句。此說法正確嗎?_【_1_】_。
答案:【1】正確

55.while語句的特點是_【_1_】_。
答案:【1】先判斷表示式,後執行語句

56.do…while語句的特點是_【_1_】_。
答案:【1】先執行語句,後判斷表示式

57.do…while迴圈是當表示式為_  【_1_】  _時反覆執行迴圈體,表示式為_  【_2_】  _時結束迴圈。
答案:【1】真;【2】假

58.while和do…while迴圈時,迴圈變數初始化的操作應在_  【_1_】  _完成。
答案:【1while和do…while語句之前

59.在C中,凡用while迴圈能完成的,用_  【_1_】  _迴圈都能實現。
答案:【1for

60.for語句中的表示式1可以省略,此時應在_  【_1_】  _給迴圈變數賦初值。
答案:【1for語句之前

61.如果省略for語句中的表示式1,則其後的分號_  【_1_】  _省略。
答案:【1】不能

62.for語句中的三個表示式都可以省略,相當於_  【_1_】  _語句。
答案:【1while( 1 )

63.for語句中的表示式1和表示式3可以是一個簡單的表示式,也可以是_   【_1_】   _表示式。
答案:【1】逗號

64.如果for語句後面直接是_   【_1_】   _,其迴圈體為空語句。
答案:【1】分號

65.while、do…whilefor迴圈,可以用_  【_1_】  _語句跳出迴圈,用_  【_2_】  _語句結束本次迴圈。
答案:【1break;【2continue

66.break語句只能用於_  【_1_】  _語句和_  【_2_】  _語句。
答案:【1】迴圈;【2switch

67.continue語句和break語句的區別是:contine語句結束_  【_1_】  _,而break語句結束  _【_2_】  _。
答案:【1】本次迴圈;【2】整個迴圈

68.濫用_  【_1_】  _語句將使程式流程無規律、可讀性差。
答案:【1】goto

69.程式功能:求e=l+l/1!  +l/2!+1/3!  +…的近似值,誤差小於1×l0-8。請將正確答案寫在橫線處。
#include<stdio.h>1#define EPS 1e-8
void main( )
{ 
    double e=    【2】    , fact=1; long n=0;
    do
    { 
        n++;
            【3】    ;
        e=e+1/fact;
    }while (    【4】    );
    printf("計算e值:%0.8f\n", e);
    printf("調庫函式:%0.8f\n", exp(1.0));
}
答案:
【1#include<math.h>213】fact*=n;
【41/fact>EPS
70. 以下程式的功能是計算:s=1+12+123+1234+12345。請填空。
#include <stdio.h>
void main()
{ 
    int t=0,s=0,i;
    for( i=1; i<=5; i++)
    { 
        t=i+    【1】    ; 
        s=s+t; 
    }
    printf("s=%d\n",s);
}
【1】t*10

71. 以下程式的功能是輸出如下形式的方陣:
 13 14 15 16
 9 10 11 12
 5 6 7 8
 1 2 3 4
請填空。

#include <stdio.h>
void main()
{ 
int i,j,x;
for(j=4; j    【1】    ; j--)
{ 
for(i=1; i<=4; i++)
{ 
x=(j-1)*4 +    【2】    ;
printf("%4d",x);
}
printf("\n");
}
}
【1】>02】i

72.設x和y均為int型變數, 則執行下面的迴圈後, x、y的值分別為       ,        。
for(y=1, x=1; y<=50; y++)
{ 
    if(x>=10)  break;
    if(x%2 == 1) 
    {
        x+=5; continue; 
    }
    x-=3;
}
答案:10     6

73.執行下面的程式,如果從鍵盤上輸入5,則輸出結果是            。
#include <stdio.h>
void main()
{ 
    int x;
    scanf("%d",&x);
    if(x -- <5) printf("%d", x);
    else  printf("%d\n", x ++);     
}
答案;4

74. 以下程式執行後的輸出結果是______________
#include <stdio.h>
void main()
{  
    int x;
    for(x=0;x<3;x++)
        switch (x)
        {
            case 0:printf("%d", x);
            case 2:printf("%d", x);
            default:printf("%d", x);
        }
}
答案:000122

75.











三、問答題
1. 程式改錯
# include”stdio.h”
void main( )
{  char c;
   c=getchar( )
   switch c
     case 0,1,2,3,4,5,6,7,8,9:printf(“%d”,c-’0’);break;
       default:putchar(c);
}
解:
# include”stdio.h”
void main( )
{  char c;
   c=getchar( );     /*修改*/
   switch(c)        /*修改*/
   {  case0’:case1’:case2’:case3’:case4’:
        case5’:case6’:case7’:case8’:case9’:printf(“%d”,c-’0’):break; /*修改*/
        default:putchar(c);
}
    }
2. 寫出以下程式的執行結果
#include <stdio.h>
void main( )
{
    int i,j;
    for(i=j=1;j<=50;j++)
    {  
        if(i>=10)break;
        if(i%2)
        { 
            i+=5;
            continue;
        }
        i-=3;
    }
    printf("j=%d\n",j);
}
解:程式執行結果如下
j=6

3. 有程式如下:
#include <stdio.h>
void main( )
{
    char ch;
    ch=getchar( );
    if(ch>='a'&&ch<='m'||ch>='A'&&ch<='M')
        ch=ch+3;
    else
        if(ch>= 'n'&&ch<='z'||ch>='N'&&ch<='Z')
            ch=ch-3;
    printf("%c\n",ch);
}
假設從鍵盤上輸入Exit或輸入next後回車。試問printf語句列印出什麼資訊?
答:如果是輸入Exit後回車,則列印出大寫字母‘H’;如果是輸入next後回車,則列印出小寫字母‘k’。這是因為函式getchar( )在遇到回車符後,總是隻接收輸入字串的第1個字元。因此,如果輸入的是Exit後回車,那麼它接收的是大寫字母‘E’。這樣ch就落在ch>=‘A’ &&ch<=‘M’區間裡,使條件ch>=‘a’ &&ch<=‘m’‖ch>=‘A’ &&ch<=‘M’取真值,故對ch做ch=ch+3的操作,所以printf語句列印出大寫字母‘H’。如果是輸入next後回車,那麼getchar( )函式接收的小寫字母‘n’。這樣,ch就落在ch>=‘n’ &&ch<=‘z’區間裡,使條件ch>=‘n’&&ch<=‘z’‖ch>=‘N’&&ch<=‘Z’取真值,故對ch做ch=ch-3的操作,所以printf語句列印出小寫字母‘k’。

4. 閱讀下面的程式,它輸出什麼結果?
#include <stdio.h>
void main( )
{
    int x,y;
    for(x=1;x<=10;x++)
    {
        if(x==5)
        {
            y=x;
            continue;
        }
        printf("%d\t",x);
    }
    printf("\nUsed continue to skip printing the value£º%d\n",y);
}
【解】這是一個在for迴圈結構中使用continue語句的例子。題目的中心意思是由x從1~10控制printf的執行,把當時x的取值列印出來。但如果x等於5,那麼就強行結束這一次迴圈,即不去執行printf,而進入下一次迴圈。所以程式的執行結果是列印出如下結果:
1  2  3  4  5  6  7  8  9  10 
Used continue to skip printing the value:5

5. 閱讀下面的程式:
#include<stdio.h>
main( )
{
int j,k,x,y;
printf(“Enter integers in the range 1~20:\n”);
scanf(“%d%d”,&x,&y);
for(j=1;j<=y;j++)
{
for(k=1;j<=x;k++)
  printf(“@”);
  printf(“\n”);

}
}
執行後,最終輸出什麼?
答:輸出結果如下圖所示。
可以看出,輸入的第1個數(x)決定了輸出時每行列印的字元個數,輸入的第2個數(y)決定了列印的行數。上圖是列印8行,每行列印20個字元‘@’。


6. 閱讀下面的程式:
#include<stdio.h>
void main( )
{
    int x;
    scanf("%d",&x);
    if(x>=4)
        while(x--);
    printf("%d\n", ++x);
}
如果輸入為5,則其輸出為什麼?
答:最後輸出為0。這是因為在while迴圈裡,最後判別到x為0時,迴圈停止。但在x上還要做“--”操作,從而退出迴圈後x的真正取值是-1。然而在列印時,又先對x進行“++”操作。所以最後輸出為07. 程式改錯
程式功能:模擬加法和減法運算程式。請修改程式中的錯誤並除錯。
# include<stdio.h>
# include<stdilb.h>
void main( )
{
  int a,b;char op;
  printf (“輸入兩個整數:”);
  scanf (“%d %d”,&a,&b);
  printf (“輸入運算子(+ -):”);
  scanf (“%c”,&op);
  switch (op)
  {
    case +:printf (“%d+%d=%d\n”,a,b,a+b);break;
    case-; printf (“%d- %d=%d\n”,a,b,a-b); break;
    default:printf (“輸入運算子錯!\n”);exit(1);
  }
}
【提示】第一次編譯有錯誤,游標停在case +:printf (“%d+%d=%d\n”,a,b,a+b);break;行的“p”處,出現第一個錯誤資訊:Expression syntax in function main
【解析】case的+和-應改為字元常量’+’和’-’。
排除錯誤,再編譯無錯誤。
輸入兩個整數:10 20<回車>
輸入運算子(+ -):輸入運算子錯!
執行錯誤。
【解析】因scanf (“%c”,&op)語句讀入了一個換行符,不是讀入操作符’+’或’-’,所以產生執行錯誤。在語句scanf (“%d %d”,&a,&b)後加語句scanf (“% * c”),跳過換行符不讀,就可保護正常讀入操作符’+’或’-’。
程式執行示例:
輸入兩個整數:10 20
輸入運算子(+ -):+
10+20=30

8. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後。
#include <stdio.h>
void main ( )
{
    int sum=0,n=0;
    while (1)
    {
        n=n+1;
        if (n>5)break;
        if (n%2)continue;
        sum+=n;
    }
    printf ("sum=%d  n=%d\n",sum,n);
}
執行結果:
sum=6  n=6

9. 程式改錯
程式功能:求正整數n以內的奇數。請修改程式中的錯誤,並除錯。
# include <stdio.h>
void main ( )
{
    int n,i=1;  long sum=0;
    printf ("輸入一個正整數:");
    scanf ("%d",&n);
    while (i<n)
        i+=2;
    sum+=i;
    if (n%2==0)   n--;
    printf ("輸出1+3+5+…+%d=%1d\n",n,sum);
}
【提示】編譯無錯誤,執行有錯誤。
程式執行示例:
輸入一個正整數:10<回車>
輸出1+3+5+…9=11
程式執行結果錯誤。
【解析】由於多個語句含義寫錯,造成邏輯錯誤:
long sum=0;  應改為 long sum=1;
while 迴圈語句,應改為:
  while (i<n)
  {
    i+=2;
    sum+=i;
  }
n--; 應改為n++;
程式執行示例:
輸入一個正整數:10<回車>
輸出1+3+5+…+11=36
10. 以下程式在輸入52之後的輸出是      。
#include <stdio.h>
void main( )
{
    int s,t,a,b;
    scanf ("%d,%d",&a,&b);
    s=1;
    t=1;
    if (a>0) s=s+1;         /* ① */
    if (a>b) t=s+t;          /* ② */
    else if (a==b) t=5;
    else t=2*s;
    printf ("s=%d,t=%d\n",s,t);
}
解:在輸入52後,a=5,b=2。執行語句①,s=2,執行語句②,a>b為真,t=s+t=2+1=3。所以程式輸出為:s=2,t=3

11. 閱讀下面程式,回答指定的問題。
#include <stdio.h>
void main ( )
{
    int a,b,m,n;
    scanf ("%d%d,\n",&a,&b);
    m=1;n=1;
    if (a>0) m=m+n;
    if (a<b) n=2*m;
    else if (a==b) n=5;
    else n=m+1;
    printf ("m=%d n=%d\n",m,n);
}問:
(1)當輸入為:-12<回車>時,程式的執行結果是什麼?
(2)當輸入為:1 0<回車>時,程式的執行結果是什麼?
(3)為了輸出n=4,變數a和b應具備什麼條件?
解:(1)m=1,n=1,輸入後,a=-1,b=-2,a>0為假,a<b和a= =b 都為假,執行語句n=m+1=2; 所以輸出為:m=1  n=2。
   (2)m=1,n=1,輸入後,a=1,b=0,a>0為真,執行語句m=m+n=2;a<b和a= =b都為假,執行語句n=m+1=3;所以輸出為:m=2 n=3。
   (3)要使n=4,就應執行語句m=m+n和n=2*m,為此要求滿足條件a>0和a<b,即0<a<b。

12. 說明以下兩個程式段的不同點。
程式段1int i,n=0;
for (i=0;i<10;i++)
{
    n++;
    if (i>5)continue;
}
printf ("i=%d,n=%d\n",i,n);
程式段2int i,n=0;
while (i<10)
{
    n++;
    if (i>5) continue;
    i++;
}
printf ("i=%d,n=%d\n",i,n);
解:表面上看這兩個程式段的功能是相同的,程式段2只是將程式段1中的for語句用相應的while語句替換。實際上,如果其中沒有continue語句或將continue改為break語句,這兩段程式的功能是相同的。但continue語句的功能是退出本次執行的迴圈體,重新開始下一次迴圈,對於for迴圈,<表示式3>不包含在迴圈體中,所以在下次迴圈之前執行<表示式3>,而while迴圈不包含<表示式3>。
對於程式段1,執行for語句,當i=6時,滿足if條件,執行continue語句,執行i++,i值為7,執行下一次迴圈,如此直到<表示式2>即i<10不再滿足,此時i=10,n=10。對於程式段2,執行while語句,當i=6時,滿足if條件,執行continue語句,i值仍為6,執行下一次迴圈,滿足if 條件,執行continue語句,i值仍為6,執行下一次迴圈……如此形成了死迴圈。
為了使程式段2與程式段1的功能等價,只需將與for語句<表示式3>對應的語句放在continue語句之前執行。即改為:
int n=0,i=0;
while (i<10)
{
    n++;
    i++;
    if (i>5) continue;
}
printf ("i=%d,n=%d\n",i,n);

13. 試說明以下兩個if語句的區別:
(1if (x>0)          (2if (x>0)
       if (y>0)n=1;            {if (y>0)n=1;}
       else n=2;              else n=2;
答:前者屬於第一種if單分支巢狀,如果x>0才執行內嵌的if語句,n賦值非12,如果x≤0,n不被賦值。後者屬於第二種if-else雙分支,如果x>0又執行一個巢狀的if單分支語句,y>0時n被賦值1,否則n不被賦值;如果x≤0,n被賦值214. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main ( )
{
    int a=2,b=2,x,y;
    x=a++;
    y=++b;
    printf("%d,%d\n ",x,y);
    printf("%d,%d\n",a++,++b);
}
執行結果是:
答案:執行結果是:   2, 3
3, 4

15. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main ( )
{
    int a=3,b=7;
    printf("%d, ",(a++)+(++b));
    printf("%d, ",b%a);
    printf("%d, ",!(a>b));
    printf("%d ",a+b);
}
執行結果是:
答案:執行結果是:11, 0, 1, 12

16.閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main ( )
{
    short n=65535;
    n++;
    printf("n=%d\n",n);
}

執行結果是:
答案:執行結果是:0
簡析:65535的記憶體形式為11111111 11111111,其加1後就變為00000000 00000000,即是017. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    int n;
    printf ("輸入序號");
    scanf("%d", &n);
    switch(n)
    {
        case 0: printf ("SUN\n");
        case 1: printf ("MON\n");
        case 2: printf ("TUE\n");
        case 3: printf ("WED\n");
        case 4: printf ("THU\n");
        case 5: printf ("FRI\n");
        case 6: printf ("SAT\n");
    }
}
當輸入4時,程式的執行結果是:
答案:         THU
FRI
SAT

18. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    int n;
    printf ("輸入成績");
    scanf("%d", &n);
    n/=10;
    switch(n)
    {
        case 9: printf ("優\n");
        case 8: printf ("良\n");
        case 7: printf ("中\n");
        case 6: printf ("合格\n");
        default: printf ("差\n");
    }
}
當輸入53時,程式的執行結果是:
當輸入79時,程式的執行結果是:
答:當輸入53時,程式的執行結果是:
差
當輸入79時,程式的執行結果是:
中
合格
差

19. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    int a,b,c;
    a=2; b=3; c=1;
    if(a>b)
        if(a>c)
            printf("%d\n",a);
        else 
            printf("%d\n",b);
    printf("end");
}
執行結果是:
答:          end

20. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{ 
    int i,j;
    for (i=1;i<=4;i++)
    {
        for (j=28-i*2;j>=1;j--)
            printf(" ");
        for (j=1;j<=2*i-1;j++)
            printf("* ");
        printf("\n");
    }
    for (i=3;i>=1;i--)
    {
        for (j=28-i*2;j>=1;j--)
            printf(" ");
        for (j=1;j<=2*i-1;j++)
            printf("* ");
        printf("\n");
    }
}
執行結果是:
答案:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*

21. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    int m,n,t,a,b;
    printf("請輸入2個數:");
    scanf("%d,%d",&m,&n);
    if(m<n)
    {
        t=m;m=n;n=t;
    }
    a=m;b=n;
    while(n!=0)
    {
        t=m%n; m=n; n=t;
    }
    printf("%d\n%d\n",m,a*b/m);
}
該程式完成的功能是:
若輸入632則執行結果是:
答案:功能是:求兩個數的最大公約數和最小公倍數。
執行結果是:     
2
96

22. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    char c;
    int l,s,n,o;
    l=0;s=0;n=0;o=0;
    printf("請輸入一行字元:");
    while((c=getchar())!='\n')
    {
        if(c<='Z' && c>='A' || c<='z' && c>='a') l++;
        else if(c<='9' && c>='0') n++;
        else if(c==' ') s++;
        else o++;
    }
    printf("\n%d,%d,%d,%d\n",l,s,n,o);
}
該程式完成的功能是:
若輸入ab2. 3c7 **則執行結果是:
答案:
功能是:統計一行字元中字母、空格、數字、其它字元的個數。
執行結果是:
3,2,3,3

23. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    int n;
    for(n=1;n<6;n++)
    {
        if(n%2) 
        { 
            printf("#");
            continue;
        }
        printf("*");
    }
    printf("\n");
}
執行結果是:
答案:
執行結果是:     
# * # * #

24. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    char i,j;
    for(i='a',j='z';i<j;i++,j--)
        printf("%c %c ",i,j);
    printf("\n ");
}
執行結果是:
a z b y c x d w e v f u g t h s i r j q k p l o m n 

25. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main( )
{
    char c[7];
    int i=0;
    for (;i<7;c[i]=getchar(),i++);
    for (i=0;i<7;i++) putchar(c[i]);
}
若輸入    AB <回車>
CD<回車>
EFG<回車>   
則執行結果是:
答案:執行結果是:
AB
CD
E

26. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main( )
{
    char c1,c2,c3,c4;
    c1='A';  c2='b';
    c3=c1+('a'-'A');
    c4=c2-('a'-'A');
    printf("%c->%c\n",c1,c3);
    printf("%c->%c\n",c2,c4);
}
答案:執行結果是:
A->a
b->B

27. 閱讀程式,並按給定的輸出格式將程式執行結果寫在“執行結果:”之後
#include <stdio.h>
void main()
{
    int a=1,b=2,c=3;
    if(c=a) printf("%d\n",c);
    else printf("%d\n",b);
}
執行結果:

答案:1

28.判斷並糾正下列程式中的錯誤。
#include <stdio.h>
void main()
{
    int n;
    printf("n=");
    scanf("%d",n);
    if(n<7);
        printf("n is less than 7\n");
    if(n=>7)
        printf("n is equal to or greater than 7\n");
}
答案:原語句1:scanf("%d",n);  應改為:scanf("%d",&n);
原語句2if(n<7);   應改為:if(n<7)
原語句3if(n=>7)   應改為:if(n>=7)

29.尋找下列程式程式碼中的錯誤並說明如何糾正。
#include<stdio.h>
void main()
{ 
int gender;
printf("gender=");  
scanf("%d",&gender);
if(gender=1)
        printf("Woman\n");
else;
        printf("Man\n");
}
答案:原語句1if(gender=1)    應改為:if(gender==1)
原語句2else;  應改為:else

30. 尋找下列程式程式碼中的錯誤並說明如何糾正。
#include<stdio.h>
void main()
{ 
int n;
printf("n=");   
scanf("%d",&n);
switch(n){
case 1: printf("The number is 1\n");
case 2: printf("The number is 2\n");
    break;
default:
        printf("The number is not 1 or 2\n");
}
}
答案:原語句   case 1:  printf("The number is 1\n");
應改為: case 1:  printf("The number is 1\n");  break;

31. 程式功能:求正整數n以內的奇數。請修改程式中的錯誤,並除錯。
#include<stdio.h>
void main()
{   
    int n, i=1; 
    double sum=0;
    printf("輸入一個正整數:");
    scanf("%d", &n);
    while(i<n)
    i+=2;
    sum+=i;
    if(n%2==0)  n--;
    printf("輸出1+3+5+…+%d=%f\n", n, sum);
}
【提示】編譯無錯誤,執行有錯誤。
 程式執行示例:
 輸入一個正整數:10<回車>
 輸出1+3+5+…+9=11
 程式執行結果錯誤。
答案:
原語句1double sum=0;  應改為:double sum=1;
原語句2:i+=2;  應改為:{ i+=2;
原語句3if(n%2==0)  n - -; 應改為:if(n%2==0)  n - -; }

32. 下列程式程式碼列印110的值,判斷並糾正其中的錯誤。
#include<stdio.h>
void main()
{ 
    int n=1;
    while(n<10);
    printf("%d\n",n);
}
答案:
原語句1while(n<10);   應改為:while(n<=10) 或while(n<11)
原語句2:printf("%d\n",n);  應改為:printf("%d\n",n++);

33. 尋找下列程式程式碼中的錯誤並說明如何糾正。
#include<stdio.h>
void main()
{   
    for( y=.1;y!=1.0;y+=.1)
        printf("%f\n",y);
}
答案:
原語句1for( y=.1;y!=1.0;y+=.1)    應改為:for( int y=1;y!=10;y++)
原語句2:printf("%f\n",y);  應改為:printf("%f\n",(float)y/10);


四、程式設計題
1. 從鍵盤輸入一個字元,輸出該字元的按字典排列順序的下一個字元,例如,輸入a,則輸出b。如果輸入的字元不在26個英語字母中,則顯示輸入資料有誤,如果輸入的字元是z或Z,則輸出a或A。
解:
#include <stdio.h>
void main( )
{
    char c;
    printf("Please enter a char:");
    c=getchar( );   /*輸入一個字元*/
    if (c>='a'&&c<='y'||c>='A'&&c<='Y')
    /*字元是除了z以外的是26個字母中的一個*/
        putchar(c+1);
    else if(c=='z'||c=='Z')    /*字元是小寫或大寫的z*/
        putchar(c-25);
    else
        printf("Data error!");
}
2. 編寫程式,求a+aa+aaa+…+aa…a,其中a是一個數字。例如:3+33+333+3333+33333(此時n為5)。要求a和n從鍵盤輸入,輸出格式為3+33+333+3333+33333=37035。
解:方法一:
# include <stdio.h>
void main( )
{
    int sum,s,j;
    int i,a,n;
    printf("\nEnter a and n:");
    scanf("%d%d",&a,&n);
    sum=0;
    j=1;
    for(i=n;i>0;i--)
    {  
        s=i*j*a;
        sum=sum+s;
        j=j*10;
    }
    for(i=1;i<=n;i++)/*開始輸出*/
    {  
        for(j=1;j<=i;j++)
            printf("%d",a);
        if(i==n)
            printf("=%1d\n",sum);
        else
            printf("+");
    }
}
方法二:
#include <stdio.h>
void main( )
{
    long sum,s,a;
    int i,n,j,b;
    printf("\nEnter a and n:");
    scanf("%1d%d",&a,&n);
    sum=0;
    s=0;
    b=a;    /* 暫存a */
    for(i=1;i<=n;i++)
    {  
        s=s+a;
        sum=sum+s;
        a=a*10;
    }
    for(i=1;i<=n;i++)/*開始輸出*/
    { 
        for(j=1;j<=i;j++)
            printf("%d",b);
        if(i==n)
            printf("=%1d\n",sum);
        else
            printf("+");
    }
}
程式執行時,首先顯示Enter a and n :
如果使用者輸入:2 5
則執行結果為:
2+22+222+2222+22222=24690

3. 編寫程式,輸入一個正整數,計算並顯示該整數的各位數字之和,例如,整型數1987的各位數字之和是1+9+8+7,等於25。
解:
#include <stdio.h>
void main( )
{  
    int i,sum;
    int k;
    printf("\nEnter a integer:");
    scanf("%d",&i);
    sum=0;
    while(i!=0) 
    {  
        k=i%10;          /*取數字的最後一位*/
        sum=sum+k;       /*累加到計數器中*/
        i=i/10;          /*去掉數字的最後一位*/
    }
    printf("sum is %d\n",sum);
}

4. 在歌手大獎賽中有若干裁判為歌手打分,計算歌手最後得分的方法是:去掉一個最高分,去掉一個最低分,取剩餘成績的平均分。編寫程式,輸入一個歌手的若干成績,以-1作為輸入結束標記,計算歌手的最後得分。
解:
#include <stdio.h>
void main( )
{  
    float score,min,max,sum=0;
    int i=0;
    printf("\nEnter some score end with -1:");
    scanf("%f",&score);     /*輸入第一個分數*/
    min=max=score;          /*設讀入第一個分數為最高分和最低分*/
    while(score!=-1)
    {  
        i++;                    /*計數器增1*/
        sum=sum+score;      /*分數累加*/
        scanf("%f",&score); /*輸入下一個分數*/
        if(score>max)           /*剛輸入的分數大於最高分*/
            max=score;
        if(score<min&&score!=-1)    /*剛輸入的分數小於最低分*/
            min=score;
    }
    sum=sum-max-min;            /*去掉一個最高分和一個最低分*/
    printf("Final score is %6.2f\n",sum/(i-2));  /*輸出最後的分數*/
}
執行情況:
Enter some score end with-19.8 9.75 9.65 9.88 9.761
Final score is 9.77

5. 編寫程式計算:    



答:
程式如下:
#include <stdio.h>
void main ( )
{
    int i, j, result=0;
    printf ("Please input a integer:");
    scanf("%d",&i);
    if (i<=5)
       for (j=1;j<=i;j++)
        result=result+j;
    else if (i>10)
        result=i*i;
    else 
    {
        result=100;
        for (j=i;j>=1;j--)
            result=result-j;
    }
    printf ( "result=%d\n",result );
}

6. 編寫一個程式能讀入並計算一個只包含加減運算的表示式,每個輸入的資料都是浮點數,除第一個數以外,其餘每個數前面都有一個運算子,如“23+43-233+234;”表示式以分號“;”結束。
答:
程式如下:
#include<stdio.h>
void main ( )
{
    float temp,sum;
    char ch,operat;
    printf ("\nplease input a digital expression:");
    scanf ("%f",&sum);
    ch=getchar( );
    while(ch!=';')
    {
        scanf ("%f",&temp);
        switch (ch)
        {
            case '+':
                sum=sum+temp;
break;
            case '-':
                sum=sum-temp;
                break;
            default:
                printf ("Error input\n");
                return;
        }
        ch=getchar( );
    }
printf ("%f\n",sum);
}

7. 編寫一個程式求滿足以下公式的變數k的最大值。
           2k≤m
其中,m是程式輸入的一個正整數。
答:
程式如下:
#include <stdio.h>
void main ( )
{
    int i,k=0,m,temp=1;
    printf ("Please input a integer(m):");
    scanf ("%d",&m);
    do
    {
        k++;
        temp=temp*2;
    }while(!(temp>=m));
    printf ("m=%d\tk=%d\t2^%d>=%d\n",m,k,k,m);
}

8. 編寫一個程式,找出被235整除時餘數均為1的最小的10個自然數。
答:
程式如下:
#include <stdio.h>
void main ( )
{
    int i=1;
    int count=0;
    printf ("\n能被2,3,5整除時餘數為1的最小10個自然數是:\n");
    while (count<=10)
    {
        if ((i%2==1)&&(i%3==1)&&(i%5==1))
        {
            count++;
            printf ("%d\n",i);
        }
        i++;
    }
}

9. 編寫一個程式,用以記錄在鍵盤上輸入的字元個數,直到輸入回車換行符時止。
【解】程式編寫如下:
#include<stdio.h>
void main( )
{
    int n= -1;
    char ch;
    do
    {
        n++;
    }while((ch=getchar( ))!='\n');  
    printf("The character's number of input is %d.\n",n);
}
假如在鍵盤上輸入abcdefg後回車,那麼會顯示資訊:
The character’s number of input is 7.
程式裡,之所以把變數n的初始值設定為-1,是為了確保計數的準確性。如果一開始就按Enter鍵,那麼n就應該是0。在程式設計中,這些細微之處是必須考慮到的。

10. 編寫一個程式,它列印出個位數是6、且能被3整除的所有三位正整數及其個數。要求一行列印8個資料。
【解】題目中要求列印的是三位數,且個位數必須是6。因此可以for迴圈,它的迴圈控制變數從106開始,直到996為止,增量為10(因此要保證個位數是6)。由於還要列印這種資料的總個數,因此需要設定一個用於計數的變數,比如是count。發現一個這樣的數,它就加1。為了滿足一行列印8個資料要求,可以利用計數器count,讓這樣的數一個個地列印下去。如果count %8= =0,就列印一個回車換行。具體程式如下:
#include <stdio.h>
void main( )
{
    int count=0,j;
    for(j=106;j<=996;j+=10)
    {
        if(j%3!=0)
            continue;
        else
        {
            count++;
            printf("%d\t",j);
            if(count%8==0)  
                printf("\n");
        }
    }
    printf("\nThe count is %d\n",count);
}
執行此程式,輸出結果如下圖所示。

11. 編寫一個C語言程式,列印出如下的圖形(a)(b)和(c)。

答:(a)的程式如下:
#include <stdio.h>
void main()
{
    int x,y;
    for(x=10;x>=1;x--)
    {
        for(y=1;y<=x;y++)
            printf("* ");       //列印一個*號和一個空格
        printf("\n");
    }
}
(b)的程式如下:
#include<stdio.h>
void main( )
{
    int x,y;
    for (x=1;x<=10;x++)
    {
        for(y=1;y<=10;y++)
            if(y<=10-x)
                printf("  ");   //列印兩個空格
            else
                printf("* ");   //列印一個*號和一個空格
            printf("\n");
    }
}
(c)的程式如下:
#include <stdio.h>
void main( )
{
    int x, y;
    for(x=1;x<=10;x++)
    {
        for(y=1;y<=10;y++)
            if(y<=x-1)
                printf("  ");   //列印兩個空格
            else
                printf("* ");   //列印一個*號和一個空格
            printf("\n");
    }
}

12. 利用下面的公式,求π的近似值:
π/4=1-1/3+1/5-1/7+…±1/n…
迴圈直到1/n的絕對值小於0.0001時止。
答:程式編寫如下:
#include<stdio.h>
void main( )
{
    double pi=0.0,n=1.0,y=1.0,x,z;
    do
    {
        x=y/n;
        pi+=x;
        y*=-1.0;
        n+=2;
        z=x<0?-x:x;
    }while(z>1e-7);
    printf("¦Ð=%lf\n",4*pi);
}
程式中,不斷在x裡形成1/1、-1/31/5、-1/7等,並將其累加到pi上去。由y*=-1.0;構成每項的正負號。用變數z來控制迴圈的次數(不能直接用x來控制,因為它可能是負的。z裡實際上是x的絕對值)。執行結束,輸出結果:π=3.14159813. 應用switch語句,判斷兩個整數a和b的大小,或相等。例如,輸入a=10,b=5,輸出10>5;輸入a=5,b=15,輸出5<15;輸入a=25,b=25,輸出25=25。
【解析】
(1)分析題意,建立資料模型,設計演算法。
switch語句的常量表示式不能用關係表示式。將關係表示式轉換為序號:
pvalue=1 *(a>b)+2* (a= =b)+3*(a<b)
pvalue的值只能為1,或2,或3。pvalue作為switch語句的表示式,其常量表示式為123。
需要定義三個變數:
輸入量  int a,b;
中間量  pvalue;
再確定執行步驟。用自然語言描述演算法:
第一步  讀入a,b。
第二步  應用switch多選一判定,並輸出相應資訊。
(2)程式設計。
#include <stdio.h>
void main ( )
{
    int a,b,pvalue;
    printf ("輸入兩個整數:");
    scanf ("%d %d",&a,&b);
    pvalue=1 * (a>b)+2*(a==b)+3*(a<b);
    switch (pvalue)
    {
        case 1:printf ("輸出:%d>%d\n",a,b);break;
        case 2:printf ("輸出:%d==%d\n",a,b);break;
        case 3:printf ("輸出:%d<%d\n",a,b);break;
    }
}
(3)程式執行示例
輸入兩個整數:10 5
輸出:10>5
輸入兩個整數:10 10
輸出:10= =10
輸入兩個整數:5 10
輸出:5<10

14. 輸入起始年號,輸出50年內的閏年。
【解析】
(1)分析題意,建立資料模型,設計演算法。
這個問題比較簡單,其演算法描述如下:
輸入起始年號year    scanf (“%d”,&year);
生成50年年號,可用for迴圈實現:
for (y=year;y<year+50;y++)
  if (y%4= =0&&y%100!=0‖y%400= =0)    /* 判閏年*/
  {
     printf (“%5d”,y);                    /*輸出閏年*/
     count+ +;                            /*控制換行*/
     if (count%10= =0)printf (“\n”)
   }
(2)程式設計。
#include <stdio.h>
void main( )
{
    int year ,count=0,y;
    printf ("輸入起始年號:");
    scanf ("%d",&year);
    for (y=year;y<year+50;y++)
        if (y%4==0&&y%100!=0||y%400==0) /* 判閏年 */
        {
            printf("%5d",y);count++;
            if(count%10==0) printf ("\n");      /* 控制換行*/
        }
    printf ("\n");
} 
(3)程式執行示例:
輸入起始年號:2000
2000 2004 2008 2012 2016 2020 2024 2028 2032 2036
2040 2044 2048

15. 求N內的勾股數(A2+B2=C2)A、B、C。
【解析】
(1)分析題意,建立資料模型,設計演算法。
該問題可用列舉法實現,直接用C語言描述:
scanf (“%d”,&n);             /* 輸入n */
for (A=1;A<n-1;A++)          /* 生成A值*/
  for (B=A+1;B<n;B++)         /*生成C值*/
  {
    C=(int)sqrt (A*A+B*B);       /*計算C值*/
    if (C<=n&&A*A+B*B==C*C)  /* 輸出勾股數*/
    {
      printf (“[%5d”“%5d”%5d]  “,A,B,C);
      count + +;
      if (count%3= =0) printf (“\n”);
    }
  }
(2) 程式設計。
#include <stdio.h>
#include <math.h>
void main( )
{
    int n,A,B,C,count=0;
    printf("輸入一個正整數:");
    scanf ("%d",&n);
    for (A=1;A<n-1;A++)
        for (B=A+1;B<n;B++)
        {
            C=(int)sqrt(A*A+B*B);
            if (C<=n&&A*A+B*B==C*C)
            {
                printf ("[%5d %5d %5d]",A,B,C);count++;
                if (count%3==0)printf ("\n");
            }
        }
    printf ("\n");
}
(3)程式執行示例
輸入一個正整數:40
[    3    4    5 ]    [     5     12     13 ]     [     6     8     10 ]
[    7   24   25 ]    [     8     15     17 ]     [     9     12    15 ]
[    10  24   26 ]    [    12     16     20 ]     [    12     35    37 ]
[    15  20   25 ]    [    15     36     39 ]     [    16     30    34 ]
[    18  24   30 ]    [    20     21     29 ]     [    21     28    35 ]
[    24  32   40 ]   

16. 找出1~999之內的能被3整除、且至少有一位數字為5的整數,以每行15個整數形式輸出。
【解析】
(1)分析題意,建立資料模型,設計演算法。
(2)程式設計。
#include <stdio.h>
void main ( )
{
    int n,found1,found2,count=0,t;
    for (n=1;n<=999;n++)
    {
        found1=0;found2=0;
        if (n%3==0)found1=1;       /*判別n能否被3整除*/
        t=n;                       /*判別n是否含有數字5*/
        while (found1 && t!=0 && !found2)
        {
            if (t%10==5)found2=1;    
            t/=10;
        }
        if (found1 &&found2)        /* 輸出滿足條件的n和計數*/
        {
            printf ("%4d",n);  
            count++;
            if(count%15==0) printf ("\n");  /*控制換行*/
        }
    }
    printf ("\n");
}
(3)程式執行示例:
15  45  51  54  57  75  105  135  150  153  156  159  165  195  225
252 255 258  285 315 345  351  354  357  375  405  435  450  453  456
459 465 495  501 504 507  510  513  516  519  522  525  528  531  534
537 540 543  546 549 552  555  558  561  564  567  570  573  576  579
582 585 588  591 594 597  615  645  651  654  657  675  705  735  750
753 756 759  765 795 825  852  855  858  885  915  945  951  954  957
975

17.100g的藥品,用天平稱量,砝碼只有1g、2g、5g共3種,問:若要求加的砝碼總數為50個,有幾種不同的加法?若要求總數為30個呢?請程式設計求解上述問題。
答案:本題的實質也是求不定方程的正整數解,由題意列出的不定方程為:x+2y+5(50-x-y)=100,化簡為4x+3y=150,使用二重迴圈窮舉所有可能的x、y的正整數值的組合,對每種組合分別判斷是否滿足方程。
#include <stdio.h>
void main ( )
{ 
    int i,j,k,sum=0;
    for (i=0;i<50;i++)
    { 
        for (j=0;j<=50-i;j++)
        {
            k=50-i-j;
            if (i+j*2+k*5==100)
            {
                ++sum;
                printf ("one result:%2d,%2d,%2d\n",i,j,k);
            }
        }
    }
    printf ("sum=%d",sum);
}

18. 編寫一個程式,求滿足以下條件的最大的n:
12+22+32+…n2≤1000
解:n從1開始,然後遞增,並且每次計算累加平方和s,當s剛大於1000時,這時的n-1便是滿足該條件的最大的值。程式如下:
#include <stdio.h>
void main ( )
{
    int n,s;
    s=n=0;
    while (s<=1000)
    {
        ++n;
        s+=n*n;
    }
    printf ("n=%d\n",n-1);
}
本程式的執行結果為:



19. 編寫一個程式,對於使用者輸入的正偶數n,將其分解成兩個素數之和。
解:設使用者輸入的正偶數為a,a=b+d,b和d是兩個素數。假定b是較小的素數,則b<=a/2,且至少是奇數。判定b是素數的方法是其不能被2到sqrt (b)之間的任何數除盡。程式如下:
#include <stdio.h>
#include <math.h>
void main( )
{
    int a,b,c,d;
    scanf ("%d",&a);
    for (b=3;b<=a/2;b+=2)
    {
        for (c=2;c<=sqrt(b);c++)        /*找素數b*/
            if (b%c==0) break;
        if (c>sqrt(b))              /*找到了素數b,求出d*/
        {
            d=a-b;
            for (c=2;c<=sqrt (d);c++)/*判定d是否是素數*/
                if (d%c==0)break;
            if (c>sqrt(d))          /*d是素數,則找到了一個解,退出*/
            {
                printf ("%d=%d+%d\n",a,b,d);
                break;
            }
        }
    }
}

20. 兩個乒乓球隊進行比賽,各隊出3人。甲隊為A、B、C3人,乙隊為X、Y、Z 3人。以抽籤決定比賽名單。有人向隊員打聽比賽的名單,A說他不和X比,C說他不和X、Z比。請編寫程式找出3對賽手的名單。
解:設X、Y、Z三位隊員的編號分別為123。設a、b、c分別表示A、B、C三位隊員的對手編號。顯然有a、b、c互不相同(因為每人都有不同的對手),即a!=b &&b!=c && c!=a成立,另外依題意有a!=1 && c!=1 && c!=3成立。所以應滿足條件:
a!=b && b!=c && c!=a && a!=1 && c!=1 && c!=3
採用三重for迴圈求解的程式如下:
#include <stdio.h>
void main( )
{
    int a,b,c;
    for (a=1;a<=3;a++)
        for (b=1;b<=3;b++)
            for (c=1;c<=3;c++)
                if (a!=b && b!=c &&c!=a && a!=1  && c!=1 && c!=3) 
// 已經找到各自的對手,則輸出結果
                {
                    printf ("A<-> %c\n",char(a+'W'));
                    printf ("B<-> %c\n",char(b+'W'));
                    printf ("C<-> %c\n",char(c+'W'));
                }
}
本題求解結果如下:






21. 驗證:任何四個相鄰的自然數(0除外)的乘積不是完全平方數,但乘積加1後則是完全平方數,如:15 * 16 * 17 * 18=73440不是,但73441=271*271是。用指標實現。
答:驗證一個自然數是否完全平方數,可將這個數先開方再平方,看能否得到原數。
#include <stdio.h>
# include <math.h>
void main()
{ 
    int n,s;
    double r;
    printf ("input n:");
    scanf ("%1d",&n);
    s=n*(n+1)*(n+2)*(n+3);
    r=sqrt(s);
    if (s!=r*r) 
        printf ("n=%d\ts=%d\tsqrt(%d)=%f\n",n,s,s,r);
    else
    { 
        printf ("結論錯誤!\n");
        return;
    }
    s++;
    r=sqrt(s);
    if(s==r*r)
    {
        printf ("%d+1=%d=%d*%d\n",s-1,s,(int)r,(int)r);
        printf ("結論正確\n");
    }
    else printf ("結論錯誤!\n\n");
}
執行示例:input n:
          n=5    s=1680     sqrt (1680)=40.987803
          1680+1=1681=41*41
          結論正確

22. 編寫程式,求e的值。e≈1+1/1!+1/2!+1/3!+1/4!+…+1/n!
(1)用for迴圈,計算前50項。
(2)用while迴圈,要求直至最後一項的值小於10-4。
【分析與解答】
(1)本題的基本演算法是求累加值。累加項的分子部分都是1;分母的值有規律的遞增,依次為1!、2!、…、n!,即,若第i-1項的累加項為t i-1,則第i項的累加項是t i-1/i,在程式中可用表示式:t=t/i(i從1變化到n)來表示。
(2)根據以上分析,若用變數t來存放累加項,當i的值從1變化到n時,可用以下語句來實現累加:
        t=t/i;   e+=t;
(3)為了實現累加過程,以上語句應當放在迴圈內,迴圈控制變數從1變化到n。
(4)若用for迴圈,按題目要求已指定n的值是50。若用while迴圈,並沒有指定n的值,但已指定了迴圈結束的條件,當t的值小於10-4結束迴圈。
(5)現例示用while迴圈來求e值的部分程式:
i=1;e=1.0;t=1.0;
while(t>=le-4)
{ 
    t=t/i;
    e+=t;
    i++;
}
(6)請讀者自己對變數做出正確的定義,設計輸出語句,完善程式;也可以參考此程式段,按照自己的思路獨立地完成程式。
(7)e的值應當是:2.71828。
(8)根據以上分析,讀者已不難用for迴圈來實現求e值的計算。
(9)注意:在完成此程式時,不要對分母中的階乘值進行單獨計算,因為17!的值已超過int型別的最大值,更無法求到50!。

23. 編寫程式,對輸入的一行數字字元(用回車結束,每個數字字元的前後都有空格),把這一行中的所有數字轉換成一個整數。例如,若輸入(<CR>代表Enter鍵):
       2      4     8     3      <CR>  
則輸出整數:2483。
【分析與解答】
(1)一行字元的讀入,程式段如下。迴圈體內的“……”符號表示需要在迴圈體內完成的其他操作。
     ch=getchar( );
     while(ch!='\n')
     {  ……
       ch=getchar( );
       }
(2)在本題中迴圈體內需要把讀入的所有數字字元轉換成一個整數。若用變數n來存放這個整數,為了保證有效的存放,應當把它定義成long型別。
(3)要把輸入的一串數字字元轉換成一個整數,首先需要判斷當前讀入的字元是否是數字字元,若不是則什麼也不做;若是,則進行以下操作:
①把當前讀入的一個字元轉換成一個一位整數,這可由語句“d=ch-'0';”來實現,在這裡d是一個整型變數;
②把d中的一位數歸併到n的低位中,這可用語句“n=n *10+d;”來實現。這裡所述的操作可由以下語句來完成:
    if(ch>='0'&&ch<='9'){d=ch-'0';n=n * 10+d;}
if語句後一對括號中的判斷表示式可以呼叫字元函式isdigit來實現:
    if(isdigit(ch)){d=ch-'0'; n=n * 10+d;}
if子句的兩個語句可以合併成:n=n * 10+ch-'0';。
(4)把(3)中的語句放入迴圈中:
ch=getchar( );
while(ch!='\n')
    if(ch>='0'&&ch<='9')  n=n*10+ch-'0';     
        ch=getchar( );
(5)請自己寫出定義語句並賦初值。注意,最後輸出n時,應當使用格式說明%1d,而不能使用%d。

24. 編寫輸出以下圖案的程式,圖案的行數由輸入的值確定。




【分析與解答】
(1)若圖案的行數輸入到變數L中。
(2)按要求L決定了圖形的行數,因此可通過迴圈來實現L行的輸出;
          for(i=1;i<=L;i++)
          {  ……  }
迴圈體中的“……”號,代表輸出L行的操作。
(3)假定ch中存放了一個字元,我們知道,通過以下迴圈可以在一行上輸出n個字元:
           for(j=1;j<=n;j++)putchar(ch);
           putchar('\n' );
注意,在迴圈後putchar('\n' );語句不可少,它用以換行。
(4)現在應當解決如何按要求給出每行輸出的字元。由圖分析,行數(或行號)為1時輸出字元A,行數為2時輸出字母B……若輸出的字母放在變數ch中,行號取決於外迴圈的控制變數i,則輸出的字母和行號的關係可用表示式:ch='A'+i-1來表示。當i為1時ch中被賦予字母A,當i為2時ch中被賦予了字母B,其他依次類推。因此,在此表示式後,利用(3)中的迴圈就解決了各行上輸出的字母。
(5)按要求每行輸出的字母的個數不同,第二行輸出3個字母,第三行輸出5個字母,第四行輸出7個字母……(3)中for迴圈體的執行次數取決於n的值,也就是說n的值決定了每行輸出字母的個數。其實,n的值與行號有著密切的關係:n=2*i-1, 當i為1時n的值是1、當i為2時n的值是3、當i為3時n的值是5、當i為4時n的值是7。因此在(3)中for迴圈之前可用此表示式求出n的值。
(6)總結以上分析,我們可得到以下的程式段:
for(i=1;i<=L;i++)
{  
    ch='A'+i-1;
    n=2*i-1;
    for(j=1;j<=n;j++)putchar(ch);
        putchar('\n');
}
若所用的變數都已正確定義,通過輸入L的值為5,則程式段在第一列起有以下的輸出結果:





和題目的要求比較已趨接近,不同的是在每行沒有適當的縮排。
(7)現在來解決每行的縮排問題。由題中給出的圖形可知,若指定輸出5行,第一行縮排5個空格,第二行則縮排4個空格,第三行則縮排3個空格,第四行則縮排2個空格,第五行則縮排1個空格。這同樣可以由以下的for迴圈來實現:
for(k=L;k>=i;k--)putchar('');
把此迴圈放在i控制的迴圈體內、輸出每行字元的迴圈之前即可。
(8)請讀者自己補充有關的include行、語句和變數的定義,以完成整個程式。注意,如果有能力可在某些地方作些簡化。

25.for迴圈分別程式設計計算下式,變數用float型別,試分析結果不同的原因。
                   S=1-1/2+1/3-1/4+…+1/9999-1/1000001)從左到右計算。
(2)從右到左計算
答:只寫出程式的主要語句:
(1)float i,s=0,t= -1;
     for (i=1;i<=10000;i++){t=-t;s+=t/i;}
     printf (“s=%f\n”,s);
(2)float i,s=0,t=1;
     for (i=10000;i>=1;i--){t=-t;s+=t/i;}
     printf (“s=%f\n”,s);
運算結果對比:(10.69309120.693097
運算按從左到右,結果精度較低。因為當s達到一定值時,後面的1.0/i的值相對s來說太小,一些小數位將不能加到s上而丟失,即俗稱“丟失零頭”。如取相反順序,從右向左計算,可使較多的低位有效數字參加運算,實現“聚零為整”,結果精度較高。如果改用double型別計算,便可發現0.693097是比較準確的。

26. 由ex=1+x+x2/2!+x3/3!+x4/4!+…+xn/n!+…,計算ex的近似值,並與標準函式exp(x)結果相比較,N、X的值由鍵盤輸入,N、X的值宜小不宜大,如N=10,X=0.1。
答:除n以外,變數型別皆定義為double,使計算精度高一些。
#include <stdio.h>
#include <math.h>
void main( )
{ 
    int n;
    double e=1,x,i,j=1,m=1;
    printf ("n,x=");scanf ("%d %lf",&n,&x);
    for (i=1;i<=n;i++)
    {
        j*=i;m*=x;e+=m/j;
    }
    printf ("e=%12.9f exp(x)=%12.9f\n",e,exp(x));
}
執行結果:n,x=5 0.1
          e=1.105170917   exp(x)=1.105170918

27. 求無符號整型數範圍內最大的一個素數。
答 要點:從最大長整型數向遞減方向查詢,找到的第一個素數則是最大的素數。
#include <stdio.h>
#include <math.h>
void main( )
{ 
    unsigned int n=-1,i,k;      /* 賦值用n=-1,n即為最大無符號整型數*/
    while (n-=2)                /*從大向小查詢*/
    {
        k=sqrt (n);
        for (i=2;i<=k;i++)
            if (n%i==0)break;   /* 已判斷n不是素數,結束for迴圈*/
        if (i>=k+1)
        {
            printf ("max=%lu\n",n);
            break;
        }                       /*找到了結束while迴圈*/
    }
}
執行結果:max=4294967291

28. 甲乙丙三個步槍射手,命中率分別為0.70.60.5,按“甲→乙→丙→甲→乙→丙→…”的順序,相繼射擊同一目標,直至有人命中為止。試模擬擊中100個目標,所需要的子彈數。
答  要點:迴圈100次,模擬擊中100個目標。設子彈數s,開始為0。執行一次s++,產生一個0~1之間的隨機數,相當於一次射擊。每輪第1個隨機數如小於等於0.7,則認為甲命中,開始下一目標的射擊;否則,產生第2個隨機數,如小於等於0.6,則認為乙命中,開始下一目標的射擊;否則,產生第3個隨機數,如小於等於0.5,則認為丙命中,開始下一目標的射擊;否則按上述規則,從甲開始再射擊這一目標,直到有人命中。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main( )
{ 
    int i,s=0;
    srand(time(NULL));      //初始化隨機數種子
    for (i=1;i<=100;i++)
    { 
        while(1)
        { 
            s++;
            if ((rand()%100/100.0)<=0.7) break;
            s++;
            if ((rand()%100/100.0)<=0.6) break;
            s++;
            if ((rand()%100/100.0)<=0.5) break;
        }
    }
    printf ("s=%d\n",s);
}

29.編寫一個程式,輸入三條線段的長度,判斷這三條線段能否構成一個直角三角形。
答案:
#include <stdio.h>
void main()
{
    float a,b,c;
    printf("請輸入三條線段的長度:");
    scanf("%f,%f,%f",&a,&b,&c);
    if(a*a+b*b == c*c || a*a+c*c == b*b || b*b+c*c == a*a)
        printf("這三條線段能構成直角三角形。\n");
    else
        printf("這三條線段不能構成直角三角形。\n");
}
30. 編寫一個程式,求輸入實數的絕對值。
答案:
#include <stdio.h>
void main()
{
    float x,y;
    printf("請輸入一個實數:");
    scanf("%f",&x);
    if(x>0) y=x;
    else y=-x;
    printf("%f的絕對值是%f\n",x,y);
}

31. 編寫一個程式,輸出給定月份的天數。
答案:
#include <stdio.h>
void main()
{
    int year,mon,days,leap;
    printf ("請輸入年份月份");
    scanf("%d.%d", &year,&mon);
    switch(mon)
    {
        case 1: 
        case 3: 
        case 5: 
        case 7: 
        case 8: 
        case 10: 
        case 12: days=31;break;
        case 4: 
        case 6: 
        case 9: 
        case 11: days=30;break;
        case 2: 
            if(year % 400 == 0 || (year%4 == 0 && year%100 != 0)) days=29;
            else days=28;
    }
    printf ("%d年%d月的天數為%d天\n",year,mon,days);
}

32. 編寫一個程式,輸入一個不多於5位的正整數,求出它是幾位數。
提示:注意整型變數的範圍。
答案:
#include <stdio.h>
void main()
{
    int len,t=0;
    int n;
    printf("請輸入一個整數:");
    scanf("%ld",&n);
    if(n<0||n>=100000) t=1;
    else if(n<10) len=1;
    else if(n<100) len=2;
    else if(n<1000) len=3;
    else if(n<10000) len=4;
    else len=5;
    if(t==0) printf("該整數是個%d位數。\n", len);
    else printf("輸入負數或大於5位,無法求解。\n");
}

33. 編寫一個程式,根據輸入的a,b,c的值,求出x的值。
c/b     若a=0時
x =   a*c     若a!=0且b=0時
a+b+c   其它情況
答案:
#include <stdio.h>
void main()
{
    float a,b,c,x;
    printf("請輸入a,b,c的值:");
    scanf("%f,%f,%f",&a,&b,&c);
    if(a==0) x=c/b;
    else if(b==0) x=a*c;
    else x=a+b+c;
    printf("x=%f\n", x);
}

34. 某市企業管理測評中,若企業得分低於70的為較差企業,以“#”表示,若得分在70到80之間的為中等企業,以“*”表示,若得分在80到90之間的為良好企業,以“**”表示,若得分在90以上的為優秀企業,以“***”表示,利用if-else結構編寫一個程式,對於輸入的企業成績,輸出相應的級別標誌。
如:輸入89,輸出   **。
答案:
#include <stdio.h>
void main()
{
    float x;
    printf("請輸入企業的得分情況");
    scanf("%f",&x);
    if (x<0||x>100)
        printf("輸入錯誤,請校對後重新輸入。\n");
    else if (x<70)
        printf("#\n");
    else if (x<80)
        printf("*\n");
    else if(x<90)
        printf("**\n");
    else 
        printf("***\n");
}

35. 編寫一個程式,輸入某年某月某日,判斷該日是這一年的第幾天。
提示:以35日為例,先把前兩個月的天數加起來,然後再加上5天即本年的第幾天;特殊情況,閏年且輸入月份大於3時需考慮多加一天。
答案:
#include <stdio.h>
void main()
{
    int day,month,year,sum,leap;
    printf("\n請輸入年.月.日:\n");
    scanf("%d,%d,%d",&year,&month,&day);
    switch(month)            /*先計算某月以前月份的總天數*/
    {
        case 1:sum=0;break;
        case 2:sum=31;break;
        case 3:sum=59;break;
        case 4:sum=90;break;
        case 5:sum=120;break;
        case 6:sum=151;break;
        case 7:sum=181;break;
        case 8:sum=212;break;
        case 9:sum=243;break;
        case 10:sum=273;break;
        case 11:sum=304;break;
        case 12:sum=334;break;
        default:printf("data error");break;
    }
    sum=sum+day;        /*再加上某天的天數*/
    if(year%400==0||(year%4==0&&year%100!=0))  /*判斷是不是閏年*/
        leap=1;
    else
        leap=0;
    if(leap==1&&month>2)     /*若是閏年且月份大於2,總天數加一*/
        sum++;
    printf("這是%d的第%d天。\n",year,sum);
}

36. 編寫一個程式,求一個四位數,它的十位上的數字是1,個位上的數字為2,且這個數能被789整除。
答案:
#include <stdio.h>
void main()
{
    int n,a,b;
    for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
        {
            n=1000*a+100*b+10+2;
            if(n%7==0&&n%8==0&&n%9==0)
                printf("n=%d\n", n);
        }
}

37. 某些三位數,各位數字立方和等於該數本身,被稱為水仙花數,編寫程式輸出這些數。
答案:
#include <stdio.h>
void main()
{
    int n,a,b,c;
    printf("the numbers are:");
    for (n=100;n<=999;n++)
    {
        a=n/100;
        b=(n-a*100)/10;
        c=n%10;
        if(n==a*a*a+b*b*b+c*c*c) printf("%d   ",n);
    }
    printf("\n");
}

38. 編寫程式求出1!+2!+3!+……+20!。
答案:
#include <stdio.h>
void main()
{
    float s=0,t;
    int n,i;
    for(n=1;n<=20;n++)
    {
        for(i=1,t=1;i<=n;i++)   
            t=t*i;
        s=s+t;
    }
    printf("the sum is:%e.\n",s);
}

39. 1234這四個數字,能組成多少個互不相同且無重複數字的三位數?編寫程式輸出這些數。
答案:
#include <stdio.h>
void main()
{
    int i,j,k;
    printf("\n");
    for(i=1;i<5;i++)
        for(j=1;j<5;j++)
            for (k=1;k<5;k++)
                if (i!=k&&i!=j&&j!=k)
                    printf("%d,%d,%d\n",i,j,k);
}

40. 編寫程式輸出九九乘法口訣表。
答案:
#include <stdio.h>
void main()
{
    int i,j,result;
    printf("\n");
    for (i=1;i<10;i++)
    { 
        for(j=1;j<10;j++)
        {
            result=i*j;
            printf("%d*%d=%-3d",i,j,result);
        }
        printf("\n");
    }
}

41. 編寫程式將輸入的十進位制正整數轉換成十六進位制整數後輸出。
答案:
#include <stdio.h>
void main()
{
    int n,b[20],i=0,j;
    printf("\n請輸入一個正整數:");
    scanf("%d",&n);
    while (n>0)
    { 
        b[i++]=n%16; n=n/16; 
    }
    printf("對應的十六進位制整數:");
    for(j=i-1;j>=0;j--)
    {   
        if(b[j]<=9)   
            printf("%d",b[j]);
        else
        {
            switch(b[j])
            {
                case 10: printf("A");break;
                case 11: printf("B");break;
                case 12: printf("C");break;
                case 13: printf("D");break;
                case 14: printf("E");break;
                case 15: printf("F");break;
            }   
        }
    }
    printf("\n");
}

42.編寫程式,由輸入的第一個字母來判斷是星期幾,若第一個字母一樣,則繼續判斷第二個字母。直到輸入*0,就不再判斷了。
如:輸入s,輸出error;
輸入S,則要求再輸入第二個字元,若再輸入u,則判斷為週日,輸出為Sunday,並可繼續判斷,若輸入*,則退出判斷,結束結束執行。
答案:
#include <stdio.h>
void main( )
{
    char c;
    printf("請輸入第一個字元:\n");
    while ((c=getchar())!='*')
    {
        switch (c)
        {
            case 'S':
                printf("請輸入第二個字元\n");
                c=getchar();
                if(c=='a')    
                    printf("%c->Saturday\n",c);
                else if (c=='u')    
                    printf("%c->Sunday\n",c);
                else 
                    printf("error\n");
                break;
            case 'F':
                printf("%c->Friday\n",c); break;
            case 'M': 
                printf("%c->Monday\n",c); break;
            case 'T':
                printf("請輸入第二個字元\n");
                c=getchar();
                if(c=='u')    
                    printf("%c->Tuesday\n",c);
                else if (c=='h')    
                    printf("%c->Thursday\n",c);
                else 
                    printf("error\n");
                break;
            case 'W':
                printf("%c->Wednesday\n",c); break;
            default: printf("error\n");
        }
    }
}

43. 編寫程式,使輸入的字元按字母表後移一位。
如:輸入s,輸出t;
輸入S,輸出為T。
答案:
#include <stdio.h>
void main( )
{
    char c;
    printf("請輸入字元:\n");
    while ((c=getchar())!='\n')
    {
        if((c>='a'&&c<='y')||( c>='A'&&c<='Y'))
            c++;
        else if(c=='z'||c=='Z')
            c-=25;
        printf("%c",c);
    }
}

44. 判斷使用者輸入的字元是數字字元、字母字元還是其它字元。
【解】數字字元是'0'~'9',字母字元是'a'~'z''A'~'Z',其餘為其它字元。程式如下:
#include<stdio.h>
void main()
{   
    char c;
    printf("輸入一個字元:"); scanf("%c",&c);
    if(c>='0'&&c<='9')
        printf("\n%c是數字字元\n\n",c);
    else if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
        printf("\n%c是字母字元\n\n",c);
    else
        printf("\n%c是其它字元\n\n",c);
}

45.求s=1!+ 2!+ … + n!的值。
【解】當前階乘值由前一個階乘值乘以迴圈變數值來求得。程式如下:
#include <stdio.h>
void main()
{   
    int i,s=0,t=1,n;
    printf("輸入n:"); 
    scanf("%d",&n);
    for(i=1;i<=n;i++) 
    { 
        t=t*i; s=s+t; 
    }
    printf("s=%d\n",s);
}

46. 將使用者輸入的一個正整數顛倒輸出。
【解】對於正整數n,從個位起,依次取出並輸出。程式如下:
#include <stdio.h>
void main()
{   
    int n,d;
    printf("輸入一個正整數:"); 
    scanf("%d",&n);
    printf("顛倒結果:");
    do
    {   
        d=n%10;
        printf("%d",d);
        n=n/10;
    }while(n!=0);
    printf("\n\n");
}

47.求滿足如下條件的最大的n:12 + 22 + 32 + … + n2 ≤1000
【解】採用窮舉法求解,n從1開始,然後依次遞增,對每個n值計算累加平方和s,當s大於1000時,此時的n-1即為所求。程式如下:
#include<stdio.h>
void main()
{   
    int n=0,s=0;
    while(s<=1000) 
    { 
        ++n;  
        s=s+n*n; 
    }
    printf("n=%d\n\n",n-1);
}

48.某人買了一堆糖,每天吃掉一半後,再多吃一顆,天天如此,過了三天就只剩下一顆,問該人共買了多少顆糖。
【解】採用迭代法,設迭代變數為n,其初值為1,迭代表示式為n=(n+1)*2,迭代條件為1 ≤ i ≤ 3。程式如下:
#include<stdio.h>
void main()
{   
    int i,n=1;
    for(i=3;i>=1;i--)   
        n=(n+1)*2;
    printf("n=%d\n\n",n);
}

49.編寫程式。功能是找出1000之內的所有完數。一個數如果恰好等於它的因子之和,這個數就稱為“完數”。( 例如,6的因子為123,而6123,因此6是完數。)
答案:
#include <stdio.h>
void main()
{   
    int m,sum,i;
    for(m=2;m<1000;m++)
    {  
        sum = 0 ;
        for(i=1;i<m;i++)        
            if(m % i == 0 ) sum=sum+i;
        if( sum == m )    printf("%d 是一個完數\n",m);
}
}

50. 編寫程式。功能是找出199之間的全部同構數。所謂同構數是這樣的一組數:它出現在平方數的右邊。(例如:525右邊的數,25625右邊的數,525都是同構數。)
答案:
#include <stdio.h>
void main()
{
    int i;
    for(i=1;i<=9;i++)
        if(i * i % 10 == i)   printf("%3d是同構數\n", i );
    for(i=10;i<100;i++)
        if( i * i % 100 == i)   printf("%3d是同構數\n", i );
}

51.程式的功能是列印100以內個位數為6且能被3整除的所有數。
答案:
#include <stdio.h>
void main()
{
    int  i,j;
    for(i=0; i<=9;  i++)
    {  
        j=i * 10 +6;
        if (j %3 != 0)  continue;
        printf("%d\n",j);
    }
}

52.編寫程式。計算100——1000數值範圍內各位數字之和為5的數,並輸出該數,每行輸出五個數。
答案:
#include <stdio.h>
void main()
{  
    int i,sum,n,count=0;
    for (i=100;i<1000;i++)
    {
        sum=0;
        n=i;
        while(n!=0)
        {
            sum=sum+n%10;
            n=n/10;
        }
        if (sum!=5) continue;
        else
        {
            count++;
            printf("%5d",i);
            if(count%5==0) printf("\n");
        }
    }
    printf ("%d\n", count) ;
}

53.編寫程式。列印出100以內個位數為6,並且能被3整除的所有數。
答案;
#include <stdio.h>
void main()
{
    int m,n;
    for (m=0;m<=9;m++)
    {
        n=m*10+6;
        if(n%3!=0) continue;
        printf("%d\n",n);
    }  
}

相關文章