Top.Mail.Ru
Ответы

Работает через одно место. Задача на СИ.

задание - отсортировать массив символов что бы с одной стороны были согласные и с другой гласные. Затем нужно это все отсортировать методом "прямой выбор" по возрастанию. (сам хз зачем ) вроде все сортирует но выводит раздельно. Сначала первая половина, а потом вторая но уже на следующей строке. Не понимаю что не так. Помогите пж .



#include <malloc.h>
#include <stdio.h>

int getarr(char *arr,const int size);
int sorting(char *arr,const int size);
int sortingsize(char *arr,const int size,const int middle );
int main()
{

int size;

scanf("%d",&size);size++;

char *arr = (char*)malloc((size) * sizeof(char));;

getarr(arr,size);
int x=sorting(arr,size);
sortingsize(arr,size,x);
for(int i = 0 ; i < size ; i++ ){
printf("%c",arr[i]);
}

return 0;
}

int getarr(char *arr,const int size){
for(int i = 0; i < size; i++) {
scanf("%c", &arr[i]);
}
return 0;
}
int sorting(char *arr,const int size){
int x=0;
char temp;
for (int i = 0;i<size;i++){

switch(arr[i]){

case 'A':
case 'a':
case 'E':
case 'e':
case 'I':
case 'i':
case 'O':
case 'o':
case 'U':
case 'u':

temp = arr[x];
arr[x]=arr[i];
arr[i]=temp;
x++;
break;

}
}
return x;
}

int sortingsize(char *arr,const int size,const int middle ){
char temp=0;
for(int i=0;i!=middle;i++){
for(int j=i;j<middle;j++){
if(arr[i]>arr[j]){
temp = arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}

}
for(int i=middle+1;i<size;i++){
for(int j=i;j<middle;j++){
if(arr[i]>arr[j]){
temp = arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}

}
return 0;
}

По дате
По рейтингу
Аватар пользователя
Новичок

Я думаю, что сначала вам нужно переместить согласные вправо, а гласные влево, при этом сохранив их последовательность в слове и вывести результат. Затем отсортировать все буквы слова по возрастанию. Как-то так...

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
 #include <stdbool.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

#define BUFFER 0x1000

_Bool is_vowel(char letter) { 
    const char* vowels = "AaEeIiOoUuYy"; 
    size_t i = 0; 
    while (vowels[i]) { 
        if (letter == vowels[i]) return true; 
        ++i; 
    } 
    return false; 
}

int compare(const void* pa, const void* pb) { 
    char a = *((char*)pa); 
    char b = *((char*)pb); 
    if (is_vowel(a) && !is_vowel(b)) return 1; 
    if (!is_vowel(a) && is_vowel(b)) return -1; 
    return 0; 
}

void consonants_and_vowels(char* word) { 
    qsort(word, strlen(word), sizeof(word[0]), compare); 
}

void swap(char* pa, char* pb) { 
    char tmp = *pa; 
    *pa = *pb; 
    *pb = tmp; 
}

void selection_sort(char* word) { 
    size_t n = strlen(word), i, k, j; 
    if (!n) return; 
    for (i = 0; i < n - 1; ++i) { 
        k = i; 
        for (j = i + 1; j < n; ++j) { 
            if (word[j] < word[k]) { 
                k = j; 
            } 
        } 
        swap(&word[i], &word[k]); 
    } 
}

int main(void) { 
    char word[BUFFER] = {0}; 
    printf("word: "); 
    scanf("%s", word); 
    consonants_and_vowels(word); 
    puts(word); 
    selection_sort(word); 
    puts(word); 
    return 0; 
} 

P.S. Явно задавать длину слова и создавать под него динамический массив не имеет смысла. Вряд ли вам нужно в консоль вводить слово длиннее, чем стек процесса, к тому же буфер консоли всё-равно значительно меньше.