Форум программистов, компьютерный форум, киберфорум
Наши страницы
acmades
Войти
Регистрация
Восстановить пароль
Рейтинг: 1.00. Голосов: 1.

С++ «Неделя вторая - Алгоритмы - Сортировка целых чисел по модулю, Сортировка без учета регистра» #16

Запись от acmades размещена 05.08.2017 в 22:56

Идем дальше. Курс: «Основы разработки на C++: белый пояс»
Начало в начале блога ))))
Сортировка целых чисел по модулю
Задание:
В стандартном потоке дана одна строка, состоящая из N + 1 целых чисел. Первым числом идёт само число N. Далее следуют ещё N чисел, обозначим их за массив A. Между собой числа разделены пробелом.
Отсортируйте массив А по модулю и выведите его в стандартный поток.

Ограничения
0 <= N <= 1000
-1000000 <= A[i] <= 1000000

Примеры
Вход - > Выход
2 -4 3 -> 3 -4
3 1 -3 2 -> 1 2 -3

Моё решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main() {
    int N, num;
    vector<int> v; //тут храним введенные числа
    cin >> N; //узнаем количество чисел
    for (N; N > 0; --N) {
        cin >> num; //считываем числа
        v.push_back(num); //добавляем в вектор
    }
    //для сортировки используем изученную функцию sort
    //в качестве параметра сортировки будет лямбда-функция (третий аргумент)
    sort(begin(v), end(v), [](const int& x, const int& y) {
        //в уроках до этого не было рассказано о функции нахождения модуля...
        //а писать свою неохота было, поэтому просто спросил инет про модуль, выдал - abs()
        return abs(x) < abs(y); //сортировка будет от меньшего к большему (по модулю)
    });
    for (const auto& i : v) { 
        cout << i << " "; //выводим отсортированные числа
    }
    return 0;
}
тут добавить нечего.

Сортировка без учета регистра
Задание:
В стандартном потоке дана одна строка, состоящая из числа N и следующих за ним N строк S. Между собой число и строки разделены пробелом.
Отсортируйте строки S в лексикографическом порядке по возрастанию, игнорируя регистр букв, и выведите их в стандартный поток вывода.

Ограничения
0 <= N <= 1000
1 <= |S| <= 15
Каждая строка S[i] может состоять из следующих символов: [0-9,a-z,A-Z]
Примеры
stdin - > stdout
2 q A -> A q
3 a C b -> a b C

Моё решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cctype> //для transform
using namespace std;
string str_to_low(const string& s) { //перевод строки в нижний регистр
    string result;
    for (auto i : s) { //все буквы
        result += tolower(i); //вставляем в новую строку в нижнем регистре
    }
    return result; //возвращаем новую строку в нижнем регистре
}
bool srt(string x, string y) {
    //по хорошему использовать бы функцию transform
    //трансформирования строки и перевести все символы в нижний регистр
    /*transform(x.begin(), x.end(), x.begin(), tolower);
    transform(y.begin(), y.end(), y.begin(), tolower);
    return x < y;*/
    //но проверку не пройдет(не знаю почему), поэтому...
    return str_to_low(x) < str_to_low(y); //сортировка будет от меньшего к большему (без учета регистра)
}
int main() {
    int N;
    string str;
    vector<string> v; //тут храним введенные строки
    cin >> N; //узнаем количество строк
    for (N; N > 0; --N) {
        cin >> str; //считываем строки
        v.push_back(str); //добавляем в вектор
    }
    //для сортировки используем изученную функцию sort
    sort(begin(v), end(v), srt);
    for (const auto& i : v) {
        cout << i << " "; //выводим отсортированные строки
    }
    return 0;
}
Всё получилось ))))
Продолжение следует...
Всего комментариев 7
Комментарии
  1. Старый комментарий
    А как вам такой вариант, он очень схож с вашим, но мне кажется, что писанины чуть меньше.
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;
    string Decrease(string& s) { // тут все как у вас, пишу доп. функцию
        string tomain;
        for (auto& i : s) {
            tomain += tolower(i);
        }
        return tomain;
    }
     
    int main()
    {
        int quantity;// кол-во вводимых значений
        string SortingString;// сами значения
        vector <string> AddingDatabase; //куда без вектора, хотел через множества, но я не стал разбираться с найстройкой сортировки
        cin >> quantity;
        for (; quantity > 0; quantity--) {
            cin >> SortingString;
                    AddingDatabase.push_back(SortingString);
        } sort(begin(AddingDatabase), end(AddingDatabase), []( string& str1,  string& str2) {
            return Decrease(str1) < Decrease (str2); /* вот тут и значительные изменения, не стал выносить все в отдельную функцию, а просто сделал лямбду*/
        }); // ну а дальше все проще пареной репы
        for (const auto& item : AddingDatabase) {
            cout << item << " ";
        }
     
        return 0;
    }
    Запись от Albatrosso размещена 08.08.2017 в 11:43 Albatrosso вне форума
    Обновил(-а) Albatrosso 08.08.2017 в 11:47
  2. Старый комментарий
    Цитата:
    Сообщение от Albatrosso Просмотреть комментарий
    А как вам такой вариант, он очень схож с вашим, но мне кажется, что писанины чуть меньше.
    Да нет )))) писанины столько же. У меня комментариев много просто. Функцию srt тоже мог вынести в "лямбду", но если комментарии убрать, то кода почти столько же (разница в пару слов). Кроме того я просто хотел показать, что можно вообще обойтись без дополнительной функции str_to_low, но по какой то причине coursera не хочет принимать transform(может на данном этапе не предусмотрено или я накосячил).
    Запись от acmades размещена 08.08.2017 в 16:50 acmades вне форума
  3. Старый комментарий
    Цитата:
    Сообщение от acmades Просмотреть комментарий
    Да нет )))) писанины столько же. У меня комментариев много просто. Функцию srt тоже мог вынести в "лямбду", но если комментарии убрать, то кода почти столько же (разница в пару слов). Кроме того я просто хотел показать, что можно вообще обойтись без дополнительной функции str_to_low, но по какой то причине coursera не хочет принимать transform(может на данном этапе не предусмотрено или я накосячил).
    скорее дело в косяке, курсера приняла у меня min на первой неделе, когда нужно было найти минимальную из строк, а значит им побоку как мы решаем задачи, им важно чтобы мы соблюли все условия. Если бы было указано, что transform использовать нельзя, то так оно и было бы.
    Запись от Albatrosso размещена 11.08.2017 в 10:17 Albatrosso вне форума
  4. Старый комментарий
    полагаю, что продолжения у блога не будет, жаль. На первых парах ваши посты лично мне очень помогли. Именно из ваших постов я очень много полезного узнал.
    Запись от Albatrosso размещена 20.08.2017 в 18:29 Albatrosso вне форума
  5. Старый комментарий
    Цитата:
    Сообщение от Albatrosso Просмотреть комментарий
    полагаю, что продолжения у блога не будет, жаль. На первых парах ваши посты лично мне очень помогли. Именно из ваших постов я очень много полезного узнал.
    Будет ))) Завтра выложу еще 2 недели учебы.
    Запись от acmades размещена 20.08.2017 в 19:02 acmades вне форума
  6. Старый комментарий
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    using namespace std;
     
    bool gt_abs(int i,int j) { 
        return (abs(i)<abs(j)); 
    }
     
     
    int main(){
        int n = 0;
        cin >> n;
        int temp = 0;
        vector<int> v;
        for (int i=0;i<n;i++){
            cin >> temp;
            v.push_back(temp);
        }
        sort(v.begin(),v.end(),gt_abs);
        for (int i=0;i<v.size();i++){
            cout << v.at(i)<<" ";
        }
        return 0;
    }
    Запись от flash_back размещена 23.10.2017 в 13:04 flash_back вне форума
  7. Старый комментарий
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <ctype.h>
     
    using namespace std;
     
    string str_low(string s){
        transform(s.begin(), s.end(), s.begin(), tolower);
        return s;
    }
     
    bool gt_abs(string s1,string s2) { 
        return (str_low(s1)<str_low(s2)); 
    }
     
    int main(){
        int n = 0;
        cin >> n;
        string temp = "";
        vector<string> v;
        for (int i=0;i<n;i++){
            cin >> temp;
            v.push_back(temp);
        }
        
        sort(v.begin(),v.end(),gt_abs);
     
        for (int i=0;i<v.size();i++){
            cout << v.at(i)<<" ";
        }
     
        return 0;
    }
    Запись от flash_back размещена 23.10.2017 в 13:18 flash_back вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru