【问题标题】:If statement ignoring zero?如果语句忽略零?
【发布时间】:2015-07-01 17:11:43
【问题描述】:

该程序读取两个文件并将它们存储在两个数组中。 array1 是数据,array2 是与之对应的类型。 ex array1: 183, 183, 182, 195.3, 187 array2: 1, 1, 1, 2, 2 它将array1中的重复数字设置为0,并将array2中的相应数字设置为零。例如:array1: 0, 0, 182, 195.3, 187 array2: 0, 0, 1, 2, 2 然后它应该忽略 for 循环中的零并计算所有相同类型的数字的总和。例如:(出于某种原因称为均值)mean[2] = 195.3 + 187 它似乎忽略了至少一个 if 语句 > .5 并在遇到零时转到 else 语句。有任何想法吗?

文件中的示例数据(不是完整的数据),一旦它看到 182.6000061 彼此相邻,它会将它们设置为零和 array2 中的相应数字,但它会忽略其中一个 if 语句并转到 else 语句.输出为 2822.799、881.400、1997.8 等。其中第一个值应该更接近 6000。

输入数据到array1:182.6000061 183 182.6000061 182 177.8000031 183.3999939 183 180.6000061 147.6000061 166.6000061 168 182 181.6000061 164.1999969 180.3999939 177.3999939 177.6000061 182.6000061 182.6000061 181.6000061 179.8000031 160 177.3999939 181.3999939 183.1999969 183.1999969 182.8000031 181.3999939 179.6000061 182.1999969 183.8000031 176.8000031

输入数据到array2:2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2912 2979 2979 2979 2979 2979 2979 2979 2979 2979

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    float array1[1000] = {0}, array2[1000] = {0}, mean[1000] = {0}, average[1000] = {0}, counter[1000] = {0}, range[1000] = {0}, upper[1000] = {0}, lower[1000] = {0};
    int a, h, i, r, j = 0, pos, found = 0, extrinsic[1000] = {0};
    int b=0;
    int linect = 1;
    char buf[128];

    i = 0;
    j = 0;
    fp = fopen("data.txt", "r");

    if(fp == NULL)
    {
        puts("Cannot open file for reading");
        scanf("%d", &a);
        exit(EXIT_FAILURE);
    }

    while( linect < 1000 ) 
    {
        fgets(buf, sizeof(buf), fp);
        sscanf(buf, "%f", &array1[i]);
        //printf("Set %d - 1st: %f\n", linect, array1[i]);
        linect++;
        i++;
    }
    fclose(fp);


    linect = 0; //reads lot data file and puts it in array2
    i = 0;
    fp = fopen("lot_numbers.txt", "r");
    if(fp == NULL)
    {
        puts("Cannot open file for reading");
        scanf("%d", &a);
        exit(EXIT_FAILURE);
    }
    while( linect < 1000 ) 
    {
        fgets(buf, sizeof(buf), fp);
        sscanf(buf, "%f", &array2[i]);
        // printf("Set %d - 1st: %f\n", linect, array2[i]);
        linect++;
        i++;
    }


    for (i = 0; i < 999; i++) //searches array sets repeated points to zero
    {
        if (array1[i] == array1[i+1])
        {
            array1[i] = 0;
            array2[i] = 0;
        }
    }
    for (i = 0; i < 99; i++)   //searches array
    {
        if (array2[i] > .5 && array2[i] < 50000)
        {
            if (array2[i] == array2[i+1])
            {
                if (array1[i] > .5 && array1[i] < 500){  //ignores zeros and junk data 
                    mean[j] = mean[j] + array1[i];
                    counter[j]= counter[j] + 1;
                }
            }
            else {
                average[j] = mean[j]/counter[j];
                range[j] = average[j] * 0.1;
                upper[j] = average[j] + range[j];
                lower[j] = average[j] - range[j];
                j++;
            }
        }
    }
    j = 0;
    while (j <10){
        printf("\n%f", mean[j]);
        j++;
    }
    scanf("%d", &a);

    return 0;
}

【问题讨论】:

  • 用几个宏替换magic numbers。到时候你很可能会看到你的问题。
  • 请发布示例输入、预期输出和实际输出。
  • 更新了部分输入

标签: c arrays loops for-loop


【解决方案1】:

为什么你的程序中有两个不同的循环?第一个循环 999 次,其他循环 99 次。

for (i = 0; i < 999; i++)

for (i = 0; i < 99; i++)

【讨论】:

  • 两者都应该是 999 或者我应该将其更改为 linect 变量,但不幸的是不会影响我遇到的问题。
【解决方案2】:

一旦它看到 182.6000061 彼此相邻,就会将它们设置为零,并在 array2 中设置相应的数字

不!它将其中的第一个设置为 0 和 array2 中的对应一个。
也许你需要

        if (array1[i] == array1[i+1])
        {
            array1[i] = array1[i + 1] = 0;
            array2[i] = array2[i + 1] = 0;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2015-07-11
    • 2015-11-27
    相关资源
    最近更新 更多