Поменять местами самое длинное и самое короткое слово - C (СИ)

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

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

Друзья,пожалуйста, помогите мне с этой программкой: Пользователь вводит с клавиатуры строку. Необходимо поменять местами самое длинное и самое короткое слово. Мучаюсь с этой программой уже второй день. Она то правильно всё выводит, то нет. Заранее спасибо! Буду очень благодарен
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
void X_NAME(char *str);
 
int main()
{   setlocale(LC_ALL, "Rus");
    printf("Для работы программы введите,пожалуйста, предложение на английском языке!\n");
    char *str;
    str = malloc( sizeof(*str) * 1536 );
    fgets(str,4048,stdin);
    X_NAME(str);
    printf("%s\n", str);
    free( str );
    return 0;
    }

void X_NAME(char *str)
{
    int minStart = 0, minEnd = 0, maxStart = 0, maxEnd = 0;//min_word_start, min_word_End, min_word_Start, min_word_End
    int i = 0;
    int k = 0;
    while ((str[i] != '\0') && (str[i] != ' ') && (str[i] != ',') && (str[i] != '.') && (str[i] != '!') && (str[i] != '?'))
        i++;
    minEnd = i;
    maxEnd = i;
    while (str[i] != '\0')
    {
        while ((str[i] != '\0') && (str[i] != ' ') && (str[i] != ',') && (str[i] != '.') && (str[i] != '!') && (str[i] != '?'))
            i++;
        if ((i-k) > (maxEnd - maxStart))
        {
            maxStart = k;
            maxEnd = i;
            printf("min %d %d  max %d %d\n", minStart, minEnd, maxStart, maxEnd);
        }
        if ((i-k) < (minEnd - minStart))
        {
            minStart = k;
            minEnd = i;
            printf("min %d %d  max %d %d\n", minStart, minEnd, maxStart, maxEnd);
        }
        i++;
        while ((str[i] != '\0') && ((str[i] == ' ') || (str[i] == ',') || (str[i] == '.') || (str[i] == '!') || (str[i] == '?')))
            k++;
        k = i;
    }
 
    printf("min %d %d  max %d %d\n", minStart, minEnd, maxStart, maxEnd);
    char str2[strlen(str)];//С помощью функции мы задаем массив размером введеной пользователем строки.
    if (minStart < maxStart)
    {
        for (i = 0; i < minStart; i++)
            str2[i] = str[i];
        int j = maxStart;
        for (i; i < minStart + maxEnd - maxStart; i++)
            str2[i] = str[j++];
        j = minEnd;
        for (j; j < maxStart; j++)
            str2[i++] = str[j];
        j = minStart;
        for (i, k = i; i < k + minEnd - minStart; i++)
            str2[i] = str[j++];
        for (i; i < strlen(str); i++)
            str2[i] = str[i];
    }
    if (minStart > maxStart)
    {
        for (i = 0; i < maxStart; i++)
            str2[i] = str[i];
        int j = minStart;
        for (i; i < maxStart + minEnd - minStart; i++)
            str2[i] = str[j++];
        j = maxEnd;
        for (j; j < minStart; j++)
            str2[i++] = str[j];
        j = maxStart;
        for (i, k = i; i < k + maxEnd - maxStart; i++)
            str2[i] = str[j++];
        for (i; i < strlen(str); i++)
            str2[i] = str[i];
    }
    if (minStart == maxStart)
        strcpy(str2, str);// функция,которая копирует.
    str2[strlen(str)] = '\0';
    strcpy(str, str2);
}

Решение задачи: «Поменять местами самое длинное и самое короткое слово»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define is_delim(c)  (isspace((c)) || ispunct((c)))
typedef unsigned char uchar;
 
char* swap_min_max(char* s){
    int   n1, n2, k;
    uchar* p1, *p2, *e1, *e2;
    uchar* t, c, *p = (uchar*)s;
 
    //поиск мин/макс слова
    n1 = n2 = k = 0;
    do {
        if(*p && !is_delim(*p))
            ++k;
        else if(k > 0){
            if((k < n1) || !n1){
                n1 = k;
                p1 = p - k;
                e1 = p;
            }
 
            if(k > n2){
                n2 = k;
                p2 = p - k;
                e2 = p;
            }
            k = 0;
        }
    } while(*p++ != '\0');
 
    if(!n1 || !n2 || (p1 == p2))
        return s;
    
    //...
 
    if(p1 > p2){
        t = p1, p1 = p2, p2 = t;
        t = e1, e1 = e2, e2 = t;
    }
 
    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;
        }
    }
    return s;
}
 
int main(void) {
    char s[256];
 
    strcpy(s, "Для работы программы введите,пожалуйста");
    puts(s);
    puts( swap_min_max(s) );
    putchar('\n');
 
    strcpy(s, "begin (APACHE) <- -> {IIS}, over");
    puts(s);
    puts( swap_min_max(s) );
    putchar('\n');
 
    strcpy(s, "Заранее спасибо! Буду очень благодарен.");
    puts(s);
    puts( swap_min_max(s) );
    return 0;
}

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

  1. В функции swap_min_max() происходит поиск двух самых длинных слов в строке s.
  2. Для этого используется цикл, который проходит по каждому символу строки.
  3. Если текущий символ является первым символом слова, которое не является разделителем (пробел или знак препинания), то увеличивается счетчик k, отслеживающий длину текущего слова.
  4. Если текущий символ является последним символом слова, и предыдущий символ не является разделителем, то это слово считается одним из самых длинных, и его индексы сохраняются в переменных n1, p1, e1 и n2, p2, e2.
  5. Если после прохода по всем символам строки в переменных n1 и n2 не было найдено ни одного слова, или n1 == n2, то функция возвращает исходную строку без изменений.
  6. Если были найдены два разных слова, то они меняются местами с помощью двух вложенных циклов.
  7. В первом цикле слова перемещаются влево, а во втором - вправо.
  8. В конце функции возвращается измененная строка.
  9. В функции main() строка s изначально содержит текст Для работы программы введите,пожалуйста.
  10. После выполнения функции swap_min_max() строка s содержит ечаг,пожалуйста.
  11. Затем строка s изменяется на begin (APACHE) <- -> {IIS}, over, и после выполнения функции swap_min_max() становится over,begin (APACHE) <- -> {IIS}.
  12. В конце программы строка s содержит Заранее спасибо! Буду очень благодарен., а после выполнения функции swap_min_max() становится !ударь благодар спасибо Заранее.

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


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

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

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