Задача: Гистограмма

advertisement
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Памятка по работе с файлами
Все задачи читают входные данные из файла input.txt и записывают ответ в файл output.txt.
Вывод программы на экран и работа с другими файлами запрещены.
Необходимо строго соблюдать формат входного и выходного файла.
Запрещено использовать процедуры и функции, ожидающие ввода с клавиатуры (readkey,
getch), так как в этом случае программа будет ждать ввода бесконечно (и будет снята с
тестирования после превышения лимита времени).
Существует простой способ чтения из файла и записи в файл:
Pascal:
assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);
{ теперь обычные функции read, readln, write, writeln будут работать с файлами, а не с
клавиатурой / экраном }
{ в конце программы } close(output);
C:
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
/* теперь обычные функции printf, scanf, puts, fgetc и т.п. будут работать с файлами,
а не с клавиатурой / экраном */
Для тех, кто программирует на Java:
Ниже приведено описание класса FastScanner. Вы можете использовать его вместо обычного
класса Scanner в задачах с большими входными файлами. Для его использования вам надо вставить
этот код перед объявлением вашего основного класса Task. Методы класса FastScanner имеют
точно такой же смысл, что и соответствующие методы класса Scanner. По аналогии, вы можете
расширить класс FastScanner для чтения типов long, BigInteger и т.п. (смотрите реализацию
nextInt() и nextDouble()).
class FastScanner {
BufferedReader r;
StringTokenizer st;
public FastScanner(File in) throws IOException {
r = new BufferedReader(new FileReader(in));
st = new StringTokenizer("");
}
public String next() {
try {
while(!st.hasMoreElements())
st = new StringTokenizer(r.readLine());
} catch(IOException e) {
throw new NoSuchElementException();
}
return st.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
}
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 1. Операторы связи
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
2 секунды (4 для Java)
64 мегабайта
Одна фирма поставляет мобильные вышки для трех операторов связи. Все вышки производятся с
одинаковым радиусом действия, связь есть в пределах круга этого радиуса. Заказчики хотят, чтобы
радиус действия был наибольшим, но при этом на плоскости не было точки, где одновременно
ловятся все три оператора. Вас наняли написать программу, которая по заданным ей координатам
мест установки вышек вычисляет искомый радиус.
Входные данные
В первой строке входного файла записаны через пробел три целых числа N1, N2 и N3 —
количество точек каждого оператора (0< Ni ≤ 500, 1 ≤ i ≤3). Далее в N1 строках записаны координаты
точек первого оператора, затем в N2 строках — координаты точек второго оператора, и в N3 строках
— третьего. Все точки различны. Координаты целые и по модулю не превосходят 10000.
Выходные данные
В выходной файл нужно выдать одно число — искомый радиус с точностью до 6 знаков после
десятичной точки.
Примеры
input.txt
1 1 1
0 0
0 1
1 0
1 2 2
0 0
-3 0
-4 0
3 0
4 0
output.txt
0.707107
3.000000
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 2. Еще б поспать! Ну хоть чуть-чуть...
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда
64 мегабайта
Однажды Петя поставил свой электронный будильник на некоторое время. Проснувшись и
взглянув на часы будильника, Петя понял, что он проснулся на 1 секунду раньше нужного времени.
Зная время, на которое Петя поставил свой будильник, сможете ли Вы определить, какое время он
увидел на часах?
Входные данные
Входной файл содержит время, на которое был поставлен будильник, в формате ЧЧ:ММ:СС
(часы, минуты, секунды). Часы на будильнике показывают время в 24-часовом формате, таким
образом, минимальное отображаемое время — 0:00:00, максимальное — 23:59:59. Заметьте, что
минуты и секунды показываются в виде двух цифр, т.е. при необходимости добавляются ведущие
нули. Часы записываются в виде одной или двух цифр, в зависимости от того, является ли число
часов однозначным или двузначным числом.
Выходные данные
Требуется выдать время, которое показывали часы в момент пробуждения Пети. Время выдавать
в том же формате, что и во входном файле.
Примеры
input.txt
23:59:59
7:15:00
output.txt
23:59:58
7:14:59
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 3. День рождения
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда
64 мегабайта
Завтра у Пети день рождения. Он хочет позвать на него несколько своих одноклассников, но с
условием, что между собой они должны быть «вполне дружны». Это означает, что у каждого
приглашённого человека должно быть хотя бы K друзей среди присутствующих, не считая Петю.
Помогите Пете определить, какое максимальное число одноклассников он сможет пригласить так,
чтобы выполнялось это условие.
Входные данные
В первой строке входного файла через пробел заданы числа N и K (1 ≤ K ≤ N ≤ 103) — количество
одноклассников Пети и необходимое число друзей для каждого приглашённого. Далее следует N
строк с описанием одноклассников Пети в следующем формате: В i-той строке сначала идёт
количество друзей i-того одноклассника (самого Петю не считаем), а затем номера одноклассников,
которые являются его друзьями. Все числа даны через пробел, нумерация с единицы, номера
одноклассников не повторяются. Отметим, что если одноклассник А дружит с одноклассником B, то
и одноклассник B дружит с одноклассником A.
Выходные данные
В выходной файл необходимо выдать единственное число — максимальное число друзей,
которых удастся позвать Пете.
Примеры
input.txt
4
3
2
2
1
3
2
1
1
3
2
1
1
2
2
1
1
1
1
2
1
1
2
2
1
1
output.txt
3
3 4
3
2
3
3
0
3
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 4. И целого терабайта мало...
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда
64 мегабайта
В новом фильме про Джеймса Бонда агент 007 должен проникнуть на секретный вражеский
объект и стереть из базы данных всю информацию. Естественно, он не хочет ее терять и поэтому
предварительно скопирует на винчестеры, принесенные с собой. Проблема в том, что Бонд не знает
сколько жестких дисков ему необходимо взять для этого. Зато он знает, что скопировать ему надо N
гигабайт информации, а один диск умещает K гигабайт информации. Напишите программу, которая
считает минимальное количество носителей, для размещения всей информации..
Входные данные
Входной файл содержит два целых числа N и K (0 < N, K < 1000000000).
Выходные данные
В выходной файл необходимо выдать одно целое число — количество дисков.
Примеры
input.txt
output.txt
20 5
4
23 5
5
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 5. Странная игра
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда
64 мегабайта
Петя и Вася играют в следующую игру. Они по очереди называют числа. Один называет число, а
другой игрок при помощи операций "прибавить к текущему числу 3" и "умножить текущее число на
2" должен получить из числа 1 названное число. Все шло хорошо, пока Петя не застопорился на
одном из чисел, названным Васей. Пете никак не удается получить это число из 1, и ему кажется, что
Вася специально дал такое число, которое нельзя получить указанными операциями. Однако
сдаваться он не хочет и обращается к Вам за помощью. Напишите программу, которая по заданному
числу N выдаст последовательность операций, с помощью которых можно получить это число.
Входные данные
Во входном файле задано одно число N (1 ≤ N ≤ 1018) — число, загаданное Васей.
Выходные данные
В выходной файл необходимо выдать требуемую последовательность операций в следующем
формате:
N=1[операции]
[операции] — это последовательность операций вида +3 и *2, в результате выполнения которых
слева направо получается число N. Заметим, что умножение не имеет приоритета над сложением.
Если же получить число N действительно невозможно, выходной файл должен содержать
единственное слово impossible. Если последовательность операций существует, вы должны
будете найти и выдать такую последовательность, которая содержит не более 200 операций, так как
слишком длинный ответ Васе проверять будет трудно. Гарантируется, что в этом случае такая
короткая
последовательность
обязательно
существует.
Если
существует
несколько
последовательностей, удовлетворяющих условию, достаточно выдать любую.
Выходной файл не должен содержать символов пробелов и табуляций.
Примеры
input.txt
1
10
3
output.txt
1=1
10=1*2+3*2
impossible
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 6. Игра «Классики»
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда
64 мегабайта
Дети играют в следующую игру. На асфальте между песочницей и бордюром нарисовано
прямоугольное поле. Каждая клетка покрашена мелком своего цвета. По правилам игры из клетки
можно перепрыгивать лишь в соседнюю по стороне клетку. По диагонали прыгать нельзя. Если игрок
наступает на клетку цвета, который раньше не встречался на пути, ему начисляют одно штрафное
очко. За первый прыжок с песочницы на клетку тоже начисляется штрафное очко. Петя хочет узнать,
какое минимальное количество штрафных очков он может набрать, добравшись от песочницы до
бордюра. Кроме того, он хочет определить, какое минимальное количество клеток ему придётся
пропрыгать в этом случае.
Входные данные
В первой строке входного файла через пробел заданы числа N и M (1 ≤ M, N ≤ 100) — размеры
поля. Далее следует N строк по M чисел в каждой — описание цветов клеток на асфальте. Цвет
клетки — это одна из цифр от 0 до 9. На бордюр можно попасть из любой клетки первой строки, а в
песочницу — из любой клетки последней строки.
Выходные данные
В выходной файл необходимо выдать два целых числа — минимально возможное количество
штрафных очков и минимальное количество клеток, составляющих путь при таком количестве
штрафных очков.
Примеры
input.txt
output.txt
3
0
1
2
3
0 0
1 1
2 2
3 3
4
3
2
4
4
3
1
1
0
4
2 5
3
2
0
0
Комментарии
Пример №2: минимально необходимое количество цветов — два.
При этом количество клеток в минимальном пути равно пяти. Очки начисляются за
переход с песочницы на клетку в нижней строке и за переход из третьей клетки пути в
четвертую, где происходит смена цвета.
Бордюр
3
1
3
2
1
2
4
0
0
4
4
0
Песочница
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 7. Две двоичные строки
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда
64 мегабайта
Слава играет в игру, в которой необходимо получить из одной битовой строки другую с
помощью применения операций, осуществляющих замену одной подстроки в строке на другую
подстроку такой же длины. Имеется M типов разрешенных операций. Каждый тип характеризуется
строками A, B равной длины и стоимостью C. Операция применяется к строке S следующим образом.
Вхождение подстроки A в S заменяется строкой B. При этом Слава платит за эту замену C евро.
Каждую операцию можно применять несколько раз. Любую операцию можно применять к любому
вхождению A в текущую строку. Например, пусть одна операция по замене строки «0» на «1» стоит
123 евро. Тогда из строки «00» можно получить строку «11» за 246 евро. После применения
очередной операции следующая операция применяется к полученной строке. Необходимо
минимизировать стоимость получения строки Y из строки X. Помогите Славе.
Входные данные
В первой строке входного файла содержится два числа N и M длина строк X и Y и количество
разрешенных операций (0 < N ≤ 10, 0 ≤ M ≤ 100). На следующей строке расположены строки X и Y. В
следующих M строках описываются операции в виде: A B C. Где A и B строки одинаковой длины, не
превышающей N, а C — стоимость применения этой операции (0 ≤ C ≤ 1000000). Все строки во
входном файле состоят из нулей и единиц.
Выходные данные
В выходной файл необходимо вывести одно число — минимальную стоимость получения строки
Y из строки X. Если получить строку Y невозможно, то выдать слово Impossible.
Примеры
input.txt
output.txt
2 1
00 11
0 1 123
246
2 2
01 00
0 1 110
00 11 10
Impossible
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 8. Размещения
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
3 секунды (6 для Java)
64 мегабайта
Учитель информатики задал ученикам такую задачу. Дана полоска из клеточек, ее размер 2×N (2
строки и N столбцов). На ней размещается K уголков. Уголки состоят из 3 клеток и имеют вид буквы
L (см. рисунок). При размещении уголки разрешается поворачивать и переворачивать любым
образом. Требуется подсчитать число способов разместить уголки. Попробуйте и Вы решить эту
задачу.
Уголки следует считать неразличимыми. Так как число способов может быть довольно велико,
достаточно вычислить его по модулю некоторого заданного числа P.
Входные данные
Во входном файле в единственной строке заданы три числа, разделенных пробелами, N, K и P
— количество столбцов полоски, количество уголков и число, по модулю которого требуется
произвести вычисления, соответственно (1 ≤ N ≤ 5000, 1 ≤ K ≤ 3000, 2 ≤ P ≤ 109+9).
Выходные данные
Выходной файл должен содержать единственное число — ответ на поставленную задачу.
Примеры
input.txt
1 1 100
3 2 100
output.txt
0
2
Комментарии
В первом примере не существует способов уложить один уголок в полоску размера 2×1. Два
способа размещения двух уголков в полоске 2×3 изображены ниже (разными цветами для
наглядности изображены разные уголки).
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 9. Домашнее задание
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда (2 для Java)
64 мегабайта
Вася сел выполнять домашнее задание по географии. Ему необходимо раскрасить контурную
карту своего города. На карте изображено N микрорайонов, некоторые из которых граничат между
собой. Для любого микрорайона количество соседних с ним микрорайонов не превосходит числа D.
Кроме того, известно, что существует микрорайон, у которого число соседних микрорайонов строго
меньше D.
Также известно, что карта города связна, т.е. из любого микрорайона существует путь до любого
другого микрорайона, возможно, через другие микрорайоны.
Помогите Васе раскрасить карту не более, чем в D цветов таким образом, чтобы любые два
соседних микрорайона имели разные цвета.
Входные данные
В первой строке входного файла через пробел заданы числа N и D (1 ≤ N ≤ 5000 , 1 ≤ D ≤ 100).
Далее следует N строк с описанием микрорайонов в следующем формате. В i-той строке сначала идёт
количество соседних микрорайонов для i-того микрорайона, а затем номера этих микрорайонов. Все
числа даны через пробел, нумерация с единицы, номера микрорайонов не повторяются. Если
микрорайон A граничит с микрорайоном B, том микрорайон B граничит с микрорайоном A.
Выходные данные
В выходной файл необходимо выдать через пробел N чисел — цвета для всех микрорайонов по
порядку номеров микрорайонов. Цвета микрорайонов должны иметь номера от 1 до D.
Гарантируется, что решение всегда существует. Если решений несколько, разрешается выдать
любое.
Примеры
input.txt
5
3
3
3
3
2
2
1
1
3
2
1
2
1
1
2
2
1
output.txt
2 3 2 1 1
4
3
4
2
3
5
4
5
3
1 2
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 10. Наибольший общий делитель
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
4 секунды
64 мегабайта
Вам дано число S = A0A1...An–1 , где Ai — цифры десятичной записи числа S ( 0 ≤ Ai < 10, A0 > 0).
Определим Si = AiAi+1...An–1A0A1...Ai–1 — i-ый циклический сдвиг числа S (0 ≤ i < n). Например, если S =
123, то S0 = 123, S1 = 231, S2 = 312. Сдвиги могут быть с ведущими нулями. Вам необходимо найти
НОД(S0,S1,...,Sn) — наибольшее число, которое делит все эти циклические сдвиги.
Входные данные
Входной файл содержит число S = A0A1...An–1 (S > 0, 0<n ≤ 20000).
Выходные данные
В выходной файл необходимо вывести одно число — НОД(S0,S1,...,Sn) без ведущих нулей.
Примеры
input.txt
123
48
output.txt
3
12
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Задача 11. Перегрузка функций
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
input.txt
output.txt
1 секунда
64 мегабайта
Начинающий программист Вася Пупкин устраивается на работу в фирму, занимающуюся
разработкой программного обеспечения. Он получил следующее тестовое задание.
В языках C++, Java, и ряде других разрешается существование нескольких функций с
одинаковым именем. Для того чтобы компилятор мог их различать, достаточно, чтобы функции с
одинаковым числом параметров имели различный тип, либо функции с одинаковым типом имели
различное число параметров. Тогда, используя информацию о типах передаваемых параметров,
компилятор может правильно определить, какую же функцию следует вызывать. Однако ситуацию
усложняет неявное приведение типов. А именно, если компилятор не находит подходящей функции,
чтобы типы параметров полностью соответствовали передаваемым, то он может попытаться
выполнить приведение типа одного или нескольких параметров функции, добиваясь наилучшего
соответствия.
Для простоты примем следующую модель. Пусть для каждого типа задан набор типов, в которые
его можно преобразовать "элементарным" преобразованием. Расстоянием между двумя типами A и B
назовем минимальное количество "элементарных" преобразований, которые требуется произвести,
чтобы из типа A получить тип B. Если такое преобразование невозможно, расстояние считается
равным бесконечности. Расстоянием между двумя упорядоченными наборами типов одинаковой
длины назовем сумму расстояний между соответствующими типами в этих наборах.
Для определения функции, которую следует вызвать, будем использовать следующее правило.
Определив фактические типы параметров функции, компилятор вызывает ту функцию, у которой
расстояние минимально между списком типов формальных параметров и списком типов фактических
параметров. Если существует несколько таких функций, возникает ошибка компиляции
"неоднозначность". Если же такой функции не находится (не существует функций с таким именем и
таким числом параметров, либо расстояние до всех функций равно бесконечности), то код также не
компилируется с ошибкой "нет такой функции".
Васе требуется написать программу, которая по заданным преобразованиям типов, прототипам
существующих функций и набору запросов, являющихся вызовами функций, определяет, какая
функция будет вызвана на самом деле.
Прототип каждой функции задается на отдельной строке и имеет следующий формат:
<тип_возращаемого_значения> <имя_функции>([<тип1>[,<тип2>[,...]]]),
где
<тип_возвращаемого_значения> — имя типа, который возвращает данная функция,
<имя_функции> — соответственно, имя функции,
<тип1>, <тип2>, ... — имена типов, которые принимает функция в качестве параметров.
В квадратных скобках указаны необязательные элементы. Например, в скобках выше указан список
типов, разделенных запятыми. Все имена функций и типов состоят из заглавных и строчных
латинских букв, цифр и символов подчеркиваний, при этом они не могут начинаться с цифры. Для
удобства чтения, в прототип может быть вставлено произвольное число пробелов. Гарантируется, что
пробелы внутрь имен функций и типов не вставляются. Примеры прототипов:
void foo(char, int);
double
bar ( ) ;
Вызов функции описывается следующей грамматикой:
<вызов> ::= <имя_функции>([<параметр>[,<параметр>[, ...]]])
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
<параметр> ::= <имя_типа >| <вызов>
Символом | обозначается выбор одного из вариантов. В конце записи вызова функции ставится
символ ; . Как и в прототипе, для разделения элементов в описании вызова функции могут
использоваться пробелы.
Таким образом, в качестве параметра функции могут быть переданы не просто типы, но и
результат вызова другой функции. Примеры синтаксически корректных вызовов:
foo(char, bar ( ) );
sqrt(double);
bar(foo(bar())) ;
Помогите Васе с написанием программы.
Входные данные
В первой строке входного файла записано число T (1 ≤ T ≤ 100) — число типов, использующихся
в текущем тесте. Далее идет T строк с содержимым следующего вида. В начале каждой строки
записано имя типа, затем число Ki — количество типов, к которым можно привести текущий тип, и
далее Ki имен типов. Все элементы в строке разделены пробелами. Далее в отдельной строке записано
число N (1 ≤ N ≤ 100) — количество прототипов функций. После этого идут N строк, по одному
прототипу на строку в формате, описанном выше. Затем записано число M (1 ≤ M ≤ 100) — число
запросов — вызовов функций. Затем идет M запросов, по одному на строке. Гарантируется, что
прототипы функций и запросы записаны в соответствии с заявленным форматом и не содержат
синтаксических ошибок. Число параметров функций в прототипах и запросах не превосходит 10.
Общее число вызовов функций, включая вложенные, не превосходит 1000. Длины строк — имен
типов и функций не превосходят 50. Длина любой строки входного файла не превосходит 10000
символов. Гарантируется, что среди прототипов не встретится двух функций с одинаковыми именами
и одинаковым числом аргументов и их типами. Имена функций и типов не совпадают.
Выходные данные
В выходной файл требуется вывести M строк — по одной на каждый запрос. Если
соответствующий вызов корректен, требуется вывести номера функций в том порядке, в котором они
будут вызваны, разделив их пробелами. Считайте, что при вызове функции компилятор сначала
вычисляет все ее аргументы слева направо, при необходимости вызывая другие функции. Функции
нумеруются от 1 до N в том порядке, в котором они заданы во входном файле. Если же вызов
содержит ошибку, требуется выдать сообщение о первой ошибке, которую встретит компилятор при
вычислении аргументов функции слева направо. В случае, если требуемая функция не может быть
найдена, необходимо выдать сообщение No
such
function
when
calling
<имя_функции>([<тип1>[,<тип2>[,...]]]), где <имя_функции> — имя требуемой функции, а в
скобках перечислены фактические типы параметров. Пробелы возле запятых и возле скобок ставить
не надо. В случае, если существует несколько функций — кандидатов для вызова, требуется выдать
сообщение Ambiguity between <номера_функций> when calling <имя_функции>
([<тип1>[,<тип2>[,...]]]). Здесь <номера_функций> — список номеров подходящих функций,
разделенных пробелами.
Полуфинал IX Всероссийской командной олимпиады школьников по программированию
Новосибирск, 26 октября 2008 года
Пример
input.txt
5
void 0
char 1 short
short 2 char int
int 2 short double
double 0
6
void foo(char , int) ;
double bar();
int abs(int);
char abs(char);
short log (int);
double log (double);
5
log(bar());
foo(char,bar());
foo (abs( log ( int ) ) , bar());
log(log(log(int)));
bar(foo(char, int));
output.txt
2 6
No such function when calling
foo(char,double)
Ambiguity between 3 4 when
calling abs(short)
5 5 5
No such function when calling
bar(void)
Комментарии
Для удобства печати некоторые строки в выходном файле примера были разорваны. Вам следует
печатать вывод для одного запроса на одной строке. Пояснения к запросам примера:
1. Вызов bar() однозначно задает функцию, после этого по типу возвращаемого значения
однозначно определяется, какую из функций log требуется вызвать. Вызываются функции в
порядке: сначала вычисляются аргументы log, т.е. вызывается функция bar(), и только
после этого вызывается сама функция log.
2. Во втором запросе мы можем определить, какие типы будут переданы функции foo, однако
преобразование типа из double в int отсутствует, генерируется сообщение об ошибке.
3. Третий пример содержит две ошибки. Первая — неоднозначность вызова функции abs, так
как существует два равнозначных преобразования типа short к char и к int. Вторая
ошибка — неправильный тип второго аргумента функции foo, требуется int, а передается
double. При вычислении аргументов foo слева направо первой встречается ошибка в вызове
функции abs — она и выводится. Заметьте, что компилятор не пытается использовать знание
необходимого возвращаемого функцией значения, иначе он мог бы предположить, что short
надо привести к char, поскольку функция char abs(char) возвращает нужный тип.
4. В четвертом примере осуществляется два неявных преобразования типа short к типу int.
Несмотря на то, что существует преобразование типа short к типу double, оно не
используется, поскольку требует два шага, расстояние от short до double равно 2 вместо 1
в случае преобразования short к int.
5. Для людей, знакомых с С++. Имена типов в примерах — условные, и тип void не означает
отсутствия аргумента, поэтому bar() и bar(void) — не одно и то же. Точно также как в
реальном C++ существует преобразование из double в int.
Download