0

重複の可能性:
C++ ループが適切にループしない

警告..C++ プログラミングは初めてです...プレートの温度を出力する 20 x 20 の配列があります。配列内のセルが 0.1 度を超えて変化しなくなるまで、ループを繰り返す必要があります (反復ごとに値を更新します。反復を停止するタイミングを決定するために、配列内の任意のセルの最大の変化をどのように監視しますか?今試してみましたが、以下は正しく出力されません。

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

using namespace std;


const int array_size = 20; // set array size and neighbors to calculate rest of cells
const int cell_neighbors = 4;

void initialize(double hot_plate[][array_size]); //functions here
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);
double value_cell(const double hot_plate[][array_size],
            const int cell_X, const int cell_Y);



int main()
{
double hot_plate[array_size][array_size];//set variables

initialize(hot_plate); //run function

string file_name = "hot_plate.csv"; //file name for Excel

//repeat until stable
int repeat_until_stable = 1000;
while ( repeat_until_stable > 0)
{
    for (int a = 1; a < array_size - 1; a++)
    {
        for (int b = 1; b < array_size - 1; b++)
            {

            {
                hot_plate[a][b] = sum_cell(hot_plate, b, a);
            }
        }
    }
    repeat_until_stable--;
}

if (writeFile(hot_plate, file_name)) //check functionality of the program
{
    cout << "Excel File created\n";
}
else
{
    cout << "The Excel file did not write\n";
}

system("pause");

return 0;
}

//function definition

double sum_cell(const double hot_plate[][array_size],
            const int cell_X, const int cell_Y)
{
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 /= cell_neighbors; // find average of the 4 values closest to cell

return cell_num;
}

// setup the array so all values are defined
void initialize(double hot_plate[][array_size])
{
for (int a = 0; a < array_size; a++)
{
    for (int b = 0; b < array_size; b++)
    {
        if (a == 0 || a == array_size - 1)
        {
            if (b == 0 || b == array_size - 1)
            {
                hot_plate[a][b] = 0.0;
            }
            else
            {
                hot_plate[a][b] = 100.0;
            }
        }
        else
        {
            hot_plate[a][b] = 0.0;
        }
    }
}
}
double value_cell(const double hot_plate[][array_size],
            const int cell_X, const int cell_Y)
{
double cell_value = hot_plate[cell_X][cell_Y]; // cell value

return cell_value;
}
// Write the data to the Excel CSV file
bool writeFile(const double hot_plate[][array_size],
           const string file_name)
{
// open the excel file
ofstream fout(file_name);
if (fout.fail())
  return false;

for (int a = 0; a < array_size; a++)
{
   for (int b = 0; b < array_size; b++)
   {
       fout << hot_plate[a][b];
       if ( b < array_size - 1)
       {
           fout << ", ";
       }
       else if (a != array_size - 1)
       {
           fout << endl;
       }
   }
}

// close the input stream from the file.
fout.close();
return true;
}
4

1 に答える 1

1

行われた最大の変更を保持する変数を置き、for ループの後にそれを確認します

double maxChange=.11;
.
.
.
while(maxChange>.1)
{
      maxChange=-1;
      for(.....)
             for(.....)
             {
                   change=fabs(oldValue-plate[a][b]);
                   if(change>maxChange)
                         maxChange=change;
             }

}
于 2012-10-17T16:46:50.500 に答える