Презентация, доклад на тему Ликбез для подготовки учащихся к работе с системами проверки олимпиадных задач (Язык C++). Занятие №1. Ввод/вывод данных. Арифметика.

Содержание

1. Ввод/вывод (консоль)#include using namespace std;int main() { int a, b; cin >> a >> b; cout

Слайд 1#1. Простейшие задачи
Чайка К.В.
Разбор задач на C++

#1. Простейшие задачи Чайка К.В.Разбор задач на C++

Слайд 21. Ввод/вывод (консоль)
#include
using namespace std;
int main() {
int

a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
1. Ввод/вывод (консоль)#include using namespace std;int main() {   int a, b;   cin >>

Слайд 32. Ввод/вывод (файлы)
#include
using namespace std;
int main() {
// переопределяем

потоки cin, cout
ifstream cin("input.txt");
ofstream cout("output.txt");
int a, b;
cin >> a >> b; // чтение
cout << a + b << endl; // запись
return 0;
}

Слайд 43. Чтение до конца файла
Сумма чисел в файле
В текстовый файл

записано некоторое заранее не известное количество целых чисел, разделённых между собой пробелами или переводом строки.
Вывести в другой текстовый файл сумму всех этих чисел.
Входные данные
Текстовый файл input.txt содержит некоторое заранее не количество целых чисел.
Выходные данные
Текстовый файл output.txt содержит одно целое число – сумму чисел из предыдущего файла
Пример

Ввод
3 19
7 8 9
1
4 5
Вывод
56
3. Чтение до конца файла Сумма чисел в файлеВ текстовый файл записано некоторое заранее не известное количество

Слайд 54. Чтение до конца файла
#include
using namespace std;
int main() {


ifstream fin("input.txt");
ofstream fout("output.txt");
int sum = 0, x;
while(fin >> x) sum += x;
fout << sum;
}

Слайд 65. Простейшая арифметика
Счастливый турист
Как только Счастливый Гарри въезжает в свой любимый

кемпинг со всей семьей, он замечает знак: "Палаточное размещение ограничено 5 днями в течение любого 8 дневного периода. Гарри только начинает свой 20 - дневный отдых. Каково максимальное количество дней, когда Гарри может провести свой отпуск в лагере?
Сформулируем задачу в более общем виде. Пусть l, p, v (1 < l < p < v) - целые числа. Палаточное размещение ограничено l днями в течение любого p-дневного периода. Счастливый Гарри начинает свой v-дневный отдых. Какое наибольшее число дней своего отпуска Гарри сможет провести в лагере?
Входные данные
Каждый тест состоит из одной строки, содержащей числа l, p и v. Все числа являются 32-битовыми знаковыми целыми.
Выходные данные
Для каждого теста вывести в одной строке количество дней, когда Счастливый Гарри может разместиться в палатке во время своего отпуска. Следуйте формату, приведенному в примере.
Пример
№ Ввод Вывод
1 5 8 20 14
2 5 8 17 11
5. Простейшая арифметикаСчастливый туристКак только Счастливый Гарри въезжает в свой любимый кемпинг со всей семьей, он замечает

Слайд 76. Счастливый турист - решение
В общем случае задача решается формулой
days =

v%p + v/p * l
Это решение не проходит при частном случае l < v < p. Например, для l = 5, v = 8, p = 6 программа выдаст 6, что неверно – правильный ответ 5. Внесём соответствующие исправления

#include
using namespace std;
int main() {
int l, p, v, days;
cin >> l >> p >> v;
days = min(v % p, l) + v / p * l;
cout << days;
}
6. Счастливый турист - решениеВ общем случае задача решается формулойdays = v%p + v/p * lЭто решение

Слайд 87. Читабельность кода
Зарплата
В отделе работают 3 сотрудника, которые получают заработную плату

в рублях. Требуется определить: насколько зарплата самого высокооплачиваемого из них отличается от самого низкооплачиваемого.
Входные данные
В единственной строке записаны размеры зарплат всех сотрудников через пробел. Каждая заработная плата – это натуральное число, не превышающее 105.
Выходные данные
Необходимо вывести одно целое число — разницу между максимальной и минимальной зарплатой.
Примеры
№ Ввод Вывод
1 100 500 1000 900
2 36 11 20 25
7. Читабельность кодаЗарплатаВ отделе работают 3 сотрудника, которые получают заработную плату в рублях. Требуется определить: насколько зарплата

Слайд 98. Зарплата – решение с макросом
необходимо найти max(a, b, c) –

min(a, b, c)
Но шаблоны min и max в C++ предполагают использование только двух аргументов.
min(a, b, c) = min(a, min(b, c)
max(a, b, c) = max(a, max(b, c))

#include
#define F(f) f(a,f(b,c))
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
cout << F(max) - F(min);
}
8. Зарплата – решение с макросомнеобходимо найти max(a, b, c) – min(a, b, c)Но шаблоны min и

Слайд 109. Холодильник
Чтобы поднять на N-й этаж M-этажного дома новый холодильник, Витя

вызвал бригаду грузчиков. Оплата работы грузчиков производится так: за подъем холодильника на один этаж требуется заплатить 200 рублей, за спуск на один этаж — 100 рублей. За подъем и спуск на лифте плата не взимается. Несмотря на то, что в Витином доме есть лифт, ему,возможно, все же придется заплатить грузчикам, поскольку лифт останавливается только на каждом K-м этаже, начиная с первого (то есть на этажах с номерами 1, K+1, 2K+1, 3K+1, …). Требуется вычислить, какой минимальной суммы денег достаточно, чтобы грузчики доставили холодильник с первого этажа на N-й.
Входные данные
В единственной строке через пробел записаны три числа N, M, K ≤ 109.
Выходные данные
Единственное число S– необходимая минимальная сумма для доставки холодильника.
9. ХолодильникЧтобы поднять на N-й этаж M-этажного дома новый холодильник, Витя вызвал бригаду грузчиков. Оплата работы грузчиков

Слайд 1110. Холодильник – идея решения
Разобьем дом на отдельные секции по K

этажей каждая. Для заданной квартиры в секции холодильник можно поднять за сумму S1 с этажа R1 или спустить за сумму S2 с этажа R2.
Выбрать S = min(S1; S2). Для верхней группы S = S1

#include
using namespace std;
int main(){
int n, m, k;
cin >> n >> m >> k;
int r1 = (n-1)/k * k + 1; //ближний снизу
int r2 = r1 + k; //ближний сверху
int s1 = (n-r1) * 200; //за подъем
int s2 = (r2-n) * 100; //за спуск
cout << (r2>m ? s1 : min(s1,s2));
}
10. Холодильник – идея решенияРазобьем дом на отдельные секции по K этажей каждая. Для заданной квартиры в

Слайд 1211. День программиста (acmp.ru)
День программиста отмечается в 255-й день года (при

этом 1 января считается нулевым днем). Требуется написать программу, которая определит дату (месяц и число григорианского календаря), на которую приходится День программиста в заданном году.
В григорианском календаре високосным является:
• год, номер которого делится нацело на 400
• год, номер которого делится на 4, но не делится на 100
Входные данные
В единственной строке входного файла INPUT.TXT записано целое число от 1 до 9999 включительно - номер года н.э..
Выходные данные
Вывести дату Дня программиста в формате DD/MM/YYYY, где DD — число, MM — номер месяца (01 — январь, 02 — февраль, ..., 12 — декабрь), YYYY — год в десятичной записи.
Примеры
№ Ввод Вывод
1 2000 12/09/2000
2 2009 13/09/2009
11. День программиста (acmp.ru)День программиста отмечается в 255-й день года (при этом 1 января считается нулевым днем).

Слайд 1312. День программиста - решение
Номер дня будет 12 для високосных годов

и 13 для обычных. Номер месяца всегда 9. Для вывода года в требуемом формате воспользуемся флагами вывода setw– количество символов (4) и setfill– задаёт символ-заполнитель (0)
#include
#include
#define DIV(p) (year % p == 0)
using namespace std;
int main() {
int year;
cin >> year;
bool leap = DIV(400) ||
(DIV(4) && !DIV(100));
cout << 13 - leap << "/09/" << setw(4)
<< setfill('0') << year;
}
12. День программиста - решениеНомер дня будет 12 для високосных годов и 13 для обычных. Номер месяца

Слайд 1413. Шахматная задача
В альтернативной Вселенной в городе Нью-Москоу (бывшие Васюки, Москва

переименована в Старые Васюки) готовится межпланетный шахматный турнир. Отличие шахмат альтернативной Вселенной состоит в том, что доска для игры в шахматы является неограниченной, а координаты каждой клетки задаются в виде пары чисел (x,y). Определите, сколько из шахматных фигур (ладья, слон, ферзь, король, конь) смогут сделать ход из клетки (x1,y1) в клетку (x2,y2).
13. Шахматная задачаВ альтернативной Вселенной в городе Нью-Москоу (бывшие Васюки, Москва переименована в Старые Васюки) готовится межпланетный

Слайд 1514. Шахматная задача - решение
#include
#include //описание функции abs
int main(){

int x1, y1, x2, y2;
std::cin >> x1 >> y1 >> x2 >> y2;
int dx = abs(x1-x2), dy = abs(y1-y2);
bool tower = !dx || !dy ;
bool elephant = (dx == dy);
bool queen = tower || elephant;
bool king = (dx<=1 && dy<=1);
bool horse = (dx * dy == 2);
std::cout << tower + elephant
+ queen + king + horse;
}
14. Шахматная задача - решение#include #include 	//описание функции absint main(){   int x1, y1, x2, y2;

Слайд 1615. Побитовые операции
Big и little endian
При представлении целых чисел в памяти

компьютера используется несколько подходов (моделей). При модели big endian вначале идут старшие байты, затем младшие, а в модели little endian всё наоборот.
Устройство, использующее big endian, записало число из 4 байт в файл (записав напрямую байты, а не представление числа в 10-чной системе счисления). Файл затем передали без изменений устройству, использующему little endian. Какое число считало второе устройство из этого файла, если изначальное число было равно K?
Входные данные
Единственное целое число K, для хранения которого в памяти компьютера используется 4 байта (со знаком).
Выходные данные
Число, которое получилось из исходного при использовании модели little endian вместо исходной big endian.
Пример
Ввод Вывод
1564357196 1278361181
15. Побитовые операцииBig и little endianПри представлении целых чисел в памяти компьютера используется несколько подходов (моделей). При

Слайд 1716. Big и little endian - решение
#include
int main() {

int n, byte, n1 = 0;
std::cin >> n;
for (int i = 0; i < 4; i++){
byte = n % 256;
n >>= 8; // на 8 бит вправо
(n1 <<= 8) += byte; // на 8 бит влево и
} // и добавление байта
std::cout << n1;
}
16. Big и little endian - решение#include int main() {  int n, byte, n1 = 0;

Слайд 1817. Быстрый НОД (алгоритм Евклида)
Найти наибольший общий делитель (НОД) двух целых

неотрицательных чисел
Описание алгоритма нахождения НОД делением
1. Большее число делим на меньшее.
2. Если делится без остатка, то меньшее число и есть НОД (следует выйти из цикла).
3. Если есть остаток, то большее число заменяем на остаток от деления.
4. Переходим к пункту 1.
Пример
Найти НОД для 30 и 18.
30 / 18 = 1 (остаток 12)
18 / 12 = 1 (остаток 6)
12 / 6 = 2 (остаток 0). Конец: НОД – это делитель.
НОД (30, 18) = 6
17. Быстрый НОД (алгоритм Евклида)Найти наибольший общий делитель (НОД) двух целых неотрицательных чиселОписание алгоритма нахождения НОД делением1.	Большее

Слайд 1918. Алгоритм Евклида - решение
#include
using namespace std;
int main(){
ifstream

cin("input.txt");
ofstream cout("output.txt");
unsigned long long a, b;
cin >> a >> b;
do{
if (a >= b) a %= b;
else b %= a;
} while (a && b);
cout << a + b;
}

Слайд 2019. Таймер (acmp.ru)
Таймер определяет, когда должен быть подан звуковой сигнал.
Входные

данные
В первой строке записано текущее время в формате ЧЧ:ММ:СС (с ведущими нулями). При этом оно удовлетворяет ограничениям: ЧЧ - от 00 до 23, ММ и СС - от 00 до 60.
Во второй строке записан интервал времени, который должен быть измерен. Интервал записывается в формате Ч:М:С (где Ч, М и С - от 0 до 109, без ведущих нулей). Например, 100:60 на самом деле означает 100 минут 60 секунд, то же самое, что 101:0 или 1:41:0. А 42 обозначает 42 секунды.
Выходные данные
Выведите в формате ЧЧ:ММ:СС время, во сколько прозвучит звуковой сигнал. При этом если сигнал прозвучит не в текущие сутки, то дальше должна следовать запись +<кол во> days. Например, если сигнал прозвучит на следующий день – то +1 days.
№ INPUT.TXT OUTPUT.TXT
1 01:01:01
48:0:0 01:01:01+2 days
2 01:01:01
58:119 02:01:00
3 23:59:59
1 00:00:00+1 days
19. Таймер (acmp.ru)Таймер определяет, когда должен быть подан звуковой сигнал. Входные данныеВ первой строке записано текущее время

Слайд 2120. Таймер - решение
#include
#define O(x) (x>9 ? "" : "0")

<< x // макрос для вывода
using namespace std;
long long h, m, s, d, time;
int main(){
char c;
cin >> h >> c >> m >> c >> s;
time = h * 3600 + m * 60 + s;
m = 0;
do{
cin >> s;
(m *= 60) += s;
} while (cin >> c);
time += m;
s = time % 60;
m = time / 60 %60;
h = time / 3600 % 24;
d = time / 86400;
cout << O(h) << ':' << O(m) << ':' << O(s);
if(d) cout << '+' << d << " days";
}

Слайд 22Slide Title
Make Effective Presentations
Using Awesome Backgrounds
Engage your Audience
Capture Audience Attention

Slide TitleMake Effective PresentationsUsing Awesome BackgroundsEngage your AudienceCapture Audience Attention

Слайд 23Slide Title
Product A
Feature 1
Feature 2
Feature 3
Product B
Feature 1
Feature 2
Feature 3

Slide TitleProduct AFeature 1Feature 2Feature 3Product BFeature 1Feature 2Feature 3

Что такое shareslide.ru?

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


Для правообладателей

Яндекс.Метрика

Обратная связь

Email: Нажмите что бы посмотреть