Alone User Свободен |
06-01-2008 - 23:39 Помогите, пожалуйста! Необходимо отсортировать строчный массив по длине содержащихся в нем строк методом обмена ("пузырьковым")... Я вот накатал, только ни фига не работает... Что не так? char s[20]; for (j=len; j>1; j--) for (i=1; i<=j; i++) if (arr[i]<arr[i+1]) { strcpy(s,arr[i]); strcpy(arr[i],arr[i-1]); strcpy(arr[i-1],s); } Большушее спасибо! |
maxdiversexnarod1 Свободен |
07-01-2008 - 01:44 for(i = n-1 ; i > 0 ; i--) for(j = 0 ; j < i ; j++) if( strlen(A[j]) > strlen(A[j+1]) ) { strcpy(s,arr[i]); strcpy(arr[i],arr[i-1]); strcpy(arr[i-1],s); } |
ddd13 Свободен |
19-01-2008 - 22:02 1) char s[20] - это не массив строк, это одна строка. 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) Это не С++, это Си.
Это сообщение отредактировал ddd13 - 19-01-2008 - 22:08
|
maxdiversexnarod1 Свободен |
20-01-2008 - 13:57 ddd13 Прочитай код в первом посте Там char s[20] - это вообще временная переменная для обмена строк. А сортируется arr[][], которая вполне возможно объявлена как char arr[100][20] и потому здесь никакие обмены пойнтеров не годятся.
И наконец, этот код можно полноправно называть C++ в силу обратной совместимости
Это сообщение отредактировал maxdiversexnarod1 - 20-01-2008 - 13:59 |
Свободен |
24-01-2008 - 11:54
QUOTE (maxdiversexnarod1 @ 20.01.2008 - время: 12:57) | Прочитай код в первом посте Там char s[20] - это вообще временная переменная для обмена строк. А сортируется arr[][], которая вполне возможно объявлена как char arr[100][20] и потому здесь никакие обмены пойнтеров не годятся. |
RTFM
QUOTE | Необходимо отсортировать строчный массив по длине содержащихся в нем строк |
1. Уж явно массив объявлен как char** или char*[] 2. А что делать программе, если строка больше, чем 19 букаф? 3. А почему не char arr[99][20] или char arr[101][20]? |
maxdiversexnarod1 Свободен |
24-01-2008 - 22:08 Ну дык :) Мы же решаем обычную тупую универскую/школьную зодачку, а в них как-то принято массивы делать по 100 элементов, ну строчки в принципе тоже длиной по 100 можно, другое дело что тестируют вбивая уж никак не больше 20 буков, а на такие "мелочи", как нехватка размера массива всем пофиг - лишь бы сортировало :)
[added] И для меня совсем не очевидно, что "строчный массив" не двумерный массив, а именно массив указателей :) Это что ж, мы должны выделить в хипе память, туда считать строку, и положить указатель в массив? И это человеку, который не может написать пузырек?
Это сообщение отредактировал maxdiversexnarod1 - 24-01-2008 - 22:13 |
Alone User Свободен |
03-04-2008 - 02:43 У меня новая проблема. Дано такое задание: "Создайте параметризованный класс - матрицу. Определите конструкторы, деструктор, перегруженные операторы =, [] и функцию для изменения размера матрицы. Продемонстрируйте работу с созданным шаблоном класса". Ну вот, вроде как половину сделал. Не получается только почему-то функцию написать. Вот что намучал: #include <conio.h> #include <iostream> using namespace std;
template <class T, int Rows, int Columns> class matrix { T mtr[Rows][Columns]; public: matrix() { for(int i = 0; i < Rows; i++) for(int j = 0; j < Columns; j++) mtr[i][j] = 0; } matrix(T n[Rows][Columns]) { for(int i = 0; i < Rows; i++) for(int j = 0; j < Columns; j++) mtr[i][j] = n[i][j]; } int* operator [](int i) { return mtr[i]; } 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[i][j] = ob.mtr[i][j]; return *this; }
int main() { int n[2][3] = {{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[i][j]<<'\t'; cout<<'\n'; }
return 0; } |
mvf23 Свободен |
03-04-2008 - 03:40 QUOTE (Alone User @ 03.04.2008 - время: 02:43) | У меня новая проблема. |
эээ... в какие дебри тебя занесло... и вообще букафмного... ик!...
а может сделать Rows и Columns приватными переменными класса, и память под массив выделять динамически? Тогда все получится. При этом правда способ обращения в элементу матрицы несколько усложнится и функция изменения размера матрицы будет не очень простая, но сработает наверняка.
ЗЫ. А вообще я не знаю. Я не сишник, это к JeyLo. Может там есть какая-нить специальная конструкция специально для этих целей?... ик!..
Это сообщение отредактировал mvf23 - 03-04-2008 - 03:40
|
Свободен |
03-04-2008 - 10:06 ща напишем. |
Свободен |
03-04-2008 - 14:14 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; } |
|
Свободен |
03-04-2008 - 14:16 По уму, конечно, нужно инкапсулировать и элементы... Типа такого:
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 Свободен |
04-04-2008 - 16:26 Уважаемый JeyLo! У меня выскакивает ошибка при запуске приведенного кода. Компилируется все нормально, а когда запускаю прогу, выскакивает сообщение:
Что не так? Пользуюсь Microsoft Visual Studio 2005. Большое спасибо!
Это сообщение отредактировал JeyLo - 05-04-2008 - 02:03 |
maxdiversexnarod1 Свободен |
04-04-2008 - 23:35 По поводу ошибки ничего сказать не могу, но вот тут маленькая помарка:
CODE | T* operator[]( int row ) { if ( row >= 0 && row [b]<=[/b] m_width ) { |
Всё-таки строгое неравенство должно быть :)
|
Свободен |
05-04-2008 - 02:05
QUOTE (maxdiversexnarod1 @ 04.04.2008 - время: 23:35) | if ( row >= 0 && row <= m_width ) |
М-да? А еще раз подумать? Вот если очень хорошо еще раз подумать? :)
Redyson, он манифест хочет. А нафига? Создайте проект Win32->Console->Not using MFC, ATL, without precompiled header, et cetera. |
maxdiversexnarod1 Свободен |
06-04-2008 - 21:19 JeyLo Надумал только то, что вылезет за пределы массива :) (при row==m_width)
Это сообщение отредактировал maxdiversexnarod1 - 06-04-2008 - 21:19 |
Свободен |
12-04-2008 - 13:52
QUOTE (maxdiversexnarod1 @ 06.04.2008 - время: 21:19) | Надумал только то, что вылезет за пределы массива :) (при row==m_width) |
Не надо забывать про адресацию. |
maxdiversexnarod1 Свободен |
13-04-2008 - 21:18 JeyLo ггг я и не забывал )) вот берём матрицу размера 3x4, как в твоём примере, и берём matr[3], она возвращает не NULL, а палево: 0xfdfdfdfd, а всё потому, что m_matrix размером 3, т.е. от 0 до 2, т.е. matr[3] вылез за пределы массива |
Свободен |
14-04-2008 - 18:45 Я чего-то не понял? |