Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


В общем немного решил, но я сам запутался, знаний нехватает. Самому интересно.
У меня вопрос:
1. Как организовать ввод данных с клавиатуры?
2. И как правильно записать деструктор? Я запутался...

По первому вопросу придумал так:
В определении класса объявляю функцию
Код: Выделить весь код
void UserFromKeyboard();
В реализации этой функции считываю через дополнительные переменные, данные, и передаю в функции установки "set", каждое значение в свою функцию, но выпадает ошибка о том что приложение будет закрыто. Причём если только одно значение считывается и передаётся, то программа работает, а если четыре, то никак. Ошибки выскакивают при вводе символьных значений задачи. Подскажите как правильно ввести с клавиатуры значения и сохранить\присвоить полям объекта?
Решение
Код: Выделить весь код
// Создать класс типа — книга.
// Поля — название, автор, год выпуска, вид литературы (худож., методич., справочн., ...).
// Класс имеет конструктор, деструктор.
// Методы: установки и возвращения значения полей, вычисления «возраста» книги,
// Метод печати.
// Методы установки полей класса должны проверять корректность задаваемых параметров.
// Проверить работу этого класса

//#include "stdafx.h"
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <cstring.h>
#include <cassert>
//#include "math.h"
//#include <stdarg.h>
#include <stdio.h>
#include "conio.h"
                 
//#define _CRT_NONSTDC_NO_DEPRECATE 
class Book{
public:
  Book(char *au, char *nb, char *jr, int yr); // Конструктор
//  void UserFromKeyboard();
  //void setBook(char *au, char *nb, char *jr, int yr);
  // Функции "set", установки значений полей книги
  void setAuthorBook(char *au); // Установка имени автора книги
  void setNameBook(char *nb);   // Установка названия книги
  void setJanreBook(char *jr);  // Установка жанра книги
  void setYearBook(int yr);   // Установка года выпуска книги

  // Функции "get", возвращение значений полей книги
  char *getAuthorBook() { return author; } ;// Возвращение имени автора книги
  char *getNameBook()  { return nameBook; };   // Возвращение названия книги
  char *getJanreBook()  { return janr; };  // Возвращение жанра книги
  int getYearBook()   { return year; };// Возвращение года выпуска книги

  void printBook();  // Печать значений книги
  void CalculateYearBook();
  ~Book(); // Деструктор
private:
    char *author;
    char *nameBook;
    char *janr;
    int year;
};
// Конструктор----------------------------------------------------------------
Book::Book(char *au, char *nb, char *jr, int yr)
{
   setAuthorBook(au);
   setNameBook(nb);
   setJanreBook(jr);
   setYearBook(yr);
}
// Функция ввода данных значений книги с клавиатуры
//void Book::UserFromKeyboard()
//{

//}
// Функция установки Автора Книги
void Book::setAuthorBook(char *au)
{
  // Проверка и выделение памяти для поля - Автор
  int len = strlen(au);
  if( 0 <= len && len < 256){ // Проверка диапазона, должен быть меньше 255
    author = new char[strlen(au) + 1]; // Выделение памяти в 255 байт плюс завершающий символ
    assert(author != 0);  // Проверка выделения памяти
    strcpy(author, au);  // Копирование...
   }
  else   // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
    cout<<" Error! Lenght > 256 bytes!";
}
// Функция установки Названия книги
void Book::setNameBook(char *nb)
{
  // Проверка и выделение памяти для поля - Имя Книги
  int len = strlen(nb);
  if(len >= 0 && len < 256){ // Проверка диапазона, должен быть меньше 255
    nameBook = new char[strlen(nb) + 1]; // Выделение памяти в 255 байт плюс завершающий символ
    assert(nameBook != 0);  // Проверка выделения памяти
    strcpy(nameBook, nb);  // Копирование...
   }
  else   // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
    cout<<" Error! Lenght > 256 bytes!";
}
// Функция установки Жанра Книги
void Book::setJanreBook(char *jr)
{
  // Проверка и выделение памяти для поля - Жанр
  int len = strlen(jr);
  if(len >= 0 && len < 256){ // Проверка диапазона, должен быть меньше 255
    janr = new char[strlen(jr) + 1]; // Выделение памяти в 255 байт плюс завершающий символ
    assert(janr != 0);  // Проверка выделения памяти
    strcpy(janr, jr);  // Копирование...
   }
  else   // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
    cout<<" Error! Lenght > 256 bytes!";
}
// Функция установки Года Книги
void Book::setYearBook(int yr)
{
  // Проверка значений поля - Год Книги
  if(yr < 2008) // Проверка диапазона, должен быть меньше 255
    year = yr;
  else   // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
    cout<<" Error! Year > 2008 !";
}
// Расчёт возраста Книги
void Book::CalculateYearBook()
{
   int MyYear = 2008,  // Текущий год
       resultYear;  // Результат расчёта возраста книги

   resultYear = MyYear - year;

   cout<<"\n This Book "<<resultYear<<" Years! \n"<<endl;
}
// Печать объекта-------------------------------------------------------------
void Book::printBook()
{
   cout<<" Author Book: "<<author<<endl;
   cout<<" Name Book: "<<nameBook<<endl;
   cout<<" Janre Book: "<<janr<<endl;
   cout<<" Year Book: "<<year<<endl;
}
// Деструктор-----------------------------------------------------------------
Book::~Book()
{
}
//---------------------------------------------------------------------------
void main()
{
   int z;
   Book b("Servantes", "Don Kixot", "Romantic", 1550);

   b.printBook();
   b.CalculateYearBook();

   b.setAuthorBook("Pushkin");
   b.setNameBook("Eugeny Onegin");
   b.setJanreBook("Roman");
   b.setYearBook(1834);
   b.printBook();
   b.CalculateYearBook();

   cin>>z;
} 
//---------------------------------------------------------------------------

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 15:15, 23-11-2008 | #2