|
шпора по проге. прог. Теоретический материал по курсу Основы программирования Язык С (для фкбв и фкбо) Основные понятия. Типы данных
Теоретический материал по курсу «Основы программирования»
Язык С++ (для ФКБВ и ФКБО)
Основные понятия.
Типы данных определяют способ хранения информации (чисел) в памяти компьютера. Они задают размер ячейки памяти, куда будет записано значение. Размер ячейки определяется максимальной величиной, которую может поместить в эту ячейку. Размер ячейки определяется в байтах и зависит от типа процессора.
Типы данных: 1. встроенные (базовые), 2. собственные (абстрактные).
1. Встроенные (базовые) типы данных:
int –целочисленные (4 байта);
float- вещественные (4 байта);
double – двойной точности (8 байт);
char – символьные (1 байт);
bool – логические (1 байт);
void – пусто (зависит от процессора).
2. Собственные (абстрактные типы данных):
struct имя; структура
union имя; объединение
class имя; класс
enum имя; перечисление
Для определения размера типа данного используется оператор sizeof(тип) или sizeof(имя_переменной). Результат будет в байтах.
Пример Определения размерности переменных встроенного типа:
int a;
double d;
char c;
printf("a = %d, d = %d, c = %d byte\n", sizeof(a), sizeof(d), sizeof(char));
Результат выполнения
Модификаторы базовых типов применяется для более точной настройки типов (int, double, char).
Для типа int (32 разряда) : signed (по умолчанию ) - знаковый, unsigned – беззнаковый, short – занимает 16 разрядов, long – занимает 64 разряда.
Для типа char (8 разрядов) – signed, unsigned.
Для типа double – long.
Пример модификатора
unsigned short int a;
printf("a = %d\n", sizeof(a));
Результат выполнения
Идентификатор - имя программного объекта, имя переменной, функции, метки – совокупность букв, цифр и символа подчеркивания. Нельзя использовать:
- цифру на первом месте;
- пробелы;
- совпадение с ключевым словом.
Идентификаторы обязательно должны иметь смысловую нагрузку. Это необходимо для чтения и сопровождения текста программы.
Пример идентификатора: int nomer_chisla;
Переменная – поименованный участок памяти, в котором хранится значение определенного типа. У переменной есть тип, имя (идентификатор), значение. Во время работы программы значение можно менять.
Перед первым использованием все переменные должны быть объявлены:
тип имя_переменной ( int nomer; ); или тип список_переменных; (при списке переменных их имена записываются через запятую double own, now, elen; ).
При объявлении переменную можно сразу инициализировать – придать ей начальные значения: тип имя_переменной = значение ( int nomer = 150; char ch = 'A'; double own = 3.14;).
Пример: объявляются инициализированные переменные, заданные в разных основаниях
int a1 = 10, //основание 10
a2 = 073, //основание 8
a3 = 0xf7, //основание 16
a4 = 0b1010; //основание 2
Места расположения переменных связаны с областью видимости (доступности) и временем жизни. Переменные разделяются на:
- локальные- внутри функции, доступны только ей, носят стековый характер. При входе в функцию создаются, при выходе из функции – уничтожаются. Если локальные переменные определены в каком-либо операторе, то область видимости – тело оператора (зависит от компилятора);
Пример: for (int j = 0; j < 20; ++j){/*локальная. область видимости переменной j - тело оператора for*/} Пример:
void func()// функция. Точка входа – имя func. Для компилятора это -адрес
{
int count = 50; /* локальная переменная. Область видимости – эта функция. создается каждый раз при входе в функцию*/
printf("Localnaja count = %d\n", count++);
} int main()
{
for (int j = 1; j <= 5; ++j) func();/* пять раз вызывается функция func()*/
}
Результат работы программы
- глобальные – определены вне функции, доступны всем функциям. Время жизни – пока работает программа (до выхода из программы). Её рекомендуется инициализировать.;
Пример:
double rezultat = 0.0; /*глобальная. Область видимости весь файл/проект. Время жизни – пока не выполнится программа */
int main()
{
/* выполняются какие-либо действия*/
}
- формальные – определены в заголовке функции при ее описании, носят стековый характер, область видимости – тело функции.
- Фактические – определяются при вызове функции (ставятся по факту вместо формальных параметров)
Пример:
/* формальные параметры N и D */
void Function( int N, double D){ /*выполняются какие-либо действия в функции*/ } int main()
{
Function(5, 3.14); /* фактические параметры, вместо N подставляется 5 и вместо D ставится 3.14 . Вместо значений можно подставлять переменные*/
} Спецификаторы хранения сообщают компилятору, как хранить переменную.
Общий вид спецификатора: спецификатор_хранения тип имя_переменной;
- спецификатор extern - позволяет использовать переменную, описанную (определенную) в другом программном модуле (реализация внешних связей между модулями). В одном модуле переменная будет глобальной, во всех остальных модулях она должна быть описана со словом extern. Используется в многомодульных проектах;
- спецификатор static – переменные могут быть локальными или глобальными (это – ресурсные переменные). Для функции (локальная переменная): создается при первом вызове функции и при последующих вызовах только используется, не уничтожается. Как глобальная статическая переменная создается один раз, область видимости ее – только файл, где она определена. Другие файлы проекта ее не видят.
Пример:
void func() // в функции определена статическая переменная
{
static int count = 50; /* статическая переменная создается только один раз при первом входе в функцию*/
printf ("static count = %d\n", count++);//переменная count увеличивается на 1
}
//######################### int main()
{
for (int j = 1; j <= 5; ++j) func(); //вызываем функцию 5 раз
} Результат работы программы
- спецификатор register- хранит переменные в регистрах центрального процессора, применяется к локальным переменным. Быстродействующие переменные, используются в циклах.
Пример:
register int i;
register int sum = 0; for(i=0; i Ключевые слова - зарезервированные слова, которые имеют специальное значение для компилятора и используются только в том смысле, в котором они определены в среде программирования на каком-либо языке (например, в Си, С++). При написании программы в редакторе среды ключевые слова выделяются цветом.
Пример ключевого слова while: while(a == 2) {/* выполняются какие-либо действия*/} Константы - величины, которые не меняют своего значения в процессе выполнения программы. Описание констант: const тип имя = значение.
Константы обязательно инициализировать, например:
const int foo = 10; /* можно */
const int bar;/* нельзя */
Это логично, поскольку, если мы не инициализируем ее сразу, то вообще никогда не сможем ничего ей присвоить, поэтому, в таком случае, она окажется бесполезной.
Преимущество констант заключается в следующем:
- позволяют явным образом определить тип данных;
- константами могут быть более сложные типы данных (составные), например
массивы и структуры;
- константы могут использоваться для указания размера массива;
- имена констант можно использовать при отладке программы;
Константы бывают:
целые (десятичные 10, восьмеричные 07, шестнадцатеричными 0ха9) Окончание U может использоваться для явного задания констант типа unsigned: int a=3U; Аналогично, окончание L явно задает константу типа long: int b = 5L;. с плавающей точкой 1.23, научного формата типа e: 1.23e-5, типа float: 3.14159265f. символьные ‘t’, ‘\n’, '\x05f' Строковые “Hello”
Поименованные константы:
const int model = 90;
const int v[] = { 1, 2, 3, 4 };
Директива препроцессора #define
#define- определяет подстановку в тексте программы (макрос). Подстановка используется для определения:
1 символических констант (все имя заменяются на текст подстановки компилятором в программе): #define имя текст_подстановки
Пример:
#define N 10 /*во всем тексте программы, полученном после обработки препроцессором, вместо N будет записано 10 */ 2 макросов, которые выглядят как функции, но реализуются подстановкой их текста в текст программы:
#define имя( параметры ) текст_подстановки
Пример:
#define pri(i) printf( "\nимя "#i " Значение по этому имени = %d\n", ##i)
В коде программы будет записано:
int MyCount = 15;
pri(MyCount); //подставляем функцию: #имя, ##значение
Результат выполнения:
3 символов, управляющих условной компиляцией. Используется при построении многомодульных проектах, чтобы избежать многократного повторения имен переменных, функций и т.д.
Они используются вместе с директивами #ifdef и #ifndef, #endif . Формат: #define имя
#defineXXXXX_H – определение заголовочного имени файла.
Пример:
#ifndef Vektor_h //если файл не определен, то
#define Vektor_h //его определяем.
Выражение (комбинация для вычислений ) -задает порядок выполнения действий над данными и состоит из операторов, констант, переменных, обращений к функциям, круглых скобок и знаков операций. Порядок вычислений, как правило, слева направо и может быть изменен круглыми скобками. В результате комбинации – значение.
Каждое выражение заканчивается знаком ; (компилятор ищет этот символ)
Примеры выражений:
int a = 0b1001; //задана переменная в двоичном коде
int ar[10] = {1,2,3,4,5,6,7,8,9,10};//задан инициализированный массив из 10 элементов
int rez = (//задано сложное логическое выражение
((g && !v5) || (!g && v5)) && ((f && !v3) || (!f && v3)) &&
((!g && !v4) || (g && v4)) &&
((v3 && !v4 && !v5) || (!v3 && v4 && !v5) || (!v3 && !v4 && v5)) &&
((f && !g) || (!f && g))
);
Операции – действия. Бывают (примеры):
- унарные (с одним операндом) ++ (инкрементация)
- бинарные (с двумя операндами) / (деление);
- условная операция – тернарный оператор ?: (если, то, иначе)
- последовательное вычисление , (перечисление переменных при объявлении)
- определение размера, результат – объем в байтах sizeof().
- преобразование типа (или приведение типа): (тип)
Операция присваивания, множественное присваивание - когда нескольким переменным одного типа присваивается одно значение.
Примеры:
int a = 10, b, c, d;
b = c = d = a; //множественное присваивание
printf("a=%d\tb=%d\tc=%d\td=%d\n", a, b, c, d);
Результат выполнения программы
Арифметические:
- обычные математические действия * / + -
Пример:
int a = 13, b = 10;
float c = a * b / 5. + a;
printf("%6.2f", c);
Результат выполнения
- инкремент и декремент : ++ -- изменение переменной на единицу, имеют префиксную форму (сначала изменение, потом участие в выражении) и постфиксную форму (сначала операнд участвует в выражении, потом изменяется).
Пример:
for(int j = 10; j >=0; --j);
k++; --n;
- остаток от деления % (только с целочисленными данными)
Пример:
int a = 13, b = 10, c;
c = a % b; printf("%3d", c);
Результат выполнения
- битовая арифметика (работают с битами):
& И
| ИЛИ
^ ИСКЛЮЧАЮЩЕЕ ИЛИ
ОТРИЦАНИЕ
<< СДВИГ ВЛЕВО (M< >> СДВИГ ВПРАВО (M>>L, M– число, L-позиции)
Пример:
int a = 13, b = 10, c;
c = (a | b) << 2;
printf("%6d", c);
Результат выполнения
Логические (работают над логическими значениями true false):
&& И
|| ИЛИ
! НЕ
Пример:
if (a > b && c <= a) {/* что-то делается*/}
Сравнения (Отношения) в результате получается истина или ложь:
< <= меньше, меньше равно;
> >= больше, больше равно;
== равно;
!= не равно
Пример:
(x > y) ? x = x - y : y = y - x; //тернарный оператор Условная (тернарный оператор): условие ? выражение1 : выражение2;. Если условие истинно, выполняется выражение1, иначе – выражение2;
Пример: (x > y) ? x = x - y : y = y - x; //тернарный оператор Преобразования типа: (тип) выражение – задание значения нового типа для согласования типа существующей переменной.
Пример:
int a = 10, b = 2;
float f = (float)b / a; //приводим тип, иначе будет 0 Определение размера (объема занимаемой ячейки в байтах): sizeof()
Пример:
int a = 0b1001, b; b = sizeof(a);. Обращение к элементу массива: [] или задание массива.
Пример:
double mas[5]; //резервирование места под массив
mas[2] = 100; //обращение к 3-му элементу массива
Перечисление: , используется при списке идентификаторов.
Пример:
int a = 10, b = 2, c=3; //перечисление – операция запятая Все операции имеют приоритет. Операции по приоритетам представлены в Приложении 1. «Приоритет операций».
Оператор – задает конечное описание некоторого действия. Несколько операторов могут располагаться на одной строчке. Формат: оператор выражение;
Пример:
if (j) continue;
Для описания сложного действия требуется последовательность операторов. Операторы могут быть объединены в блок (составной оператор). Блок заключается в фигурные скобки.
Составной оператор (блок) –для описания сложного действия. - группа операторов в фигурных скобках (для транслятора это означает одно целое):
{
оператор1; оператор2;
оператор3; оператор4; оператор5;
оператор6;
………
}
Пример:
for (int i = 2; i <= Num / 2; i++)
{
int j = Num%i;
if (j) continue;
pr = false;
}
Условные операторы
Истина – значение переменной отличное от 0. Ложь – значение всегда 0.
Условный if: выполняется только, если условие истинно, если условие ложно, то выполняется часть под else (если она есть), или следующий оператор после if.
if (условие) oператор1; (неполный if)
if (условие) oператор1; else oператор2;
Могут быть составные, вложенные:
if (условие1) { if (условие2) oператор11;}
else {oператор2; oператор22;}
Пример:
if (pr) printf("\nПростое число");
else printf("\nНепростое число");
Оператор выбора (варианта):
switch(выражение)
{
case значение1: операторы1; . . . . . . . break;
case значение2: операторы2; . . . . . . break;
case значение3: операторы3; . . . . . . break;
. . . . . . . . . . . . . . . . . . . . . .
default: операторы4; . . . . . . .
}
Выражение должно быть символом или целым числом. Значение выражения последовательно сравнивается с константами (значение1, значение2, значение3,….). Если обнаруживается значение, то выполняются операции до break. Если значения не обнаруживается. То выполняются операторы при default.
Пример: параметр day- целое число, может принимать любое значения, если значение отлично от 1-7, то выдается, что день нет такого номера дня.
switch(day)
{
case 1: case 2: case 3: case 4:
case 5:
printf("\nРабочий день"); break;
case 6:
printf("\nСуббота"); break;
case 7:
printf("\nВоскресенье"); break;
default:
printf("\nНет такого номера дня");
} |
|
|