【问题标题】:Write a program which places user's input in a float array until user inserts 0编写一个程序,将用户的输入放在一个浮点数组中,直到用户插入 0
【发布时间】:2018-09-09 00:44:09
【问题描述】:

目前我正在做一个学术任务,这似乎非常简单和基本,但不幸的是我不知道为什么我会收到这个奇怪的输出。

这个想法是这样的:要求用户输入一些浮点数,这些浮点数被保存到名为T[N]的浮点数组中。现在,当用户点击0 并输入时,while() 循环停止,程序应该计算已插入数字的总和和平均值,但是因为我使用了 size 控制变量,它会执行它仅对最后输入的元素,其索引等于size - 1,由于索引thingy。出于 I/O 控制的目的,我想检查输入的数字是否与屏幕上出现的带有 printf() 的数字相同,但是我从插入的 N 中只得到 2 参数(它总是 @987654331 @ 和 4th),当然 sumavg 之后会被严重扭曲。有什么想法吗?

这是一个基本代码:

int sum(const float * tab, unsigned int size, float *result) {
    unsigned int i = 0;
    for (i = 0; i < size; i++) {
        *result += *tab;
    }
    return 1;
}

int avg(const float* tab, unsigned int size, float *result) {
    sum(tab, size, result);
    *result = *result / size - 1;
    return 1;
}

int main() {
    unsigned int size = 1, i;
    float T[N], val = 0, wynik;
    float *result = &wynik, *tab = T;
    while (scanf("%f", &val) == 1 && val != 0) {
        if (scanf("%f", &val) == 0) {
            printf("Wprowadzono niepoprawny znak. Koczenie...\n");
            return 0;
        }
        else if (val == 0) {
            break;
        }
        else {
            *tab = val;
            tab++;
            size++;
        }
    }
    tab = T;
    for (i = 0; i < size - 1; i++) {
        printf("%.2lf ", *tab);
        tab++;
    }
    tab = T;
    sum(tab, size, result);
    printf("\nSuma elementow tablicy T[%u]: %lf\n", size - 1, *result);
    avg(tab, size, result);
    printf("Srednia elementow tablicy T[%u]: %f\n", size - 1, *result);
    /*if (scanf("%f", &val) == 0) {
        printf("Wprowadzono niepoprawny znak. Konczenie...\n)";
    }
    else if (val == 0) {
        break;
    }*/
    getch();
    return 1;
}

这就是程序从用户输入中读取 0 时实际发生的情况:

编辑。不要介意这种 %.lf 和 %.f 数据类型,我只是没有替换它,反正最终结果是一样的。

【问题讨论】:

  • "静态浮点数组" ???你的数组不是静态的......只是说“浮点数组”,该死你的代码很丑。
  • 静态我的意思是:#define N 100 ... float T[N];你现在明白了吗?
  • “N在开头定义为100”。不要在叙述中说出来,发布显示问题的Minimal, Complete, and Verifiable example。在问题中将输入、预期输出和实际输出显示为 text
  • @TheInvisibleMan:这个英文单词“static”的用法没问题,但static在C语言中有特定的含义,所以在讨论时应避免使用具有一般英文含义的“static” C 除非你确保上下文清楚。
  • 我建议你把作业分成几部分,一次做一个部分。首先,编写一个读取数字并在输入零时停止的程序。只需在读取时打印每个数字。当它工作时,修改程序以将所有数字记录在一个数组中,然后在最后打印它们。当它工作时,修改程序以添加数字并打印总和。当它起作用时,修改程序以计算平均值。

标签: c arrays function loops pointers


【解决方案1】:
int sum(const float * tab, unsigned int size, float *result) {
    unsigned int i = 0;
    for (i = 0; i < size; i++) {
        *result += *tab;
    }
    return 1;
}

这会将*tab 添加到*result size 次。它永远不会改变tab 指向的位置,因此它会重复添加相同的内容。

此外,它不会为*result 分配初始值。参数result 是从avg 传递的,它从main 接收它,它指向wynik,但wynik 也从未分配过初始值。因此,此代码会将*tab 添加到初始值未知的内容中。因此最终结果未知。

int avg(const float* tab, unsigned int size, float *result) {
    sum(tab, size, result);
    *result = *result / size - 1;
    return 1;
}

在调用sum 之后,这会将*result 除以size,然后再减一。这不计算平均值。也许您打算除以size - 1。如果有 size - 1 事物,这将计算平均值。

int main() {
    unsigned int size = 1, i;
    float T[N], val = 0, wynik;

wynik 从未被赋值。

    float *result = &wynik, *tab = T;
    while (scanf("%f", &val) == 1 && val != 0) {
        if (scanf("%f", &val) == 0) {
            printf("Wprowadzono niepoprawny znak. Koczenie...\n");
            return 0;

这会扫描两个数字,一个用于第一个 scanf,另一个用于第二个。我怀疑你只是想扫描一个。

        }
        else if (val == 0) {
            break;
        }
        else {
            *tab = val;
            tab++;
            size++;
        }
    }
    tab = T;
    for (i = 0; i < size - 1; i++) {
        printf("%.2lf ", *tab);
        tab++;
    }
    tab = T;
    sum(tab, size, result);

您只读取了size - 1 数字(不包括结束输入的零),但sum 添加了size 次。

    printf("\nSuma elementow tablicy T[%u]: %lf\n", size - 1, *result);
    avg(tab, size, result);

*resultsum 中被修改(但从未分配初始值),现在在avg 中再次修改(当它再次调用sum 时)没有被重置。也许您想在sum 启动时将*result 设置为零。

    printf("Srednia elementow tablicy T[%u]: %f\n", size - 1, *result);
    /*if (scanf("%f", &val) == 0) {
        printf("Wprowadzono niepoprawny znak. Konczenie...\n)";
    }
    else if (val == 0) {
        break;

我停止跟踪控制流。您正在测试 scanfval 太多次。解决方案比您的程序更简单。

    }*/
    getch();
    return 1;
}

【讨论】:

    【解决方案2】:

    你可以大大简化你的代码,例如你错过了很多 C 概念的理解:

    for (i = 0; i < size; i++) {
        *result += *tab;
    }
    

    这里tab 永远不会改变所以*tab 总是相同的数字,增加i 什么都不做。你应该使用*result = tab[i]

    unsigned int size = 1, i;
    

    你为什么从 1 开始?只需从零开始,这会更简单,为什么使用 unsigned int 而不是 size_t ?为什么要逐行声明多个变量,这会使代码难以阅读?

    tab = T;
    for (i = 0; i < size - 1; i++) {
        printf("%.2lf ", *tab);
        tab++;
    }
    

    同样,您可以将itab[i] 一起使用。顺便说一句,与零比较来停止程序不是一个好习惯,但你要求它......

    嗯,你需要更多的 C 培训,这里有一个代码示例来帮助你:

    #include <stdio.h>
    #include <stdbool.h>
    #define N 100
    
    static bool sum(const float *numbers, size_t size, float *result) {
        *result = 0;
        for (size_t i = 0; i < size; i++) {
            *result += numbers[i];
        }
        return false;
    }
    
    static bool avg(const float *numbers, size_t size, float *result) {
        if (size == 0) {
            return true;
        }
        if (sum(numbers, size, result)) {
            return true;
        }
        *result = *result / size;
        return false;
    }
    
    int main(void) {
        float numbers[N];
        size_t size = 0;
        while (size < N && scanf("%f", numbers + size) == 1 && numbers[size] != 0) {
            size++;
        }
        for (size_t i = 0; i < size; i++) {
            printf("%.2f ", numbers[i]);
        }
        float result;
        sum(numbers, size, &result);
        printf("\nSuma elementow tablicy T[%zu]: %f\n", size, result);
        avg(numbers, size, &result);
        printf("Srednia elementow tablicy T[%zu]: %f\n", size, result);
    }
    

    【讨论】:

      【解决方案3】:

      你的事情过于复杂。

      功能:

      int sum(const float * tab, unsigned int size, float *result);
      int avg(const float* tab, unsigned int size, float *result);
      

      期望第三个参数为浮点指针。将指针传递给wynik

      sum(tab, size, &wynik);
      avg(tab, size, &wynik);
      

      程序:

      #include <stdio.h>
      
      int sum(const float * tab, unsigned int size, float *result) {
          unsigned int i = 0;
      
          for (i = 0; i < size; i++) {
              *result += *(tab+i);
          }
          return 1;
      }
      
      int avg(const float* tab, unsigned int size, float *result) {
      
          sum(tab, size, result);
          *result = *result / size - 1;
          return 1;
      }
      
      #define N 10
      
      int main() {
          unsigned int size = 1, i;
          float T[N], val = 0, wynik=0;
      
          float *result = &wynik, *tab = T;
      
          while (scanf("%f", &val) == 1 && val != 0) {
              if (scanf("%f", &val) == 0) {
                  printf("Wprowadzono niepoprawny znak. Koczenie...\n");
                  return 0;
              }
              else if (val == 0) {
                  break;
              }
              else {
                  *tab = val;
                  tab++;
                  size++;
              }
          }
      
          tab = T;
          for (i = 0; i < size - 1; i++) {
              printf("%.2lf ", *tab);
              tab++;
          }
      
          tab = T;
          sum(tab, size, &wynik);
          printf("\nSuma elementow tablicy T[%u]: %f\n", size - 1, wynik);
      
          avg(tab, size, &wynik);
          printf("Srednia elementow tablicy T[%u]: %f\n", size - 1, wynik);
          /*if (scanf("%f", &val) == 0) {
              printf("Wprowadzono niepoprawny znak. Konczenie...\n)";
          }
          else if (val == 0) {
              break;
          }*/
          getch();
          return 1;
      }
      

      输出:

      0
      1                                                                                                                                            
      2                                                                                                                                            
      3                                                                                                                                            
      4                                                                                                                                            
      5                                                                                                                                            
      0                                                                                                                                            
      2.00 4.00                                                                                                                                    
      Suma elementow tablicy T[2]: 6.000000                                                                                                        
      Srednia elementow tablicy T[2]: 3.000000  
      

      【讨论】:

      • 您在avg 中留下了一个电话[OP 的电话] 给sum,所以sum 被[不必要地] 调用,结果被丢弃
      • @CraigEstey 感谢您的评论。是的,你完全正确!我没有调试整个算法,把它留给 OP...
      【解决方案4】:

      我自己设法解决了问题,因为你们都没有提到核心问题。

      1) 我改变了部分:

      while (scanf("%f", &val) == 1 && val != 0) {
      if (scanf("%f", &val) == 0) {
          printf("Wprowadzono niepoprawny znak. Koczenie...\n");
          return 0;
      }
      else if (val == 0) {
          break;
      }
      else {
          *tab = val;
          tab++;
          size++;
      }
      

      }

      到:

          while (scanf("%f", &val) == 1 && val != 0) {
          *tab = val;
          tab++;
          size++;
          fflush(stdin);
      }
      

      2) 我只在 int sum() 中添加了这部分 tab++;,所以现在看起来像这样:

      int sum(const float * tab, unsigned int size, float *result) {
      unsigned int i = 0;
      for (i = 0; i < size; i++) {
          *result += *tab;
          tab++;
      }
      return 1;
      

      }

      3) 在 int avg() 里面我只剩下这个:

      *result = *result / size;
      

      不管怎样,谢谢你的回复。

      证据:

      #1

      #2

      #3.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 2010-11-27
        • 2022-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多