Информатика, 10 класс К. Ю. Поляков, Е. А. Еремин
Скачать 0.95 Mb.
|
int A[MAX]; Основная интрига состоит в том, что количество чисел точно неизвестно. Следовательно, нам нужно считать прочитанные значения и записывать их последовательно впервые ячейки массива. Если данные закончились, цикл чтения останавливается. Кроме того, нужно сделать защиту от слишком большого количества данных если 100 чисел уже записаны в массив, цикл должен остановиться, потому что следующие числа записывать некуда. Ниже приведены циклы чтения на языке C: N = 0 ; while ( N < MAX ) { r = fscanf ( Fin, "%d" , &A[N] ); if ( r < 1 ) break ; N ++; } и на C++: N = 0 ; while ( N < MAX && !Fin.eof() ) { Fin >> A[N]; N ++; } Целая переменная N служит счётчиком прочитанных из файла чисел. Теперь нужно отсортировать первые N значений массива A (этот код вы уже можете написать самостоятельно) и вывести их во второй файл, открытый на запись ( Fout – указатель на файл Fout = fopen ( "output.txt" , "w" ); for ( i = 0 ; i < N; i++ ) fprintf ( Fout, "%d\n" , A[i] ); fclose ( Fout ); Вариант на C++ (здесь Fout – выходной файловый поток Fout.open ( "output.txt" ); for ( i = 0 ; i < N; i++ ) Fout << A[i] << endl; Fout.close(); Обработка строк Как известно, современные компьютеры бóльшую часть времени заняты обработкой символьной, а не числовой информации. Предположим, что в текстовом файле записаны данные о собаках, привезенных на выставку в каждой строчке кличка собаки, ее возраст (целое число) и порода, например, Мухтар 4 немецкая овчарка Все элементы отделяются друг от друга одним пробелом. Нужно вывести в другой файл сведения о собаках, которым меньше 5 лет. В этой задаче данные можно обрабатывать по одной строке (ненужно загружать все строки в оперативную память Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин http://kpolyakov.spb.ru 70 пока не конец файла (Fin) прочитать строку из файла Fin разобрать строку – выделить возраст если возраст < 5 то записать строку в файл Fout Здесь, как и раньше, Fin и Fout – файловые переменные, связанные с файлами, открытыми на чтение и запись соответственно (для C++ - входной и выходной файловые потоки. Сначала разберёмся с чтением символьных строк из файла. В языке С для этого используется функция fgets, которая принимает три параметра имя строки, размер строки и указатель на файл, откуда нужно читать fgets ( s, 80 , Fin ); Кроме того, эта функция может определить, успешно ли выполнено чтение – в случае неудачи она возвращает нулевой указатель. Поэтому цикл чтения вида пока не конец файла можно записать так while ( fgets(s, 80 , Fin) ) { ... } В языке C++ аналогично работает со строками функция getline: while ( getline(Fin, s) ) { ... } Теперь подумаем, как обработать прочитанную строку. Будем считать, что все данные корректны, то есть первый пробел отделяет кличку от возраста, а второй – возраст от породы. Тогда разбор строки можно выполнить так найти в строке пробел удалить из строки кличку с первым пробелом найти в строке пробел выделить возраст перед пробелом преобразовать возраст в числовой вид На языке C эти операции записываются всего в две строчки char s[ 80 ], *p; int age; ... p = strchr ( s, ' ' ); sscanf ( p+1, "%d" , &age ); Функция strchr (см. § 66. ) находит первый пробели записывает его адрес в переменую- указатель p. Затем функция sscanf читает из этой строки со следующего символа (первый аргумент) целое число (по формату %d) и записывает в память по адресу переменной age (третий аргумент. Таким образом, функция sscanf работает точно также, как и знакомая нам функция scanf, нов качестве источника данных использует не ввод с клавиатуры, а символьную строку из памяти. Вариант на языке C++ получается несколько длиннее string s, s1; int p, age; ... p = s.find ( ' ' ); s1 = s.substr ( p + 1 ); age = atoi ( s1.c_str() ); В переменную p записывается номер первого пробела в строке, затем во временную переменную- строку s1 записываем всю хвостовую часть исходной строки после пробела (возрасти породу собаки. Затем эта строка преобразуется в целое число с помощью функции atoi. Так как функция atoi остановится на первом нецифровом символе, всё, что записано после числа никак не влияет на результат. Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин http://kpolyakov.spb.ru 71 В результате работы приведённого выше фрагмента возраст собаки оказывается в переменной. Обратите внимание, что исходная строка s не изменяется, поэтому её можно использовать при выводе результата. Основной цикл будет выглядеть так Fin = fopen ( "input.txt" , "r" ); Fout = fopen ( "output.txt" , "w" ); while ( fgets(s, 80 , Fin) ) { p = strchr ( s, ' ' ); sscanf ( p + 1 , "%d" , &age ); if ( age < 5 ) fputs ( s, Fout ); } fclose ( Fout ); fclose ( Fin ); Fin.open ( "input.txt" ); Fout.open ( "output.txt" ); while ( getline(Fin, s) ) { p = s.find( ' ' ); s1 = s.substr ( p + 1 ); age = atoi ( s1.c_str() ); if ( age < 5 ) Fout << s << endl; } Fout.close(); Fin.close(); 1. Чем отличаются текстовые и двоичные файлы по внутреннему содержанию Можно ли сказать, что текстовый файл – это частный случай двоичного файла 2. Объясните принцип сэндвича» при работе с файлами. 3. Как выдумаете, почему открытый программой файл, как правило, блокируется и другие программы не могут получить к нему доступ 4. Почему рекомендуется вручную закрывать файлы, хотя при закрытии программы они закроются автоматически В каких ситуациях это может быть важно 5. Что такое файловая переменная Почему для работы с файлом используют не имя файла, а файловую переменную 6. В каком случае одна и та же файловая переменная может быть использована для работы с несколькими файлами, а в каком – нет 7. Что такое последовательный доступ к данным 8. Как можно начать чтение данных из файла с самого начала 9. Как определить, что данные в файле закончились 10. В каких случаях нужно знать максимальное количество данных в файле, а в каких – нет 11. В каких случаях нужно открывать одновременно несколько файлов 1. Напишите программу, которая находит среднее арифметическое всех чисел, записанных в файле в столбики выводит результат в другой файл. 2. Напишите программу, которая находит минимальное и максимальное среди чётных положительных чисел, записанных в файле, и выводит результат в другой файл. Учтите, что таких чисел может вообще не быть. 3. В файле в столбик записаны целые числа. Напишите программу, которая определяет длину самой длинной цепочки идущих подряд одинаковых чисел и выводит результат в другой файл. 4. В файле записано не более 100 чисел. Отсортировать их по возрастанию последней цифры и записать в другой файл. 5. В файле записано не более 100 чисел. Отсортировать их по возрастанию суммы цифр и записать в другой файл. 6. В двух файлах записаны отсортированные по возрастанию массивы неизвестной длины. Объединить их и записать результат в третий файл. Полученный массив также должен быть отсортирован по возрастанию. 7. Дополните решение задачи о собаках, так чтобы программа обрабатывала ошибки в исходных данных. При любых ошибках программа не должна завершаться аварийно. Задачи и задания ? Контрольные вопросы Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин http://kpolyakov.spb.ru 72 22.10.2015 8. В исходном файле записана речь подростка, в которой часто встречается слово-паразит короче, например Мама, короче, мыла, короче, раму Убрать из текста все слова-паразиты должно остаться Мама мыла раму. 9. Прочитать текст из файла и подсчитать количество слов в нм. 10. Прочитать текст из файла и вывести в другой файл только те строки, в которых есть слова, начинающиеся с буквы А. 11. Прочитать текст из файла и вывести в другой файл в столбик все слова, которые начинаются с буквы А. 12. Прочитать текст из файла, заменить везде слово паровоз на слово пароход и записать в другой файл. 13. В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами Фамилия Имя Количество баллов Вывести фамилии и имена тех учеников, которые получили больше 80 баллов. 14. В предыдущей задаче добавить к списку нумерацию, например 1) Иванов Вася 2) Петров Петя 15. В той же задаче сократить имя до одной буквы и поставить перед фамилией 1) В Иванов 2) П Петров 16. В той же задаче отсортировать список по алфавиту (по фамилии. 17. В той же задаче отсортировать список по убыванию полученного балла (вывести балл в выходной файл. Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин http://kpolyakov.spb.ru 73 Самое важное в главе 8: • Алгоритмы могут записываться на псевдокоде, в виде блок-схем и на языках программирования. Алгоритм, записанный на языке программирования, называется программой. • Данные, с которыми работает программа, хранятся в переменных. Переменная - это величина, которая имеет имя, тип и значение. Значение переменной может изменяться вовремя выполнения программы Любой алгоритм можно записать, используя последовательное выполнение операторов, ветвления и циклы. Ветвления предназначены для выбора вариантов действий в зависимости от выполнения некоторых условий. Цикл - это многократное повторение одинаковых действий. • Подпрограммы - это вспомогательные алгоритмы, которые могут многократно вызываться из основной программы и других подпрограмм. Подпрограммы-процедуры выполняют описанные в них действия, а подпрограммы-функции в дополнение к этому возвращают вызвавшей программе результат этих действий (число, символ, логическое значение и т.д.). Данные, передаваемые в подпрограмму, называют аргументами. В подпрограмме эти данные представлены как локальные переменные, которые называются параметрами подпрограммы. • Рекурсивные алгоритмы основаны на последовательном сведении исходной задачи ко всё более простым задачам задачам такого же типа (с другими параметрами. Рекурсия служит заменой циклу. Любой рекурсивный алгоритм можно записать без рекурсии, ново многих случаях такая запись более длинная и менее понятная. • Массив - это группа переменных одного типа, расположенных в памяти рядом (в соседних ячейках) и имеющих общее имя. Каждая ячейка массива имеет уникальный индекс (как правило, это номер элемента Сортировка - это расстановка элементов массива в заданном порядке. Цель сортировки - облегчить последующий поиск. Для отсортированного массива можно применить двоичный поиск, который работает значительно быстрее, чем линейный. • Символьная строка - это последовательность символов, расположенных в памяти рядом (в соседних ячейках. Строка представляет собой единый объект, она может менять свою длину вовремя работы программы. • Матрица - это прямоугольная таблица, составленная из элементов одного типа (чисел, строки т.д.). Каждый элемент матрицы имеет два индекса - номера строки и столбца. • До выполнения операций с файлом нужно открыть файл (сделать его активным, а после завершения всех действий - закрыть (освободить. |