Напечатать все слова, отличные от последнего - C (СИ)
Формулировка задачи:
Дана строка, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними совами - не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразив каждое из них по след правилу: если слово нечётной длины, то удалять его среднюю букву
Решение задачи: «Напечатать все слова, отличные от последнего»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <stdbool.h> #include <ctype.h> bool cmpstring(const char str1[], const char str2[]){ int i=0; while(str1[i] == str2[i] && str1[i]!='\0' && str2[i]!='\0') i++; if (str1[i]=='\0' && str2[i]=='\0') return true; else return false; } int main(){ struct word{ int index; char name[256]; int count; }; struct word w[30]; char s[]="sdfsdfsdf sdfsdfsdf some sometest sometester sometest sometesteer omfghf some."; int i=0,j=0, cw=0; bool inWord=true; for(i=0; i<strlen(s); i++){ if(s[i]!=' ' && (isalpha(s[i]))){ if(inWord){ cw++; inWord=false; j=0; } }else{ inWord=true; w[cw].count=j; w[cw].index=cw; } if(isalpha(s[i])) { w[cw].name[j++]=s[i]; } } for (i=0; i<cw+1; i++){ printf("\n %d %s %d", w[i].index,w[i].name, w[i].count); } for (j=0,i=0;i<cw;i++){ switch (cmpstring(w[cw].name,w[i].name)){ case true: printf("\nWORD INDEX %d TRUE ", w[i].index); break; case false: printf("\nWORD INDEX %d FALSE ", w[i].index); if (w[i].count%2){ for(j=0;j<abs(w[i].count/2);j++){ printf("%c", w[i].name[j]); } for(++j;j<strlen(w[i].name);j++){ printf("%c",w[i].name[j]); } } break; } } printf("\nwords: %d\n",cw); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , , . - Создаем функцию cmpstring, которая сравнивает два массива символов и возвращает true, если они равны, и false в противном случае.
- Создаем структуру word, которая содержит поля index, name и count.
- Создаем массив w из 30 структур word.
- Задаем строку s и инициализируем переменные i, j и cw.
- Проходим по каждому символу строки s и проверяем, является ли он буквой. Если да, то проверяем, находится ли он в слове.
- Если символ является буквой и он первый в слове (то есть inWord равно true), то увеличиваем значение cw на 1 и устанавливаем inWord в false.
- Если символ является буквой и inWord равно false, то устанавливаем inWord в true и сохраняем текущее значение j в w[cw].count.
- Если символ является буквой, то сохраняем его в w[cw].name.
- После прохода по всем символам строки s, печатаем значения w[i].name, w[i].count и w[i].index для каждого i от 0 до cw.
- Затем проходим по всем i от 0 до cw-1 и проверяем, равны ли w[i].name и w[cw].name.
- Если они равны, то печатаем
WORD INDEX i TRUE
и выводим w[i].name. - Если они не равны, то печатаем
WORD INDEX i FALSE
и выводим w[i].name. - Если w[i].count нечетное, то печатаем
...
между w[i].name. - В конце программы печатаем значение cw.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д