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

  • Автор темы Refrator
  • Дата начала
R

Refrator

#1
Нужно написать прогу которая отсортирует по убыванию данные.Сначало вводится число,которая указывает на количество массивов,которые будут вводится,а вторую линию сами массивы:
Вводим
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;
}
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Нужно написать прогу которая отсортирует по убыванию данные.Сначало вводится число,которая указывает на количество массивов,которые будут вводится,а вторую линию сами массивы:
Давай сначало определимся, какие данные сортируем, у тебя что то про "строку" встретилось, но в коде как я понимаю рассматривается число....
И еще фраза "количество массивов" - то ли это реально ко-во массив, то ли это все же размер массива, буду исходить из того что это все же у тебя кол-во массиво

Теперь рассмотрим твой код:
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;
}
 

Вложения

R

Refrator

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

DarkKnight

Well-known member
01.08.2010
653
0
#5
Цитата:
этот код не работает,исправь пож-ста, мне то же интересно как решается это задача
Не работает ??? В чем "Не рабочее состояние его проявляется?"

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

ALDon

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

DarkKnight

Well-known member
01.08.2010
653
0
#8
Ааа... Понял ;-)) Тоже не сразу дошло ;-)))
Сортировать нужно сначало поправой части идущей после пробела ;-))
xxxxxxxx yyy
Типо Order by yyy, xxxxxxxx
Щас погоди, переделаю ;-)
 

DarkKnight

Well-known member
01.08.2010
653
0
#9
Вот держи...
Важно : Еще раз напомню, что мы сравниваем строки, так что например "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;
}
 

Вложения