Поменять местами самое длинное и самое короткое слово - 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;
- }
Объяснение кода листинга программы
- В функции swap_min_max() происходит поиск двух самых длинных слов в строке s.
- Для этого используется цикл, который проходит по каждому символу строки.
- Если текущий символ является первым символом слова, которое не является разделителем (пробел или знак препинания), то увеличивается счетчик k, отслеживающий длину текущего слова.
- Если текущий символ является последним символом слова, и предыдущий символ не является разделителем, то это слово считается одним из самых длинных, и его индексы сохраняются в переменных n1, p1, e1 и n2, p2, e2.
- Если после прохода по всем символам строки в переменных n1 и n2 не было найдено ни одного слова, или n1 == n2, то функция возвращает исходную строку без изменений.
- Если были найдены два разных слова, то они меняются местами с помощью двух вложенных циклов.
- В первом цикле слова перемещаются влево, а во втором - вправо.
- В конце функции возвращается измененная строка.
- В функции main() строка s изначально содержит текст
Для работы программы введите,пожалуйста
. - После выполнения функции swap_min_max() строка s содержит
ечаг,пожалуйста
. - Затем строка s изменяется на
begin (APACHE) <- -> {IIS}, over
, и после выполнения функции swap_min_max() становитсяover,begin (APACHE) <- -> {IIS}
. - В конце программы строка s содержит
Заранее спасибо! Буду очень благодарен.
, а после выполнения функции swap_min_max() становится!ударь благодар спасибо Заранее
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д