2017-03-12 39 views
0

我在OSX 10.11上編寫了一對C函數來計算極座標形式的矢量和的大小和角度,我遇到了一些麻煩。我有兩個主要問題:如何將數組輸入到Mac終端上的C程序?

1)我如何給兩個數組作爲輸入(我想求和的大小和角度的相量)到終端的功能?

2)我如何做到這一點,而強迫C有一個主,ARGC和ARGV?

下面是代碼:

float PhasMag(float *coef,float *angle); 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
int main(int argc, char *argv) 
{ 
    if(argc != 2){ 
     printf("Incorrect number of arguments, please input an array of magnitudes and an array of angles, exiting\n"); 
     return -1; 
    } 
    return PhasMag(argv[1],argv[2]); 
} 

float PhasMag(float *coef,float *angle) 
{ 
    float R = 0,Im = 0, Mag; //real and imag. parts of answer 
    float *countM; 
    int sc = 0 ,sa; 
    countM = coef; 
    while(countM != NULL){ 
     countM = countM + 1; 
     sc = sc + 1; 
    } 
    sa = sc; 
    for(int i = 0;i<sc;i++){//computes real part 
     coef = coef + i; angle = angle + i; 
     R = R + (*coef)*cos(*angle); 
    } 
    coef = coef - sc + 1; angle = angle - sa + 1; 
    for(int k = 0;k<sa;k++){//computes imaginary part 
     coef = coef + k; angle = angle + k; 
     Im = Im + (*coef)*sin(*angle); 
    } 
    return sqrt(R*R+Im*Im); 
} 
+1

的argv是一個字符串數組 - 你不能只是奇蹟般地投這些字符串花車 –

+0

的陣列有多少,你呢?你可以把它們放在一個文件中,如果你有很多,然後把文件名作爲參數。 –

回答

1

你在命令行參數得到(東西argv中[1])什麼是字符串(字符*)。你將不得不解析這些爲漂浮在自己C.

如果你想有你的程序需要兩個數組作爲兩個獨立的輸入,你可以在兩個像這樣在一旁

./yourprogram '1.0 2.0 3.0 4.0' '5.0 6.0 7.2 8.1' 

注指定它的報價數組數組,這對於shell將這些作爲兩個參數傳遞給您的程序非常重要,而不是8個單獨的浮點數。

您必須手動解析每個字符串中的浮點數,分割空格字符,並使用像scanfatof這樣的函數從字符串的某些部分解析浮點數。

另外,您可以指定命令行界面是

./yourprogram 5 a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 

然後在你的程序通過argv中的10個浮點值運行。有很多方法可以做到這一點。我會親自從stdin中讀取程序,格式如「第一行包含數組N的大小,下一行包含N個浮點值coeff,並且下一行包含N個角度的浮點值。有產生輸入該程序,例如其他程序。

HTH,

0

命令行參數爲指針,以「串」的數組過去了,居然const char* argv[]。那麼你得到的始終是一個數組字符串,從來沒有一個或甚至兩個數組的其他東西,也不是一個浮動。

我認爲你有三個選擇:

  1. 通過"',從而 環繞coefangle參數裝箱清單字符串合併爲一個字符串,分別爲
  2. 沒有通過coefs和角度作爲參數,但它們存儲在一個文件 和傳遞文件名作爲參數,或
  3. 將參數列表(參數)分成兩組,coefs和角度,並將它們解析爲浮點數。

我只是在這裏介紹選項3;如果你更喜歡其他的,不要猶豫,要求得到一個提示或簡單地搜索網絡;

選項3依賴偶數量的參數,第一半表示係數,第二半表示角度。說它如下:

myprg 1.0 2.0 43.0 180.0 
--> 0: 1.000000/43.000000 1: 2.000000/180.000000 
myprg 
--> Error: please pass float values (an even amount) as parameters 
myprg 1.0 2.0 43.0 
--> Error: please pass float values (an even amount) as parameters 
myprg 1.0 2.0 43.0 foo 
--> Error parsing parameters; foo is not a valid float value 

而這裏的代碼:

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

float PhasMag(float *coef,float *angle, int n) { 

    // your actual code goes here... 
    for (int i=0; i<n; i++) { 
     printf("%d: %f/%f\n",i, coef[i], angle[i]); 
    } 
    return 0.0; 
} 

int scanParams(float* result, int amount, const char* params[]) { 
    for (int i=0; i<amount; i++) { 
     if (sscanf(params[i], "%f", result) != 1) { 
      printf("Error parsing parameters; %s is not a valid float value", params[i]); 
      return 0; 
     } 
     result++; 
    } 
    return 1; 
} 


int main(int argc, const char *argv[]) 
{ 

    int nrOfArguments = argc -1; 
    if (nrOfArguments %2 > 0 || nrOfArguments == 0) { 
     printf("Error: please pass float values (an even amount) as parameters"); 
     return 1; 
    } 

    int sizeOfArray = nrOfArguments/2; 
    float coef[sizeOfArray]; 
    if (!scanParams(coef,sizeOfArray, argv+1)) 
     return 1; 

    float angle[sizeOfArray]; 
    if (!scanParams(angle,sizeOfArray, argv+1+sizeOfArray)) 
     return 1; 

    PhasMag(coef,angle,sizeOfArray); 

    return 0; 
} 
相關問題