Вставить самое короткое слово в начало самой короткой строки с помощью указателей - 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;
- }
Объяснение кода листинга программы
- Программа должна вставить самое короткое слово в начало самой короткой строки с помощью указателей.
- В функции
func
используется циклfor
, который проходит по каждому символу входной строки. - Переменная
sym
используется для отслеживания наличия разделителя в текущем слове. - Если в текущем слове нет разделителей, то оно считается самым коротким словом и сохраняется в переменной
f
. - Функция
func
возвращает самое короткое слово. - В функции
main
используются циклыfor
для нахождения самой короткой строки и самого короткого слова. - Переменная
min
используется для отслеживания длины самого короткого слова. - Если самая короткая строка имеет длину меньше
M
, то самое короткое слово вставляется в начало этой строки. - Если самая короткая строка имеет длину больше или равную
M
, то выводится сообщение об невозможности вставки слова. - В цикле
for
выводятся все строки после вставки самого короткого слова.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д