Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Visual C++ / С/C++

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 01.04.2008, 21:02   #1
Неактивный пользователь
 
Аватар для BFTFenix
 
Пол:Мужской
Регистрация: 11.12.2007
Сообщений: 50
Репутация: 13
По умолчанию Симметричная матрица

Это матрица у которой столбец под главной диогональю равен соотведствующей строке над главно диогональю. Посути получаеться два треугольника. Так вот в моей задаче мне нужно хронить в память не всю матрицу а один из таких треугольников(я выбрал нижний). У меня возникают проблемы при вводе, вот код:
Код:
#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;
}
Программа кампелируеться без проблем, но виснет приводе элемента. Какого именно зависит от ввиденого размера матрицы. Если матрица 3-3 то программа виснет при вводе 3-го элементта второй строки(он не должен хрониься в памяти).
вот ошибка:
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его...

Последний раз редактировалось BFTFenix; 01.04.2008 в 21:16..
BFTFenix вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама:


Старый 02.04.2008, 03:10   #2
flipBoy
Неактивный пользователь
 
Регистрация: 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.. Причина: Добавлено сообщение
flipBoy вне форума
 
Ответить с цитированием Вверх
Старый 02.04.2008, 09:11   #3
BFTFenix
Неактивный пользователь
 
Аватар для BFTFenix
 
Пол:Мужской
Регистрация: 11.12.2007
Сообщений: 50
Репутация: 13
По умолчанию Ответ: Симметричная матрица

Цитата:
И тут cin >>**(mas+j); замени
на *(*mas+j); чтобы правильно перемещаться по таблице, отсюда ошибка обращения к памети.

Так как написано у меня я перемещаюсь в приделах одной строки, переход на нову у меня обощначаеться как mas++. А так как ты написал я буду пермемещаться по сторокам а не в приделе одной, что мне надо.

И я думаю что:

*mas=new int [0];
равносильно
*mas=new int;
веди в массиве а[1] - 2 элемента, а не 1. Или я не прав?
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его...
BFTFenix вне форума
 
Ответить с цитированием Вверх
Старый 02.04.2008, 12:13   #4
flipBoy
Неактивный пользователь
 
Регистрация: 31.03.2008
Сообщений: 5
Репутация: 1
По умолчанию Ответ: Симметричная матрица

Я соглашусь с тобой в первом случае, но при такой арифметике ты перемещаешься не по таблице а по таблицам. Может я не правильно тебя понял чего ты хочешь, может именно этого ты и хочешь, но тут сдвигается указатель на указатель таблицы.
cin >>**(mas+j);
flipBoy вне форума
 
Ответить с цитированием Вверх
Старый 02.04.2008, 16:51   #5
BFTFenix
Неактивный пользователь
 
Аватар для BFTFenix
 
Пол:Мужской
Регистрация: 11.12.2007
Сообщений: 50
Репутация: 13
По умолчанию Ответ: Симметричная матрица

Нет по поводу замены **(mas+j) на *(*mas+j) ты ПРАВ! Это просто я идиот. А вот по поводу выделения памяти я придерживаюсь своего мнения.
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его...
BFTFenix вне форума
 
Ответить с цитированием Вверх
Старый 02.04.2008, 18:43   #6
ev_Genius
Новичок
 
Пол:Мужской
Регистрация: 08.09.2006
Сообщений: 28
Репутация: 2
По умолчанию Ответ: Симметричная матрица

Цитата:
Сообщение от BFTFenix Посмотреть сообщение
*mas=new int [0];
равносильно
*mas=new int;

Нет, не равносильно. Первый вариант вообще ошибка, т.к. ничего не выделяется, т.е. ноль элементов. Кроме того, выделенную с помощью new TYPE[n] память нужно освобождать с помощью delete[], а new TYPE - delete.
ev_Genius вне форума
 
Ответить с цитированием Вверх
Старый 02.04.2008, 19:27   #7
flipBoy
Неактивный пользователь
 
Регистрация: 31.03.2008
Сообщений: 5
Репутация: 1
По умолчанию Ответ: Симметричная матрица

По поводу выделения памяти, я проверял в несколких источниках, в том числе www.cplusplus.com. Там написано как раз что :
int *point=new int[n], где n - это количество элементов под которые выделяется память.
flipBoy вне форума
 
Ответить с цитированием Вверх
Старый 02.04.2008, 19:32   #8
BFTFenix
Неактивный пользователь
 
Аватар для BFTFenix
 
Пол:Мужской
Регистрация: 11.12.2007
Сообщений: 50
Репутация: 13
По умолчанию Ответ: Симметричная матрица

Ну программа покрайней мере работает правельно.
сегодня чуть по позже проверю точно этот нюанс.
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его...
BFTFenix вне форума
 
Ответить с цитированием Вверх
Старый 02.04.2008, 21:47   #9
zss
Постоялец
 
Пол:Мужской
Регистрация: 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);  // задать элемент массива
};
При желании можно даже перегрузить операцию []
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 03.04.2008, 19:31   #10
BFTFenix
Неактивный пользователь
 
Аватар для BFTFenix
 
Пол:Мужской
Регистрация: 11.12.2007
Сообщений: 50
Репутация: 13
По умолчанию Ответ: Симметричная матрица

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;
}
Выводит именно то что я и ввожу, так что думайте сами.....
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его...
BFTFenix вне форума
 
Ответить с цитированием Вверх
Старый 04.04.2008, 11:43   #11
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Ответ: Симметричная матрица

Цитата:
Сообщение от BFTFenix Посмотреть сообщение
2 zss:
хороший подход, мне как раз нужно несколько таких матриц.

Когда есть класс, то представителей этого класса можете
создавать сколько угодно:
matr3 m1,m2,m3[1000];
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 04.04.2008, 17:52   #12
BFTFenix
Неактивный пользователь
 
Аватар для BFTFenix
 
Пол:Мужской
Регистрация: 11.12.2007
Сообщений: 50
Репутация: 13
По умолчанию Ответ: Симметричная матрица

Цитата:
Сообщение от zss Посмотреть сообщение
Когда есть класс, то представителей этого класса можете
создавать сколько угодно:
matr3 m1,m2,m3[1000];

Ну вот именно поэтому я и сказал, что это хороший подход.
__________________
Больше всего человек удивляет когда, кажется, что полностью узнал его...
BFTFenix вне форума
 
Ответить с цитированием Вверх
Старый 08.04.2008, 19:37   #13
flipBoy
Неактивный пользователь
 
Регистрация: 31.03.2008
Сообщений: 5
Репутация: 1
По умолчанию Ответ: Симметричная матрица

Цитата:
И я думаю что:
*mas=new int [0];
равносильно
*mas=new int;
веди в массиве а[1] - 2 элемента, а не 1. Или я не прав?

Если дашь индекс 0, то будет таблица с одним элементом, так как ты сказал,и даже если 1, то тоже будет один элемент.Программа работает правильно, потому что при компиляции программы и последующем запуске для порграммы выделяется больше памяти, чем требуется непосредственно для задекларированных перемменных, поэтому нету ошибки обращения к памяти при пересечении границы таблицы. И операции производятся над ячейками памяти не пренадлежащими таблице. Операционная система не может следить за каждым байтом памяти, она следит за блоком. Это черевато последующим затиранием данных не хранящихся в памяти. Или может я не прав. Я пришёл к
такому выводу, так что безопаснее безусловно делать так как я писал выше, и резервировать памяти столько сколько нужно.
flipBoy вне форума
 
Ответить с цитированием Вверх
Старый 21.04.2008, 18:37   #14
seimur
Неактивный пользователь
 
Пол:Мужской
Регистрация: 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;
}
seimur вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Киберсант-Матрица gexan Скорая помощь 1 10.04.2008 07:50
МАТРИЦА для ETEN m500? mckey_ua Архив 1 31.05.2007 16:08

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 03:04. Часовой пояс GMT +3.


Copyright ©2004 - 2025 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.11405 секунды с 11 запросами