Проблема с С++
Alone User
Интересующийся
1/7/2008, 1:39:58 AM
Помогите, пожалуйста!
Необходимо отсортировать строчный массив по длине содержащихся в нем строк методом обмена ("пузырьковым")... Я вот накатал, только ни фига не работает... Что не так?
char s;
for (j=len; j>1; j--)
for (i=1; i<=j; i++)
if (arr<arr)
{
strcpy(s,arr);
strcpy(arr,arr);
strcpy(arr,s);
}
Большушее спасибо!
Необходимо отсортировать строчный массив по длине содержащихся в нем строк методом обмена ("пузырьковым")... Я вот накатал, только ни фига не работает... Что не так?
char s;
for (j=len; j>1; j--)
for (i=1; i<=j; i++)
if (arr<arr)
{
strcpy(s,arr);
strcpy(arr,arr);
strcpy(arr,s);
}
Большушее спасибо!
maxdiversexnarod1
Специалист
1/7/2008, 3:44:42 AM
for(i = n-1 ; i > 0 ; i--)
for(j = 0 ; j < i ; j++)
if( strlen(A) > strlen(A) )
{
strcpy(s,arr);
strcpy(arr,arr);
strcpy(arr,s);
}
for(j = 0 ; j < i ; j++)
if( strlen(A) > strlen(A) )
{
strcpy(s,arr);
strcpy(arr,arr);
strcpy(arr,s);
}
ddd13
Интересующийся
1/20/2008, 12:02:02 AM
1) char s - это не массив строк, это одна строка.
2) если бы это был строчный массив и необходимо отсортировать по длине, то делатся это должно приблизительно так.
CODE
char ** array;
...
char * tmp;
for (j=len; j>1; j--)
for (i=1; i<=j; i++)
if( strlen(array[j]) > strlen(array[j+1]) )
{
tmp = arr[i];
arr[i] = arr[i-1];
arr[i-1] = tmp;
}
копировать строки здесь совершенно не нужно. В массиве строк char ** array все элементы указатели и их можно легко изменять, а не копируя строки.
3) Это не С++, это Си.
2) если бы это был строчный массив и необходимо отсортировать по длине, то делатся это должно приблизительно так.
CODE
char ** array;
...
char * tmp;
for (j=len; j>1; j--)
for (i=1; i<=j; i++)
if( strlen(array[j]) > strlen(array[j+1]) )
{
tmp = arr[i];
arr[i] = arr[i-1];
arr[i-1] = tmp;
}
копировать строки здесь совершенно не нужно. В массиве строк char ** array все элементы указатели и их можно легко изменять, а не копируя строки.
3) Это не С++, это Си.
maxdiversexnarod1
Специалист
1/20/2008, 3:57:43 PM
ddd13
Прочитай код в первом посте
Там char s - это вообще временная переменная для обмена строк.
А сортируется arr, которая вполне возможно объявлена как char arr и потому здесь никакие обмены пойнтеров не годятся.
И наконец, этот код можно полноправно называть C++ в силу обратной совместимости
Прочитай код в первом посте
Там char s - это вообще временная переменная для обмена строк.
А сортируется arr, которая вполне возможно объявлена как char arr и потому здесь никакие обмены пойнтеров не годятся.
И наконец, этот код можно полноправно называть C++ в силу обратной совместимости
DELETED
Акула пера
1/24/2008, 1:54:59 PM
(maxdiverSxn1 @ 20.01.2008 - время: 12:57) Прочитай код в первом посте
Там char s - это вообще временная переменная для обмена строк.
А сортируется arr, которая вполне возможно объявлена как char arr и потому здесь никакие обмены пойнтеров не годятся.
RTFM
Необходимо отсортировать строчный массив по длине содержащихся в нем строк
1. Уж явно массив объявлен как char** или char*
2. А что делать программе, если строка больше, чем 19 букаф?
3. А почему не char arr или char arr?
Там char s - это вообще временная переменная для обмена строк.
А сортируется arr, которая вполне возможно объявлена как char arr и потому здесь никакие обмены пойнтеров не годятся.
RTFM
Необходимо отсортировать строчный массив по длине содержащихся в нем строк
1. Уж явно массив объявлен как char** или char*
2. А что делать программе, если строка больше, чем 19 букаф?
3. А почему не char arr или char arr?
maxdiversexnarod1
Специалист
1/25/2008, 12:08:39 AM
Ну дык :)
Мы же решаем обычную тупую универскую/школьную зодачку, а в них как-то принято массивы делать по 100 элементов, ну строчки в принципе тоже длиной по 100 можно, другое дело что тестируют вбивая уж никак не больше 20 буков, а на такие "мелочи", как нехватка размера массива всем пофиг - лишь бы сортировало :)
И для меня совсем не очевидно, что "строчный массив" не двумерный массив, а именно массив указателей :)
Это что ж, мы должны выделить в хипе память, туда считать строку, и положить указатель в массив? И это человеку, который не может написать пузырек?
Мы же решаем обычную тупую универскую/школьную зодачку, а в них как-то принято массивы делать по 100 элементов, ну строчки в принципе тоже длиной по 100 можно, другое дело что тестируют вбивая уж никак не больше 20 буков, а на такие "мелочи", как нехватка размера массива всем пофиг - лишь бы сортировало :)
И для меня совсем не очевидно, что "строчный массив" не двумерный массив, а именно массив указателей :)
Это что ж, мы должны выделить в хипе память, туда считать строку, и положить указатель в массив? И это человеку, который не может написать пузырек?
Alone User
Интересующийся
4/3/2008, 6:43:27 AM
У меня новая проблема. Дано такое задание: "Создайте параметризованный класс - матрицу. Определите конструкторы, деструктор, перегруженные операторы =, и функцию для изменения размера матрицы. Продемонстрируйте работу с созданным шаблоном класса". Ну вот, вроде как половину сделал. Не получается только почему-то функцию написать. Вот что намучал:
#include <conio.h>
#include <iostream>
using namespace std;
template <class T, int Rows, int Columns> class matrix
{
T mtr;
public:
matrix()
{
for(int i = 0; i < Rows; i++)
for(int j = 0; j < Columns; j++)
mtr = 0;
}
matrix(T n)
{
for(int i = 0; i < Rows; i++)
for(int j = 0; j < Columns; j++)
mtr = n;
}
int* operator (int i)
{
return mtr;
}
matrix operator = (matrix ob);
};
template <class T, int Rows, int Columns> matrix<T, Rows, Columns> matrix<T, Rows, Columns>::operator = (matrix ob)
{
for(int i = 0; i < Rows; i++)
for(int j = 0; j < Columns; j++)
this->mtr = ob.mtr;
return *this;
}
int main()
{
int n = {{1,2,3},{4,5,6}};
matrix<int,2,3> o1(n), o2;
o2 = o1;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
cout<<o2<<'\t';
cout<<'\n';
}
return 0;
}
#include <conio.h>
#include <iostream>
using namespace std;
template <class T, int Rows, int Columns> class matrix
{
T mtr;
public:
matrix()
{
for(int i = 0; i < Rows; i++)
for(int j = 0; j < Columns; j++)
mtr = 0;
}
matrix(T n)
{
for(int i = 0; i < Rows; i++)
for(int j = 0; j < Columns; j++)
mtr = n;
}
int* operator (int i)
{
return mtr;
}
matrix operator = (matrix ob);
};
template <class T, int Rows, int Columns> matrix<T, Rows, Columns> matrix<T, Rows, Columns>::operator = (matrix ob)
{
for(int i = 0; i < Rows; i++)
for(int j = 0; j < Columns; j++)
this->mtr = ob.mtr;
return *this;
}
int main()
{
int n = {{1,2,3},{4,5,6}};
matrix<int,2,3> o1(n), o2;
o2 = o1;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
cout<<o2<<'\t';
cout<<'\n';
}
return 0;
}
mvf23
Профессионал
4/3/2008, 7:40:19 AM
(Alone User @ 03.04.2008 - время: 02:43) У меня новая проблема.
эээ... в какие дебри тебя занесло... и вообще букафмного... ик!...
а может сделать Rows и Columns приватными переменными класса, и память под массив выделять динамически? Тогда все получится. При этом правда способ обращения в элементу матрицы несколько усложнится и функция изменения размера матрицы будет не очень простая, но сработает наверняка.
ЗЫ. А вообще я не знаю. Я не сишник, это к JeyLo. Может там есть какая-нить специальная конструкция специально для этих целей?... ик!..
эээ... в какие дебри тебя занесло... и вообще букафмного... ик!...
а может сделать Rows и Columns приватными переменными класса, и память под массив выделять динамически? Тогда все получится. При этом правда способ обращения в элементу матрицы несколько усложнится и функция изменения размера матрицы будет не очень простая, но сработает наверняка.
ЗЫ. А вообще я не знаю. Я не сишник, это к JeyLo. Может там есть какая-нить специальная конструкция специально для этих целей?... ик!..
DELETED
Акула пера
4/3/2008, 2:06:10 PM
ща напишем.
DELETED
Акула пера
4/3/2008, 6:14:55 PM
CODE template <typename T> class matrix {
public:
matrix ( int width = 0, int height = 0 ) : m_width (0), m_height (0), m_matrix(0) {
realloc ( width, height );
};
matrix ( matrix& obj) : m_width (0), m_height (0), m_matrix(0) {
this->operator=(obj);
};
matrix ( matrix* obj) : m_width (0), m_height (0), m_matrix(0) {
this->operator=(obj);
};
~matrix () {
realloc(0,0);
}
T* operator[]( int row ) {
if ( row >= 0 && row <= m_width ) {
return m_matrix[row];
} else {
return 0;
};
};
matrix & operator = (matrix & obj) {
if ( &obj != this ) {
realloc(0, 0);
realloc(obj.GetWidth(), obj.GetHeight());
for ( int w = 0; w < m_width; w++ ) {
for ( int h = 0; h < m_height; h++ ) {
m_matrix[w][h] = obj[w][h];
};
};
};
return *this;
};
matrix & operator = (matrix* obj) {
if ( obj ) {
return this->operator=(*obj);
} else {
realloc(0,0);
return *this;
}
};
int GetHeight () {
return m_height;
};
int GetWidth () {
return m_width;
};
void SetWidth ( int width ) {
realloc ( width, GetHeight() );
};
void SetHeight ( int height ) {
realloc ( GetWidth(), height );
};
void SetSize ( int width = GetWidth(), int height = GetHeight() ) {
realloc ( width, height );
};
public:
private:
T** m_matrix;
int m_width;
int m_height;
void realloc(int width, int heigth) {
if ( width == 0 || heigth == 0 ) {
for ( int r = 0; r < m_width; r ++ ) {
delete [] m_matrix[r];
};
delete [] m_matrix;
m_height = 0;
m_width = 0;
m_matrix = 0;
return;
};
if ( width > 0 && heigth > 0 ) {
T** pt = new T*[width];
for ( int w = 0; w < width; w++ ) {
pt[w] = new T[heigth];
for ( int h = 0; h < heigth; h++ ) {
pt[w][h] = 0;
};
};
#define min(a,b) (((a) < (b)) ? (a) : (b))
for ( int w = 0; w < min(width,m_width); w++ ) {
for ( int h = 0; h < min(heigth,m_height); h++ ) {
pt[w][h] = m_matrix[w][h];
};
};
for ( int r = 0; r < m_width; r ++ ) {
delete [] m_matrix[r];
};
delete [] m_matrix;
m_matrix = pt;
m_width = width;
m_height = heigth;
}
};
};
int _tmain(int argc, _TCHAR* argv[])
{
matrix<int> omatrix ( 3, 4 );
for ( int w = 0; w < omatrix.GetWidth(); w++ )
for ( int h = 0; h < omatrix.GetHeight(); h ++ )
omatrix[w][h] = w + h;
omatrix.SetHeight( 2 );
omatrix.SetWidth( 5 );
matrix<int> somematrix = omatrix;
for ( int h = 0; h < somematrix.GetHeight(); h++ ) {
for ( int w = 0; w < somematrix.GetWidth(); w ++ ) {
printf ( "%d\t", somematrix[w][h] );
};
printf ( "\n" );
};
return 0;
}
public:
matrix ( int width = 0, int height = 0 ) : m_width (0), m_height (0), m_matrix(0) {
realloc ( width, height );
};
matrix ( matrix& obj) : m_width (0), m_height (0), m_matrix(0) {
this->operator=(obj);
};
matrix ( matrix* obj) : m_width (0), m_height (0), m_matrix(0) {
this->operator=(obj);
};
~matrix () {
realloc(0,0);
}
T* operator[]( int row ) {
if ( row >= 0 && row <= m_width ) {
return m_matrix[row];
} else {
return 0;
};
};
matrix & operator = (matrix & obj) {
if ( &obj != this ) {
realloc(0, 0);
realloc(obj.GetWidth(), obj.GetHeight());
for ( int w = 0; w < m_width; w++ ) {
for ( int h = 0; h < m_height; h++ ) {
m_matrix[w][h] = obj[w][h];
};
};
};
return *this;
};
matrix & operator = (matrix* obj) {
if ( obj ) {
return this->operator=(*obj);
} else {
realloc(0,0);
return *this;
}
};
int GetHeight () {
return m_height;
};
int GetWidth () {
return m_width;
};
void SetWidth ( int width ) {
realloc ( width, GetHeight() );
};
void SetHeight ( int height ) {
realloc ( GetWidth(), height );
};
void SetSize ( int width = GetWidth(), int height = GetHeight() ) {
realloc ( width, height );
};
public:
private:
T** m_matrix;
int m_width;
int m_height;
void realloc(int width, int heigth) {
if ( width == 0 || heigth == 0 ) {
for ( int r = 0; r < m_width; r ++ ) {
delete [] m_matrix[r];
};
delete [] m_matrix;
m_height = 0;
m_width = 0;
m_matrix = 0;
return;
};
if ( width > 0 && heigth > 0 ) {
T** pt = new T*[width];
for ( int w = 0; w < width; w++ ) {
pt[w] = new T[heigth];
for ( int h = 0; h < heigth; h++ ) {
pt[w][h] = 0;
};
};
#define min(a,b) (((a) < (b)) ? (a) : (b))
for ( int w = 0; w < min(width,m_width); w++ ) {
for ( int h = 0; h < min(heigth,m_height); h++ ) {
pt[w][h] = m_matrix[w][h];
};
};
for ( int r = 0; r < m_width; r ++ ) {
delete [] m_matrix[r];
};
delete [] m_matrix;
m_matrix = pt;
m_width = width;
m_height = heigth;
}
};
};
int _tmain(int argc, _TCHAR* argv[])
{
matrix<int> omatrix ( 3, 4 );
for ( int w = 0; w < omatrix.GetWidth(); w++ )
for ( int h = 0; h < omatrix.GetHeight(); h ++ )
omatrix[w][h] = w + h;
omatrix.SetHeight( 2 );
omatrix.SetWidth( 5 );
matrix<int> somematrix = omatrix;
for ( int h = 0; h < somematrix.GetHeight(); h++ ) {
for ( int w = 0; w < somematrix.GetWidth(); w ++ ) {
printf ( "%d\t", somematrix[w][h] );
};
printf ( "\n" );
};
return 0;
}
DELETED
Акула пера
4/3/2008, 6:16:27 PM
По уму, конечно, нужно инкапсулировать и элементы... Типа такого:
CODE class element {
public:
element(T& value) : m_value(0) {
SetValue(&value);
};
element(T* value = 0) : m_value(0) {
SetValue(value);
};
~element() {
OnDestroy(m_value);
};
T* GetValue() {
return m_value;
};
operator T*() {
return m_value;
}
operator T&() {
return *m_value;
}
void SetValue(T* value) {
OnDestroy(m_value);
if ( value ) {
m_value = OnCreate(*value);
} else {
m_value = value;
};
};
void SetValue(element* value) {
OnDestroy(m_value);
if ( value->GetValue() ) {
m_value = OnCreate(*value->GetValue());
} else {
m_value = 0;
};
};
void SetValue(element& value) {
SetValue (&value);
};
element& operator = (element& value) {
if ( &value != this ) {
SetValue(value);
}
return *this;
};
element& operator = (element* value) {
return this->operator=(*value);
};
element& operator = (T* value) {
SetValue(value);
return *this;
};
element& operator = (T& value) {
SetValue(*value);
return *this;
};
element& operator = (T value) {
this->SetValue(&value);
return *this;
};
int operator == (element& value) {
return ( OnCompare() == 0 );
};
int operator < (element& value) {
return ( OnCompare() == -1 );
};
int operator >= (element& value) {
return ( OnCompare() >= 0 );
};
int operator <= (element& value) {
return ( OnCompare() <= 0 );
};
int operator > (element& value) {
return ( OnCompare() == 1 );
};
int operator != (element& value) {
return ( OnCompare() != 0 );
};
private:
virtual void OnDestroy(T* value);
virtual T* OnCreate (T& value);
virtual int OnCompare (T& value);
T* m_value;
};
CODE class element {
public:
element(T& value) : m_value(0) {
SetValue(&value);
};
element(T* value = 0) : m_value(0) {
SetValue(value);
};
~element() {
OnDestroy(m_value);
};
T* GetValue() {
return m_value;
};
operator T*() {
return m_value;
}
operator T&() {
return *m_value;
}
void SetValue(T* value) {
OnDestroy(m_value);
if ( value ) {
m_value = OnCreate(*value);
} else {
m_value = value;
};
};
void SetValue(element* value) {
OnDestroy(m_value);
if ( value->GetValue() ) {
m_value = OnCreate(*value->GetValue());
} else {
m_value = 0;
};
};
void SetValue(element& value) {
SetValue (&value);
};
element& operator = (element& value) {
if ( &value != this ) {
SetValue(value);
}
return *this;
};
element& operator = (element* value) {
return this->operator=(*value);
};
element& operator = (T* value) {
SetValue(value);
return *this;
};
element& operator = (T& value) {
SetValue(*value);
return *this;
};
element& operator = (T value) {
this->SetValue(&value);
return *this;
};
int operator == (element& value) {
return ( OnCompare() == 0 );
};
int operator < (element& value) {
return ( OnCompare() == -1 );
};
int operator >= (element& value) {
return ( OnCompare() >= 0 );
};
int operator <= (element& value) {
return ( OnCompare() <= 0 );
};
int operator > (element& value) {
return ( OnCompare() == 1 );
};
int operator != (element& value) {
return ( OnCompare() != 0 );
};
private:
virtual void OnDestroy(T* value);
virtual T* OnCreate (T& value);
virtual int OnCompare (T& value);
T* m_value;
};
Redyson
Новичок
4/4/2008, 8:26:42 PM
maxdiversexnarod1
Специалист
4/5/2008, 3:35:14 AM
По поводу ошибки ничего сказать не могу, но вот тут маленькая помарка:
CODE T* operator[]( int row ) {
if ( row >= 0 && row [b]<=[/b] m_width ) {
Всё-таки строгое неравенство должно быть :)
CODE T* operator[]( int row ) {
if ( row >= 0 && row [b]<=[/b] m_width ) {
Всё-таки строгое неравенство должно быть :)
DELETED
Акула пера
4/5/2008, 6:05:19 AM
(maxdiverSxn1 @ 04.04.2008 - время: 23:35) if ( row >= 0 && row <= m_width )
М-да? А еще раз подумать? Вот если очень хорошо еще раз подумать? :)
Redyson, он манифест хочет. А нафига? Создайте проект Win32->Console->Not using MFC, ATL, without precompiled header, et cetera.
М-да? А еще раз подумать? Вот если очень хорошо еще раз подумать? :)
Redyson, он манифест хочет. А нафига? Создайте проект Win32->Console->Not using MFC, ATL, without precompiled header, et cetera.
maxdiversexnarod1
Специалист
4/7/2008, 1:19:00 AM
JeyLo
Надумал только то, что вылезет за пределы массива :)
(при row==m_width)
Надумал только то, что вылезет за пределы массива :)
(при row==m_width)
DELETED
Акула пера
4/12/2008, 5:52:37 PM
(maxdiverSxn1 @ 06.04.2008 - время: 21:19) Надумал только то, что вылезет за пределы массива :)
(при row==m_width)
Не надо забывать про адресацию.
(при row==m_width)
Не надо забывать про адресацию.
maxdiversexnarod1
Специалист
4/14/2008, 1:18:55 AM
JeyLo
ггг я и не забывал ))
вот берём матрицу размера 3x4, как в твоём примере, и берём matr, она возвращает не NULL, а палево: 0xfdfdfdfd, а всё потому, что m_matrix размером 3, т.е. от 0 до 2, т.е. matr вылез за пределы массива
ггг я и не забывал ))
вот берём матрицу размера 3x4, как в твоём примере, и берём matr, она возвращает не NULL, а палево: 0xfdfdfdfd, а всё потому, что m_matrix размером 3, т.е. от 0 до 2, т.е. matr вылез за пределы массива
DELETED
Акула пера
4/14/2008, 10:45:40 PM
Я чего-то не понял?