Поменять местами слова в строке - C (СИ)
Формулировка задачи:
В каждой строке текста поменять местами самое длинное и самое короткое слово.
Максимум находит правильно, но вот я не понимаю, как определить минимум и потом поменять максимум и минимум местами и обратно собрать исходный текст
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #include <string.h>
- int main ()
- { const int n=100;
- char s[n][n], max_str[n], min_str[n];
- char *istr;
- int i,j, len, count=0;
- printf ("введи текст (Enter - закончить)\n");
- for (i=0; i<n; i++)
- {
- gets (s[count]);
- if (s[count][0] == '\0')
- break;
- count = count + 1;
- }
- printf ("\nИсходный текст:\n");
- for (i=0; i<n; i++)
- {
- puts (s[i]);
- if (s[i][0] == '\0')
- break;
- }
- for (i=0; i<n; i++)
- {
- if (s[i][0] == '\0')
- break;
- istr = strtok (s[i], " ");
- while (istr != NULL)
- {
- printf ("\n%s”,istr);
- len = strlen (istr);
- if (len > strlen(max_str))
- {
- strcpy (max_str, istr);
- }
- if (len<strlen(min_str))
- {
- strcpy (min_str, istr);
- }
- istr = strtok (NULL," ");
- }
- printf ("\n Самое длинное %d-й строки : %s", i+1, max_str);
- printf ("\n Самое короткое %d-й строки : %s", i+1, min_str);
- printf ("\n");
- strcpy (max_str, "");
- strcpy (min_str, "");
- }
- getch();
- }
Решение задачи: «Поменять местами слова в строке»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <string.h>
- int main(int argc, char** argv)
- {
- static char sstr[3][256] = {
- "one1 two1 three four11 five six1 seven eight nine ten\0",
- "C++ is an object oriented programming language\0",
- "ansi C is a precursor of C++\0" };
- for (int r = 0; r < 3; r++)
- {
- int min_i = -1, max_i = min_i;
- int min_len = -1, max_len = min_len;
- for (int i = 0; sstr[r][i] != '\0'; i++)
- if ((sstr[r][i] == ' ') || (sstr[r][i + 1] == '\0'))
- {
- int k = i - 1;
- while ((sstr[r][k] != ' ') && (k > 0)) k--;
- int wlen = k > 0 && i < strlen(sstr[r]) - 1 ? \
- abs(k - i) - 1 : abs(k - i);
- if (wlen < min_len || min_len == -1)
- {
- min_len = wlen;
- min_i = (k > 0) ? k + 1 : 0;
- }
- if (wlen > max_len || max_len == -1)
- {
- max_len = wlen;
- max_i = (k > 0) ? k + 1 : 0;
- }
- }
- char* temp_w1 = (char*)calloc(max_len, sizeof(char));
- strncpy(temp_w1, &sstr[r][max_i], max_len);
- char* temp_w2 = (char*)calloc(min_len, sizeof(char));
- strncpy(temp_w2, &sstr[r][min_i], min_len);
- int diff = abs(min_len - max_len);
- int count = diff;
- while (--count >= 0)
- {
- int i = max_i;
- while (i < strlen(sstr[r]))
- sstr[r][i++] = sstr[r][i + 1];
- }
- temp_w2[min_len] = '\0';
- min_i = strstr(sstr[r], temp_w2) - sstr[r];
- strncpy(&sstr[r][max_i], temp_w2, min_len);
- count = diff;
- while (--count >= 0)
- {
- int i = strlen(sstr[r]) - 1;
- while (i >= min_i)
- {
- sstr[r][i + 1] = sstr[r][i];
- i--;
- }
- }
- strncpy(&sstr[r][min_i], temp_w1, max_len);
- printf("%s\n", sstr[r]);
- }
- _getch();
- return 0;
- }
Объяснение кода листинга программы
В данном коде происходит перестановка слов в строке:
- В первой строке объявляется статическая строка sstr типа char, размером 3 на 256 символов, содержащая три строки текста.
- Далее, в цикле for перебираются все строки в массиве sstr.
- Внутри цикла, ищется пара слов в строке, которые находятся не на своих местах (определяется по количеству пробелов до и после слова).
- Затем, эти слова меняются местами, с помощью операций копирования и переноса символов.
- В конце программы, выводится на экран результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д