Напишите программу, которая переворачивает все слова в строке - C (СИ)

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

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

Добрый день. Проблема в том, что программа проходит успешно только 8 из 14 тестов - в остальных пишет "ошибка выполнения". Мне посоветовали сделать массив глобальным. Но я только начала учить Си, так что понятия не имею что это. Объясните, пожалуйста, что и где нужно дописать, чтобы сделать массив глобальным и что это вообще значит. Большое спасибо. Текст задания: Напишите программу, которая переворачивает все слова в строке. Символы, отличные от латинских букв должны остаться на месте. Вводится одна строка, завершающаяся символом конца строки '\n'. Длина строки менее 1000. Моя программа:
#include<stdio.h>
#include<string.h>
//#include<conio.h>
int main()
{char p[1100],*h;
int i,g,n,u,c,k,v;
u=0;i=0;n=0;c=0;k=0;
gets(p);
u=strlen(p);
while(i<u)
  {if(p[i]==' ' || p[i] < 65 || (p[i] > 90 && p[i]< 97) || p[i]> 122 )
   {k=n;
    while(k<=(n+((i-n)/2))-1)
     {c=p[k];p[k]=p[i-1+n-k];
      p[i-1+n-k]=c;k=k+1;
     }
     n=i+1;i++;
   }
   else
    i=i+1;
  }k=n;
while(k<=(n+(u-n)/2)-1)
 {c=p[k];p[k]=p[u-1+n-k];
  p[u-1+n-k]=c;k++;
 }
for(h=p;*h<=u;h++)
printf("",&h);
puts(p);
//getch();
return 0;
}
Сейчас попробовала объявить массив как unsigned char - программа прошла на 2 теста больше, чем в прошлый раз, но в остальных по-прежнему ошибка выполнения.

Решение задачи: «Напишите программу, которая переворачивает все слова в строке»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char p[1100], *h;
   int i = 0, n = 0, u = 0, c = 0, k = 0;
 
   gets(p);
   u = strlen(p);
   while (i < u)
   {
      if (p[i] == ' ' || p[i] < 65 || (p[i] > 90 && p[i] < 97) || p[i] > 122)
      {
         k = n;
         while (k <= (n + ((i - n) / 2)) - 1)
         {
            c = p[k];
            p[k] = p[i - 1 + n - k];
            p[i - 1 + n - k] = c;
            k++;
         }
         n = i + 1;
      }
      i++;
   }
   k = n;
   while (k <= (n + (u - n) / 2) - 1)
   {
      c = p[k];
      p[k] = p[u - 1 + n - k];
      p[u - 1 + n - k] = c;
      k++;
   }
 
   for (h = p; *h; h++)
   {
      printf("%c", *h);
   }
   printf("\n");
 
   system("pause");
 
   return 0;
}

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

  1. Ввод строки с помощью функции gets(p).
  2. Определение длины строки с помощью функции strlen(p) и сохранение ее в переменную u.
  3. Перебор всех символов строки с помощью цикла while (i < u).
  4. Проверка условия для каждого симвома:
    • Если символ является пробелом, переворачивание слов не требуется.
    • Если символ является буквой верхнего регистра, переворачивание слов не требуется.
    • Если символ является буквой нижнего регистра, переворачивание слов не требуется.
    • Если символ является любым другим символом, происходит переворачивание слов.
  5. Переворачивание слов происходит с помощью двух вложенных циклов while:
    • Внешний цикл для перебора символов от начала строки до текущего символа (n).
    • Внутренний цикл для перебора символов от k до (n + ((i - n) / 2)) - 1, где k - это индекс первого символа слова, которое нужно перевернуть.
    • Перестановка символов в слове с помощью временной переменной c.
    • Обновление индексов для следующего символа внешнего цикла.
  6. После завершения внешнего цикла, переворачивание слов происходит с помощью двух вложенных циклов while:
    • Внешний цикл для перебора символов от начала строки до половины длины строки (n + (u - n) / 2) - 1.
    • Внутренний цикл для перестановки символов в словах, которые были перевернуты в предыдущем цикле.
  7. Вывод перевернутой строки с помощью цикла for и функции printf.
  8. Ожидание нажатия клавиши с помощью функции system(pause).
  9. Возврат 0, что означает успешное выполнение программы.

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

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