Вопросы к экзамену по С++ для PV-11
Правила для оформления решений задач
Материалы и книги по программированию на С/С++
Язык программирования - это фиксированная система обозначений для описания алгоритмов и структур данных.
Для составления программ существуют разнообразные языки программирования. Для обучения подходят Бейсик, Паскаль, Logo и др. Для профессионального программирования используются Java, C++, Python, Perl, PHP, ruby и др. Смотри также Что такое язык программирования
Система программирования - это программное обеспечение компьютера, предназначенное для разработки, отладки и исполнения программ, записанных на определенном языке программирования. Для программирования на С и С++ мы будем использовать свободнораспространяемые пргограммы Code::Blocks или DevC++. Программы могут также компилироваться в
Часто задача, которую требуется решить, сформулирована не на математическом языке. Для решения на компьютере ее сначала нужно привести к форме математической задачи, а потом уже программировать. Работа по решению таких задач с использованием компьютера проходит через следующие этапы:
В чистом виде программированием, т. е. разработкой алгоритма и программы, здесь являются лишь 3, 4 и 5 этапы.
Первые три этапа - это работа без компьютера. Дальше следует собственно программирование на определенном языке в определенной системе программирования. Последний (шестой) этап - это использование уже разработанной программы в практических целях.
В уточнённой версии с точки зрения создателя программы решение задач включает в себя следующие основные этапы, часть из которых осуществляется без участия компьютера.
Алгоpитм — заранее заданное понятное и точное пpедписание возможному исполнителю совеpшить определенную последовательность действий для получения решения задачи за конечное число шагов.
Алгоритм обладает следующими свойствами:
Порядок выполнения алгоритма:
Способы записи алгоритмов:
Для записи алгоритмов могут использоваться специальные языки:
Алгоритмизация - процесс разработки алгоритма для решения задачи, которое часто описывается блок-схемой.
Блок-схема - распространенный тип схем (графических моделей), описывающих алгоритмы или процессы, в которых отдельные шаги изображаются в виде блоков различной формы, соединенных между собой линиями, указывающими направление последовательности действий, операций, сигналов или событий.
Где схе́ма — это графическое представление определения, анализа или метода решения задачи, в котором используются символы для отображения операций, данных, потока, оборудования и т. д.
Порядок выполнения действий задается путем соединения вершин дугами, что позволяет рассматривать блок-схемы не только как наглядную интерпретацию алгоритма, удобную для восприятия человеком, но и как взвешенный ориентированный граф (т. н. граф-схема алгоритма, ГСА). Подобное представление алгоритмов используется при построении систем логического управления, реализующих заданные управляющие алгоритмы, в задачах распараллеливания вычислений и т. д.
Для автоматического создания блок-схем из исходных текстов программ и их создания вручную существуют свободные программы — Diagram Designer, Dia, Kivio (входит в пакет KOffice), OpenOffice.org Draw, processWave.org, yEd Graph Editor, AFCE, коммерческие программы Microsoft Visio, diamFC, также существуют программы, предоставляемые как онлайн-услуги
Как составить блок-схему, Как рисовать блок-схему, Алгоритмы линейной и разветвляющейся структуры
Составление алгоритмов графическим способом подчиняется нескольким стандартам:
Название | Символ (рисунок) | Выполняемая функция (пояснение) |
1. Блок вычислений | Выполняет вычислительное действие или группу действий | |
2. Логический блок | Выбор направления выполнения алгоритма в зависимости от условия | |
3. Блоки ввода/вывода | Ввод или вывод данных вне зависимости от физического носителя | |
Вывод данных на печатающее устройство | ||
4. Начало/конец (вход/выход) | Начало или конец программы, вход или выход в подпрограмму | |
5. Предопределенный процесс | Вычисления по стандартной или пользовательской подпрограмме | |
6. Блок модификации | Выполнение действий, изменяющих пункты алгоритма | |
7. Соединитель | Указание связи между прерванными линиями в пределах одной страницы | |
8. Межстраничный соединитель | Указание связи между частями схемы, расположенной на разных страницах |
Действия в алгоритме могут следовать последовательно друг за другом. Однако очередность выполнения этих действий может быть изменена, если в алгоритме предусмотрен анализ некоторого условия. Путем включения условий создаются алгоритмы с различной структурой, в которой всегда можно выделить несколько типовых конструкций:
Линейная алгоритмическая структура - описание последовательности действий, которые выполняются однократно и в заданном порядке.
Это такие алгоритмы, в которых все действия совершаются одно за другим, независимо ни от чего. Такие алгоритмы называются линейными; характерная для них форма организации действий – последовательное выполнение.
Разветвляющаяся алгоритмическая структура (ветвление) - описание действий, последовательность выполнения которых зависит от истинности или ложности условий.
Алгоритм, в котором используется условие, получил название разветвляющегося, так как в зависимости от значения условия выбираются те или иные действия. Словесная формулировка: «Если <условие> то <действие2> иначе <действие1>». Главная задача - проверить условие, а затем, в зависимости от результата проверки, выполнить соответствующее действие. Условие – выражение, находящееся между словами «если» и «то» и принимающее значение «истина» или «ложь». В зависимости от значения условия выполняется либо действие указанное после слова «то», либо действие, указанное после слова «иначе».
Виды ветвлений:
Использование ветвлений со сложными условиями и вложенными конструкциями бывает трудоемким. Когда вариантов операторов намного больше, чем два, целесообразно использовать конструкцию выбора. Конструкция выбора позволяет выбрать любой вариант из множества допустимых значений.
Циклическая алгоритмическая структура – описание действий, которые для решения задачи должны повторяться указанное число раз или пока не выполнено заданное условие. Перечень повторяющихся действий называется телом цикла.
Основные виды циклов.
1.Цикл «while» (цикл с предусловием). Словесная формулировка: «Пока условие истинно, выполнять тело цикла ».
2.Цикл «do .. while» (цикл с пост условием). Словесная формулировка: «До тех пор, как условие станет истинным, выполнять тело цикла».
3. Цикл «for» (цикл с параметром) является частным случаем цикла с предусловием. Словесная формулировка: «Для каждого значения параметра I, изменяющегося от A до B c шагом С выполнять тело цикла ».
Точнее смотри Основы алгоритмизации и программирования или выборку с этой страницы и основы языка С
В тексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения. Подобные элементы содержит и алгоритмический язык, только
Далее рассмотрим алфавит языка программирования C++ и его лексемы.
Алфавит (или множество литер) языка программирования C++ основывается на множестве символов таблицы кодов ASCII. Алфавит C++ включает:
Алфавит C++ служит для построения слов, которые в C++ называются лексемами. Различают пять типов лексем:
Почти все типы лексем (кроме ключевых слов и идентификаторов) имеют собственные правила словообразования, включая собственные подмножества алфавита.
Лексемы разделяются разделителями. Этой же цели служит множество пробельных символов, к числу которых относятся пробел, символы горизонтальной и вертикальной табуляции, символ новой строки, перевода формата и комментарии.
Идентификаторы это имена переменных, функций и меток, используемых в программе. Идентификатор создается объявлением соответствующей ему переменной или функции. После этого его можно использовать в последующих операторах программы. Идентификатор состоит из последовательности одной или более букв, цифр или символов подчеркиваний( _ ), которая начинается с буквы или символа подчеркивания.
Рассмотрим правила построения идентификаторов из букв алфавита (в C++ три):
NB!
Часть идентификаторов C++ входит в фиксированный словарь ключевых слов. Эти идентификаторы образуют подмножество ключевых слов (они так и называются ключевыми словами). Прочие идентификаторы после специального объявления становятся именами. Имена служат для обозначения переменных, типов данных, классов, функций и меток. Ключевые слова не могут быть переопределены.
Ниже приводится список ключевых слов:
asm | else | new | this |
auto | enum | operator | throw |
bool | explicit | private | true |
break | export | protected | try |
case | extern | public | typedef |
catch | false | register | typeid |
char | float | reinterpret_cast | typename |
class | for | return | union |
const | friend | short | unsigned |
const_cast | goto | signed | using |
continue | if | sizeof | virtual |
default | inline | static | void |
delete | int | static__cast | volatile |
do | long | struct | wchar_t |
double | mutable | switch | while |
dynamic_cast | namespace | template |
Множество лексем, соответствующее множеству символов операций и разделителей строится на основе набора специальных символов и букв(!) алфавита. Единственное правило словообразования для этих категорий лексем заключается в задании фиксированного множества символов операций и разделителей.
Короче символы операции — это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся по количеству участвующих в них операндов на:
Один и тот же символ операции может интерпретироваться по-разному в зависимости от контекста.
Все знаки операций за исключением [ ], ( ) и ? : представляют собой отдельные лексемы.
Большинство стандартных операций может быть переопределено (перегружено).
Символы операций приведены в отдельной заметке – Операции языка C++
Слеующие последовательности специальных символов и букв алфавита образуют множество символов операций (часть из них в зависимости от контекста может быть использована в качестве разделителей):
, | ! | != | | | |= | % | %= | & |
&& | &= | () | * | *= | + | ++ | += |
- | -- | -= | -> | ->* | . | .* | / |
/= | :: | < | << | <= | <<= | > | >> |
>= | >>= | == | ?: | [] | ^ | ^= | ~ |
|| | # | ## | sizeof | new | delete | typeid | throw |
Кроме того, к числу разделителей относятся пробельные символы и следующие последовательности специальных символов:
... | ; | {} |
Литералы особая категория слов языка. Для каждого подмножества литералов используются собственные правила словообразования.
В C++ существует пять типов литералов:
\0 \x00 null пустая литера
\a \x07 bel сигнал
\b \x08 bs возврат на шаг
\f \x0C ff перевод страницы
\n \x0A lf перевод строки
\r \x0D cr возврат каретки
\t \x09 ht горизонтальная табуляция
\v \x0B vt вертикальная табуляция
\\ \x5C \ обратная косая черта
\' \x27 '
\" \x22 "
\? \x3F ?
Комментарий - пояснения к исходному тексту программы, находящиеся непосредственно внутри комментируемого кода.
Комментарий создаётся
последовательностью символов, которая воспринимается компилятором как отдельный пробельный символ или, другими словами, игнорируется.
Большинство специалистов сходятся во мнении, что комментарии должны объяснять намерения программиста, а не код; то, что можно выразить на языке программирования, не должно выноситься в комментарии — в частности, надо использовать говорящие названия переменных, функций, классов, методов и пр., разбивать программу на лёгкие для понимания части, стремиться к тому, чтобы структура классов и структура баз данных были максимально понятными и прозрачными и т. д. Есть даже мнение (его придерживаются в экстремальном программировании и некоторых других гибких методологиях программирования), что если для понимания программы требуются комментарии — значит, она плохо написана.
Концепция грамотного программирования настаивает на включение в текст программы настолько подробных и продуманных комментариев, чтобы она стала исходным текстом не только для исполняемого кода, но и для сопроводительной документации.
Комментарии часто используются для временного отключения части кода. В языках C и C++, некоторые рекомендуют использовать с той же целью директивы препроцессора (#if 0 … #endif).
С точки зрения синтаксиса, существуют два вида комментариев.
Пример кода программы с комментариями:
/* Это начало многострочного комментария.
Подключаем к нашей программе файл с именем iostream, в котором содержится описание
стандартной библиотеки ввода-вывода языка C++.
В этом файле находится, в частности, определение объектов cout и endl
На следующей строчке признак конца многострочного комментария.
*/ #include <iostream> /* Его можно использовать и как однострочный */
using namespace std; // Две наклонные черты это признак начала однострочного комментария до конца строки.
// Объявляем функцию main, не принимающей никаких аргументов и возвращающей значение int. int main() {
/* // Используем многострочный комментарий для временного отключения низлежащего кода
// полезно при поиске ошибок и для отладочных распечатков переменных
int x,y,z,k,m,p;
x=4; y=5; z = x + y;
*/
// при помощи оператора << помещаем в объект cout строку "Hello, world!",
// и специальный объект endl, означающий символ перевода строки, // что приводит к печати на экране этой строки и последующему переводу каретки
cout<<"Hello, world!"<<endl; return 0; }
Переменная в языке С++ является основой. Переменную можно представить, как небольшой контейнер, в которой хранятся вещи для использования, при чём использование этих вещей происходит очень часто.
Все переменные в языке C++ должны быть объявлены перед использованием.
При использовании в программе ранее не объявленной переменной компилятор выдаст сообщение об ошибке.
Объявление переменной имеет следующий вид:
<тип переменой> <один или несколько идентификаторов переменных через запятую>;
Например, переменные x и y типа int(целочисленные) можно объявить такой строкой:
int x, y;
Переменную f типа double(с плавающей точкой двойной точности) можно объявить такой строкой:
double f;
Это один из вариантов объявления переменных. В языке С++ объявление может происходить на любом участке программного кода. Мы объявили переменные х, у и определили, что они могут содержать значения типа int.
NB!! Значения переменных сразу после объявления не определены и являются произвольными. Предположение о том, что все переменные первоначально имеют нулевые значения, является ошибочным.
Типы переменных в C++
В C++ доступны следующие встроенные типы:
Операции сравнения возвращают тип bool. Выражения в скобках после if, while приводятся к типу bool.
Основные типы в C++ подразделяются на две группы: целочисленные типы и типы с плавающей точкой (для краткости их будем называть плавающими типами). Это арифметические типы.
В C++ нет жёсткого стандарта на диапазоны значений арифметических типов (в стандарте языка оговариваются лишь минимально допустимые значения). В принципе, эти диапазоны определяются конкретной реализацией. Обычно выбор этих характеристик диктуется эффективностью использования вычислительных возможностей компьютера. Зависимость языка от реализации создаёт определённые проблемы переносимости. C++ остаётся машинно-зависимым языком.
К целочисленным типам относятся типы, представленные следующими именами основных типов:
char short int long
Имена целочисленных типов могут использоваться в сочетании с парой модификаторов типа:
signed unsigned Эти модификаторы изменяют формат представления данных, но не влияют на размеры выделяемых областей памяти.
Модификатор типа signed указывает, что переменная может принимать как положительные, так и отрицательные значения. Возможно, что при этом самый левый бит области памяти, выделяемой для хранения значения, используется для представления знака. Если этот бит установлен в 0, то значение переменной считается положительным. Если бит установлен в 1, то значение переменной считается отрицательным.
Модификатор типа unsigned указывает, что переменная принимает неотрицательные значения. При этом самый левый бит области памяти, выделяемой для хранения значения, используется так же, как и все остальные биты области памяти - для представления значения.
В ряде случаев модификаторы типа можно рассматривать как имена основных типов.
Тип | Описание | Размер | Диапазон | Синоним |
int | Целые числа | 4 байта | -231...231-1 | |
unsigned int | Беззнаковые целые | 4 байта | 0...232-1 | unsigned |
long int | Длинные целые | 4 байта | -231...231-1 | long |
unsigned long | Беззнаковые длинные | 4 байта | 0...232-1 | |
short int | Короткие целые | 2 байта | -215..215-1 | short |
unsigned short | Беззнаковые короткие | 2 байта | 0...216-1 | |
При этом в стандарте языка C++ не оговаривается конкретный размер каждого из вышеперечисленных типов, для каждого компилятора они могут быть своими. Приведенные выше числа верны для компиляторов GCC, MS VC++.
Действительные числа или числа с плавающей точкой можно записывать в виде десятичных дробей как с фиксированной точкой (например, 3.1415926, 100.001, -10000000.0), так и с плавающей точкой. В последнем случае число имеет вид <f> e <p>, где <f> — дробное число (положительное или отрицательное), называемое мантиссой, а <p> — целое число (положительное или отрицательное), называемое порядком.
Примеры записи чисел с плавающей точкой:
Запись | Значение |
3.14e1 | 31.4 |
3.14e5 | 314000 |
3.14e-3 | 0.00314 |
-1e6 | -1000000 |
К плавающим типам относятся три типа, представленные следующими именами типов, модификаторов и их сочетаний:
Имя типа | Байты | Биты | Min | Max |
float | 4 | 32 | 3.4E-38 | 3.4E+38 |
double | 8 | 64 | 1.7E-308 | 1.7E+308 |
long double | 10 | 80 | 3.4E-4932 | 3.4E+4932 |
Как правило, для хранения целых чисел следует использовать тип int, а для действительных чисел — double.
NB! Помимо основных типов в C++ существуют специальные языковые средства, которые позволяют из элементов основных типов создавать новые, так называемые производные типы.
Программы хранят информацию в переменныхКонстантами называют неизменяемые величины. Существую константы следующих типов:
Форматы констант, соответствующие каждому типу, приведены в таблице ниже.
Тип константы | Формат | Примеры констант |
Целая | Десятичный: последовательность десятичных цифр, начинающаясяне с нуля, если это не число нуль | 8, 0, 199226 |
Восьмеричный: нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7) | 01, 020, 07155 | |
Шестнадцатеричный: 0х или 0Х, за которым следуют шестнадцатеричные цифры (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) | 0хА, 0x1B8, 0X00FF | |
Вещественная | Десятичный:[цифры].[цифры] |
5.7, .001, 123.0 |
Экспоненциальный:[цифры][.][цифры]{Е¦е}[+¦ -][цифры] | 35.0.2Е6, .11е-З, 5Е10 | |
Символьная | Один или два символа, заключенных в апострофы | 'А', 'ю', '*', 'db', '\0', '\n', '\012', '\x07\x07' |
Строковая | Последовательность символов, заключенная в кавычки | "Здесь был Vasia","\t3начение r=\0xF5\n" |
Константы представляют собой ячейки памяти, в которых хранятся данные в неизменном виде, то есть изменить эти данные нельзя.
Создаваемую константу нужно инициализировать, поскольку потом ей уже нельзя присвоить новое значение.
В языке C++ существует два вида констант: литеральные и именованная.
Литеральная константа – это значение, непосредственно вводимое в самой программе.
int coder = 14;
Переменная coder типа int, а число 14 является литеральной константой.
Именованные константы представлены именем, как и все переменные, однако в отличие от переменной, значение инициализированной константы изменить невозможно.
const unsigned short int moloko=30;Используя ключевое слово const, тип переменной создаём сонстанту с именем moloko и присваиваем ей значение 30.
summa=moloko*17;
Можно также определить константу директивой препроцессора
#define moloko 30;
Препроцессор перед началом компиляции пройдётся по всему коду и везде где встретит константу молоко заменит её числом 30.
Препроцессор С/С++ это программный инструмент, изменяющий код программы для последующей компиляции и сборки, используемый в языках программирования Си и C++. Препроцессор Си, Директивы препроцессора
Арифметическая инструкция — это некоторое выражение, состоящее из констант, идентификаторов переменных и арифметических операторов, которая завершается точкой с запятой. Самый главный арифметический оператор — это оператор присваивания ‘=’, который присваивает одной переменной, идентификатор которой указывается слева от оператора ‘=’ значение некоторого выражения, которое стоит справа. Например:
x=2;
y=x+5;
В последней строке встретился оператор сложения ‘+’. Кроме оператора сложения, есть еще операторы вычитания ‘-’, умножения ‘*’, деления ‘/’ и взятия остатка от деления целых чисел ‘%’.
Особого внимания заслуживает оператор деления. Если оба его аргумента имеют целочисленный тип (то есть один из типов, перечисленных в первой таблице или целочисленные константы), то этот оператор рассматривается, как оператор деления целых чисел с остатком. Если же хотя бы один из операторов будет иметь дробный тип, то оператор деления выполняется, как оператор деления десятичных дробей.
В арифметическом выражении сначала выполняются слева направо все операторы умножения и деления, затем слева направо все операторы сложения и вычитания, затем справа налево все операторы присваивания. При необходимости порядок действий можно изменить при помощи скобок.
Пример: #include <iostream> using namespace std;
int main() {
int x,y,z,k,m,p; // создаём переменные
x=4; y=5; // присваиваем значения переменным x и y z = x + y; // складываем значения x и y и результат присваиваем переменной z
k = x * y / z; // умножаем значение x на y и делим на z, результат присваиваем переменной k
p = k % 7; // вычисляем значение остатка от деления значения переменной k на число 7
long int l=1234567891234;
m = l / x;
float g=4.23;
double df=214.524765423;
return 0;
}
Лучшие приемы программирования на C
Правила программирования на С и С++. Главы 1-6Правила программирования на С и С++. Главы 7-8
1. Каждый новый блок операторов прибавляет 4 пробела. Пример if (a > b) { cout << "k" << endl; if (t < r) { cout << "Maybee there is some errors" << endl; } } 2. Скобки { (как, впрочем, видно из кода) должны стоять на отдельной строчке. 3. Функции НЕ должны отделяться пробелами от передаваемых параметров Пример правильного вызова функции: sqrt(10) Пример неправильного вызова функции: sqrt (10) 4. Бинарные операции и знак равно должны отделяться пробелами с двух сторон. a = b / c; 5. Унарные операции должны идти слитно с параметрами b = -b; 6. Скобки не должны быть отделены от текста внутри них пробелами: Пример правильного употребления: (a + b) Неправильного: ( a + b ) 7. Тело функции с двух сторон должно быть выделено пустыми строками. Пример неправильной программы: #include <iostream> using namespace std; int a, b; int *p, *m, *r; int main() { какой-то код } Пример правильной программы: #include <iostream> using namespace std; int a, b; int *p, *m, *r; int main() { какой-то код } 8. Для перехода на новую строчку надо выводить не строчку "\n", а endl (cout << endl;) Смотри ещё Правила форматирования программ
Для того, чтобы вывести на экран значение переменной или текстовой строки нужно использовать объект ‘cout’ и оператор ‘<<’, который в данном случае следует называть "Поместить в". cout — объект, связанный со стандартным выводом программы, как правило, это терминал. Для того, чтобы перейти при печати на новую строку необходимо поместить в cout стандартный объект endl.
Текстовые строки при выводе на экран необходимо заключать в двойные кавычки. Если хочется вывести на экран несколько объектов (переменных, текстовых строк и т.д.), то их нужно разделять между собой оператором ‘<<’.
Для того, чтобы считать значение переменной нужно использовать объект ‘cin’ и оператор ‘>>’, который надо называть "Извлечь из". При этом считывание данных будет производиться со стандартного ввода программы, как правило, являющегося клавиатурой. Если хочется за одну операцию считать несколько переменных, то их идентификаторы нужно разделять между собой оператором ‘>>’.
Обобщим все изложенное выше в более сложной программе, которая находит сумму двух введенных чисел.
#include <iostream>
using namespace std;
int main()
{
int a,b,s;
cout<<"Введите два числа: ";
cin>>a>>b;
s=a+b;
cout<<a<<"+"<<b<<"="<<s<<endl;
return 0;
} Смотри ещё Чтение ввода с клавиатуры
int a = 13/5;
int b = 13%5;
int c = 13.0/5;
double d = 13/5;
double e = 13%5;
double f = 13.0/5;
double g = 13/5 + 2/5;
double h = 13.0/5 + 2.0/5;
int i = 13.0/5 + 2.0/5;
Смотри точнее Учебник по C++ для начинающих, Программирование на языке С, Самоучитель C++ Герберт Шилдт
Много полезной информации на сайте cplusplus.com
Файловый ввод-вывод желательно пройти самостоятельно!!!!
Темы желательные для изучения:
1. Введение в язык Си
|
||
2. Структура программы
|
||
3. Операции
|
||
4. Операторы
|
||
5. Препроцессор
|
||
6. Массивы
|
||
7. Функции
|
||
8. Классы памяти
|
||
9. Структуры
|
||
10. Файлы
|
||