顯示具有 計概 標籤的文章。 顯示所有文章
顯示具有 計概 標籤的文章。 顯示所有文章

2008-01-01

模數運算子:%

  模數運算子(modulus operator)主要用於整數的計算,「a%b」:a除以b後得到的餘數即是該運子求得的答案。有看過我之前寫的「整數型態的除法」的人可能就會問「用於浮點數計算的話會得到什麼?」這點可以不用擔心,因為模數運算子不提供浮點數運算,compiler會跳出來阻止你的!

  模數運算子看起來似乎只是很普通的數學運算子,實際上他的用處可不少呢!參考以下程式碼:

#include <stdio.h>

int main() {
int i = 0 ;
while(i++ < 5) {
if(i%2)
printf("%d => 奇數\n", i) ;
else

printf("%d => 偶數\n", i) ;
}
system("pause") ;
return 0 ;
}
印出結果不意外的是
1 => 奇數
2 => 偶數
3 => 奇數
4 => 偶數
5 => 奇數
  透過模數運算子很簡單的就能判斷奇偶數,當然這只是很簡單的應用範例,在思考下面的程式範例:
#include <stdio.h>

int main() {
int i = 0 ;
while(i++ < 12) {
printf("%2d ", i) ;
if(i%4==0)
printf("\n 印了四次!!\n") ;
}
system("pause") ;
return 0 ;
}
得到結果如下:
1 2 3 4
印了四次!!
5 6 7 8
印了四次!!
9 10 11 12
印了四次!!
  此範例示範了模數運算子在週期性上的應用,常見應用如印月曆。除了上面兩個簡單的應用範例外,當然還有數不盡的範例可以說,若只是講解應用範例的話那就太沒意思了!真正的重點在下面這段程式碼:
#include <stdio.h>

int main() {
printf("%d\n", 5%2) ;
printf("%d\n", -5%2) ;
printf("%d\n", 5%-2) ;
printf("%d\n", -5%-2) ;
system("pause") ;
return 0 ;
}
  思考一下究竟會得到什麼結果?!

  這在C99標準制定之前可是沒有標準答案,但既然現在C99已是公認的標準,因此就遵循C99的規則來思考吧:前面的運算元如果是負的,得到的結果就是負的;如果前面的運算元是正數,則結果就是正數,簡單來說就是看左邊的運算子正負號即可。因此結果如下:
1
-1
1
-1

2007-12-16

整數型態的除法

對新手來說很重要的觀念!
請思考的程式碼印出結果,究竟會印出0.5或是0?

#include <stdio.h>
int main() {
  int a = 10 ;
  int b = 20 ;
  printf("%f\n", a/b) ;
  system("pause") ;
  return 0 ;
}
很多新手應該會選擇0.5吧!確實~以人類思考角度來看0.5應該是正確的,可是在C語言看來0才是正確解答。
在C語言中,除法分為整數除法浮點數除法
  • 整數除法
    電腦僅會算到整數值,至於小數(分數)部分直接省去,並且是無條件捨位。
  • 浮點數除法
    電腦會一路除下去,直到表示位數的最小位數,採用四捨五入。

那究竟什麼時候採用整數除法又什麼時候採用浮點數除法呢?當然不是看電腦心情隨機決定XD
端看除法兩邊的運算元來決定,如果除法的兩個運算子其中一個為浮點數型態(float或double)則電腦就會採用浮點數除法,否則就採用整數除法。上面的例子會採用整數除法,原因是變數a與b都是整數型態,因此採用整數除法。
接著再看以下範例,答案將會是0.666667
#include <stdio.h>
int main() {
  float a = 2 ;
  float b = 3 ;
  printf("%f\n", a/b) ;
  system("pause") ;
  return 0 ;
}

2007-07-29

好用的JavaScript Calendar

  製作網頁表單常常為了統一使用者輸入日期格式煩惱?一般都是用select標籤來限制使用者或使透過JavaScript檢查使用者輸入的格式是否正確,前幾天在網路上不小心撿到好康的程式(JavaScript Calendar)。
  JavaScrip Calendar讓你的網頁可以輕鬆的增加月曆讓使用者方便點選,月曆出現的方式也可以選擇彈跳出新視窗或用浮現在原頁面,選擇完畢後自動將日期填入對應的欄位中,其中日期產生格式也可以由你自訂,是一套十分靈活的JavaScript模組。
  參考原著網頁:http://www.dynarch.com/projects/calendar/

使用示範:
step1)  到http://www.dynarch.com/projects/calendar/下載最新版本
step2) 將下載回來的套件解壓縮丟入網頁目錄
step3) 下載範例網頁並將之跟解壓縮的資料夾放在同一層目錄中即可

更多進階使用方法:
  解壓縮後資料夾中英該有一個doc子資料夾,裡面有完整的使用說明!

2007-06-30

【整合版】王壘 => 計算機概論

  概論性的科目向來都是大家所認定的必過科目,不過這個邏輯用在計算機概論似乎不是那樣般的合理。很多人認為老師是大刀,我想這應該跟今年畢業的那屆學長姐有莫大關係吧,傳說的一個班不到十個人及格,不過會如此之慘據說是班級整體表現不佳所導致的:期中考以後點名班上缺一個人就全班學期總分減一,這樣扣法相信我去修習也會是在及格邊緣吧?!說不定根本不會及格...

  今年做了一個很危險的行為:把歷年蒐集的考古題公佈於網路,其實我知道這樣的行為老師遲早會發現,只是沒想到期中考後老師就知道了,相信是某些人在考後才知道有這東西感到忿忿不平因而偷偷告訴老師吧,老師沒跟我提過這些事,只聽學弟說老師在課堂上有提到考古題一事。

  不管老師怎麼想,把考古題放上來動機很簡單:只是想讓那些不知如何抓此科重點的學弟妹讀書能有所依據而已,公佈考古題不是要讓各位能夠矇混過關,而是以考古題為中心把問題展開去了解相關知識,最好的方法則是把考古題裡的觀念問題找幾個同學一起思考"為什麼",討論不出結果的問題再來問我或其他學長,這樣學習才有意義!我知道老師考古題有一定的比例會很有用,但是把不懂的答案寫上考卷拿到及格分數,這樣很不真實吧?!

  當然除了把考古題問題弄懂,課本基礎知識自己也必須平常一點一滴慢慢累積才是,很多人喜歡到考前才在抱佛腳,經常問一些很沒營養的問題(ex. 學長while迴圈怎麼用?)這樣的問題其實很讓人生氣,一來是我不喜歡人家考前才在問問題,二來是這種問題感覺就是書只有翻過而已,自己根本沒去嘗試吸收,這樣的問題我該回答嗎?!

  我喜歡學弟妹來問問題是這樣說:為什麼這要這樣做而不是怎樣怎樣...。這樣表示問問題前已經做了很多的思考與閱讀,這樣也比較可能點出問題的盲點,否則每次的疑問都只是讓我把老師上課內容或書本上的內容再講過一次,其實沒多大意義吧?!

  上面三段共留下三個疑問,希望大家思考一下!

【延伸閱讀】
【96-上】王壘計算機概論(期末考)
【95-下】王壘-計算機概論(期中考)
【95-下】王壘-計算機概論(期末考)
【94-下】王壘-計算機概論(期中考)
【93-上】王壘-計算機概論(期中考)
【93-上】王壘-計算機概論(期末考)
【93-下】王壘-計算機概論(期末考)

update @ 2008/01/27

【95-下】王壘-計算機概論(期末考)




【關鍵字:95-下、王壘、計算機概論、期末考、考古題】

2007-05-25

【5/24】計概實習參考解答

題目:運用遞迴觀念設計一函數,該函數接受兩個參數:一個整數型態陣列、一個整數(表示陣列大小),並回傳總和

#include <stdio.h>

int sum(int a[], int x) {
if(x<=1) {
return a[x-1] ;
}
else

return a[x-1] + sum(a, x-1) ;
}
int main() {
int test1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ;
printf("%d\n", sum(test1, 10)) ;
system("pause") ;
return 0 ;
}

2007-05-10

氣泡排序法(由小到大)

#include <stdio.h>
#include
<time.h>

#define
MAX 5

int main() {
int i, j, k, flag = 1;
int number[MAX] ;
int temp ;


srand((unsigned)time(NULL)) ;
printf("排序前: ");
for(i = 0; i < MAX; i++) {
number[i] = rand()%100 ;
printf("%3d", number[i]) ;
}
printf("\n") ;


for(i = 0; i < MAX-1; i++) {
for(j = 0; j < MAX-i-1; j++) {
if(number[j+1] < number[j]) {
temp = number[j+1] ;
number[j+1] = number[j] ;
number[j] = temp ;
}
}

printf("第 %d 次排序:", i+1);
for(k = 0; k < MAX; k++)
printf("%d ", number[k]);
printf("\n");
}
system("pause") ;
return 0 ;
}

2007-04-18

【計概實習】4/18實習解答公佈

/*
*|
*| *
*| ***
*| *****
*|
*/

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

int main() {
int i, j, k ;
int line ;
printf("輸入入行數: ") ;
scanf("%d", &line) ;
for(i=0 ; i<line ; i++) {
for(j=line ; j>i ; j--) {
printf(" ") ;
}
for(k=0 ; k<=j*2 ; k++) {
printf("*") ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}


/*
*|
*| 1
*| 234
*| 56789
*|
*/

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

int main() {
int i, j, k ;
int line ;
int number = 1 ;
printf("輸入行數: ") ;
scanf("%d", &line) ;
for(i=0 ; i<line ; i++) {
for(j=line ; j>i ; j--) {
printf(" ") ;
}
for(k=0 ; k<=j*2 ; k++) {
printf("%d", number++) ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

2007-04-15

迴圈解題 - 雙層1~F

/*
*|
*| 1
*| 23
*| 456
*| 789A
*| BCDEF
*|
*| 應同學要求...擺上來供參考XD
*|
*| 如果雙層迴圈已經練熟了
*| 這題練習觀念著重於printf
*| 規格轉換型態
*|
*/


#include
<stdio.h>

int main() {
int i, j, k ;
for(i=1, k=1 ; i<=5 ; i++) {
for(j=1 ; j<=i ; j++) {
printf("%X", k++) ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

印星星綜合包 - 雙層迴圈source code

還不會的人真的要加把勁!!
如果我沒猜錯的話,
這次重點是雙層迴圈,
並且會運用到三元運算子 ? :
直接把答案貼上來
有任何問題再用MSN問吧^^
/*
*|
*| 1
*| 12
*| 123
*| 1234
*|
*/

#include
<stdio.h>

int main() {
int i, j ;
for(i=1 ; i<= 4 ; i++) {
for(j=1 ; j<=i ; j++) {
printf("%d", j) ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

/*
*|
*| *
*| **
*| ***
*| ****
*|
*/

#include
<stdio.h>

int main() {
int i, j ;
for(i=1 ; i<=4 ; i++) {
for(j=4 ; j>i ; j--) {
printf(" ") ;
}
for(j=1 ; j<=i ; j++) {
printf("*") ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

/*
*|
*| *****
*| ***
*| *
*| ***
*| *****
*|
*/

#include
<stdio.h>

int main() {
int i, j ;
for(i=-2 ; i<3 ; i++) {
for(j=2 ; j>(i>0 ? i : -i) ; j--) {
printf(" ") ;
}
for(j=0 ; j<((i>0 ? i*2 : -i*2)+1) ; j++) {
printf("*") ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

/*
*|
*| * *
*| * *
*| *
*| * *
*| * *
*|
*/

#include
<stdio.h>

int main() {
int i, j ;
for(i=-2 ; i<3 ; i++) {
for(j=-2 ; j<3 ; j++) {
i==j || i==-j ? printf("*") : printf(" ") ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

印星星基礎版 - 加註說明版

/*
*| *
*| **
*| ***
*| ****
*|
*| 觀察:
*| 首先分析這圖形需要有四行
*| 而每增加一行星星就多一顆
*|
*| 想法:
*| 用外層洄圈控制換行
*| 用內層回圈控制印星星
*| 因為星星數隨著行數增加
*| 所以內層回圈控制條件
*| 必須小於外層的變數值
*|
*| 期中考要到了, 還不會的人要加把勁!!
*/


#include
<stdio.h>

int main() {
int i, j ;
for(i=1 ; i<=4 ; i++) {
for(j=1 ; j<=i ; j++) {
printf("*") ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

2007-04-14

印出菱形星號 - 運用for迴圈

/*
*| *
*| ***
*| *****
*| ***
*| *
*|
*| 這解答運用了三元運算子,
*| true/false ? operand1 : operand2
*| 不知道的同學請自己參考課本說明
*| 這題的迴圈測試判斷也有人用abs()函數
*| 不過請記得引入math.h標頭檔
*/

#include
<stdio.h>

int main() {
int i, j, k ;
//line
for(i=-2 ; i<3 ; i++) {
//space

for(j=0,k=0 ; j>i || k<i ; j--, k++) {
printf(" ") ;
}
//number of *
for(j=1 ; j<=(i<0 ? i*2+5 : 5-i*2) ; j++) {
printf("*") ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

2007-04-13

【94-下】王壘-計算機概論(期中考)






【關鍵字:94-下、王壘、計算機概論、期中考、考古題】

2007-04-12

【計概實習】4/11~4/12實習解答公佈

#include<stdio.h>

int getMonthDays(int, int);
int getWeekDay(int, int, int);

void printCalendar(int, int);

main()
{
int year, month, days, youbi;
int n,d,x;

printf("請以空白區隔,輸入西元年份與月份,如2006 3。\n");
//要求使用者輸入年、月資訊

while(1){
scanf("%d %d", &year, &month);
if(month > 12 || month < 1 )
printf("輸入錯誤,請重新輸入。\n") ;
else

break ;
}
//該月份的日數
days = getMonthDays(year, month);
//第一天的星期編號

youbi = getWeekDay(year, month, 1);
//顯示月曆的年月
printf("&#35199;元%d年 %d月\n",year, month);


printf("----------------------------\n");
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
printf("----------------------------\n");
x=1 ;
for(n =0;n<youbi;n++)
printf(" ");
for( ; x<=days ; ){
for(n=youbi ; n<7 && x<=days ; n++, x++)
printf(" %2d ", x) ;
printf("\n") ;
youbi = 0 ;
}


system("pause");
}


int getMonthDays(int y, int m)
{
int dm;

switch(m){
case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12:
dm= 31;
break;
case 4 : case 6 : case 9 : case 11:
dm=30;
break;
case 2 :
if(y % 4 == 0 && y % 100 != 0 y % 400 == 0)
dm = 29 ;
else

dm = 28;
break;
default:
dm = 0;
}
return dm;
}
//取得每月一日是星期幾

//0 -> 星期日
//1 -> 星期一
//2 -> 星期二
//...依此類推

int getWeekDay(int y, int m, int d)
{
int w;

if(m== 1 m==2){
y--;
m+=12;
}
w=(y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7;
return w;
}

2007-04-04

【雙層迴圈練習】猜數字

  猜數字,講幾A幾B可能大家就馬上回想起這老遊戲,也就是猜四個數字,其中每組數字都不會重複,玩家必須從0~9去挑選四個數字組成一組,並且依照位置正確排列才能獲勝,當數字猜對但位置不對時會獲得1B;數字對且位置也對則獲得1A。
  舉例:假設正確解答是1357,玩家猜1528,則獲得1A1B,因為1答案相符且位置排列正確,故獲得1A;而5答案對但位置不符所以獲得1B。
  以下是程式碼(此程式碼數字儲存成字元,在讀取輸入時有些許重要觀念!):

#include <stdio.h>

int main() {
char input[4] ;
int i, j ;
int a, b ;
char ans[4] = {'1', '3', '5', '7'} ; //answer

while(1) {
printf("enter a number(4): ") ;
scanf("%c%c%c%c", &input[0],
&input[1], &input[2], &input[3]) ;
getchar() ; //deal '\n'
a = b = 0 ;
for(i=0 ; i<4 ; i++) {
if(ans[i] == input[i])
a++ ; //number and position are right

for(j=0 ; j<4 ; j++) {
if(ans[j] == input[i]) {
//number right, but position not match
b++ ;
}
}
}
b -=a ;
if(a == 4)
break ;
printf("you got %dA %dB, try again: ", a, b) ;
}
system("pause") ;
return 0 ;
}

2007-03-30

【計概實習】for迴圈講義&解答

講義下載: http://yaushung.googlepages.com/2007033001.ppt

解答

九九乘法表

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

int main() {
int i, j ;
printf(" 1 2 3 4 5 6 7 8 9\n") ;
for(i=1 ; i<10 ; i++) {
printf("%3d", i) ;
for(j=1 ; j<10 ; j++) {
printf("%3d", i*j) ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

九九乘法表進階版
#include <stdio.h>
#include
<stdlib.h>

int main() {
int i, j ;
printf(" 1 2 3 4 5 6 7 8 9\n") ;
for(i=1 ; i<10 ; i++) {
printf("%3d", i) ;
for(j=1 ; j<i ; j++)
printf(" .") ;
for(j=i ; j<10 ; j++) {
printf("%3d", i*j) ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

九九乘法表進階版【二】

  由於這次實習課的練習目標是for迴圈,因此不建議用if的寫法完成該程式。

#include
<stdio.h>
#include
<stdlib.h>
int main() {
int i, j ;
printf(" 1 2 3 4 5 6 7 8 9\n") ;
for(i=1 ; i<10 ; i++) {
printf("%3d", i) ;
for(j=1 ; j<10 ; j++) {
if(j<i)
printf(" .") ;
else

printf("%3d", i*j) ;
}
printf("\n") ;
}
system("pause") ;
return 0 ;
}

2007-03-13

if敘述的練習:閏年的判斷

  閏年(Leap year)定義:四年一潤,百年不潤,四百年潤。有人會說能被3200整除的年份也要排除在潤年之外,有科學家認為在這麼多年後,地球公轉已可能受到其他因素的影響而改變,因此大部分情況下並不會把3200列入考量!
  程式流程可以規劃如下圖:

  程式碼如下:

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

int main() {
int year ;
printf("請輸入西元年, 程式會檢查輸入的年份是否為閏年: ") ;
scanf("%d", &year) ;
if(year%4 == 0) {
if(year%100 == 0) {
if(year%400 == 0) //可被4,100,400除盡

printf("%d, 是閏年!", year) ;
else //可被4,100除盡, 不可被400除盡

printf("%d, 不是閏年!", year) ;
}
else //可被4除盡, 不可被100除盡

printf("%d, 是閏年!", year) ;
}
else //不可被4除盡
printf("%d, 不是閏年!", year) ;
system("pause") ;
return 0 ;
}

2007-03-05

【93-下】王壘-微處理機系統(期中考)




【關鍵字:93-下、王壘、微處理機系統、期中考、考古題】

【93-上】王壘-計算機概論(期末考)





【關鍵字:93-上、王壘、計算機概論、期末考、考古題】

【93-上】王壘-計算機概論(期中考)




【關鍵字:93-上、王壘、計算機概論、期中考、考古題】