Alone User | |
|
Помогите, пожалуйста! Необходимо отсортировать строчный массив по длине содержащихся в нем строк методом обмена ("пузырьковым")... Я вот накатал, только ни фига не работает... Что не так? 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 | |
|
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 | |||
|
1) char s[20] - это не массив строк, это одна строка. 2) если бы это был строчный массив и необходимо отсортировать по длине, то делатся это должно приблизительно так.
копировать строки здесь совершенно не нужно. В массиве строк char ** array все элементы указатели и их можно легко изменять, а не копируя строки. 3) Это не С++, это Си. Это сообщение отредактировал ddd13 - 19-01-2008 - 22:08 |
maxdiversexnarod1 | |
|
ddd13 Прочитай код в первом посте Там char s[20] - это вообще временная переменная для обмена строк. А сортируется arr[][], которая вполне возможно объявлена как char arr[100][20] и потому здесь никакие обмены пойнтеров не годятся. И наконец, этот код можно полноправно называть C++ в силу обратной совместимости Это сообщение отредактировал maxdiversexnarod1 - 20-01-2008 - 13:59 |
|
RTFM
1. Уж явно массив объявлен как char** или char*[] 2. А что делать программе, если строка больше, чем 19 букаф? 3. А почему не char arr[99][20] или char arr[101][20]? |
maxdiversexnarod1 | |
|
Ну дык :) Мы же решаем обычную тупую универскую/школьную зодачку, а в них как-то принято массивы делать по 100 элементов, ну строчки в принципе тоже длиной по 100 можно, другое дело что тестируют вбивая уж никак не больше 20 буков, а на такие "мелочи", как нехватка размера массива всем пофиг - лишь бы сортировало :) [added] И для меня совсем не очевидно, что "строчный массив" не двумерный массив, а именно массив указателей :) Это что ж, мы должны выделить в хипе память, туда считать строку, и положить указатель в массив? И это человеку, который не может написать пузырек? Это сообщение отредактировал maxdiversexnarod1 - 24-01-2008 - 22:13 |
Alone User | |
|
У меня новая проблема. Дано такое задание: "Создайте параметризованный класс - матрицу. Определите конструкторы, деструктор, перегруженные операторы =, [] и функцию для изменения размера матрицы. Продемонстрируйте работу с созданным шаблоном класса". Ну вот, вроде как половину сделал. Не получается только почему-то функцию написать. Вот что намучал: #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 | |||
|
эээ... в какие дебри тебя занесло... и вообще букафмного... ик!... а может сделать Rows и Columns приватными переменными класса, и память под массив выделять динамически? Тогда все получится. При этом правда способ обращения в элементу матрицы несколько усложнится и функция изменения размера матрицы будет не очень простая, но сработает наверняка. ЗЫ. А вообще я не знаю. Я не сишник, это к JeyLo. Может там есть какая-нить специальная конструкция специально для этих целей?... ик!.. Это сообщение отредактировал mvf23 - 03-04-2008 - 03:40 |
|
ща напишем.
|
|
|
|
По уму, конечно, нужно инкапсулировать и элементы... Типа такого:
|
maxdiversexnarod1 | |||
|
По поводу ошибки ничего сказать не могу, но вот тут маленькая помарка:
Всё-таки строгое неравенство должно быть :) |
|
М-да? А еще раз подумать? Вот если очень хорошо еще раз подумать? :) Redyson, он манифест хочет. А нафига? Создайте проект Win32->Console->Not using MFC, ATL, without precompiled header, et cetera. |
maxdiversexnarod1 | |
|
JeyLo Надумал только то, что вылезет за пределы массива :) (при row==m_width) Это сообщение отредактировал maxdiversexnarod1 - 06-04-2008 - 21:19 |
|
Не надо забывать про адресацию. |
maxdiversexnarod1 | |
|
JeyLo ггг я и не забывал )) вот берём матрицу размера 3x4, как в твоём примере, и берём matr[3], она возвращает не NULL, а палево: 0xfdfdfdfd, а всё потому, что m_matrix размером 3, т.е. от 0 до 2, т.е. matr[3] вылез за пределы массива |
|
Я чего-то не понял?
|
Рекомендуем почитать также топики: технология EV-DO (SkyLink) Agile Messenger 3.75 Как бороться с http://lix.in Нужна помощь в оптимизации компа Дельфи |