Департамент образования г.Москвы
МГУ им.М.В.Ломоносова
МИОО
ВШЭ
МЦНМО

Московская олимпиада по информатике

на сайте www.olympiads.ru

Московская олимпиада по информатике 2011/12
Доска объявлений олимпиады
Информация об олимпиаде
Заключительный этап 10-11 класс
Задачи, тесты
Результаты
Списки приглашенных
Информация о времени, месте, правилах проведения
Регистрация участников заключительного этапа
Демонстрационный вариант заключительного этапа 10-11 классов
Заключительный этап 6-9 класс
Задачи, тесты
Результаты
Информация об отборе на заключительный этап 6-9 классов
Информация о времени, месте, правилах проведения
Списки приглашенных
Персональная страничка участника
Второй отборочный тур 10-11 класс (1-27 декабря)
Условия задач
Регистрация новых участников
Регистрация для тех, у кого уже есть логин, и редактирование регистрационных данных
Персональная страничка участника
Результаты 2 тура
Текущие результаты
Первый отборочный тур (27 ноября, 6-11 класс)
Регистрация
Редактирование регистрационных данных
Страничка участника 1 тура
Результаты 1 тура
Задать вопрос оргкомитету

Олимпиада проводится при поддержке ОАО "МГТС", Компьютерной компании НИКС и компании Яндекс

Московская олимпиада школьников по информатике, 2011/12 учебный год

Особенности языков программирования и ввода-вывода

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

Программы на всех языках программирования должны считывать данные с клавиатуры (стандартного ввода) и выводить результат на экран (стандартный вывод) или считывать данные из файла input.txt и выводить результат в файл output.txt.

Имена входных и выходных файлов должны быть написаны маленькими латинскими буквами. Файл должен находиться в том же каталоге, где и программа, при открытии файла не нужно указывать имя каталога. Например, assign(input,"input.txt"). Не забывайте закрывать выходной файл (иначе во многих языках он остается пустым).

Программа не должна выводить никаких дополнительных сообщений типа Write('Введите два числа ') или Write('Ответ ').

Программы на Паскале не должны содержать строки uses crt.

Ниже приведены примеры программы, которая будет принятя проверяющей системой, для задачи "A+B": вводятся два целых числа, программа должна вычислить и вывести их сумму.


Pascal, Delphi

Поддерживаемые варианты: Free Pascal, Borland Delphi.

Примечание для программирующих на Delphi: Имена стандартных модулей пишутся точно так же, как в документации (имеется в виду сочетание больших и маленьких букв) и только так. Например: Math, SysUtils.

Пример стандартного ввода-вывода:

var a, b, c: longint;
begin
    readln(a);
    readln(b);
    c := a + b;
    writeln(c)
end.

Пример файлового ввода-вывода:

var a, b, c: longint;
begin
    assign(input,'input.txt');
    reset(input);
    assign(output,'output.txt');
    rewrite(output);
    read(a, b);
    c := a + b;
    writeln(c);
    close(input);
    close(output);
end.

C

Поддерживаемые компиляторы: GNU C.

Пример стандартного ввода-вывода:

#include<stdio.h>
int main()
{
     int a, b, c;
     scanf("%d%d", &a, &b);
     c = a + b;
     printf("%d\n", c);
     return 0;
}

Пример файлового ввода-вывода:

#include <stdio.h>

int main(void)
{
    long a, b, c;
    FILE *fin, *fout;
    fin = fopen("input.txt", "r");
    fout = fopen("output.txt", "w");
    fscanf(fin, "%ld%ld", &a, &b);
    c = a + b;
    fprintf(fout, "%ld", a + b);
    fclose(fin);
    fclose(fout);
    return 0;
}

C++

Поддерживаемые компиляторы: GNU C++.

Пример стандартного ввода-вывода:

#include<iostream>
using namespace std;
int main()
{
     int a, b, c;
     cin >> a >> b;
     c = a + b;
     cout << c <<endl;
     return 0;
}

Пример файлового ввода-вывода:

#include <fstream>

using namespace std;

int main ()
{
    long a, b;
    ifstream fin ("input.txt");
    ofstream fout ("output.txt");
    fin >> a >> b;
    fout << a + b << endl;
    fin.close();
    fout.close();
    return 0;
}

Java

Пример файлового ввода-вывода:

import java.io.*;
public class Main
{
    public static void main(String[] args) throws Exception
    {
        StreamTokenizer in = new StreamTokenizer(
            new BufferedInputStream(
                new FileInputStream(new File("input.txt"))));
        PrintStream out = new PrintStream(new File("output.txt"));
        int a, b;
        in.nextToken();
        a = (int) in.nval;
        in.nextToken();
        b = (int) in.nval;
        out.println(a + b);
    }
}

FreeBASIC

Пример стандартного ввода-вывода:

input a, b
print a + b

Пример файлового ввода-вывода:

open "input.txt" for input as #1
open "output.txt" for output as #2
input #1, a, b
print #2, a + b
close #1
close #2

Perl, PHP, Python, Ruby

В скриптовых языках perl, php, python, ruby отсутствует возможность потокового ввода данных, свойственного для языков Pascal, C и C++, то есть в этих языках нельзя простыми методами считать из входного файла последовательность целых чисел (действительных чисел, строк и т.д.), если неизвестно, находятся ли эти числа в одной строке или в разных строках.

Для ввода данных в этих языках предлагается считывать содержимое всего файла сразу в строковую переменную, а затем использовать стандартную функцию split для разбивки этой переменной на поля. Функция split игнорирует все начальные и конечные пробельные символы (то есть пробелы, символы табуляции и символы новой строки), а все прочие символы разбиваются на последовательности, состоящие из непробельных символов, пробельные символы являются разделителями для полученных последовательностей. В результате получается список, состоящий из строк непробельных символов, содержащихся в исходном файле. Например, если в исходном файле записана строка "1 2 abc" (количество пробелов неважно), то в полученном списке будет три элемента - "1", "2" и "abc".

В языке php имеется небольшое отличие - функция называется preg_split, при ее вызове в качестве аргумента необходимо явно указать регулярное выражение, которое задает разделитель полей (это /\s+/, в языках perl, python и ruby такое значение разделителя используется по умолчанию), и перед вызовом функции preg_split необходимо явно удалить начальные и концевые пробелы из строки функцией trim (в языках perl, python и ruby это делает сама функция split).

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


Perl

Пример стандартного ввода-вывода, каждое число в одной строке

my $a = <>;
my $b = <>;
my $c = a + b;
print $c, "\n";

Пример файлового ввода-вывода с разбивкой файла по произвольным пробельным символам

#!/usr/bin/perl -w

# Объявляем файлы FIN и FOUT для ввода-вывода данных
open(FIN, "<input.txt");
open(FOUT,">output.txt");

# В переменной $/ записан символ, который считается разделителем строк
# Удаление этой переменной приведет к тому, что весь файл будет считаться
# одной большой строкой.
undef $/;

# Считываем содержимое всего файла в переменную $_
$_=<FIN>;

# Разбиваем переменную $_ на поля по пробельным символам
# и записываем поля в список @InputData
my @InputData=split;

# Теперь в элементах списка $InputData[0] и $InputData[1]
# записаны два входных числа. Запишем их сумму в переменную $Answer
my $Answer=$InputData[0]+$InputData[1];

# Выведем результат в файл
print FOUT $Answer;

# Закроем файлы FIN и FOUT
close(FIN);
close(FOUT);

PHP

Программа на PHP должна начинаться строкой <?php

Пример стандартного ввода-вывода, каждое число в одной строке

<?php
$a = fgets(STDIN);
$b = fgets(STDIN);
$c = $a + $b;
print $c;
?>

Пример файлового ввода-вывода с разбивкой файла по произвольным пробельным символам

<?php
# Считываем весь файл при помощи функции file_get_contents,
# удаляем начальные и конечные пробелы при помощи функции trim
# результат разбиваем на поля функцией split по шаблону /\s+/,
# задающему последовательность пробельных символов в качестве разделителя
# и записываем результат в массив InputData
$InputData=preg_split('/\s+/', trim(file_get_contents('input.txt')));

# Теперь в элементах массива $InputData[0] и $InputData[1]
# записаны два входных числа.
# Запишем их сумму в переменную $Answer
$Answer=$InputData[0]+$InputData[1];

# Объявляем файл FOUT для вывода данных
$FOUT=fopen("output.txt","w");

# Выведем результат в файл FOUT 
fputs($FOUT,$Answer);

# Закроем файл FOUT
fclose($FOUT);

?>

Python, версия 2

Пример стандартного ввода-вывода, каждое число в одной строке

a = input()
b = input()
c = a + b
print c

Пример файлового ввода-вывода с разбивкой файла по произвольным пробельным символам

# Объявляем файлы FIN и FOUT для ввода-вывода данных
FIN  = open('input.txt',  'r')
FOUT = open('output.txt', 'w')

# Считываем весь файл при помощи метода read(),
# результат разбиваем на поля по пробельным символам методом split()
# и записываем в список InputData
InputData = FIN.read().split()

# Теперь в элементах списка InputData[0] и InputData[1]
# записаны два входных числа в виде строк.
# Преобразуем их к типу int и запишем их сумму в переменную Answer
Answer = int(InputData[0]) + int(InputData[1])

# Выведем результат в файл
print >> FOUT, Answer

# Закроем файлы FIN и FOUT
FIN.close()
FOUT.close()


Python, версия 3

Пример стандартного ввода-вывода, каждое число в одной строке

a = int(input())
b = int(input())
c = a + b
print(c)

Пример файлового ввода-вывода с разбивкой файла по произвольным пробельным символам

# Объявляем файлы FIN и FOUT для ввода-вывода данных
FIN  = open('input.txt',  'r')
FOUT = open('output.txt', 'w')

# Считываем весь файл при помощи метода read(),
# результат разбиваем на поля по пробельным символам методом split()
# и записываем в список InputData
InputData = FIN.read().split()

# Теперь в элементах списка InputData[0] и InputData[1]
# записаны два входных числа в виде строк.
# Преобразуем их к типу int и запишем их сумму в переменную Answer
Answer = int(InputData[0]) + int(InputData[1])

# Выведем результат в файл при помощи метода write
FOUT.write(str(Answer) + '\n')

# Закроем файлы FIN и FOUT
FIN.close()
FOUT.close()


Ruby

Пример стандартного ввода-вывода, каждое число в одной строке

a = gets.to_i
b = gets.to_i
c = a + b
print c, "\n"

Пример файлового ввода-вывода с разбивкой файла по произвольным пробельным символам

#!/usr/bin/ruby

# Объявляем файлы FIN и  FOUT для ввода-вывода данных
FIN  = open("input.txt",  "r")
FOUT = open("output.txt", "w")

# Считываем весь входной файл при помощи метода read(),
# результат разбиваем на поля по пробельным символам методом split()
# и записываем в список InputData
InputData = FIN.read().split()

# Теперь в элементах списка InputData[0] и InputData[1]
# записаны два входных числа в виде строк.
# Преобразуем их к целочисленному типу и запишем их сумму в переменную Answer
A = InputData[0].to_i
B = InputData[1].to_i
Answer = A + B

# Выведем результат в файл FOUT 
FOUT.puts(Answer)

# Закроем файлы FIN и FOUT
FIN.close()
FOUT.close()
Webmaster: webmaster@olympiads.ru