Course: Computer Programming Exam. #2 Date:
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);
}
}
答:
六個介於1到49間的隨機數(可能重複)。
3. 下列程式執行時,若輸入3和5,請問會印出哪些?
#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有何關係?若輸入的num1和num2分別為9和12,請問得到的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程式的s和t值透過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),在swap的s和t,與main的s和t,所佔的記憶空間位址並不同,所以這裡的呼叫只是將值傳過去給swap副程式,swap變數的改變,並不會影響到主程式。
6. 請改寫上面的程式,使得副程式swap可以交換主程式的s和t。
答:
#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;
}
或將s和t宣告為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]);
}