Поменять местами самое большое и самое маленькое слово - 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);
}

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

В данном коде реализована функция, которая меняет местами самое большое и самое маленькое слово в строке. Список действий:

  1. Входные данные (строка) проходят через цикл, в котором определяется длина каждого слова.
  2. Если текущий символ является буквой, то увеличивается счетчик слова.
  3. Если текущий символ не является буквой, то предыдущее слово считается короткими, а текущий символ - длинным словом.
  4. Если слово короче, чем текущий максимум, то это становится новым максимумом.
  5. Если слово длиннее, чем текущий минимум, то это становится новым минимумом.
  6. Если слово короче, чем минимум, но длиннее, чем максимум, то они меняются местами.
  7. Если слово короче, чем минимум, то оно вставляется в конец результирующей строки.
  8. Если слово длиннее, чем максимум, то оно вставляется в начало результирующей строки.
  9. Если слово короче, чем минимум, но длиннее, чем максимум, то оно вставляется в середину результирующей строки.
  10. Если слово короче, чем минимум, то оно вставляется в конец результирующей строки.
  11. Если слово длиннее, чем максимум, то оно вставляется в начало результирующей строки.
  12. Если слово короче, чем минимум, но длиннее, чем максимум, то оно вставляется в середину результирующей строки.
  13. Результат выводится на экран.

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


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

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

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