Я C++ занимась не так давно, знания есть, но опыта их применения мало. Раньше у меня все получалось, но вот столкнулся с проблемой. Думаю вам, бывалым программистам это как "два байта отослать"... Так вот, задача большая, но прошу помочь мне лишь с ее частью. Нужно сформировать квадратную матрицу (т.е. двумерный массив размера nхn) порядка n, т.е. я сам ввожу размерность матрицы, с таким чередованием элементов:
В общем-то саму теорию мостроения я понимаю, даже очень хорошо, строил на VisualBasic'e, но на C++ (а у меня Borlad C++ Builder 6) не получается. Программа запускается, вылазиет консоль, начинается выполнение первых пунктов задачи а потом когда по идеи доходит дело до массива, вылазиет сообщение — какой-то error. И все... Потом только через Диспечер задачь можно выйти. Конечно, может я что не правельно делаю, с точки зрения программного кода не логично, но в чем ошибка я не знаю. Подскажите.
Чтоб облегчить вам задачу, вот привожу один из текстов, его вариантов, для постоения этой матрицы. Может я что-то сделал не так?
mass = new int*[n];
for (int i=1; i<n-2; i++)
{ mass[i] = new int [n];
for ( i=2; i<=n-2; i++)
for ( j=2; j<=n-2; j+2)
mass[i][j]=2; }
mass[0][0]=mass[n-1][0]=mass[0][n-1]=mass[n-1][n-1]=1;
cout<<mass[i][j];
Отформатировал был, тогда всё сразу стало бы видно:
int** mass,n,i,j;
cout << "Oboznachte razmer matricy\n";
cin >> n;
mass = new int*[n];
for (int i = 1; i < n-2; i++)
{
mass[i] = new int [n];
for (i = 2; i <= n-2; i++)
for (j=2; j <= n-2; j+2)
mass[i][j] = 2;
}
mass[0][0] = mass[n-1][0] = mass[0][n-1] = mass[n-1][n-1] = 1;
cout << mass[i][j];
getch();
Не знаю, как там на борланде, но из общих размышлений мне кажется, что вылетать может в самом внутреннем цикле. Т.е. выделяется одна строчка матрицы, а дальше идёт двойной цикл заполнения ВСЕЙ матрицы. Нехорошо. Ещё одно место с вылетом — переменная i в самом начале объявленна, но неинициализированна. В заголовке цикла переменная i опять объявляется, скрывая первую. Выходя из цикла, внутренняя i уничтожается, и в строчке
cout << mass[i][j]
видется изначальная неинициализированная i. Думаю, в данном примере закрывающая фигурная скобка просто поставленна неправильно.
Ещё мне не нравится запись типа
for (j = 2, j <= n-2; j+2)
. Ворнинги иногда полезно читать
Кстати, неплохо бы удалять память за собой, хотя в данном примере это не особо и важно.
Миша.
А>//---------------------------------------------------------------------------
А>#include <vcl.h> А>#pragma hdrstop А>#include <iostream.h> А>#include<conio.h> А>//---------------------------------------------------------------------------
А>#pragma argsused А>#pragma argsused А>void main() А>{ А> int **mass,n,i,j; А> cout << "Oboznachte razmer matricy\n"; А> cin >> n;
А> mass = new int*[n]; А> for (int i=1; i<n-2; i++) А> { mass[i] = new int [n]; А> for ( i=2; i<=n-2; i++) А> for ( j=2; j<=n-2; j+2) А> mass[i][j]=2; } А> mass[0][0]=mass[n-1][0]=mass[0][n-1]=mass[n-1][n-1]=1; А> cout<<mass[i][j];
А> getch(); } А>//----------------------------------------------------------------------------
MT>Отформатировал был, тогда всё сразу стало бы видно:
Во-во...
int** mass, size;
// нелюблю я эти m, n, ёклмн потом сам в своём коде не разберёшся. ;)
cout << "Oboznachte razmer matricy\n";
cin >> n;
mass = new int*[size];
for (int i = 1; i < size-1 /*интервал: [1; size-1) */; i++)
{// для справки, i будет видна только внутри этого блока (снутри собок "{}") --
// -- борланд так настроен по умолчанию.
mass[i] = new int[size];
// i тут лучше не пользовать, тем более не объявляя
// ("i = 2" -- присвоить переменной i значение 2).
// В каждой "части" for ты можешь любое выражение писать, главное что
// сначала выполнится то что перед первым ";", потом то что перед вторым ";"
// и если оно результатом даст не ноль, то поедет выполнятся то что в "{}"
// а потом выполнится то что после второго ";", а потом условие перед вторым ";" и т.д.
// Например: можно так написать "for (int k = 0; k < size; k++)",
// а можно "for (int k = size; k--;)" первое и второе выражение переберёт все k на
// интервале [0; size), но первое с 0 до size-1 а второе c size-1 до 0.for (int k = 2; k < size-1; k++)
for (int j = 2; /*можно и по старому оставить, но так меньше "человеческий фактор"*/
j <= size-2;
j += 2 /*"j+2" -- посчитать скока будет j плюс 2 и фсё! ;) */)
mass[k][j] = 2;
}
mass[0][0] = mass[size-1][0] = mass[0][size-1] = mass[size-1][size-1] = 1;
cout << mass[i][j];
getch();
Времени мало, поэтому особливо не проверял -- если накосячил, не судите строго, эт очечапка.
PS: эх... помню как я с VB на BCB перелезал... Ж8-)
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Здравствуйте, Аноним, Вы писали:
А>Я C++ занимась не так давно, знания есть, но опыта их применения мало. Раньше у меня все получалось, но вот столкнулся с проблемой. Думаю вам, бывалым программистам это как "два байта отослать"... Так вот, задача большая, но прошу помочь мне лишь с ее частью. Нужно сформировать квадратную матрицу (т.е. двумерный массив размера nхn) порядка n, т.е. я сам ввожу размерность матрицы, с таким чередованием элементов:
А>1000001 А>0202020 А>0202020 А>0202020 А>0202020 А>0202020 А>1000001
Формула для нахождения произвольного элемента матрицы
inline int mxy(int x, int y, int N)
{
return
(x==0||x==N-1)&&(y==0||y==N-1) ? 1 :
(x%2==0) ? 2 : // кстати, а если N чётное - как должны чередоваться столбцы?
0 ;
}
............
for(x=0;x<N;++x) for(y=0;y<N;++y)
m[x][y] = mxy(x,y,N);
Для вывода на экран, очевидно, запоминать матрицу не нужно: достаточно вычислять и тут же показывать значения.
#pragma argsused
#pragma argsused
void main()
{
int **mass, n, a, i, j;
cout << "Oboznachte razmer matricy\n";
cin >> n;
mass = new int*[n];
for (a=1; a<n-2; a++)
{ mass[i] = new int [n];
for ( i=2; i<=n-2; i++)
for ( j=2; j<=n-2; j+=2)
mass[i][j]=2; }
mass[0][0]=mass[n-1][0]=mass[0][n-1]=mass[n-1][n-1]=1;
cout<<mass[i][j];
Здравствуйте, Gilvat, Вы писали:
G>Здравствуйте, мне все дали столько советов на основе которых я попробовал изменить текст программы. G>Вот он, но проблема таже.
G>Подскажите, в чем недочет...
недочет в незнании C++ и попытке слепить что-то на скорую руку. здесь
Здравствуйте, Gilvat, Вы писали:
G>Здравствуйте, мне все дали столько советов на основе которых я попробовал изменить текст программы. G>Вот он, но проблема таже.
#include<iostream>
G>#include<conio.h> G>//---------------------------------------------------------------------------
G>#pragma argsused G>#pragma argsused G>void main() G>{ G>int **mass, n, a, i, j; G>cout << "Oboznachte razmer matricy\n"; G>cin >> n;
std::cout, std::cin
G>mass = new int*[n]; G>for (a=1; a<n-2; a++) G>{ mass[i] = new int [n];
здесь видимо a должно быть
G>for ( i=2; i<=n-2; i++) G>for ( j=2; j<=n-2; j+=2) G>mass[i][j]=2; } G>mass[0][0]=mass[n-1][0]=mass[0][n-1]=mass[n-1][n-1]=1;
а ты под них память выделил? конкретно под mass[0] и mass[n-1]
G>cout<<mass[i][j];
G>getch(); } G>//-----------------------------
G>Подскажите, в чем недочет...