ВОПРОС · Q&A

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

8 ответов 10,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

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

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

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

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

#include<iostream>
using namespace std;
int main (){
int i;
cin>>i;
for(int r=0;r<i;r++)
cin>>a; // каксделать ввод ,вот так?
return 0;
}
 
Нужно написать прогу которая отсортирует по убыванию данные.Сначало вводится число,которая указывает на количество массивов,которые будут вводится,а вторую линию сами массивы:
Давай сначало определимся, какие данные сортируем, у тебя что то про "строку" встретилось, но в коде как я понимаю рассматривается число....
И еще фраза "количество массивов" - то ли это реально ко-во массив, то ли это все же размер массива, буду исходить из того что это все же у тебя кол-во массиво

Теперь рассмотрим твой код:
C++:
#include<iostream>
using namespace std;
int main (){
int i;
cin>>i;
Тут все логично, определяешь i и вводишь в нее кол-во "кол-во массивов"
А далье я вижу
C++:
for(int r=0;r<i;r++)
cin>>a[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
    32,1 КБ · Просмотры: 245
DarkKnight125,мне нужно отсортировать по убыванию,а этот код сортирует возрастанию
 
Цитата:
этот код не работает,исправь пож-ста, мне то же интересно как решается это задача
Не работает ??? В чем "Не рабочее состояние его проявляется?"

DarkKnight125,мне нужно отсортировать по убыванию,а этот код сортирует возрастанию
Код сортирует символы строки по убыванию, я просо из задания точно так и не понял что должно сортироваться ;-)))
Если опишишь дословно, что сортировать надо, то исравлю конечно, у тебя просто в конт. примере показанно (сортировка строк), а в задании :
отсортирует по убыванию данные,
ну посчитал все же что это все же то что лежит внутри массивов
 
Этот код ничего не делает а только выводит ввод.Не понял или у меня с студиой не в порядке
 
Я всё равно не понял что надо сортировать ;)
 
Ааа... Понял ;-)) Тоже не сразу дошло ;-)))
Сортировать нужно сначало поправой части идущей после пробела ;-))
xxxxxxxx yyy
Типо Order by yyy, xxxxxxxx
Щас погоди, переделаю ;-)
 
Вот держи...
Важно : Еще раз напомню, что мы сравниваем строки, так что например "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
    35,7 КБ · Просмотры: 599