2016-02-06 90 views
0

好的,所以我對這個網站的編程和發佈都很陌生,我的問題有點複雜,但我會試圖闡明我的情況。我試圖編寫一個代碼來讀取一個未知大小的文件(極座標列表),將這些值存儲在一個數組中,然後執行一次轉換並轉換出一個包含轉換數據的新數組(技術上我正在使用這個新的數組在預先設計的函數中用C++繪製數據圖表,但這並不重要,因爲它是賦值的一部分,當然不是錯誤的根源)。在陣列上執行操作

我有兩個主要問題,其中第一個是可變數組大小。在下面的代碼中,你可以看到我的x和y數組沒有約束,所以即使r [40]之後r []中沒有任何內容,循環繼續將值轉換爲x [999]。我可以限制我的r和theta數組的大小,因爲我可以在fscanf函數到達文件末尾時停止讀取值,但我不知道我的x和y數組的類比。 (另外,如果有人能夠解釋爲什麼我的角色數組沒有這個問題,即使它被定義爲多達128個字符,我也會非常感激)轉換不完全匹配。所以當我打印轉換後的值時,函數會正確轉換它們,但將從r [i]和theta [i]轉換的值存儲到x [i + 1]和y [i + 1]。我真的不知道是什麼導致了這個問題。

我當然希望我的問題有道理。任何幫助,將不勝感激!如果有什麼不清楚的地方,請讓我知道,我會盡力解釋。謝謝!

#include <stdio.h> 
#include <math.h> 
#define ARRAYSIZE 1000 
#define FILENAMESIZE 128 

float convertx(float r[], float theta[], int numPoints); 
float converty(float r[], float theta[], int numPoints); 

int cmain() { 
    int i; 
    float r[ARRAYSIZE], theta[ARRAYSIZE], x[ARRAYSIZE], y[ARRAYSIZE]; 
    char filename[FILENAMESIZE]; 

FILE *InputFile; 

printf("Type the data file name: "); 
scanf("%s", filename); 


InputFile = fopen(filename,"r"); 

if(InputFile == NULL){ 
    printf("Error, could not open file: %s.\n",filename); 
    return 1; 
} 

for(i=0; i < ARRAYSIZE; i++){ 
    if(fscanf(InputFile,"%f %f", &r[i], &theta[i]) == EOF) break; 
    printf("Value %d is %f\n",i+1,r[i]); 
} 

fclose(InputFile); 

for(i=0; i < ARRAYSIZE; i++){ 
    x[i] = convertx(r,theta,i); 
    printf("Value %d is %f\n",i+1,x[i]); 
} 

for(i=0; i < ARRAYSIZE; i++){ 
    y[i] = converty(r,theta,i); 
} 

return 0; 
} 

float convertx(float r[], float theta[], int numPoints){ 
    int i; 
    float x; 
    for(i=0; i < numPoints; i++) 
     x = r[i]*cos(theta[i]); 
    return x; 
} 

float converty(float r[], float theta[], int numPoints){ 
    int i; 
    float y; 
    for(i=0; i < numPoints; i++) 
     y = r[i]*sin(theta[i]); 
    return y; 
} 

編輯:請求是輸入文件的片段。以下是前幾站(有文件中沒有逗號,只是空白不幸的是,這個網站我格式化的技能太可怕了):

60,3.9269875

60,0.7853975

0, 0

1,0.25

2,0.5

+0

你可以給你正在閱讀的輸入文件的片段? – tokamak

+0

在你的convertx和converty函數中,你爲什麼要有for循環?只返回計算的x或y的最後一個值,因此您正在計算從i = 0到i =(numPoints-2)的數據正在被丟棄。 – tokamak

回答

0

關於第一個問題,即你的for循環對於r和θ在端部停止的原因的文件是因爲你有一個break;當你檢測EOF時退出for-loop。你的x和y for循環中沒有這個。

爲了解決這個問題,而不是使用你的ARRAYSIZE常量,編輯:{將最終i值保存在你的r和theta for-loops中,它將是行數或+1,並且用於結束在你的x和y for循環中的值。就像這樣:

for(i=0; i < ARRAYSIZE; i++){ 
    if(fscanf(InputFile,"%f %f", &r[i], &theta[i]) == EOF) { 
     int final = i; 
     break; 
    } 
    printf("Value %d is %f\n",i+1,r[i]); 
} 

fclose(InputFile); 

for(i=0; i < final; i++){ 
    x[i] = convertx(r,theta,i); 
    printf("Value %d is %f\n",i+1,x[i]); 
} 

我以前說過,你可以使用數組的大小對R或θ:for (i=0; i < r.size(); i++) {,但既然你初始化它的長度爲1000,將無法正常工作。 }

對於你的第二個問題:我想如果你擺脫了你的convertx和converty函數中的for循環,那將解決問題。這是因爲只返回計算的x或y的最後一個值,所以從i = 0到i =(numPoints-2)的計算將被丟棄。

+0

所以使用「r.size()」只會導致程序存儲更多的x值(高達4000!我的示例文件只有40)。但是,在將它重新初始化爲0之前,我將它存儲爲一個名爲numData的虛擬變量。使用這個,我能夠在數組x中獲得正確數量的點。 但是,刪除for循環只會搞亂程序。 x或y的最後一個值由函數返回true,但在重新執行之前,它將被存儲(通過循環)到數組「x」中。這通過打印my x數組的值來驗證:除了x [0] = 0和x [n] = r [n + 1],所有內容都可以完美轉換。 – Wayfinder

+0

對於第二期,你是否設置'我= numPoints';'在你的轉換功能? – tokamak

+0

不,也許這是我困惑的地方。我知道numPoints是一個虛擬變量。它從來沒有定義過,但它仍然以某種方式用於約束轉換函數中的i(它是從一些示例代碼中複製而來的,雖然執行的操作不需要將結果重新輸出到數組中)。我很抱歉,如果這沒有意義,但基本上「其他人做了它,它的工作,所以我只是複製它。」我完全理解,如果我只是需要看看我的教授爲什麼工作哈哈。 – Wayfinder