Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в алфавитном порядке - 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;
- }
Объяснение кода листинга программы
- В первой функции
main
мы имеем массив строкs
, который содержит список слов, которые нужно отсортировать по алфавиту. - Во второй функции
sort_words_abc
мы сортируем слова в массивеs
. Мы используем функцииnext_word
иswap_word
для разделения слов и их перестановки в правильном порядке. - Функция
next_word
используется для выделения слов из строки. Она проходит по строке и возвращает указатель на первое букву следующего слова, игнорируя все символы, которые не являются буквами. - Функция
swap_word
используется для обмена двух слов в массиве. Она проходит по двум словам и меняет их местами, используя циклfor
. - В основной функции
main
мы вызываем функциюsort_words_abc
с аргументомs
. Эта функция возвращает отсортированную версию исходного массиваs
. Мы выводим исходный массив и отсортированный массив на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д