Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в алфавитном порядке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Прошу помощи в решении задачи. Дана строка, состоящая из английских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в алфавитном порядке.

Решение задачи: «Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в алфавитном порядке»

textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
static char* next_word(char* s, char** e);
static char* swap_word(char* p1, char* e1, char* p2, char* e2, char** le);
char* sort_words_abc(char* s);
 
 
int main(void){
    char s[] = "D python PHP COBOL Pascal ADA Lisp perl algol c basic APL Java";
    puts(s);
    puts( sort_words_abc(s) );
    return 0;
}
 
//сортировка слов по-алфавиту(ASCII)
char* sort_words_abc(char* s){
    char* a, *b, *f, *l, *p, *e;
 
    a = next_word(s, &b);
    if(a == NULL)
        return s;
 
    for(; *a; ){
        p = a;
        e = b;
        f = b;
        while((f = next_word(f, &l)) != NULL){
            if(toupper(f[0]) < toupper(p[0])){
                p = f;
                e = l;
            }
            f = l;
        }
 
        if(p != a)
            a = swap_word(a, b, p, e, &b);
        else {
            a = next_word(b, &b);
            if(a == NULL)
                break;
        }
    }
    return s;
}
 
//выделение слова
static char* next_word(char* s, char** e){
    char* p;
    while(*s && !isalpha(*s))
        ++s;
 
    p = s;
    while(*p && isalpha(*p))
        ++p;
 
    if(p != s){
        *e = p;
        return s;
    }
    return NULL;
}
 
//обмен слов
static char* swap_word(char* p1, char* e1, char* p2, char* e2, char** le){
    char* p, c;
    for(;p2 != e2; ++p2, ++p1, ++e1){
        for(p = p2; p > p1; --p){
            c  = *p;
            *p = *(p - 1);
            *(p - 1) = c;
        }
    }
 
    for(--e2; p1 != e1; --e1){
        for(p = p1; p < e2; ++p){
            c  = *p;
            *p = *(p + 1);
            *(p + 1) = c;
        }
    }
    *le = e1;
    return p1;
}

Объяснение кода листинга программы

  1. В первой функции main мы имеем массив строк s, который содержит список слов, которые нужно отсортировать по алфавиту.
  2. Во второй функции sort_words_abc мы сортируем слова в массиве s. Мы используем функции next_word и swap_word для разделения слов и их перестановки в правильном порядке.
  3. Функция next_word используется для выделения слов из строки. Она проходит по строке и возвращает указатель на первое букву следующего слова, игнорируя все символы, которые не являются буквами.
  4. Функция swap_word используется для обмена двух слов в массиве. Она проходит по двум словам и меняет их местами, используя цикл for.
  5. В основной функции main мы вызываем функцию sort_words_abc с аргументом s. Эта функция возвращает отсортированную версию исходного массива s. Мы выводим исходный массив и отсортированный массив на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.364 из 5
Похожие ответы