我在OSX 10.11上用C编写一对函数来计算极坐标形式的相量之和的大小和角度,我遇到了一些麻烦。我有两个主要问题:
1)如何将两个数组作为输入(我要求的相量的大小和角度)给终端中的函数?
2)如果C强制使用main,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);
}
答案 0 :(得分:1)
你从命令行参数(argv [i]中的东西)获得的是字符串(char *)。你必须自己在C中解析这些浮动。
如果你想让你的程序将两个数组作为两个独立的输入,你可以像这样指定
./yourprogram '1.0 2.0 3.0 4.0' '5.0 6.0 7.2 8.1'
请注意两个数字数组周围的引号,这对shell来说是很重要的,因为它们将这两个参数传递给程序,而不是8个单独的浮点数。
您必须手动解析每个字符串中的浮点数,拆分空格字符,并使用scanf
或atof
之类的函数来解析浮点数字符串的一部分。
或者,您可以将命令行界面指定为
./yourprogram 5 a1 a2 a3 a4 a5 b1 b2 b3 b4 b5
然后在你的程序中运行argv中的10个浮点值。有很多方法可以做到这一点。我个人会以{&#34}的格式读取stdin
的程序;第一行包含数组N的大小,下一行包含N个浮点值coeff&#39; s,下一行包含N角度的浮点值。然后,您可以更轻松地拥有其他程序来为此程序生成输入。
HTH,
答案 1 :(得分:0)
命令行参数作为指向&#34;字符串&#34;的指针数组传递,实际上为const char* argv[]
。所以你得到的总是一个字符串数组,从来没有一个甚至两个别的数组,也不是浮点数。
我认为你有三个选择:
coef
或angle
之后围绕"
和'
个参数,从而
将列表字符串分别打包成一个字符串我在这里只提出选项3;如果您更喜欢其他的,请不要犹豫要求提示或只是搜索网页;
选项3依赖于偶数量的参数,前半部分表示coefs,后半部分表示角度。请按以下方式调用:
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;
}