![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Это матрица у которой столбец под главной диогональю равен соотведствующей строке над главно диогональю. Посути получаеться два треугольника. Так вот в моей задаче мне нужно хронить в память не всю матрицу а один из таких треугольников(я выбрал нижний). У меня возникают проблемы при вводе, вот код:
Код:
#include <iostream.h>
#include <conio.h>
int main()
{
int m;
cout <<"enter m:";
cin >>m;
int **mas=new int *[m];
for (int i=0; i<m; i++, mas++)
*mas=new int [i];
mas=mas-m+1;
cout <<"enter simmetri4nuu matricu:"<<endl;
for (int i=0; i<m; i++)
{
cout <<"enter "<<(i+1)<<" stroku:"<<endl;
for (int j=0; j<m; j++)
{
if (j>i)
{
int *t=new int;
if (!t) {
cout <<"Error";
break;
}
cout <<"\n-";
cin >>*t;
delete t;
}
else
{
cout <<"\n+";
cin >>**(mas+j);
}
}
mas++;
}
mas=mas-m+1;
getch();
return 0;
}
вот ошибка:
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его... Последний раз редактировалось BFTFenix; 01.04.2008 в 21:16.. |
|
|
|
|
| Реклама: |
|
|
#2
|
|
Неактивный пользователь
Регистрация: 31.03.2008
Сообщений: 5
Репутация: 1
|
Попробуй так, минус (-) я так понял значит эдемент не будет храниться в таблице.
int m; cout <<"enter m:"; cin >>m; int **mas=new int *[m-1]; int **tmp=mas; for (int i=1; i<m; i++, tmp++) *tmp=new int [i]; tmp=mas+m-2; cout <<"enter simmetri4nuu matricu:"<<endl; for (int i=0; i<m; i++) { cout <<"enter "<<(i+1)<<" stroku:"<<endl; int k=0; for (int j=0; j<m; j++) { if (j<=i) { int t; cout <<"\n-"; cin >>t; } else { cout <<"\n+"; cin >>*(*tmp+k); ++k; } } tmp--; } tmp=mas; for (int i=0;i<m-1;++i){ for (int j=0;j<i+1;++j) printf("%d ",tmp[i][j]); printf("\n"); } getch(); return 0; Добавлено через 12 минут for (int i=0; i<m; i++, mas++) *mas=new int [i]; обрати внимание на этот фрагмент,тут ты создаёшь таблицу размером 0.А потом в цикле где вводишь элементы начинаешь вписывать элемент строки в таблицу размером 0. Добавлено через 21 минуту Замени for (int i=1; i<=m; i++, mas++) И тут cin >>**(mas+j); замени на *(*mas+j); чтобы правильно перемещаться по таблице, отсюда ошибка обращения к памети. Последний раз редактировалось flipBoy; 02.04.2008 в 03:32.. Причина: Добавлено сообщение |
|
|
|
| Сказали спасибо: |
|
|
#3
|
|||||||||||||||||||
Так как написано у меня я перемещаюсь в приделах одной строки, переход на нову у меня обощначаеться как mas++. А так как ты написал я буду пермемещаться по сторокам а не в приделе одной, что мне надо. И я думаю что: *mas=new int [0]; равносильно *mas=new int; веди в массиве а[1] - 2 элемента, а не 1. Или я не прав?
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его... |
||||||||||||||||||||
|
|
|
|
|
#4
|
|
Неактивный пользователь
Регистрация: 31.03.2008
Сообщений: 5
Репутация: 1
|
Я соглашусь с тобой в первом случае, но при такой арифметике ты перемещаешься не по таблице а по таблицам. Может я не правильно тебя понял чего ты хочешь, может именно этого ты и хочешь, но тут сдвигается указатель на указатель таблицы.
cin >>**(mas+j); |
|
|
|
|
|
#5
|
|
Нет по поводу замены **(mas+j) на *(*mas+j) ты ПРАВ! Это просто я идиот. А вот по поводу выделения памяти я придерживаюсь своего мнения.
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его... |
|
|
|
|
|
|
#6
|
|
Новичок
Пол:
Регистрация: 08.09.2006
Сообщений: 28
Репутация: 2
|
|
|
|
|
|
|
#7
|
|
Неактивный пользователь
Регистрация: 31.03.2008
Сообщений: 5
Репутация: 1
|
По поводу выделения памяти, я проверял в несколких источниках, в том числе www.cplusplus.com. Там написано как раз что :
int *point=new int[n], где n - это количество элементов под которые выделяется память. ![]() |
|
|
|
|
|
#8
|
|
Ну программа покрайней мере работает правельно.
сегодня чуть по позже проверю точно этот нюанс.
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его... |
|
|
|
|
|
|
#9
|
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
Предлагаю альтернативное решение:
Создать класс треугольных матриц. Код:
class matr3
{
private:
int m; // длина строки
double *p; // указатель на массив
public:
matr3(int m0):m(m0){p=new double [m*(m+1)/2];} // конструктор выделяет память только под треугольную часть
~matr3(){delete[] p;} // деструктор удаляет выделенную память
double get(int i,int j); // получить элемент массива
void set(double x, int i, int j); // задать элемент массива
};
__________________
Сергей Сергеевич |
|
|
|
|
|
#10
|
|
2 zss:
хороший подход, мне как раз нужно несколько таких матриц. 2 flipBoy: вот код: Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int *p=new int[0];
int *d=new int[1];
cout <<"*p=";
cin >>*p;
cout <<"*d=";
cin >>*d;
cout <<"*(d+1)=";
d++;
cin >>*d;
cout <<"выводим все в порядке ввода:";
cout <<*p<<'\t'<<*(d-1)<<'\t'<<*d;
getch();
return 0;
}
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его... |
|
|
|
|
|
|
#11
|
|||||||||||||||||||||||
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
Когда есть класс, то представителей этого класса можете создавать сколько угодно: matr3 m1,m2,m3[1000];
__________________
Сергей Сергеевич |
|||||||||||||||||||||||
|
|
|
|
|
#12
|
|||||||||||||||||||||||
Ну вот именно поэтому я и сказал, что это хороший подход.
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его... |
||||||||||||||||||||||||
|
|
|
|
|
#13
|
|||||||||||||||||||
|
Неактивный пользователь
Регистрация: 31.03.2008
Сообщений: 5
Репутация: 1
|
Если дашь индекс 0, то будет таблица с одним элементом, так как ты сказал,и даже если 1, то тоже будет один элемент.Программа работает правильно, потому что при компиляции программы и последующем запуске для порграммы выделяется больше памяти, чем требуется непосредственно для задекларированных перемменных, поэтому нету ошибки обращения к памяти при пересечении границы таблицы. И операции производятся над ячейками памяти не пренадлежащими таблице. Операционная система не может следить за каждым байтом памяти, она следит за блоком. Это черевато последующим затиранием данных не хранящихся в памяти. Или может я не прав. Я пришёл к такому выводу, так что безопаснее безусловно делать так как я писал выше, и резервировать памяти столько сколько нужно. |
|||||||||||||||||||
|
|
|
|
|
#14
|
|
Неактивный пользователь
Пол:
Регистрация: 04.12.2007
Сообщений: 32
Репутация: 4
|
Код:
#include <iostream>
using namespace std;
void main()
{
int rows = 0;
cout << "Rows in matrix(positive integer): ";
cin >> rows;
int** matrix = new int*[rows];
for (int row = 0; row < rows; ++row)
{
matrix[row] = new int[row+1];
cout << "Row[" << row << "]= ";
for(int col = 0; col <= row; ++col)
cin >> matrix[row][col];
}
// Do something here..
// Free memory..
for (int row = 0; row < rows; ++row)
delete[] matrix[row];
delete[] matrix;
}
|
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Киберсант-Матрица | gexan | Скорая помощь | 1 | 10.04.2008 07:50 |
| МАТРИЦА для ETEN m500? | mckey_ua | Архив | 1 | 31.05.2007 16:08 |
|
|