我正在写一个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
所以你可以看到代码一直运行到二十五,然后才结束。 如果有人告诉我我做错了什么会有所帮助。 感谢。
答案 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 = 3
和7 % 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
。