2011-11-07 193 views
0

我仍然是C編程的初學者,我需要一點幫助,爲我的C編程類 編寫代碼。 提示符爲: 該程序的輸入是位於名爲textfile94的文件中的浮點數據的二維數組。輸入數組將包含3行數據,每行包含5列數據,每行包含 行。如何創建二維數組

  • 我希望你使用動態內存分配的雙下標方法。
  • 使用malloc創建一個包含指針的數組。
  • 該數組的每個元素指向另一個數組,即數據行 。
  • 在循環中使用malloc來創建行。
  • 然後,您可以使用兩個下標運算符[r] [c]來獲取您的數據 以執行程序調用的求和和求平均值。

該程序調用硬編碼的二維數組的高度和寬度,事先已知(3x5,實際)。而不是在代碼中寫入字面數字,我希望您創建一個全局常量變量來保存這些維度,並在您的代碼中使用這些維度。

這裏是我到目前爲止(我不知道,如果它的正確):

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

#define int rows = 3; 
#define int columns = 5; 

float array[rows][columns]; 

int main(int argc, char* argv[]){ 
FILE* fin; 
float x; 
int i,j; 
int* array; 

fin = fopen("textfile94", "r"); 
fscanf("%f", &x); 
array = (int*) malloc(rows*sizeof(int*)); 

for(i=0;i<rows;i++){ 
    for(j=0;j<columns;j++) 
    array[i]=(int*) malloc(columns* sizeof(int)); 
} 
    } 
printf("The Average values for the three rows are:%f",array[rows]); 
printf("The Average values for the five columns are:%f", array[columns]); 

return 0; 
} 
+1

你不需要分別分配每個整數。你可以一次分配它們,例如:'int * array; array = malloc(x * sizeof(int));',然後使用'array [i]'來訪問每個位置。 – jweyrich

+0

如何在malloc之前不需要int *?我不是用它作爲指針嗎?這也是我的老師對這個問題的看法:我希望你使用動態內存分配的雙下標方法。使用malloc創建一個包含指針的數組。該數組的每個元素指向另一個數組,即數據行。在循環中使用malloc來創建行。然後,您可以使用兩個下標運算符[r] [c]來獲取您的數據以進行程序調用的求和和求平均值。 – Cka91405

+0

請閱讀[c-Faq鏈接](http:// c- faq.com/~scs/cclass/int/sx9b.html)我之前在我的評論中提供了你,它詳細解釋了這一點。 –

回答

1

既然你已經知道數組(3×5)的尺寸,你不必使用動態分配它malloc()
你有什麼是正確的(但你應該讓本地而不是全局):

float array[3][5]; 

這已分配足夠的內存來容納所有的數組元素。

而且你的要求中規定:

I want you to create a global constant variable to hold those dimensions, and use those in your code.

這意味着你需要聲明的常數來表示數組元素,是這樣的:

const int rows = 3; 
const int columns = 5; 

float array[rows][columns]; 

編輯:

從您的意見,我相信你正在使用c89(或更早版本)。在c99可變長度數組(在0129上查找VLA如果你不知道這一點)是允許的,這意味着上面會編譯。但在c98 VLA中是不允許的。 C89和更早版本需要使用編譯時常量表達式來維護數組。因此,您需要使用編譯時常量表達式(其中,常量限定變量不在C中)。所以你需要使用:

#define ROWS 3 
#define COLUMNS 5 

float array[ROWS][COLUMNS]; 
+0

我明白,我認爲這一部分是同樣的事情,但我的老師希望它是全球性和動態分配,我不知道如果我做得對。 – Cka91405

+0

@ Cka91405:它適合你嗎?分配部分是正確的。 –

+0

哦,好吧,我開始明白你說的常數的含義,我不確定這是否正確。但我會嘗試。 – Cka91405