#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;

vector<vector<double>> matrix;
const int MAX_ROWS = 4;
const int MAX_COLS = 3;

int main() {
	for (int i=0; i<MAX_ROWS; ++i) {
		matrix.push_back(vector<double>(MAX_COLS));
	}
	for (int i=0; i<MAX_ROWS; ++i) {
		for (int j=0; j<MAX_COLS; ++j) {
			if ((j % 2)==0) {
				matrix[i][j] = static_cast<double>(1.0)/(2.0+i+j);
			} else {
				matrix[i][j] = static_cast<double>(rand())/(2.0+i+j);
			}
		}
	}
	
	// print line of 40 '=' 
	cout << setw(40) << setfill('=') << '\0' << endl;
	
	
	vector<vector<double>>::iterator row_it;
	vector<double>::iterator col_it;
	
	// =============================================
	// print matrix contents in three different ways
	// =============================================
	
	
	// 1. default
	cout << "default ===========" << endl;
	cout.precision(8);
	for (row_it = matrix.begin(); row_it != matrix.end(); ++row_it) {
		for (col_it = (*row_it).begin(); col_it != (*row_it).end(); ++col_it) {
			cout << setw(20);	
			cout << *(col_it);
			
		}
		cout << endl;
	} 	
	cout << endl;
	
	// 2. scientific
	cout << "scientific ===========" << endl;
	cout << std::scientific;
	cout.precision(8);
	for (row_it = matrix.begin(); row_it != matrix.end(); ++row_it) {
		for (col_it = (*row_it).begin(); col_it != (*row_it).end(); ++col_it) {
			cout << setw(20);	
			cout << *(col_it);
			
		}
		cout << endl;
	} 	
	cout << endl;
	
	// 3. fixed
	cout << "fixed ===========" << endl;
	cout << std::fixed;
	cout.precision(8);
	cout << setfill('_');
	for (row_it = matrix.begin(); row_it != matrix.end(); ++row_it) {
		for (col_it = (*row_it).begin(); col_it != (*row_it).end(); ++col_it) {
			cout << setw(20);	
			cout << *(col_it);
			
		}
		cout << endl;
	} 	
	
	return 0;
}

