C++循环未正确循环

C++ Loop Not Looping Appropriately

本文关键字:循环 C++      更新时间:2023-10-16

我有一个 20 x 20 的数组,用于输出板的温度。我需要通过循环重申,直到数组中没有单元格的变化超过 0.1 度(我通过每次迭代刷新值。您将如何监视数组中任何单元格的最大更改以确定何时停止迭代?现在我已经尝试过了,但以下内容无法正确输出。

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
const int ARRAY_SIZE = 20;
const int NEIGHBORS = 4;
void initialize(double hot_plate[][ARRAY_SIZE]);
bool writeFile(const double HOT_PLATE[][ARRAY_SIZE],
           const string FILE_NAME);
double sum_cell(const double HOT_PLATE[][ARRAY_SIZE],
            const int CELL_X, const int CELL_Y);
int main()
{
double hot_plate[ARRAY_SIZE][ARRAY_SIZE];
double hot_plate_prev[ARRAY_SIZE][ARRAY_SIZE];
initialize(hot_plate);
string file_name = "hot_plate.csv";
//accuracy up to 4 decmials
int runs = 724;
double hot_plate[ARRAY_SIZE][ARRAY_SIZE];
double hot_plate_prev[ARRAY_SIZE][ARRAY_SIZE];
while (true)
{
 // This is your code
 for (int i = 0; i < ARRAY_SIZE; i++)
{
    for (int j = 0; j < ARRAY_SIZE; j++)
    {
        if (i > 0 && i < ARRAY_SIZE - 1 && j > 0 && j < ARRAY_SIZE - 1)
        {
            hot_plate[i][j] = sum_cell(hot_plate, j, i);
        }
    }
}
bool theSame = true;
for (int i = 0; i < ARRAY_SIZE; i++)
{
    for (int j = 0; j < ARRAY_SIZE; j++)
    {
        if (abs(hot_plate[i][j] - hot_plate_prev[i][j]) < 0.1)
        {
            theSame = false;
        }
        hot_plate_prev[i][j] = hot_plate[i][j];
    }
}
if (!theSame) break;
}
}
if (writeFile(hot_plate, file_name))
{
    cout << "File wrote correctlyn";
}
else
{
    cout << "The file did not write!n";
}
//system("pause");
return 0;
}

double sum_cell(const double HOT_PLATE[][ARRAY_SIZE],
            const int CELL_X, const int CELL_Y)
{
/* This code should never go out of bounds as it's in an if statement
   if (i > 0 && i < ARRAY_SIZE - 1 && j > 0 && j < ARRAY_SIZE - 1)
*/
double cell_num = HOT_PLATE[CELL_X - 1][CELL_Y]; // Top
cell_num += HOT_PLATE[CELL_X][CELL_Y - 1]; // Left
cell_num += HOT_PLATE[CELL_X][CELL_Y + 1]; // Right
cell_num += HOT_PLATE[CELL_X + 1][CELL_Y]; // Bottom
cell_num /= NEIGHBORS;
return cell_num;
}
// setup the Array so all values are defined when starting
void initialize(double hot_plate[][ARRAY_SIZE])
{
for (int i = 0; i < ARRAY_SIZE; i++)
{
    for (int j = 0; j < ARRAY_SIZE; j++)
    {
        if (i == 0 || i == ARRAY_SIZE - 1)
        {
            if (j == 0 || j == ARRAY_SIZE - 1)
            {
                hot_plate[i][j] = 0.0;
            }
            else
            {
                hot_plate[i][j] = 100.0;
            }
        }
        else
        {
            hot_plate[i][j] = 0.0;
        }
    }
}
}
// Write the data to the CSV file
bool writeFile(const double HOT_PLATE[][ARRAY_SIZE],
           const string FILE_NAME)
{
// open the file
ofstream fout(FILE_NAME);
if (fout.fail())
  return false;
for (int i = 0; i < ARRAY_SIZE; i++)
{
   for (int j = 0; j < ARRAY_SIZE; j++)
   {
       fout << HOT_PLATE[i][j];
       if ( j < ARRAY_SIZE - 1)
       {
           fout << ", ";
       }
       else if (i != ARRAY_SIZE - 1)
       {
           fout << endl;
       }
   }
}
// close the input stream from the file.
fout.close();
return true;
}

while循环开始时,您可以设置一个名为 allSmallChanges 的布尔变量来true。 在内部if语句中,您可以检查对hot_plate[i][j]的更改是否"太大"。 如果太大,则allSmallChanges设置为 false。 然后,在while循环结束之前,您可以break allSmallChanges是否仍然为真。

如果您不想拥有 724 次迭代的上限,则可以摆脱 runs 变量,并将循环更改为 while(true)

注意:在我写下这个答案后,问题中的代码发生了变化。 我不确定这个答案是否仍然适用。 但是,我也确信这将是对问题中代码的最后一次更改。 所以,我暂时保留这个答案。