Лекция 2. Основные операции языка С++. Консольный ввод и вывод. Массивы. Условный оператор, оператор множественного выбора. Циклы.
ОСНОВНЫЕ ОПЕРАЦИИ ЯЗЫКА С++
Арифметические операции.
К арифметическим операциям относятся умножение ( * ), деление ( / ), вычисление остатка от деления (или взятие по модулю, %), сложение ( + ) и вычитание ( - ). Операция взятия остатка от деления применяется только к целочисленным операндам и даёт остаток от деления первого операнда на второй. Что касается операции деления, то следует помнить, что в С++ если оба её операнда являются целыми, то и результат также будет целым, равный частному от деления с остатком первого операнда на второй.
Операция приведения типа.
Операция приведения типа заключается в преобразовании данных одного типа в данные другого типа. Приведение типов данных может происходить как принудительно, так и автоматически. Вот пример автоматического приведения вещественного типа к целому и наоборот:
int p1;
double p2=3.84;
p1=p2; // p1 получит значение 3
p2=p1; // p2 получит значение 3.0
Возможно и принудительное приведение типа, которое может применяться к любому операнду в выражении, например, приведение некоторой переменной к типу int будет выглядеть так:
int p1;
double p2=3.84;
p1=(int)(p2+0.5); // Округление p2. p1 получит значение 4.
Следует помнить, что операция приведения типа может работать двояким образом. Во-первых, она может производить действительное преобразование данных, как это происходит при приведении целого типа к вещественному (получаются данные, физически отличные от исходных). Во вторых, операция может никак не воздействовать на имеющиеся данные, а только изменять их интерпретацию, например, при приведении целых знаковых типов к беззнаковым.
Кроме того, если в арифметическом выражении участвуют знаковый и беззнаковый целочисленные типы, то автоматически знаковый операнд приводится к беззнаковому, результат тоже будет беззнаковым. Во избежание ошибок нужно при необходимости применять операцию приведения, явно преобразуя тот или иной операнд. Следует также помнить, что приведение типов в выражениях выполняется последовательно для каждой пары операндов.
Операции инкремента ( ++ ) и декремента ( -- ). Соответственно увеличивают или уменьшают свой операнд на единицу. Пример:
int i, j;
i=1;
j=5;
i++; // Эквивалентно i=i+1;
j--; // Эквивалентно j=j-1;
Эти операции могут использоваться и в выражениях:
int i, j;
i=1;
j=5;
i=i+(--j); // i получит значение 5, j получит значение 4;
Инкремент и декремент могут реализовываться в двух формах – префиксной (--i, ++j) и постфиксной (i--, j++). Префиксные операции выполняются перед тем, как будет производится оценка всего выражения, постфиксные операции выполняются после того, как произведена оценка выражения, в которое они входят.
МАССИВЫ
Массивом называется совокупность однотипных переменных (элементов массива), объединённых под одним именем и различающихся своими индексами. Массив объявляется подобно переменной, но после имени массива указывается число его элементов в квадратных скобках:
double mymatrix[3][3];
int myarray[10];
Массив, как и переменную, можно инициализировать при объявлении:
int myarray[10]={0,1,2,3,4,5,6,7,8,9};
Обращение к элементам массива производится путём указания индекса элемента в квадратных скобках:
myarray[3]=30;
Индекс должен быть целым выражением в пределах допустимого диапазона. Индексация массивов в С++ всегда начинается с 0, поэтому если массив состоит из N элементов, то его индекс может принимать значения от 0 до N-1.
КОНСОЛЬНЫЙ ВВОД И ВЫВОД В С++
Консольный вывод в С++ осуществляется с помощью функции printf( ). В качестве аргументов ей передаются строка формата и переменные. При этом строка формата может содержать спецификаторы преобразования, в соответствии с которыми и форматируются переменные. Полную информацию о спецификациях функции printf( ) можно почерпнуть в справочной системе Builder (см также пример программы к лекции 2). Наиболее часто употребляемые спецификаторы типа переменной:
%d – переменная целого типа;
%f – переменная типа float или double;
%Lf – переменная типа long double;
%c – переменная типа char, хранящая символ;
%s – переменная типа указатель на char, хранящая строку;
%3.5f - пример задания количества знаков до и после запятой для вывода значения вещественной переменной.
Консольный ввод строки в С++ осуществляется с помощью функции gets( ), которая помещает введённую с клавиатуры строку в массив-буфер, заданный параметром, например:
char s[80];
gets(s);
Буфером, в который помещается введённая строка, является здесь символьный массив s. Для преобразования строк, содержащих представление чисел, в символьные типы данных могут применяться функции atoi( ) и atof( ). Они преобразуют строки соответственно в целые (int) и вещественные (double) числа. Входная строка может содержать начальные пробелы. Первый встреченный символ, который не может входить в число, завершает преобразование. Прототипы этих функций находятся в файле stdlib.h. В С++ есть также «обратная» функция sprintf( ), работающая аналогично printf( ), но выводящая строку не на консоль, а в указанный буфер:
sprintf(s, “String, which input to buffer s”);
Размер буфера s должен быть достаточным для размещения строки.
Несколько слов о представлении строк в С++. Строки в С++ (они ещё называются нуль-терминальными строками) кодируются последовательностью символов, при этом признаком конца строки является код 0 (терминальный ноль). Пример:
char s[80];
s[0]=’a’;
s[1]=’b’;
s[2]=’c’;
s[3]=0;
s[4]=’e’;
printf(“%s”, s);
На консоль будет выдано abc
УСЛОВНЫЙ ОПЕРАТОР if … else
Условный оператор реализует структуру выбора. Он имеет следующий вид:
if (условие) оператор1 else оператор2
Если условие оценивается как истинное (не равное 0), выполняется оператор1, если как ложное (равное 0), выполняется оператор2. Пример:
if (a>b)
max_ab=a;
else
max_ab=b;
Вместо одиночного оператора можно поставить блок из нескольких операторов, заключённый в фигурные скобки:
if (условие)
{операторы блока if}
else
{операторы блока else}
Ключевое слово else и соответствующий ему блок операторов могут отсутствовать. Можно также строить вложенные структуры if … else.
Технологией программирования рекомендуется всегда применять фигурные скобки в условном операторе, даже если они содержат всего один оператор.
Условие оператора if может быть сколь угодно сложным выражением. Оно считается ложным, если его значение равно 0, и истинным, если значение не равно 0. Несколько примеров условий с пояснениями:
if (x) // Если х не равно 0
if (!x) // Если х равно 0 (в языке С++ операция ! означает отрицание)
if (c==a) // Если c равно a (операция == означает отношение равенства)
if (b!=c) // Если b не равно с (операция != означает отношение неравенства)
if (a>=b && a<=c) // Если а лежит между b и с (операция && означает логическое and)
if (a!=b || a!=c) // Если a не равно b или с (операция || означает логическое or).
ОПЕРАТОР ВЫБОРА switch
Иногда возникают ситуации, когда некоторая переменная может принимать несколько возможных значений-вариантов, и для каждого варианта требуется выполнить какие-то свои действия. Для подобных случаев в С++ существует специальная конструкция выбора switch. Выглядит она так:
switch (выражение)
{
case константное выражение1: группа операторов1
case константное выражение2: группа операторов2
…
[default: группа операторов]
}
Сначала производится оценка выражения в операторе switch; полученное значение последовательно сравнивается с каждым из константных выражений, и при совпадении значений управление передаётся на соответствующую группу операторов. Если значение выражения не подходит ни под один из вариантов, управление передаётся на группу операторов с меткой default или на следующий после блока switch оператор, если группа default отсутствует.
Пример:
int i;
//-------------
Блок, в котором переменная i получает некоторое значение
//-------------
switch (i)
{
case 0: printf(“i is false”); break; // если i=0
case 1: printf(“i is true”); break; // если i=1
default: printf(“i is true but not 1”); // если i не 0 и не 1
}
ОПЕРАТОР goto
Исполнение оператора goto приводит к передаче управления на метку, указанную в операторе. Пример:
loop1:
goto loop1;
Технологией программирования применение оператора goto не рекомендуется, кроме как в случае необходимости обеспечить быстрый выход из глубоко вложенного цикла.
ЦИКЛЫ
В языке С++ структуры многократного повторения реализуются тремя разновидностями операторов цикла: while, do … while и for.
Цикл while
Синтаксис оператора while выглядит так:
while (условие продолжения) оператор
Сначала оценивается условие продолжения. Если оно истинно, выполняется оператор, после чего управление возвращается заголовку цикла и всё повторяется снова. Когда условие оказывается ложным, выполнение цикла прекращается и управление передаётся следующему после цикла оператору. Пример:
int j=0;
while (j<=5)
{
j=j+1;
printf(“j=%d \n”, j); // На консоль выводится значение j, пока j не станет больше 5
}
Следует обратить внимание, что в цикле while проверка условия делается перед выполнением тела цикла. Если условие изначально ложно, то тело цикла не исполняется ни одного раза.
Цикл do … while
Этот цикл имеет следующий вид:
do оператор while (условие продолжения);
Здесь сначала выполняется оператор, а затем производится проверка условия продолжения. Если условие истинно, управление возвращается на начало цикла, если ложно, цикл завершается. Отличие от предыдущей конструкции состоит в том, что тело цикла do .. while исполняется хотя бы один раз вне зависимости от каких либо условий.
Цикл for
Цикл for выглядит так:
for ([инициализация]; [условие]; [модификация]) оператор
Прежде всего выполняется инициализация цикла; секция инициализации может содержать любое выражение. Инициализация производится только один раз перед началом работы цикла.
Затем оценивается выражение условия. Если оно истинно, выполняется оператор цикла, если ложно, происходит выход из цикла.
После исполнения цикла производится модификация, после неё управление возвращается заголовку цикла. Обычно в секции модификации изменяют значение управляющих переменных цикла.
Простейшей и самой востребованной конструкцией на основе цикла for является цикл с управляющей переменной счётчиком:
int i, k;
k=10;
for(i=0; i
{
}
В данном случае счётчик инициализируется значением i=0. В начале каждого прохода цикла проверяется, не достиг ли он значения k=10. Как только i станет равным k, выполнение цикла прекращается. Таким образом, тело цикла выполняется для значений i от 0 до k-1, то есть ровно k раз.
ОПЕРАТОРЫ ПРЕРЫВАНИЯ ЦИКЛОВ
Часто бывает необходимым досрочно прервать некоторый цикл, до того, как условие его продолжения станет ложным. Для досрочного завершения циклов в С++ применяются операторы break и continue.
Оператор break вызывает прерывание ближайшего (самого внутреннего) заключающего его блока switch, while, do … while или for.
Оператор continue воздействует только на блоки циклов. Он передаёт управление в конец тела цикла, пропуская, таким образом, следующие за ним операторы, досрочно завершая не сам цикл, а его текущую итерацию.
Пример:
char s[80];
int i;
//--------------------------
блок, в котором задаётся массив s
//--------------------------
i=0;
while (s[i]!=0 && i<80)
{
printf(“This is the letter %c”, s[i];
if (s[i]==’q’)
{
printf(“Quit the process”);
break;
}
i=i+1;
}
Данная программа будет последовательно выдавать символы, содержащиеся в массиве s, пока не встретиться терминальный 0 или символ ‘q’.
ЗАДАНИЕ К ЛЕКЦИИ 2
Ввести с консоли строку символов произвольной длины (до 80 символов). Поменять в ней все маленькие символы ‘a’ и ‘b’ на заглавные и вывести на консоль полученную строку.
Объявить массив данных типа int размером 3 на 3. Ввести с консоли его значения, вывести на консоль сумму его элементов, расположенных на главной диагонали и сумму элементов, расположенных на побочной диагонали. Проверить, является ли матрица «магическим квадратом» (в «магическом квадрате» суммы элементов по вертикали, горизонтали и диагонали равны).
Достарыңызбен бөлісу: |