Напечатать все слова, отличные от последнего - 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, чтобы указать, что программа успешно завершилась.