高中生程式解題系統:因數分解(Factorization)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

題目連結 http://zerojudge.tw/ShowProblem?problemid=a010

解這題,有幾種作法:
方法一:
1. 除數從 2 開始,若此被除數可以被除數 2 整除,就被除數就一直除以 2;若不行除數換用 3。
2. 一直重複到 除數的平方大於或小於 被除數。

方法二:
1. 求出小於此被除數開根號後的所有質數。
2. 在用這些質數去除被除數算出每個質因數出現的次數。

但底下程式碼是先建立質數表,再進行因數分解。

程式碼:

#include <iostream>
using namespace std;
int main()
{
unsigned short prime[] = {
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293,
307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,
503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,
701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797,
809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887,
907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
};
unsigned short SIZE = sizeof(prime) / sizeof(unsigned short);
int n;
while( cin >> n )
{
int temp = n;
int counter;
int tPrime;
for( int i = 0; i < SIZE ; i++ )
{
counter = 0;
tPrime = prime[i];
if( tPrime * tPrime > temp )
break;
while( temp % tPrime == 0 )
{
counter++;
temp /= tPrime;
}
if( counter == 0 )
continue;
cout << tPrime << (counter > 1? "^":"");
if( counter >= 2 )
cout << counter;
if( temp != 1 )
cout << " * ";
}
if( temp != 1 )
cout << temp;
cout << endl;
}
return 0;
}
view raw a010.cpp hosted with ❤ by GitHub

高中生程式解題系統:解碼器(Decode)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

題目連結 http://zerojudge.tw/ShowProblem?problemid=a009。此題用字元的 ASCII Code 來運算即可,而整數K到底是多少呢?


程式碼:

#include <iostream>
using namespace std;
int main()
{
int k = -7;
char ch;
while( cin.get(ch) )
{
if( ch != '\n' )
ch = ch + k;
cout << ch;
}
return 0;
}
view raw a009.cpp hosted with ❤ by GitHub

高中生程式解題系統:一元二次方程式 (A Quadratic Equation)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

題目連結 https://zerojudge.tw/ShowProblem?problemid=a006
一元二次方程式解的公式(下圖取自 Wikipedia 一元二次方程式):
{\displaystyle x_{1,2}={\frac {-b\pm {\sqrt {b^{2}-4ac\ }}}{2a}}}

先求出一元二次方程式根的判別式(下圖取自 Wikipedia 一元二次方程式):
{\displaystyle \Delta =b^{2}-4ac}

判斷是否有實數解,相等根。再用公式求出兩根的解即可。

程式碼:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double a, b, c;
while( cin >> a >> b >> c )
{
int check = b * b - 4 * a * c;
bool noRoot = check < 0;
if( noRoot == true )
{
cout << "No real root" << endl;
}
else
{
if( check == 0 )
{
int x = -b / (2 * a);
cout << "Two same roots x=" << x << endl;
}
else
{
int x1 = (-b + sqrtl(check)) / (2 * a);
int x2 = (-b - sqrtl(check)) / (2 * a);
cout << "Two different roots x1=" << x1 << " , x2=" << x2 << endl;
}
}
}
return 0;
}
view raw a006.cpp hosted with ❤ by GitHub

惡搞嘻語言第五嘻:嘻函式

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

函式在嘻語言裡無所不在,例如printf就是一個函式,為標準函式之一,若沒提供一些積木的函式給開發者使用,那不就要開發者自行做積木嗎?
若要自行撰寫函式又要如何鑽寫呢?函式的定義如下:
傳回值型態 函數名稱(參數一型態 參數一名稱, 參數二型態 參數二名稱, ....)
{
變數宣告
程式碼
return 傳回值;
}

例如下面是y=x^2的函式:
intpower(int x) {
inty = x * x;
returny;
}

範例:

#include <stdio.h>
int power(int x); // 這叫函式原型,是用來騙編譯器的
int main(void) {
int result = power(3);
printf("printf本身就是函數囉!\n");
printf("3^2 = %d", result);
return 0;
}
int power(int x) {
int y = x * x;
return y;
}
view raw Function_Demo.c hosted with ❤ by GitHub
參考網址:


讀書心得:YOUTUBE英語學習法

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。


<YouTube英語學習法>此書從解釋為什要使用YouTube來學習英語開始,先建立讀者對英語聽力的一些心態,例如如何降低有聽沒有懂時所受到的挫折感等。接下來書上會教讀者循序漸進的方式慢慢學習英語,並且提供一些方法與工具,例如以玩遊戲的方式來練習聽寫。

另外VoiceTube也提供類似的資源給學習英語的人。

TED也有字幕供觀看影片的人使用。

底下是筆者從書上所做的筆記。

EF podEnglish - Learn English! - YouTube

提供初級、中級、高級的英語會話課程。

包含發音、詞彙、文法、俚語、常犯錯誤、小學堂等類別。

以打招呼等基礎開始的課程。

輕鬆方式教授英語的課程。

英語新聞頻道BBC所提供。

有漫畫的影片   ==> 筆者最愛。

動畫與兒童節目--適合初學者
兒童教育節目<<芝麻街>>

以一隻紅色狗為主角的卡通。

卡通影片

<<辛普森家庭>>

<<蓋酷家庭>>

美食節目
介紹日本料理

介紹西式美食

美式家庭菜餚

甜食

有爆點的影片
多樣化的題材,如萬聖節、聖誕節、瘦身、IT產品的使用等



適合初學者的英語新聞

介紹日本影片

大學課程影片

綜藝節目影片

高中生程式解題系統:Eva 的回家作業

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。


題目連結 http://zerojudge.tw/ShowProblem?problemid=a005
這題套用等差公式(下圖取自 Wikipedia 等差數列)
 a_n=a+(n-1)d

或等比公式(下圖取自 Wikipedia 等比數列)


先判斷數列是等差數列還是等比數列後,在求出第五項就可以了。

程式碼如下:

#include <iostream>
using namespace std;
int main() {
short t;
cin >> t;
while(t-- > 0){
int a, b, c, d, e, r;
cin >> a >> b >> c >> d;
r = b - a;
if( d == a + 3*r )
{
e = a + 4 * r;
}
else
{
r = b / a;
r = r * r;
r = r * r;
e = a * r;
}
cout << a << " " << b << " "
<< c << " " << d << " "
<< e << endl;
}
return 0;
}
view raw a005.cpp hosted with ❤ by GitHub

程式設計入門( Computer programming for a novice )

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。


簡短介紹程式語言所需要的觀念,並以 C++ 和 Java 兩種程式語言示範。


投影片下載處:



程式碼下載處:
http://www.4shared.com/archive/wdl_N-Hpba/HowToProgram.html


高中生程式解題系統:文文的求婚

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。


題目連結 http://zerojudge.tw/ShowProblem?problemid=a004,根據題目給的提示:西元年被4整除且不被100整除,或被400整除者即為閏年。即可完成此題了。

程式碼如下:

#include <iostream>
using namespace std;
int main() {
short y;
while(cin >> y){
y = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
cout << (y == 1?"閏年":"平年") << endl;
}
return 0;
}
view raw a004.cpp hosted with ❤ by GitHub

高中生程式解題系統:字串讀取練習

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。


題目連結 https://zerojudge.tw/ShowProblem?problemid=d018

此題為字串處理的題目,用C++ sstream 裡的 istringstream 來處理。

將字串切割成
序號(整數):(字元)實數(浮點數)
用 istringstream buffer(str);  int serial; char dummy; double real; 等變數。
最後變成  buffer >> serial >> dummy >> real

程式碼:
#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    string str;

    while(getline(cin, str))
    {
        int serial;
        char dummy;
        double real;
        double result = 0;

        istringstream buffer(str);

        while(buffer >> serial >> dummy >> real)
        {
            //cout << serial << dummy << real << " ";
            if( serial & 1 )
                result += real;
            else
                result -= real;

            //cout << result << endl;
        }

        cout << result << endl;
    }

    return 0;
}

讀書心得:睡谷傳奇 (THE LEGEND OF SLEEPY HOLLOW)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。


<<睡谷傳奇>>一書描述說一為名叫「奕可柏.柯鶴」的教師,康乃狄克州人。他到一個叫做「睡谷」的小村落,在那裡他遇到了一位富有農夫的美麗女兒「嘉翠娜.凡.陶蘇」,亦可柏對她傾心不已。不過有個很臭屁的情敵「保洪.碰司」。在一場宴會之後,女孩拒絕了他,只好落寞地騎著馬回家。在回家途中,他遇到了傳言中可怕的「無頭騎士」幽靈,在一場恐怖至極的追逐後,奕楂柏消失了...

亦可柏想追富家女孩的動機是很多人都有的,但女孩的心思總是讓人捉模不定,而且一位外來人士要融入當地的風情文化是需要時間和精神的,也需要個人的接受度。

幽靈、鬼魂、神仙一向都是傳奇或傳說常見的題材,供人茶餘飯後Talk的話題,感興趣的看倌們,此書也提供了題材喔。

高中生程式解題系統:後序運算法

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

題目連結 https://zerojudge.tw/ShowProblem?problemid=d016

後序表示法的運算方式如下:
從後序表示法的前方開始讀取,
若是運算元則放進堆疊裡,
若是運算子,則從堆疊取出兩個運算元進行運算,並將結果存回堆疊,
若讀取完畢,則堆疊的最頂端即為此後序表示式的運算結果。

例子可看底下影片的動畫說明:

底下程式碼是用STL裡的stack來做。此外,程式碼的寫法是可以改善的。

程式碼:
#include <iostream>
#include <string>
#include <sstream>
#include <stack>

using namespace std;

int main(){

    string input;

    while( getline(cin, input) )
    {
        stack<int> value;

        stringstream strStream(input);
        string token;
        int inStack;
        int outStack;

        while( strStream >> token )
        {
            switch(token[0])
            {
                case '+':
                    outStack = value.top();
                    value.pop();
                    inStack = value.top();
                    value.pop();
                    inStack += outStack;
                    value.push(inStack);
                    break;
                case '-':
                    outStack = value.top();
                    value.pop();
                    inStack = value.top();
                    value.pop();
                    inStack -= outStack;
                    value.push(inStack);
                    break;
                case '*':
                    outStack = value.top();
                    value.pop();
                    inStack = value.top();
                    value.pop();
                    inStack *= outStack;
                    value.push(inStack);
                    break;
                case '/':
                    outStack = value.top();
                    value.pop();
                    inStack = value.top();
                    value.pop();
                    inStack /= outStack;
                    value.push(inStack);
                    break;
                case '%':
                    outStack = value.top();
                    value.pop();
                    inStack = value.top();
                    value.pop();
                    inStack %= outStack;
                    value.push(inStack);
                    break;
                default:
                    inStack = atol(token.c_str());
                    value.push(inStack);
                    break;
            }
        }

        inStack = value.top();
        cout << inStack << endl;
    }

    return 0;
}

程式語言如何入門

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

拚命玩遊戲就能學寫程式! CodeCombat 還有中文版

就是玩遊戲而已,如果覺得上面還沒有辦法說服你,那下面這篇也看看好了。

被神化的 Coding,工程師現身:寫程式不需要天份,也不需要熱情



但也請你看看些 這文章



筆者個人的經驗就是:「只要有明確且強烈的動機,就會想辦法去學了。」

高中生程式解題系統:盈數、虧數和完全數

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

題目連結 http://zerojudge.tw/ShowProblem?problemid=d010

此題用迴圈從判斷1到 N/2 是否為 N 的因數,若是則加總(s)。接著比較加總結果與 N的大小關係來輸出對應的訊息。(那有沒有更好的演算法呢?)

程式碼:
#include <iostream>
#include <cmath>

using namespace std;

void prtMsg(const int &s, const int &n)
{
    if( s == n )
        cout << "完全數";
    else if( s > n )
        cout << "盈數";
    else
        cout << "虧數";

    cout << endl;
}

int main()
{
    int n;

    while( cin >> n )
    {
        int s = 0;
        for( int i = 1; i <= n/2; i++ )
        {
            if( n % i == 0 )
                s += i;
        }

        prtMsg(s, n);
    }

    return 0;
}

讀書筆記:寫給C++程式設計師的UML實務手冊

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

UML簡介
由 Grady Booch, Jim Rumbaugh, Ivan Jacobson 所發展出來的
模型幫助我們視覺化一個系統。
模型允許我們詳述一個系統的結構或是行為。
模型給出指引我們建構一個系統的樣板。
模型紀錄了我們所做的決定。

4 + 1觀點 (4 + 1 View)

使用案例觀點 (Use Case View)
從系統外部的使用者角度,表達系統所提供的功能(4+1中的1指的是使用案例觀點)

設計觀點 (Design View)
描繪出系統的靜態結構以及動態行為,以做為系統所提供之功能的解答。因此,設計觀點圍繞在類別、介面以及物件的合作等等設計問題上。

處理流程觀點 (Process View)
描繪出組成系統的平行以及同步機制之執行緒(thread)以及程序(process)。這個觀點強調系統的性能、延展性等非功能性需求。

實做觀點 (Process View)
以模組或元件來顯示設計觀點的物件是在哪一個模組或元件中實做。

部屬觀點 (Deployment View)
描繪系統在執行時,各個組成元件的實際佈置與安裝,強調系統執行環境的硬體拓樸結構。



UML圖形簡介
使用案例圖
塑模出系統應該做什麼(What),而不是如何做(How);描述系統所提供的功能以及其執行時的情境(Scenario)

活動圖
塑模出系統層級之處理邏輯以及執行流程。可用來檢視使用案例圖,幫助我們發覺使用案例中所可能產生的各種不同情境。

類別圖
塑模出問題領域中所發掘的物件類別;表示物件靜態的資料結構。

物件圖
塑模出問題領域中所參與的實際物件,藉以檢驗類別圖的準確度。

循序圖
塑模出問題領域中物件互動的情形,重點是在強調一個使用案例中,物件與物件之間執行順序的時間性。

合作圖
塑模出問題領域中物件互動的情形,強調合作的物件結構以完成一個使用案例。

狀態圖
塑模系統中物件、子系統、系統等在其生命週期中各種可能的狀態,造成狀態轉換的事件,以及在各不同狀態中可能的活動。

元件圖
呈現系統中,軟體實體元件的組織以及他們之間的相依性,其中包含它們所實做的介面以及實做介面的軟體部份。

部署圖
呈現節點在執行時(Run-Time)的配置以及在各節點中的元件;節點指的就是硬體。換句話說,部署圖呈現系統的硬體配置靜態觀點,以及在各項硬體中執行的軟體元件。

Java Puzzler Video

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

 底下為有關Java Puzzler的影片。

Java Expressive Puzzlers

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

解釋在程式碼裡,有疑問的人,請在此發問。

public class Expressive {
public static void main(String args[]) {
Expressive puzzler = new Expressive();
puzzler.Oddity();
puzzler.Chage();
puzzler.LongDivision();
puzzler.Elementary();
puzzler.JoyOfHex();
puzzler.Multicast();
puzzler.CleverSwap();
puzzler.DosEquis();
puzzler.Tweedledum();
puzzler.Tweedledee();
}
/*
* Puzzler-1: Oddity
* isOdd 是判斷奇數的方法, Oddity 為測試碼。
*/
private void Oddity() {
System.out.println("Oddity Result:");
for(int i = -3; i <= 3; i++) {
if( isOdd(i) == true ) {
System.out.println( i + " is an odd.");
} else {
System.out.println( i + " isn't an odd.");
}
}
System.out.println("");
}
public static boolean isOdd(int i) {
return i % 2 == 1; // 此行無法對負數做正確的判斷
// 底下三行皆可正確判斷,但用 & 運算子速度較快
// return i % 2 != 0;
// return ((i & 1) == 1);
// return ((i & 1) != 0);
}
/*
* Puzzler-2: Change
* 不是所有的數值都能用二進位表示。
* Java對十進位小數都是以double為預設型態。
*/
private void Chage() {
System.out.println("Change Result:");
System.out.println(2.00 - 1.10); // 此行無法正確輸出 0.9
System.out.println("");
/*
* 解法一:
* System.out.printf("%.2f\n", 2.00 - 1.10);
*/
/*
* 解法二:
* System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
*/
/*
* 當需要正確數值結果時,請使用 int、long 型態或BigDecimal類別。
*/
}
/*
* Puzzler-3: LongDivision
*/
private void LongDivision() {
System.out.println("LongDivision Result:");
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; // 這行會溢位(overflow)
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
System.out.println("");
/*
*
* 在 Java 中整數運算預設是以 int 型態處理(32位元),最大值為 2147483647。
* 而 86400000000 大於 2147483647,所以就溢位了,結果會只取最右邊的32位元。
* 1010000011101110101110110000000000000
* 11101110101110110000000000000 ==> 取這部分,值為500654080。
*
* 解法:在整數後頭加上L
* final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
* final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
*
* 在處理大數值時,請小心溢位。
*/
}
/*
* Puzzler-4: Elementary
*/
private void Elementary() {
System.out.println("Elementary Result:");
System.out.println(12345 + 5432l);
System.out.println("");
/*
* 注意l是小寫的L,不是 1。請用L來表示 long 型態的數值。
* System.out.println(12345 + 5432L);
*/
}
/*
* Puzzler-5: JoyOfHex
*/
private void JoyOfHex() {
System.out.println("JoyOfHex Result:");
System.out.println(
Long.toHexString(0x100000000L + 0xcafebabe));
System.out.println("");
/*
* 十進位數值要表示負數的話,必須在數字最左邊加上負號,但對8進位與16進位而言,只要最左邊的符號位元(最高位元)是1就行。
* 所以0xcafebabe為十進位的-889275714,此題還是個混合型態的運算:long + int,
* 結果0xcafebabe擴展成了0xffffffffcafebabe,所以結果如下:
* 0xFFFFFFFFCAFEBABEL
* + 0x0000000100000000L
* = 0x00000000CAFEBABEL
*
* 解法:
* System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
*
* 盡量少用混合型態的運算。
*/
}
/*
* Puzzler-6: Multicast
*/
private void Multicast() {
System.out.println("Multicast Result:");
System.out.println((int) (char) (byte) -1); // 結果為 65535
System.out.println("");
/*
* 除了型態轉換外,也得考慮是否有符號擴展,型態為 char 時,使用零擴展。
* 轉換過程如下:
* 一、-1 從int --> byte,值仍為-1,但只剩8位元:11111111。
*
* 二、byte --> char,因為byte是signed,而char是unsigned,所以byte轉為int再轉為char:
* byte -> int: 11111111(8)-> 11111111111111111111111111111111(32)
* int -> char: 11111111111111111111111111111111(32)-> 1111111111111111(16)
*
* 三、char --> int, 因為char是unsigned,直接補零:
* 1111111111111111(16) -> 00000000000000001111111111111111(32)
* 這個00000000000000001111111111111111的值就是2^16 - 1 = 65535。
*
* 想要把byte轉成char,可以使用遮罩:
* char c = (char) (b & 0xff)
*/
}
/*
* Puzzler-7: CleverSwap
*/
private void CleverSwap() {
System.out.println("CleverSwap Result:");
int x = 1984;
int y = 2001;
x ^= y ^= x ^= y;
System.out.println("x = " + x + "; y = " + y); // 結果 x = 0; y = 1984
System.out.println("");
/*
* Java語言規格書提到:「運算子和運算元在計算時,順序是從左到右的。」
* 所以在計算 x ^= expr時,x得值已經被取出來的,
* 然後x在和expr的結果做XOR運算,最後再將XOR運算結果指定給x。
*
* Java 對x ^= y ^= x ^= y 做了底下的事:
* int tmp1 = x;
* int tmp2 = y;
* int tmp3 = x ^ y;
* x = tmp3; ==> 最右邊的指定運算
* y = tmp2 ^ tmp3; ==> 中間的指定運算
* x = tmp1 ^ y; ==> 最左邊的指定運算
*
* 交換兩個變數的值可用
* x = x ^ y;
* y = y ^ x;
* x = y ^ x;
*
* 或是醜醜的 y = (x ^= (y ^= x)) ^ y;
*
* 在同一個運算式中,同一個變數最好不要被指定超過一次。
*/
}
/*
* Puzzler-8: DosEquis
*/
private void DosEquis() {
System.out.println("DosEquis Result:");
char x = 'X';
int i = 0;
System.out.print(true ? x : 0);
System.out.print(false ? i : x);
System.out.println(""); // 結果 X88
System.out.println("");
/*
* 這題的規則還真多,請參考
* http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25
*
* 請不要用混合型態。
*
*/
}
/*
* Puzzler-9: Tweedledum
*/
private void Tweedledum() {
short x = 0;
int i = 123456;
x += i; // Must be LEGAL,有隱喻的轉型
// x = x + i; // Must be ILLEGAL
System.out.println("Tweedledum result:");
System.out.println("x:" + x + ", i:" + i); // 結果 x:-7616, i:123456
System.out.println("");
/*
* 複合指定運算式會自動將運算的結果轉成和左邊運算子一樣的資料型態。
*/
}
/*
* Puzzler-10: Tweedledee
*/
private void Tweedledee() {
Object x = "Buy ";
String i = "Effective Java!";
x = x + i; // Must be LEGAL
x += i; // Must be ILLEGAL
System.out.println("Tweedledee result:");
System.out.println("x:" + x + ", i:" + i);
System.out.println("");
/*
* 這題跟 JDK 版本有關,有興趣的人可看 stackoverflow 上的討論
* http://stackoverflow.com/questions/14218385/how-do-i-make-e1-e2-illegal-while-e1-e1-e2-is-legal
*/
}
/*
* 在下的心得:寫程式幹嘛用有陷阱的語法阿。
*/
}
view raw Expressive.java hosted with ❤ by GitHub

讀書心得:最後14堂星期二的課(TUESDAYS WITH MORRIE)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

<最後14堂星期二的課>一書是我在逢甲化工讀書時,國文老師推薦的課外閱讀之一,當時的我還真的去借來看,逢甲化工的課業壓力其實很重,化學實驗要寫預報和結報;國文要背唐詩;微積分老師不教計算題,偏愛證明;物理老師居然教了三個積分符號的算式...等,不回憶了。

回到正題,此書讓我見識到人在面臨身死交關時,可以很瀟灑地面對,也可以怨天尤人地抱怨,而我期許自己做到不抱怨就好了。



另外附上Randy Pausch教授的最後一堂課。


讀書筆記:字元裝置驅動程式(scull sample from ldd3)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

此範例是修改LDD3第三章的scull (Simple Character Utility for Loading Localities),我所使用的Linux Kernel版本為3.19.0,程式碼在此

scull設計藍圖

與硬體無關,從kernel取記憶體來模擬成字元裝置來使用。

如上圖所示,scull分成幾種裝置:
  • scull0scull3為記憶體區域,提供資料共享(shared)與持續性(persistence)功能。
  • scullpipe0scullpipe3FIFO裝置,含有blockingnon-blocking IO功能。
  • scullsingle提供同一時間只能被一個行程存取。
  • scullpriv確保每個virtual console的記憶體不共享。
  • sculluidscullwuid讓同一個使用者可啟用裝置多次;當有人在使用時,sculluid會回傳裝置忙碌中,而scullwuid則會繼續等待(block)

Major and Minor Numbers


此範例有提供script方便使用,例如要將scull module載入時,只要使用scull_load就行了,

sudo ./scull_load
sudo cp main.c /dev/scull0
cat /dev/scull0 | head -20 | tail -10
sudo ./scull_unload