WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 || 3 | 4 |   ...   | 11 |

Отметим, что в файле math.h для числа определена константа #define M_PI 3.В файле limits.h (каталог /include в установочном каталоге среды разработки) с помощью #define заданы минимальные и максимальные значения числовых типов, например, #define INT_MAX 2147483647 /* maximum (signed) int value */ Директивы можно #define также используется для создания макросов.

Пример.

#define max(a,b) (((a) > (b)) (a) : (b)) … …. …. …. … float x;

cin>>x;

float y = max(sin(x), cos(x));

Имеется несколько управляющих инструкций выборочного включения.

#if условие..... строки #endif строки выполняются только в том случае, когда условие истинно.

#if условие.... строки-#else... строки-#endif если условие истинно, выполняются строки-1, если же ложно – строки-2.

#ifdef идентификатор..... строки #endif строки выполняются только в случае, если идентификатор ранее определен директивой #define.

#ifndef идентификатор..... строки #endif наоборот, строки выполняются только в случае, если идентификатор еще не был определен директивой #define.

Эти директивы исключают повторение одних и тех инструкций при сборке многофайлового проекта – сразу несколько файлов проекта могут содержать одинаковые препроцессорные директивы.

Пример. Фрагмент кода из файла \include\minmax.h #ifndef max #define max(a,b) (((a) > (b)) (a) : (b)) #endif Пример. Фрагмент кода из файла \include\stdio.h #ifndef _INC_STDIO #define _INC_STDIO #include #endif – содержимое файла crtdefs.h будет включено только однажды, а именно, при самой первой обработке инструкции #include в процессе сборки файлов проекта.

Блок #ifndef идентификатор #define идентификатор … … … … #endif называют стражем включения (include guard).

Подробное изложение возможностей препроцессора можно найти в электронной книге Stallman R.M., Weinberg Z.. The C Preprocessor. - Free Software Foundation, Inc., 2011. - 83 p. - http://gcc.gnu.org/onlinedocs/cpp.pdf Представление данных Переменная – это именованная область памяти, к которой можно обращаться из программы, записывая и извлекая из нее данные. Каждая переменная относится к определенному типу, задающему размер памяти, диапазон значений хранимых данных, а также возможных набор операций с данными.

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

В современных версиях языка нет ограничений на длину идентификатора. Но, все же, ограничение есть – на длину значащих для компилятора символов. Так, стандарт С99 языка C (см.

http://gcc.gnu.org/c99status.html; http://www.open-std.org/JTC1/SC22/WG14/ www/docs/ n1336.pdf) устанавливает ограничение в 31 начальных символа для внешнего идентификатора и до 63 символов – для внутреннего. Такое же ограничение и в свежем стандарте C11 (http://www.openstd.org/jtc1/sc22/wg14/www/docs/n1570.pdf). Едва ли нужно запоминать эти числа – вряд ли в программе будут использоваться идентификаторы с таким большим числом совпадающих символов в начале.

Следует учитывать, что в C/C++ имеются ключевые слова (напр., названия типов, операторов) и они не могут быть использованы в качестве идентификаторов. Эти ключевые слова указаны в стандарте.

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

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

Распространенным является также стиль, основанный на использовании символа подчеркивания в именах.

Отметим также венгерскую нотацию (Hungarian Notation) программиста-космонавта Чарльза Симони (Charles Simonyi) – см., напр., http://msdn.microsoft.com/en-us/library/Aa260976.

Примеры.

class SomeClass; // тип SomeClass oneClass; // объект int oneNumber; // переменная int one_Number; // переменная getName(); // функция Несколько слов о стиле программирования Стиль программирования – набор рекомендаций написания программного кода. Стиль, в частности, предлагает систему образования имен переменных, типов и функций, правила расстановки скобок и использования пробельных отступов (создание лесенки). В предыдущих разделах уже отмечены стиль написания идентификаторов CamelCase и правила комментирования. Фигурные скобки можно расставить несколькими способами – например, в книге Хэзфилд Р., Кирби Л., Корбит Д. и др.

Искусство программирования на C выделено 4 стиля расстановки скобок.

Пример. Стили расстановки скобок.

#include "stdafx.h" #include using namespace std;

void func();

int _tmain(int argc, _TCHAR* argv[]) { const int N=10;

int i,j,k,m;

// стиль 1TBS:

for (i=0;i

} // стиль BSB:

for (j=0;j

} // стиль Whitesmith for (k=0;k

} // стиль GNU for (m=0;m

} return 0;

} void func() { cout<<"\nStyle";

} Развернутое изложение основ стиля программирования можно найти в книге Саттер Г., Александреску А. Стандарты программирования на C++.



101 правило и рекомендация, а также C++ Programming Style Guidelines – http://geosoft.no/development/cppstyle.html и C++ Coding Conventions – http://www.c-xx.com/ccc/ccc.php Встроенные типы К базовым типам в C/C++ относятся: тип char — для хранения отдельных символов и небольших целых чисел, тип int — для работы с целыми числами, тип float для представления чисел с плавающей точкой, тип double — для чисел с двойной точностью, и тип void — без значения.

Пример.

char ch='Ё';

char ch2=127;

int i=10; // десятичная запись int j=0x16; // шестнадцатеричная запись float eps=1.e-8; // =0.double pi=3.141592654;

float _pi=3.14159;

Размер памяти, выделяемый для хранения данных определенного типа, зависит от среды программирования, только у типа char – это 1 байт.

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

Пример.

#include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { cout<<"\n char is "<

cout<<"\n int is "<

cout<<"\n float is "<

cout<<"\n double is "<

return 0;

} Помимо базового типа int для целочисленных данных используются типы: unsigned char, signed char, unsigned int, short int, long int, long long int, signed long int, unsigned long int, unsigned long long int.

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

Замечание. В большинстве компиляторов unsigned char и char совпадают. Однако, при обработке текстов, содержащих кириллицу, лучше не полагаться на правила умолчания и указывать тип unsigned char. В следующем примере выводится таблица символов, из которой видно, что все символы кириллицы имеют код, больший, чем 125 (предельное значение для signed char).

Пример. Программа печатаем символы и их коды. Так, например, символ ‘ имеет код 241.

// таблица символов unsigned char ch; // int i;

for (i=0;i<255;i++) {ch=i; cout<

В заголовочном файле /include /climits содержится информация о предельных значениях целочисленных данных. Можно заглянуть в этот файл или вывести с помощью программы Пример.

#include #include // не обязательно using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { cout << "Maximum int value: " << INT_MAX << '\n';

cout << "Minimum int value = " << INT_MIN << '\n';

cout << "Maximum short value : " << SHRT_MAX << '\n';

cout << "Minimum short value : " << SHRT_MIN << '\n';

cout << "Maximum long value : " << LONG_MAX << "\n";

cout << "Minimum long value : " << LONG_MIN << "\n";

cout << "Maximum long long value:" << LLONG_MAX << "\n";

cout << "Minimum long long value : " << LLONG_MIN << "\n";

cout << "Maximum unsigned long long value : " << ULLONG_MAX << "\n\n";

cout << "Minimum unsigned long long value:"<< 0 << "\n";

// Аналогично остальные типы целых return 0;

} Для поддержки операций с плавающей точкой помимо float и double имеется тип расширенной точности long double.

Операции Основные классы операций в C/C++: арифметические, логические, поразрядные и операции сравнения.

Операции обозначаются специальными знаками (см. далее).

Операции, применяемые к одному операнду, называются унарными (например, операция определения адреса (&)), а применяемые к двум операндам – бинарными (например, операция сложения чисел).

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

Арифметические операции Символ операции Значение Использование * expr * expr Умножение / expr / expr Деление % expr % expr Остаток от деления + expr + expr Сложение - expr – expr Вычитание Пример.

// Программа определяет четность целого #include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { int num;

cout << "Vvesti chislo:";

cin >> num; // чтение числа // проверка на четность if((num%2)==0) cout << "Even \n";

else cout << "Odd \n";

return 0;

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

Пример. Программа вычислений чисел Фибоначчи. Хотя алгоритм реализован правильно, и программа успешно завершается, но результаты, начиная с 47-го числа, неверные – мы видим даже отрицательные числа.

Причина – тип int не может хранить большие числа. Использование long long int способно исправить ситуацию всего лишь для первых 92 чисел, а с помощью unsigned long long int получим 93 правильных числа (можно сравнить со значениями, приведенными на странице http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html), см.

также пример в разделе Цикл for.

// fibb.cpp: Вычисление чисел Фибоначчи // #include "stdafx.h" #include using namespace std;





const int n=100;

int _tmain(int argc, _TCHAR* argv[]) { int f,g,h;

g=0; h=1;

for (int i=2;i

cout<<'\t'<

h=g;

g=f;

} return 0;

} Замечание. Решить эту задачу, т.е. получить все значащие цифры большого числа, можно с привлечением длинной арифметики (см., напр.

Кнут Д. Искусство программирования, том 2. Получисленные алгоритмы.).

Операции сравнения и логические операции Символ операции Значение Использование ! !expr Логическое НЕ < expr1 < exprМеньше <= expr1 <= expr Меньше или равно > expr1 > expr Больше >= expr1 >= exprБольше или равно == expr1 == expr Равно != expr1 != exprНе равно && expr1 && expr Логическое И || expr1 || exprЛогическое ИЛИ Пример.

int x;

cin>>x;

bool bx=(x>=0) && (x<=100); // bx=1 (true), если 0<=x<=bool bbx=(x<0) || (x>100); // bbx =0 (false), если 0<=x<=bool bbbx=!((x>=0) && (x<=100));// bbbx =0, если 0<=x<=Поразрядные операции Поразрядные (побитовые) операции — это операции над отдельными битами данных и могут применяться только к данным, имеющим тип char или тип int. В поразрядных операциях не могут участвовать данные других типов.

Побитовые логические операции & (побитовое И), | (побитовое ИЛИ), ^ (побитовое исключающее ИЛИ). ~ (двоичное дополнение) позволяют выполнить установку значений битов. Операции производятся по всем известным таблицам истинности.

Пример. Проверка значения бита.

char bb=0x64; // = 100 в дес.с.с. и 1100100 - в дв.с.с.

if (bb & 4) cout<<"\nТретий бит равен 1";

else cout<<"\nТретий бит равен 0";

if (bb & 8) cout<<"\nЧетвертый бит равен 1";

else cout<<"\nЧетвертый бит равен 0";

if (bb & 32) cout<<"\nШестой бит равен 1";

else cout<<"\nШестой бит равен 0";

Побитовые операции сдвига >> и << сдвигают все биты переменной, соответственно, вправо или влево. Общая форма операторов сдвига:

переменная >> количество_разрядов переменная << количество_разрядов При сдвиге битов в один конец числа, другой конец заполняется нулями.

Операции сдвига можно использовать для быстрого умножения (и деления) на степени числа 2.

Пример. Умножение и деление на степени числа 2.

int a,b;

a=3; b=2048;

int n=a<<5; // n= a*int m=b>>5; // m=b/int x= (a<<3) + (a<<2); // x=a*12 = a*8 + a*Замечание. В последнем операторе примера показано, как применить операции сдвига при умножении на числа, отличные от степеней 2, в данном случае – умножение на 12. Скобки в операторе x= (a<<3) + (a<<2) необходимы, – это связано с тем, что сложение имеет более высокий приоритет, чем операции сдвига.

Операции присваивания В результате операции присваивания переменная получает новое значение.

Общая форма оператора присваивания:

идентификатор = выражение;

Оператор присваивания может присутствовать в любом выражении языка.

Пример. Оператор присваивания в арифметическом выражении.

int a, b, c;

c=(a=2)+(b=3);

Несколько операций присваивания могут быть объединены, например, int i, j;

i = j = 0; //присваивание 0 обеим переменным i = (j = 3)*2 +7;

Такое присваивание называют множественным.

При множественном присваивании вычисления производятся справа налево:

i = j= k = m=1;

Сначала переменная m получает значение 1, затем k получает значение m, j – значение результата этого присваивания, и в завершении – i получает значение j.

В языках С и С++ используются также составные операции присваивания.

Общий синтаксис составного оператора присваивания:

a op= b;

где op= является одним из операторов: +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=.

Запись a op= b эквивалентна записи a = a op b.

Операции инкремента и декремента Операции инкремента или, по-русски, увеличения (++) и декремента, т.е. уменьшения (--) дают возможность компактной записи для изменения значения переменной на единицу.

Выражение n++ является постфиксной формой оператора инкремента. Значение переменной n увеличивается после того, как ее текущее значение употреблено в арифметическом выражении. Аналогично, выражение m-- является постфиксной формой оператора декремента.

Существует и префиксная форма этих операторов: ++n, --m. При использовании такой формы текущее значение переменной сначала увеличивается или уменьшается и только потом используется в арифметическом выражении.

Пример.

int n, m,k,j;

n=m=2;

k=++n * 2; // k=j=2 * m++; // j=Пример. Возможная неоднозначность совместного использования операторов в префиксной и постфиксной формах.

#include using namespace std;

int main() { int i=2, j=2;

int k=(i++) * (i++) * i;//k= int m=(++j) * (j++) * j;//m= cout<<”k= ”<

return 0;

} Стандартная рекомендация – вместо эквивалентных (по значению) операторов присваивания использовать операторы инкремента и декремента.

Это связано с тем, что компиляторы создают для них более эффективный код.

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

Пример. Потеря информации при преобразовании.

#include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { int i, j;

double x=0.5;

i=x;

j=1/2+1/2;

return 0;

Pages:     | 1 || 3 | 4 |   ...   | 11 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.