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

  • Автор темы PrimatYarik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

PrimatYarik

#1
Задача состоит в том, чтоб пользователь ввел английский алфавит с клавиатуры, программа должна разделить на гласные и согласные.
После чего Сортировать оба списка по алфавиту и вывести на екран. У меня все работает кроме одного пункта: гласные сортирует и выводит нормально, но вот согласныесортирует все кроми одной буквы. Если повторить сортировку 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();
}
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
P

PrimatYarik

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


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

DarkKnight

Well-known member
01.08.2010
653
0
#4
Немного не верный подход выбран....
Смотри, лучше сделать по другому....
Предположим, что пользователь должен, но не обязан вводить весь алфавит..... А следовательно массив с гласными и согласными не будет равен 6 и 20....
А массив ввода не обязан иметь 25 символов поэтому сделать лучше так....
1.
C++:
	 char vvod[128]; //массив для ввода //127 - символов макс + нулевой
char gl[128]; //массив для гласных вдруг все 127 символов гласные
char sgl[128]; //массив для согласных вдруг все 127 символов согласные
Это место заменим как ввод строки, а не посимвольно
C++:
cin.getline(vvod,127); //Где 127 указывает на макс. кол-во элементов, что бы буфер не переполнился
C++:
	  for(i=0; i<=25; i++){
if(isGl(vvod[i])) {gl[k] = vvod[i]; k++;} 

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

}
Это все оставим так же, как раз из этого получим k и j - размерность массивов главных и согласных

C++:
/*gl[6] = */ sort(gl, k-1); //Я тут вообще у вас не понял зачем было с функции возвращать тип char 
/*sgl[20] =*/ sort(sgl, j-1); 


cout<<"Glasnie:\n";
for(i=0; i<k; i++){
cout<<gl[i]<<"\n";
}
cout<<"Soglasnie:\n";
for(i=0; i<j; i++){
cout<<sgl[i]<<"\n";
}
И все должно работать верно... Я правда полностью функцию сортировки не смотрел, но на первый взлгяд она верна
 
R

Rififi

#5
Решение на 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
 
P

PrimatYarik

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

DarkKnight

Well-known member
01.08.2010
653
0
#7
2 PrimatYarik : Ок... Завтра с самого утра обязательно посмотрю...
 
P

PrimatYarik

#8
спасибо всем, ошибку я нашел, она всетаки в сортировке!
 
Статус
Закрыто для дальнейших ответов.