Задача: Сортировка по убыванию [Строки и субстроки]

Тема в разделе "C/C++/C#", создана пользователем Refrator, 12 ноя 2010.

  1. Refrator

    Refrator Гость

    Нужно написать прогу которая отсортирует по убыванию данные.Сначало вводится число,которая указывает на количество массивов,которые будут вводится,а вторую линию сами массивы:
    Вводим
    3
    333333 66
    888888 99
    111111 44

    Выводит
    888888 99
    333333 66
    111111 44

    Сортирует по числам правой части,а если 2 числа будут равны ,сортирует по числам в левой части.

    Я пробовал ,но у меня не получается даже вводит массивы

     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Давай сначало определимся, какие данные сортируем, у тебя что то про "строку" встретилось, но в коде как я понимаю рассматривается число....
    И еще фраза "количество массивов" - то ли это реально ко-во массив, то ли это все же размер массива, буду исходить из того что это все же у тебя кол-во массиво

    Теперь рассмотрим твой код:
    Тут все логично, определяешь i и вводишь в нее кол-во "кол-во массивов"
    А далье я вижу
    Хотя определения А я не нашел, но т.к. ты говорил про ко-во массив и судя по коду- наверное это все же строка (char*), а сортируемые данные у тебя тогда выходит что - символы (char)

    следовательно,
    Код (C++):
    #include<iostream>
    using namespace std;
    int main ()
    {
    char**a; //Наш массив строк или другими словами : Массив указателей на массив символов
    int i;
    cin>>i;
    //Когда мы получили кол-во массивов, то обязаны динамически выделить память под массив строк
    a = new char*[i];
    //Теперь к твоему вводу данных
    getchar(); //Уберем последний символ с потока он у нас '\n'
    for(int r=0;r<i;r++)
    {
    a[r] = new char[128]; //Выделим память для строки 128-символов (включая нулевой) - максимум
    gets(a[r]); //И получаем строку     
    }

    //Вывод на экран что бы ты увидел что вышло
    cout<<endl<<"A: = {"<<endl;
    for (int r = 0; r< i; r++)
    {
    cout<<a[r]<<endl;
    }
    cout<<"}";

    //Ну а теперь к сортировки там например
    for (int j = 0; j<i; j++) //Перебираем массив строк
    {
    for (int k = 0; k<strlen(a[j]); k++) //Перебираем каждый символ строки
    {
    for (int m = k+1; m<strlen(a[j]); m++) //Вложиным перебираем каждый символ строки от символа k+
    {
    if ((unsigned char)a[j][k] < (unsigned char)a[j][m]) //Если текущий символ k < следующего то меняем символы местами
    {
    char Temp = a[j][k];
    a[j][k] = a[j][m];
    a[j][m] = Temp;
    }

    }
    }
    }

    //Вывод на экран что бы ты увидел что вышло
    cout<<endl<<"A: = {"<<endl;
    for (int r = 0; r< i; r++)
    {
    cout<<a[r]<<endl;
    }
    cout<<"}";

    return 0;
    }
     

    Вложения:

    • zd39099_1.jpg
      zd39099_1.jpg
      Размер файла:
      55,4 КБ
      Просмотров:
      7
  3. ALDon

    ALDon Гость

     
  4. Refrator

    Refrator Гость

    DarkKnight125,мне нужно отсортировать по убыванию,а этот код сортирует возрастанию
     
  5. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Не работает ??? В чем "Не рабочее состояние его проявляется?"

    Код сортирует символы строки по убыванию, я просо из задания точно так и не понял что должно сортироваться ;-)))
    Если опишишь дословно, что сортировать надо, то исравлю конечно, у тебя просто в конт. примере показанно (сортировка строк), а в задании :
    ну посчитал все же что это все же то что лежит внутри массивов
     
  6. ALDon

    ALDon Гость

    Этот код ничего не делает а только выводит ввод.Не понял или у меня с студиой не в порядке
     
  7. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    Я всё равно не понял что надо сортировать ;)
     
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ааа... Понял ;-)) Тоже не сразу дошло ;-)))
    Сортировать нужно сначало поправой части идущей после пробела ;-))
    xxxxxxxx yyy
    Типо Order by yyy, xxxxxxxx
    Щас погоди, переделаю ;-)
     
  9. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот держи...
    Важно : Еще раз напомню, что мы сравниваем строки, так что например "57" > "562", размерность тоесть должна быть одинаковая
    если нужно будет именно целочисленные типы сравнивать то нужно преобразовывать например atoi-функцией.

    Код (C++):
    /*
    codeby.net
    Autor: DarkKnight125
    */

    #include<iostream>
    using namespace std;

    int main ()
    {
    setlocale(LC_ALL,"Russian"); //Переведем локаль в кодовую страницу .1251
    char**a; //Наш массив строк или другими словами : Массив указателей на массив символов
    int i;
    cout<<"Введите размерность массива : ";
    cin>>i;
    //Когда мы получили кол-во массивов, то обязаны динамически выделить память под массив строк
    a = new char*[i];
    //Теперь к твоему вводу данных
    getchar(); //Уберем последний символ с потока он у нас '\n'
    cout<<"Введите массивы : "<<endl;
    for(int r=0;r<i;r++)
    {
    a[r] = new char[128]; //Выделим память для строки 128-символов (включая нулевой) - максимум
    gets(a[r]); //И получаем строку     
    }

    //Вывод на экран что бы ты увидел что вышло   
    cout<<endl<<"Массив A: = {"<<endl;
    for (int r = 0; r< i; r++)
    {
    cout<<a[r]<<endl;
    }
    cout<<"}";


    //Ну а теперь к сортировки там например
    char buffer[80]; //Введем буферную переменную
    for (int j = 0; j<i; j++) //Перебираем массив строк
    {
    for (int k =j+1; k<i; k++) //Перебираем массив строк, но со след. строки
    {
    bool isCross = false; //Переменная замены - если тру то нужно менять местами строки
    char *k1 = strstr(a[j]," ")+1; char *k2 = strstr(a[k]," ")+1; //*может понадобиться* если нужно будет сравнивать числовые типы
    if (strcmp(strstr(a[j]," "),strstr(a[k]," ")) < 0) //Сравним строки от пробельного символа
    isCross = true; //Если 1 строка меньше следующей то нужно менять
    else if (strcmp(strstr(a[j]," "),strstr(a[k]," ")) ==0)
    if(strncmp(a[j],a[k],strlen(a[j])-strlen(strstr(a[j]," "))) < 0) //Сравним строки до пробельного символа
    isCross = true; //Та же история что и вверху

    if (isCross) //Если нужно менять то
    {
    strcpy(buffer,a[j]); //Запишим j-ю строку в буфер
    strcpy(a[j],a[k]); //Запишим k строку в j
    strcpy(a[k],buffer); //Запишим буфер в k строку
    }
    }
    }

    //Вывод на экран что бы ты увидел что вышло
    cout<<endl<<"Результат после сортировки:";
    cout<<endl<<"A: = {"<<endl;
    for (int r = 0; r< i; r++)
    {
    cout<<a[r]<<endl;
    }
    cout<<"}";

    return 0;
    }
     

    Вложения:

    • zd39099.jpg
      zd39099.jpg
      Размер файла:
      61,3 КБ
      Просмотров:
      7
Загрузка...
Похожие Темы - Задача Сортировка по
  1. Exilien
    Ответов:
    2
    Просмотров:
    3.154
  2. Янчик
    Ответов:
    0
    Просмотров:
    489
  3. TrishaRay
    Ответов:
    1
    Просмотров:
    783
  4. elzim
    Ответов:
    0
    Просмотров:
    932
  5. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.127

Поделиться этой страницей