Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

nsg

Пользователи ST test (off)
  • Постов

    99
  • Зарегистрирован

  • Посещение

Достижения nsg

живет тут

живет тут (5/5)

0

Репутация

  1. Комплекс "AIASM" тебе поможет...На данный момент в комплексе реализованы 15 индексов http://forum.masterforex-v.org/index.php?showtopic=4047
  2. А. Я. Архангельский Работа с локальными базами данных в Delphi 5 Книга рассказывает о возможности эффективной работы с базами данных Delphi 5. Основное внимание сосредоточено на методике работы с локальными базами данных. Рассматривается создание баз данных и псевдонимов, простые приложения для работы с базами данных, доступ к базам данных через Microsoft ActiveX Data Objects. Описаны характеристики некоторых типов драйверов, даются справочные сведения по компонентам, свойствам и методам, предназначенных для работы с базами данных. Архангельский Работа с локальными базами данных.rar
  3. П. В. Румянцев Азбука программирования в Win32 API (4-е издание) П. В. Румянцев Азбука программирования в Win 32 AP.rar
  4. Классы и указатели На прошлых уроках мы видели только один способ объявления экземпляров класса - а именно мы писали что-то вроде: CMyClass z; Вообще же говоря экземпляры класса лучше во многих случаях заводить не в стеке, а в куче (at heap) Это, в частности, связано с тем, что стек - вещь довольно-таки ограниченная по объему, классы же часто представляют из себя довольно-таки большие и сложные объекты, и если вы будете размещать в стеке что-то вроде массива экземпляров класса, то объема стека просто может не хватить (хотя, конечно, для учебных программм это случится навряд ли). Так же как и для встроенных типов данных для размещения экземпляра класса в куче использется оператор new. Именно он и занимается выделением памяти. Вот пример: CMyClass * z; z = new CMyClass; // Непосредственное выделение памяти. Конструктор класса при этом вызовется на второй строке, т. е. в операторе new. Эти два оператора можно объединить: CMyClass * z = new CMyClass; // Непосредственное выделение памяти. Если в классе есть конструктор с параметрами, то он вызывается примерно так: // Вызов конструтора с одним параметром. CMyClass * z = new CMyClass(22); // Вызов конструтора с двумя параметрами. CMyClass * z = new CMyClass(22, 44); Еще одно отличие между двумя способами создания экземпляра класса (в стеке или в куче) - это вызов методов класса. Если при создании экземпляра в стеке между именем экземпляра и именем метода используется точка, то при создании экземпляра класса в куче (т. е. через оператор new) используется стрелочка. Вот пример: CMyClass * z = new CMyClass; z->SomeMethod();
  5. Конструкторы и деструкторы Конструкторы и деструкторы - это специальные методы класса. Это надо понять в первую очередь. Разумеется, эти методы обладают целым рядом особенностей (именно по этому они и выделены в специальную группу). Сейчас об этих особенностях и поговорим. Первое. В отличие от других методов они должны называться особым образом. Если обычные методы могут называться как угодно, то имя констуктора должно совпадать с именем класса, а имя деструктора - с именем класса с приписанной в начале тильдой. Например, если класс называется CRect, то конструктор этого класса обязан называться тоже CRect, а деструктор - ~CRect. Второе. В отличии от других методов конструктор и деструктор вызываются сами (а другие методы мы вызываем явным образом). Конструктор вызывается в момент создания экземпляра класса, а деструктор - в момент уничтожения. Т. е. их не надо вызывать явным образом - они вызываются сами. Именно поэтому конструкторы обычно используются для задания некоторых начальных значений для переменных класса, а деструкторы - для освобождения памяти (в случае если у вас есть внутри класса переменные-указатели). Третье. Ни конструктор, ни деструктор не возвращают никакого значения (даже типа void). Это означает, в частности, что при обяъвлении конструтора и деструктора в классе мы перед ними не пишем ни какой тип. Четвертое. В классе может быть несколько конструкторов (и они должны различаться параметрами), и только один деструктор (у него параметров вообще быть не может). Вот пример на все вышесказанное : class CRect { float m_a, m_b; //Стороны. public: //Конструкторы и деструктор. CRect(); // Конструктор без параметров. CRect(float a. float b); // Конструктор с двумя параметрами. ~CRect(); // Деструктор. ... }; ... // Реализация конструкторов и деструкторов. CRect::CRect() { // Задание стандартных (нулевых) значений. m_a = 0; m_b = 0; } CRect::CRect(float a. float b) { // Задание значений, задаваемых параметрами. m_a = a; m_b = b; } CRect::~CRect() { // Просто вывод некоторой надписи. cout<<"Destructor\n"; } А вот так можно использовать класс в функции main: void main() { //Использование класса. CRect r; // Вызов конструктора без параметров. cout<<"Perimeter = "<<r.GetPerim()<<"\n"; // Выведется 0. cout<<"Square = "<<r.GetSquare()<<"\n"; // Выведется 0. CRect r1(2, 3); // Вызов конструктора с параметрами. cout<<"Perimeter = "<<r1.GetPerim()<<"\n"; // Выведется 10. cout<<"Square = "<<r1.GetSquare()<<"\n"; // Выведется 6. // В этом месте вызовутся 2 деструктора - для переменных r и r1. // Соответственно, на консоль выведется два раза слово "Destructor". }
  6. Разбор первого класса Итак разберем наш первый класс. Итак, для объявления класса мы используем следующую конструкцию: class MyClass { //Внутренность класса. }; Тут вместо MyClass мы можем написать, разумеется, любое имя. Обратите так же внимание на точку с запятой в конце класса - она обязательна. Объявление класса - это как бы конструирование нового типа данных. В C/C++ есть встроенные типы данных - int, char, float и другие. Но для реальной задачи удобнее создать свои типы, которые будет лучше моделировать поставленную задачу. Классы как раз для этого и предназначены. Теперь несколько слов о том, что может находиться внутри класса. А именно, там могут находиться переменные разных типов и функции (они же методы) класса. Переменные могут быть самых разных типов - в том числе и экземпляры других классов (и даже экземпляры того же самого класса). Вообще внутренность класса делится на 3 части - public (доступна всем), private (доступна только самому классу) и protected (доступна классу и его потомкам. Слово private можно не писать - оно действует по умолчанию. Т. е. наши переменные m_a и m_b нахадятся в private части класса: class CRect { float m_a, m_b; //Стороны. ... Зачем мы поместили m_a и m_b в private часть класса? Так как на их значения существуют ограничения - а именно они не могут быть отрицательные. Поэтому для доступа к этим переменным мы добавили по две функции GetA/B - для чтения и SetA/B - для записи: ... void SetA(float a); void SetB(float b); float GetA(); float GetB(); ... Эти функции мы объявили, разумеется, в public части класса. Обратите внимание, что функции мы только объявили, а реализацию функций мы пишем вне класса: ... void CRect::SetA(float a) { if(a>0) { m_a = a; } else { m_a = 1; } } ... При этом мы перед именем функции пишем обязательно имя класс с двойным двоеточием (для того, что бы показать, что эта функция именно из нашего класса): void CRect::SetA(...) ... Функции SetA/B мы написали так, что они позволяют записать только положительно значение. Если в такую функцию мы передадим для стороны отрицательное значение, то запишется не оно, а единица. С функциями, вычисляющими площадь, периметр и выясняющими, не есть ли наш прямоугольник квадратом, тоже все ясно - они используют соответствующие формулы из математики и возвращают нужное значение посредством return. В функции main мы создаем экземпляр нашего класса: void main() { //Использование класса. CRect r; ... и затем с этим экземпляром работаем - устанавливаем для него значения сторон A и B, считаем периметр и др.: ... r.SetA(5); r.SetB(3); cout<<"Perimeter = "<<r.GetPerim()<<"\n"; cout<<"Square = "<<r.GetSquare()<<"\n"; ... Обратите внимание, что функции мы вызываем не сами по себе, а именно для нашего экземпляра класса r. Синтаксис тут такой: имя экземпляра, точка, имя функции: r.SetA(5); Можно в программе объявить несколько экземпляров класса или даже массив: CRect w, v; CRect z[5]; Все такие экземпляры будут независимы друг от друга.
  7. Классы В ранее мы рассматривали структуры. Классы чем-то напоминают структуры - у них также внутри есть переменные разных типов. Но наряду с этими переменными у класса есть и несколько отличий, которые мы сейчас и рассмотрим на примере. Вот пример класса: #include <iostream.h> //Объявление класса прямоугольника. class CRect { float m_a, m_b; //Стороны. public: //Методы класса. //Методы по чтению и записи сторон. void SetA(float a); void SetB(float b); float GetA(); float GetB(); float GetSquare(); //Площадь. float GetPerim(); //Периметр. bool IsSquare(); //Не является ли прямоульник квадратом. }; //Точка с запятой обязательна! void main() { //Использование класса. CRect r; r.SetA(5); r.SetB(3); cout<<"Perimeter = "<<r.GetPerim()<<"\n"; cout<<"Square = "<<r.GetSquare()<<"\n"; if(r.IsSquare()) { cout<<"Square\n"; //Квадрат. } else { cout<<"Not a quare\n"; //Не квадрат. } } //Реализация методов класса. //Методы по чтению и записи сторон. void CRect::SetA(float a) { if(a>0) { m_a = a; } else { m_a = 1; } } void CRect::SetB(float b) { if(b>0) { m_b = b; } else { m_b = 1; } } float CRect::GetA() { return m_a; } float CRect::GetB() { return m_b; } //Площадь. float CRect::GetSquare() { return m_a*m_b; } //Периметр. float CRect::GetPerim() { return (m_a+m_b)*2; } //Не является ли прямоульник квадратом. bool CRect::IsSquare() { return (m_a==m_b); } После запуска программы выведет, что периметр равен 16, площадь - 15 и что это - не квадрат. Этого, собственно, и следовало ожидать. Как вы видите, у класса есть несколько особенностей. Во-первых, у него есть функции (вообще говоря, те функции, которые принадлежат классу, называются методами). Во-вторых, его части имеют разный тип доступа (у нас это public и private (последний тип доступа является типом доступа по умолчанию и слово private можно не писать, что мы и сделали для переменных m_a и m_b)). В методе main мы создали так называемый экземпляр класса (с именем r) - можно считать, что это конкретный прямоугольник. Экземпляр класса объявляется аналогично объявлению обычной переменной. Потом мы в main вызываем функции (методы) класса для нашего экземпляра r.
  8. Павловская Т.А С С++. Структурное программирование Практикум В практикуме на примерах рассматриваюстя средства С++, используемые в рамках сруктурной парадигмы: стандартные типы данных, основные конструкции, массивы, строки, структуры, фукнции, шаблоны, динамические структуры данных. Обсуждаются алгоритмы, приемы отладки, вопросы качества и стиля. По каждой теме приведено несколько комплектов из 20 вариантов заданий. Допущено Министерством образования Российской Федерации в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению "Информатика и вычислительная техника" Павловская Т.А С С++. Структурное программирование Практикум.rar
  9. Параметры командной строки В программу могут передаваться параметры командной строки. Несколько примеров таких программ - это команда ping (в качестве параметра выступает ip-адрес компьютера, с которым вы хотите проверить связь), команда copy (в качестве параметра выступают имя компируемого файла и новое местоположение и имя). Для работы с параметрами командной строки мы должны добавить два параметра в функцию main. Первый параметр задает общее количество передаваемых в программу параметров (при этом имя самого exe-файла тоже считается параметром), второй - сами параметры. Вот пример функции, которая выведет все свои параметры командной строки: #include <iostream.h> void main(int argc, char* argv[]) { for(int i=0; i<argc; i++) { //Выводим имя exe-файла //и все параметры командной строки. cout<<argv<<"\n"; } } Тут первый параметр: argc - это общее количество параметров. При простом запуске программы (например, простым щелчком на exe-файле) он будет равен 1. Второй параметр представляет из себя массив типа char*. Тип char* - это указатели на символ, который интерпретируется как строка. Нулевой элемент в этом массиве строк - это имя самого exe-файла, первый - это первый передаваемый параметр, второй - второй передаваемый параметр (разумеется, если эти параметры вообще есть). В средах разработки часто существует возможность задать параметры командной строки в самой IDE. Вот так, например, это делается в Visual C++.NET. Из контесктного меню для проекта выбираем Properties: затем в появившемся окне Property Pages в разделе Debugging задаем Command Arguments: Откомпилируем и запустим нашу программу из командной строки с параметрами. Результат будет приблизительно такой:
  10. Герб Саттер Новые сложные задачи на C++ Данная книга представляет собой продолжение вышедшей ранее книги Решение сложных задач на C++. В форме задач и их решений рассматриваются современные методы проектирования и программирования на C++. В книге сконцентрирован богатый многолетний опыт программирования на C++ не только самого автора, но и всего сообщества программистов на C++, так что некоторые рекомендации автора могут показаться неожиданными даже опытным программистам-профессионалам. Автор рассматривает и конкретные методики, приемы и идиомы программирования, однако основная тема книги - это стиль программирования, причем в самом широком понимании этого слова. Особое внимание во всех задачах книги уделено вопросу проектирования, которое должно обеспечить максимальную надежность, безопасность, производительность и сопровождаемость создаваемого программного обеспечения. Книга рассчитана в первую очередь на профессиональных программистов с глубокими знаниями языка, однако она будет полезна любому, кто захочет углубить свои знания в данной области. Герб Саттер Новые сложные задачи на C++.rar
  11. Объектно-ориентированное программирование в С++ Благодаря данной электронной книге тысячи пользователей овладели технологией объектно-ориентированного программирования в C++. В ней есть все: основные принципы языка, готовые полномасштабные приложения, небольшие примеры, поясняющие теорию, и множество полезных иллюстраций. Электронная книга пользуется стабильным успехом в учебных заведениях потому, что содержит более 100 упражнений, позволяющих проверить знания по всем темам. Читатель может вообще не иметь представления о C++. Необходимо лишь знание начальных основ программирования. Объектно-ориентированное программирование в С++.rar
  12. Шаблоны функций Шаблоны служат для ситуции, когда у нас есть разные типы данных, с которыми мы должны работать по одному, не зависящему от этих типов данных, алгоритму. Например, метод сортировки массива не зависит от типов данных - такой алгоритм будет одинаков и для, например, чисел типа int и для чисел типа float. Приведем пример использования шаблона. Вот код для простейшего щаблона функции, которая из двух передаваемых в нее параметров возвращает максимальный: #include <iostream.h> //Объявление шаблона функции. template <class T> T max(T a, T b) { if(a>b) { return a; } else { return b; } } void main() { //Использование шаблона функции для целых. int x = 45, y = 32; cout<<max(x, y)<<"\n"; //Выведется 45. //Использование шаблона функции для вещественных. float s = 4.18, t = 34.08; cout<<max(s, t)<<"\n"; //Выведется 34.08. } Обратите внимание на синтаксис. Сначала мы пишем ключевое слово template и задаем формальный тип T (T - это просто произвольное имя): template <class T> ... Далее мы пишем непосредственно функцию, причем в качестве типа параметров и возвращаемого значения пишем введенный ранее формальный тип T: T max(T a, T b) ... Разумеется, количество параметров может быть любое и не все из них должны иметь тип T. То же относится и к типу возвращаемого значения - в нашем случае это тот же тип T, но в принципе тип может быть любой, хоть void. Также обратите внимание, что заданием формального параметра и объявлением класса не должно быть никаких операторов. Теперь пара слов о использовании шаблона. При использовании мы просто пишем имя функции (в нашем случае это max) с параметрами конкретных типов (int и float в нашем примере). Компилятор в этом месте сам сгенерирует на основании этого шаблона функцию с параметрами конкретных типов. Шаблоны существую не только для функций, но и для классов. Такие шаблоны мы рассмотрим позже.
  13. Герб Саттер Решение сложных задач на С++ В данном издании объединены две широко известные профессионалам в области программирования на C++ книги Герба Саттера Exceptional C++ и More Exceptional C++ , входящие в серию книг C++ In-Depth, редактором которой является Бьерн Страуструп, создатель языка C++. Материал этой книги составляют переработанные задачи серии Guru of the Week, рассчитанные на читателя с достаточно глубоким знанием C++, однако книга будет полезна каждому, кто хочет углубить свои знания в этой области. Герб Саттер Решение сложных задач на С++.rar
  14. Рекурсивные функции Функция может вызывать сама себя. Т. е. внутри функции мы используем ее саму. Вот классический пример - вычисление факториала (факториал n (обозначается как n!) - это произведение целых чисел от 1 до n. Например, 4!=24 (1*2*3*4)): //Объявление функции. int fact(int n) { if(n>1) { //Вызываем функцию из себя самой. return n*fact(n-1); } else { //Факториал 1 равен 1. return 1; } } void main() { //Вызов функции. cout<<fact(5); } Обратите внимание, что функция внутри себя считается уже объявленной и ее можно использовать. Указанный фрагменты выведет, естественно, 120 (1*2*3*4*5).
  15. Брайан Оверленд C++ без страха В большинстве книг по программированию на языке C++ предполагается, что читатель уже программировал на другом языке, а еще лучше на нескольких. Эту книгу можно читать с нуля. Книга содержит большое количество примеров программного кода. Все примеры записаны на прилагаемый к книге компакт-диск, чтобы читатель мог активизировать полученные знания, каждый пример сопровождается рядом упражнений. Выполнив их, вы научитесь думать как программист и станете настоящим асом программирования С++. Автор книги Брайан Оверленд на протяжении десяти лет работал в компании Microsoft программистом, руководителем проектов и писателем - уникальная комбинация, которая позволила написать множество понятных и точных книг по программированию. Брайан Оверленд C++ без страха.rar
×
×
  • Создать...