计划在五年内回归五个城市的温度

时间:2018-02-25 09:55:16

标签: c

我正在写一个C程序,旨在恢复五个城市的温度,我很困惑。 我创建了一个for循环来遍历我创建的城市数组,另一个循环遍历另一个温度数组 这是代码:

// program to accept yearly temperature and display the max and minumum temp of five cities
#include <stdio.h>
int main() {
    //prompt user for yearly temperature of the five cities

    char cities[5][20];
    float temps[25];
    int i = 0;
    printf("Please enter the yearly temperature of the five cities\n");
    for (i; i <= 4; i++) {
      printf("Enter city %d \n", i + 1);
      scanf("%s", & cities[i]);

      for (i; i <= 4; i++) {
        printf("Enter temperatures for city %d\n", i + 1);

        for (i; i <= 24; i++) {
          printf("For year %d\n", i + 1);

          scanf("%f", & temps[i]);
          if (i == 5) {
            continue;
          }
        }
      }
    }
    return 0;
}

我遇到的问题是,当我运行代码时,如果i = 5,而不是第三个循环继续运行,它就会继续。 这是一个截图。 page1 page2

所以你可以看到代码一直运行到二十五,然后才结束。 如果有人告诉我我做错了什么会有所帮助。 感谢。

2 个答案:

答案 0 :(得分:2)

我认为这就是你的目标

main()
{
    //prompt user for yearly temperature of the five cities
    const int numYears = 5;
    char cities[5][20];
    float temps[25];
    int i;

    printf("Please enter the yearly temperature of the five cities\n");
    for (i = 0; i <= 4; i++)
    {
        printf("Enter city %d \n", i + 1);
        scanf("%s", &cities[i]);

        printf("Enter temperatures for city %d\n", i + 1);

        for (int j = (i * numYears); j < (i * numYears) + numYears; j++)
        {
            printf("For year %d\n", (j % numYears)  + 1);

            scanf("%f", &temps[j]);
        }
    }
    return 0;
}

每个城市输入5个城市和5个临时值,以25个整数的数组存储5 * 5个总温度

所以我解决了一些问题。您为所有循环重复使用相同的循环计数器i。你应该为每个循环使用不同的一个,而现代C编译器的一般偏好是在循环中声明循环计数器,所以

for (int i = 0;

而不是

int i = 0
.
.
for (i = 0;

你也有太多的循环,你需要两个,而不是三个。每个内循环的执行次数乘以外循环,因此执行5次的外循环将导致内循环25执行总共125次。所以你真的只需要一个5的外环(每个城市一个),以及一个5的内环(每个城市的5个临时值中的每一个),总共5个城市和25个临时。

这段代码根本不正确,它确实没有做任何事情

if (i == 5) {
    continue;
}

最后,对于显示它所要求的年份编号的printf,我使用%操作将年份称为1-5,而不是将年份称为1- 25。 %可能是你尚未接触到的东西,但它是一种非常强大的操作,可以循环重复模式。如果您对它的作用有疑问,请务必查阅,或随时提出后续问题。

%是模数运算。它在操作数被分割时返回余数。例如,

3 % 5 = 37 % 5 = 2

当您想要循环使用具有重复模式的一组数字时,这是一个非常有用的操作。在您的年份中,您存储了5组5个整数作为25个整数的数组。如果我们只是做了

for (int j = (i * numYears); j < (i * numYears) + numYears; j++)
    printf("For year %d\n", j);

您会提示用户输入0到24年的值,而不是您想要的值。你可以用

for (int j = (i * numYears); j < (i * numYears) + numYears; j++)
    printf("For year %d\n", j + 1);

会提示用户使用1 - 25年,更清晰,但仍然不是最好的。使用

for (int j = (i * numYears); j < (i * numYears) + numYears; j++)
    printf("For year %d\n", (j % numYears)  + 1);

j从0到4时,提示请求年份1-5,然后当j从6 - 10变为时,重置并将提示更改为1-5,这是因为

(1 % 5) = (6 % 5) = 1

注意我们只在提示年份时才使用它,我们在存储值时仍然使用j,所以我们实际填充数组位置0 - 24.

如果我没有做出最好的工作来解释它是如何工作的,我道歉。如果你搜索一下,我确定有很多教程。

答案 1 :(得分:2)

您需要为每个循环声明一个变量。如果你想要三个不同的i变量,你应该写一下:

// program to accept yearly temperature and display the max and minimum temp of five cities
#include <stdio.h>
int main() {
    //prompt user for yearly temperature of the five cities

    char cities[5][20];
    float temps[25];
    printf("Please enter the yearly temperature of the five cities\n");
    for (int i = 0; i <= 4; i++) {
      printf("Enter city %d \n", i + 1);
      scanf("%s", & cities[i]);

      for (int i = 0; i <= 4; i++) {
        printf("Enter temperatures for city %d\n", i + 1);

        for (int i = 0; i <= 24; i++) {
          printf("For year %d\n", i + 1);

          scanf("%f", & temps[i]);
          if (i == 5) {
            continue;
          }
        }
      }
    }
    return 0;
}

请注意,此代码仅在C99中有效。早期版本的语言要求您在for循环中使用不同的变量名。

但是,在上面提供的代码中,您的continue语句将无效,因为条件i == 5是循环中的最后一条指令。如果要终止循环,则应使用break而不是continue。在这种情况下,我将该循环的i变量的边界定义为i < 5并完全删除if语句。
您应该了解C中的variable scoping。此处声明的每个i变量都是一个完全不同的变量,而不是您的代码重复使用相同的i变量,导致提前终止该计划 我建议你总是为每个for循环声明一个变量,这样你的代码总是会更清晰。

您提供的代码在算法上也是错误的。你想要的是重复五个城市的温度收集过程五次。在这种情况下,总迭代次数应为25,因为for循环需要O(n) iterations and a nested for loop requires O(n^k) iterations,其中k是嵌套循环的数量。每个循环再次发生5次5^2 = 25