Спортивный Си++

Уже говорил, что читаю c Пашей Кузьминым лекции по C++ два раза в неделю. Медленно, но верно попробую выложить сюда конспекты.

Предыдущая лекция: как поставить C++

Обсудим кое-что заранее

На самом деле, компьютер не может похвастаться широкими встроенными возможностями: ну калькулятор калькулятором! Если посмотреть набор инструкций процессора, то мы увидим там такие функции, как «сложить два целых числа», «вычесть целое из целого» или, например, «скопировать из одного места памяти в другое». Чтобы считать что-нибудь с клавиатуры, компьютер действует примерно так: приготовиться к считыванию с клавиатуры, считать с клавиатуры, вот вам один символ, записать его в память, ок, повторить пока не введут пробел. Кому охота громоздить такое каждый раз, когда нужно что-то узнать у пользователя? Поэтому программисты создают разные библиотеки «готовых функций», в которых накоплены постоянно используемые вещи. Функции в этих библиотеках бывают весьма сложными, вплоть до «считай_из_файла_видео_ролик_и_выведи_его_на_экран». Стоит ли говорить, что на самом деле для компьютера эта задача — миллионы элементарных действий?

Так вот, Си++ — это тоже набор заготовок для упрощения работы программиста. Вы больше не говорите с компьютером на языке «дай мне четыре байта памяти, прибавь к этим четырём байтам памяти другие четыре байта памяти». Если вам в школе не рассказали, что такое байты то… Эээ, ну память компьютера — это как тетрадка в клеточку. Каждая клеточка — это один байт. Если у вас гигабайт оперативной памяти — ну вот значит миллиард таких клеточек. В каждую клеточку компьютер умудряется записать число от 0 до 255. Больше ничего про эти клеточки ваш компьютер не знает. Это уже вы, как программист, помните, что на первой странице у вас в клеточках хранится картинка, а на второй странице — телефоны друзей.

Про спортивное программирование

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

Представьте, что учительница вас просит «решите все существующие квадратные уравнения». Конечно, алгебраичке такое в голову не придёт, а вот в информатике всё именно так. Вы пишете программу, которая решит любое квадратное уравнение. Если вас просят сложить два числа — это значит, что придётся, скорее всего, уметь складывать любые два числа, как очень большие (миллиарды), так и очень маленькие (близкие к нулю).

Таким образом, большинство задач по программированию имеют такой классический вид: вводим данные, решаем некую задачу с этими данными, выводим ответ. Если была задача «решить любое квадратное уравнение», значит мы вводим коэффициенты a,b и c, считаем дискриминант, находим корни и выводим их на экран, а если корней нет, то сообщаем об этом.

Соответственно, когда вашу задачу проверяют — мало кто читает, какие вы там команды использовали и в какой последовательности всё делали. У судей имеются готовые тесты вида «если ввожу такие числа, то должен получить вот такие числа». Если ваша программа правильно отвечает на все их тесты, то считается что всё правильно.

Вот пример задачи:

Бандиты Гарри и Ларри отдыхали на природе. Решив пострелять, они выставили на бревно несколько банок из-под пива (не больше 10). Гарри начал простреливать банки по порядку, начиная с самой левой, Ларри — с самой правой. В какой-то момент получилось так, что они одновременно прострелили одну и ту же последнюю банку.
Гарри возмутился и сказал, что Ларри должен ему кучу денег за то, что тот лишил его удовольствия прострелить несколько банок. В ответ Ларри сказал, что Гарри должен ему еще больше денег по тем же причинам. Они стали спорить кто кому сколько должен, но никто из них не помнил сколько банок было в начале, а искать простреленные банки по всей округе было неохота. Каждый из них помнил только, сколько банок прострелил он сам.
Определите по этим данным, сколько банок не прострелил Гарри и сколько банок не прострелил Ларри.
Ограничение времени: 1.0 секунды
Ограничение памяти: 16 МБ
Исходные данные
В единственной строке записано 2 числа — количество банок, простреленных Гарри и Ларри соответственно.
Результат
Выведите 2 числа — количество банок, не простреленных Гарри и Ларри соответственно.
Пример
исходные данные:
4 7
результат:
6 3
Автор задачи: Ден Расковалов

Про Си++ (уже наконец)

Итак.
Запустите уже Dev-C++, создайте проект консольного приложения (всё описано в прошлой лекции), давайте программировать.
Вот вам простая программка:

[cc lang=»cpp»]
#include
using namespace std;
int main()
{
cout << "ПРИВЕТ ТЕБЕ ЧЕЛОВЕК ОТ ПРЕДСТАВИТЕЛЯ РОБОТОВ! НАЗОВИ СВОЙ ПОРЯДКОВЫЙ НОМЕР?"; int nomer_cheloveka; cin >> nomer_cheloveka;
return 0;
}
[/cc]

Попробуйте запустить это. Компьютер спросит ваш номер, введёте его и программа тут же быстренько закроется.
Что написано в строчках? В первой строчке мы подключаем библиотеку функций для считывания с клавиатуры и вывода на экран. Вторую строчку вам объяснят на третьем курсе универа. В третьей строчке мы объявляем начало программы, с этой строчки компьютер будет её выполнять. Дальше команда cout выводит на экран строчку. Программисты — люди с высоким эстетическим вкусом, потому было решено в этой команде всегда применять ёлочки. Запомните — «у cout ёлочка растёт налево» и ваша жизнь будет лёгкой и беззаботной на 30% чаще.
Дальше мы совершаем то, что называют умной фразой «завести переменную». Для новичков это выглядит примерно как «уговорить строптивую» или «налить полусладкого». Я уже выше говорил, что память — это тетрадка в клетку. Так вот, команда «int nomer_cheloveka;» означает примерно следующее «найди в тетрадке четыре свободные клеточки, обведи их и надпиши названием nomer_cheloveka. Я собираюсь в эти четыре клеточки записывать числа в ближайшее время». Всё, теперь это место в памяти имеет своё имя и конкретное предназначение.
Дальше мы просим компьютер считать с клавиатуры данные в эту переменную. Выучите на зубок, что ёлочки растут из cin, и этот ваш зубок станет здоровее и белее.
Все команды сгруппированы фигурными скобками. В конце главной программы находится команда return 0; которая означает «всё хорошо, мы закончили, сдачи не надо».

Дополнительное чтиво по теме урока:
Про cin и cout
C++ на скиллопедии (там видеоуроки)
Лекции на Интуите: Предисловие Типы данных
Другие лекции на Интуите: Предисловие Имена, переменные и константы Выражения

Вот ещё примеры задач для медитативного рассмотрения:
[cc lang=»cpp»]
include
using namespace std;
int main()
{
int a,b;
cout << "ПРИВЕТ ТЕБЕ ЧЕЛОВЕК ОТ ПРЕДСТАВИТЕЛЯ РОБОТОВ! Введи два целых числа"; cin >> a >> b;
cout << "Сумма: " <
using namespace std;
int main()
{
double R, PI=3.1415;
cout << "ПРИВЕТ ТЕБЕ ЧЕЛОВЕК ОТ ПРЕДСТАВИТЕЛЯ РОБОТОВ! Введи радиус круга"; cin >> R;
cout << "Площадь круга: "<
using namespace std;
int main()
{
char digit1,digit2;
cout << "Введи число из двух цифр"; cin >> digit1 >> digit2;
int sum = (digit1-‘0’)+(digit2-‘0’);
cout << "Сумма цифр числа: "<
using namespace std;
int main()
{
int chislo;
cout << "Введи число из двух цифр"; cin >> chislo;
int sum = 0;
sum = (chislo/10) + (chislo % 10);

cout << "Сумма цифр числа: "<Loading…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *