Напишите программу, которая переворачивает все слова в строке - 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;
- }
Объяснение кода листинга программы
- Ввод строки с помощью функции gets(p).
- Определение длины строки с помощью функции strlen(p) и сохранение ее в переменную u.
- Перебор всех символов строки с помощью цикла while (i < u).
- Проверка условия для каждого симвома:
- Если символ является пробелом, переворачивание слов не требуется.
- Если символ является буквой верхнего регистра, переворачивание слов не требуется.
- Если символ является буквой нижнего регистра, переворачивание слов не требуется.
- Если символ является любым другим символом, происходит переворачивание слов.
- Переворачивание слов происходит с помощью двух вложенных циклов while:
- Внешний цикл для перебора символов от начала строки до текущего символа (n).
- Внутренний цикл для перебора символов от k до (n + ((i - n) / 2)) - 1, где k - это индекс первого символа слова, которое нужно перевернуть.
- Перестановка символов в слове с помощью временной переменной c.
- Обновление индексов для следующего символа внешнего цикла.
- После завершения внешнего цикла, переворачивание слов происходит с помощью двух вложенных циклов while:
- Внешний цикл для перебора символов от начала строки до половины длины строки (n + (u - n) / 2) - 1.
- Внутренний цикл для перестановки символов в словах, которые были перевернуты в предыдущем цикле.
- Вывод перевернутой строки с помощью цикла for и функции printf.
- Ожидание нажатия клавиши с помощью функции system(
pause
). - Возврат 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д