- •Е.А. Ганцева
- •Учебное пособие
- •Оглавление
- •Введение
- •Контрольные вопросы
- •2. Операции и основные типы данных
- •2.1. Операции
- •2.2. Указатели и массивы
- •2.3. Символы и строки символов
- •Контрольные вопросы
- •3. Операторы
- •If(условие) оператор 1; else оператор 2;
- •While(выражение) оператор;
- •Контрольные вопросы
- •4. Сложные типы данных
- •4.1. Составные деклараторы
- •4.2. Перечисления
- •4.3. Структуры
- •4.4. Объединения
- •4.5. Объявление tyрedef
- •4.6. Битовые поля
- •Контрольные вопросы
- •5. Функции
- •Контрольные вопросы
- •6. Организация ВводА/выводА
- •6.1. Ввод/вывод потоком
- •6.2. Функции ввода/вывода нижнего уровня
- •6.3. Функции ввода/вывода с консоли и порта
- •Контрольные вопросы
- •7. Директивы препроцессора
- •#Undef идентификатор
- •Контрольные вопросы
- •8. Видимость и время жизни переменных
- •Контрольные вопросы
- •9.1. Описание локальных переменных
- •9.2. Функциональная запись преобразования типов
- •9.3. Перегрузка функций
- •9.4. Перегрузка операторов
- •9.5. Модификаторы const и volatile
- •9.6. Доступ к глобальным переменным
- •Контрольные вопросы
- •10. Объектно–ориентированное программирование
- •10.1. Инкапсуляция
- •10.2. Классы и объекты
- •10.3. Друзья класса
- •10.4. Перегрузка операторов для классов
- •10.5. Конструкторы и деструкторы
- •10.6. Указатель this
- •10.7. Наследование
- •10.8. Доступность членов в иерархии классов
- •10.9. Виртуальные базовые классы
- •10.10. Виртуальные функции
- •Контрольные вопросы
- •11. Потоки ввода/вывода
- •11.1. Понятие потока
- •11.2. Библиотека iostream
- •11.3. Класс streambuf
- •11.4. Класс ios
- •11.5. Потоковый вывод
- •11.6. Встроенные типы
- •11.7. Манипуляторы
- •11.8. Потоковый ввод
- •11.9. Ввод типов, определенных пользователем
- •11.10. Простой ввод/вывод в файл
- •11.11. Обработка строкового потока
- •11.12. Потоки вывода на экран
- •Контрольные вопросы
- •Список использованных источников
2.3. Символы и строки символов
Для работы с отдельными символами используются описания переменных типа
char sym1, sym2, sym3, c;
В программе можно явно присвоить значение переменной типа char
sym1 = ‘A’; sym2 = ‘a’;
sym3 = ‘c‘; c = ‘0x1B’; // ASCII символ
Ввод с клавиатуры:
scanf(“%c “, &sym1); sym1 = getchar();
Вывод на экран:
рrintf (“%c”, sym1); рutchar(sym1);
Фрагмент программы, выводящей на экране вводимые с клавиатуры символы до тех пор, пока не нажата клавиша Enter.
while((c = getchar( )) != ‘\ n’ ) рutchar(с);
2.4. Esc – последовательности
Esc-последовательности - это специальные символьные комбинации, которыми представляются неграфические и пробельные символы в строковых и символьных константах. Esc - последовательность cостоит из \ и следующей сразу за ней буквы или комбинации цифр:
\n - новая строка, \t - горизонтальная табуляция,
\v – вертикальная табуляция, \b – пробел,
\а – звонок, \` - одиночная кавычка,
\” - двойная кавычка, \\ - наклонная черта влево,
\ddd - восьмеричный код ASCII, \xdd -шестнадцатиричный код ASCII,
\c - означает обычный символ с.
Контрольные вопросы
1. Какие операции можно применять к указателям?
2. Каков результат выполнения оператора c[i]=i++; ?
3. Для чего и как происходит динамическое распределение памяти?
4. Что такое Esc-последовательность?
5. Для чего используются индексные выражения?
6. Каким образом выделяется память под массивы?
7. Что общего между массивами и указателями?
8. Как располагаются в памяти элементы многомерного массива?
3. Операторы
Простейшим оператором является оператор присваивания:
double x; int y; x=y; int fl=0, cfl=1;
#define MASK 0xfff
n=MASK;
j=i++;sum+=a[i]; q=(р==0)?(р+=1):(р+=2); l=b!!c;
d=0; a=b++=c++=d++; // значение а непредсказуемо
Обращения к функциям, вложенные операции присваивания, операции увеличения и уменьшения приводят к так называемым "побочным эффектам" - некоторые переменные изменяются в результате вычисления выражений. В любом выражении, в котором возникают побочные эффекты, могут существовать очень тонкие зависимости от порядка, в котором определяются входящие в него переменные. Примером типичной неудачной ситуации является оператор A[I] = I++; Возникает вопрос, старое или новое значение I служит в качестве индекса. Компилятор может поступать разными способами и в зависимости от своей интерпретации выдавать разные результаты.
Оператор if else организует ветвление в программе:
If(условие) оператор 1; else оператор 2;
Если условие истинно, то выполняется оператор 1, иначе - оператор 2. Оператор if else допускает любое число вложений, но проверка прекращается, если встречается истинное условие. Else - условие может опускаться.
if(num!=0 && 12/num==2) cout<<“YES!”;
else cout<<“NO”;
Более простое ветвление получается с помощью оператора switch:
switch (выражение) {
case константа 1:
оператор; . . .; оператор;
break;
case константа 2:
оператор; . . .; оператор;
break;
. . . . . . . . . . .
case константа n:
оператор; . . .; оператор;
break;
default:
оператор; . . .; оператор; }
Выражение может быть только целого типа. Его значение сопоставляется со всеми находящимися внутри switch-оператора case-константами, и выполняются те операторы, для которых установлено равенство. Если равенство не установлено, то выполняются операторы с меткой default:. Оператор break передает управление за пределы оператора switch. Если break отсутствует, то после найденного совпадения будут выполняться все операторы switch.
Оператор for организует цикл:
for(выражение 1; выражение 2; выражение 3 )
оператор;
выражение 3 (приращение) вычисляется после каждого прогона цикла;
выражение 1 (инициализация) вычисляется перед началом цикла;
выражение 2 (условие) - до и после каждого прогрона цикла.
Оператор тела цикла выполняется до тех пор, пока истинно выражение 2.
Любое из выражений, или же все три, могут отсутствовать, но при этом должны сохраняться все точки с запятыми. Если выражение 2опущено, то считается, что оно всегда истинно.
Фрагмент программы вычисления суммы чисел от 0 до 9:
#include <iostream.h>
void main() {
for(int counter=0, int add_counter=0; counter<10; counter++, add_counter+=counter)
// “,” используется для последовательного вычисления нескольких операторов
cout<<“Значение counter “<<counter<<endl;
// endl означает переход на новую строку
cout<<“Значение суммы “<<add_counter<<endl; }
Для организации цикла с предусловием используется оператор while: