Здравствуйте. Помогите новичку понять, где в коде ошибка?
От: sar_ultima  
Дата: 12.04.08 15:35
Оценка:
#include<iostream.h>
#include<string.h>
#include<windows.h>

struct Kniga{               //описываем структуру BOOK
    char nazvanie[30];      //строковая НАЗВАНИЕ книги
    struct {                //вложенная структура АВТОР
        char imya[20];      //ИМЯ автора
        char familiya[20];  //ФАМИЛИЯ автора
    }avtor;
    double cena;            //Цена книги
    short stranic;          //Количество СТРАНИЦ в книге
};



Kniga **NovKat(Kniga **p, int &n);      //прототип функции НОВЫЙ КАТАЛОГ
Kniga *InfoOKnige(Kniga *p);            //прототип функции ИНФОРМАЦИЯ О КНИГЕ
Kniga **VivodNaEkran(Kniga **p, int n); //прототип функции ВЫВОД НА ЭКРАН



void main()
{
    Kniga **p=NULL;
    int n=0;
    int vibor;                                                             
    while(1){                                                              
        system("cls");                              //очищаем экран от мусора
        
        cout << "\t\tMenu: " << "\n";               //заголовок МЕНЮ
        cout << "1 - Sozdat novuyu biblioteky. \n"; //МЕНЮ. Создать новый каталог
        cout << "6 - Vivod na ekran. \n";           //МЕНЮ. Вывод на экран

        cin >> vibor;
        switch(vibor){
        case 1: p=NovKat(p, n); break;
        case 6: p=VivodNaEkran(p, n);break;
        default: 
                cout << "Vnimatel'nee. Imeetsa tol'ko 6 punktov menu.";                
        }
    }
}
///////////////////////////////////////////////Создание нового каталога
Kniga **NovKat(Kniga **p, int &n)
{
    system ("cls");
    if (p!=NULL) delete []p;
    cout << "Vvedite kolichesstvo knig: ";
    cin >> n;
    p=new Kniga*[n];
    if(p==NULL)
    {
        cout <<"Oshibka pamyati!!!";
        return NULL;
    }
    for (int i=0; i<n; i++)
    {
        p[i]=new Kniga;
        cout << "Kniga nomer "<< i+1<< "\n\n";
        InfoOKnige(p[i]);
    }
    return p;
}
///////////////////////////////////////////////Заполняем информацию о книге
Kniga *InfoOKnige(Kniga *p)
{
    cout << "Vvedite nazvanie: ";
    cin >>p->nazvanie;
    cout << "Vvedite imya avtora: ";
    cin >> p->avtor.imya;
    cout << "Vvedite familiy avtora: ";
    cin >> p->avtor.familiya;
    cout << "Vvedite kolichestvo stranic: ";
    cin >> p->stranic;
    cout <<"Vvedite ceny: ";
    cin >> p->cena;
    return p;
}
//////////////////////////////////////////////Выводим на экран содержимое каталога
Kniga **VivodNaEkran(Kniga *p, int n)
{
    cout << "Na danniy moment v kataloge " << n << " knig\n";
    for(int i=0; i<n; i++)
    {
        cout << "Kniga " << n+1 << ": " << "Nazvanie \t" << p->nazvanie << endl;
        cout << "\t Avtor: " << p->avtor.imya << " "<< p->avtor.familiya << endl;
        cout << "\t Cena: " << p->cena << "griven" << endl;
        cout << "\t Kolichestvo stranic: " << p->stranic << endl;
    };
    return p*;
}

Добавлена разметка и поправлена табуляция — Кодт
Re: Здравствуйте. Помогите новичку понять, где в коде ошибка
От: frogkiller Россия  
Дата: 12.04.08 15:50
Оценка:
Здравствуйте, sar_ultima, Вы писали:

_> return p*; // <--- подозреваю, что вот здесь

_>}

А вообще рекомендую сразу научиться делать так:
std::vector<Kniga> catolog;
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[2]: Здравствуйте. Помогите новичку понять, где в коде оши
От: sar_ultima  
Дата: 12.04.08 16:20
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Здравствуйте, sar_ultima, Вы писали:


_>> return p*; // <--- подозреваю, что вот здесь

_>>}

А что здесь не так? Возвращать же что-то надо в место вызова функции?
Re[3]: Здравствуйте. Помогите новичку понять, где в коде оши
От: frogkiller Россия  
Дата: 12.04.08 16:33
Оценка:
Здравствуйте, sar_ultima, Вы писали:

_>>> return p*; // <--- подозреваю, что вот здесь

_>>>}

_>А что здесь не так? Возвращать же что-то надо в место вызова функции?


Ну, если из (Kniga * p) надо сделать (Kniga **), то как минимум надо писать так:
return &p;


Но вообще непонятно, зачем тебе возвращать (Kniga **) в функции вывода инфы на экран.

PS. С Дельфи слезаешь?
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re: Здравствуйте. Помогите новичку понять, где в коде ошибка
От: Кодт Россия  
Дата: 13.04.08 19:55
Оценка: 9 (2)
Здравствуйте, sar_ultima, Вы писали:

Будем учиться хорошему стилю, который — залог безошибочности.
(Впрочем, если у тебя старый компилятор, например, TurboC++, то увы, этот совет мимо кассы).

_>
_>#include <iostream>  // <iostream.h> - это древняя версия потоков; её использовать не стоит!
_>#include <string> // <string.h> - сишные примитивы (strcpy и т.п.); мы же воспользуемся С++ным классом
_>// #include<windows.h> - а это нам просто не нужно
  #include <vector> // а вот это нам пригодится для коллекций книг

_>struct Kniga{ // почему в комментарии "BOOK", а в коде "Kniga"? ;)
_>    std::string nazvanie; // используем правильные строки!
_>    struct {
_>        std::string imya;
_>        std::string familiya;
_>    }avtor;
_>    double cena; // хранить деньги с плавающей точкой - сойдёт для сельской местности...
_>    int stranic; // не экономь на спичках; int удобнее для компилятора, чем short
_>};

typedef std::vector<Kniga> KnigaVector;

// как сокращаются прототипы! нет нужды таскать двойные указатели...
// кстати, возвращать void - это так естественно!
_>void NovKat(KnigaVector& knigi);      // возвращаем данные через out-параметр (можно и через return)
_>void InfoOKnige(Kniga const& kniga);
_>void VivodNaEkran(KnigaVector const& knigi);

using std::cout;
using std::cin;
// или просто using namespace std;
// подробнее об этом - в любом учебнике по С++

_>void main()
_>{
_>    KnigaVector knigi; // вместо Kniga** p и int n
_>    int vibor;                                                             
_>    while(1){                                                              
_>        system("cls");
        
_>        cout << "\t\tMenu: " << "\n";
_>        cout << "1 - Sozdat novuyu biblioteky. \n";
_>        cout << "6 - Vivod na ekran. \n";

_>        cin >> vibor;
_>        switch(vibor){
_>        case 1: p=NovKat(p, n); break;
_>        case 6: p=VivodNaEkran(p, n);break;
_>        default: 
_>                cout << "Vnimatel'nee. Imeetsa tol'ko 6 punktov menu.";
                  // 6 пунктов?! я вижу только 2. Кстати, где пункт завершения работы?
_>        }
_>    }
_>}
_>///////////////////////////////////////////////Создание нового каталога
_>void NovKat(KnigaVector& knigi)
_>{
_>    system ("cls");
_>    knigi.clear(); // if (p!=NULL) delete []p; --- посмотри, как удобно с вектором!
_>    cout << "Vvedite kolichesstvo knig: ";
      int n;
_>    cin >> n;
_>    knigi.resize[n]; // p=new Kniga*[n];
/*  // управление памятью на таком низком уровне не нужно;
    // кстати, даже new должен бросить исключение, т.е. мы просто не дошли бы до проверки
    // хотя старые компиляторы имеют на этот счёт особое мнение :(
_>    if(p==NULL)
_>    {
_>        cout <<"Oshibka pamyati!!!";
_>        return NULL;
_>    }
*/
_>    for (int i=0; i<n; i++)
_>    {
_>        // p[i]=new Kniga; --- в коллекции хранятся объекты, а не указатели
_>        cout << "Kniga nomer "<< i+1<< "\n\n";
_>        InfoOKnige(p[i]);
_>    }
_>}

// переделать остальные функции - хозяйское дело.
_>

_>
Добавлена разметка и поправлена табуляция — Кодт
Перекуём баги на фичи!
Re: Здравствуйте. Помогите новичку понять, где в коде ошибка
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 14.04.08 05:58
Оценка:
Здравствуйте, sar_ultima, Вы писали:

/* Добавить комментарий к сообщению Кодт'а не получилось, так что напишу отдельно. */

_> system ("cls");


Это не портабельно. В идеале нужно так:

#ifndef _WIN32
#define CLEAR_CMD "clear"
#else
#define CLEAR_CMD "cls"
#endif

Ну и в назыаниях я бы лучше использовал Book, а не Kniga.
Re: Здравствуйте. Помогите новичку понять, где в коде ошибка
От: Vamp Россия  
Дата: 14.04.08 14:00
Оценка: +1
Я бы еще добавил, ко всему прочему, что не следует называть переменные, функции и типы русскими словами. Это очень плохая привычка. Будьте готовы к тому, что придется работать в многоязычной команде и используйте для идентификаторов английские слова.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.