2017-03-12 103 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; 
} 
相关问题