int n;
int i;
int j;
int **x;
int k;
char buf[1024];
cout << "Размерность массива?";
cin >> n;
cout << "Шаг?";
cin >> k;
// Формируем
x = new int*[n];
for(i = 0; i < n; i++)
{
x = new int[n];
for(j = 0; j < n; j++)
x[j] = (i > j)? 0 : k*(n - j);
}
// Печатаем
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
sprintf(buf, "%10d", x[j];
cout << buf;
}
cout << endl;
}
// Уничтожаем
for(i = 0; i < n; i++)
delete[] x;
delete[] x;
Как сгенерировать матрицу????
[ 0 0 0 ..... 0 2k]
[ 0 0 0 ..... 0 3k]
......
[ 0 0 0 ..... 0 1]
[ 0 0 0 ..... 1k 0]
[ 0 0 0 ..... 1k 1k]
[ 0 0 0 ..... 1k 2k]
......
[ 1 1 ................1]
k - шаг с которым растет массив, а пользователь сам задает размернось массива n. Подскажите алгоритм, а то мне на ум приходит только n раз прописать цикл for. (как программист я не очень:) )
А можно поподробнее и другими словами? Я не понял ничего.
этих чисел n. каждое из них может принимать значение от 0 до 1. тоесть (0 0.01 0.02 0.03 ........ 1) нужно перебрать все возможные варианты, а сохранять надо именно вектор.
допустим n==5, тогда как выглядят последовательности?
Код:
0 0 0 0 0.1
0 0 0 0 0.2
//????????????????????????????????????????
0 0 0 0 0.2
//????????????????????????????????????????
опишу для 3ех.:)
[0 0 0]
[0 0 0,1]
[0 0 0,2]
[0 0 0,3]
[0 0 0,4]
[0 0 0,5]
[0 0 0,6]
....
[0 0 1]
[0 0,1 0]
[0 0,1 0,1]
[0 0,1 0,2]
[0 0,1 0,3]
[0 0,1 0,4]
......
[0 0,1 1]
[0 0,2 0]
[0 0,2 0,1]
[0 0,2 0,2]
[0 0,2 0,3]
........
[0,1 0 0]
[0,1 0 0,1]
[0,1 0 0,2]
[0,1 0 0,3]
.....
[1 1 1]
Код:
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
.........
1 1 1 1
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
.........
1 1 1 1
В том то и дело что не с двоичной системой счисления аналогия, а с 16ричной.....
делай массив из n элементов и добавляй по 1 к нижнему разряду. как только превысили макс. значение ячейки - обнуляем и переходим в следущий разряд. и т.д.
Если элемент уже равен макс.значению, тогда обнулить его, и пытаться
добавить шаг к пред. элементу. Итд.
Код:
#include <windows.h>
#include <fstream>
using namespace std;
const int size = 3;
const int step = 1;
const int max_num = 10;
int main()
{
int array[size];
for(int i = 0; i < size; i++)
array = 0;
ofstream outFile("C:\\matrix.txt");
bool bCont = true;
while(bCont)
{
// Вывод текущей строки
int value;
for(int i = 0; i < size; i++)
{
value = array;
if(value==0)
outFile << " 0.0 ";
else if(value==max_num)
outFile << " 1.0 ";
else
outFile << " 0." << value << " ";
}
outFile << endl;
// Генерация след. строки
bCont = false;
for(int ndx = size - 1; ndx >= 0; ndx--)
{
value = array[ndx] + size;
if(value <= max_num)
{
array[ndx] = value;
bCont = true;
break;
}
else
{
array[ndx] = 0;
}
}
}
outFile.close();
return 0;
}
#include <fstream>
using namespace std;
const int size = 3;
const int step = 1;
const int max_num = 10;
int main()
{
int array[size];
for(int i = 0; i < size; i++)
array = 0;
ofstream outFile("C:\\matrix.txt");
bool bCont = true;
while(bCont)
{
// Вывод текущей строки
int value;
for(int i = 0; i < size; i++)
{
value = array;
if(value==0)
outFile << " 0.0 ";
else if(value==max_num)
outFile << " 1.0 ";
else
outFile << " 0." << value << " ";
}
outFile << endl;
// Генерация след. строки
bCont = false;
for(int ndx = size - 1; ndx >= 0; ndx--)
{
value = array[ndx] + size;
if(value <= max_num)
{
array[ndx] = value;
bCont = true;
break;
}
else
{
array[ndx] = 0;
}
}
}
outFile.close();
return 0;
}
Дело в том, то мне нужно каждый раз сохранять полноценный вектор из n элементов - что бы дальше с ними работать. причем зарание колличество элементов в массиве не дано... Мне просто нужна подсказка как написать n - вложенных друг в друга циклов for.
Цитата: Seneka
Дело в том, то мне нужно каждый раз сохранять полноценный вектор из n элементов - что бы дальше с ними работать. причем зарание колличество элементов в массиве не дано... Мне просто нужна подсказка как написать n - вложенных друг в друга циклов for.
Подсказка была выше.
1. Инициализировать вектора 0-ями. Это будет нулевая строка массива.
2. Сгенерировать след. строки.
Для этого.
1. Текущим элементом принять посл.элемент вектора.
2. Увеличить на шаг текущий элемент.
3. Если он стал больше макс. доп., тогда обнулить его. Текущим сделать
пред. элемент и снова на шаг 2.
Если элемент был увеличен, тогда мы получили след.строку.
А если не удалось ув. ни один элемент вектора, тогда выход, сгенерированы все строки.
Код:
#include <windows.h>
double *set_array_values(const int cols, const int step, const int max_value, int &rows)
{
rows = 1; // Количество строк
int m = max_value/step;
for(int i = 0; i < cols; i++)rows*=m;
double *dRes = new double[cols*rows];
double *pD = dRes;
int *array = new int[cols];
for(i = 0; i < cols; i++)
array = 0;
bool bCont = true;
while(bCont)
{
for(int i = 0; i < cols; i++)
*pD = (double)array/max_value;
bCont = false;
for(int ndx = cols - 1; ndx >= 0; ndx--)
{
int value = array[ndx] + step;
if(value <= max_value)
{
array[ndx] = value;
bCont = true;
break;
}
else
{
array[ndx] = 0;
}
}
}
delete[] array;
return dRes;
}
int main()
{
int rows;
double *dblArray = set_array_values(3, 1, 10, rows);
// ...
// ...
// ...
// ...
delete[] dblArray;
return 0;
}
double *set_array_values(const int cols, const int step, const int max_value, int &rows)
{
rows = 1; // Количество строк
int m = max_value/step;
for(int i = 0; i < cols; i++)rows*=m;
double *dRes = new double[cols*rows];
double *pD = dRes;
int *array = new int[cols];
for(i = 0; i < cols; i++)
array = 0;
bool bCont = true;
while(bCont)
{
for(int i = 0; i < cols; i++)
*pD = (double)array/max_value;
bCont = false;
for(int ndx = cols - 1; ndx >= 0; ndx--)
{
int value = array[ndx] + step;
if(value <= max_value)
{
array[ndx] = value;
bCont = true;
break;
}
else
{
array[ndx] = 0;
}
}
}
delete[] array;
return dRes;
}
int main()
{
int rows;
double *dblArray = set_array_values(3, 1, 10, rows);
// ...
// ...
// ...
// ...
delete[] dblArray;
return 0;
}
Спасибо Огромное.... Это то что надо.......:)