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

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


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

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

Чемпионы рейтинга экспертов в этой рассылке

Гаряка Асмик
Статус: Специалист
Рейтинг: 4131
∙ повысить рейтинг »
lamed
Статус: Профессионал
Рейтинг: 2754
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2487
∙ повысить рейтинг »

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

Номер выпуска:1547
Дата выхода:06.06.2010, 19:30
Администратор рассылки:Verena, Профессионал
Подписчиков / экспертов:389 / 167
Вопросов / ответов:3 / 3
IRC-канал по теме:#C

Вопрос № 178788: Здравствуйте, Ув. Эксперты! Ответ нужен ОЧЕНЬ СРОЧНО! - заранее благодарю за помощь ... Есть программа (С++) к след. задаче: Написать программу учета нарушений правил дорожного движения. Для каждой автомашины надо хранить в базе список нар...


Вопрос № 178794: Здравствуйте уважаемые эксперты!!!У меня есть программа Множество(непрерывная реализация с упорядочиванием).Создать методы:очистка множества, проверка на наличие элемента, добавление элемента, удоление элемента, умножение двух множеств.Мне нужно пере...
Вопрос № 178803: Здравстуйте уважаемые эксперты! Помогите пожалуйста с написанием консольного приложения, которое осуществляет копирование 10 последних строк из одного файла в другой. Для компиляции буду использовать C++ Builder 6.0. Спасибо большое
Вопрос № 178788:

Здравствуйте, Ув. Эксперты! Ответ нужен ОЧЕНЬ СРОЧНО! - заранее благодарю за помощь ...

Есть программа (С++) к след. задаче:
Написать программу учета нарушений правил дорожного движения. Для каждой автомашины надо хранить в базе список нарушений. Для каждого нарушения фиксируется дата, время, вид нарушения и размер штрафа. При оплате всех штрафов автомашина удаляется из базы.

Ее код - в приложении ...

Необходимо просто переделать эту прогу для такой задачи:

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

Программа должна обеспечивать:
1)начальное формирование базы данных в виде бинарного дерева
2) при уплате всех налогов (сумма и имя вводятся с консоли) лицо удаляется
3) по запросу вывод ятся сведения о физ. и юрид. лицах отдельно

Только просьба: без файлов! (fstream не надо подключать)

Пжлст, кто может ... - отблагодарю ...

Отправлен: 31.05.2010, 21:14
Вопрос задал: Amfisat, 2-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Verena, Профессионал :
Здравствуйте, Amfisat.
Вот переделанная программа. Добавила комментариев. Все данные хранятся в дереве, в каждом узле дерева дополнительно хранится список. Для дерева используются стандартные рекурсивные алгоритмы, обход сверху вниз. Про алгоритмы работы с деревьями можно почитать, например, здесь.
Для хранения базы данных используется текстовый файл, для чтения/записи используются потоки ifstream и ofstream.
Если будут вопросы, пишите в мини-форум.
Проверено на VS 2005.
Удачи!

Приложение:

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

Ответ отправил: Verena, Профессионал
Ответ отправлен: 02.06.2010, 18:11
Номер ответа: 261826

Оценка ответа: 5
Комментарий к оценке:
Четко, ясно, с расстановкой ... )))

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

  • Вопрос № 178794:

    Здравствуйте уважаемые эксперты!!!У меня есть программа Множество(непрерывная реализация с упорядочиванием).Создать методы:очистка множества, проверка на наличие элемента, добавление элемента, удоление элемента, умножение двух множеств.Мне нужно переделать эту программу так, чтобы была непрерывная реализация БЕЗ упорядочивания!!!
    Помогите пожалуйста, заранее благодарен

    Отправлен: 31.05.2010, 22:24
    Вопрос задал: Дианов Р.З, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Verena, Профессионал :
    Здравствуйте, Дианов Р.З.
    Изменения старалась сделать минимальные. Во-первых, в исходном коде были ошибки. Вот основные:
    1. Если пользуетесь статическим массивом, надо при добавлении элемента проверять на переполнение (чтобы size был меньше 16).
    2. Во всех циклах класса надо использовать переменную size, а не какую-то загадочную константу. У Вас число элементов переменно, а такой цикл не будет это учитывать.
    3. Желательно создать конструктор копирования и перегрузить оператор присваивания, если вы используете конструкции, в которых один экземпляр класса присваивается другому. Я их добавила.
    4. При передаче класса в параметрах функций лучше использовать передачу по ссылке (название_класса&).
    5. При работе с дополнительным экземпляром класса в методе всё равно стоит пользоваться его методами, а не прямым доступом к полям.
    Поскольку в логике упорядочивание у Вас нигде не использовалось, было достаточно убрать сортировку из функции добавления.
    Код в пр иложении, проверено в Visual Studio 2005, если Вы работаете в другой среде, возможно, понадобятся незначительные изменения для компиляции.
    Удачи!

    Приложение:

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

    Ответ отправил: Verena, Профессионал
    Ответ отправлен: 04.06.2010, 19:28
    Номер ответа: 261883

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

  • Вопрос № 178803:

    Здравстуйте уважаемые эксперты! Помогите пожалуйста с написанием консольного приложения, которое осуществляет копирование 10 последних строк из одного файла в другой. Для компиляции буду использовать C++ Builder 6.0. Спасибо большое

    Отправлен: 01.06.2010, 17:02
    Вопрос задал: Мироненко Николай Николаевич, Практикант
    Всего ответов: 1
    Страница вопроса »


    Отвечает amnick, Студент :
    Здравствуйте, Мироненко Николай Николаевич.

    Предлагаю Вам два варианта программы — (1) с потоками и (2) файловый ввод/вывод в стиле C. Обе программы построены по одной схеме: если заданы параметры в командной строке (см. комментарии в коде), то имена входного и результирующего файлов берутся из нее, иначе - запрашиваются у пользователя. Исходный файл читается построчно с сохранением 10 последних прочитанных строк в циклическом буфере. Это позволяет избежать ненужного копирования и к концу мы получаем в буфере 10 последних строк файла. Затем буфер просто сбрасывается в выходной файл.

    Ниже приведено решение с использованием потоков:
    Код:
    // Написать консольное приложение, которое осуществляет копирование 
    // 10 последних строк из одного файла в другой.

    #include <fstream>
    #include <iostream>
    using namespace std;

    const int nLines = 10;

    int main( int argc, char* argv[] )
    {
    char szInput[_MAX_PATH], szOutput[_MAX_PATH];
    char *pInName, *pOutName;
    if( argc >= 2 ) // если в командной строке переданы параметры,
    pInName = argv[1]; // то первый из них - имя обрабатываемого файла
    else { // иначе - запрашиваем имя файла у пользователя
    cout << "Введите имя исходного файла: ";
    cin >> szInput;
    pInName = szInput;
    }
    // открываем файл
    ifstream fin( pInName, ios::in );
    if( !fin.is_open() ) {
    cout << "Ошибка при открытии файла \"" << pInName << "\"\n";
    return 1;
    }

    if( argc >= 3 ) // если в командной строке переданы параметры,
    pOutName = argv[2]; // то второй - имя результирующего файла
    else { // иначе - запрашиваем имя файла у пользователя
    cout << "Введите имя результирующего файла: ";
    cin >> szOutput;
    pOutName = szOutput;
    }

    // читаем файл построчно
    cout << "\nЧтение файла '" << pInName << "'...";

    char str[nLines][256]; // массив для 10 строк
    int i = 0; // куда помещать очередную строку
    unsigned nTotal = 0; // общее число строк
    while( fin.rdstate() == ios::goodbit ) { // читаем очередную строку
    fin.getline( str[i], sizeof str[0] );
    ++nTotal; // подсчитываем число строк
    i = (i+1) % nLines; // индекс очередной строки
    }
    fin.close(); // закрываем файл

    // создаем результирующий файл
    ofstream fout( pOutName, ios::out );
    if( !fout.is_open() ) {
    cout << "Ошибка при создании файла \"" << pOutName << "\"\n";
    return 2;
    }

    // записываем результат
    cout << &quo t;\nЗапись файла '" << pOutName << "'...";

    for( int j = 0; j < nLines && j < nTotal; ++j ) {
    fout << str[i] << endl;
    i = (i+1) % nLines; // индекс очередной строки
    }
    fout.close(); // закрываем файл
    return 0;
    }


    Приведенное решение страдает недостатком - при чтении исходного файла не сохраняется признак конца строки, поэтому при выводе мы должны писать его "ручками":
    fout << str[i] << endl;
    В результате в выходной файл записывается одна лишняя строка.
    Этого можно избежать, усложнив цикл чтения:
    Код:

    while( fin.rdstate() == ios::goodbit ) { // читаем очередную строку
    //fin.getline( str [i], sizeof str[0] );
    char s[256];
    fin.getline( s, sizeof s );
    if( !s[0] && fin.rdstate() != ios::goodbit )
    br eak;

    strcpy( str[i], s );

    ++nTotal; // подсчитываем число строк
    i = (i+1) % nLines; // индекс очередной строки
    }

    Цена этого - лишнее копирование каждой прочитанной строки.
    Этого недостатка лишен приведенный в приложении вариант с использованием файлового ввода/вывода в стиле C.

    Программы проверены в MSVC++6.0, но должны компилироваться и в Borland C++ Builder 6.0.

    Успехов!

    Приложение:

    Ответ отправил: amnick, Студент
    Ответ отправлен: 01.06.2010, 21:19
    Номер ответа: 261810

    Оценка ответа: 5
    Комментарий к оценке:
    Огромное Вам спасибо, мне нужно это уже на четверг, а сам я реально не успел бы сделать, т.к. с файлами на С++ не работал, писал только несложные консольные программки уровня университетских лабораторных первого курса. Я так понял файлы передаем в командной строке как аргументы?

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

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

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

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

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

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

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

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


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное