1 Востаннє редагувалося Parsifal (31.10.2018 18:22:02)

Тема: допоможіть(С++(стрічки))

ось все завдання

Прихований текст

Розробіть програму «Бібліотека». Створіть структуру «Книга» (назва, автор, видавництво, жанр). Створіть масив з декількох книг. Реалізуйте такі можливості:
Друк всіх книг.
Пошук книги по автору.
Пошук книги по назві
Редагування книги(пошук по назві і перезаписування нових даних).
Сортування масиву по назві книг.
Сортування масиву по автору.
Сортування масиву по видавництву.
Добавлення нової книжки.
Видалення книжки з певною назвою.

ось завдання яке зараз виконую

Прихований текст

Сортування масиву по назві книг.

ось весь код

Прихований текст
#include <iostream>
using namespace std;
struct Book {
    char name[100];
    char avtor[100];
    char vudavnuztvo[100];
    char zanr[100];
};
void set(Book&book);
void print(Book&book);
void posch_avt(Book&book, int n, char avtor);
void posch_name(Book&book, int n, char name);
void red(Book&book, int n, char name);
void sort(Book&book, int n);
void main() {
    int n = 3;
    Book* book = new Book[n];
    for (int i = 0; i < n; i++) {
        set(book[i]);
    }
    int ch = 1;
    char name[100];
    for (; ch > 0;) {
        switch (ch) {
        case 1:
            for (int i = 0; i < n; i++) {
                print(book[i]);
            }
            break;
        case 2:
            char avtor[100];
            cout << "Enter avtor: ";
            gets_s(avtor);
            for (int i = 0; i < n; i++) {
                posch_avt(book[i], n, *avtor);
            }
            break;
        case 3:
            cout << "Enter name: ";
            gets_s(name);
            for (int i = 0; i < n; i++) {
                posch_name(book[i], n, *name);
            }
            break;
        case 4:
            cout << "Enter name: ";
            gets_s(name);
            for (int i = 0; i < n; i++) {
                red(book[i], n, *name);
            }
            break;
        case 5:
            sort(*book, n);
            break;
        }
        cout << "Enter choise: ";
        (cin >> ch).get();
        
    }
    system("pause");
}
void sort(Book&book, int n) {
    char tmp[100];
    int prov;
    for (int i = 0; i < n; i++) {
        prov = strcmp(book[i].name, book[i + 1].name);
    }
}
void red(Book&book, int n, char name) {
    int prov = strcmp(book.name, &name);
    if (prov == 0) {
        set(book);
    }
}
void posch_name(Book&book, int n, char name) {
    int prov = strcmp(book.name, &name);
    if (prov == 0) {
        print(book);
    }
}
void posch_avt(Book&book, int n, char avtor) {    
        int prov = strcmp(book.avtor, &avtor);
        if (prov == 0) {
            print(book);
        }
}
void print(Book&book) {
    puts(book.name);
    puts(book.avtor);
    puts(book.vudavnuztvo);
    puts(book.zanr);
}
void set(Book&book) {
    gets_s(book.name);
    gets_s(book.avtor);
    gets_s(book.vudavnuztvo);
    gets_s(book.zanr);
}

ось код з помилкою

Прихований текст
void sort(Book&book, int n) {
    char tmp[100];
    int prov;
    for (int i = 0; i < n; i++) {
        prov = strcmp(book[i].name, book[i + 1].name);
    }
}

ось помилки
бінарний "[": "Book" не визначає цей оператор або перетворення до типу прийнятно до вбудованого оператору ряд 66
функція не приймає 1 аргументів ряд 66

2

Re: допоможіть(С++(стрічки))

це помилка десь тут

prov = strcmp(book[i].name, book[i + 1].name);

3

Re: допоможіть(С++(стрічки))

Parsifal написав:
void sort(Book&book, int n) {
    char tmp[100];
    int prov;
    for (int i = 0; i < n; i++) {
        prov = strcmp(book[i].name, book[i + 1].name);
    }
}

Якщо в тілі функції ви хочете працювати з аргументом як з масивом, то в сигнатурі функції його треба передавати як вказівник - * ,  не як посилання  - &.

void sort(Book * book, int n) {
Подякували: Parsifal, leofun012

4

Re: допоможіть(С++(стрічки))

Дякую Володимире, допомогло

5

Re: допоможіть(С++(стрічки))

ось код

if (prov > 0) {
            *tmp = book[i].name;
            *book[i].name = *book[i + 1].name;
            *book[i + 1].name = *tmp;
        }

ось нова помилка
=: неможливо перетворити "char *" в "char"
а при заміні

*book[i + 1].name = *tmp;

на

*book[i + 1].name = tmp;

така помилка
=: неможливо перетворити "char * [100]" в "char"

6

Re: допоможіть(С++(стрічки))

так

if (prov > 0) {
            for (int i = 0; i < 100; i++) {
                tmp[i] = book[i].name;
            }
            for (int i = 0; i < 100; i++) {
                *book[i].name = *book[i + 1].name;
            }
            for (int i = 0; i < 100; i++) {
                *book[i + 1].name = tmp;
            }
        }

всерівно помилка

7

Re: допоможіть(С++(стрічки))

все працює я просто

char* tmp[100];

замінив на

char tmp[100];

8

Re: допоможіть(С++(стрічки))

тільки сортує назву а не весь масив

9

Re: допоможіть(С++(стрічки))

а так сортує з незрозумілими символами наче вийшов за межі масиву

void sort(Book*book, int n) {
    Book tmp[100];
    int prov;
    for (int i = 0; i < n; i++) {
        prov = strcmp(book[i].name, book[i + 1].name);
        if (prov > 0) {
            for (int i = 0; i < n; i++) {
                *tmp = book[i];
                book[i] = book[i + 1];
                book[i + 1] = *tmp;
            }
        }
    }
}

10

Re: допоможіть(С++(стрічки))

koala написав:

del

?

Якщо це те, що потрібно натиснути і утримувати, щоб небуло помилок, то згідний.
Якщо це те, що потрібно зробити з цією темою, теж норм.
Але якщо це ви в такий спосіб видалили своє повідомлення, то в мене питання. Хто підібрав пароль до акаунту koala ?

11

Re: допоможіть(С++(стрічки))

Ніхто не підбирав. На форумі був (певно, іще є) баг із видаленням останнього повідомлення в гілці.

Подякували: leofun011