0

Possible Duplicate:
C++ Loop Not Looping Appropriately

Warning..I am new to C++ programming...I have an array of 20 x 20 that outputs how hot a plate is. I need to reiterate through a loop until no cell in the array changes more than 0.1 degree(I refresh the values through every iteration. How would you monitor the largest change for any cell in an array in order to determine when to stop iterating? Right now I have tried, but the below doesn't output correctly.

#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 回答