Вопросы по C/C++ (Для новичков) - Компилируемые языки - Программирование - Форум по безопасности, программированию, администрированию
ENG GER GER pl
PCproxy mail RSS




Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Программирование » Компилируемые языки » Вопросы по C/C++ (Для новичков)
Вопросы по C/C++ (Для новичков)
seposДата: Среда, 14.01.2009, 21:00 | Сообщение # 1
Лейтенант
Группа: Ньюсмейкеры/пресс-релизы
Сообщений: 65
Статус: Offline
Существует масса вопросов, из-за которых не хотелось бы создавать новые топики. Поэтому было бы целесообразно взять пример с соседней ветки и создать тему для новичков.

Начинаю хит-парад вопросов. На очереди новичок вместе с C++

Нужно установить вывод значений в шестнадцатеричном виде. Печатаю строку (по учебнику):

cout.setf(ios::hex, ios::hex);

int nArg1 = 0x1234;
int nArg2 = 0x00ff;

cout << nArg1 << "\n";
cout << nArg2 << "\n";

Программа выводит десятичные значения 4660 и 255 соответственно. Что я делаю не так?

ЗЫ: Компилятор не ругается.

 
WalKarДата: Пятница, 16.01.2009, 17:54 | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
klass!!!!

Student
 
ShadowДата: Пятница, 13.02.2009, 16:22 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
Обясните плс что токое Матрица и как её создать
 
seposДата: Суббота, 14.02.2009, 23:15 | Сообщение # 4
Лейтенант
Группа: Ньюсмейкеры/пресс-релизы
Сообщений: 65
Статус: Offline
Матрицы не очень сложны для понимания и использования. Более того, они нужны для написания быстрых преобразований и очень полезны для представления математических операций в компактной форме.

Матрица - это множество чисел, сгруппированных в колонки и столбцы. Здесь изображены две матрицы: Матрица А и Матрица В.

56_1.gif (1163 b)

Матрица А - это матрица 2х3 (то есть у нее две строки и три столбца), тогда как матрица В - это матрица 3х3. Мы можем получить доступ к элементу матрицы А, используя запись А[m,n], где m - это строка, а n - столбец. Элемент в верхнем углу матрицы А будет обозначаться А[0,0] и он равен единице.
Произведение операций над матрицами

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

Для примера, рассмотрим сложение двух матриц размерностью 2х3 - матрицы А и матрицы С:

56_2.gif (650 b)

При сложении матриц А и С нужно складывать каждый из элементов m, n. Суммы элементов займут в результирующей матрице соответствующие места:

56_3.gif (896 b)

Мы также можем умножить матрицу на скаляр k. Например, чтобы умножить матрицу А на 3, мы должны умножить на 3 каждый ее элемент.

56_4.gif (725 b)

Теперь поговорим об умножении двух матриц. Эта операция немного отличается от умножения на скалярную величину. Вы должны запомнить несколько правил:

* Количество столбцов в первой матрице (n) должно быть равно количеству строк во второй (также n). Это значит, что если размерность первой матрицы (m x n), то размерность второй матрицы должна быть (n x r). Два остальных измерения m и к могут быть любыми.
* Произведение матриц не коммутативно, то есть А х В не равно В х А.

Умножение матрицы m x n на матрицу n x r может быть описано алгоритмически следующим образом:

1. Для каждой строки первой матрицы:
Умножить строку на столбец другой матрицы поэлементно. Сложить полученный результат;
2. Поместить результат в позицию [i,j] результирующей матрицы, где i - это строка первой матрицы, а j - столбец второй матрицы.

Для простоты посмотрите на рисунок:

56_5.gif (4629 b)

Мы можем это сделать намного проще, написав программу на Си. Давайте определим матрицу 3х3 и напишем функцию, умножающую матрицы. Ниже показан исходный код:

// общая структура матрицы
typedef struct matrix_typ
{
float elem[3][3]; // место для хранения матрицы
} matrix, *matrix_ptr;

void Mat_Mult3x3(matrix_ptr matrix_1, matrix_ptr matrix_2,
matrix_ptr result)
{
index i, j, k;

for(i=0; i < 3; j++)
{
for(j=0; j < 3; j++)
{
result[i][j] = 0; // инициализация элемента
for(k = 0; k < 3; k++)
{
result->elem[i][j] += matrix_1->elem[i][k]
* matrix_2->elem[k][j];
} // конец цикла по k
} // конец цикла по j
} // конец цикла по i
} // конец функции

Единичная матрица

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

Говоря попросту, нам нужно иметь матрицу размерностью m x n, которую назовем матрицей I. Умножая на нее любую другую матрицу, мы должны получить исходную. Этой матрицей будет квадратная матрица, по главной диагонали которой записаны единицы, а все остальные элементы равны нулю:

56_6.gif (471 b)

Если мы умножим матрицу А на матрицу I,

56_7.gif (824 b)

то результатом будет исходная матрица А:

56_8.gif (154 b)
Использование матриц в играх

Прелесть матриц состоит в том, что Вы можете объединить все операции в одну матрицу, описывающую перемещение, масштабирование и вращение.

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

Главной матрицей перемещений будем называть такую матрицу, в которой x_translation и y_translation - это коэффициенты перемещения объекта по осям Х и Y. Вот как она выглядит:

56_9.gif (727 b)
Главная матрица масштабирования

Главная матрица масштабирования - это такая матрица, в которой scale_x и scale_y - это коэффициенты масштабирования объекта по координатам х и y:

56_10.gif (576 b)

Такая матрица позволяет выполнять неоднородное масштабирование - мы можем задать один масштаб по оси Х и другой - по оси Y. Таким образом, если мы хотим масштабировать объект однородно, то должны задать scale_x = scale_y.
Главная матрица поворотов

В главной матрице поворотов angle - это угол, на который Вы хотите повернуть объект:

56_11.gif (893 b)
Общая матрица масштабирования, поворотов и перемещений

Наступает торжественный момент. Теперь мы возьмем матрицы перемещения, масштабирования и поворота и перемножим их (получим конкатенацию), чтобы получить общую матрицу, реализующую все три функции сразу. Окончательно матрица будет выглядеть так:

56_12.gif (1468 b)

Если Вы теперь умножите вершины объекта на эту матрицу, то получите перемещенный, повернутый и масштабированный объект.

Добавлено (14.02.2009, 23:15)
---------------------------------------------
надеюсь это то что ты искал... с примерами вышла маленкая неполадка но если в школе ты учил матрицы по математике то ты поймёш... если что пиши отвечу, помогу чем смогу...

 
ShadowДата: Суббота, 21.03.2009, 08:45 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
а кто может обяснить классы?
 
seposДата: Суббота, 21.03.2009, 12:21 | Сообщение # 6
Лейтенант
Группа: Ньюсмейкеры/пресс-релизы
Сообщений: 65
Статус: Offline
Терминология объектно-ориентированного программирования

Объектно-ориентированное программирование позволяет оперировать в терминах классов: определять классы, конструировать производные классы, создавать объекты, принадлежащие классу, - экземпляры класса.

Сначала в некоторых языках программирования появился тип struct, расширением которого стал тип class.

Класс определяет данные (переменные) и поведение (методы). Данные и методы класса также называют членами класса. Класс рассматривается как определяемый пользователем тип данных.

Объектом называется экземпляр некоторого класса. Объект создается как переменная типа класса, которая используется для доступа к данным - членам класса и для вызова методов - членов класса.

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

Наследование позволяет определять новые классы в терминах существующих классов.

В объектно-ориентированном программировании наследование может быть:

* множественным, позволяющим производному классу наследоваться одновременно от нескольких классов (например, так реализован механизм наследования в С++);
* простым, когда производный класс имеет только один наследуемый класс (например, так реализованы языки Java и Object Pascal).

Наследуемый класс принято называть базовым классом, или родительским классом (классом - предком, суперклассом).

Производный класс, наследующий структуру данных и поведение своего базового класса, иногда также называется дочерним классом (классом - потомком, подклассом).

В производном классе можно переопределять методы базового класса и добавлять новые методы. Непосредственным базовым классом называется класс, от которого порожден производный класс следующего уровня иерархии:
А Базовый класс класса С и непосредственный базовый класс класса B

B Непосредственный базовый класс класса C

C Производный класс

Полиморфизмом называется способность различных объектов по-разному обрабатывать одинаковые сообщения.

Инкапсуляция позволяет работать в терминах объектов и скрывать их переменные и методы. Использование инкапсуляции дает возможность модифицировать внутреннюю реализацию объекта без влияния на программу в целом до тех пор, пока не изменяется интерфейс с объектом.

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

В настоящее время понятие языка программирования неотрывно связано со средой программирования, в которой разрабатываются приложения. Для языка С++ наиболее развитыми и популярными средами программирования являются:

* Visual Studio.NET;
* С++ Builder.

Среда программирования Visual Studio.NET предназначена для создания приложений не только на языке С++, но и на таких популярных языках, как C# и Visul Basic. Иногда для сокращения говорят, что проектирование приложений на C++ в Visual Studio.NET реализуется средой Visual C++.

Visual C++ позволяет разрабатывать приложения как в терминах традиционного модульного программирования, так и с применением объектно-ориентированного программирования.
Структура приложения на языке С++

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

Проектом в терминологии Visual C++ называется совокупность всех модулей трансляции, файлов ресурсов и описания конфигурации.

Разработка любого приложения в Visual C++ начинается с создания проекта. Visual Studio.NET предоставляет шаблоны для создания различных видов приложений (консольные приложения, MFC-приложения, DLL-библиотеки, приложения управляемого кода и т.п.).

Консольное приложение - это приложение, не использующее Windows-окна для обработки сообщений от пользователя. Точкой входа в консольное приложение в языке С++ является метод main.

После того как создан шаблон приложения заданного вида, информация обо всех файлах проекта отображается в окне проектов среды Visual C++.

Заголовочный файл содержит объявления используемых данных. Язык C++ поддерживает соглашение о раздельной компиляции: каждый С++-модуль можно компилировать отдельно. Для того чтобы несколько модулей могли использовать одни и те же данные, объявление этих данных выносят в заголовочный файл. Принято, что имя заголовочного файла имеет расширение h.

Все подключаемые к модулю заголовочные файлы указываются в начале модуля директивой препроцессора #include.

Например:

#include "stdafx.h"
#include <iostream>

Имя подключаемого файла в директиве препроцессора #include может быть указано:

* в двойных кавычках - в этом случае препроцессор сначала выполняет поиск данного файла в том же каталоге, в котором расположен файл, содержащий директиву препроцессора #include, а затем в каталогах, определяемых опцией компиляции и переменной среды INCLUDE.
* в угловых скобках - при этом исключается поиск имени файла в том же каталоге, в котором расположен файл, содержащий директиву препроцессора #include.

Файл, содержащий реализацию методов, объявленных в заголовочном файле, иногда называется исходным файлом.

Каждая программа должна иметь точку входа и может содержать описание одного или нескольких классов.

Точкой входа в программу в приложении, формируемом по шаблону в среде Visual C++, является метод _tmain, заменяемый при компиляции на метод main.

Минимальной программой на С++ является следующий код:

int main() {}

Эта программа определяет функцию с именем main, которая не использует параметров и не выполняет никаких действий.

Тело метода в языке С++ указывается в фигурных скобках. Перед именем метода указывается тип возвращаемого значения. Если метод не возвращает никакого значения, то его тип обозначается ключевым словом void.
Объявление и реализация класса в языке С++

Создаваемый класс должен быть объявлен и реализован.

Объявление класса в языке С++ может иметь следующее формальное описание:

class имя_класса : список_базовых_классов {
public: // Модификатор доступа относится
// ко всем перечисленным после
// него членам до следующего
// модификатора доступа
// Объявление общедоступных членов класса

protected:
// Объявление членов класса, доступных
// только для производных классов

private:
// Объявление защищенных членов класса
};

Список базовых классов указывается после имени класса через символ двоеточия (:), разделяется запятыми и может иметь модификаторы доступа.

Например:

class MyClass : public ClassA,
public ClassB, private ClassC {};

В языке С++ считается, что если модификатор доступа для класса или члена класса не указан, то по умолчанию предполагается модификатор доступа private (защищенный доступ). Для членов структур, объявляемых ключевым словом struct, по умолчанию модификатор доступа предполагается равным public.

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

* public - в производном классе доступны все переменные и методы базового класса с модификаторами доступа public и protected, и эти члены класса имеют те же права доступа;
* protected - члены базового класса с модификаторами доступа public и protected доступны как protected, а с модификатором доступа private - недоступны.
* private - члены базового класса с модификаторами доступа public и protected доступны как private, а с модификатором доступа private - недоступны.

Например:

class BaseClass
{ public:
int PublicFunc();
protected:
int ProtectedFunc();
private:
int PrivateFunc();
};
class DerivedClass1 : public BaseClass {
// Наследуемая функция PublicFunc доступна
// как public
// Наследуемая функция ProtectedFunc
// доступна как protected
};
class DerivedClass2 : private BaseClass {
// Наследуемая функция PublicFunc доступна
// как private
// Наследуемая функция ProtectedFunc
// доступна как private
};
int main() { }

В теле объявления класса указываются модификаторы доступа, описывающие права доступа для переменных и методов класса:

* модификатор доступа относится ко всем перечисленным после него членам до следующего модификатора доступа;
* один и тот же модификатор доступа может указываться несколько раз;
* после модификатора доступа ставится символ двоеточие;
* если модификатор доступа не указан, то по умолчанию предполагается private.

Для доступа к членам класса используется операция принадлежности ::, указываемая после идентификатора класса. Для доступа к членам экземпляра класса используются операции . и ->.

Для доступа к объекту самого класса внутри метода члена класса используется ключевое слово this.

Например:

class A { public: int i; Func1();}
A:: Func1() { return this->i; }
// this - указатель класса A

Конструкторы класса

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

Деструктором называется метод, вызываемый при разрушении объекта данного класса. Имена конструктора и деструктора совпадают с именем класса, но перед именем деструктора указывается символ ~.

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

Если конструктор базового класса имеет список параметров, то для его использования в производном классе следует создать конструктор производного класса с таким же списком параметров.

При создании нового класса среда Visual C++ автоматически создает заголовочный файл и файл реализации класса с конструктором и деструктором без параметров.
Создание объекта

Для создания объекта (экземпляра данного класса) следует объявить переменную типа указатель на класс, а затем создать объект, выполнив оператор new с указанием используемого конструктора.

Например:

A* ca;
ca= new A();

Эти же действия можно записать одним оператором.

Например:

A* ca= new A();

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

Язык С++ допускает использование вложенных классов - внутри тела одного класса содержится объявление других классов.

Например:

class A
{
public:
A(void);
~A(void);
class B { // Вложенный класс
B(void) {};
~B(void) {};
char sStr2[3];
};

};

Объектные типы

Тип данных всегда определяет размер памяти, которая будет выделена под переменную данного типа при ее создании.

При объявлении переменной объектного типа (типа класса) создаются переменные члены класса и вызывается конструктор класса. Производные типы на основе классов позволяют получать доступ к членам класса.

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

Hапример:

#include <iostream.h>
class A // Объявление класса A
{ public: int j1;
A(void);
~A(void);};
void main() {
int A::*pToj = &A::j1;
// Объявление производного типа pToj
// как указателя на член класса j1
A jA;
// Объявление переменной объектного типа A
A *pjA = & jA;
// Объявление указателя на эту
// переменную (объект)
int j;
jA.*pToj = 123;
// Присваивание значения переменной
// jA::j1, используя *
j = pjA ->*pToj;
// Получение значения, используя ->*
std::cout << j << "\n";
}

Преобразование объектных типов

Указатель на класс может быть преобразован к указателю на базовый класс в двух случаях:

* если базовый класс является доступным и преобразование однозначно;
* если указано явное преобразование типа указателя.

Например:

class A // А - базовый класс
{public:
int a1;
int Fa();
};
class B : public A // В - производный класс
{public:
int b1;
int Fb();
};
B bObj; // Объект типа B
A *pA = &bObj;
// Преобразование типа ограничивает
// доступ к членам класса B и
// разрешает доступ только к членам
// базового класса
B *pB = &bObj;
// Нет преобразования типа и
// следовательно разрешен доступ как
// к членам класса B,
// так и к членам класса А.
pA-> Fa ();
// Правильно: вызов функции члена класса A.
pB-> Fa ();
// Правильно: вызов функции,
//наследуемой от класса A
// Вызов pA-> Fb (); ошибочен: функция Fb
// недоступна через указатель на базовый
// класс А

Указатели на члены класса или структуры не могут рассматриваться как обычные указатели и для них не выполняется стандартное преобразование типа.
Квалификация имен

Квалификация имен используется для однозначного понимания указываемого имени.

Для квалификации имени могут использоваться следующие операторы: :: (оператор принадлежности); . (оператор доступа к члену класса посредством имени); -> (оператор доступа к члену класса через указатель).

Надеюсь это тебе поможет, если есть вопросы пиши, буду рад на них ответить

 
LivelyДата: Понедельник, 06.04.2009, 16:13 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 1
Статус: Offline
Доброго времени суток! вопрос как раз связан с предыдущими сообщениями =)
у меня задание реализовать класс Матрица(выполнение операций сложения, умножения, вычитания). это худо-бедно сделано.
второе задание - написать класс наследник НормирующаяМатрица (матрица с единичным определителем). Вопрос: что есть единичный определитель? - т.е. элементы могут быть разными , но определитель равен =1....то бишь с единичной матрицей это разные вещи, правильно? и что значит перегрузить метод доступа к компонентам матрицы?

...я только учусь=)
 
adminДата: Вторник, 21.04.2009, 13:51 | Сообщение # 8
Admin
Группа: Модераторы
Сообщений: 82
Статус: Offline
наш великий гуру по программированию потерялся )

 
seposДата: Вторник, 28.04.2009, 23:44 | Сообщение # 9
Лейтенант
Группа: Ньюсмейкеры/пресс-релизы
Сообщений: 65
Статус: Offline
1. я не великий и уж точно не гуру....
2. я вернулся biggrin
 
Форум » Программирование » Компилируемые языки » Вопросы по C/C++ (Для новичков)
Страница 1 из 11
Поиск:


Наши друзья: ремонт холодильного оборудования взгляд | теплоизоляция деревянных домов. | Прокладка инженерных сетей водопровода канализации. Открытая прокладка водопровода. | Нужен слоган? Opter.ru:напишем уникальный слоган для вас.
При полном или частичном копировании материалов с сайта, ссылка на ITsecure.org.ua обязательна!
ITsecure.org.ua ©2008-2010
  • Каталог Луганских сайтов
  • МЕТА - Украина. Рейтинг сайтов
  • Rambler's Top100
Ваш IP: 38.107.191.100