Вставить самое короткое слово в начало самой короткой строки с помощью указателей - C (СИ)

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

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

Помогите,пожалуйста,решить задачу. Найти самое короткое слово и вставить его, если возможно, в начало самой короткой строки с помощью указателей. Исходный массив строк ввести с помощью инициализации.

Решение задачи: «Вставить самое короткое слово в начало самой короткой строки с помощью указателей»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
#define M 100
// Найти самое короткое слово и вставить его, если возможно, в начало самой короткой строки с помощью указателей.
char* func(char* , int*);
int main()
{
    char str[N][M] = {"You're basic,but hard define Simple yet somehow sublime Knew you would strike again.",
                    "Things keep ending up this way come and get off Another notch has come to way",
                    "In the thoughts of mass decay Funny how things end up this way"};
    char* word, *fin;
    int minWord = M, minLine = M, x, y, q, len, i, j, *min;
    min = &minWord;
    q = minWord;
    for(i = 0; i < N; i++){
        len = strlen(str[i]);
        if(len < minLine){
        minLine = len;
            x = i;
        }
        word = func(str[i], min);
        if(minWord < q){
            q = minWord;
            fin = word;
            y = i;
        }
    }
    minLine += q;
    if(minLine <= M){
        str[x][minLine--] = '\0';
        for(i = minLine, j = minLine - q; j >= 0; i--, j--)
            str[x][i] = str[x][j];
        if(x == y)
            fin += q;
        for( ;i >= 0; i--)
            str[x][i] = *fin--;
        for(i = 0; i < N; i++)
            puts(str[i]);
    }
    else
        puts("Impossible. Not enough line length.");
    return 0;
}
char* func(char* arr, int* min)
{
    char delim[] = " ,.?!();:\n\0", *p, *first, *last, *f;
    int flag = 0, sym = 1;
    for(p = arr; *p; p++, sym = 1){
        for(int j = 0; delim[j]; j++)
            if(*p == delim[j])
                sym = 0;
        if(sym){
            if(!flag){
                first = p;
                flag = 1;
            }
            if(*(p + 1) == '\0'){
                last = p;
                if(last - first + 1 < *min){
                    *min = last - first + 1;
                    f = last;
                }
            }
        }
        else{
            if(flag){
                last = p - 1;
                flag = 0;
                if(last - first + 1 < *min){
                    *min = last - first + 1;
                    f = last;
                }
            }
        }
    }
    return f;
}

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

  1. Программа должна вставить самое короткое слово в начало самой короткой строки с помощью указателей.
  2. В функции func используется цикл for, который проходит по каждому символу входной строки.
  3. Переменная sym используется для отслеживания наличия разделителя в текущем слове.
  4. Если в текущем слове нет разделителей, то оно считается самым коротким словом и сохраняется в переменной f.
  5. Функция func возвращает самое короткое слово.
  6. В функции main используются циклы for для нахождения самой короткой строки и самого короткого слова.
  7. Переменная min используется для отслеживания длины самого короткого слова.
  8. Если самая короткая строка имеет длину меньше M, то самое короткое слово вставляется в начало этой строки.
  9. Если самая короткая строка имеет длину больше или равную M, то выводится сообщение об невозможности вставки слова.
  10. В цикле for выводятся все строки после вставки самого короткого слова.

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

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