Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 7464
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2645
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2327
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1643
Дата выхода:10.03.2011, 18:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:317 / 185
Вопросов / ответов:1 / 1

Вопрос № 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;
}

Полный изменённый код в приложении. В данном варианте файл используется как временн ый и после выполнения программы удаляется (сохранять его нет смысла, потому что после завершения программы идентификация записанных в нём данных невозможна). Имя файла задаётся пользователем в начале программы.
Удачи!

Приложение:

-----
Эта история - не для истории, понимаешь?

Ответ отправил: Киселёва Алёна aka Verena (Профессор)
Ответ отправлен: 09.03.2011, 23:36
Номер ответа: 266174
Россия, Москва
Адрес: Москва, Солнцево
Адрес сайта: Творчество, цитаты, события.
ICQ # 230360822

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266174 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное