首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在swich-case中的比较不能给出正确的值。

在swich-case中的比较不能给出正确的值。
EN

Stack Overflow用户
提问于 2022-09-26 06:00:12
回答 3查看 83关注 0票数 1

我对用C编程非常陌生。我正在制作一个小程序来计算:

  • 算术平均(A)
  • 几何平均(H)

程序收到上面的一些字母,其中指示要执行哪个函数,以及它将在所述函数中工作的浮动列表:

代码语言:javascript
复制
float aritmetic(float datos[], int n)
float geometric(float datos[], int n)
float harmonic(float datos[], int n)

主要职能如下:

代码语言:javascript
复制
#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;
    }

}

但是在切换中,它不识别任何字符,它总是把我发送到缺省子句,有人能引导我解决这个问题吗?

EN

回答 3

Stack Overflow用户

发布于 2022-09-26 06:24:36

我创建了这个最小的示例来验证您的描述。

代码语言:javascript
复制
#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,我将其作为注释插入。

如果这不符合你的观察,问题很可能是由于行为不明确和缺乏合理性检查,如评论中所暗示的那样。

票数 4
EN

Stack Overflow用户

发布于 2022-09-26 08:06:54

代码中存在多个问题:

  • float data[1];中有一个错误,您应该定义一个长度为n的数组,而不是.

此外,在定义

  • 之前,您应该测试argc的值。

  • switch语句中的printf()子句后面缺少break;语句。

以下是修改后的版本:

代码语言:javascript
复制
#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;
}
票数 3
EN

Stack Overflow用户

发布于 2022-09-26 06:43:36

鉴于上述评论中指出的问题,并认识到将在眨眼之间处理一份简短的数字清单:

代码语言:javascript
复制
#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;
}

编辑:原谅我利用这个问题,并试图了解最后两项实际上是什么.(谢谢维基百科!)

代码语言:javascript
复制
#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

代码语言:javascript
复制
Arithmetic mean: 3.000000
Geometric mean: 2.519842
Harmonic mean: 2.000000

当然可以。一眨眼就搞定了。

人生的教训:不要去寻找困惑。它会找到你的。

(我真的希望这个答案是正确的.)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73850098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档