2010年7月21日 星期三

【資庫】99 高考 -SQL結構化查詢

已知有一學校的資料庫綱目(database schema)如下:
Student(SID, SName, SAge, Address) //學生(學號、姓名、年齡、地址)
Teacher(TID, TName, TAge, Office#) //老師(老師編號、姓名、年齡、辦公室)
Course(CID, CTitle, Credit) //課程(課程編號、課名、學分數)
Take(CID, TID, SID, Score) //修課(課程編號、老師編號、學生編號、分數)
請用SQL來回答下列問題。
(一) 請找出有那些學生,他們修了TName = “Harrison Ford” 這位老師所開設的所有課程,請列出這些學生的SName。(10分)
(二) 對於每一門學分數是3學分(含)以上(i.e., Credit>=3),而且有50個(含)以上的學生來修的課程,列出這些課程的名稱、授課老師,和該門課程裡,學生成績超過95分(含)的人數, 假設不會有二位老師
開授同一門課程。(10分)

答:
(一)
SELECT S.SName
FROM Student S
WHERE NOT EXISTS (
SELECT *
FROM Teacher T
JOIN Take A1 ON T.TID=A1.TID
WHERE T.TName="Harrison Ford" AND
NOT EXISTS (
SELECT *
FROM Take A2
WHERE A2.CID=A1.CID AND A2.SID=S.SID
)
)

(二)
SELECT C2.CTitle, T2.TName, COUNT (*)
FROM Course C2, Take A2, Teacher T2
WHERE C2.CID=A2.CID AND
T2.TID=A2.TID AND
A2.Score>=95 AND
C2.CID IN (
SELECT C1.CID
FROM Course C1, Take A1, Student S1
WHERE C1.Credit>=3 AND
S1.SID=A1.SID AND
C1.CID=A1.CID
GROUP BY C1.CID
HAVING COUNT(*)>=50
)
GROUP BY C2.CTitle, T2.TName


2010年7月20日 星期二

【系分】99 高考-結構化技術

創業貸款申請:
為了輔導協助有心創業之民眾開創事業,青原機關對符合條件的申請人提供創業貸款的服務,有意申請的民眾必須向青原機關提出創辦事業資料。目前青原機關正準備將貸款流程進行資訊化,身為該系統的系統分析師,當你在準備系統規格書時,以下是你表示這個申請創業貸款時遞交的創辦事業資料的資料流程圖:

以下的表格是由業務單位就編號17的「創辦事業資料」資料流,提供申請民眾需填寫的表格範例:


依據上表的範例,請寫出這個「17.創辦事業資料」資料流之資料字典的定義。

答:
創辦事業資料=創辦事業名稱
創辦事業資料+經營型態
創辦事業資料+主要產品
創辦事業資料+現有員工人數
創辦事業資料+{貸款主要具體用途}
經營型態=[股份有限公司|有限公司|合夥|獨資]
現有員工人數=大專以上+(高中職以下)+合計
大專以上=男+女
高中職以下=男+女
合計=大專以上+高中職以下
貸款主要具體用途=生財器具或生產設備名稱+數量+單價+總價+小計+週轉金+合計
總價=數量*單價
小計={總價}
合計=小計+週轉金

2010年7月19日 星期一

【程概】99 普考-程式實做(四)

利用Javascript之onClick功能來製作如圖(a)讓使用者可由表單(form)輸入四個inputs,第一個輸入是server端程式的 url字串,第二三四個輸入是三個keys的值,用以組合query string。待Javascript程式組合好包含url及query string的request字串後,再藉由submit button點擊(click)後傳送出去。例如,如果url輸入的是"wwwc.moex.gov.tw/lp.asp",三個keys的值分別為1, 2, 3,則所組合好的request字串則為"http://wwwc.moex.gov.tw/lp.asp?key1=1&key2=2& amp;key3=3",當submit button被點擊(click)後,則以request字串為名稱的網頁就會抓回來。請將圖(b)空格內之編號及答案依序寫在試卷上。
答:

【程概】99 普考-程式實做(三)

用任何高階電腦語言撰寫一個函式int string_search(char str[], char pat[]),它能計算出子字串pat在字串str中的位置。例如,假設str="I will pass this exam."且pat="pass",則函式string_search(str, pat) 回傳7。

答:
#include

int string_search(char str[], char pat[]) {
int result = 0, i=0, j=0;
while(str != '\0') {
if(str == pat[j]) {
j++;
if (result == 0)
result = i;
} else {
if (pat[j] != '\0') {
result = 0;
j = 0;
} else {
return result;
}
}
i++;
}
return -1;
}

int main(int argc, char *argv[])
{
char str[] = "I will pass this exam.";
char pat[] = "pass";

printf("str is: %s\n", str);
printf("pat is: %s\n", pat);
printf("string_search index is %d\n", string_search(str, pat));
}

【程概】99 普考-程式實做(一)

用C語言撰寫一個函式,能將一只含有數字的單向鏈結串列(singly linked list)切割成兩個單向鏈結串列,其一只包含奇數元素,另一只包含偶數元素,請勿複製節點,切割前後都是以數字由小到大排序,假設此函式的原型 (prototype)如下:void split (node *h, node **h1, node **h2),h是切割前鏈結串列兩個單向鏈結串列指標,h1,h2是切割後兩個單向鏈結串列的指標。(25分)
其中節點的資料結構為
typedef struct node {
int d; struct node* next;
} node;

答:
#include

typedef struct node{
int d;
struct node *next;
}node;

void split(node *h, node **h1, node **h2) {
node *odd=NULL, *even=NULL;
while (h != NULL) {
if (h->d % 2 == 1){
if (odd == NULL) {
odd = h;
*h1 = h;
} else {
(*h1)->next = h;
*h1 = h;
}
} else {
if (even == NULL) {
even = h;
*h2 = h;
} else {
(*h2)->next = h;
*h2 = h;
}
}
h = h->next;
}
(*h1)->next = NULL;
(*h2)->next = NULL;
*h1 = odd;
*h2 = even;
}


int main(int argc, char *argv[])
{
int i=0; int data[] ={3,4,5,7,8};
node *p, *r;
node *h=NULL, *h1=NULL, *h2=NULL;
for (i=0; i<5; p =" (node*)malloc(sizeof(node));">d = data;
p->next = NULL;

if (h==NULL) {
h = p;
r = p;
}
else {
r->next = p;
r = p;
}
}
r = h;
while (r!=NULL) {
printf("%d, ", r->d);
r = r->next;
}
split(h, &h1, &h2);
while(h1 != NULL) {
printf("\nh1 odd data is %d", h1->d);
h1 = h1->next;
}
while(h2 != NULL) {
printf("\nh2 even data is %d", h2->d);
h2 = h2->next;
}
}

【程概】99 普考-程式實做(二)

用C語言撰寫一個函式int most_significant_set_bit(int num),它能將一個32-bit整數的最高有效位(The most significant bit)為1的位置計算出並回傳出來,如果全為0,則回傳-1。例如數值444以二進位表示為00000000 00000000 00000001 10111100,所以它回傳出最高有效位為1的位置為8,也就是說bit 8。

答:

#include <>

int most_significant_set_bit(int num) {
int result = -1;
if (num > 0) {
while(num > 0){
result = result + 1;
num = num >> 1;
}
}
return result;
}


int main(int argc, char *argv[])
{
printf("most_significant_set_bit is %d\n", most_significant_set_bit(444));

system("PAUSE");
return EXIT_SUCCESS;
}