Файлы

Для работы с файлами из своей программы необходимо:

  1. Подключить заголовочный файл fstream, содержащий описание функций, позволяющих работать с файловыми потоками.
  2. Для чтения данных необходимо создать переменную (объект) типа ifstream, связав его с файлом на диске. Чтение данных из файла осуществляется также, как из стандартного ввода при помощи оператора “>>
  3. Для вывода данных необходимо создать переменную (объект) типа ofstream, связав его с файлом на диске. Запись данных в файл осуществляется также, как на стандартный вывод при помощи оператора “<<

Если при связывании объектов с файлами указывается только имя файла (а не полный путь), то файл должен располагаться в текущем каталоге (там же, где и запускаемая программа).

Пример работы с файлами:

#include <fstream>
using namespace std;

ifstream fin("input.txt");
ofstream fout("output.txt");

int main()
{
    int a, b;
    fin >> a >> b ; // Считать числа a и b из файлового потока fin
    fout << a + b << endl;
    return 0;
}

Напоминаем, что строки можно считывать из файла двумя способами - до пробельного символа при помощи оператора fin >> S и до конца строки при помощи функции getline(fin, S).

Упражнения

Во всех задачах этого листка нельзя сохранять все входные данные в массиве, размер которого определяется количеством записей во входном файле, за исключением тех задач, где явно сказано произвести сортировку всех записей входного файла по заданному критерию.

Входные данные записаны в файле input.txt, результат работы нужно вывести в файл output.txt.

A

Во входном файле записано два целых числа, не превосходящие 2×109 по модулю. Выведите в выходной файл их сумму.

Ввод Вывод
2 2
4

B

Во входном файле записана одна текстовая строка, возможно, содержащая пробелы. Выведите эту строку в обратном порядке.

Ввод Вывод
hello world
dlrow olleh

C

В олимпиаде по информатике принимало участие N человек. Информация о результатах олимпиады записана в файле, который имеет следующий вид. Сначала записано число N. Затем идет N строк, каждая из которых имеет вид: фамилия, имя, класс, балл.

Фамилия и имя - текстовые строки, не содержащие пробелов. Класс - одно из трех чисел - 9, 10, 11. Балл - целое число от 0 до 100.

Победителем олимпиады становится человек, набравший больше всех баллов. Победители определяются независимо по каждому классу.

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

Выведите три числа: баллы победителя олимпиады по 9 классу, по 10 классу, по 11 классу.

Ввод Вывод
4
Иванов Сергей 9 90
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
93 91 92

D

В условиях предыдущей задачи определите и выведите средние баллы участников олимпиады в 9 классе, в 10 классе, в 11 классе.

Ввод Вывод
4
Иванов Сергей 9 90
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
91.5 91 92

E

В условиях предыдущей задачи определите количество школьников, ставших победителями в каждом классе. Победителями объявляются все, кто набрал наибольшее число баллов по данному классу. Гарантируется, что в каждом классе был хотя бы один участник.

Выведите три числа: количество победителей олимпиады по 9 классу, по 10 классу, по 11 классу.

Ввод Вывод
7
Иванов Сергей 9 80
Сергеев Петр 10 80
Петров Василий 11 81
Васильев Андрей 9 81
Андреев Александр 10 80
Александров Роман 9 81
Романов Иван 11 80
2 2 1

F

Пусть зачет в олимпиаде проводится без деления на классы. Выведите фамилию и имя победителя олимпиады. Если таких несколько - выведите только их количество.

Ввод Вывод
3
Иванов Сергей 9 90
Сергеев Петр 10 95
Петров Иван 11 85
Сергеев Петр
3
Иванов Сергей 9 90
Сергеев Петр 10 85
Петров Иван 11 90
2

G

Зачет проводится отдельно в каждом классе. Победителями олимпиады становятся школьники, которые набрали наибольший балл среди всех участников в данном классе.

Для каждого класса определите максимальный балл, который набрал школьник, не ставший победителем, в каждом классе.

Выведите три целых числа.

Ввод Вывод
7
Иванов Сергей 9 80
Сергеев Петр 10 82
Петров Василий 11 82
Васильев Андрей 9 81
Андреев Александр 10 81
Александров Роман 9 81
Романов Иван 11 83
80 81 82

H

Результаты олимпиады подводятся без деления на классы. Победителем олимпиады становятся те, кто набрал больше всего баллов. Призерами олимпиады становятся участники, следующие за победителями.

Определите наибольший балл, который набрали призеры олимпиады и количество участников олимпиады, набравших такой балл. Выведите два числа: наибольший балл призера и количество участников, имеющий такой балл.

Ввод Вывод
4
Иванов Сергей 9 92
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
92 2

I

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

Ввод Вывод
4
Иванов Сергей 9 93
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
Петров Василий
4
Иванов Сергей 9 92
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
2

J

В олимпиаде по информатике принимало участие N человек. Информация о результатах олимпиады записана в файле, который имеет следующий вид. Сначала записано число N. Затем идет N строк, каждая из которых имеет вид: фамилия, имя, школа, балл.

Фамилия и имя - текстовые строки, не содержащие пробелов. Школа - целое число от 1 до 99. Балл - целое число от 0 до 100.

Определите школы, из которых в олимпиаде принимало участие больше всего участников. Выведите номера этих школ в порядке возрастания.

Ввод Вывод
6
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
3 14

K

В условиях предыдущей задачи определите школы, из которых в олимпиаде принимало участие меньше всего участников (но был хотя бы один участник). Выведите номера этих школ в порядке возрастания.

Ввод Вывод
6
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
23 27

L

Известно, что фамилии всех участников - различны. Сохраните в массивах список всех участников и выведите его, отсортировав по фамилии в лексикографическом порядке.

При выводе указываете фамилию, имя участника и его балл.

Две строки (величины типа string) можно сравнивать при помощи операторов <, <=, >, >=, ==, !=.

Ввод Вывод
6
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
Андреев Роман 75
Васильев Андрей 56
Иванов Сергей 56
Петров Василий 99
Романов Иван 68
Сергеев Петр 74

M

Отсортируйте список участников олимпиады:

  1. По убыванию набранного балла.
  2. При равных значения балла - по фамилии в лексикографическом порядке.
  3. При совпадающих баллах и фамилии - по имени в лексикографическом порядке.

Выведите список в таком же виде, как в предыдущей задаче.

Ввод Вывод
6
Иванов Сергей 14 75
Сергеев Петр 23 74
Сергеев Андрей 3 99
Петров Василий 3 99
Иванов Роман 14 75
Иванов Иван 27 76
Петров Василий 99
Сергеев Андрей 99
Иванов Иван 76
Иванов Роман 75
Иванов Сергей 75
Сергеев Петр 74

N

В условиях предыдущей задачи выведите в порядке возрастания номера школ, в которых есть хотя бы один победитель олимпиады.

Ввод Вывод
6
Иванов Сергей 13 80
Сергеев Петр 26 70
Сергеев Андрей 35 80
Петров Василий 13 80
Иванов Роман 35 70
Иванов Иван 26 70
13 35

O

В условиях предыдущей задачи выведите в порядке возрастания номера школ, средний балл учащихся которых выше, чем средний балл всех участников олимпиады (то есть необходимо вычислить средний балл для каждой школы и средний балл по всем участникам).

Ввод Вывод
6
Иванов Сергей 13 45 
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20

P

В условиях предыдущей задачи выведите в порядке возрастания номера школ, средний балл учащихся которых максимален (то есть необходимо вычислить средний балл для каждой школы и вывести те школы, средний балл для которых максимален).

Ввод Вывод
6
Иванов Сергей 13 45 
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20

Q

В условиях предыдущей задачи выведите номера школ, из которых был хотя бы один участник олимпиады, в порядке убывания количества участников олимпиады из этих школ. Если из двух школ было одинаковое число участников, то их номера выводятся в порядке возрастания номера школы.

Ввод Вывод
6
Иванов Сергей 13 45 
Сергеев Петр 70 45
Сергеев Андрей 20 55
Петров Василий 14 55
Иванов Роман 13 40
Иванов Иван 70 60
13 70 14 20

R

В условиях предыдущей задачи выведите номера школ, из которых был хотя бы один участник олимпиады, в порядке убывания среднего балла участников олимпиады из этих школ. Если для двух школ средний балл участников совпадает, то их номера выводятся в порядке возрастания номера школы.

Ввод Вывод
6
Иванов Сергей 13 45 
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20 70 13

S

В условиях предыдущей задачи выведите в порядке возрастания номера школ, из которых наибольшее количество участников стало победителями олимпиады.

Ввод Вывод
6
Иванов Сергей 13 70
Сергеев Петр 13 60
Сергеев Андрей 20 70
Петров Василий 20 70
Иванов Роман 70 60
Иванов Иван 70 60
20

T

В Государственную Думу Федерального Собрания Российской Федерации выборы производятся по партийным спискам. Каждый избиратель указывает одну партию, за которую он отдает свой голос. В Государственную Думу попадают партии, которые набрали не менее 7% от числа голосов избирателей.

Дан список партий и список голосов избирателей. Выведите список партий, которые попадут в Государственную Думу.

Программа получает на вход количество партий N (N≤20). Затем идут названия N партий, по одному названию в строке. Названия могут быть произвольными строками, возможно, содержащими пробелы.

Далее идет количество голосов избирателей M. В следующих M строках указаны названия партий, за которые проголосовали избиратели, по одному названию в строке. Названия могут быть только строками из первого списка.

Программа должна вывести названия партий, получивших не менее 7% от числа голосов в том порядке, в котором они следуют в первом списке.

Ввод Вывод
3
Party one
Party two
Party three
15
Party one
Party one
Party three
Party one
Party one
Party three
Party two
Party one
Party three
Party three
Party one
Party one
Party three
Party three
Party one
Party one
Party three

U

Формат входных данных аналогичен предыдущей задаче. Выведите список всех партий, участвовавших в выборах, отсортировав его в порядке убывания количества голосов избирателей, а при равном количестве голосов - в лексикографическом порядке.

Ввод Вывод
3
Party one
Party two
Party three
5
Party one
Party two
Party three
Party two
Party three
Party three
Party two
Party one

V

В выборах Президента Российской Федерации побеждает кандидат, набравший свыше половины числа голосов избирателей. Если такого кандидата нет, то во второй тур выборов выходят два кандидата, набравших наибольшее число голосов.

Программа получает на вход количество голосов избирателей M. Далее идет M строк, каждая из которых содержит имя кандидата, за которого отдал голос один избиратель. Известно, что общее число кандидатов не превосходит 20, но в отличии от предыдущих задач список кандидатов явно не задан.

Если есть кандидат, набравший более 50% голосов, программа должна вывести его имя. Если такого кандидата нет, программа должна вывести имя кандидата, занявшего первое место, затем имя кандидата, занявшего второе место.

Ввод Вывод
3
Полуэкт Варфоломеев
Варфоломей Полуэктов
Полуэкт Варфоломеев
Полуэкт Варфоломеев
6
Полуэкт Варфоломеев
Варфоломей Виссарионов
Виссарион Полуэктов
Варфоломей Виссарионов
Варфоломей Виссарионов
Полуэкт Варфоломеев
Варфоломей Виссарионов
Полуэкт Варфоломеев

W

Статья 83 закона “О выборах депутатов Государственной Думы Федерального Собрания Российской Федерации” определяет следующий алгоритм пропорционального распределения мест в парламенте.

Необходимо распределить 450 мест между партиями, участвовавших в выборах. Сначала подсчитывается сумма голосов избирателей, поданных за каждую партию и подсчитывается сумма голосов, поданных за все партии. Эта сумма делится на 450, получается величина, называемая “первое избирательное частное” (смысл первого избирательного частного - это количество голосов избирателей, которое необходимо набрать для получения одного места в парламенте).

Далее каждая партия получает столько мест в парламенте, чему равна целая часть от деления числа голосов за данную партию на первое избирательное частное.

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

На вход программе подается количество партий N, участвовавших в выборах, N≤20. Далее идет N строчек, каждая строчка содержит название партии (строка, возможно, содержащая пробелы), затем, через пробел, количество голосов, полученных данной партией – число, не превосходящее 108.

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

Ввод Вывод
3
Party One 100000
Party Two 200000
Party Three 400000
Party One 64
Party Two 129
Party Three 257

X

Для поступления в вуз абитуриент должен предъявить результаты трех экзаменов в виде ЕГЭ, каждый из них оценивается целым числом от 0 до 100 баллов. При этом абитуриенты, набравшие менее 40 баллов (неудовлетворительную оценку) по любому экзамену из конкурса выбывают. Остальные абитуриенты участвуют в конкурсе по сумме баллов за три экзамена.

В конкурсе участвует N человек, при этом количество мест равно K. Определите проходной балл, то есть такое количество баллов, что количество участников, набравших столько или больше баллов не превосходит K, а при добавлении к ним абитуриентов, набравших наибольшее количество баллов среди непринятых абитуриентов, общее число принятых абитуриентов станет больше K.

Программа получает на вход количество абитуриентов N и количество мест K. Далее идет N строк, каждая из которых состоит из имени (текстовая строка содержащая произвольное число пробелов) и трех чисел от 0 до 100, разделенных пробелами.

Программа должна вывести проходной балл в конкурсе. Выведенное значение должно быть минимальным баллом, который набрал абитуриент, прошедший по конкурсу.

Также возможны две ситуации, когда проходной балл не определен.

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

Если количество абитуриентов, имеющих равный максимальный балл больше чем K, программа должна вывести число 1.

Ввод Вывод
9 5
Иванов Сергей 70 70 70
Сергеев Петр 100 100 0
Петров Василий 70 60 70
Васильев Андрей 70 60 70
Андреев Денис 100 30 100
Денисов Роман 50 50 50
Романов Иван 60 70 70
Ким Чен Ир 50 50 50
Ким Ир Сен 40 40 40
200
2 1
Иванов Сергей 40 40 40
Сергеев Петр 100 100 39
0
2 1
Иванов Сергей 60 60 60
Сергеев Петр 100 40 40
1

Y

В условиях предыдущей задачи определите полупроходной балл, то есть такое значение балла, что количество абитуриентов, набравших балл выше полупроходного, меньше K, а количество абитурентов, набравших балл выше или равный полупроходному, больше K.

Программа должна вывести значение полупроходного балла, если полупроходного балла не существует, программа должна вывести одно число 0.

Ввод Вывод
9 5
Иванов Сергей 70 70 70
Сергеев Петр 100 100 0
Петров Василий 70 60 70
Васильев Андрей 70 60 70
Андреев Денис 100 30 100
Денисов Роман 50 50 50
Романов Иван 60 70 70
Ким Чен Ир 50 50 50
Ким Ир Сен 40 40 40
150
3 1
Иванов Сергей 50 50 50
Сергеев Петр 100 100 100
Ким Ир Сен 100 0 100
0

Z

В олимпиаде участвовало N человек, каждый из которых мог набрать от 0 до 100 баллов. По положению об олимпиаде жюри может наградить не более 45% от числа участников, округляя их число до целого при необходимости вниз.

При этом если последний участник, попавший в 45% набирает столько же баллов, сколько первый участник, не попавший в 45%, то решение по этим участникам, и всем участникам, набравшим такой балл принимается следующим образом:

Все данные участники объявляются призерами, если набранный ими балл больше половины от максимально возможного балла.

Все эти участники не объявляются призерами, если набранный ими балл не больше половины от максимально возможного.

Программа получает на вход количество участников олимпиады N, далее идет N строчек, содержащих имя участника (текстовая строка с произвольным числом пробелов) и набранный данным участником балл через пробел.

Программа должна вывести минимальный балл, который получил участник олимпиады, ставший ее призером.

Ввод Вывод
9
Иванов Сергей 70
Сергеев Петр 30
Петров Василий 40
Васильев Андрей 80
Андреев Денис 50
Денисов Роман 90
Романов Иван 70
Ким Чен Ир 60
Ким Ир Сен 100
70
9
Иванов Сергей 50
Сергеев Петр 70
Петров Василий 40
Васильев Андрей 10
Андреев Денис 50
Денисов Роман 20
Романов Иван 30
Ким Чен Ир 70
Ким Ир Сен 100
70
9
Иванов Сергей 30
Сергеев Петр 60
Петров Василий 20
Васильев Андрей 100
Андреев Денис 30
Денисов Роман 80
Романов Иван 20
Ким Чен Ир 40 
Ким Ир Сен 10
40