Поменять местами самое большое и самое маленькое слово - C (СИ)
Формулировка задачи:
Задача в том, чтобы в строке, которая приходит из мейн в эту функцию, найти и поменять местами самое длинное и самое короткое слова. Ну а затем вернуть это обратно в форме строки)
Я предполагаю, что надо разделить входящую строку стртоком, затем посчитать количество букв в каждом слове. Но вот как дальше менять их местами и возвращать обратно всё в виде строки - я не понимаю, подскажите, пожалуйста)
Часть функции такова:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char text[256], text1[256]; char razd_2[]="!!"; char sep[]={'!', ' ', '?', ',', '.'}; char *a; int i=0; int b[100]; gets(text); strcpy(text1, text); a = strtok(text1, sep); while(a!=0) { puts(a); b[i] = strlen(a); printf("%d\n", b[i]); a = strtok (NULL, sep); } return 0; }
Решение задачи: «Поменять местами самое большое и самое маленькое слово»
textual
Листинг программы
#include <stdio.h> void long_short_word(char str[], int n); int main(void) { char strr1[]="Ineed some help from you guy s!"; // строка, где самое длинное в начале, а короткое в конце char strr2[]="I need some help fromyou guys!"; // строка, где самое короткое в начале, а длинное дальше long_short_word(strr1, 31); puts("\n=================================================\n"); long_short_word(strr2, 31); puts("\nPress Enter to stop!"); getchar(); return 0; } void long_short_word(char str[], int n) // n - длинна строки { char ss[32]={0}; char big=0, lit=11, adr_big, adr_lit, flag_word; int i,j,k=0, delt_a, delt_l; printf("String in ::::::: %s\n",str); for(i=0; i<n; i++) // начинаем поиск самого длинного и самого короткого слова в строке { if(((str[i] >= 'A')&&(str[i] <= 'Z')) || ((str[i] >= 'a')&&(str[i] <= 'z'))) // полагаем словом непрерывные цепочки ascii символов { flag_word=1; // флаг того, что читается слово k++; // счетчик длинны слова } else flag_word=0; // слово прочитано if((flag_word==0)&&(k)) // слово прочтино, но счетчик не пуст { if(k > big) { big=k; // длина большого слова adr_big = i-k; // индексный адрес его начала } if(k < lit) { lit=k; adr_lit = i-k; } k=0; } } if(adr_big < adr_lit) // если длинное слово находится раньше, короткого { delt_a = adr_lit - adr_big; delt_l = big-lit; k=0; for(i=0; i < n; i++) { if(i < adr_big) // условия формирования результата, т.е. строки (массива ss) где слова меняются местами ss[i] = str[i]; else if((i>=adr_big)&&(i < adr_big + lit)) ss[i] = str[i + delt_a]; else if((i >= adr_big + lit)&&(i + delt_l< adr_lit)) ss[i] = str[i + delt_l]; else if((i + delt_l >= adr_lit)&&(i + delt_l < adr_lit + big)) ss[i] = str[i + delt_l - delt_a]; else if(i + delt_l >= adr_lit + big) ss[i] = str[i]; } } else // если короткое слово находится раньше в строке { delt_a = adr_big - adr_lit; delt_l = big-lit; k=0; for(i=0; i < n; i++) { if(i < adr_lit) ss[i] = str[i]; else if((i>=adr_lit)&&(i < adr_lit + big)) ss[i] = str[i + delt_a]; else if((i >= adr_lit + big)&&(i - delt_l < adr_big)) ss[i] = str[i - delt_l]; else if((i - delt_l >= adr_big)&&(i - delt_l <= adr_big + lit)) ss[i] = str[i- delt_a - delt_l]; else if(i - delt_l > adr_big + lit) ss[i] = str[i]; } } printf("String out :::::: %s",ss); }
Объяснение кода листинга программы
В данном коде реализована функция, которая меняет местами самое большое и самое маленькое слово в строке. Список действий:
- Входные данные (строка) проходят через цикл, в котором определяется длина каждого слова.
- Если текущий символ является буквой, то увеличивается счетчик слова.
- Если текущий символ не является буквой, то предыдущее слово считается короткими, а текущий символ - длинным словом.
- Если слово короче, чем текущий максимум, то это становится новым максимумом.
- Если слово длиннее, чем текущий минимум, то это становится новым минимумом.
- Если слово короче, чем минимум, но длиннее, чем максимум, то они меняются местами.
- Если слово короче, чем минимум, то оно вставляется в конец результирующей строки.
- Если слово длиннее, чем максимум, то оно вставляется в начало результирующей строки.
- Если слово короче, чем минимум, но длиннее, чем максимум, то оно вставляется в середину результирующей строки.
- Если слово короче, чем минимум, то оно вставляется в конец результирующей строки.
- Если слово длиннее, чем максимум, то оно вставляется в начало результирующей строки.
- Если слово короче, чем минимум, но длиннее, чем максимум, то оно вставляется в середину результирующей строки.
- Результат выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д