pretty code

2009年9月23日 星期三

配合英文學習 - 未來 EasyDictionary 改版事項

1. 取消 Config Record,都什麼時代了,還在用 File DB 的觀念。
2. 增加英文字字數統計的欄位,可以幫忙分析英文字常出的頻率等。
3. 取消 word 欄位不能重覆的限制(同樣的單字可以歸類在不同的群組)。

4. 參考棉被俠的程式,增加另一種測驗方式。
5. 批次下載失敗的單字要有 Log 記錄。
6. 找出 Thread 播 mp3 不 delay 的做法,或是找 open source 解決。
7. 增加相似字尋找的功能(select word from word where word like '%pose')
8. PKY = groups + word
9. prefix 改成 char not int



以上是這陣子練習英文的一些想法
感覺對英文越來越有 idea 了
哈 ... 我果然是天才

2009年9月22日 星期二

英文好好玩

英文這個科目從最早的沒把握
到現在想靠它拿分數
這其間的轉折我也不知道是怎麼回事

也許是因為英文的範圍比較明確吧
而且有背就有分

話說回來
看了一下人資的考古題
好像也蠻簡單的
至少比資訊類的申論題簡單多了

這是因為我沒有上過正統的課程
所以抓不到考試的重點嗎?

如果 100 分都考程式就好了
那我現在就可以出去玩了 ... XD

Wanted

圖書館呆久了總是會有一些奇奇怪怪的想法

最近突然有幾個想寫的程式

1. 程式碼排版軟體(轉 HTML),為了貼文章用。

反正我又不是要寫 compiler,分析和剖析對這個程式來說並不需要
我只要想辦法讓空白和斷行可以轉 HTML 就好

不過剛試用某網站轉檔的結果好像也不差
那這個程式就算了吧
反正不要寫中文註解就好了 ... XD

倒扣‧猜題‧程式

#include <stdio.h>
#include <mem.h>
#include <stdlib.h>
#include <time.h>
//---------------------------------------------------------------------------
const int    iTotalQuestions = 50;
const int    iGetScore       = 2;
const double dDelScore       = 1.0/3.0;
const int    iSelects        = 2;
const int    iOKQuestions    = 15;
const int    iTotalTest      = 1000000;
const double dLimitRate      = 1.0/3.0;
const double dGuestMax       = (iGetScore*iOKQuestions)*(dLimitRate)/dDelScore/iGetScore;
//---------------------------------------------------------------------------
struct SQItem
{
    int Ans;
    int Quess;
    int Done;
};
struct SRItem
{
    int Score;
    int Count;
};
//---------------------------------------------------------------------------
SQItem *g_iExam   = NULL;
SRItem *g_iResult = NULL;
//---------------------------------------------------------------------------
int GetQuestionSize(void)
{
    return (iTotalQuestions-iOKQuestions);   
}   
//---------------------------------------------------------------------------
int GetResultSize(void)
{
    int Size = ((int)dGuestMax+iOKQuestions)*iGetScore -
               (iOKQuestions*iGetScore-(int)(dGuestMax*dDelScore)*iGetScore) + 1;
               
    return Size;
}
//---------------------------------------------------------------------------
void GetQuestion(void)
{
    int QSize = GetQuestionSize();
   
    g_iExam = new SQItem[QSize];
   
    if(g_iExam)
    {
        for(int i = 0; i < QSize; i++)
        {
            g_iExam[i].Ans   = rand()%(iSelects);
            g_iExam[i].Quess = 0;
            g_iExam[i].Done  = 0;
        }           
    }   
}
//---------------------------------------------------------------------------
void DelQuestion(void)
{
    if(g_iExam)
    {
        delete []g_iExam;
        g_iExam = NULL;
    }   
}
//---------------------------------------------------------------------------
void InitResult(void)
{
    int RSize = GetResultSize();             
   
    g_iResult = new SRItem[RSize];
   
    for(int i = 0; i < RSize; i++)
    {
        g_iResult[i].Score = 0;
        g_iResult[i].Count = 0;
    }
}
//---------------------------------------------------------------------------
void DelResult(void)
{
    if(g_iResult)
    {
        delete []g_iResult;
        g_iResult = NULL;
    }   
}
//---------------------------------------------------------------------------
void SortResult(void)
{
    int RSize = GetResultSize();
   
    SRItem tmp;
   
    for(int i = 0; i < RSize; i++)
    {
        for(int j = i; j < RSize; j++)
        {
            if(g_iResult[i].Count < g_iResult[j].Count)
            {
                memcpy(&tmp, &g_iResult[i], sizeof(SRItem));
               
                memcpy(&g_iResult[i], &g_iResult[j], sizeof(SRItem));
               
                memcpy(&g_iResult[j], &tmp, sizeof(SRItem));
            }     
        }
    }
}
//---------------------------------------------------------------------------
void CalResult(void)
{
    int QSize = GetQuestionSize();
   
    int OCount = 0;
    int XCount = 0;
   
    for(int i = 0; i < QSize; i++)
    {
        if(g_iExam[i].Done == 1)
        {
            if(g_iExam[i].Ans == g_iExam[i].Quess)
            {
                OCount++;
            }
            else
            {
                XCount++;   
            }                                   
        }
    }
   
    double Total = iGetScore*(iOKQuestions+OCount) -
                   iGetScore*dDelScore*(XCount);
   
    int RSize = GetResultSize();
   
    //Old Result
    for(int i = 0; i < RSize; i++)
    {
        //Finded
        if(g_iResult[i].Score == (int)Total)
        {   
            g_iResult[i].Count++;
           
            return;
        }
    }
   
    //New Result
    for(int i = 0; i < RSize; i++)
    {
        //New Item
        if(g_iResult[i].Score == 0)
        {   
            g_iResult[i].Score = (int)Total;
            g_iResult[i].Count++;
           
            return;
        }
    }
}
//---------------------------------------------------------------------------
void WriteResult(void)
{
    FILE *f = fopen("Result.txt", "wb");
   
    if(f)
    {
        SortResult();
       
        int RSize = GetResultSize();
       
        for(int i = 0; i < RSize; i++)
        {
            if(g_iResult[i].Count != 0)
            {
                fprintf(f, "%07d, %d\r\n", g_iResult[i].Count, g_iResult[i].Score);
                printf("%07d, %d\r\n", g_iResult[i].Count, g_iResult[i].Score);
            }
        }
       
        printf("\r\n\r\n");           
        fclose(f);     
    }
}
//---------------------------------------------------------------------------
void GuessExam(void)
{
    while(1)
    {
        int QSize = GetQuestionSize();
        int index = rand()%(QSize);
       
        if(g_iExam[index].Done == 0)
        {
            g_iExam[index].Quess = rand()%(iSelects);
            g_iExam[index].Done  = 1;           
                   
            break;
        }
    }
}
//---------------------------------------------------------------------------
int main(int argc, char *argv[])
{   
    srand((unsigned int)time(0));
   
    InitResult();
       
    for(int i = 0; i < iTotalTest; i++)
    {
        int count = 0;
       
        GetQuestion();
       
        while(1)
        {
            GuessExam();
           
            count++;           
           
            if(count == (int)dGuestMax)
            {
                break;   
            }   
        }
       
        CalResult();
       
        DelQuestion();
    }
   
    WriteResult();
    DelResult();   
   
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
 

2009年9月21日 星期一

2009年9月19日 星期六

倒扣‧猜題‧結論

延續之前的想法,增加了一些變數

1. 只有 4 個選項
2. 最多猜到原本的分數被吃掉 1/3 就不再猜題
3. 反正是電腦在跑,就讓它跑一百萬次



結果如下!

30 分有把握,猜 15 題 (吃掉 1/3 的最多猜題次數),4 選 1

30 分有把握,猜 06 題,4 選 1


30 分有把握,猜 15 題,2 選 1




我想結論應該已經很明顯了!

4 選 1 的情況下,猜不猜題都沒有意義。
2 選 1 的情況下,即使猜題猜到 15 題,都還可以接受。

2009年9月12日 星期六

倒扣‧猜題

這次的考試有倒扣
別科倒也罷了
英文卻有最低標的限制
雖然英文需要長久的努力
並非一朝一夕可即
但是總可以做點什麼吧?

為了反應真實考試狀況
假設是 50 題單選題,一題 2 分,倒扣 1/3

如果以常理推斷
錯 3 題才會吃掉 1 題的分數
看起來是很划算的
不過實情真的是如此嗎?

我決定使用程式來模擬倒扣的情況

1. 分別用同樣的程式在 Windows and Linux 下跑,避免作業系統的差異。
2. 次數跑 10000 次。
3. 要先決定英文有把握的分數,我看應該是 30 分,也就是有 35 題是需要猜的。
4. 程式一點也不難,難的是這個模擬要有意義,故要把所有真實情況都考慮進去再來動工。

未完待續 ~