Вопрос № 182349: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите написать программу на С++. ОС Windows XP. Программа должна работать как на Borland Builder C++ 6,2006 так и на VS 2005. Код программы прокомментировать. Условие задачи: Написать пр...
Вопрос № 182349:
Здравствуйте! У меня возникли сложности с таким вопросом: Помогите написать программу на С++. ОС Windows XP. Программа должна работать как на Borland Builder C++ 6,2006 так и на VS 2005. Код программы прокомментировать. Условие задачи: Написать программу для работы с упорядоченной таблицей по запросам оператора. Упорядоченная таблица представлена вектором; каждый элемент таблицы имеет следующую структуру: struct Node { int key; /* ключ элемента */ Item *info; /* указатель на информацию */ }; Максимальный
размер таблицы ограничен (для задания максимального размера таблицы использовать константу - например, const int SIZE = ... ;). Указатель на информацию определяет список элементов с одинаковыми значениями ключей. Элемент списка имеет следующую структуру: struct Item{ int release; /* номер версии */ char *string; /* указатель на строку символов */ Item *next; /* указатель на следующий элемент */ };
Предусмотреть следующие опе
рации: - включение нового элемента в таблицу при условии, что в таблице могут быть разные элементы с одинаковыми ключами; такие элементы включаются в список, связанный с соответствующим элементом таблицы; - удаление из таблицы всех элементов или элемента определенной версии с заданным ключом; - вывод содержимого таблицы на экран.
Сама таблица хранится в основной памяти, а информация, относящаяся к элементу таблицы, хранится во внешней памяти (используется двоичный файл произвольного доступа),
причем она записывается в файл сразу же при выполнении операции включения в таблицу. Имя файла вводится по запросу из программы.
Примечания: Программа должна содержать несколько функций: функция main должна выполнять: вывод меню, ввод и анализ ответа, вызов на исполнение требуемой функции; В программе нужно предусмотреть проверку правильности ввода данных; Следует модифицировать структуру, определяющую элемент списка, включив в неё длину информации и её с
мещение в файле; Для работы с файлом использовать функции пакета stdio.h; чтение и запись выполнять с помощью fread() и fwrite(), в которых должна быть указана реальная длина информации.
Отправлен: 01.03.2011, 16:43
Вопрос задал: Magma (Посетитель)
Всего ответов: 1 Страница вопроса »
Отвечает Киселёва Алёна aka Verena (Профессор) :
Здравствуйте, Magma! Условие несколько неоднозначное, наиболее логичным мне показалось сохранять в файл поле string, таким образом, в оперативной памяти при чтении списка одновременно хранится только одна строка. В принципе, бегать по файлу со смещением - операция не слишком быстрая, так что при таком алгоритме выигрыш весьма сомнителен. В предыдущий код дописаны две функции: - сохранение в файл
Код:
bool SaveToFile (long& offset, char* info) //сохранение в файл строковой информации { FILE* f = fopen (filename, "a+b"); //открываем для добавления в конец if (f==NULL) return false; fseek (f, 0, SEEK_END); //ставим указатель в файле на его конец offset =
ftell(f); //сохраняем текущее смещение int l = strlen(info); if (l!=fwrite (info, 1, l, f)) {fclose (f); return false; } else { fclose (f); return true;} }
- чтение из файла
Код:
char*
ReadFromFile (char* buf, long ofs, int len, FILE* f) //чтение из файла в буфер с заданным смещением, возвращает указатель на тот же буфер для удобства { if (f==NULL) return 0; if (fseek (f, ofs, SEEK_SET)) return 0; //смещаемся на нужное место fread (buf, 1, len, f); //читаем заданное число байт buf[len] = '\0'; return buf; }
Полный изменённый код в приложении. В данном варианте файл используется как временн
ый и после выполнения программы удаляется (сохранять его нет смысла, потому что после завершения программы идентификация записанных в нём данных невозможна). Имя файла задаётся пользователем в начале программы. Удачи!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.