Условные операторы if и switch

Цель: Изучить особенности работы условных операторов if и switch.

Формат условного оператора if следующий:

if (выражение)

{оператор1; …}

else

{оператор2;…}

Условный оператор может быть представлен в неполной форме:

if (выражение)

{оператор1; …}

Если выражение «истинно» выполняется оператор1. Если оно «ложно» выполняется оператор2 или он пропускается при неполной форме условного оператора. Выражение представляет собой условие, которое может быть сложным или простым.

Примеры простых условий (операции отношения):

a<b a>b a<=b a>=b

a==b (равно) a!=b (неравно).

Результатом операции отношения является число 1, если оно истинно и 0, если ложно.

Сложные условия образуются с помощью логических операций, запишем их по приоритету, от самой сильной:

! операция отрицания, логическое НЕ,

&& конъюнкция, логическое И,

|| дизъюнкция, логическое ИЛИ.

Логические операции имеют более низкий приоритет, чем операции отношения.

Листинг 2.

# include<stdio.h>

void main()

{ int x;

printf(«Введи х \t»);

scanf(“%d”,&x);

if (x<0)

printf(«число отрицательное»);

else

printf(«число неотрицательное»);}

Если в результате выполнения или невыполнения условия используется один оператор, то фигурные скобки можно не ставить. Обратите внимание, что перед закрывающейся фигурной скобкой точку с запятой ставить обязательно, а после скобки она не ставится.

После служебного слова else можно поставить еще условный оператор.

Если программе следует совершить выбор одного варианта из множества возможных, используют оператор switch. Формат оператора следующий:

switch (переменная или целочисленное выражение)

{case константа1:операторы;

case константа2:операторы;

default:операторы;

}

Оператор последовательно проверяет на равенство значения переменной (выражения) константам, если нет совпадений, то выполняются операторы после слова default (эта строка может отсутствовать).

Если необходимо, то можно использовать оператор break (оператор выхода), для перехода программы к следующему оператору после switch.

Листинг 3.

# include<stdio.h>

void main()

{ int x;

printf(«Введи число х \t»);

scanf(“%d”,&x);

switch(x)

{case 1: printf(«введено число 1»);break;

case 2: printf(«введено число 2»);break;

default: printf(«введено другое число»); }

char x;

printf(«Введи символ х \t»);

scanf(“%c”,&x);

switch(x)

{case ‘1’: printf(«введен символ 1»);break;

case ‘2’: printf(«введен символ 2»);break;

default: printf(«введен другой символ»); }}

В примере представлено два разных варианта использования оператора switch.

Практическая работа

Написать программу вычисления в соответствии с заданным вариантом. Представлено два задания на разные виды условных операторов. Как вводить исходные переменные определите самостоятельно. Проанализировать результат работы программ.

1. Три точки на плоскости заданы своими координатами. Выяснить какие из них находятся на максимальном расстоянии друг от друга.

Установить название дня недели по его номеру.

2. Вычислить:

Условные операторы if и switch - student2.ru

Определить название месяца по его номеру.

3. Заданы три величины: а, b, c. Определить максимальное и минимальное значение из их среднего геометрического, среднего арифметического.

Определить название заданной цифры.

4. Определить в какой четверти координатной плоскости находится точка с координатами х, у.

Определить английское название заданной цифры.

5. Вычислить:

Условные операторы if и switch - student2.ru

Определить название отметки, заданной числом.

6. Вычислить:

Условные операторы if и switch - student2.ru

Установить английское название дня недели по его номеру.

7. Вычислить:

Условные операторы if и switch - student2.ru

Определить английское название месяца по его номеру.

8. Вычислить:

Условные операторы if и switch - student2.ru

Установить название цвета по его номеру, например,

0 – black, 1 – blue, 2 – green и т.д.

9. Вычислить значение функции, заданной графически, по заданному значению аргумента х

Условные операторы if и switch - student2.ru

Написать программу перевода введенного символа от a до f в верхний регистр.

10. Вычислить значение функции, заданной графически, по заданному значению аргумента х:

Условные операторы if и switch - student2.ru

Написать программу перевода введенного символа от A до F в нижний регистр.

11. Решить уравнение ах2+b=0 для любых значений коэффициентов.

Написать программу перевода введенного символа от A до F в нижний регистр, а все другие заменить буквой z.

12. Проверьте, делится ли выбранное число на 5, на 11 или 13.

Написать программу перевода введенного символа от a до f в верхний регистр, а все другие заменить буквой Z.

13. Определить попадет ли точка с координатами (х, у) в кольцо с внутренним радиусом R1 и внешним радиусом R2 с центром в начале координат.

Установить английское название дня недели по его номеру, иначе сообщить об отсутствии соответствующего дня.

14. Вычислить:

Условные операторы if и switch - student2.ru

Написать программу перевода введенного символа от A до F в соответствующий порядковый номер, а все другие заменить буквой z.

Контрольные вопросы

1. Используя условный оператор, выполните проверку на принадлежность значения переменной интервалу от 1 до 29.

2. Когда необходимо использовать оператор switch?

3. Используя условный оператор, выполните проверку на не принадлежность значения переменной интервалу от 1 до 29.

Лабораторная работа № 4

Операторы циклов

Цель: Изучить особенности работы операторов цикла while, for и do while.

Операторы циклов позволяют выполнять одно и тоже действие, до тех пор, пока истинно условие цикла. Необходимо продумать начальные значения переменных цикла, условие цикла, шаг или изменение значения переменных цикла.

Формат оператора цикла:

while (условие)

{тело цикла}

Пример цикла, где находится сумма элементов ряда:

int i=0; N=20; S=0;

while (i<N) //если условие истинно выполняется тело цикла

{S+=i; //суммирование переменной i

i++;} //увеличение значения переменной i на 1

Пример цикла, который будет работать, пока пользователь вводит целочисленные значения и останавливается, если введена буква или вещественное число:

int x;

while (scanf(“%d”,&x)==1)

{printf(«ввели значение %d\n»,x);}

Цикл while можно принудительно завершить даже при истинном условии, с помощью оператора break. Если выполнение очередного шага цикла необходимо завершить до конца цикла, используется оператор continue.

Формат оператора цикла for:

for(начальные значения; условие; шаг)

{ тело цикла}

Пример использования цикла, где для введенного символа определяется значение его кода ASCII:

char s;

for(s=’a’;s<=’z’;s++)

printf (“%c=%d\n”. s, s);

Пример цикла для вычисления факториала числа N:

for (f=1, i=1; i<=N; i++)

f*=i;

Вывод на экран всех четных чисел в диапазоне от 0 до 100:

for (i=0; i<=100; i++)

{if (i%2) continue;

cout<<”\t”<<i;}

Представленные выше операторы проверяют условия до выполнения цикла, поэтому возможно, что операторы цикла никогда не будут выполнены.

Следующая конструкция позволяет выполнять проверку условия после выполнения операторов цикла.

Пример цикла do…while, который работает до тех пор, пока пользователь не введет 0:

int x;

do

{ printf (“”);

scanf(“%d”,&x);}

while (x!=0); }

Все приведенные операторы позволяют использование других операторов внутри и могут включать составные условия.

Пример вычисления суммы двойного ряда:

long S=0; //целочисленный тип данных с расширенным //диапазоном значений

int i=0, j=0;

for (; i<=10; i++)

{ for (; j<=5; j++)

S+=i*j;

}

Получение на экране таблицы умножения:

int x, y;

for (x=2; x<=9; x++)

for (y=2; y<=9; y++)

cout<<”\n”<<x<<”*”<<y<<”=”<<x*y;

Практическая работа

Написать программу вычисления в соответствии с заданным вариантом. Как вводить исходные переменные и их тип определите самостоятельно. Для нахождения остатка от деления используйте операцию % (например, значение 5%2 равно 1). Используйте разные конструкции циклов. Проанализировать результат работы программы.

1. Найти все трехзначные числа, равные сумме кубов своих цифр.

2. Найти все двузначные числа, сумма цифр которых не меняется при умножении числа на 2, 3, 4, 5, 6, 7, 8, 9.

3. Найти все трехзначные числа, сумма цифр которых равна данному целому числу.

4. Найти все трехзначные числа, квадраты которых оканчиваются тремя одинаковыми цифрами, отличными от нуля.

5. В магазине имеется мастика в ящиках по 16 кг, 17 кг и 21 кг. Получить 185 кг мастики без вскрытия ящиков. Рассмотреть все варианты.

6. Представить в записи 42*4* вместо звездочек такие цифры, чтобы полученное пятизначное число делилось на 72.

7. Найти все трехзначные числа кратные 7 и сумма цифр которых тоже кратна 7.

8. Найти четырехзначное число, которое при делении на 133 дает в остатке 125, а при делении на 134 дает в остатке 111.

9. Решить арифметический ребус КИО*ИО= ТОКИО. Вместо каждой буквы необходимо поставить некоторую цифру, причем одинаковые буквы означают одинаковые цифры, а различные буквы – различные цифры.

10. Сократить дробь, имеющую данные числитель а и знаменатель b. Предусмотреть выделение целой части в случае a > b.

11. Определить сколько делителей и какие имеет данное натуральное число.

12. Найти сумму делителей данного натурального числа.

13. Найти все «пифагоровы» тройки натуральных чисел, наибольшее из которых не превосходит N (Тройка натуральных чисел называется пифагоровой, если сумма квадратов двух из них равна квадрату третьего).

14. Найти все четырехзначные числа, у которых сумма первых двух цифр равна сумме двух последних.

Контрольные вопросы

1. В чем отличия между операторами while и do… while?

2. Условие остановки циклов.

3. Для каких целей используются циклы?

Лабораторная работа № 5

Массивы

Цель: Изучить особенности работы с одномерными и двумерными массивами.

Массив – структура однотипных элементов, занимающих непрерывную область памяти. Одномерные массивы ассоциируют с вектором, двумерные с матрицей.

Свойства массива: имя, тип, размерность, размер.

Пример:

int A[5]; //одномерный массив А из 5 целочисленных элементов

float X[3][4]; // двумерный массив Х из 3х4 элементов.

Листинг 4.

#include<stdio.h>

void main()

{ double k=0.5, b=4, f[10];

for (int x=0; x<10; x++ )

{ f[x]=k*x+b;

printf(“%.0f \t %.2f\n”, x, f[x]);}}

При объявлении массива используют квадратные скобки. Обращение к элементу массива происходит по номеру его индекса. Размер массива можно задавать только константами. Первый элемент массива всегда имеет нулевой индекс. Нельзя определять произвольные диапазоны для индексов.

В двумерном массиве на первой позиции количество строк, на второй – столбцов. Нумерация элементов строк и столбцов начинается с нуля.

Листинг 5.

#include<iostream.h>

#include<iomanip.h>//для работы функции setw(n)

#include<stdlib.h>/*для работы с функциями генерации случайных чисел*/

void main()

{int i, j, max, A[5][5];

randomize() //установка датчика случайных чисел

for (i=0; i<5; i++)

{ for(j=0; j<5; j++)

{A[i][j]=random(21)-10;//задается число в диапазоне [-10,10]

cout<<setw(6)<<A[i][j];//на число выделяется 6 позиций при выводе}

cout<<endl; //переход на новую строку

}

max=A[0][0];

for (i=0; i<5; i++)

for (j=0; j<5; j++)

if (A[i][j]>max) max=A[i][j];

cout<<”max=”<<max;}

Практическая работа

Написать программы в соответствии с заданным вариантом. Как вводить исходные переменные и их тип определите самостоятельно. Массивы рекомендуется заполнять случайными числами с диапазоне [-25,25]. Проанализировать результат работы программ.

1. Даны два вектора целых чисел А и В. Вычислить вектор С, который содержит нечетные элементы вектора А, которых нет в векторе В.

Вычислить и запомнить количество отрицательных элементов каждого столбца для матрицы A[5][5].

2. Расположить элементы вектора в обратном порядке. Дополнительный массив не использовать.

Задана матрица S[6][5]. Задать исходные данные S[5][4]. Вычислить среднее арифметическое значение строк и столбцов элементов и записать в 5 столбец и 6 строку.

3. Найти среднее арифметическое элементов массива х[n], исключив из них максимальное и минимальное значение.

Задана матрица V[6][5]. Упорядочить по возрастанию элементы каждой строки матрицы.

4. Вектор B[n] заменить вектором, у которого элементы образуются делением вектора В на их сумму.

Задан массив D[10][10]. Найти максимальный и минимальный элементы массива D и поменять их местами.

5. Заменить все элементы вектора x[m], стоящие до максимального, нулями.

Задана матрица А[7][8]. Вычислить и запомнить сумму и число положительных элементов каждого столбца матрицы. Результаты получить в виде двумерного массива.

6. В массиве R[k] найти минимальный элемент среди положительных и максимальный среди отрицательных.

Задана матрица B[5][5]. Вычислить сумму элементов матрицы, находящихся под главной диагональю и на ней

7. В массиве У[n] заменить все его элементы, стоящие после минимального, нулями.

Задана матрица B[5][5]. Вычислить сумму элементов матрицы, находящихся над главной диагональю.

8. Даны массив A[n] целого типа и целое число х. Найти количество элементов в массиве больших этого числа.

Вычислить сумму и запомнить количество отрицательных элементов каждого столбца матрицы.

9. Даны два вектора А и В. Сформировать вектор С, который содержит элементы, присутствующие в обоих массивах.

Задана матрица R[5][5]. Найти наибольший и наименьший элементы матрицы и поменять их местами.

10. В векторе У[m] поменять местами максимальный и минимальный элементы.

Задана квадратная матрица A[7][7]. Найти сумму диагональных элементов матрицы

11. В векторе У[m] поменять местами максимальный с первым и минимальный с последним элементы.

Задана матрица P[7][7]. Найти в каждой строке наибольший элемент и поменять его местами с элементами главной диагонали.

12. В векторе У[m] есть нулевые элементы. Создать массив из номеров этих элементов.

Вычислить сумму и число положительных элементов матрицы P[7][7], находящихся над главной диагональю.

13. Дан массив R[k]. Вывести на экран только те элементы, для которых R[i]>i.

Задана матрица P[7][7]. В каждой строке выбирается элемент с наименьшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значением.

14. Дан массив R[k]. Определить сколько раз в нем меняется знак чисел.

Задана матрица Х[7][7]. Получить транспонированную матрицу (строки поменять местами со столбцами).

Контрольные вопросы

1. В чем преимущество массивов перед переменными?

2. Как записать элемент массива?

3. Как вывести элементы массива на экран?

Лабораторная работа № 6

Строки

Цель: Изучить особенности работы со строками.

Отдельного типа данных для описания строк нет. Для ее задания используется символьный массив. На длину символьного массива нет ограничений.

Пример описания строки:

char s[100];

char st[]=”stroka”;

Существует специальный символ ‘\0’ означающий конец строки. Обработка строк обычно связана с перебором ее элементов.

Функция, определяющая длину введенной строки в библиотеке string.h это strlen(s). Учитывая, что первый символ имеет нулевой индекс, данная функция, возвращая длину строки, считает и символ ‘\0’.

Чтобы присвоить значение одной строковой переменной s2 другой s1 используется функция strcpy(s1, s2) в библиотеке string.h.

Две строки считаются одинаковыми, если равны их длины и элементы одной строки соответственно равны элементам другой строки. Чтобы сравнить две строки также есть функция strcmp(s1, s2) в библиотеке string.h, она возвращает нуль, если строки равны и не нуль иначе.

В библиотеке stdio.h существуют функции для ввода строки с клавиатуры gets(s), и вывода строки на экран puts(s).

Еще удобная функция для работы sprintf (s, «строка») библиотеки stdio.h. Строка заносится в переменную s, а не на экран.

Листинг 6.

//переворот введенной строки

#include<stdio.h>

#include <string.h>

void main()

{char c, s[10];

int i;

gets(s); //ввод строки

for (i=0; i<=(strlen(s)-1)/2; i++) //просмотр ее до середины

{ c=s[i]; //замена элементов местами

s[i]=s[strlen(s)-i-1];

s[strlen(s)-i-1]=c;}

puts(s);}//вывод перевернутой строки

Практическая работа

Написать программу в соответствии с заданным вариантом. Считать, что строка вводится пользователем, а слова разделяются пробелом или группой пробелов. Проанализировать результат работы программы.

1. Проверить, является ли строка палиндромом (т. е. читается ли она одинаково справа налево и слева направо). Пробелы игнорируются.

2. Написать программу добавления слова “hello” после первого слова введенной строки.

3. Проверить, имеется ли в заданном тексте баланс открывающихся и закрывающихся скобок.

4. В заданном предложении указать слово, в котором доля букв ‘j’ максимальна.

5. В заданном предложении найти самое короткое и самое длинное слово.

6. Для каждого символа заданного текста указать, сколько раз он встречается в тексте. Сообщение об одном символе должно печататься не более одного раза.

7. В заданном тексте удалить символ ‘,’ и подсчитать число удаленных символов.

8. Написать программу добавления пробела после каждой буквы ‘a’ введенной строки.

9. В заданном тексте заменить каждый символ ‘а’, стоящий на четном месте, на символ ‘о’.

10. Подсчитать количество слов в предложении.

11. Написать программу объединения трех строк без использования функции sprintf().

12. Подсчитать количество цифр во введенной строке.

13. Подсчитать в строке количество слов, состоящих из трех букв.

14. В строке найти слова, начинающиеся и заканчивающиеся одной и той же буквой.

Контрольные вопросы

1. Какой символ соответствует концу строки?

2. Что возвращает функция strlen()?

3. Что выполняет функция strcmp()?

Лабораторная работа № 7

Функции

Цель: Изучить особенности работы с функциями и научиться задавать свои функции.

В рассмотренных ранее примерах приходилось использовать различные функции из библиотек. Иногда при написании программ необходимо создавать свои функции.

Пример задания функции:

int f(int x, int y)

{return x*2+y*7;} //задана функция f вычисляющая x*2+y*7

Следует обратить внимание на то, что работа функции завершается при вызове оператора return. Он является обязательным, если функция возвращает какое-либо значение. Если тип у функции void, то return можно не писать.

Функция может принимать любое число аргументов, но возвращать только один или не одного (тип void). Обратите внимание, что перед каждой переменной в списке аргументов обязательно пишется тип.

Формат обращения к функции имя (список_фактических_ параметров).

Листинг 7.

#include <iostream.h>

int max (int x, int y)

{ if (x>y) return x;

else return y;

}

void main()

{ int a, b, c, d;

cin>>a>>b>>c>>d;

d=max(max(a, b), c);

cout<<”max(a, b, c)=”<<d;

}

Если количество пользовательских функций большое, можно сначала их объявлять, а потом реализовывать. Также можно использовать функции с одинаковыми именами, но разными типами входных аргументов.

Листинг 8.

//вычисляется модуль числа различного типа

#include <stdio.h>

float abs (float x);

int abs (int y);

void main()

{printf(“|x|=%f\t|y| =%d”, abs(2.1), abs(-5));}

float abs (float x)

{if (x<0) return –x;

else return x;}

int abs (int y)

{return (y<0)? -y: y;}

Здесь используется прототип функции (предварительное описание функции, в котором содержатся все необходимые сведения для правильного обращения к ней). В прототипе имена формальных параметров указывать необязательно, хотя их указание не является ошибкой. Точка с запятой в конце прототипа ставится обязательно.

Тело функции не может содержать в себе определения других функций.

Можно задавать значения у аргументов функции при инициализации, но при последующем их вводе переменные поменяют свои значения. Следует помнить, что аргументы со значениями по умолчанию должны находиться в списке аргументов последними.

Допускается чтобы функция вызывала саму себя (этот процесс называется рекурсией).

Вычисление факториала целого положительного числа:

long factor(int n)

{ if (n<0) return 0;

if (n==0) return 1;

return n*factor(n-1);

}

При обращении к функции передача значений возможна как через параметры, так и через глобальные переменные.

Листинг 9.

#include <iostream.h>

int z;

void max (int x, int y)

{ if (x>y) z=x;

else z=y;

}

void main()

{ int a, b, c;

cin>>a>>b>>c;

max(a, b);

max(z, c);

cout<<”max(a, b, c)=”<<z;

}

Практическая работа

Написать программу в соответствии с заданным вариантом. Тип функции, количество и тип ее аргументов определить самостоятельно. Проанализировать результат работы программы.

1. Вычислить число сочетаний из n по m (n>m).

2. Вычислить:

Условные операторы if и switch - student2.ru

3. Вычислить:

Условные операторы if и switch - student2.ru

4. Найти все трехзначные числа, равные сумме факториалов своих цифр.

5. Два треугольника заданы координатами своих вершин. Вычислить площади треугольников с помощью формулы Герона и определить, какой треугольник имеет большую площадь.

6. Решить уравнение ax+b=0. Значения k, l, m вводятся.

Условные операторы if и switch - student2.ru

7. Даны действительные числа s, t. Вычислить:

Условные операторы if и switch - student2.ru Условные операторы if и switch - student2.ru

8. Найти наибольший общий делитель целых положительных чисел a, b, c.

9. Даны действительные числа х, у. Вычислить:

Условные операторы if и switch - student2.ru Условные операторы if и switch - student2.ru

10. Решить уравнение ax+b=0. Значения k, l, m вводятся.

Условные операторы if и switch - student2.ru

11. Вычислить число сочетаний с повторениями.

12. Вычислить:

Условные операторы if и switch - student2.ru

13. Вычислить:

Условные операторы if и switch - student2.ru

14. Вычислить:

Условные операторы if и switch - student2.ru

Контрольные вопросы

1. Напишите функцию возведения числа в квадрат.

2. Приведите пример функции с тремя аргументами.

3. Дано число. Написать функцию нахождения суммы его цифр.

Лабораторная работа № 8

Структуры

Цель: Изучить особенности, синтаксис и правила работы со структурами.

Структура – это форма представления данных, содержащая разные типы данных или другие структуры. Тип структура используется при разработке баз данных, информационных систем.

Пример структуры книги, содержащей три поля:

struct book

{char title[15];

сhar autor[15];

int god;

};

В конце обязательно ставится точка с запятой – это оператор.

Описание структуры задает тип данных, а не элемент. Для задания элемента используют запись

struct book x;// х переменная структурного типа

Обращение к полю структуры происходит с помощью уточненного имени (через точку): x.title, x.autor, x.god.

Допускается использование массивов структур.

Листинг10.

#include <stdio.h>

struct book

{char title[15];

char autor[15];

int god;

};

void main()

{book x[5]; // массив из 5 записей, каждая содержит 3 поля

for (int i=0; i<5; i++)

{scanf(“%s”, &x[i].title);

gets(x[i].autor);

scanf(“%d”,&x[i].god);}

}

Структуры и массивы структур можно передавать функции в качестве аргумента.

Практическая работа

Написать программу в соответствии с заданным вариантом. Количество полей структуры, их тип и название определить самостоятельно. Заполнять структуру лучше вводом с клавиатуры. Проанализировать результат работы программы.

1. Написать программу поиска книги по году издания в массиве структур.

2. Написать программу удаления книги из массива структур с введенным именем автора.

3. Написать программу поиска студентов, фамилии которых начинаются на введенную букву.

4. Написать программу сортировки книг в массиве структур по убыванию года издания.

5. Написать программу добавления новой книги в начало массива структур.

6. Написать программу поиска сотрудника с указанным именем в массиве структур.

7. Написать программу сортировки студентов по количеству пропусков.

8. Написать программу удаления информации о сотруднике с указанным табельным номером.

9. Написать программу сортировки книг по возрастанию их цен.

10. Написать программу удаления учреждения по введенному названию из массива структур.

11. Написать программу поиска сотрудников, зарплата которых ниже средней по предприятию.

12. Написать программу назначения стипендии студентам, зная результаты сессии.

13. Написать программу поиска сотрудников с одинаковыми именами и отчествами.

14. Написать программу поиска товара в магазине с указанным ценовым интервалом.

Контрольные вопросы

1. Как задаются переменные структуры?

2. Можно передать функции массив структур и как?

Лабораторная работа № 9

Наши рекомендации