Напечатать все слова, отличные от последнего - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: , , , .
  2. Создаем функцию cmpstring, которая сравнивает два массива символов и возвращает true, если они равны, и false в противном случае.
  3. Создаем структуру word, которая содержит поля index, name и count.
  4. Создаем массив w из 30 структур word.
  5. Задаем строку s и инициализируем переменные i, j и cw.
  6. Проходим по каждому символу строки s и проверяем, является ли он буквой. Если да, то проверяем, находится ли он в слове.
  7. Если символ является буквой и он первый в слове (то есть inWord равно true), то увеличиваем значение cw на 1 и устанавливаем inWord в false.
  8. Если символ является буквой и inWord равно false, то устанавливаем inWord в true и сохраняем текущее значение j в w[cw].count.
  9. Если символ является буквой, то сохраняем его в w[cw].name.
  10. После прохода по всем символам строки s, печатаем значения w[i].name, w[i].count и w[i].index для каждого i от 0 до cw.
  11. Затем проходим по всем i от 0 до cw-1 и проверяем, равны ли w[i].name и w[cw].name.
  12. Если они равны, то печатаем WORD INDEX i TRUE и выводим w[i].name.
  13. Если они не равны, то печатаем WORD INDEX i FALSE и выводим w[i].name.
  14. Если w[i].count нечетное, то печатаем ... между w[i].name.
  15. В конце программы печатаем значение cw.
  16. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы