Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в алфавитном порядке - 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. Мы выводим исходный массив и отсортированный массив на экран.