Вы находитесь на странице: 1из 36

Условный оператор.

Оператор выбора.
Циклы.
Практическое занятие
Задачи на линейные алгоритмы.
Решение задач
• Задача1. Определить цифры трехзначного числа.
• Ввод: n (заданное трехзначное число)
• Вывод: a, b, c (число сотен, десятков и единиц числа)
• Тесты к задаче

• № Ввод Вывод
• 1 456 4 5 6
• 2 106 1 0 6
• 3 543 5 4 3
Код программы
• #include <iostream>

• using namespace std;

• int main()

• { setlocale(0, "");

• short n, a, b, c;

• cin >> n;

• c = n % 10;

• a = n / 100;

• b = (n / 10) % 10;

• cout << a << " " << b << " " << c;

• return 0;

• }
Решение задач
• Задача2. С начала суток прошло n секунд ( n- целое). Найти количество полных
часов, прошедших с начала суток.
• Тесты к задаче

• № Ввод Вывод
• 1 12547 3
• 2 3601 1
• 3 256 0
Код программы
• using namespace std;
• int main()
• { int n, h;
• cin >> n;
• h = n / 3600;
• cout << h;
• return 0;
• }
Решение задач
• Задача3. Дни недели пронумерованы следующим образом: 0 - воскресенье, 1 -
понедельник, 2 - вторник,..., 6 - суббота. Дано целое число K, лежащее в
диапазоне 1 - 365. Определить номер дня недели для К-го дня года, если известно,
что в этом году 1 января было четвергом.
• Тесты к задаче

• № Ввод Вывод
• 1 11 0
• 2 365 4
• 3 128 5
Код программы
• #include <iostream>
• using namespace std;
• int main()
• {
• short k, d;
• cin >> k;
• d = (k % 7 + 3) % 7;
• cout << d;
• return 0;
• }
Самостоятельно
• 1. Дано трехзначное число. Определить сумму и произведение цифр числа;
• 2. Дни недели пронумерованы следующим образом: 0 - воскресенье, 1 -
понедельник, 2 - вторник,..., 6 - суббота. Дано целое число K, лежащее в
диапазоне 1 - 365. Определить номер дня недели для К-го дня года, если известно,
что в этом году 1 января было пятницей.
• 3. Даны катеты прямоугольного треугольника a и b. Найти его гипотенузу c и
периметр P:

Задачи на разветвляющиеся алгоритмы

• Задание 4. Вывести на экран большее из двух данных чисел.


• Ввод: x, y - два числа (числа не равны)
Вывод: большее из данных чисел

#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
if (a > b)
cout << a;
else
cout << b;
return 0;
}
Решение задач
• Задача 5. Определить принадлежит ли заданное число х отрезку [a; b].
• Ввод: a, b, х
#include <iostream>
Вывод: текст "yes" или "no"
using namespace std;

int main()
{
int a, b, x;
cin >> a >> b;
cin >> x;
if (a <= x && x <= b)
cout << "yes\n";
else
cout << "no\n";

return 0;
}
Решение задач
• Задача 6. Даны положительные числа a, b, c, y. Выяснить, пройдет ли кирпич с
ребрами a, b, c в прямоугольное отверстие со сторонами х,y. Просовывать кирпич
в отверстие можно только так, чтобы каждое из его ребер было параллельно или
перпендикулярно каждой из сторон отверстия.
#include <iostream>
using namespace std;
int main()
{
int a, b, c,x,y;
cin >> a >> b >>c;
cin >> x >> y;
if ((a<=x && b<=y) ||(b<=x && a<=y) || (a<=x && c<=y) || (c<=x && a<=y) || (c<=x && b<=y) || (b<=x && c<=y))
cout << "yes\n";
else
cout << "no\n";
return 0;
}
Самостоятельно
• 1. Составьте программу, определяющую, является ли число А делителем
числа В.
• 2. Составьте программу, заменяющую меньшее из двух данных чисел
суммой, а большее - произведением этих чисел (числа не равны).
• 3. Составьте программу, выводящую на экран квадраты чисел от 10 до 20
включительно.
Оператор выбора
• Оператор switch имеет следующий формат:

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


• {
• case метка1 : оператор1;
• case метка2 : оператор2;
• case метка3 : оператор3;
• ...
• default : операторN;
• }
Пример 1. 
Ввести номер дня недели, в зависимости от номера вывести название «Monday», «Tuesday» и т.д, если введен
номер больше 7  или меньше 0 – вывести «mistake»

#include <iostream> 
using namespace std;
 
int main()
  {
    int n;
    cin >> n;
    switch  (n)
  {
     case 1 : cout << "Monday";      break;
     case 2 : cout << "Tuesday";      break;
     case 3 : cout << "Wednesday"; break;
     case 4 : cout << "Thursday";    break;
     case 5 : cout << "Friday";         break;
     case 6 : cout << "Saturday";     break;
     case 7 : cout << "Sunday";        break;
     default : cout << "mistake";
  }
    
    return 0;
  }
Составить программу, которая по
#include <iostream>
using namespace std;
int main(){
номеру месяца #include
setlocale(0,"");
int N;
определяла
<iostream>
время года.
cout<<"Введите месяц: "; using namespace std;
cin>>N; int main(){
switch(N){ setlocale(0,"");
case 1:{cout<<"Это зима!";break;} int N;
case 2:{cout<<"Это зима!";break;} cout<<"Введите месяц: ";
case 3:{cout<<"Это весна!";break;} cin>>N;
case 4:{cout<<"Это весна!";break;} switch(N){
case 5:{cout<<"Это весна!";break;} case 1: case 2: case 12: cout<<"Это зима!"; break;
case 6:{cout<<"Это лето!";break;} case 3: case 4: case 5: cout<<"Это весна!"; break;
case 7:{cout<<"Это лето!";break;} case 6: case 7: case 8: cout<<"Это лето!"; break;
case 8:{cout<<"Это лето!";break;} case 9: case 10: case 11: cout<<"Это осень!"; break;
case 9:{cout<<"Это осень!";break;} }
case 10:{cout<<"Это осень!";break;} system("pause>>void");
case 11:{cout<<"Это осень!";break;} }
case 12:{cout<<"Это зима!";break;}
}
system("pause>>void");
}
#include <iostream>
using namespace std;

int main()
{
int n;
cin >> n;
if (n <= 0 || n > 12)
cout << "mistake";
else if ( 3 <= n && n <= 5)
cout << "spring";
else if ( 6 <= n && n <= 8)
cout << "summer";
else if ( 9 <= n && n <= 11)
cout << "autumn";
else cout << "winter";

return 0;
}
Циклы
• Оператор for
• Вид оператора for:

for (инициализация; проверочное выражение; обновляющее выражение)

тело
• Например

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


  cout << "I learn  C++ \n";

Замечание:
i++ - это увеличение переменной i на 1, аналогично i-- - уменьшение переменной i на 1.

После выполнения этого оператора на экране мы увидим 4 строки "I learn C++".

I learn  C++           // i = 0, проверяется условие 0 < 4 (true)


I learn  C++           // i = 1, проверяется условие 1 < 4 (true)
I learn  C++          //  i = 2, проверяется условие 2 < 4 (true)
I learn  C++          //  i = 3, проверяется условие 3 < 4 (true)
                           //  i = 4, проверяется условие 4 < 4 (false)
for (int i = 5; i > 0; i = i - 2)
  cout << "i =" << i << "\n";

?
Комбинация операций присваивания

x  +=  y   // присваивает переменной х значение  х + у (аналог х = х + у)


x  -=  y   // присваивает переменной х значение  х - у  (аналог х = х - у)
x  *=  y   // присваивает переменной х значение  х * у (аналог х = х * у)
x  /=  y   // присваивает переменной х значение  х / у (аналог х = х / у)
x  %=  y   // присваивает переменной х значение  х % у (аналог х = х % у)
Дано целое число N (> 0). Найти сумму  
 1 + 1/2 + 1/3 + … + 1/N.
• #include <iostream>
• using namespace std;
• int main()
• {int N;
• cin >> N;
• double sum = 0;
• for(int i = 1; i < N; ++i)
• {
• sum += 1.0 / i;
• }
• cout << sum;
• }
n i r m
 Дано натуральное число n (n<9999). 1552 0 1552
Определить, является ли оно палиндромом
(«перевертышем»), 1 10*0+1552 % 10 = 2 1552 / 10 =
с учетом четырех цифр. Например, палиндромами 155
являются числа: 2222, 6116, 0440. 2 10*2+155 % 10 = 25 155 / 10 =
15
Анализ: 3 10*25+15 % 10 = 255 15 / 10 = 1
У нас четырехзначное число, поэтому переменная
оператора for изменяется от 1 до 4.  4 10*255+1% 10 1 /10 = 0
• В переменной с именем m будем хранить = 2551
«остаток» числа, в первоначальный момент
времени он равен введенному числу.
• В переменной с именем r формируем значение
числа — «перевертыша».

Основными операциями являются: r =10*r + m  % 10


(добавление очередной цифры к числу
«перевертышу») и m =m  / 10 (изменение
проверяемого числа).
#include <iostream>
#include <string>
using namespace std;

int main()
{
int n, m, r, i;
cin >> n;
m = n;
r=0;
for (i = 1; i <= 4; i++)
{
r = r * 10 + m % 10;
m = m / 10;
}
if (r == n)
cout << "yes";
else cout << "no";

return 0;
}
Цикл с предусловием while

• while (проверочное условие) 


     тело;

• !!!Если условие всегда оказывается истинным, то может произойти


зацикливание:
while (10>0)  
  cout << 10;
По данному числу N распечатайте все целые степени двойки, не
превосходящие N, в порядке возрастания. Операцией возведения в степень
пользоваться нельзя!

•int n;
•  cin >> n;
• 
•  int pow2 = 1;
•  while (pow2 <= n)
•  {
•    cout << pow2 <<' ';
•    pow2 *=2;
Исполнитель “Раздвоитель” преобразует натуральные числа. У него есть две команды: “Вычесть 1” и
“Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза,
если оно чётное, иначе происходит ошибка.
Дано два натуральных числа A и B (A>B). Напишите алгоритм для Раздвоителя, который преобразует
число A в число B и при этом содержит минимальное число команд. Команды алгоритма нужно выводить
по одной в строке, первая команда обозначается, как -1, вторая команда как :2.

int a, b;
1. 

2.  cin >> a >> b;


3. 
4.  while (a > b)
5.  {
6.    if (a % 2 == 0 && a / 2 >= b)
7.    {
8.      cout << ":2" << endl;
9.        a /= 2;
10.    }
11.    else
12.    {
13.      cout << -1 << endl;
14.      a--;
15.    }
16.  }
Массивы
Массив - это структура данных, которая содержит множество значений, которые относятся к
одному типу.

Например, массив может содержать годовые отметки по математике двадцати пяти учеников
класса. Так как годовая отметка - это целое число, то тип значений элементов массива short.
Также массив - это среднесуточная температура 30 дней апреля. Температура - это не всегда целое
число, поэтому тип значения элементов массива float.
Каждое значение сохраняется в отдельном элементе
массива и хранится в памяти последовательно друг за
другом. Каждый элемент массива имеет номер и значение.
Нумерация массивов в C++ начинается с нуля.

Индекс 0 1 2 3 4 5 6
(номер)
Значение 25 48 -8 0 12 4 58
элемента

Данный массив содержит 7 элементов.


Третий элемент массива имеет значение (равен) 0, пятый
элемент массива имеет значение 4.
Объявление массива
При объявлении массива мы должны описать три аспекта:
тип значений элементов массива;
имя массива;
количество элементов массива.

имя_типа имя_массива [размер_массива];

Например:
short marks [25];
float month [12]; Обратите внимание, что первый элемент массива имеет
индекс 0, а последний элемент на 1 меньше, чем его
размер.

marks[0] - первый элемент массива, marks[24] - последний


элемент массива. month[0] - первый элемент массива,
month[11] - последний элемент массива. 
Пример 1. Необходимо найти сумму 5 целых чисел.
Напишем программу без использования массива.

#include <iostream>
using namespace std;

int main()
{
float a, b, c, d, e, s;
cin >> a >> b >> c >> d >> e;
s = a + b + c + d + e;
cout << s;

return 0;
}
А если требуется найти сумму 30 целых чисел?

Решение по аналогии требует введения 30 однотипных переменных. При увеличении


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

Для работы с массивами используют цикл (чаще for), тогда возникает обобщенное имя
элементов массива a[i], где i должно изменяться согласно диапазону индексов элементов.
Формирование массива

• 1 способ: присваивание элементам значений

• int a[4];

• a[0] = 4;
• a[1] = -2;
• a[2] = 0;
• a[3] = -4;
Формирование массива
• 2 способ: ввод значений элементов с клавиатуры

float b[10];

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


   cin >> a[i];
• 3 способ: массив-константа
• int a [5] = {3, 5, 7, 2, -1};
• 4 способ: используя генератор случайных чисел
• Функция rand() генерирует случайное число. Необходимо подключить
• библиотеку #include <stdlib.h>
• Если мы хотим получить случайное число до 3, можно использовать
функцию остатка от деления: rand() % 3
Вывод элементов массива
На экран при работе с массивами можно выводить:

1. Массив целиком от первого до последнего элемента.

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

cout << a[i] << " "; //вывод элементов в строку через пробел

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

cout << a[i] << "\n"; //вывод элементов в столбец

2. Массив целиком в обратном порядке от последнего до первого элемента.

for (int i = n - 1; i >=0; i--)

cout << a[i] << " ";

3. Фрагмент массива (часть элементов от m-го до k-го элемента, где m,k-номера в пределах
диапазона индексов массива).

for (int i = m; i <= k; i++)

cout << a[i] << " ";


Пример 2. Сформировать массив из 15 целых чисел на
отрезке [10;50].Вывести их на экран.
#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{
short n = 15;

int a[n];

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


{
a[i] = rand () % 40 +10; //генерируем числа до 40 и прибавляем 10, тогда
получим диапазон от 10 до 50
cout << a[i] << " ";
}

return 0;
}
Экспериментальный раздел работы

• 1. Измените запись, чтобы значения элементов выводились через запятую.

• 2. Измените программу для вывода последних пяти элементов массива.

• 3. Измените программу для вывода последних пяти элементов массива в обратном


порядке.

• 4. Измените программу для вывода суммы элементов массива.

• 5. Измените программу для вывода произведения пяти первых элементов массива.


Итоговая контрольная работа
по дополнительной
общеобразовательной
программе «Олимпиадная
информатика»
Время выполнения 2 часа.