2016-12-01 7 views
0
PPM1

c從一個文本文件薩法德

Textfile

我試圖創建一個C代碼,可以從文本文件上的圖像1創建ppm時,像像畫面3創建txt.ppm文件。有人可以幫忙的時候,那裏很棒。我是一個新的程序員,我試過做6小時的代碼。我試圖從文本文件中掃描數據,並將其放入數組中,並嘗試使用ppm,但我的代碼無法使用:/。

+0

如果你沒有發佈代碼,沒有人可以明顯地幫助你。 –

+0

我的代碼無法使用:/ – BossJer

回答

0

前進的道路是將任務分解成更小的子任務,分別解決和測試每個子任務,並且只有在他們全部工作後,纔將它們合併成一個程序。

因爲OP沒有發佈任何代碼,我也不會發布任何直接有用的代碼。如果OP由於嘗試後沒有獲得任何進展而真正被阻止,這實際上應該是實際使用。如果OP正在尋找某人做功課,這應該會讓他們非常惱火。兩者都適合我。 :)

第一個子任務是讀取數組中的輸入。網上有幾個例子,以及相關的問題。你會想把它放在一個單獨的函數中,所以稍後融入完整的項目會更容易。既然你是一個初學者程序員,你可以去這樣的函數

int read_numbers(double data[], int max); 

這樣,來電者聲明的數據點的最大數量,以及該函數返回讀取數據點的數量;或者如果發生錯誤則爲負數。用於測試的功能應該是微不足道的main(),說

#define MAX_NUMBERS 500 

int main(void) 
{ 
    double x[MAX_NUMBERS]; 
    int  i, n; 

    n = read_numbers(x, MAX_NUMBERS, stdin); 
    if (n <= 0) { 
     fprintf(stderr, "Error reading numbers from standard input.\n"); 
     return EXIT_FAILURE; 
    } 

    printf("Read %d numbers:\n", n); 
    for (i = 0; i < n; i++) 
     printf("%.6f\n", x[i]); 

    return EXIT_SUCCESS; 
} 

第二子任務是生成一個PPM圖像。 PPM實際上是一組緊密相關的圖像格式,也稱爲Netpbm format。示例圖像是位圖圖像 - 僅黑白;沒有顏色,沒有灰色 - 所以PBM格式(或PPM的變體)適用於此。

我懷疑使用一個二維數組來攻擊這個子任務是最容易的,這個數組的大小是可以生成的最大圖像的大小(即unsigned char bitmap[HEIGHT_MAX][WIDTH_MAX];),但是請注意,您也可以使用它的一部分。 (你也可以在沒有任何陣列的情況下即時生成圖像,但是這更容易出錯,並不像使用陣列來存儲圖像那樣普遍適用。)

您可能需要決定基於最大數據值的位圖寬度以及基於數據點數量的位圖高度。

對於測試,只需使用一些簡單的圖案填充陣列,或者可能只是從左上角到右下角的對角線。

然後,考慮寫一個函數,將矩形區域設置爲給定值(0或1)。根據圖像,您還需要一個繪製垂直虛線的函數,更改(異或)每個位的狀態。例如,

#define WIDTH_MAX 1024 
#define HEIGHT_MAX 768 

unsigned char bitmap[HEIGHT_MAX][WIDTH_MAX]; 
int   width = 0; 
int   height = 0; 

void write_pbm(FILE *out); /* Or perhaps (const char *filename)? */ 

void fill_rect(int x, int y, int w, int h, unsigned char v); 

void vline_xor(int x, int y, int h); 

在這一點上,你應該已經意識到write_pbm()功能,即節省了PBM圖像的一個,應該寫與第一次測試。然後,您可以使用fill_rect()函數來繪製填充的矩形,而且還可以將圖像(您要使用的數組的一部分)初始化爲背景顏色(0或1)。以上所有的三項功能都可以並且應該分開執行,這樣在任何時候都可以依靠您之前編寫的代碼正確並經過測試。這樣,您只需查看自上次成功測試以來編寫的代碼中的錯誤即可!這可能聽起來像是一個進展緩慢的方式,但事實證明它是獲得代碼工作的最快方式。您很快就會開始熱愛測試帶給您的信心,以及您只需要一次關注和擔心一件事情的事實。

第三個子任務是找出一種方法來繪製各種輸入的矩形和垂直虛線。

(I被騙一點,上方,並且包括在fill_rect()vline_xor()功能在前面的子任務,因爲我可以告訴那些需要繪製示例圖片。)

垂直虛線是最簡單的以後繪製,使用繪製垂直線的函數,使每個其他像素保持不變,但不影響每個其他像素。 (提示:for (y = y0; y < y0 + height; y += 2) bitmap[y][x] ^= 1;

這會留下填滿的矩形。它們的高度顯然是不變的,它們之間有一些垂直空間,它們從左邊緣開始;所以,唯一的事情就是計算每個矩形需要的寬度。 (並且,如上所述,整個位圖應該有多寬以及有多高;最大的數據值和數據值的數量決定了這些值)。

而不是寫入一個C源文件,並添加到它的每一步,我建議你爲每個子步驟編寫一個單獨的程序。也就是說,每次你得到一個子部分的工作後,你把它保存爲一個單獨的文件,並保留作爲參考 - 一個備份,如果你願意。如果你完全迷失了方向,或者決定解決某個問題的另一條路徑,那麼只需要回到最後的參考版本,而不是從頭開始。

這種工作流程被認爲是可靠,高效和可擴展的:上述方法的效果與項目規模無關。當然,有一些工具可以幫助我們以簡單,結構化的方式完成此任務(每個承諾 - 已完成的代碼單元,如果您願意的話)。和git是一個流行,免費,但非常強大的。如果您對此感興趣,只需在網上搜索git for beginners即可。

如果您不想閱讀上述所有文字,並掌握其描述的工作流程,那麼學習如何使用諸如git之類的工具來幫助您完成工作流程,將不會遇到太多問題。您還會喜歡make(以及包含make recipe的Makefiles)等多種打字工具,以及製作和維護不僅可以正常工作而且看起來專業的項目有多容易。但是,不要一下子把握所有這一切:一次只做一小步,並在繼續之前證實自己有一個堅實的基礎。那樣,當你跌倒時,你不會傷​​害自己;只是學習。

玩得開心!