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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. static char* next_word(char* s, char** e);
  4. static char* swap_word(char* p1, char* e1, char* p2, char* e2, char** le);
  5. char* sort_words_abc(char* s);
  6.  
  7.  
  8. int main(void){
  9.     char s[] = "D python PHP COBOL Pascal ADA Lisp perl algol c basic APL Java";
  10.     puts(s);
  11.     puts( sort_words_abc(s) );
  12.     return 0;
  13. }
  14.  
  15. //сортировка слов по-алфавиту(ASCII)
  16. char* sort_words_abc(char* s){
  17.     char* a, *b, *f, *l, *p, *e;
  18.  
  19.     a = next_word(s, &b);
  20.     if(a == NULL)
  21.         return s;
  22.  
  23.     for(; *a; ){
  24.         p = a;
  25.         e = b;
  26.         f = b;
  27.         while((f = next_word(f, &l)) != NULL){
  28.             if(toupper(f[0]) < toupper(p[0])){
  29.                 p = f;
  30.                 e = l;
  31.             }
  32.             f = l;
  33.         }
  34.  
  35.         if(p != a)
  36.             a = swap_word(a, b, p, e, &b);
  37.         else {
  38.             a = next_word(b, &b);
  39.             if(a == NULL)
  40.                 break;
  41.         }
  42.     }
  43.     return s;
  44. }
  45.  
  46. //выделение слова
  47. static char* next_word(char* s, char** e){
  48.     char* p;
  49.     while(*s && !isalpha(*s))
  50.         ++s;
  51.  
  52.     p = s;
  53.     while(*p && isalpha(*p))
  54.         ++p;
  55.  
  56.     if(p != s){
  57.         *e = p;
  58.         return s;
  59.     }
  60.     return NULL;
  61. }
  62.  
  63. //обмен слов
  64. static char* swap_word(char* p1, char* e1, char* p2, char* e2, char** le){
  65.     char* p, c;
  66.     for(;p2 != e2; ++p2, ++p1, ++e1){
  67.         for(p = p2; p > p1; --p){
  68.             c  = *p;
  69.             *p = *(p - 1);
  70.             *(p - 1) = c;
  71.         }
  72.     }
  73.  
  74.     for(--e2; p1 != e1; --e1){
  75.         for(p = p1; p < e2; ++p){
  76.             c  = *p;
  77.             *p = *(p + 1);
  78.             *(p + 1) = c;
  79.         }
  80.     }
  81.     *le = e1;
  82.     return p1;
  83. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы