Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Помогите с C++


Рекомендуемые сообщения

Pathfinder:

Создать класс координат (double). Определить унарный оператор ++ как

дружественную функцию.Определить бинарный оператор +, как функцию-член. Сложить

координаты с друг другом и с числом. Присвоить координаты(=).

Что такое "сложить координаты с друг другом", я истолковал как попарное сложение координат при сложении объектов. Можно также прибавить к объекту число, тогда оно прибавится к обеим координатам.
#include <iostream.h>class point{public: double x, y;  point(double rex, double rey){x=rex; y=rey;} point(){x=0; y=0;} point operator ++ (){x++; y++;} point operator + (point &T){return point(x+T.x, y+T.y);}  point operator + (double g){return point(x+g, y+g);}  point operator=(const point &r){if(this!=&r){x=r.x; y=r.y;} return *this;}  };main(){ point Tp(2,2),Td(5,5),Te,Tf;		 cout<<Tp.x<<"   "<<Tp.y<<endl; ++Tp;	  cout<<Tp.x<<"   "<<Tp.y<<endl; Te=Tp+Td;  cout<<Te.x<<"   "<<Te.y<<endl; Te=Tp+4;   cout<<Tp.x<<"   "<<Tp.y<<endl; Tf=Te;	 cout<<Tf.x<<"   "<<Tf.y<<endl; getchar();}

Второй задачей заниматься не буду, чересчур долгая затея :) .

P.S. Тьфу, забыл, что ++ надо было определить как дружественную функцию. Поэтому поправка: надо заменить строку

point operator ++ (){x++; y++;}

на чуть более громоздкую

friend point operator ++ (point& T){T.x++; T.y++; return T;}

Lion HC:

Или все же есть возможность обмениваться данными через произвольную функцию творения?
Через произвольную функцию - нет (у разных процессов разные адресные пространства), но в Windows есть несколько средств связи между процессами, при помощи которых они могут обмениваться данными: FileMapping (обмен через систему виртуальной памяти, т.е. проекцию файла подкачки на оперативную память), каналы (вроде конвейеров в MS-DOS), сокеты (WinSock - имитация или действительное использование сети). Можно, конечно, использовать и просто запись в файлы и чтение из них, хотя это медленнее и без синхронизации, зато не требует разбираться в вышеописанном. Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 169
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Тролль, :) огромное спасибо, честно говоря, не ожидал, что мне ответят, над второй задачкой придётся очень сильно попыхтеть. :)

Ссылка на комментарий
Поделиться на другие сайты

Pathfinder:

над второй задачкой придётся очень сильно попыхтеть.
Да уж, задание явно написано не с трезвой головы. Предлагается создать глупые операции и использовать для них неподходящие обозначения.

У очереди, по идее, должно быть три операции: помещение элемента в очередь, извлечение элемента из очереди и проверка пустоты очереди.

В задании предлагается ++ использовать для добавки элемента в очередь, но ++ - унарная операция, может иметь только один операнд, ее можно "прицепить" к числу, можно к очереди, но связать число с очередью - нет. Аналогично, -- может вытащить элемент из очереди, но его обычно надо не выкинуть в ведро, а присвоить какой-то переменной для дальнейшего использования или хоть распечатки, то есть опять надо связывать две вещи, а операция унарная. А операции с выходным элементом очереди было бы проще делать без всякого доопределения операций: вытащил из очереди, сложил или перемножил с чем-то и затолкал обратно в очередь.

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

Тогда реализация может выглядеть, например, как показано ниже. Приходится извиниться, что из-за требования обеспечить чесание ушей ногами эти ноги пришлось делать кривыми. На шедевр явно не тянет.

#include <iostream.h>class Queue {public:   float info;    struct rec{float info; rec *ref;}; rec *beg, *end, *q;   void operator ++(){q=new rec; q->ref=NULL; end->info=info; end->ref=q; end=q;}  void operator +(float i){info+=i;}  friend void operator *(Queue &T,float i){T.info*=i;}  Queue(){q=new rec; q->ref=NULL; q->info=0; beg=end=q;}  friend bool operator --(Queue& T){if(T.beg->ref==T.end->ref)return false;  else{T.info=T.beg->info; T.q=T.beg->ref; delete T.beg; T.beg=T.q; return true;}} };int main()	{Queue q; float f;while(f){cout<<" Enter number: "; cin>>f; if(f){q.info=f; q+10; q*10; ++q;}}cout<<endl; while(--q)cout<<q.info<<endl; getchar(); getchar(); return 0;}

Из-за требования использования унарных операций для занесения в очередь и извлечения из очереди приходится эти действия выполнять в два приема каждое. В классе выделяем переменную связи с очередью info и при записи в очередь сначала заносим в нее нужное число, а затем отдельно заталкиваем содержимое этой переменной в очередь. А для извлечения из очереди выполняем унарную операцию извлечения из очереди в переменную связи и потом ее содержание присваиваем чему уж там хотим. Операции сложения с числом и умножения на него выглядят уродливо, поскольку их результат ничему не надо присваивать. В общем, марсианская математика.

Программка для тестирования принимает числа в очередь до тех пор, пока не будет введен нуль. Каждое принятое в очередь число складывается с 10, после чего умножается на 10, чтобы продемонстрировать работу с элементом очереди. Когда будет введен нуль, он в очередь не записывается, а программа начинает извлекать числа из очереди и распечатывать их, пока все они не будут удалены из очереди. Если вводилось, скажем, 2, то оно после демонстрации операций над ним при его вводе превратилось в (2+10)*10, то есть 120, и таким будет извлечено и распечатано.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль: Да уж, задание явно написано не с трезвой головы.

Тролль, я с тобой полностью согласен, не знаю где наш препод откопал это задание, может быть он сам его придумал (на такие глупости он способен!!) . В общем большое спасибо за подробный разбор этого задания. :mad: Сдавать лабу буду, твою помощь не забуду. Слушай, будет нечем заняться посмотри вот ещё два задания

Задание 1. Одиночное наследование.

Создать класс четырехугольников, квадратов и прямоугольников. Создать из них

иерархию. Определить функции печати, конструкторы и деструкторы, вычисление

площади и периметра.

Задание 2. Множественное наследование.

Создать иерархию типов, описывающую данные - сигнал, данные результат обработки и

данные, как результат обработки сигнала и представляющие собой сигнал. Классы

должны конструкторы, включая конструктор копирования, виртуальные деструкторы,

перегруженные функции вывода в поток и ввода в поток.:g:

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Нужна помощь...

Нужно сделать элементарную консольную программу, которая при нажатии на "1" прописывает определенные значения IP, mask, шлюз и DNS сервера в подключении...При нажатии на "2" - ставить все настройки динамически (на автоматическое получение)...

скажем, команда для установки IP и т.д. следующая

netsh -c interface ip set address "Подключение по локальной сети" static 192.168.1.45 255.255.255.0 192.168.1.1

как реализовать ее выполнение в C++ ? Копать в system() ?

Ссылка на комментарий
Поделиться на другие сайты

Хексем:

Проще всего использовать system(). Это просто передает обработку команды командному процессору Windows, работать с которым проще и привычнее.

Можно также использовать функцию CreateProcess(), которая использует API, но это более сложный путь.

Ссылка на комментарий
Поделиться на другие сайты

Хексем:

Проще всего использовать system(). Это просто передает обработку команды командному процессору Windows, работать с которым проще и привычнее.

Можно также использовать функцию CreateProcess(), которая использует API, но это более сложный путь.

В качетве параметра функции system() может быть любая строка ?

Скажем

system("netsh -c interface ip set address "Подключение по локальной сети" static 192.168.1.45 255.255.255.0 192.168.1.1");

не компилируется. В чем причина - не знаю... :)

Ссылка на комментарий
Поделиться на другие сайты

Причина - в правилах записи строковых констант C++. На стадии компиляции знак " перед словом Подключение будет понят как завершающий строку. Чтобы записать внутри строки знак ", в C++ применяется специальное соглашение. Правильная запись:

system("netsh -c interface ip set address ""Подключение по локальной сети"" static 192.168.1.45 255.255.255.0 192.168.1.1");

Ссылка на комментарий
Поделиться на другие сайты

Причина - в правилах записи строковых констант C++. На стадии компиляции знак " перед словом Подключение будет понят как завершающий строку. Чтобы записать внутри строки знак ", в C++ применяется специальное соглашение. Правильная запись:

system("netsh -c interface ip set address ""Подключение по локальной сети"" static 192.168.1.45 255.255.255.0 192.168.1.1");

Спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Немного странный вопрос по Visual C++ 2005...

До недавнего времени прогал на VS 6.0, ctujlyz gjcnfdbk 2005...

Как программу запустить на выполнение ? ;)

В VS 6.0 компилился Ctrl+F5...

Ссылка на комментарий
Поделиться на другие сайты

Правильная запись:

system("netsh -c interface ip set address ""Подключение по локальной сети"" static 192.168.1.45 255.255.255.0 192.168.1.1");

Думаю правильней будет:

system("netsh -c interface ip set address \"Подключение по локальной сети\" static 192.168.1.45 255.255.255.0 192.168.1.1");

так проще запомнить и не запутаться, ведь именно знак \ делает из любого зарезервированого символа обычный.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

А можно посмотреть на результат?

Lion HC, я бы мог тебе результаты на ящик кинуть. Нереально всё это здесь разместить.

Ссылка на комментарий
Поделиться на другие сайты

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

Если не трудно, пожалуйста на мыло: Lion.HC@gmail.com

Я ведь сам учусь, интересно посмотреть...

Ссылка на комментарий
Поделиться на другие сайты

Немного странный вопрос по Visual C++ 2005...

До недавнего времени прогал на VS 6.0, ctujlyz gjcnfdbk 2005...

Как программу запустить на выполнение ? :D

В VS 6.0 компилился Ctrl+F5...

F5 - запуск программы, F10 и F11 - пошаговая отладка,

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Подскажите пожалуйста каким типом или классом стандартной библиотеки можна воспользоваться для обработки даных времени.

Но нужно учитывать и миллисекунды. К сожалению TTime, TDateTime, time_t не содержат миллисекунды. Или нужно писать свой клас?

Примерно данные должны представлять: миллисекунды, ss, m, +\-h

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
Гость Хексем

Подскажите где можно прочитать описание библиотечных файлов, таких как

iostream.h

conio.h

string.h

stdlib.h и т.д. на русском языке.

Можете подсказать какую-нибудь хорошую книгу, с описанием бмблиотек C++ и примерами использования функций. По поиску много находит, так что, что именно читать определиться трудно =)

Ссылка на комментарий
Поделиться на другие сайты

Надо смотреть книгу по конкретной версии языка. Библиотеки функций и классов C++ в разных реализациях разные, к тому же со временем еще и меняются. Конечно, обычно в файлах разных реализаций много общего, но часто встречаются и существенные отличия.

Кстати, имена файлов, которые ты привел, являются именами не библиотечных, а заголовочных файлов. Но сейчас в стандартной библиотеке стандарта C++ файлов с такими именами вообще нет - они использовались в старых версиях C++. В именах новых заголовочных файлов нет расширений .h, да и сами эти файлы тоже различаются в разных реализациях.

Впрочем, для совместимости во всех существующих реализациях C++ старые заголовочные файлы тоже можно использовать, хотя обычно выдается предупреждение, что вы пользуетесь устаревшим вариантом заголовочного файла соответствующей библиотеки.

При изучении C++ очень часто жалуются, что вот кто-то взял учебник, а примеры из него не работают - значит, человек использует другую версию языка, точнее, библиотек. Поэтому надо брать учебник или справочник по конкретной версии C++ - там будет описано именно тот вариант библиотек и заголовочных файлов, который есть в этой версии.

"Страуструп всегда довольно прохладно относился к попытке его (языка) полной стандартизации и выступал за реализации, в которых базовые возможности языка расширялись бы средствами и библиотеками, характерными только для данной реализации."

Ссылка на комментарий
Поделиться на другие сайты

Реализация - компилятор, библиотеки, интегрированная среда какого-то одного разработчика.

Например, реализация Microsoft - Visual C++, реализация фирмы Borland - Borland C++ Builder, реализация фирмы Intel - Intel C++, реализация фирмы Watcom (впоследствии Sybase) - Watcom C++, Open Source проект - wxDev-C++...

А версия - это номер очередного варианта какой-либо реализации, например Borland C++ Builder 6 - шестая версия реализации C++ фирмой Borland.

Постепенно язык изменялся, вводились новые средства, но, естественно, каждая фирма старалась для совместимости сохранить и то устаревшее, что у нее было в прежних версиях - было бы нехорошо, если бы клиент, купивший новую версию, не мог использовать с ней свои старые исходные коды программ. А в отношении библиотек разных фирм - они сближались, но все же различия остаются, особенно если использовать старые варианты библиотек. К примеру, недавно на форуме проскочила задача с переводом целого числа в строку - у Borland это функция itoa, у Microsoft - _itoa. А библиотеки визуальных компонентов у Borland и Microsoft совсем разные -- VCL и MFC.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу



×
×
  • Создать...