Проблема с сортировкой массива

Тема в разделе "C/C++/C#", создана пользователем PrimatYarik, 16 дек 2010.

Статус темы:
Закрыта.
  1. PrimatYarik

    PrimatYarik Гость

    Задача состоит в том, чтоб пользователь ввел английский алфавит с клавиатуры, программа должна разделить на гласные и согласные.
    После чего Сортировать оба списка по алфавиту и вывести на екран. У меня все работает кроме одного пункта: гласные сортирует и выводит нормально, но вот согласныесортирует все кроми одной буквы. Если повторить сортировку 2 раза то все правильно, но вот если один - сортирует массив весь кроме первого
    елемента :( Помогите найти ошибкуВот исходник:
    Код (C++):
    #include <conio.h>
    #include <iostream>
    using namespace std;

    char sort(char array[], int col){ //Ф-ция сортировки пузырьком
    int i, k, j;
    char men, bil; //переменные для большего и менньшего значений
    for(i=1, j=0, k=0; k<=col; i++, j++){
    if(array[i] < array[j]){
    men = array[i];
    bil = array[j];
    array[j] = men;
    array[i] = bil;
    }        
    if(i==col){
    k++;
    i=1;
    j=0;}  
    }
    }

    bool isGl(char ch){ //возвращает true если переменная содержит гласную
    return (ch == 'a' || ch == 'i' || ch == 'e' || ch == 'o' || ch == 'y' || ch == 'u');
    }
    bool isSogl(char ch){ //возвращает true если переменная содержит согласную
    return (ch == 'b' || ch == 'c' || ch == 'd' || ch == 'f' || ch == 'g' || ch == 'h' || ch == 'j' || ch == 'k' || ch == 'l' || ch == 'm' || ch == 'n' || ch == 'p' || ch == 'q' || ch == 'r' || ch == 's' || ch == 't' || ch == 'v' || ch == 'w' || ch == 'x' || ch == 'z');
    }


    main(){

    char vvod[26]; //массив для ввода
    char gl[6]; //массив для гласных
    char sgl[20]; //массив для согласных
    M1: int i, k=0, j=0, key;
    cout<<"Enter english alfavet:\n";

    for(i=0; i<=25; i++){
    cin>>vvod[i];
    }

    for(i=0; i<=25; i++){
    if(isGl(vvod[i])) {gl[k] = vvod[i]; k++;}

    if(isSogl(vvod[i])) {sgl[j] = vvod[i]; j++;}

    }

    gl[6] = sort(gl, 5);
    sgl[20] = sort(sgl, 19);


    cout<<"Glasnie:\n";
    for(i=0; i<6; i++){
    cout<<gl[i]<<"\n";
    }
    cout<<"Soglasnie:\n";
    for(i=0; i<20; i++){
    cout<<sgl[i]<<"\n";
    }
    getch();
    }
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Объясните пожалуйста вашу логику в этой записи

    А так же вот в этой
     
  3. PrimatYarik

    PrimatYarik Гость

    gl[6] = sort(gl, 5); - используем нашу же ф-цию для сортировки массива gl и передаем ей в качестве значений массив и максимальный индекс массива. Так как массив gl содержит максимум 6 значений то и максимальный индекс = 5. Аналогично и с sgl[20] = sort(sgl, 19);


    Выводит массивово gl и sgl на экран.
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Немного не верный подход выбран....
    Смотри, лучше сделать по другому....
    Предположим, что пользователь должен, но не обязан вводить весь алфавит..... А следовательно массив с гласными и согласными не будет равен 6 и 20....
    А массив ввода не обязан иметь 25 символов поэтому сделать лучше так....
    1.
    Код (C++):
         char vvod[128]; //массив для ввода //127 - символов макс + нулевой
    char gl[128]; //массив для гласных вдруг все 127 символов гласные
    char sgl[128]; //массив для согласных вдруг все 127 символов согласные
    Это место заменим как ввод строки, а не посимвольно
    Код (C++):
    cin.getline(vvod,127); //Где 127 указывает на макс. кол-во элементов, что бы буфер не переполнился
    Это все оставим так же, как раз из этого получим k и j - размерность массивов главных и согласных

    И все должно работать верно... Я правда полностью функцию сортировки не смотрел, но на первый взлгяд она верна
     
  5. Rififi

    Rififi Гость

    Решение на C++

    Код (C++):
    #include <locale>
    #include <string>
    #include <iostream>
    #include <functional>
    #include <algorithm>
    #include <iterator>

    /*
    Задача состоит в том, чтоб пользователь ввел английский алфавит с клавиатуры, программа должна разделить на гласные и согласные.
    После чего Сортировать оба списка по алфавиту и вывести на екран.
    */


    struct is_vowel : public std::unary_function<char, bool>
    {
    bool operator()(char ch) const
    {
    ch = std::tolower(ch, std::locale());
    return vowels_.find(ch) != std::string::npos;
    }

    static const std::string vowels_;
    };

    const std::string is_vowel::vowels_ = "aeiou";

    template <typename Iterator>
    std::basic_string<typename std::iterator_traits<Iterator>::value_type>
    make_sorted_string(Iterator begin, Iterator end)
    {
    std::basic_string<typename std::iterator_traits<Iterator>::value_type> s(begin, end);
    std::sort(s.begin(), s.end());
    return s;
    }

    int main()
    {
    setlocale(LC_ALL, "");

    std::string s;
    //std::getline(std::cin, s);
    s = "ZYXWVUTSRQPONMLKJIHGFEDCBA";

    const std::string::iterator it = std::partition(s.begin(), s.end(), is_vowel());

    std::cout << make_sorted_string(s.begin(), it) << std::endl;
    std::cout << make_sorted_string(it, s.end()) << std::endl;

    return 0;
    }
    вывод:
    AEIOU
    BCDFGHJKLMNPQRSTVWXYZ
     
  6. PrimatYarik

    PrimatYarik Гость

    Спасибо за первый ответ, он очень помог, однако полная сортировка происходит только с о второго раза=((
    Не могли бы поискать ошибку в сортироке, пожалуйста.. :sorry: :sorry: :newconfus: :newconfus:
     
  7. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2 PrimatYarik : Ок... Завтра с самого утра обязательно посмотрю...
     
  8. PrimatYarik

    PrimatYarik Гость

    спасибо всем, ошибку я нашел, она всетаки в сортировке!
     
Загрузка...
Похожие Темы - Проблема сортировкой массива
  1. c0de3r
    Ответов:
    5
    Просмотров:
    126
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    135
  3. SoulPaladin
    Ответов:
    4
    Просмотров:
    130
  4. Artael
    Ответов:
    1
    Просмотров:
    110
  5. ENSLER
    Ответов:
    0
    Просмотров:
    102
Статус темы:
Закрыта.

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