![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Вот задание...Написать программу, которая реализовывала библиотечный каталог. Программа должна запрашивать название книги, автора,год издания,цену и выдавать общее количество книг,общую стоимость,названия книг,которые дороже определнной суммы. В этой программе должен быть создан класс, в котором используется перегружаемые конструкторы.
Вот вопрос...если я задал в конструкторе, фамилию Перепёлка, почему запрашивает это значение? При выводе это фамилия не выводится. А до второго объекта не доходит дело...не запрашивает ничего...Подскажите что можно тут сделать? Это сообщение отредактировал(а) Christoph - 11.3.2008, 21:55 -------------------- ![]() |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
для начала отформатируйте текст кода. читать такое нереально.
|
|||
|
||||
Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
А вроде понятно, за что отвечает каждая переменная
![]() -------------------- ![]() |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
форматирование и написание комментариев, разные операции. ладно, делать серавно нефиг... вот то, что я от вас просил:
щас поизучаю, мож че подскажу. |
|||
|
||||
Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
можно на ты
![]() ![]() -------------------- ![]() |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Christoph, это не люди капризные. Просто разобрать неформатированный код (особенно чужой) очень непростая задача. А правильно форматировать его в школах/колледжах/ВУЗах почему-то не учат.
замени на:
|
||||
|
|||||
Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Результат тот же....Не выводит мне вконце фамилию Перепёлка...и не доходит до объекта x2. И почему в scanf, kniga[i] и avatar[i]. без &
А зачем писать fflush(NULL), если мы значения вводим через пробел? Это сообщение отредактировал(а) Christoph - 11.3.2008, 23:30 -------------------- ![]() |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
проблема в том, что я тебе ничего не должен ![]() поэтому... для того, чтобы получить ответ, надо представить данные так, чтобы они были удобно читаемые и всем понятны. из всех людей, разбирать то, что ты написал будет всего 1% начавших читать данный топик. т.к. у людей, обычно, лишнего времени нету. а если и есть, то им меньше всего хочеться тратить его на форматирование чужого текста. http://forum.vingrad.ru/forum/topic-48015.html - тут вообщем-то все по этому поводу написано. по поводу проблемы... в шутку, можна сказать, что проблема в ДНК ![]() 1) не понимание языка, особенно того, что касается указателей / массивов / конструкторов. 2) не понимание проблемы/задачи. задача не была формализована до того, как начать что либо писать. для начала: мы пишем на объектно-ориентированном языке C++, поэтому желательно отказаться от использования конструкций, которые остались для совместимости с языком C. Это правда сделать достаточно трудно, особенно если учесть, что преподают обычно C и C++ в виде одного курса и преподаватель зачастую сам не понимает различия между языками. В данном примере отказаться от printf/scanf в пользу cout/cin. (еще раз скажу, что это желательно, а не обязательно). далее: bibl::bibl(char* Pisatel) { for(int i=0;i<5;i++) strcpy(avtar[i],Pisatel); } не знаю что ты этим хотел добиться, но врядли оно делает, то что ты хотел. функция strcpy копирует символы из одного массива символов в другой. начнем с того, что char avtar[50][5]; надо заменить на char avtar[5][50]; чтобы приблизить хоть чучуть к тому что будет работать. char avtar[5][50] - с одной стороны это двумерный массив символов, с другой - 5 строк, в каждой не больше 49 символов (один символ уходит для обозначения конца строки) в конструкторе bibl::bibl(char* Pisatel), ты забиешь все 5 строк значением из Pisatel. смысла я в этом не вижу. то же самое относиться и к bibl::bibl(int izd). bibl::~bibl() { for (int i=0;i<5;i++) { strcpy(avtar[i],NULL); izdanie[i]=NULL; } } вызов strcpy(avtar[i],NULL); будет давать 100% ошибку о запрещенном доступе к памяти. делаеться попытка скопировать массив символов в avtar[i] с адреса NULL. izdanie[i]=NULL - в данном случае смысла не имеет. и вообще весь деструктор смысла не имеет. это по поводу 1) не понимание языка, особенно того, что касается указателей / массивов / конструкторов. щас напишу по поводу 2) и вообще как это все должно было быть. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
документацию на fflush почитай, тогда поймешь, зачем он нужен. Хотя, и без него работает
![]() Насчет параметров scanf, похоже, я погорячился. & там нужен. Деструктор у тебя вызывает access violation (segmentation fault). Нельзя strcpy в качестве параметра передавать NULL. И вообще, лучше убрать этот деструктор - он не нужен, так как динамическая память не используется. Я его убрал и у меня дошло до второго этапа (дальше не пробовал). твоя перепелка затирается операцией scanf. Смысл ее передавать конструктору вообще непонятен. #include<conio.h> - лишняя строка. В конце строк отчета ставь \n, потому что весь вывод идет в одну строку - нечитабельно |
|||
|
||||
Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Я думал что этот код, обнуляет массив... Убрал деструктор....всёравно не хочет....как вроде бы не видит конструктора -------------------- ![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Christoph, ты вообще прочитал, что тебе написали? Или только про деструктор?
Не видит конструктора? Пройдись отладчиков, увидишь, где затык. |
|||
|
||||
Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
korian, такое задание перегрузить конструкторы....
прочитал исправил...всёравно не работает Это сообщение отредактировал(а) Christoph - 12.3.2008, 01:05 -------------------- ![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Тебе на этой конкретной задаче надо перегрузить или вообще - написать программ с классом и перегруженными конструкторами? Если так, то лучше это делать на примере класса а-ля string. Один конструктор дефолтный, второй создает строку из си-строки (параметр const char*), третий - конструктор копирования (параметр const string &). Вот хороший и простой в реализации пример.
|
|||
|
||||
Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
На конкретной задаче....внимательно читаем условие
![]() -------------------- ![]() |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
объектно-ориентированные языки были придуманы для того, чтобы можно было мыслить обычными человеческими понятиями/конструкциями, и этим необходимо пользоваться.
для начала задачу надо проанализировать. процесс это творческий и каждый может придумать свой вариант решения. то что я тут пишу - это то как вижу проблему я, и далеко не факт, что это лучший вариант формализации/решения задачи. что мы имеем: во первых у нас есть "библиотечный каталог". если я еще не все забыл, то в реальной жизни он из себя представляет что-то типа большой тумбы с кучей ящичков. в которых содержаться куча листочков, упорядоченных по алфавиту. каталоги бывают двух видов: алфавитный и тематический. т.к. задача является учебной/тестовой (короче я не хочу слишком много писать ![]() реализуем только алфавитный каталог, причем кучи ящичков у нас нету, есть один большой ящик, в котором собраны все листочки. умеем добавлять листочки в ящик и просматривать ящик, не умеем удалять листочки или изменять их содержание. листочки у нас расположены в неизвостном порядке и количество листочков в этом ящике не больше N. название книги, фамилия автора могут состоять не больше чем из M символов. цена книги является целым числом. получаем классы: CBiblBox - класс, представляющий ящик в котором лежат листочки. CBiblForm - класс, представляющий листочки. описываем класс CBiblBox. листочки содержаться в ящике, причем не больше N штук. получаем вот что: class CBiblBox { public: static const int m_maxForm = 10; private: CBiblForm m_biblForms[maxForm]; } т.к. строкой CBiblForm m_biblForms[maxForm]; я сразу выделил память под m_maxForm листочков, нам надо знать сколько из них реально используеться. добавляем int m_curFormCount и стандартный конструктор, т.к. нам надо будет задать начальное значение m_curFormCount равным нулю. еще добавляем метод GetFormsCount - чтобы можно было получить кол-во листочков. class CBiblBox { public: CBiblBox(); static const int m_maxForm = 10; int GetFormsCount() const {return m_curFormCount} private: CBiblForm m_biblForms[maxForm]; int m_curFormCount; } Надо уметь добавлять листочки, и получать информацию о них. Надо знать общую стоимось книг. class CBiblBox { public: CBiblBox(); int AddForm(const CBiblForm& form); //будем возвращать индекс добавленного Form или -1, если листков уже максимально количество. const CBiblForm& GetForm(int index) const {return m_biblForms[index];} int GetFormsCount() const {return m_curFormCount} //получение кол-ва листочков int GetObCena() const {return m_obcena} //получение общей стоимости static const int m_maxForm = 10; //максимальное количество листочков private: CBiblForm m_biblForms[maxForm]; int m_curFormCount; //текущее количество листочков в ящике int m_obcena; //общая стоимость книг. } теперь по поводу листочка и класса CBiblForm. там у нас содержиться название книги, фамилия автора, год издания, цена. название книги и фамилия автора не больше M символов. class CBiblForm { public: static const int m_maxChars = 50; //максимум символов в название книги и фамилии автора char nazvanieKnigi[m_maxChars]; char avtor[m_maxChars]; int godIzdaniya; int cenaKnigi; } теперь реализуем остальную функциональность в main void main { int kolvoKnig; do { cout<<"сколько книг вы хотите добавить в каталог?"<<endl; cin>>kolvoKnig; if (kolvoKnig > CBiblBox::m_maxForm) cout<<"В нашем каталоге может храниться максимум "<<CBiblBox::m_maxForm<<" записей"<<endl; } while(kolvoKnig > CBiblBox::m_maxForm); CBiblBox bilbBox; for (int i = 0; i < kolvoKnig; i++) { CBiblForm tempForm; cout<<"Введите назание книги"<<endl; cin.getline(tempForm.nazvanieKnigi, tempForm.m_maxChars); cout<<"Введите фамилию автора"<<endl; cin.getline(tempForm.avtor, tempForm.m_maxChars); cout<<"Введите год издания"<<endl; cin>>tempForm.godIzdaniya; cout<<"Введите цену книги"<<endl; cin>>tempForm.cenaKnigi; bilbBox.Add(tempForm); } //выводим книги дороже определенной суммы int cena; cout<<"Введите цену. Книги с ценой выше введенной будут выведены."<<endl; cin>>cena; for (int i = 0; i < bilbBox.GetFormsCount(); i++) { if (bilbBox.GetForm(i).cenaKnigi > cena) { const CBiblForm& tempForm = bilbBox.GetForm(i); cout<<tempForm.nazvanieKnigi<<", "<<tempForm.avtor<<", "<<tempForm.godIzdaniya<<", "<<tempForm.cenaKnigi<<endl; } } } читаем заново условие и смотрим все ли реализовано. во-первых не выводили общую цену и там сказано, что нам полюбому нужен класс с перегруженными конструкторами... что тут можна сделать 1) можна в CBiblBox добавить копирующий конструктор, но смысла в этом нету, стандартный вполне справляеться 2) надо что-нить придумать дополнительное... нам надо делать поиск книг относительно цены, поэтому первое что мне пришло в голову, сделать класс, который будет находить и выводить книги по заданным параметрам. и вот получилась такая реализация: class CShowForms { public: CShowForms(char* avtor); //вывод всех книг, с данным автором CShowForms(int cena); //вывод книг, с ценой больше указанной CShowForms(int cena1, int cena2); // вывод книг, с ценой в диапазоне [cena1..cena2] void Show(const CBiblBox& biblBox); private: char m_avtor[CBiblForm::m_maxChars]; int m_cena1; int m_cena2; }; это был пункт 2, я хотел показать как надо думать, так сказать. надо уметь анализировать и проектировать на бумаге. реализуем все необходимые функции, исправляем некоторые ошибки и вот что получаем в итоге:
Добавлено @ 02:43 вопросы? ![]() Это сообщение отредактировал(а) korian - 12.3.2008, 02:50 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |