2007年10月29日 星期一

C 程式設計作業一(B),選擇邏輯與輸出、輸入應用

作業內容:
貴公司接受顧客委託,修改軟體,該顧客為百貨零售業者,預計進行一項促銷活動,商品是「愛情洗髮護髮系列」。
愛情洗髮精與潤髮乳有分500ml與250ml兩種大小瓶裝,大瓶愛情洗髮精與潤髮乳原售價都是 280 元,小瓶都是150元。
促銷專案如下:

1. 凡購買大瓶愛情洗髮精一瓶,得以六折優待購買小瓶愛情洗髮精一瓶。
2. 凡購買大瓶愛情潤髮乳一瓶,得以六折優待購買小瓶愛情潤髮乳一瓶。
3. 購買大瓶愛情洗髮精或潤髮乳任兩瓶,可免費附贈小瓶愛情洗髮精或潤髮乳一瓶(任選其一)。
4. 購買大瓶愛情洗髮精或潤髮乳任六瓶,總價可再打九五折。
(大瓶裝以免費折扣使用為優先,不得重複與小瓶再進行搭售折扣)

你的任務就是要完成這個商品的價格計算程式,你必須提供適當的文字說明介面,以利使用者輸入,方便結帳。

測試方式:
假設 A1:一瓶大瓶愛情洗髮精,一瓶小瓶愛情洗髮精,370元。
假設 A2:一瓶大瓶愛情潤髮乳,一瓶小瓶愛情洗髮精,430元。
假設 A3:二瓶大瓶愛情潤髮乳,一瓶小瓶愛情洗髮精,560元。
假設 A4:一瓶大瓶愛情潤髮乳,二瓶大瓶愛情洗髮精,二瓶小瓶愛情洗髮精,930元。(難)
假設 A5:二瓶大瓶愛情潤髮乳,二瓶大瓶愛情洗髮精,三瓶小瓶愛情潤髮乳,1270元。
假設 A6:二瓶大瓶愛情潤髮乳,四瓶大瓶愛情洗髮精,二瓶小瓶愛情洗髮精、二瓶小瓶愛情潤髮乳,1738元。
解答下載
回到作業目錄
回到首頁

2007年10月27日 星期六

小考一(D) 解答


/* C Programming Quiz 1D */
/*
小考一題目:使用C語言設計一個程式,以計算採購貨品的訂貨價格,
行情如后。每次採購的基本訂貨成本,固定為 1200元,
每件貨品單價為 80元,若採購數量超過(大於) 500 件時,
每件貨品以九折計價,若採購數量超過(大於) 3000 件時,
每滿 1000 件,賣方再額外扣減 6000元。輸入值是採購
產品的數量。輸出為採購價格。例如,採購 5800 件的價格為
1200 + 5800*80*0.9 - 6000*2 = 406,800 元。

提示:產品採購數量以 10,000 件為限。

*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int orderNum, totalPrice;
int unitPrice, extraDiscount;

printf("Please enter the order number: ");
scanf("%d", &orderNum);

if (orderNum > 500)
unitPrice = 80*0.9;
else
unitPrice = 80;
if (orderNum > 3000)
extraDiscount = (orderNum-3000)/1000*6000;
else
extraDiscount = 0;
totalPrice = 1200 + orderNum*unitPrice - extraDiscount;

printf("Total price is %d\n", totalPrice);

system("pause");
return 0;
}

小考一(D)題目
返回小考目錄
回到首頁

小考一(D) 題目


/* C Programming Quiz 1D */
/*
小考一題目:使用C語言設計一個程式,以計算採購貨品的訂貨價格,
行情如后。每次採購的基本訂貨成本,固定為 1200元,
每件貨品單價為 80元,若採購數量超過(大於) 500 件時,
每件貨品以九折計價,若採購數量超過(大於) 3000 件時,
每滿 1000 件,賣方再額外扣減 6000元。輸入值是採購
產品的數量。輸出為採購價格。例如,採購 5800 件的價格為
1200 + 5800*80*0.9 - 6000*2 = 406,800 元。

提示:產品採購數量以 10,000 件為限。

*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int orderNum, totalPrice;

/* your program is here */


system("pause");
return 0;
}

解答下載
返回小考目錄
回到首頁

小考一(C) 解答


/* C Programming Quiz 1C */
/*
小考一題目:使用C語言設計一個程式,以計算一個業務員的月薪,
規定如后。每月底薪為15000元,每賣出一台產品,可
得紅利 380元。月底結算,如果賣超過(大於) 20 台,
每台紅利則以 420元計算,如果賣超過(大於) 40 台,
每賣出十台,老闆再獎勵 1500元。輸入值是每月賣出
產品的數量。輸出為每月薪資。例如,賣出68台,月薪為
15000 + 420*68 + 1500*2 = 46560元。
提示:產品售出數量為100為限。

*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int saleNum, salary;
int unitBonus, bossBonus;

printf("Please enter the sale number: ");
scanf("%d", &saleNum);

if (saleNum > 20)
unitBonus = 420;
else
unitBonus = 380;
if (saleNum > 40)
bossBonus = (saleNum-40)/10*1500;
else
bossBonus = 0;
salary = 15000 + saleNum*unitBonus + bossBonus;

printf("Salary is %d\n", salary);

system("pause");
return 0;
}

小考一(C)題目
返回小考目錄
回到首頁

小考一(C) 題目


/* C Programming Quiz 1C */
/*
小考一題目:使用C語言設計一個程式,以計算一個業務員的月薪,
規定如后。每月底薪為15000元,每賣出一台產品,可
得紅利 380元。月底結算,如果賣超過(大於) 20 台,
每台紅利則以 420元計算,如果賣超過(大於) 40 台,
每賣出十台,老闆再獎勵 1500元。輸入值是每月賣出
產品的數量。輸出為每月薪資。例如,賣出68台,月薪為
15000 + 420*68 + 1500*2 = 46560元。
提示:產品售出數量為100為限。
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int saleNum, salary;
int unitBonus, bossBonus;

/* your program is here */


system("pause");
return 0;
}

解答下載
返回小考目錄
回到首頁

2007年10月25日 星期四

C語言考古題,小考系列

95學年度


小考一(A),選擇邏輯測驗
小考一(B)
小考二(A),選擇邏輯測驗
小考二(B)
小考三(A),迴圈邏輯測驗
小考三(B)
小考四(A),函數運用測驗
小考四(B)
小考五(A),迴圈與函數運用測驗
小考五(B)
期末考(A),迴圈與函數運用測驗
期末考(B)
小考六(A),函數與陣列測驗
小考六(B)
小考七(A),函數、陣列與指標測驗
小考七(B)
小考八(A),檔案處理測驗
小考八(B)
小考九(A)、模組設計測驗
小考九(B)

96學年度


小考一(C)>,選擇邏輯測驗
小考一(D)
小考三(C),迴圈邏輯測驗
小考三(D)
小考三(E),迴圈邏輯與隨機數測驗
小考三(F)
小考四(C),函數運用測驗
小考四(D)
小考四(E)
小考四(F)
期末考(C),迴圈與函數運用測驗
期末考(D)
小考六(C),函數與陣列測驗
小考六(D)
小考八(A),結構與陣列測驗
小考八(B)
小考九(A),二進位檔案處理
小考十,命令列參數處理
回到首頁

小考九(A) 解答


/* ================================= */
/* File: main.c */
#include <stdio.h>
#include <stdlib.h>

int oddsum(int);
int evensum(int);

int main(int argc, char *argv[])
{
int n,m;
printf("請輸入 n 的值:");
scanf("%d",&n);
printf("1 到 n 的奇數和=%d\n",oddSum(n));

printf("請輸入 m 的值:");
scanf("%d",&m);
printf("1 到 n 的偶數和=%d\n",evenSum(m));

printf("n 的奇數和加 m 的偶數和=%d\n",oddSum(n)+evenSum(m));

system("pause");
return 0;
}
/* ================================= */
/* File: evenSum.c */
#include <stdio.h>
#include <stdlib.h>

int evenSum(int a)
{
int i,sum=0;
for(i=a;i>0;i--){
if(i%2==0)
sum+=i;
}
return sum;
}

/* ================================= */
/* File: oddSum.c */
#include <stdio.h>
#include <stdlib.h>

int oddSum(int a)
{
int i,sum=0;
for(i=a;i>0;i--){
if(i%2==1)
sum+=i;
}
return sum;
}

小考九(A)題目
返回小考目錄
回到首頁

小考九(A) 題目

使用Dev-C++,建立一個新的C專案,屬性為Console Application,在這個專案中,有三個.c檔案,其中一個是main.c,另兩個.c檔案各有一個C函數,第一個C函數為int oddSum(int),計算1到n的奇數和,輸入是一個整數n,輸出也是一個整數(計算結果);第二個C函數為int evenSum(int),計算1到m的偶數和,輸入是一個整數m,輸出也是一個整數(計算結果)。主程式main.c的內容包括,數入兩個值,n和m,然後分別呼叫oddSum和evenSum,最後輸出oddSum和evenSum相加之後的值。

解答下載
返回小考目錄
回到首頁

2007年10月24日 星期三

Problem 294 Divisors, 整除數量計算

這題不是很難的問題,只是因為數值大的關係,如果從頭到尾都算的話時間會不夠,所以要記得把要算的數值開根號,就可以省去一半的時間。

for(j=L;j<=U;j++)
{
max_tmp = 0;
for(m=1;m<=sqrt(j);m++)
{
if(j%m == 0)
{
//printf("%d => %d\n", j,m);
if(m*m == j)
max_tmp++;
else
max_tmp+=2;
}
}
if(max_tmp > max)
{
max = max_tmp;
max_n = j;
}
}

Solved by Wellwind
p294目連結
回ACM題庫目錄
回首頁

2007年10月23日 星期二

Problem 477 Points in Figures: Rectangles and Circles,判斷點在矩形與圓形中的問題


477是476的延伸題,只要在加入圓形的判斷即可;宣告圓形的結構
typedef struct t_Circle
{
Point center;
double r;
} Circle;

判斷座標是否在圓形之內,計算點與圓心的距離是否小於半徑就可以了
if (
( p.x - c[i].center.x) * (p.x - c[i].center.x) +
( p.y - c[i].center.y) * (p.y - c[i].center.y)
< c[i].r * c[i].r)
{
...
}

Solved by Wellwind

p477題目連結
回ACM題庫目錄
回首頁

Problem 476 Points in Figures: Rectangles,判斷點在矩形中的問題


為了方便可以設計兩個struct

typedef struct t_Point
{
double x;
double y;
} Point;


typedef struct t_Rect
{
Point top_left;
Point bottom_right;
} Rect;

接著只要照題目建立Rect並且判斷每個Point有沒有在範圍裡面就好了,判斷的方法可以參考程式碼

if ( p.x > r[i].top_left.x &&
p.x < r[i].bottom_right.x &&
p.y < r[i].top_left.y &&
p.y > r[i].bottom_right.y )
{
printf("Point %d is contained in figure %d\n",p_count,i+1);
}


Solved by Wellwind

p476題目連結
回ACM題庫目錄
回首頁

C 程式設計作業九,使用結構、結構陣列與檔案處理:解題


/* C Programming, Project 9 */

#include <stdio.h>
#include <stdlib.h>
#define MAX 20

struct record {
char name[20];
char sex;
double score;
};

int queryDB(char [], struct record *);
void insertDB(struct record *);
void listAllName(void);
char *getLine(FILE *);

int main(void)
{
struct record *stdPtr;
char qname[20];
char ch;
int idx, ifFound;

do {
printf("Command(h for help):");
ch = getche();
switch (ch) {
case 'h':
printf("\nUse\n");
printf("h to show this help;\n");
printf("f to find a record by name;\n");
printf("l to list all names in the file;\n");
printf("i to insert a new record;\n");
printf("d to delete a specified record;\n");
printf("m to modify a specified record;\n");
printf("q to quit.\n");
break;
case 'f':
printf("\nFind the name:");
gets(qname);
ifFound = queryDB(qname, stdPtr);
if (!ifFound) {
printf("\nName %s not found!\n", qname);
} else {
printf("\nName: %s\n", stdPtr->name);
printf("Sex: %c\n", stdPtr->sex);
printf("Score: %f\n", stdPtr->score);
}
break;
case 'l':
listAllName();
break;
case 'i':
break;
case 'd':
break;
case 'm':
break;
case 0xd:
break;
case 'q':
printf("\nQuit now.\n");
break;
default:
printf("\nNot a valid command\n");
}
fflush(stdin);
printf("\n");
} while (ch!='q');

system("pause");
return 0;

}


int queryDB(char qname[], struct record *stdPtr) {
struct record *studtemp;
char *str, aname[20];
char asex;
double ascore;
FILE *fptr;
int i, rno, found=0;
fptr = fopen("db.txt","r");
if (fptr==NULL)
return 0;
else {
fscanf(fptr, "%d\n", &rno);
for (i=0;i<rno;i++) {
str = getLine(fptr);
strcpy(aname, str);
str = getLine(fptr);
asex = str[0];
str = getLine(fptr);
ascore = atof(str);
if (!strcmp(aname,qname)) {
strcpy(stdPtr->name, aname);
stdPtr->sex = asex;
stdPtr->score = ascore;
found = 1;
}
}
fclose(fptr);
if (found)
return 1;
else
return 0;
}
}
void insertDB(struct record *stdPtr) {
}

void listAllName(void) {
FILE *fptr;
int i, rno=0;
char *str;

fptr = fopen("db.txt","r");
if (fptr==NULL)
printf("Failed to open file\n");
else {
fscanf(fptr, "%d\n", &rno);
printf("\n");
for (i=0;i<rno;i++) {
str = getLine(fptr);
puts(str);
str = getLine(fptr);
str = getLine(fptr);
}
}
fclose(fptr);
}
char *getLine(FILE *fptr) {
static char str[80];
int i=0;

while ((str[i]=getc(fptr)) != '\n')
i++;
str[i] = '\0';
return str;
}

作業九題目
回到首頁

C 程式設計作業九,使用結構、結構陣列與檔案處理

作業內容:
針對提供的資料檔案,建立查詢與顯示資料的功能。程式的執行,一開始出現指令輸入列,並提示可用的協助鍵,例如

Command(h for help):
當使用者鍵入「h」後,則會列出一系列可用的指令,例如

Use
h to show this help;
f to find a record by name;
l to list all names in the file;
i to insert a new record;
d to delete a specified record;
m to modify a specified record;
q to quit.
h:列出指令說明;
f:查詢一筆資料的內容;
l:列出所有資料中的人名;
i:插入一筆新的資料;
d:刪除一筆特定的資料;
m:修改一筆特定的資料;
q:離開。

本次作業要完成 h、f、l、q 四個基本功能。

所需處理的資料檔案名稱為「db.txt」,其內容如下圖所示,第一行為資料的筆數,每筆資料有三項內容,第一項為姓名,為20個以內的英文字;第二項為性別,為「M」或「F」的單一字元;第三項為分數,是一個實數。這個檔案有三筆資料,所以第一行為3,每筆有三項資料,所以 3*3就有九行的資料。因此檔案全部內容共十行。

當使用者鍵入「f」後,則會出現一行提示使用者輸入欲查詢的姓名,鍵入姓名後,如果檔案中有這個人的資料,則列出該人的三項資料內容,如果找不到,則列出該人名未被發現。

當使用者鍵入「l」後,則會列出資料檔案中全部的人名。

當使用者鍵入「q」後,則程式執行結束。

如果使用者是輸入未經認可的指令,則列出「Invalid command」,亦即無此指令。

作業提示:
一、程式本身是一個循環結構,不斷的處理使用者輸入的指令(合法或不合法),直到鍵入「q」才結束。

二、建議使用switch的方式來處理每個輸入的指令。

三、使用適當的函數呼叫,以增加程式的可讀性,在開發過程也較容易進行除錯的工作。

四、經常使用Dev-C++所提供的除錯功能,進行逐步執行,以了解程式的每個指令執行過程。

五、測試時, 要分別詳細測試 h、f、l、q 四個功能是否正確,並備便紀錄全部的執行過程,以備未來列印。測試內容列印可參考 p3output.txt
解答下載
回到作業目錄
回到首頁

C 程式設計作業八,使用陣列、函數與指標:解題


/* C Programming, Project 8 */

#include <stdio.h>
#include <stdlib.h>
#define SIZE 26

void getMax(double *, double *);
void getMin(double *, double *);

int main(void)
{
double A[][SIZE] = {{617, 90, 195, 813, 697, 81, 435, 202, 594, 109, 486, 778, 743, 335, 881, 427, 931, 81, 81, 275, 108, 282, 812, 95, 325, 0},
{699, 392, 915, 757, 487, 614, 449, 354, 895, 107, 526, 147, 606, 233, 459, 16, 866, 226, 353, 923, 839, 776, 120, 5, 909, 0},
{83, 576, 846, 468, 52, 983, 279, 101, 489, 646, 337, 168, 93, 755, 143, 38, 72, 849, 876, 3, 928, 326, 496, 623, 907, 0},
{243, 704, 460, 820, 487, 924, 273, 911, 849, 405, 686, 251, 534, 491, 772, 248, 47, 118, 588, 770, 496, 421, 472, 858, 886, 0},
{415, 575, 245, 3, 629, 405, 81, 224, 209, 457, 927, 820, 929, 650, 723, 712, 258, 245, 351, 458, 788, 539, 6, 752, 756, 0},
{882, 856, 909, 501, 59, 823, 233, 250, 935, 720, 997, 676, 909, 221, 648, 606, 28, 326, 35, 846, 429, 766, 116, 513, 706, 0},
{239, 824, 122, 401, 99, 877, 570, 494, 895, 395, 550, 820, 371, 798, 635, 695, 218, 995, 931, 374, 37, 350, 25, 351, 500, 0},
{408, 214, 972, 907, 975, 117, 388, 44, 443, 821, 647, 112, 850, 484, 844, 428, 183, 662, 474, 99, 434, 305, 176, 48, 799, 0},
{859, 772, 186, 140, 670, 890, 800, 419, 549, 339, 311, 246, 235, 568, 279, 810, 777, 576, 978, 989, 231, 16, 159, 735, 594, 0},
{855, 689, 199, 253, 67, 104, 686, 925, 756, 117, 346, 203, 552, 774, 932, 495, 693, 302, 146, 181, 183, 596, 742, 196, 937, 0},
{658, 730, 199, 707, 569, 844, 261, 452, 547, 816, 202, 249, 167, 130, 236, 273, 322, 480, 452, 581, 608, 873, 803, 47, 142, 0},
{538, 362, 661, 202, 412, 907, 948, 4, 317, 410, 22, 488, 866, 188, 921, 733, 752, 6, 606, 378, 894, 175, 820, 911, 909, 0},
{509, 764, 938, 263, 977, 433, 928, 800, 213, 679, 130, 248, 898, 783, 557, 255, 246, 498, 721, 862, 786, 104, 293, 532, 496, 0},
{857, 515, 845, 317, 249, 11, 190, 751, 294, 551, 791, 658, 389, 988, 625, 95, 336, 301, 157, 439, 486, 502, 871, 697, 124, 0},
{649, 325, 747, 697, 771, 53, 472, 54, 415, 121, 566, 84, 484, 965, 669, 588, 145, 605, 233, 767, 245, 505, 511, 97, 768, 0},
{98, 804, 137, 94, 11, 3, 292, 796, 841, 248, 334, 444, 55, 171, 146, 320, 605, 975, 515, 707, 12, 853, 984, 489, 499, 0},
{989, 898, 639, 931, 880, 792, 815, 651, 577, 674, 250, 336, 961, 52, 766, 275, 936, 291, 365, 983, 145, 91, 82, 735, 448, 0},
{641, 531, 644, 391, 757, 246, 468, 296, 243, 23, 106, 301, 513, 962, 457, 520, 794, 126, 498, 897, 632, 292, 571, 750, 433, 0},
{724, 210, 267, 154, 2, 546, 817, 905, 484, 240, 262, 819, 908, 821, 76, 783, 688, 719, 30, 661, 622, 424, 330, 909, 111, 0},
{352, 966, 232, 839, 464, 997, 608, 895, 606, 681, 37, 848, 143, 889, 125, 290, 397, 677, 723, 843, 702, 534, 953, 70, 762, 0},
{945, 574, 542, 737, 812, 301, 528, 359, 691, 651, 581, 233, 67, 21, 891, 302, 572, 303, 788, 40, 582, 546, 478, 553, 19, 0},
{873, 395, 608, 714, 410, 819, 661, 163, 725, 520, 71, 714, 806, 795, 381, 157, 491, 100, 239, 545, 58, 978, 657, 480, 189, 0},
{778, 232, 813, 678, 181, 400, 97, 990, 719, 587, 554, 568, 293, 282, 480, 568, 718, 343, 502, 821, 236, 414, 156, 55, 884, 0},
{92, 94, 887, 656, 962, 896, 386, 129, 526, 280, 588, 849, 133, 192, 768, 975, 725, 88, 209, 828, 237, 846, 466, 407, 978, 0},
{988, 636, 156, 660, 601, 365, 724, 406, 795, 737, 954, 858, 982, 405, 339, 816, 440, 768, 650, 893, 720, 233, 799, 382, 494, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }};

/*
第26列答案是:989,966,972,931,977,997,948,990,935,821,997,858,982,988,932,975,936,995,978,989,928,978,984,911,978,
第26行答案是:81,5,3,47,3,28,25,44,16,67,47,4,104,11,53,3,52,23,2,37,19,58,55,88,156,
*/

getMax(&A[0][1], &A[25][1]);
printf("Maximun value of 2nd colume is %f\n", A[25][1]);
getMin(&A[3][0], &A[3][25]);
printf("Minimun value of 4th row is %f\n", A[3][25]);
system("pause");
return 0;

}


void getMax(double *ptr, double *max)
{
int i;

*max = 0;
for (i=0;i<25;i++)
{
if (*max < *ptr)
*max = *ptr;
ptr += 26;
}
}

void getMin(double *ptr, double *min)
{
int i;

*min = 10000;
for (i=0;i<25;i++)
{
if (*min > *ptr++)
*min = *ptr;
}
}

作業八題目
回到首頁

C 程式設計作業八,使用陣列、函數與指標

作業內容:
完成指定的函數,並輸出答案。

在作業八,你必須下載作業八的問題產生程式,這是個執行檔,用ZIP壓縮以利下載,執行的視窗環境需安裝「Microsoft .net framework 1.1」以上版本。程式開啟後,你必須輸入你的學號後三碼,以獲得你個人專屬的題目(人人題目都不同),在按下執行後,你會得到一個陣列A的宣告及其初設值,如下圖所示。

這是一個26 x 26 的陣列,也就是26列、每列26行,每列的最後一個值是0,最後一列也都是0,你必須將程式產生的A陣列複製貼上到你的程式作業中,去完成以下的要求。

一、設計程式,將最後一列的第一到第二十五個值(索引數0~24),填入每一行的最大值。

二、 設計程式將第一到第二十五列(索引數0~24)的最後一個值,填入每一列的最小值。

三、必須完成兩個獲得各行最大值與各列最小值的函數,其原型如下:

void getMax(double *, double *);
void getMin(double *, double *);
單一的呼叫函數測試範例如下:

getMax(&A[0][1], &A[25][1]);
printf("Maximun value of 2nd colume is %f\n", A[25][1]);
getMin(&A[3][0], &A[3][25]);
printf("Minimun value of 4th row is %f\n", A[3][25]);

四、輸出格式在問題產生程式已經提供,答案也已經提供,輸出的內容,就是問題產生程式中的倒數2、3、4行。

作業八解答
回到作業目錄
回到首頁

2007年10月17日 星期三

Problem 583 Prime Factors,質數因數列印的問題

這題很簡單,先判斷本身是不是質數,是質數就直接列印,不是,就除i,i從2開始累進,只要能整除就列印出來,所以要設定一個判斷值,以處理列印 X (乘號)的問題。

Solved by Wellwind

p583題目連結
回ACM題庫目錄
回首頁

Problem 458 The Decoder,解碼的問題

經典的解密題目,很多書本裡面也有類似的題目,把字母往後移三個,A就會變成D,只是這題把加密規則拿掉了,要自己從加密&解密後的字串找出規則,只要試著印出'*'-'1'就知道要移動多少,所有字串套用相同的處理就好。


for(i=0;str[i] != '\0';i++){
printf("%c", str[i]-7);
}
printf("\n");

Solved by Wellwind
p458題目連結
回ACM題庫目錄
回首頁

2007年10月9日 星期二

小考八(A) 解答


/* C Programming, Quiz 8A */
/*
小考八題目:
一、使用 fopen,以開啟一個二進位的檔案進行寫入,你必須寫入幾個整數,
這些整數是經過你精密計算過的數字。完成寫入後,即關閉該檔案。
二、再度開啟步驟一所處理的檔案,但是這次是讀取二進位檔案,讀取全部的
內容存入一個字串變數中。
三、列印這個字串,字串顯示出的內容為"C Programming"。

提示一:先考慮你必須寫入的整數的個數。
提示二:想想整數是如何寫入的,求出這些整數的值。
*/

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fptr;
char str[20];
/* your program is here */

int num[4] = {1917853763, 1634887535, 1852403053, 103};
fptr = fopen("quiz3A.bin", "wb");
fwrite(num, sizeof(int), 4, fptr);
fclose(fptr);
fptr = fopen("quiz3A.bin", "rb");
fread(str, sizeof(char), 16, fptr);
fclose(fptr);

printf("\n%s\n", str);
system("pause");
return 0;
}

小考八(A)題目
返回小考目錄
回到首頁

小考八(A) 題目


/*
小考八題目:
一、使用 fopen,以開啟一個二進位的檔案進行寫入,你必須寫入幾個整數,
這些整數是經過你精密計算過的數字。完成寫入後,即關閉該檔案。
二、再度開啟步驟一所處理的檔案,但是這次是讀取二進位檔案,讀取全部的
內容存入一個字串變數中。
三、列印這個字串,字串顯示出的內容為"C Programming"。

提示一:先考慮你必須寫入的整數的個數。
提示二:想想整數是如何寫入的,求出這些整數的值。
*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *fptr;
char str[20];
/* your program is here */







printf("\n%s\n", str);
system("pause");
return 0;
}

解答下載
返回小考目錄
回到首頁

2007年10月6日 星期六

小考七(B) 解答


/* C Programming, Quiz 7B */
/*
小考七題目:
利用指標傳遞陣列到函數,完成
1. 函數 reverse,在函數中,陣列的值按反序排列。
2. 函數 display,顯示輸入的陣列。

提示一:在reverse函數中,你需要宣告一個臨時的陣列,以存放反序的陣列。
提示二:本題答案的輸出應為 5, 6, -2, -8, 0, -1, 7, 3, -9, 4,。
*/

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

void reverse(int *);
void display(int *);

int main(void)
{
int C[SIZE] = {4,-9,3,7,-1,0,-8,-2,6,5};

reverse(C);
display(C);

system("pause");
return 0;
}

/* your program is here */
void reverse(int *ptr) {
int i=SIZE;
int temp[SIZE];
for (i=0;i<SIZE;i++)
temp[SIZE-i-1] = *(ptr+i);
for (i=0;i<SIZE;i++)
*(ptr+i) = *(temp+i);
}

void display(int *ptr) {
int i;
for (i=0;i<SIZE;i++)
printf("%d, ", *(ptr+i));
printf("\n");
}

小考七(B)題目
返回小考目錄
回到首頁

小考七(B) 題目


/*
小考七題目:
利用指標傳遞陣列到函數,完成
1. 函數 reverse,在函數中,陣列的值按反序排列。
2. 函數 display,顯示輸入的陣列。

提示一:在reverse函數中,你需要宣告一個臨時的陣列,以存放反序的陣列。
提示二:本題答案的輸出應為 5, 6, -2, -8, 0, -1, 7, 3, -9, 4,。
*/

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

void reverse(int *);
void display(int *);

int main(void)
{
int C[SIZE] = {4,-9,3,7,-1,0,-8,-2,6,5};

reverse(C);
display(C);

system("pause");
return 0;
}

/* your program is here */


解答下載
返回小考目錄
回到首頁

2007年10月5日 星期五

Problem 374 Big Mod,大數字除法的餘數

這題是數學題,只要知道公式(a * b) mod c = ((a mod c) * (b mod c)) mod c,就可以將B^P mod M 不斷分割成小塊來避免溢位的問題,可以參考下面的方法:

unsigned long ComputeR(unsigned long B, unsigned long P, unsigned long M){
if (P==1) return B % M;
unsigned long i,res=1;
i=1;
res = B%M;
while(2*i<P){
res = (res*res)%M;
i*=2;
}
return (res * ComputeR(B,P-i,M))%M;
}

Solved by Wellwind
p274題目連結
回ACM題庫目錄
回首頁

2007年10月4日 星期四

小考七(A) 解答


/* C Programming, Quiz 7A */
/*
小考七題目:
利用指標傳遞字串到函數,完成
1. 函數 add10,在函數中,字串的每個字元會纍加10。
2. 函數 display,顯示輸入的字串。
3. 呼叫 add10 和 display,以顯示完成後輸出字串。

提示一:輸入為指定的字串指標 ptr。
提示二:結束字元為 '\0'。
*/

#include <stdio.h>
#include <stdlib.h>

void add10(char *);
void display(char *);

int main(void)
{
char school[] = "I^_^9^_[dKd_l[hi_joAWe^i_kd]9Wcfki";
char *ptr;

ptr = school;

/* your program is here */
add10(ptr);
display(ptr);

system("pause");
return 0;
}

/* your program is here */
void add10(char *ptr) {
while (*ptr != '\0') {
*ptr += 10;
ptr++;
}
}

void display(char *ptr) {
printf("%s\n", ptr);
}

小考七(A)題目
返回小考目錄
回到首頁

小考七(A) 題目


/*
小考七題目:
利用指標傳遞字串到函數,完成
1. 函數 add10,在函數中,字串的每個字元會纍加10。
2. 函數 display,顯示輸入的字串。
3. 呼叫 add10 和 display,以顯示完成後輸出字串。

提示一:輸入為指定的字串指標 ptr。
提示二:結束字元為 '\0'。

*/

#include <stdio.h>
#include <stdlib.h>

void add10(char *);
void display(char *);

int main(void)
{
char school[] = "I^_^9^_[dKd_l[hi_joAWe^i_kd]9Wcfki";
char *ptr;

ptr = school;

/* your program is here */

system("pause");
return 0;
}

/* your program is here */

解答下載
返回小考目錄
回到首頁