我对用C编程非常陌生。我正在制作一个小程序来计算:
程序收到上面的一些字母,其中指示要执行哪个函数,以及它将在所述函数中工作的浮动列表:
float aritmetic(float datos[], int n)
float geometric(float datos[], int n)
float harmonic(float datos[], int n)主要职能如下:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n = argc-2;
float data[1];
char operation = *argv[1];
for(int j = 0;j < argc-2;j++){
data[j] = atof(argv[j+2]);
}
switch(operation)
{
case 'A':
printf("%f\n",aritmetic(data,n));
case 'G':
printf("%f\n",geometric(data,n));
case 'H':
printf("%f\n",harmonic(data,n));
default:
return 0;
}
}但是在切换中,它不识别任何字符,它总是把我发送到缺省子句,有人能引导我解决这个问题吗?
发布于 2022-09-26 06:24:36
我创建了这个最小的示例来验证您的描述。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n = argc-2;
if(argc < 2) return 1;
char operation = *argv[1];
switch(operation)
{
case 'A':
printf("a\n");
//break;
case 'G':
printf("g\n");
//break;
case 'H':
printf("h\n");
//break;
default:
return 0;
//break;
}
return 2;
}结果表明,如果输入以"A“开头,则开关不仅执行默认情况,而且执行所有情况。
这是因为您忽略了所需的break,我将其作为注释插入。
如果这不符合你的观察,问题很可能是由于行为不明确和缺乏合理性检查,如评论中所暗示的那样。
发布于 2022-09-26 08:06:54
代码中存在多个问题:
float data[1];中有一个错误,您应该定义一个长度为n的数组,而不是.此外,在定义
argc的值。switch语句中的printf()子句后面缺少break;语句。以下是修改后的版本:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
float arithmetic(float datos[], int n);
float geometric(float datos[], int n);
float harmonic(float datos[], int n);
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("missing arguments\n");
return 1;
}
char operation = *argv[1];
if (!operation || !strchr("AGH", operation)) {
printf("invalid operation: %c, expect A, G or H\n", operation);
return 1;
}
int n = argc - 2;
float data[n];
for (int i = 0; i < n; i++) {
char *p;
data[i] = strtof(argv[i + 2], &p);
if (p == argv[i + 2] || *p != '\0') {
printf("invalid number: %s\n", argv[i + 2]);
}
}
switch (operation) {
case 'A':
printf("%f\n", arithmetic(data, n));
break;
case 'G':
printf("%f\n", geometric(data, n));
break;
case 'H':
printf("%f\n", harmonic(data, n));
break;
}
return 0;
}发布于 2022-09-26 06:43:36
鉴于上述评论中指出的问题,并认识到将在眨眼之间处理一份简短的数字清单:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main( int argc, char *argv[] )
{
float data[ argc ]; // an unused float floating around
memset( data, 0, sizeof data );
for( int j = 1; j < argc; j++ )
data[ j - 1 ] = atof( argv[ j ] );
printf( "Arithmetic mean: %f\n", aritmetic( data, argc - 1 ) );
printf( "Geometric mean: %f\n", geometric( data, argc - 1 ) );
printf( "Harmonic mean: %f\n", harmonic( data, argc - 1 ) );
return 0;
}编辑:原谅我利用这个问题,并试图了解最后两项实际上是什么.(谢谢维基百科!)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main( int argc, char *argv[] )
{
if( argc < 2 ) return 1;
float sum = 0.0;
float sumrecip = 0.0;
float prod = 1.0;
int count = --argc;
while( argc ) {
float v = (float)atof( argv[ argc-- ] );
sum += v;
sumrecip += 1.0/v;
prod *= v;
}
printf( "Arithmetic mean: %f\n", sum/count );
printf( "Geometric mean: %f\n", (float) powf( prod, 1.0/count ) );
printf( "Harmonic mean: %f\n", count/sumrecip );
return 0;
}用于命令./a.out 1 4 4
Arithmetic mean: 3.000000
Geometric mean: 2.519842
Harmonic mean: 2.000000当然可以。一眨眼就搞定了。
人生的教训:不要去寻找困惑。它会找到你的。
(我真的希望这个答案是正确的.)
https://stackoverflow.com/questions/73850098
复制相似问题