Взрослая социальная сеть
Поиск секса поблизости, а также
тематические знакомства и виртуальное общение

ВХОД РЕГИСТРАЦИЯ
Все о сексе Секс чат Блоги Группы

Страницы: (1) 1
Мужчина 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
Прочитай код в первом посте wink.gif
Там char s[20] - это вообще временная переменная для обмена строк.
А сортируется arr[][], которая вполне возможно объявлена как char arr[100][20] и потому здесь никакие обмены пойнтеров не годятся.

И наконец, этот код можно полноправно называть C++ в силу обратной совместимости wink.gif

Это сообщение отредактировал maxdiversexnarod1 - 20-01-2008 - 13:59

Свободен
24-01-2008 - 11:54
QUOTE (maxdiversexnarod1 @ 20.01.2008 - время: 12:57)
Прочитай код в первом посте wink.gif
Там char s[20] - это вообще временная переменная для обмена строк.
А сортируется arr[][], которая вполне возможно объявлена как char arr[100][20] и потому здесь никакие обмены пойнтеров не годятся.

RTFM
QUOTE
Необходимо отсортировать строчный массив по длине содержащихся в нем строк

1. Уж явно массив объявлен как char** или char*[]
2. А что делать программе, если строка больше, чем 19 букаф?
3. А почему не char arr[99][20] или char arr[101][20]? wink.gif
Мужчина maxdiversexnarod1
Свободен
24-01-2008 - 22:08
Ну дык :)
Мы же решаем обычную тупую универскую/школьную зодачку, а в них как-то принято массивы делать по 100 элементов, ну строчки в принципе тоже длиной по 100 можно, другое дело что тестируют вбивая уж никак не больше 20 буков, а на такие "мелочи", как нехватка размера массива всем пофиг - лишь бы сортировало :)

[added]
И для меня совсем не очевидно, что "строчный массив" не двумерный массив, а именно массив указателей :)
Это что ж, мы должны выделить в хипе память, туда считать строку, и положить указатель в массив? И это человеку, который не может написать пузырек? no_1.gif

Это сообщение отредактировал 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)

wink.gif
Не надо забывать про адресацию. wink.gif
Мужчина maxdiversexnarod1
Свободен
13-04-2008 - 21:18
JeyLo
ггг я и не забывал ))
вот берём матрицу размера 3x4, как в твоём примере, и берём matr[3], она возвращает не NULL, а палево: 0xfdfdfdfd, а всё потому, что m_matrix размером 3, т.е. от 0 до 2, т.е. matr[3] вылез за пределы массива

Свободен
14-04-2008 - 18:45
Я чего-то не понял?
0 Пользователей читают эту тему

Страницы: (1) 1 ...
  Наверх