1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

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

    PrimatYarik Гость

    Репутация:
    0
    Задача состоит в том, чтоб пользователь ввел английский алфавит с клавиатуры, программа должна разделить на гласные и согласные.
    После чего Сортировать оба списка по алфавиту и вывести на екран. У меня все работает кроме одного пункта: гласные сортирует и выводит нормально, но вот согласныесортирует все кроми одной буквы. Если повторить сортировку 2 раза то все правильно, но вот если один - сортирует массив весь кроме первого
    елемента :( Помогите найти ошибкуВот исходник:
    Код:
    #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

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

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

    PrimatYarik Гость

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


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

    DarkKnight Well-Known Member

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

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

    Rififi Гость

    Репутация:
    0
    Решение на 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 Гость

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

    DarkKnight Well-Known Member

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

    PrimatYarik Гость

    Репутация:
    0
    спасибо всем, ошибку я нашел, она всетаки в сортировке!
     
Загрузка...
Похожие Темы - Проблема сортировкой массива
  1. pack
    Ответов:
    5
    Просмотров:
    65
  2. Alex1994
    Ответов:
    7
    Просмотров:
    125
  3. PingvinPingvin
    Ответов:
    10
    Просмотров:
    132
  4. Free2playman
    Ответов:
    14
    Просмотров:
    157
  5. Дмитрий17
    Ответов:
    10
    Просмотров:
    212
Статус темы:
Закрыта.

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