Московская олимпиада по информатике на сайте www.olympiads.ru |
Московская олимпиада школьников по информатике, 2011/12 учебный годОсобенности языков программирования и ввода-выводаНеобходимо создать консольное приложение, не использующие какие-либо графические возможности операционной системы. Программы на всех языках программирования должны считывать данные с клавиатуры
(стандартного ввода) и выводить результат на экран (стандартный вывод)
или считывать данные из файла Имена входных и выходных файлов должны быть написаны маленькими латинскими буквами.
Файл должен находиться в том же каталоге, где и программа, при открытии файла
не нужно указывать имя каталога. Например, Программа не должна выводить никаких дополнительных сообщений типа
Программы на Паскале не должны содержать строки Ниже приведены примеры программы, которая будет принятя проверяющей системой, для задачи "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 $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])
# Выведем результат в файл при помощи метода
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() |