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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

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

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

_Ayl_
Статус: Студент
Рейтинг: 1418
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1233
∙ повысить рейтинг »
Micren
Статус: Бакалавр
Рейтинг: 1097
∙ повысить рейтинг »

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

Номер выпуска:1430
Дата выхода:27.11.2009, 18:30
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:676 / 182
Вопросов / ответов:2 / 2
IRC-канал по теме:#C

Вопрос № 174438: Добрый день, уважаемые эксперты! Прошу у вас помощи в написании программы. определены следующие требования к программе: В ходе работы для всех вариантов необходимо написать подпрограмму создания в оперативной памяти связанного однона...


Вопрос № 174441: Здравствуйте эксперты, надо написать курсовую Все это могу спокойно написать на C++ Builder и писал уже не раз подобные вещи, но вот с VC 6 не могу разобрать что там и к чему, помогите по...

Вопрос № 174438:

Добрый день, уважаемые эксперты!
Прошу у вас помощи в написании программы.
определены следующие требования к программе:
В ходе работы для всех вариантов необходимо написать подпрограмму создания в оперативной памяти связанного однонаправленного списка содержащего данные согласно варианта задания. В программах всех вариантов должна быть подпрограмма вывода на экран всего списка по адресу его первого элемента. Используя эту подпрограмму необходимо вывести в наглядной форме исходный список (непосредственно после его создания) и список после модификации. Основное содержимое программы должно соответствовать варианту.
Примечание: В конце программы необходимо освободить всю захваченную память.
Задание заключается в следующем:
В элементе списка содержатся данные о ноутбуке-наименование,цена,тактовая частота,размер ОП.Удалить из списка элемент с максимальной ценой.
Я написал программу, но она выводит список не в том порядке, в како м я заносил данные.и не получается удалить требуемый элемент.ПОМОГИТЕ!

Отправлен: 22.11.2009, 14:16
Вопрос задал: Jekaiseburga, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Micren, Бакалавр :
Здравствуйте, Jekaiseburga.
Программа. C++. GCC.
Код:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <limits>

template<class Ty> class list;

// Узел списка
template<class Ty>
class node
{
private:
node(Ty item=Ty())
:_next(0)
,_data(item)
{}
Ty _data;
node* _next;
friend class list<Ty>;
public:
Ty data() const
{
return _data;
}
};

// Список
template<class Ty>
class list
{
public:
typedef node<Ty> node_type;
list()
:_root(0)
,_tail(0)
,_count(0)
{}
~list()
{
clear();
}
// Очистка списка
void clear()
{
while (_root)
{
remove_first();
}
}
// Удаляет первый элемент
void remove_first()
{
if (_root)
{
node_type* nodePtr=_root;
if (!(_root=_root->_next))
{
_tail=0;
}
delete nodePtr;
--_count;
}
}
// Удаляет элемент заданный узлом
void remove(const node_type* nodePtr)
{
if (_root==nodePtr)
{
_root=nodePtr->_next;
delete nodePtr;
--_count;
}
else
{
node_type* cur=_root;
while (cur && cur->_next!=nodePtr)
{
cur=cur->_next;
}
if (cur)
{
cur->_next=nodePtr->_next;
delete nodePtr;
--_count;
}
}
}
// Добавляет элемент в начало
void add_first(Ty item)
{
node_type* n odePtr=new node<Ty> (item);
nodePtr->_next=_root;
if (!_root)
{
_tail=nodePtr;
}
_root=nodePtr;
++_count;
}
// Добавляет элемент в конец
void add_last(Ty item)
{
node_type* nodePtr=new node<Ty>(item);
if (_root)
{
_tail->_next=nodePtr;
_tail=nodePtr;
}
else
{
_root=_tail=nodePtr;
}
++_count;
}
// Возвращает размер
size_t count() const
{
return _count;
}
// Возвращает указатель на начало
const node_type* const begin() const
{
return _root;
}
// Возвращает указатель на следующий элемент
const node_type* const next(const node_type* const n) const
{
return n?n->_next:0;
}
private:
node_type* _root;
node_type* _tail;
size_t _count;
};

// Класс ноутбук
class nout
{
public:
nout(std:: string name,double price,double frequency,size_t memory)
:_name(name)
,_price(price)
,_frequency(frequency)
,_memory(memory)
{};
std::string name() const
{
return _name;
}
double price() const
{
return _price;
}
double frequency() const
{
return _frequency;
}
size_t memory() const
{
return _memory;
}
private:
std::string _name;
double _price,_frequency;
size_t _memory;
};

// Оператор вывода для class nout
template<class Elem,class Traits>
std::basic_ostream<Elem,Traits>& operator<<(std::basic_ostream<Elem,Traits>& stream,const nout& right)
{
stream<<"\""<<right.name()<<"\"("<<right.price()<<"$,"<<right.frequency()<<"GHz,"<<right.memory()<<"Mb)";
return stream;
}
// Оператор вывода для template<> class list<Ty>
template<class Ty,class Elem,class Traits>
std::basic_ostre am<Elem,Traits>& operator<<(std::basic_ostream<Elem,Traits>& stream,const list<Ty>& right)
{
const node<Ty>* nodePtr=right.begin();
while (nodePtr)
{
stream<<nodePtr->data()<<std::endl;
nodePtr=right.next(nodePtr);
}
return stream;
}

// Ф-я для ввода различных данных
template<class Ty>
Ty input(std::string message)
{
while (true)
{
std::cout<<message;
Ty result;
std::cin>>result;
if (std::cin.fail())
{
std::cout<<"Ошибочный ввод"<<std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
else
{
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
return result;
}
}
}

// Меню
int menu()
{
while (true)
{
std::cout<<"----------------------------------------------------"<<std::endl
<<"Сделайте выбор:"<<std::endl
<<"1-Ввод списка"<<std::endl
<<"2-Вывод списка на экран"<<std::endl
<<"3-Удаление элемента с максимальной ценой"<<std::endl
<<"0-Выход"<<std::endl
<<"Ваш выбор:";
char choice;
std::cin.get(choice);
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
switch (choice)
{
case '0':
case '1':
case '2':
case '3':
return choice-'0';
default:
std::cout<<"Будьте внимательней"<<std::endl;
}
}
}

typedef list<nout> noutList;

// Добавляет элементы в список
void addInList(noutList& lst)
{
while (true)
{
std::cout<<"Наименование модели(пустая строка для завершения):";
std::string name;
std::getline(std::cin,name);
if (name.empty())
{
return;
}
double price=input<double>("Цена:");
double freq=input<double>("Частота процессора(GHz):");
size_t mem=input<size_t>("Объем памяти:");
lst.add_last(nout(name,price,freq,mem));
}
}

// Выводит список
void printList(const noutList& lst)
{
std::cout<<"Наш список:"<<std::endl
<<lst;
}

// Удаляет элемент с максимальной ценой
void removeMaxPrice(noutList& lst)
{
if (lst.count())
{
const noutList::node_type* cur=lst.begin();
const noutList::node_type* max=cur;
while (cur)
{
if (max-> ;data().price()<cur->data().price())
{
max=cur;
}
cur=lst.next(cur);
}
lst.remove(max);
}
else
{
std::cout<<"Список не содержит элементов"<<std::endl;
}
}

int main(int argc, char **argv)
{
noutList lst;
while (true)
{
switch (menu())
{
case 0:
return 0;
case 1:
addInList(lst);
break;
case 2:
printList(lst);
break;
case 3:
removeMaxPrice(lst);
break;
}
}
}

Пример вывода:
Код:
micren@localhost:~/projects/174438/build> ./174438                                                                
        
----------------------------------------------------
Сдела йте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:1
Наименование модели(пустая строка для завершения):Acer Aspire One D250-0Bp
Цена:367
Частота процессора( GHz):1.6
Объем памяти:1024
Наименование модели(пустая строка для завершения):ASUS Eee PC 701 4G
Цена:244
Частота процессора(GHz):0.9
Объем памяти:512
Наименование модели(пустая строка для завершения):ASUS K50C
Цена:495
Частота процессора(GHz):1.2
Объем памяти:4096
Наименование модели(пустая строка для завершения):HP Presario CQ60-211
Цена:500
Частота процессора(GHz):2.167
Объем памяти:2048
Наименование модели(пустая строка для завершения):Lenovo IdeaPad S10 plus2
Цена:409
Частота процессора(GHz):1.66
Объем памяти:1024
Наименование модели(пустая строка для завершения):
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:2
Наш список:
"Acer Aspire One D250-0Bp"(367$,1.6GHz,1024Mb)
"ASUS Eee PC 701 4G"(244$,0.9GHz,512Mb)
"ASUS K50C"(495$,1.2GHz,4096Mb)
"HP Presario CQ60-211"(500$,2.167GHz,2048Mb)
"Lenovo IdeaPad S10 plus2"(409$,1.66GHz,1024Mb)
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:3
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:2
Наш список:
"Acer Aspire One D250-0Bp"(367$,1.6GHz,1024Mb)
"ASUS Eee PC 701 4G"(244$,0.9GHz,512Mb)
"ASUS K50C"(495$,1.2GHz,4096Mb)
"Lenovo IdeaPad S10 plus2"(409$,1.66GHz,1024Mb)
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:3
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:2
Наш список:
"Acer Aspire One D250-0Bp"(367$,1.6GHz,1024Mb)
"ASUS Eee PC 701 4G"(244$,0.9GHz,512Mb)
"Lenovo IdeaPad S10 plus2"(409$,1.66GHz,1024Mb)
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:3
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:2
Наш список:
"Acer Aspire One D250-0Bp"(367$,1.6GHz,1024Mb)
"ASUS Eee PC 701 4G"(244$,0.9GHz,512Mb)
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:3
----------------------------------------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:2
Наш список:
"ASUS Eee PC 701 4G"(244$,0.9GHz,512Mb)
-------------------------------- --------------------
Сделайте выбор:
1-Ввод списка
2-Вывод списка на экран
3-Удаление элемента с максимальной ценой
0-Выход
Ваш выбор:0
micren@localhost:~/projects/174438/build>

Ответ отправил: Micren, Бакалавр
Ответ отправлен: 22.11.2009, 19:00

Оценка ответа: 5
Комментарий к оценке:
Просто на отлично!Не ожидал, что так быстро ответ будет.

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


    Вопрос № 174441:

    Здравствуйте эксперты, надо написать курсовую
    Все это могу спокойно написать на C++ Builder и писал уже не раз подобные вещи, но вот с VC 6 не могу разобрать что там и к чему, помогите пожалуйста адаптироваться, я не надеюсь что это не сложно. Заранее спасибо

    Отправлен: 22.11.2009, 17:46
    Вопрос задал: Tribak, Студент
    Всего ответов: 1
    Страница вопроса »


    Отвечает Dr_Andrew, Старший модератор :
    Здравствуйте, Tribak.
    Если в Borland C++ Builder графический интерфейс пользователя строится с помощью "обёртки" над WinAPI, классов VCL, то в MS Visual C++ 6 - с помощью MFC. Следовательно, Вам сюда: MFC шаг за шагом.

    Ответ отправил: Dr_Andrew, Старший модератор
    Ответ отправлен: 24.11.2009, 08:43
    Казахстан, Алма-Ата
    Организация: Казахский научный центр карантинных и зоонозных инфекций
    Адрес сайта: Медицинские программы для Linux
    ICQ # 256452186

    Оценка ответа: 5

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


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

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

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

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

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

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

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


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

    В избранное