Задать вопрос
@Misuta

Почему не подсчитывается количество книг с тремя о в название?

// Определить структурный тип, описывающий книги домашней
// библиотеки(автор, название книги, издательство, год издания, стоимость).Заполнить
// структурный массив 10 - ю записями. Переписать из исходного массива в другой массив,
// информацию только о тех книгах, в название которых есть по 3 буквы «о». Затем
// вывести информацию, отсортированную по названию издательства по алфавиту.
// (рационально переставлять все поля структуры разом)

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

// Структура для представления книги
struct Book {
    string author;
    string title;
    string publisher;
    int year;
    double cost;
};

void main() {
    setlocale(LC_ALL, "ru");

    const int size = 1; // Задайте нужный размер массива книг
    Book library[size];

    // Ввод информации по книгам
    for (int i = 0; i < size; ++i) {
        cout << "Введите автора книги " << i + 1 << ": ";
        getline(cin, library[i].author);

        cout << "Введите название книги " << i + 1 << ": ";
        getline(cin, library[i].title);

        cout << "Введите издательство книги " << i + 1 << ": ";
        getline(cin, library[i].publisher);

        cout << "Введите год издания книги " << i + 1 << ": ";
        cin >> library[i].year;

        cout << "Введите стоимость книги " << i + 1 << ": ";
        cin >> library[i].cost;

        cin.ignore(); // Очищаем буфер после ввода чисел
    }

    // Подсчитываем количество книг с тремя буквами 'о' в названии
    int countWithO = 0;
    for (int i = 0; i < size; ++i) {
        int oCount = 0;
        for (char ch : library[i].title) {
            if (tolower(ch) == 'о') {
                oCount++;
            }
        }

        if (oCount == 3) {
            countWithO++;
        }
    }

    // Создаем массив для книг с тремя буквами 'о' в названии
    Book* booksWithO = new Book[countWithO];
    int booksWithOCount = 0;

    // Переписываем информацию только о книгах с тремя буквами 'о' в названии
    for (int i = 0; i < size; ++i) {
        int oCount = 0;
        for (char ch : library[i].title) {
            if (tolower(ch) == 'о') {
                oCount++;
            }
        }

        if (oCount == 3) {
            booksWithO[booksWithOCount++] = library[i];
        }
    }

    // Сортируем массив книг с тремя буквами 'о' в названии по названию издательства
    for (int i = 0; i < booksWithOCount - 1; ++i) {
        for (int j = 0; j < booksWithOCount - i - 1; ++j) {
            if (booksWithO[j].publisher > booksWithO[j + 1].publisher) {
                swap(booksWithO[j], booksWithO[j + 1]);
            }
        }
    }

    // Выводим информацию о книгах с тремя буквами 'о' в названии, отсортированную по названию издательства
    cout << "Информация о книгах с тремя буквами 'о' в названии, отсортированная по названию издательства:" << endl;
    for (int i = 0; i < booksWithOCount; ++i) {
        cout << "Автор: " << booksWithO[i].author << endl;
        cout << "Название: " << booksWithO[i].title << endl;
        cout << "Издательство: " << booksWithO[i].publisher << endl;
        cout << "Год издания: " << booksWithO[i].year << endl;
        cout << "Стоимость: " << booksWithO[i].cost << endl << endl;
    }

    delete[] booksWithO;
}


Не работает подсчет количества книг с тремя о в название. Что я делаю не так?
  • Вопрос задан
  • 105 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
Потому что русские буквы - это Unicode. То есть два символа типа char.
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

// Структура для представления книги
struct Book {
    string author;
    string title;
    string publisher;
    int year;
    double cost;
};

int count_o(const string& title)
{
    int oCount = 0;
    enum { NotO, PossiblyO } state = NotO;
    for (char ch : title) {
        switch (state) {
            case NotO:
                if (ch == 0xFFFFFFD0)
                    state = PossiblyO;
                break;
            case PossiblyO:
                if (ch == 0xFFFFFFBE || ch == 0xFFFFFF9E) {
                    state = NotO;
                    oCount++;
                }
                break;
        }
    }
    return oCount;
}

int main() {
    setlocale(LC_ALL, "ru");

    const int size = 1; // Задайте нужный размер массива книг
    Book library[size];

    // Ввод информации по книгам
    for (int i = 0; i < size; ++i) {
        cout << "Введите автора книги " << i + 1 << ": ";
        getline(cin, library[i].author);

        cout << "Введите название книги " << i + 1 << ": ";
        getline(cin, library[i].title);

        cout << "Введите издательство книги " << i + 1 << ": ";
        getline(cin, library[i].publisher);

        cout << "Введите год издания книги " << i + 1 << ": ";
        cin >> library[i].year;

        cout << "Введите стоимость книги " << i + 1 << ": ";
        cin >> library[i].cost;

        cin.ignore(); // Очищаем буфер после ввода чисел
    }

    // Подсчитываем количество книг с тремя буквами 'о' в названии
    int countWithO = 0;
    for (int i = 0; i < size; ++i) {
        if (count_o(library[i].title) == 3) {
            countWithO++;
        }
    }

    // Создаем массив для книг с тремя буквами 'о' в названии
    Book* booksWithO = new Book[countWithO];
    int booksWithOCount = 0;

    // Переписываем информацию только о книгах с тремя буквами 'о' в названии
    for (int i = 0; i < size; ++i) {
        if (count_o(library[i].title) == 3) {
            booksWithO[booksWithOCount++] = library[i];
        }
    }

    // Сортируем массив книг с тремя буквами 'о' в названии по названию издательства
    for (int i = 0; i < booksWithOCount - 1; ++i) {
        for (int j = 0; j < booksWithOCount - i - 1; ++j) {
            if (booksWithO[j].publisher > booksWithO[j + 1].publisher) {
                swap(booksWithO[j], booksWithO[j + 1]);
            }
        }
    }

    // Выводим информацию о книгах с тремя буквами 'о' в названии, отсортированную по названию издательства
    cout << "Информация о книгах с тремя буквами 'о' в названии, отсортированная по названию издательства:" << endl;
    for (int i = 0; i < booksWithOCount; ++i) {
        cout << "Автор: " << booksWithO[i].author << endl;
        cout << "Название: " << booksWithO[i].title << endl;
        cout << "Издательство: " << booksWithO[i].publisher << endl;
        cout << "Год издания: " << booksWithO[i].year << endl;
        cout << "Стоимость: " << booksWithO[i].cost << endl << endl;
    }

    delete[] booksWithO;
    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы