Ошибка конца файла вы уже считали все строки из входных данных а пытаетесь считать еще
Программы могут взаимодействовать с файлами, например, читать данные из файлов и выводить результат в текстовый файл.
Смотрите также:
A: A + B
Во входном файле записано два целых числа, каждое в отдельной строке. Выведите в выходной файл их сумму.
Ввод | Вывод |
---|
K: Шифр Цезаря - 2
Зашифруйте данный текстовый файл шифром Цезаря, при этом символы первой строки файла должны циклически сдвигаться на 1, второй строки — на 2, третьей строки — на три и т.д.
В этой задаче удобно считывать файл построчно, шифруя каждую строку в отдельности.
Примечание : в этой задаче имеются ввиду только символы-буквы. Знаки препинания, цифры, пробелы меняться не должны.
Ввод | Вывод |
---|
Программа должна вывести названия всех партий и количество голосов в парламенте, полученных данной партией. Названия необходимо выводить в том же порядке, в котором они шли во входных данных.
Ввод | Вывод |
---|
Для поступления в вуз абитуриент должен предъявить результаты трех экзаменов в виде ЕГЭ, каждый из них оценивается целым числом от 0 до 100 баллов. При этом абитуриенты, набравшие менее 40 баллов (неудовлетворительную оценку) по любому экзамену из конкурса выбывают. Остальные абитуриенты участвуют в конкурсе по сумме баллов за три экзамена.
В конкурсе участвует N человек, при этом количество мест равно K. Определите проходной балл, то есть такое количество баллов, что количество участников, набравших столько или больше баллов не превосходит K, а при добавлении к ним абитуриентов, набравших наибольшее количество баллов среди непринятых абитуриентов, общее число принятых абитуриентов станет больше K.
Программа получает на вход количество абитуриентов N и количество мест K. Далее идет N строк, каждая из которых состоит из имени (текстовая строка содержащая произвольное число пробелов) и трех чисел от 0 до 100, разделенных пробелами.
Программа должна вывести проходной балл в конкурсе. Выведенное значение должно быть минимальным баллом, который набрал абитуриент, прошедший по конкурсу.
Также возможны две ситуации, когда проходной балл не определен.
Если будут зачислены все абитуриенты, не имеющие неудовлетворительных оценок, программа должна вывести число 0.
Если количество абитуриентов, имеющих равный максимальный балл больше чем K, программа должна вывести число 1.
В условиях предыдущей задачи определите полупроходной балл, то есть такое значение балла, что количество абитуриентов, набравших балл выше полупроходного, меньше K, а количество абитурентов, набравших балл выше или равный полупроходному, больше K.
Программа должна вывести значение полупроходного балла, если полупроходного балла не существует, программа должна вывести одно число 0.
Ввод | Вывод |
---|
В олимпиаде участвовало N человек, каждый из которых мог набрать от 0 до 100 баллов. По положению об олимпиаде жюри может наградить не более 45% от числа участников, округляя их число до целого при необходимости вниз.
При этом если последний участник, попавший в 45% набирает столько же баллов, сколько первый участник, не попавший в 45%, то решение по этим участникам, и всем участникам, набравшим такой балл принимается следующим образом:
Все данные участники объявляются призерами, если набранный ими балл больше половины от максимально возможного балла.
Все эти участники не объявляются призерами, если набранный ими балл не больше половины от максимально возможного.
Программа получает на вход количество участников олимпиады N, далее идет N строчек, содержащих имя участника (текстовая строка с произвольным числом пробелов) и набранный данным участником балл через пробел.
На серьезных олимпиадах, а также во многих других ситуациях, вам надо читать данные не с клавиатуры, а из файла, и выводить данные в файл, а не на «экран».
(В таком случае, конечно, вы должны знать имена этих файлов; в задачах они, как правило, указаны; на алгопроге имена файлов почти всегда — input.txt для входных данных и output.txt для выходных.)
Во многих языках программирования ввод/вывод данных через файлы очень похож на ввод/вывод с клавиатуры — те же команды, только немного другие параметры. В питоне, к сожалению, отличия более существенны.
Смотрите также:
Открытие файла
Для каждого файла, с которым необходимо производить операции ввода-вывода, нужно связать специальный объект — поток. Открытие файла осуществляется функцией open , которой нужно передать минимум два параметра. Параметр file имеет значение типа str , в котором записано имя открываемого файла. Параметр mode это значение типа str , которое равно "r" , если файл открывается для чтения данных (read), "w" , если на запись (write), при этом содержимое файла очищается, и "a" — для добавления данных в конец файла (append).
Функция open возвращает ссылку на файловый объект, которую нужно записать в переменную, чтобы потом через данный объект использовать методы ввода-вывода. Например: То же самое можно записать и компактнее:
Закрытие файла
После окончания работы с файлом необходимо закрыть его при помощи метода close() .
2.8.3. Как это использовать в олимпиадах¶
Вторая причина использовать файлы — вы намного легче можете «жонглировать» тестами. Вы можете записать несколько тестов в другой, вспомогательный, файл, и просто копировать нужный тест во входной файл. Более того, в большинстве случаев вы можете даже хранить много тестов прямо во входном файле.
А именно, во многих задачах у вас чтение данных идет не до конца файла — например, вы считываете только два числа, или только одну строку, или вам задается число N и дальше N чисел — во всех этих случаях программе не важно, что идет после этих данных. Вы там можете хранить другие тесты, а потом, когда вам нужно, переносите просто нужный тест в самое начало файла.
(А вообще, можете даже написать программу так, чтобы она обрабатывала вообще все тесты, которые есть во входном файле — это так называемый мультитест. На тестирующем сервере будет только один тест, и программа отработает только его, а при вашем тестировании программа будет сразу запускаться на многих тестах. А еще, бывают задачи, где во входных данных сразу мультитест, т.е. задается сразу много тестов. Тогда тем более вы можете тестировать сразу на многих тестах.)
По ходу дела, я очень плохо понял тему указателей и работы с памятью, и теперь вот никак не могу сделать, казалось бы простейшую вещь.
Есть текстовый файл со словами, записанными по одному слову в строчку. Нужно считать каждую строку в массив arr[]. Пробовал и fscanf и fgetsе - не получается :(
Подскажите, что я не так делаю, и как правильно?
На сколько я понял вы пытаетесь прочитать строку из файла и сохранить ее как элемент массива arr.
Но делаете это не правильно.
Ваша ошибка в том, что fscanf/fgets не выделяет память для хранения строки, она использует тот буфер, который вы ей предоставите. Но вы ничего не предоставляете.
Вам нужно для каждого элемента arr выделить память под строку:
arr[i] = (char*)malloc(sizeof(char) * BUFLEN);
где BUFLEN - некоторая целочисленная константа, обозначающая максимальную длину строки.
Тогда чтение из файла, как реализовано у вас пройдет.
В конце память выделенную с помощью malloc нужно освободить с помощью вызова free для каждого элемента массива arr.
И не забывайте обрабатывать ошибки выделения памяти и возвраты файловых операций.
fscanf со спецификатором формата "%s" считывает не строку, а слово - в строке может быть много слов. Для чтения строки используйте fgets, либо читайте посимвольно fgetc.
Когда заработает, потренируйтесь на файле, содержащем строку из более чем BUFLEN символов и попытайтесь найти корректный выход из этой ситуации.
Спасибо за ответ!
Функция fscanf мне вполне подходит, т.к. в моих исходных данных все строки состоят из одного слова. С выделением памяти, я кажется разобрался. В цикле, перед тем как использовать fscanf я выделяю память для элемента массива.
Но с высвобождением - не уверен что делаю верно. Правильно ли высвобождается память в этом цикле?
В итоге программа работает, но не совсем корректно. Я вывожу на экран не пустые ячейки массива с помощью цикла:
И получаю результат:
Откуда берутся лишние три строки, и ошибка сегментации?
romajke, Проверка
if (arr[i])
в вашем случае не срабатывает.
Потому что, чтоб в arr[i] были нули (т.е. условие ложно) их нужно туда присвоить, а у вас этого нет.
Перед чтением из файла, присвойте всем значениям arr нули.
Потом, когда будете выделять память для строк значащие элементы примут значения !=0, а пустые строки так и останутся нулями и условие отработает как надо.
Все верно, это помогло. Спасибо!
Код работает корректно.
А что с памятью? Верно ли я ее высвобождаю циклом
Или нужно как то по другому?
romajke, Раз уж вы выделяете память не для всех элементов массива, то и освобождать нужно только их: добавьте перед free условие:
if(arr[i])
res2001, да. Это понятно, теперь код полностью корректно работает. Но не совсем понятна работа fscanf в данном контексте. Если я, например, не сразу считываю в элемент массива arr[], а предварительно записываю данные в созданную переменную типа char word[SIZE]:
то код уже работает не корректно.
Все элементы массива заполняются последней считанной строкой:
Если я правильно понимаю, то элементы массива получают ссылку на word, и получают значение которое хранится по адресу переменной word. Но как это изменить - не пойму. Как передать в элемент массива именно значение word?
Проблему решил, с помощью использования strcpy, но понимание не пришло :(
Буду очень благодарен, если объясните.
romajke, Операция
arr[k]=word;
Не приводит к копированию строки из одного буфера в другой - этим вы сохраняете адрес буфера word в массив. Поэтому у вас все элементы массива будут ссылаться на один и тот же буфер. Кроме того, что при этом вы получаете не правильный результат, у вас еще образуется утечка памяти, т.к. указатели, на выделенную с помощью malloc память, потеряны и во free вы передаете указатель на word, что при этом освобождается . не известно и поведение не предсказуемо.
Вы правильно решили проблему, явно копируя строку с помощью strcpy. Аналогично нужно делать и с любыми другими массивами только использовать функцию memcpy (с помощью memcpy можно копировать и строки то же, она в этом плане универсальнее чем strcpy).
Ну и на последок - в Си как таковых строк нет, строка - это массив байт, оканчивающийся байтом со значением 0 (нулевой байт то же является частью массива/строки), поэтому и думать нужно о них как о массивах. Различие в том, что под строкой вы понимаете какую-то самостоятельную единую сущность, а это не так - это набор сущностей (байт).
Для чего нам нужно уметь работать с файлами в Паскаль?
Ранее мы рассмотрели ввод и вывод данных в Паскале. Он осуществлялся вручную, с помощью клавиатуры и результат мы также смотрели сами в окне вывода. Для того чтобы быть уверенным в том, что программа написана правильно необходимо протестировать её. Для того чтобы специальные тестирующие системы автоматически проверяли решение необходимо, ввод и вывод данных осуществлять из текстовых файлов. По такой же схеме тестируются задачи на всех этапах республиканских олимпиад по информатике.
Ввод мы будем осуществлять из файла input.txt
Вывод будем производить в файл output.txt
B: Числа могут быть где угодно
Во входном файле записано два целых числа, которые могут быть разделены пробелами и концами строк. Выведите в выходной файл их сумму.
Указание. Считайте весь файл в строковую переменную при помощи метода read() и разбейте ее на части при помощи метода split() .
Ввод | Вывод |
---|
2.8.1.1. Чтение по аналогии с input¶
Чтобы считать данные из файла, вам надо сначала «открыть файл на чтение». Это делается командой
Здесь input.txt — файл, откуда надо считать данные, параметр "r" указывает, что вы собираетесь именно читать (read) данные, а не записывать (write, см. ниже).
Далее с полученным объектом f можно работать. Самая простая операция — f.readline() — возвращает очередную строку файла. Это полный аналог input() , за исключением того, что на конце полученной строки будет специальный символ перевода строки "\n" (при выводе строки на экран он не будет заметен, но переведет лишний раз строку). Как правило, он вам будет мешать, но вы его можете легко убрать методом .rstrip("\n") , например, f.readline().rstrip("\n") .
Пример. Пусть во входном файле два числа по одному на строке. С клавиатуры вы бы считывали так:
Тогда из файла надо считывать так:
Аналогично, если два числа в одной строке. С клавиатуры это считывается так:
Тогда из файла считываем так:
Более сложный пример: сначала число N , а потом N строк по одному числу в каждой. С клавиатуры:
Вывод данных в файл
Данные выводятся в файл при помощи метода write , которому в качестве параметра передается одна строка. Этот метод не выводит символ конца строки '\n' (как это делает функция print при стандартном выводе), поэтому для перехода на новую строку в файле необходимо явно вывести символ '\n' .
C: Обращение строки
Во входном файле записана одна текстовая строка, возможно, содержащая пробелы. Выведите эту строку в обратном порядке.
Строка во входном файле заканчивается символом конца строки '\n' .
Ввод | Вывод |
---|
Чтение данных из файла
Для файла, открытого на чтение данных, можно вызывать следующие методы, позволяющие читать данные из файла.
Метод readline() считывает одну строку из файла (до символа конца строки '\n' , возвращается считанная строка вместе с символом '\n' . Если считывание не было успешно (достигнут конец файла), то возвращается пустая строка. Для удаления символа '\n' из конца файла удобно использовать метод строки rstrip() . Например: s = s.rstrip() .
Метод readlines() считывает все строки из файла и возвращает список из всех считанных строк (одна строка — один элемент списка). При этом символы '\n' остаются в концах строк.
Метод read() считывает все содержимое из файла и возвращает строку, которая может содержать символы '\n' . Если методу read передать целочисленный параметр, то будет считано не более заданного количества символов. Например, считывать файл побайтово можно при помощи метода read(1) .
Упражнения
G: Поиск символа
Определите, есть ли во входном файле символ '@' . Выведите слово YES или NO .
Экспериментальный раздел
Наберите программу в среде программирования Free Pascal, запустите ее на исполнение. У Вас может появится ошибка типа:
exited with exitcode=2 (для Free Pascal), если файла input.txt нет.
Создайте в папке, где сохранена ваша программа файл input.txt и введите в него число.
В этой же папке, после удачного (без ошибок) запуска программы на исполнение должен появиться файл output.txt.
Создание входного файла
Нажать F3, в открывшемся окне диалога Открыть файл написать имя входного файла (например, input.txt).
Если файл не существовал, среда Паскаля откроет пустое окошко с нужным именем. Ввести данные.
Не забыть нажать F2 — сохранить изменения.
Открытие входного и выходного файлов
Переместить курсор на строку в одиночных кавычках, содержащую имя файла, например 'input.txt' в операторе assign.
Нажать Ctrl+Enter.
После изменения входных данных не забыть сохранить файл - F2.
Переход между окнами входных, выходных данных и текстом программы осуществляется нажатием клавиши F6.
Выходные данные:
В единственную строку выходного файла вывести сумму этих чисел.
Тесты Посмотреть решение
Выходные данные:
В первой строке выходного файла должно быть число В.
Во второй строке выходного файла число А.
Тесты Посмотреть решение
Задание 4. Имеется текстовый файл на 10 строк. Вывести на экран:
а) его первую строку;
б) его пятую строку;
в) его первые 5 строк;
г) его строки с s1-й no s2-ю (s1 и s2 записаны в 11 строке входного файла через пробел);
д) весь файл.
Тесты Посмотреть решение
Задание 5. Сформируйте массив целых чисел (значения для него взять из файла, они записаны во 2-ой строке входного файла). В первой строке этого файла указано количество элементов массива (n <=50). Вывести в выходной файл количество отрицательных чисел массива, его наименьшее и наибольшее значения.
Во второй строке входного файла содержатся N чисел через пробел - элементы массива
Выходные данные:
Первая строка - количество отрицательных элементов массива
Задание 6. Имеются два текстовых файла, состоящие из одной строки. Переписать строку первого файла во второй, а строку второго файла — в первый. Использовать вспомогательный файл.
Program z6;
var s,t:string;
Begin
assign(input,'t1.txt');
reset(input);
read(s);
close(input);
assign(input,'t2.txt');
reset(input);
read(t);
close(input);
assign (output,'t.txt');
rewrite(output);
writeln(s);
close(output);
assign (output,'t1.txt');
rewrite(output);
writeln(t);
close(output);
assign(input,'t.txt');
reset(input);
read(s);
close(input);
assign (output,'t2.txt');
rewrite(output);
writeln(s);
close(output);
End.
Для каждого входного файла
Первая строка содержит число n - количество строк
Вторая строка - n-ая строки содержат текст
Выходные данные:
Для каждого выходного файла
Первая строка - n-ая строка содержат текст
Тесты Посмотреть решение
Задание 8. Даны три целых числа. Определить, имеется ли среди них хотя бы
одна пара равных между собой чисел.
Задание 9. Даны три числа. Определить, существует ли треугольник, сторонами которого являются эти числа, и если существует, найти его площадь.
Выходные данные:
В первой строке запись "да" или "нет"
Во второй строке значение площади, если треугольник существует
Тесты Посмотреть решение
D: Построчное обращение
Выведите все строки данного файла в обратном порядке. Для этого считайте список всех строк при помощи метода readlines() .
Последняя строка входного файла обязательно заканчивается символом '\n' .
Ввод | Вывод |
---|
Ввод | Вывод |
---|
H: Сумма чисел в строкaх
Дан файл, каждая строка которого может содержать одно или несколько целых чисел, разделенных одним или несколькими пробелами.
Вычислите сумму чисел в каждой строке и выведите эту сумму (для каждой строки выводится сумма чисел в этой строке).
В данной задаче удобно считывать данные построчно.
Ввод | Вывод |
---|
Пример
Следующая программа считывает все содержимое файла input.txt , записывает его в переменную s , а затем выводит ее в файл output.txt .
А вот аналогичная программа, но читающая данные посимвольно:
D: Построчное обращение
Выведите все строки данного файла в обратном порядке. Для этого считайте список всех строк при помощи метода readlines() .
Последняя строка входного файла обязательно заканчивается символом '\n' .
Ввод | Вывод |
---|
Ввод | Вывод |
---|
A: A + B
Во входном файле записано два целых числа, каждое в отдельной строке. Выведите в выходной файл их сумму.
Ввод | Вывод |
---|
I: Сумма чисел в файле
В файле могут быть записаны десятичные цифры и все, что угодно. Числом назовем последовательность цифр, идущих подряд (т.е. число всегда неотрицательно).
Вычислите сумму всех чисел, записанных в файле. В данной задаче удобно считывать данные посимвольно.
Ввод | Вывод |
---|
2.8.1. Ввод данных¶
F: Длинные строки
В выходной файл выведите все строки наибольшей длины из входного файла, не меняя их порядок.
В данной задаче удобно считать список строк входного файла целиком при помощи метода readlines() .
Ввод | Вывод |
---|
J: Статистика по файлу
Дан файл. Определите сколько в нем букв (латинского алфавита), слов, строк. Выведите три найденных числа в формате, аналогичном приведенному в примере.
Для экономии памяти читайте файл посимвольно, то есть не сохраняя целиком в памяти файл или отдельные его строки.
Ввод | Вывод |
---|
Ввод | Вывод |
---|
2.8.1.2. Чтение до конца файла¶
Пока файл не кончился, функция readline будет вам всегда возвращать непустую строку (в ней будет как минимум символ "\n" ). Как только файл кончится, readline вернет пустую строку. Поэтому читать до конца файла можно так:
Альтернативный вариант — можно сразу считать весь файл в массив строк:
Теперь data — это массив строк, каждый элемент которого — это очередная строка из входного файла. Например, если в файле было написано
то data будет содержать массив ["1 2 3\n", "4 5 6\n", "some text\n"] , и дальше вы можете работать с этим массивом как вам надо.
Еще можно написать open("input.txt", "r").read() , это считает весь файл в одну большую строку (в том числе в середине этой строки могут быть символы перевода строки, но это все равно будет одна большая строка, а не массив строк).
Открытие файла
Для каждого файла, с которым необходимо производить операции ввода-вывода, нужно связать специальный объект — поток. Открытие файла осуществляется функцией open , которой нужно передать минимум два параметра. Параметр file имеет значение типа str , в котором записано имя открываемого файла. Параметр mode это значение типа str , которое равно "r" , если файл открывается для чтения данных (read), "w" , если на запись (write), при этом содержимое файла очищается, и "a" — для добавления данных в конец файла (append).
Функция open возвращает ссылку на файловый объект, которую нужно записать в переменную, чтобы потом через данный объект использовать методы ввода-вывода. Например: То же самое можно записать и компактнее:
Для организации вывода данных в файл надо:
assign(output,'output.txt').
2. Открыть файл для записи:
rewrite(output);
3.Для вывода используем операторы write и writeln также, как и было до сих пор.
Задание 1. Перенаправление. Прочитайте число n из файла input.txt и выведите его в файл output.txt
Program z1;
var a:longint;
Begin
assign(input,'input.txt');
reset(input);
read(a);
close(input);
assign (output,'output.txt');
rewrite(output);
writeln(a);
close(output);
End.
Вывод данных в файл
Данные выводятся в файл при помощи метода write , которому в качестве параметра передается одна строка. Этот метод не выводит символ конца строки '\n' (как это делает функция print при стандартном выводе), поэтому для перехода на новую строку в файле необходимо явно вывести символ '\n' .
I: Сумма чисел в файле
В файле могут быть записаны десятичные цифры и все, что угодно. Числом назовем последовательность цифр, идущих подряд (т.е. число всегда неотрицательно).
Вычислите сумму всех чисел, записанных в файле. В данной задаче удобно считывать данные посимвольно.
Ввод | Вывод |
---|
Для организации ввода данных из файла надо:
assign(input,'input.txt').
2. Открыть файл для чтения:
reset(input);
3. При работе нужно понимать и помнить отличия процедуры read, от readln. Если в файле данные записаны в одной строке, через пробел, то мы пользуемся все время процедурой read столько раз, сколько чисел нужно прочитать.
Если же строк несколько, то когда доходим до символа стоящего в конце строки, используем readln. В результате чего будет считано последнее число строки и курсор переместится на новую.
read(a); readln(a);
Например, указан следующий формат ввода:
В первой строке ввода находятся три числа через пробел R – радиус основания торта, N – число коробок, С – стоимость за 1 см 2 основания коробки.
Упражнения
H: Сумма чисел в строкaх
Дан файл, каждая строка которого может содержать одно или несколько целых чисел, разделенных одним или несколькими пробелами.
Вычислите сумму чисел в каждой строке и выведите эту сумму (для каждой строки выводится сумма чисел в этой строке).
В данной задаче удобно считывать данные построчно.
Ввод | Вывод |
---|
Чтение данных из файла
Для файла, открытого на чтение данных, можно вызывать следующие методы, позволяющие читать данные из файла.
Метод readline() считывает одну строку из файла (до символа конца строки '\n' , возвращается считанная строка вместе с символом '\n' . Если считывание не было успешно (достигнут конец файла), то возвращается пустая строка. Для удаления символа '\n' из конца файла удобно использовать метод строки rstrip() . Например: s = s.rstrip() .
Метод readlines() считывает все строки из файла и возвращает список из всех считанных строк (одна строка — один элемент списка). При этом символы '\n' остаются в концах строк.
Метод read() считывает все содержимое из файла и возвращает строку, которая может содержать символы '\n' . Если методу read передать целочисленный параметр, то будет считано не более заданного количества символов. Например, считывать файл побайтово можно при помощи метода read(1) .
F: Длинные строки
В выходной файл выведите все строки наибольшей длины из входного файла, не меняя их порядок.
В данной задаче удобно считать список строк входного файла целиком при помощи метода readlines() .
Ввод | Вывод |
---|
Задачи для самостоятельного решения
1. Создайте текстовый файл на диске, заполненный N целыми числами, записанными через пробел.
а) Выведите на экран сумму этих чисел, среднее арифметическое и произведение;
б) то же вывести в файл в отдельные строки.
2. Дан файл, заполненный целыми числами через пробел. Вывести в новый файл все:
а) четные числа;
б) числа, делящиеся на 3 и не делящиеся на 7.
3. Имеется текстовый файл, состоящий из n строк, записанных в столбик. Переписать его строки в другой файл. Порядок строк во втором файле должен:
а) совпадать с порядком строк в заданном файле;
б) быть обратным по отношению к порядку строк в заданном файле.
4. Имеется текстовый файл, состоящий из n строк, записанных в столбик. Все четные строки этого файла записать во второй файл, а нечетные — в третий файл. Порядок следования строк сохраняется.
Программы могут взаимодействовать с файлами, например, читать данные из файлов и выводить результат в текстовый файл.
2.8.2. Вывод¶
Для вывода данных вы можете открыть файл на вывод:
(буква w обозначает write, запись). И дальше можно использовать f в качестве опционального аргумента уже знакомой вам функции print :
После окончания всего вывода рекомендуется вызвать f.close() , чтобы данные реально оказались записаны на диск (хотя в большинстве случаев все работает и без этого).
B: Числа могут быть где угодно
Во входном файле записано два целых числа, которые могут быть разделены пробелами и концами строк. Выведите в выходной файл их сумму.
Указание. Считайте весь файл в строковую переменную при помощи метода read() и разбейте ее на части при помощи метода split() .
Ввод | Вывод |
---|
Пример
Следующая программа считывает все содержимое файла input.txt , записывает его в переменную s , а затем выводит ее в файл output.txt .
А вот аналогичная программа, но читающая данные посимвольно:
L: Максимальный балл по классам
В олимпиаде по информатике принимало участие несколько человек. Информация о результатах олимпиады записана в файле, каждая строка которого имеет вид:
фамилия имя класс балл.
Фамилия и имя — текстовые строки, не содержащие пробелов. Класс - одно из трех чисел 9, 10, 11. Балл - целое число от 0 до 100.
Победителем олимпиады становится человек, набравший больше всех баллов. Победители определяются независимо по каждому классу.
Определите количество баллов, которое набрал победитель в каждом классе. Гарантируется, что в каждом классе был хотя бы один участник.
Выведите три числа: баллы победителя олимпиады по 9 классу, по 10 классу, по 11 классу.
В этой задаче файл необходимо считывать построчно, не сохраняя содержимое файла в памяти целиком.
Ввод | Вывод |
---|
Программа должна вывести названия всех партий и количество голосов в парламенте, полученных данной партией. Названия необходимо выводить в том же порядке, в котором они шли во входных данных.
Ввод | Вывод |
---|
Для поступления в вуз абитуриент должен предъявить результаты трех экзаменов в виде ЕГЭ, каждый из них оценивается целым числом от 0 до 100 баллов. При этом абитуриенты, набравшие менее 40 баллов (неудовлетворительную оценку) по любому экзамену из конкурса выбывают. Остальные абитуриенты участвуют в конкурсе по сумме баллов за три экзамена.
В конкурсе участвует N человек, при этом количество мест равно K. Определите проходной балл, то есть такое количество баллов, что количество участников, набравших столько или больше баллов не превосходит K, а при добавлении к ним абитуриентов, набравших наибольшее количество баллов среди непринятых абитуриентов, общее число принятых абитуриентов станет больше K.
Программа получает на вход количество абитуриентов N и количество мест K. Далее идет N строк, каждая из которых состоит из имени (текстовая строка содержащая произвольное число пробелов) и трех чисел от 0 до 100, разделенных пробелами.
Программа должна вывести проходной балл в конкурсе. Выведенное значение должно быть минимальным баллом, который набрал абитуриент, прошедший по конкурсу.
Также возможны две ситуации, когда проходной балл не определен.
Если будут зачислены все абитуриенты, не имеющие неудовлетворительных оценок, программа должна вывести число 0.
Если количество абитуриентов, имеющих равный максимальный балл больше чем K, программа должна вывести число 1.
В условиях предыдущей задачи определите полупроходной балл, то есть такое значение балла, что количество абитуриентов, набравших балл выше полупроходного, меньше K, а количество абитурентов, набравших балл выше или равный полупроходному, больше K.
Программа должна вывести значение полупроходного балла, если полупроходного балла не существует, программа должна вывести одно число 0.
Ввод | Вывод |
---|
В олимпиаде участвовало N человек, каждый из которых мог набрать от 0 до 100 баллов. По положению об олимпиаде жюри может наградить не более 45% от числа участников, округляя их число до целого при необходимости вниз.
При этом если последний участник, попавший в 45% набирает столько же баллов, сколько первый участник, не попавший в 45%, то решение по этим участникам, и всем участникам, набравшим такой балл принимается следующим образом:
Все данные участники объявляются призерами, если набранный ими балл больше половины от максимально возможного балла.
Все эти участники не объявляются призерами, если набранный ими балл не больше половины от максимально возможного.
Программа получает на вход количество участников олимпиады N, далее идет N строчек, содержащих имя участника (текстовая строка с произвольным числом пробелов) и набранный данным участником балл через пробел.
Закрытие файла
После окончания работы с файлом необходимо закрыть его при помощи метода close() .
C: Обращение строки
Во входном файле записана одна текстовая строка, возможно, содержащая пробелы. Выведите эту строку в обратном порядке.
Строка во входном файле заканчивается символом конца строки '\n' .
Ввод | Вывод |
---|
G: Поиск символа
Определите, есть ли во входном файле символ '@' . Выведите слово YES или NO .
Читайте также: