Course: Computer Programming   Exam. #2   Date: Jan. 12, 2005

Instructor: 趙坤茂 (台大資訊工程系)  TA: 黃耀廷 莊竣捷

務必依題號在答案卷作答,共兩面,記得填上系級、學號及姓名

考試時間:100分鐘

 

1. 請寫出下面這段程式,當輸入的n值為3時,印出的結果為何?

 

#include <stdio.h>

void main(void)

{

      int A[100][100];

      int n, i, j;

 

      scanf("%d", &n);

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

            for (j=1; j<=n; j++)

                  if (i == j) A[i][j] = i;

                  else A[i][j] = 0;

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

      {

            for (j=1; j<=n; j++) printf("%d ", A[i][j]);

            printf("\n");

      }

}

 

答:

 

1 0 0

0 2 0

0 0 3

 

2. 請問下面的程式執行後,會產生什麼結果?

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void main(void)

{

      int i;

      srand( (unsigned) time( NULL ) );

      for (i=0; i<6; i++){

            printf("%d\n", 1+rand()%49);

      }

}

 

答: 六個介於149間的隨機數(可能重複)

 

3. 下列程式執行時,若輸入35,請問會印出哪些?

#include <stdio.h>

int multiply(int, int);

void main(void)

{

      int a, b;

 

      printf("Please input two numbers:");

      scanf("%d %d",&a, &b);

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

}’

int multiply(int m, int n)

{

      int ans;

 

printf("m=%d, n=%d, start\n", m, n);

      if (n == 1)

            ans = m;     /* simple case */

      else

            ans = m + multiply(m, n  - 1);  /* recursive step */

printf("m=%d, n=%d, end\n", m, n);

        return (ans);

}

 

Please input two numbers:3 5

答:

m=3, n=5, start

m=3, n=4, start

m=3, n=3, start

m=3, n=2, start

m=3, n=1, start

m=3, n=1, end

m=3, n=2, end

m=3, n=3, end

m=3, n=4, end

m=3, n=5, end

3 times 5 equals 15

 

 

4. 下面程式輸出的k值和輸入的num1, num2有何關係?若輸入的num1num2分別為912,請問得到的k值為何?

#include <stdio.h>

int x_function(int m,int n);

void main (void)

{

      int num1, num2, k;

 

      printf("Input two numbers>");

      scanf("%d %d",&num1,&num2);

      k = num1 * num2 / x_function(num1, num2);

      printf("k = %d\n", k);

}

 

int x_function(int m,int n)

{

      m = m % n;

      if (m == 0) return n;

      else return x_function(n, m);

}

答:

輸出的k值是輸入的num1, num2之最小公倍數。

Input two numbers>9 12

k = 36

 

5. 請問下面這程式可將main程式的st值透過swap副程式交換嗎?為什麼?

#include <stdio.h>

#include <stdlib.h>

void main(void)

{

  void swap(int s, int t);

  int s = 5, t = 10;

 

  swap(s, t);

}

void swap(int s, int t)

{

  int temp;

  temp = s;

  s = t;

  t = temp;

}

答:

不行,因為C的副程式是傳值方式(call by value),在swapst,與mainst,所佔的記憶空間位址並不同,所以這裡的呼叫只是將值傳過去給swap副程式,swap變數的改變,並不會影響到主程式。

 

6. 請改寫上面的程式,使得副程式swap可以交換主程式的st

答:

 

#include <stdio.h>

#include <stdlib.h>

void main(void)

{

  void swap(int *xptr, int *yptr);

 

  int s = 5, t = 10;

 

  swap(&s, &t);

}

void swap(int *xptr, int *yptr)

{

  int temp;

 

  temp = *xptr;

  *xptr = *yptr;

  *yptr = temp;

}

void swap(int *xptr, int *yptr)

{

  int *temp;

 

  temp = (int *)malloc(sizeof(int));

  *temp = *xptr;

  *xptr = *yptr;

  *yptr = *temp;

}

或將st宣告為global變數。

 

7. 請填入下面程式的空格部份,使得程式執行時,可將輸入的字串之字母皆改為大寫

例如:

Please input a string>dsdfFE

Input string: dsdfFE

Output string: DSDFFE

 

#include <stdio.h>

#include <string.h>

#include <ctype.h>

char *string_toupper(char *str);

void main(void)

{

      char s[80];

 

      printf("Please input a string>");

      scanf("%s", s);

      printf("Input string: %s\n",s);

      printf("Output string: %s\n", string_toupper(s));

}

char * string_toupper(char *str)

{

      int i;

      for  (i = 0;  i < strlen(str);  ++i)

          if (islower(str[i]))

                str[i] = toupper(str[i]);

      return (str);

}

 

8. 請問下面程式執行時為何會發生危險?如果變數b仍然要維持pointer型態,應如何修正?

 

#include <stdio.h>

 

void main(void)

{

      int *b;

 

      *b = 3;

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

}

答:

因為b的值是個位址,但它並沒有事先給定,所以以這個值當位址,是很危險的,其所對應的位置放入3,可能會放到不是屬於本程式該放的位置。改正方法是先幫b的值找到空間,在*b=3指令前,加入 b = (int *) malloc(sizeof(int));

 

9. 請以struct和陣列宣告一個100筆學生的資料,每個資料內容包括名字(10 characters)、座號(int)及年紀(int)

答:

typedef struct

{

  char name[10];

  int id;

  int age;

}student_struct;

student_struct students[100];

struct student

{

  char name[10];

  int id;

  int age;

};

struct student students[100];

或其他可行寫法

 

10. 請寫一個程式,可輸入100個以內不同的數字(int),該程式可輸出最大數及第二大數。

答:

#include <stdio.h>

void main(void)

{

      int data[100];

      int i,j,n,temp,max,k;        

 

      printf("輸入數值的個數: ");     /*輸入n */

      scanf("%d" ,&n);

      printf("\n");

     

      for (i=0;i<=n-1;i++)    /*輸入n個數值 */

      {

            printf("請輸入數值:");

          printf("data[%d]=",i);

            scanf("%d",&data[i]);

      }

 

    for (i=0; i<2; i++)

      {

            max = data[i];    /* 紀錄 max data[i] */

            k = i;                  /* 紀錄 max 的位址為 k */

            for(j=i+1; j<n; j++)

            {

                  if(data[j]>max)   /* 比較 data[j] 是否大於 max */

                  {

                        max = data[j];    /* max 紀錄為 data[j] */

                        k = j;            /* max 的位址 k 改為 j */

                  }

            }

            temp=data[i];     /* max data[i] 互換 */

            data[i]=data[k];

            data[k]=temp;

      }

 

      printf("max=%d, second_max=%d\n", data[0], data[1]);

}