Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Операции и функции, которые можно применять к величинам этого тина.



Концепция типа данных

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

Тип данных определяет:

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

множество значений, которые могут принимать величины этого типа;

Операции и функции, которые можно применять к величинам этого тина.

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

Основные типы данных в C++

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

1. int (целый);

2. char (символьный);

3. wchar_t (расширенный символьный);

4. bool (логический);

5. float (вещественный);

Double (вещественный с двойной точностью).

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

Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:

· short (короткий);

· long (длинный);

· signed (знаковый);

· unsigned (беззнаковый).

143) Трассиро́вка — пошаговое выполнение программы с остановками на каждой команде (assembler) или строке (c++).

Трассировка соединений является, как правило, заключительным этапом конструкторского проектирования РЭА и состоит в определении линий, соединяющих эквипотенциальные контакты элементов, и компонентов, составляющих проектируемое устройство.

Задача трассировки – одна из наиболее трудоемких в общей проблеме автоматизации проектирования РЭА. Это связано с несколькими факторами, в частности с многообразием способов конструктивно-технологической реализации соединений, для каждого из которых при алгоритмическом решении задачи применяются специфические критерии оптимизации и ограничения. С математической точки зрения трассировка – наисложнейшая задача выбора из огромного числа вариантов оптимального решения.

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

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

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

Указатели

Когда компилятор обрабатывает оператор определения переменной, например, int i=10;, он выделяет память в соответствии с типом (int) и инициализирует ее указанным значением (10). Все обращения в программе к переменной по ее имени (i) заменяются компилятором на адрес области памяти, в которой хранится значение переменной. Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями.

Итак, указатели предназначены для хранения адресов областей памяти. В C++ различают три вида указателей:

· указатели на объект,

· указатели на функцию

· указатели на void,

Они отличаются свойствами и набором допустимых операций. Указатель не является самостоятельным типом, он всегда связан с каким-либо другим конкретным типом.

Указатель на функцию

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

тип (*имя) ( список_типов_аргументов );

Например, объявление:

int (*fun) (double, double);

Указатель на объект

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

тип *имя;

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

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

int *a, b, *c;

Указатель на void

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

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

Примеры объявления указателей

Указатель может быть константой или переменной, а также указывать на константу или переменную. Рассмотрим примеры:

Int i; // целая переменная

const int ci = 1; // целая константа

int * pi; // указатель на целую переменную

const int * pci; // указатель на целую константу

int * const ср = &i; // указатель-константа на целую переменную

const int * const срс = &ci; // указатель-константа на целую константу

Указатель на функцию

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

тип (*имя) ( список_типов_аргументов );

Например, объявление:

int (*fun) (double, double);

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

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

Флаг Описание

s kipws - Следующие в начале символы-разделители (пробелы, символы табуляции и новой строки) при выполнении ввода отбрасываются.
left      -Осуществляется ввод с левым выравниванием
right    Осуществляется ввод с правым выравниванием (по умолчанию)
internal -Знак или префикс системы счисления выравнивает слева, число выравнивает справа
d ec -    Численные значения выводятся в десятичной форме (по умолчанию)
oct       -Численные значения выводятся в восьмеричной форме
hex      -Численные значения выводятся в шестнадцатиричной форме
showbase - Позволяет при выводе указывать числовую базу (десятичную, восьмеричную, шестнадцатиричную)
showpoint           - Приводит к выводу десятичной запятой и нулей справа для всех чисел с плавающей запятой вне зависимости, нужно это или нет
uppercase           - При выводе чисел с плавающей точкой при использовании экспоненциальной формы выводится большая буква E. Также при выводе чисел в шестнадцатиричной форме символ 'x' выводится в верхнем регистре.
showpos - Приводит к тому, что перед положительным числом будет выводится знак "+"
scientific - Числа с плавающей запятой выводятся с использованием научной нотации
fixed    - Числа с плавающей запятой выводятся в нормальной нотации
unitbuf - При каждой операции вставки вывода данные немедленно заносится в поток

Выведет на экран

 7b +123.45

 43 +678.9

 

Выведет на экран

 7b +123.45

 123 123.45

Кроме флага форматирования также можно установить ширину поля потока, символ для заполнения и число цифр после десятичной запятой. Для этого используются следующие функции:

int width(int len);

char fill(char ch);

int precision(int num);

Функция width() устанавливает ширину поля и возвращает текущую ширину. Вторая функция - fill() устанавливает текущий символ заполнения и возвращает предыдущий символ заполнения. По умолчанию используется пробел. А функция precision устанавливает точность чисел с плавающей точкой. В научном режиме эта функция определяет количество цифр после десятичной запятой. В обычной нотации функция обозначает количество выводимых цифр. Точность, установленная по умолчанию, равна 6. Функция width() воздействует только на один вывод информации, а после этого в действие вступают параметры принятые по умолчанию. В случае с остальными двумя функциями новые установки остаются действовать до их явного обновления. Приведем пример:

 cout.width(10);

 cout.fill('*');

 cout<<123<<"\n";

cout.width (10);

 cout<<456<<"\n\n";

 cout<<"Using precision\n";

 float price1 = 20.405f;

 float price2 = (float)1.9+8.0/9.0;

 cout<<price1<<"\n"<<price2<<"\n\n";

 cout.precision(2);

 cout<<price1<<"\n"<<price2<<"\n\n";

 cout.setf(ios::scientific);

 cout<<price1<<"\n"<<price2<<"\n\n";

Выведет на экран

 *******123

 *******456

 Using precision

 20.405

 2.78889

 20

 2.8

 2.04e+001

2.79e+000

Манипуляторы являются специальными функциями, которые позволяют изменять флаги потока. Существуют манипуляторы с параметрами и без. Если Вы используете манипуляторы с параметрами, подключите файл iomanip.h

Рассмотрим манипуляторы без параметров:

ends - помещает в выходной поток нулевой символ;

endl помещает в выходной поток символ конца строки и вызывает метод flush;

flush выгружает буфер потока;

dec , hex, oct   устанавливают основания 10, 16 и 8 соответственно;

Манипуляторы с параметрами

setbase (int b)  задает основание системы счисления;

resetiosflags (long f)       сбрасывает флаги, указанные в параметре;

setiosflags (long f)          устанавливает флаги, указанные в параметре;

setfill (int ch)   задает заполняющий символ;

setprecision (int n)          задает точность вещественных чисел;

Выведет на экран

 ***22

 b

149) Функторы в C++ являются сокращением от "функциональные объекты". Функциональный объект является экземпляром класса С++, в котором определён operator(). Если вы определите operator() для C++ класса, то вы получите объект, который действует как функция, но может также хранить состояние. Например,

#include <iostream>

#include <string>

class SimpleFunctor {

std :: string name_;

Public :

SimpleFunctor ( const char *name) : name_(name) {}

void operator ()() { std :: cout << "Oh, hello, " << name_ << endl; }

};

int main() {

SimpleFunctor sf( "catonmat" );

sf(); // выводит "Oh, hello, catonmat" }

Public :

EvenOddFunctor () : even_( 0 ), odd_( 0 ) {}

void operator ()( int x) {

    if (x% 2 == 0 ) even_ += x;

    else odd_ += x;

}

int even_sum() const { return even_; }

int odd_sum() const { return odd_; }

};

int main() {

EvenOddFunctor evenodd;

int my_list[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };

evenodd = std ::for_each (my_list, my_list+sizeof(my_list)/ sizeof (my_list[ 0 ]), evenodd);

std :: cout << " Сумма чётных : " << evenodd.even_sum() << "\n" ;

std :: cout << " Сумма нечётных : " << evenodd.odd_sum() << std ::endl ;

// вывод:

// Сумма чётных: 30

// Сумма нечётных: 25

}

Здесь экземпляр EvenOddFunctor передается в for_each. for_each итерируется по каждому элементу в my_list и вызывает функтор. После этого он возвращает копию функтора evenodd, который содержит сумму чётных и нечётных элементов.

Вызов функции.

Концепция типа данных

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

Тип данных определяет:

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

множество значений, которые могут принимать величины этого типа;

операции и функции, которые можно применять к величинам этого тина.

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

Основные типы данных в C++

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

1. int (целый);

2. char (символьный);

3. wchar_t (расширенный символьный);

4. bool (логический);

5. float (вещественный);


Поделиться:



Последнее изменение этой страницы: 2019-04-10; Просмотров: 231; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.054 с.)
Главная | Случайная страница | Обратная связь