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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2008, 22:23   #1
natasha_s
 
Регистрация: 16.01.2008
Сообщений: 5
Вопрос Информационно-поисковая система "Библиотека" (С++)

ребят, у меня очень критическая ситуация, хуже не придумать!
завтра надо сдавать работу, значится она у нас как курсовая!
Проблема в том что мы изучали информатику только на 1-м курсе, и то во лишь во 2-м семестре перешли уже непосредственно к СИ, а сейчас (3й семестр) у нас не было информатики, нам лишь дали вопросы по курсовой и чтобы сами изучили сделали и сдали работу!
я попросила знакомого помочь - мне сделали работку, но я её полностью не понимаю, так как она в СИ++ сделана, и мне сказали либо разберешься в программе, либо переделывай на знакомый СИ. а переделывать времени нет! а мне в зачетку 3ка не нужна, поэтмоу надо отвечать что-то. я же примерная студентка

вопрос у меня такой был:
"Библиотека". Разработать информационно-поисковую систему доступа к ресурсам библиотеки. Сведения о печатном издании включают в себя:

- автор;
- название;
- издательство;
- год выпуска;
- количество страниц;
- жанр.

Пользователь системы должен иметь возможность выполнять следующие запросы:

- выдать список книг указанного автора;
- сформировать список книг указанного жанра;
- найти все книги указанного жанра, изданные в указанный период времени.

вот в принципе и всё, моя программка в прикрепленном файле.
во многом я в принципе разобралась, сегодня весь день пытаюсь изучить хоть что-то по си++ )))
хочу вас попросить помочь с файлом DBDescriptor.cpp - написать комментарий к каждой строчке, чтоб понять что там происходит и как!
и еще что такое std ?? я прочитала весь справочник Бьерна Страуструпа, там много чего нашла, а про std не ясно... ну нупример почему везде у меня в программе пишется std::cin>> , std::cout<< а не просто cin>> и cout<<....
и еще интересно что мы делаем этими командами в DBDescriptor.h?
Цитата:
typedef std::map<int, tablerow_t> database_t;
typedef std::map<int, tablerow_t>::iterator database_ti;
и что означает :: ?

и еще один вопросик:
у меня слишком много понаписано в main.cpp (в методичке вообще написано что там почти ничего не должно быть).
так как мне сделать меню для пользователя отдельно? надо функцию change() и всё начиная со switch ... файла main.cpp поместить как две функции в другом новом файле и потом лишь вызывать из main.cpp их?? я так пробовала, но не компилируется так программа!
очень прошу выручить меня, мне завтра сдавать вечером, эх ( заранее всем спасибки и всех целую!
Вложения
Тип файла: rar library.rar (2.8 Кб, 82 просмотров)
natasha_s вне форума Ответить с цитированием
Старый 17.01.2008, 00:05   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от natasha_s Посмотреть сообщение
хочу вас попросить помочь с файлом DBDescriptor.cpp - написать комментарий к каждой строчке, чтоб понять что там происходит и как!
там кроме присваивания и memcpy(копирование памяти, т.е. практически тоже присваивания) вроде ничего нету, так что со знанием си должно быть по идее понятно
Цитата:
Сообщение от natasha_s Посмотреть сообщение
и еще что такое std ?? я прочитала весь справочник Бьерна Страуструпа, там много чего нашла, а про std не ясно... ну нупример почему везде у меня в программе пишется std::cin>> , std::cout<< а не просто cin>> и cout<<....
std это пространство имен. std::cin ты указываешь, что используешь cin именно из пространства std.
Цитата:
Сообщение от natasha_s Посмотреть сообщение
и еще интересно что мы делаем этими командами в DBDescriptor.h?
cin - считывание данных с клавы
cout - вывод на экран

Цитата:
Сообщение от natasha_s Посмотреть сообщение
у меня слишком много понаписано в main.cpp (в методичке вообще написано что там почти ничего не должно быть).
никогда не знал, что это плохо. кто только методички такие пишет...
Цитата:
Сообщение от natasha_s Посмотреть сообщение
так как мне сделать меню для пользователя отдельно? надо функцию change() и всё начиная со switch ... файла main.cpp поместить как две функции в другом новом файле и потом лишь вызывать из main.cpp их??
например так:
Код:
bool change(char key)
{
	switch (key)
	{
	...
	case 'q':
		return true;
	}
return false;
}
. в main же в цикл будет:
Код:
while((cKey=getch()))
{
	if (Change(cKey)) exit(0);
}
pu4koff вне форума Ответить с цитированием
Старый 17.01.2008, 01:01   #3
natasha_s
 
Регистрация: 16.01.2008
Сообщений: 5
По умолчанию

Цитата:
там кроме присваивания и memcpy(копирование памяти, т.е. практически тоже присваивания) вроде ничего нету, так что со знанием си должно быть по идее понятно
да просто дело в том что там эти конструкторы непонятные, и вообще всё связано с файлом dbdescriptor.h ... я там то еле-еле разобралась что представляет из себя class, в чём суть спецификаций-доступа public, protected, private... эх, как всё сложно....
вот c std, в частности std::cin и std::cout всё ясно, только тогда еще как понять >> и <<... насколько я помню это операции сдвига вправо и влево... и как это объясняется в нашем случае??
ну например std::cout<<"hello"<<std::end1; ??

блин, pu4koff, вообще спасибо огроменное, я уже что-то начинаю более менее понимать! чтобы я так делала (( хороший сайт! еще хочу заметить, как начинаешь что-то понимать в программировании - сразу это становится интересным и хочется изучать дальше.... только вот из-за загруженности в университете всё это дело запускается и забывается (
natasha_s вне форума Ответить с цитированием
Старый 17.01.2008, 01:35   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от natasha_s Посмотреть сообщение
как понять >> и <<... насколько я помню это операции сдвига вправо и влево... и как это объясняется в нашем случае??
ну например std::cout<<"hello"<<std::end1; ??
не забывай, что операции в си можно перегружать и их значение зависит от разработчика класса. в данном случае это направление данных, скажем так, cout << "hello" значит, что мы строку "hello" отправляем в поток cout, т.е. выводим на экран.
cout << std::endl - это переход на новую строку.
также hello можно вывести на экран хоть так:
cout << "h" << "e" << "llo" << endl;
cin >> s. соответственно означает, что мы в переменную s отправляем данные из потока cin, т.е. то, что с клавы ввели.
pu4koff вне форума Ответить с цитированием
Старый 17.01.2008, 01:52   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

совсем забыл про это:
typedef std::map<int, tablerow_t> database_t;

а это означает, что database_t - это не что иное, как std::map<int, tablerow_t>.
map - это, на сколько я знаю, что-то вроде таблицы, в которой ключ уникален. это шаблонный тип и мы в <> указываем тип ключа - int и тип данных (в нашем случае это строка таблицы) - tablerow_t
pu4koff вне форума Ответить с цитированием
Старый 17.01.2008, 02:46   #6
natasha_s
 
Регистрация: 16.01.2008
Сообщений: 5
По умолчанию

tablerow_t я так поняла это тоже стандартный тип данных, который находится в каком-то заголовочном файле??
pu4koff, ты такой молодец! я тоже так хочу всё знать....
и вообще я твоя должница... )
само приятное что пишешь именно в точку, всё описываешь качественно, завтра, ой, вернее уже сегодня пойду сдавать - думаю препод будет в шоке! )) потом сообщу об оценке! )

слушай, напиши мне тогда пожалуйста как точно объясняютя эти строчки, чтобы при случае не примерно а точно ответить
1)здесь пугает немного &, хотя не очень но так на всякий случай... )
Цитата:
int change(tablerow_t &xRow)
2)
Цитата:
std::cin.getline((char*)xRow.Author , 50, '\n');
3)
Цитата:
DBDescriptor xDataBase;
if(!xDataBase.open((unsigned char*)"default.txt"))
{
exit(0);
}
xDataBase.readdb();
4)
Цитата:
class FileDescriptor/*Класс файлового дескриптора*/
{
//public:
public:
FileDescriptor();
...
}
вот здесь про строчку FileDescriptor(); что надо сказать именно?

еще раз заранее спасибочки! думаю это, уфф, последние вопросики в этой теме от меня )) извините что всем так надоедаю, прекрасно понимаю, что спрашиваю абсолютную ерунду, которую можно даже, ничего не понимая в си, самостоятельно изучить за дней 5 максимум для статуса готовности )) но вот так получилось что и каких-то 5 дней не оказалось в свободном времени ((

Последний раз редактировалось natasha_s; 17.01.2008 в 02:49.
natasha_s вне форума Ответить с цитированием
Старый 17.01.2008, 06:47   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от natasha_s Посмотреть сообщение
tablerow_t я так поняла это тоже стандартный тип данных, который находится в каком-то заголовочном файле??
нет. этот тип описан у тебя в DBDescriptor.h
typedef struct
{
unsigned char Author[50];
unsigned char Name[50];
unsigned char Publisher[50];
unsigned char Genre[50];
int Year;
int nPages;
} tablerow_t;

как видишь это структура для хранения информации по книге, т.е. записи таблицы


1) int change(tablerow_t &xRow)
& указывает на то, что параметр передается по ссылке, т.е. все изменения xRow внутри этой функции коснутся передаваемого параметра. Если этого значка не написать, т.е. передать параметр по значению, то изменяца параметр этот внутри функции будет, но по выходу из нее изменения не сохраняца.
Цитата:
void func(int x)
{
x = 10;
// x == 10
}
...
int i = 15;
func(i);
//i == 15

Примерно внутри программы идёт так:
i = 15;
func(i)
int x = i // Создается локальная переменная, в которую заносим значение i
x = 10
// i == 15
Цитата:
void func(int &x)
{
x = 10;
// x == 10
}
...
int i = 15;
func(i);
//i == 10

Примерно внутри программы идёт так:
i = 15;
func(i)
// Переменная x не создаеца, а меняеца напрямую параметр
i = 10
// i == 10
2) std::cin.getline((char*)xRow.Author , 50, '\n')
это вроде как мы считываем строку символов, введенных с клавы, максимальной длиной 50 или пока пользователь не встретится Enter

3)
Код:
DBDescriptor xDataBase;  // Создаем объект собственного типа DBDescriptor
if(!xDataBase.open((unsigned char*)"default.txt")) // Если метод open нашего объекта вернул false, т.е. если мы не открыли файл с базой
{
exit(0);  // зыкрываем программу без сообщения об ошибке
}
xDataBase.readdb(); // читаем базу
4) FileDescriptor(); - это конструктор по умолчанию. вызывается при создании объекта класса. обычно в них инициализируются переменные и выделяется необходимая память. В си конструкторы совпадают с именем класса.
когда компилятор встретит строчку:
FileDescriptor file
или
FileDescriptor *file = new FileDescriptor
, то выполница какраз этот конструктор.
Есть еще конструкторы копирования - то же самое, но они просто с параметрами.
Ну и на всякий случай есть еще деструкторы. если бы он был для данного класса прописан, то имел бы имя: ~FileDescriptor(). параметров у них быть не может. вызываются при уничтожении объекта для освобождения памяти и совершения еще каких-либо требуемых операций

Последний раз редактировалось pu4koff; 17.01.2008 в 06:53.
pu4koff вне форума Ответить с цитированием
Старый 18.01.2008, 22:53   #8
natasha_s
 
Регистрация: 16.01.2008
Сообщений: 5
По умолчанию

ну вот, вчера ничего сдать не получилось, потому что там такая очередь огромная оказалась сдающих курсовые по информатике ( шокировать препода не получилось, зато шокировала своих одногруппничков ) а еще вчера с утра же сдала экзамен 1-й на 5, поздравьте меня )
сегодня прогоняла программу свою в очередной раз, и поняла что не могу объяснить вот эти вещи:

из dbdescriptor.h

1)
typedef std::map<int, tablerow_t>::iterator database_ti;

смущает итератор, что это и с чем его едят, в своём справочнике не нашла (

2)
___________________________
bool addRow(tablerow_t& xRow)
___________________________
вот здесь я запуталась... запуталась из-за до этого объясненной функции
int change(tablerow_t &xrow)
то есть опять смущает амперсант.. (
3)
__________
FILE* m_xFD;
__________
что за FILE?? откуда взялся?

и из dbdescriptor.cpp

4)
Цитата:
bool FileDescriptor:pen(unsigned char *pucFileName)
{
m_xFD=fopen((const char*)pucFileName,"rb+");
if(m_xFD==NULL)
{
return false;
}
почему fopen а не open. "rb+" что это?


5)
DBDescriptor::DBDescriptor(unsigned char *pucFileName) : FileDescriptor(pucFileName)

6)
memcpy(&(xChIter->second),&xNewRow,sizeof(xNewRow) );

7) что за двойная ссылка да еще и никуда не пристроенная так сказать?
if(iRead!=sizeof(xRow) && iRead!=0)
8)
_____________
if (feof(m_xFD))
_____________

что такое feof?

___________________
ps. я оказывается такая дура.. (
pss. pu4koff, почему в аську не выходим, аа? у меня к тебе очень малюсенькое но тем не менее коммерческое предложение )
natasha_s вне форума Ответить с цитированием
Старый 19.01.2008, 08:19   #9
natasha_s
 
Регистрация: 16.01.2008
Сообщений: 5
По умолчанию

видимо мне больше уже не помогут (
natasha_s вне форума Ответить с цитированием
Старый 19.01.2008, 12:47   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от natasha_s Посмотреть сообщение
1)
typedef std::map<int, tablerow_t>::iterator database_ti;

смущает итератор, что это и с чем его едят, в своём справочнике не нашла (
итератор, как я понимаю, это указатель на элемент списка. При помощи него можно узнать какой элемент следующий/предыдущий и все такое. т.е. как бы как это все представлено в памяти. В книге написано: итераторы играют роль указателей на элементы контейнера и позволяют осуществлять навигацию по этим элементам. Во как
Цитата:
Сообщение от natasha_s Посмотреть сообщение
2)
___________________________
bool addRow(tablerow_t& xRow)
___________________________
вот здесь я запуталась... запуталась из-за до этого объясненной функции
int change(tablerow_t &xrow)
то есть опять смущает амперсант.. (
и че он тя так смущает? ну передаеца параметр по ссылке и что такого ужасного? почитай где-нить по способы передачи параметров, а то из меня объснялищик никудышный)
Цитата:
Сообщение от natasha_s Посмотреть сообщение
3)
__________
FILE* m_xFD;
__________
что за FILE?? откуда взялся?
это просто в классе прописан указатель на класс. Открывается файл здесь:
bool FileDescriptor:pen(unsigned char *pucFileName)
{
m_xFD=fopen((const char*)pucFileName,"rb+");
...
}
[/QUOTE]
Цитата:
Сообщение от natasha_s Посмотреть сообщение
4)
почему fopen а не open. "rb+" что это?
потому что создатель так захотел)
используеца FILE*, значит и надо пользовать fopen, fread, fwrite,fclose,...
r - открываем для чтения
b - то, что файл - бинарный
r+ - открываем и для чтения и для записи. файл должен уже существовать кажеца.
видимо тут открываеца бинарный файл на запись и чтение
Цитата:
Сообщение от natasha_s Посмотреть сообщение
5)
DBDescriptor::DBDescriptor(unsigned char *pucFileName) : FileDescriptor(pucFileName)
это конструктор для DBDescriptor. :FileDescriptor(pucFileName) - означает то, что перед выполнением этого конструктора мы выполним конструктор FileDescriptor с указанными параметрами. FileDescriptor - это ес-но предок для DBDescriptor
Цитата:
Сообщение от natasha_s Посмотреть сообщение
6)
memcpy(&(xChIter->second),&xNewRow,sizeof(xNewRow) );
создаем копию куска памяти размера sizeof(xNewRow), на который указывает &xNewRow и эту копию записываем по адресу &(xChIter->second). кажеца так. в общем в xChIter->second копируем xNewRow.
Цитата:
Сообщение от natasha_s Посмотреть сообщение
7) что за двойная ссылка да еще и никуда не пристроенная так сказать?
if(iRead!=sizeof(xRow) && iRead!=0)
while(iRead=read((unsigned char*)&xRow, sizeof(xRow)))
{
if(iRead!=sizeof(xRow) && iRead!=0)
{
exit(0);
}
addRow(xRow);
}
if выполница тогда, когда в файл данные или не записались, или записались, но не полностью. хотя проверка "iRead!=0" по идее не нужна. ведь это выполница только если мы пишем данные размером 0
Цитата:
Сообщение от natasha_s Посмотреть сообщение
8)
_____________
if (feof(m_xFD))
_____________

что такое feof?
eof - end of file. Возвращет истину, если мы дошли до конца файла

Цитата:
Сообщение от natasha_s Посмотреть сообщение
pss. pu4koff, почему в аську не выходим, аа? у меня к тебе очень малюсенькое но тем не менее коммерческое предложение )
я там обычно чуть ли не круглые сутки. вчера правд я лег в 7 вечера, т.к. не спал два дня. А с утра экзамен был. ох уж эта сессия... )
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49