- •8. Определить перечисляемый тип — это значит перечислить все значения, которые может принимать переменная, относящаяся к данному типу.
- •Функция стандартного вывода printf()
- •Функция стандартного ввода scanf()
- •Формат оператора switch:
- •18. Оператор for
- •20. В отличие от оператора цикла с постусловием оператор цикла с предусловием вычисляет и проверяет условие до выполнения операторов, составляющих тело цикла. Синтаксис этого оператора следующий:
- •Void swap(int & a, int & b)
- •Void swap(int * a, int * b)
- •28. Структуры и объединения.
- •Int DoSomething(); void DoSomething();
- •37. Подставляемые функции
Согласно принципам фон Неймана компьютер должен иметь следующие устройства (рис.1):
процессор, осуществляющий арифметические и логические операции, а также организующий процесс выполнения программ;
запоминающее устройство, или память для хранения программ и данных;
внешние (периферийные) устройства для ввода/вывода информации.
Рис. 1
Память должна состоять из некоторого количества пронумерованных ячеек, в каждой из которых могут находиться или обрабатываемые данные, или инструкции программ. Все ячейки памяти должны быть одинаково доступны для других устройств компьютера.
На рис. 1 одинарные линии показывают управляющие связи, двойные – информационные.
В общих чертах работу компьютера можно описать так. Вначале с помощью какого-либо периферийного устройства в память компьютера вводится программа. Процессор считывает содержимое ячейки памяти, где находится первая инструкция (команда) программы, и организует её выполнение. Эта команда может задавать выполнение арифметических или логических операций, чтение из памяти данных для выполнения арифметических или логических операций или запись их результатов в память, ввод данных из внешнего устройства в память или вывод данных из памяти на внешнее устройство.
Как правило, после выполнения одной команды процессор начинает обрабатывать команду из ячейки памяти, которая находится непосредственно за только что выполненной командой. Однако этот порядок может быть изменен с помощью команд управления (перехода). Эти команды указывают процессору, что ему следует продолжить выполнение программы, начиная с команды, содержащейся в некоторой другой ячейке памяти. Такой "скачок", или переход, осуществляется в программе не всегда, а только при соблюдении некоторых условий. Например, если некоторые числа равны, если в результате предыдущей арифметической операции получился нуль. Это позволяет использовать одни и те же последовательности команд в программе много раз (организовывать циклы), выполнять различные последовательности команд в зависимости от соблюдения определенных условий и т.д., одним словом, создавать сложные программы.
Таким образом, процессор выполняет инструкции программы автоматически, без вмешательства человека. Он может обмениваться информацией с памятью и внешними устройствами компьютера. Поскольку внешние устройства, как правило, работают значительно медленнее, чем остальные части компьютера, процессор может приостанавливать выполнение программы до завершения операции ввода-вывода с внешним устройством. Все результаты выполненной программы должны быть ею выведены на внешние устройства компьютера, после чего компьютер переходит к ожиданию каких-либо сигналов внешних устройств.
"алгоритм - это точное предписание, однозначно определяющее вычислительный процесс, ведущий от варьируемых начальных данных к искомому результату".
Алгоритм должен обладать следующими основными свойствами:
• детерминированность (определенность) - при заданных исходных данных обеспечивается однозначность искомого результата;
• массовость - пригодность для задач данного типа при исходных данных, принадлежащих заданному подмножеству;
• результативность - реализуемый вычислительный процесс выполняется за конечное число этапов с выдачей осмысленного результата;
• дискретность - разбиение на отдельные этапы, выполнение которых не вызывает сомнений.
В настоящее время используется несколько способов записи алгоритмов. 1. Словесно-формульное описание алгоритма, т. е. описание алгоритма с помощью слов и формул. Это наиболее простой способ. Для его понимания достаточно рассмотреть пример, приведенный ниже. Кстати, кулинарный рецепт – пример такого описания алгоритма.
2. Графическое описание алгоритма, т. е. описание с помощью схем алгоритмов. Схема алгоритма представляет собой систему связанных геометрических фигур. Каждая фигура обозначает один этап процесса решения задачи и называется блоком. Порядок выполнения этапов указывается стрелками, соединяющими блоки. В схеме блоки стараются размещать сверху вниз, в порядке их выполнения. Для наглядности операции разного вида изображаются в схеме различными геометрическими фигурами.
3. Описание алгоритма на алгоритмическом языке (алгоязыке). Алгоритмический язык - это система обозначений и правил для единообразной и точной записи алгоритмов и их исполнения. Алгоритмический язык – это средство для записи алгоритмов в аналитическом виде, промежуточном между записью алгоритма на естественном (человеческом) языке и записью на языке ЭВМ (языке программирования).
4.
В общем случае решение задачи на ЭВМ можно разбить на следующие этапы:
• постановка задачи;
• разработка алгоритма;
• составление программы;
• трансляция программы;
• отладка и выполнение программы;
• анализ результатов.
5. #директивы препроцессора
………………
#директивы препроцессора
функция а ( )
операторы
функция b ( )
операторы
………………
void main ( ) //функция, с которой начинается выполнение программы
{ операторы }
прописные и строчные латинские буквы и знак подчеркивания;
арабские цифры от 0 до 9;
специальные знаки, например, {, %, # и т.д.
пробельные символы: пробел, символы табуляции, символы перехода на новую строку.
Операции языка С++ в порядке убывания приоритета
Операция |
Назначение |
() |
вызов функции |
[] |
выделение массива |
. |
обращение к полям и методам через сам объект |
-> |
обращение к полям и методам через ссылку на объект |
! |
Логическое отрицание |
~ |
Побитовое отрицание |
- |
изменение знака |
++ |
инкремент |
-- |
декремент |
& |
взятие адреса (&a) |
* |
обращение по адресу (a*) |
(тип) |
преобразование типа |
sizeof() |
размер в байтах |
* |
умножение |
/ |
деление |
% |
остаток от деления |
+ |
сложение |
- |
вычитание |
< |
меньше |
> |
больше |
<= |
меньше равно |
>= |
больше равно |
== |
равно |
!= |
не равно |
& |
поразрядное логическое И |
^ |
поразрядное исключающее ИЛИ |
| |
поразрядное логическое ИЛИ |
&& |
логическое И |
|| |
логическое ИЛИ |
?: |
условная операция |
= |
операция присваивания |
, |
операция запятая |
+= -= *= /= <<= >>= &= |= ^= |
Бинарные операции |
/*Пример pr1 - простейшая программа*/ #include <stdio.h> #include <conio.h> // Главная функция void main() { int a, b, rezult; printf ( "\n Введите a и b: " ); scanf ( "%d%d", &a, &b); result = a+b; printf ( "rezult=%d", result ); getch(); } |
// строка 0 // строка 1 // строка 2 // строка 3 // строка 4 // строка 5 // строка 6 // строка 7 // строка 8 // строка 9 // строка 10 // строка 11 // строка 12 // строка 13 |
Структура программы на языке C++ представляет собой некоторую совокупность функций, из которых одна является главной и присутствует в каждой программе. Эта функция носит стандартное имя main и с неё начинается выполнение программы. Язык С++ является языком свободного формата, что позволяет размещать в строке как один, так и несколько операторов.
Нулевая, первая и четвертая строки программы – комментарии. Комментарии служат для улучшения читаемости программы, и компилятором игнорируются. Комментарии бывают однострочные и многострочные.
Две следующие строчки программы – директивы препроцессора, которые добавляют в текст программы содержимое файлов stdio.h и conio.h. В этих файлах находятся заголовки функций ввода и вывода. Из файла stdio.h в программе используются функции printf и scanf. Функция scanf служит для ввода исходных данных с клавиатуры, а printf – для вывода информации на экран монитора. Из файла conio.h применяется функция getch, которая читает с клавиатуры символ.
Основные операции над целыми числами:
"+" – сложение; "*" – умножение; " / " – деление; "–" – вычитание; "%" – получение остатка от целочисленного деления.
Обращение |
Реализуемое действие |
fabs(x) atan(x) floor(x) log(x) pow(x,y) sqrt(x) sin(x) с os(x) exp(x) |
Модуль аргумента Aрктангенс (радианы) Целая часть числа в форме double Натуральный логарифм Вычисляет значение x в степени y Корень квадратный Синус (радианы) Косинус (радианы) Экспонента |
Символ формата |
Тип выводимого объекта |
%c %s %d %u %ld %f %e %lu %g %lf %le %lg |
char Строка символов int unsigned int long(в десятичном виде) float/double(с фиксированной точкой) float/double(в экспоненциальной форме) unsigned long float/double(в виде f или е в зависимости от значения) long double (с фиксированной точкой) long double(в экспоненциальной форме) long double(в виде f или е в зависимости от значения) |
6.
7. целые (int, long, short), вещественные (float, double)
Длина, байт |
Название типа |
Назначение типа |
Диапазон значений |
1 |
unsigned char |
Небольшие целые числа и коды символов |
от 0 до 255 |
1 |
char |
Очень малые целые числа и ASCII-коды |
от 128 до 127 |
2 |
unsigned int |
Большие целые и счетчики циклов |
от 0 до 65535 |
2 |
int |
Небольшие целые |
от 32768 до 32767 |
2 |
short int |
Небольшие целые |
от 32768 до 32767 |
4 |
unsigned long |
Астрономические расстояния |
от 0 до 4294967295 |
4 |
long |
Большие числа |
от -2147483648 до 2147483647 |
Длина, байт |
Название |
Диапазон десятичного порядка |
Количество значащих цифр |
4 |
float |
от 38 до +38 |
от 7 до 8 |
8 |
double |
от 308 до +308 |
от 15 до 16 |
10 |
long double |
от 4932 до +4932 |
от 19 до 20 |
8. Определить перечисляемый тип — это значит перечислить все значения, которые может принимать переменная, относящаяся к данному типу.
В общем виде объявление перечисляемого типа выглядит так:
Тип =( Значение1, Значение2, ... Значение i)
где:
тип — имя перечисляемого типа данных;
Значение i — символьная константа, определяющая одно из значений, которое может принимать переменная типа Тип.
Перечислимый тип определяется как набор идентификаторов, с точки зрения языка играющих ту же роль, что и обычные именованные константы, но связанные с этим типом. Классическое описание типа-перечисления в языке Паскаль выглядит следующим образом:
type Cardsuit = (clubs, diamonds, hearts, spades);
Здесь производится объявление типа данных Cardsuit (карточная масть), значениями которого может быть любая из четырёх перечисленных констант. Переменная типа Cardsuit может принимать одно из значений clubs, diamonds, hearts, spades, допускается сравнение значений типа перечисление на равенство или неравенство, а также использование их в операторах выбора (в Паскале — case) в качестве значений, идентифицирующих варианты.
9. Указатель – это переменная в с++, значением которой является адрес. Он указывает на начало области оперативной памяти, где хранятся данные.
Создание указателя в языке программирования с++:
<Тип данного> * <название указателя> ;
Пример : int*nomer
Присвоить значение указателю можно следующим образом:
<Название указателя> = <адрес переменной>;
Для получения адреса выполняется команда &<название переменной>.
Операции, которые можно выполнять над указателями:
==, !=, >=, <=, <, > эти операции выполняют сравнение двух показателей (т.е. адреса, которые в них содержатся)
- (vk1-vk2) используется для определения количества элементов, которые имеются между двумя указателями
+, - (vk1+k, vk1 – k)находит указатель, который смещен относительно данного на k единиц.
10, 11
printf () – вывод данных в стиле языка C;
scanf () – ввод данных в стиле языка C;
cout << – вывод данных в языке C++;
cin >> – ввод данных в языке C++;
Функция стандартного вывода printf()
Функция printf() является функцией стандартного вывода. С помощью этой функции можно вывести на экран монитора строку символов, число, значение переменной...
Функция printf() имеет прототип в файле stdio.h int printf(char *управляющая строка, ...);
В случае успеха функция printf() возвращает число выведенных символов.
Управляющая строка содержит два типа информации: символы, которые непосредственно выводятся на экран, и спецификаторы формата, определяющие, как выводить аргументы.
Функция printf() это функция форматированного вывода. Это означает, что в параметрах функции необходимо указать формат данных, которые будут выводиться. Формат данных указывается спецификаторами формата. Спецификатор формата начинается с символа % за которым следует код формата.
Функция стандартного ввода scanf()
Функция scanf() - функция форматированного ввода. С её помощью вы можете вводить данные со стандартного устройства ввода (клавиатуры). Вводимыми данными могут быть целые числа, числа с плавающей запятой, символы, строки и указатели.
Функция scanf() имеет следующий прототип в файле stdio.h: int scanf(char *управляющая строка);
Функция возвращает число переменных которым было присвоено значение.
Управляющая строка содержит три вида символов: спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа %.
cin и cout - потоки ввода и вывода, которые присоединены к командной строке, а не клаве и экрану. Чтобы их использовать нужно подключить #include <iostream> Они описаны в простанстве имен std, именно поэтому мы его и подключаем. Строчкой : using namespace std; мы подключаем к программе всё пространство std
12. Операция присваивания в языке программирования C++ обозначается знаком '='
Присваивание в C/C++ отличается от аналогичных операций в других языках программирования тем, что, как и другие операторы C/C++, оператор присваивания не обязан стоять в отдельной строке и может входить в более крупные выражения. В качестве результата оператор возвращает значение, присвоенное левому операнду. Например, следующее выражение вполне корректно: valuel = 8 * (value2 = 5); В данном случае сначала переменной value2 будет присвоено значение 5, после чего это значение будет умножено на 8 и результат 40 будет записан в переменную value1. В результате многократного использования оператора присваивания в одной строке может получиться трудночитаемое, но вполне работоспособное выражение. Рассмотрим первый прием, который часто применяется для присваивания нескольким переменным одинакового значения: valuel = value2 = value3 = 0; Второй прием часто можно встретить в условных выражениях цикла while, как в следующем примере: while ((с = getchar()) != EOF) { . . . } Вначале переменной с присваивается значение, возвращаемое функцией getchar (}, после чего осуществляется проверка значения переменной на равенство константе eof. Цикл завершается при обнаружении конца файла. Использование круглых скобок необходимо из-за того, что оператор присваивания имеет меньший приоритет, чем подавляющее большинство других операторов, в частности оператор неравенства. Без круглых скобок данная строка будет воспринята следующим образом: с = (getchar() != EOF) То есть переменной с будет присваиваться значение 1 (true) всякий раз, когда функция getchar () возвращает значение, отличное от признака конца файла.
13.-------
14. if (условие) {
оператор 1; оператор 2; ....... оператор n;
} else {
оператор 1; оператор 2; ....... оператор n;
}
switch (выражение) {
case константное_выражение:
оператор 1; оператор 2; ....... оператор n; break;
case константное_выражение:
оператор 1; оператор 2; ....... оператор n; break;
default:
оператор 1; оператор 2; ....... оператор n; break;
}
Оператор if используется для того, чтобы определить действия программы при различных условиях. Например у нас есть число. И если оно четное нам нужно его удвоить, а иначе разделить пополам. Для написания подобной программы и используется оператор if. В самой простой вариации он будет иметь следующую форму
?
1 2 |
if(<условие>) <действие>; |
В этом случае если условие выполняется , то программа совершит некоторое действие. Например:
?
1 2 |
if(a == 2) cout << a; |
Здесь мы видим, что если некоторая переменная a станет равной 2, то программа её выведет. Для сравнения числа с 2 мы используем двойное равно ==. В С++ двойное равно == используется для любых сравнительных операций. А чтобы проверить переменную на неравенство какому-либо числу надо написать !=.
?
1 2 |
if(a != 2) cout << a; |
В таком варианте программа выведет a, только если a не равно 2. Теперь поговорим о более сложных вариациях оператора if. Что если мы захотим при невыполнении основного условия сделать что-нибудь другое? Для этого используется структура if() ; else ; Например:
?
1 2 |
if(a == 2) cout << a; else cout << 0; |
Здесь, если число равно 2, то программа его выведет, а иначе выведет 0. А что если при невыполнении первого условия нам нужно проверять еще что-то? Приведем пример из жизни. Если на улице солнечно то мы можем одеть футболку. А если нет? То мы еще должны посмотреть на улице просто пасмурно, или идет дождь, или может даже снег. Для подобных ситуаций в программировании мы можем использовать структуру if() ; else if() ; else ;
?
1 2 3 4 5 |
if(a > 100) cout << 3; else if(a > 50) cout << 2; else if(a >= 0) cout << 1; else cout << 0; |
Здесь, если a больше 100 то программа выведет 3, а иначе будет смотреть другие варианты. Если число больше 50, то выведет 2, больше или равно 0 выведет 1, а если число отрицательно выведет 0. Примечание: -Любое условие в С++ заключается в круглые скобки() -Для сравнения переменных используются сравнительные символы >, <, ==, != (больше, меньше, равно, не равно) -перед else всегда ставится точка с запятой
15.
В языке Си составной оператор ограничивается фигурными скобками, что сокращает размеры программы, но принципиально не отличается от Паскаля и Алгола:
if (условие)
{ // начало составного оператора
... // несколько операторов
} // конец составного оператора
else
{ // начало составного оператора
... // несколько операторов
} // конец составного оператора
while (условие)
{ // начало составного оператора
... // несколько операторов
} // конец составного оператора
do
{ // начало составного оператора
... // несколько операторов
} // конец составного оператора
while (условие);
for (инициализация; условие; оператор)
{ // начало составного оператора
... // несколько операторов
} // конец составного оператора
Составной оператор
Составной оператор представляет собой несколько операторов и объявлений, заключенных в фигурные скобки:
{ [oбъявление] : оператор; [оператор]; : }
Заметим, что в конце составного оператора точка с запятой не ставится.
Выполнение составного оператора заключается в последовательном выполнении составляющих его операторов.
Пример:
int main () { int q,b; double t,d; : if (...) { int e,g; double f,q; : } : return (0); }
Переменные e,g,f,q будут уничтожены после выполнения составного оператора. Отметим, что переменная q является локальной в составном операторе, т.е. она никоим образом не связана с переменной q объявленной в начале функции main с типом int. Отметим также, что выражение стоящее после return может быть заключено в круглые скобки, хотя наличие последних необязательно.
16. Обычно его называют оператором выбора. Действительно, перключатель switch позволяет так организовать вычислительный процесс, что анализируется выполнение целого набора условий с помощью переключателя. В зависимости от того, какое условие выполнилось, происходит выбор нужного варианта дальнейшего продолжения вычислительного процесса.