Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2010, 01:59   #1
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию C++ Ток начал несудите строго

В общем читаю книгу "Как программировать на C++"
авторов "Х. М. Дейтел, П. Дж. Дейтел"

Дошел до конца 3 главы. Там есть задание. Модифицируйте класс GradeBook Предусмотрите в классе set-функцию для изменения имени преподавателя и get-функцию для его извлечения.

Приведу код всех файлов, которые сделаны были до этого(списывал с книги код) и выделю то где вводиться имя и фамилия преподавателя.
Вопрос у меня в том правильно я выполнил это задание или нет. И если неправильно то как будет верно или куда смотреть.

GradeBook.h
Код:
#include <string> // класса GradeBook использует стандартные строки
using std::string;

// определение класса GradeBook
class GradeBook
{
public:
    GradeBook( string ); // конструктор, инициализирующий courseName
    void setCourseName( string ); // устанавливает courseName
    string getCourseName(); // получает название курса
    void displayMessage(); // выводит сообщение-приветсвие
private:
    string courseName; // название курса для данного GradeBook
}; // конец класса GradeBook

// Определение класса Teacher
class Teacher
{
public:
    Teacher( string ); // конструктор инициализирующий teacherName
    void setTeacherName( string ); // устанавливает teacherName
    string getTeacherName(); // получает имя Учителя
    void displayMessage(); // выводит сообщение приветсвия
private:
    string teacherName; // Имя учителя для данного курса
};
GradeBook.cpp
Код:
#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h" // включить определение класса GradeBook

// конструктор инициализирует courseName переданной строкой
GradeBook::GradeBook( string name )
{
    setCourseName ( name ); // инициализировать вызовом set-ф-ий
}

// функция для установки названия курса
// гарантирует, что название курса содержит не более 25 символов
void GradeBook::setCourseName( string name )
{
    if ( name.length() <= 25 ) // если не более 25 символов
        courseName = name; // сохранить название кусра в объекте

    if ( name.length() > 25 ) // если в название более 25 символов
    {
        // записать в courseName первые 25 символов параметра name
        courseName = name.substr( 0, 25 ); // начать с 0, длина 25 символов

        cout << "name \"" << name << "\" превышает максимальную длину.\n"
                << "Ограничение названия курса 25 символами.\n" << endl;
    } // конец if
} // конец функции setCourseName

// функция для получения названия курса
string GradeBook::getCourseName()
{
    return courseName; // возвратить courseName объекта
} // конец функции getCourseName

// вывести сообщение-приветствие пользователю GradeBook
void GradeBook::displayMessage()
{
    // вызвать getCourseName для получения courseName
    cout << "Добропожаловать в класс книги для\n" << getCourseName()
            << "!" << endl;
} // конец ф-ии displayMessage
Teacher.cpp - файл делал сам по другому заданию, но в общем то посравнению с GradeBook.cpp изменены только названия.
Код:
#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h" // включить определение класса Teacher

// конструктор инициализирует teacherName переданной строкой
Teacher::Teacher( string name )
{
    setTeacherName ( name ); // инициализировать вызовом set-ф-ий
}

// функция для установки имени Учителя
// гарантирует, что имя Учителя содержит не более 25 символов
void Teacher::setTeacherName( string name )
{
    if ( name.length() <= 25 ) // если не более 25 символов
        teacherName = name; // сохранить имя учителя в объекте

    if ( name.length() > 25 ) // если в название более 25 символов
    {
        // записать в teacherName первые 25 символов параметра name
        teacherName = name.substr( 0, 25 ); // начать с 0, длина 25 символов

        cout << "name \"" << name << "\" превышает максимальную длину.\n"
                << "Органичение на имя учителя первые 25 символов.\n" << endl;
    } // конец if
} // конец функции setTeacherName

// функция для получения имения учителя
string Teacher::getTeacherName()
{
    return teacherName; // возвратить teacherName объекта
} // конец функции getTeacherName

// вывести сообщение-приветствие пользователю TeacherName
void Teacher::displayMessage()
{
    // вызвать getTeacherName для получения teacherName
    cout << "Учитель добропожаловать в GradeBook\n" << getTeacherName()
            << "!" << endl;
} // конец ф-ии displayMessage
main - в след посте сюда не влез
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 22.12.2010, 01:59   #2
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

main.cpp
Код:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include "GradeBook.h" // включить определение класса GradeBook

// ф-ия main начинает исполнение программы
int main()
{
    // объявление переменных Имени и Фамилии
    std::string name, femaly;

    // Ввести имя и фамилию учителя
    cout << "Введите Имя: ";
    cin >> name;
    cout << "Введите Фамилию: ";
    cin >> femaly;

    // создать два объекта GradeBook
    // исходное имя курса для gradeBook1 слишком длинное
    cout << "\n";
    GradeBook gradeBook1( "CS101 Introduction to Programming in C++" );
    GradeBook gradeBook2( "CS102 C++ Data Structures" );

    // создать два объекта Teacher
    // Имя и фамилия
    Teacher teacher1( name );
    Teacher teacher2( femaly );

    // Вывести имя и фамилию Teacher
    cout << "Преподаватель: " << teacher1.getTeacherName() << " "
            << teacher2.getTeacherName() << endl;

    // вывести courseName каждого GradeBook
    cout << "gradeBook1`s первоначальное название курса: "
            << gradeBook1.getCourseName()
            << "\ngradeBook2`s первоначальное название курса: "
            << gradeBook2.getCourseName() << "\n" << endl;

    // модифицировать courseName для gradeBook1 (корректной длины)
    gradeBook1.setCourseName( "CS101 C++ Programming" );


    // Вывести имя и фамилию Teacher
    cout << "Преподаватель: " << teacher1.getTeacherName() << " "
            << teacher2.getTeacherName() << endl;

    // вывести courseName каждого GradeBook
    cout << "gradeBook1`s конечное имя: "
            << gradeBook1.getCourseName()
            << "\ngradeBook2`s конечное имя: "
            << gradeBook2.getCourseName() << endl;
    return 0; // показывает успешное завершение
} // конец main
Относительно задания которое я прошу проверить менял только main.cpp выделенно жирным шрифтом, но привел весь код, дабы узнать точно. Желательно с пояснениями что я сделал не так

П.С.: Програ работает и имя преподавателя вводиться и выводиться то что вводили.
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.

Последний раз редактировалось Donatello; 22.12.2010 в 02:29.
Donatello вне форума Ответить с цитированием
Старый 22.12.2010, 14:12   #3
casekey
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 95
По умолчанию

я так понял, что у тебя создается 2 обьекта типа Teacher, первый для того чтобы хранить фамилию, а другой чтобы хранить имя. Либо это такая хитрая задумка или что я хз Но нразве добавить еще поле для фамилии кто то запрещает в класс:

Код:
class Teacher
{
public:
    Teacher( string, string ); // конструктор инициализирующий имя и фамилию
    void setTeacherName( string ); // устанавливает teacherName
    void setTeacherSurname(string); // устанавливает teacherSurname
    string getTeacherName(); // получает имя Учителя
    string getTeacherSurname(); // получает фамилию
    void displayMessage(); // выводит сообщение приветсвия
private:
    string teacherName; // Имя учителя для данного курса
    string teacherSurname
};
или вообще можно обойтись одним полем и назвать его просто ФИО. Кстате почему длина ограничивается 25?
casekey вне форума Ответить с цитированием
Старый 22.12.2010, 17:25   #4
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

casekey
Ограничение я делал 25 символов в Teacher из-за того что по условию книги надо сделать ограничение на название курса в 25 символов из этого сделал вывод что и Имя Фамилия не должны ее превышать. Насчет ФИО да можно сделать так, но я только начал программировать поэтому в общем то пока что клонирую то что предлагает книга и изменяю под задание той же книги, что бы лучше понять тему.
По поводу 2 объектов Teacher я уже писал что в общем то скопировал текст проги из GradeBook, только изменил названия, а GradeBook создает 2 названия курса в этой проге.
А так меня в общем то интересует вопрос правильно ли я сделал задание или пошел другой дорогой и сделал проше или сложнее изменение имени и фамилии препода в данном случае. Их надо вводить каждый раз когда запускаешь ее, но но там нада через ф-ии get и set а так я сделал или нет я непойму, в этом то и вопрос.

Вот тут подумал и вообще задался вопрос а надо ли было делать класс Teacher, если задание просит модифицировать класс GradeBook, ведь можно было бы туда вписать get и set ф-ии для того чтобы принимать и выводить ФИО грубо говоря или я не прав и это просто было бы нагромождением класса GradeBook????
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.

Последний раз редактировалось Donatello; 22.12.2010 в 17:28.
Donatello вне форума Ответить с цитированием
Старый 22.12.2010, 18:05   #5
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Цитата:
Там есть задание. Модифицируйте класс GradeBook Предусмотрите в классе set-функцию для изменения имени преподавателя и get-функцию для его извлечения.
Цитата:
Вот тут подумал и вообще задался вопрос а надо ли было делать класс Teacher, если задание просит модифицировать класс GradeBook, ведь можно было бы туда вписать get и set ф-ии для того чтобы принимать и выводить ФИО грубо говоря или я не прав и это просто было бы нагромождением класса GradeBook????
добавление в класс методов типа get и set, насколько я знаю, удовлетворяют теории ООП, поэтому их наличие не является нагромождение (если конечно они будут(могут) потом где нибудь использоваться)
BleStaR вне форума Ответить с цитированием
Старый 22.12.2010, 18:05   #6
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Цитата:
Там есть задание. Модифицируйте класс GradeBook Предусмотрите в классе set-функцию для изменения имени преподавателя и get-функцию для его извлечения.
Цитата:
Вот тут подумал и вообще задался вопрос а надо ли было делать класс Teacher, если задание просит модифицировать класс GradeBook, ведь можно было бы туда вписать get и set ф-ии для того чтобы принимать и выводить ФИО грубо говоря или я не прав и это просто было бы нагромождением класса GradeBook????
добавление в класс методов типа get и set, насколько я знаю, удовлетворяют теории ООП, поэтому их наличие не является нагромождение (если конечно они будут(могут) потом где нибудь использоваться)
BleStaR вне форума Ответить с цитированием
Старый 22.12.2010, 19:17   #7
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

Цитата:
Сообщение от BleStaR Посмотреть сообщение
добавление в класс методов типа get и set, насколько я знаю, удовлетворяют теории ООП, поэтому их наличие не является нагромождение (если конечно они будут(могут) потом где нибудь использоваться)
Ну может быть, вот только ФИО очень часто используется в разных местах не только при определение кто ведет курс(предмет), но и в данном случае можно использовать кто ведет журнал, и т.д.

Млин наверное я не правильно вопрос задал т.к. мы пока что только говорим об оптимизации кода. Попробую вопрос задать так.
Есть часть кода которая вводит и присваивает Имя и Фамилию.
Код:
    // объявление переменных Имени и Фамилии
    std::string name, femaly;

    // Ввести имя и фамилию учителя
    cout << "Введите Имя: ";
    cin >> name;
    cout << "Введите Фамилию: ";
    cin >> femaly;
Код:
    // создать два объекта Teacher
    // Имя и фамилия
    Teacher teacher1( name );
    Teacher teacher2( femaly );

    // Вывести имя и фамилию Teacher
    cout << "Преподаватель: " << teacher1.getTeacherName() << " "
            << teacher2.getTeacherName() << endl;
и в общем то сам класс Teacher с get и set - ф-ми
Код:
class Teacher
{
public:
    Teacher( string ); // конструктор инициализирующий teacherName
    void setTeacherName( string ); // устанавливает teacherName
    string getTeacherName(); // получает имя Учителя
    void displayMessage(); // выводит сообщение приветсвия
private:
    string teacherName; // Имя учителя для данного курса
};
Но т.к. задание в общем то звучит не в создании класса Teacher, а в модификации класса GradeBook(Модифицируйте класс GradeBook Предусмотрите в классе set-функцию для изменения имени преподавателя и get-функцию для его извлечения.) Если перемешать классы GradeBook и Teacher то задание будет выполнено или нет??? Вот в чем вопрос.
П.С.: class GradeBook от Teacher отличаеться только этими двумя обозначениями.
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 22.12.2010, 19:23   #8
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

т.е. если код будет смотреться так задание будет считаться выполненным или нет???
Код:
class GradeBook
{
public:
    GradeBook( string ); // конструктор инициализирующий gradeBookName
    Teacher( string ); // конструктор инициализирующий teacherName
    void setCourseName( string ); // устанавливает courseName
    void setTeacherName( string ); // устанавливает teacherName
    string getCourseName(); // получает название курса
    string getTeacherName(); // получает имя Учителя
    void displayMessage(); // выводит сообщение приветсвия
private:
    string courseName; // Название курса для данного GradeBook
    string teacherName; // Имя учителя для данного курса
};
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 22.12.2010, 20:25   #9
casekey
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 95
По умолчанию

да. Если задание предполагало оставить courseName и методы работающие с ним.
А если сделать аналогичное но только для учителя - то убрать методы работающие с courseName
casekey вне форума Ответить с цитированием
Старый 22.12.2010, 20:45   #10
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

casekey
Да задание предпологало оставить courseName т.к. в дальнейшем в книге будут развивать эту программу.
Спасибо за советы и ответы. А то сделал все работает, но не мог понять правильно сделал или нет
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод и обработка строго одного символа Кипящий чайник Общие вопросы C/C++ 16 04.12.2010 16:43
Посмотрите мою первую прогу(я новичок, не судите строго:)) просто Слава Софт 3 07.11.2010 12:49
usb подать/отключить ток Silentdi Помощь студентам 7 13.10.2010 20:22
Поиск значения по строго заданным условиям поиска (Excel 2003) Vladsgs Microsoft Office Excel 1 25.05.2010 14:53