- •Лабораторная работа № 1
- •5.1 Линейная программа
- •Далее создадим файл:
- •Задания1
- •Лабораторная работа № 2
- •7. Варианты задания
- •Лабораторная работа № 3
- •5.2 Оператор if
- •Лабораторная работа № 4
- •Лабораторная работа № 5
- •Задание 2. Циклический вычислительный процесс конечные суммы и произведения
- •Лабораторная работа № 6
- •Лабораторная работа № 7
- •5.1 Одномерный массив
- •5.3 Индексация с помощью указателей
- •Лабораторная работа № 8
- •Лабораторная работа № 9
- •Лабораторная работа № 11
- •Задача 2. Параметры функции
- •Лабораторная работа № 12
- •Лабораторная работа № 13
- •5. Содержание отчета
- •Лабораторная работа № 14
- •5. Содержание отчета
- •Решение уравнения методом деления отрезка пополам (бисекций)
- •Лабораторная работа № 15
- •6.2.1 Метод средних прямоугольников
- •6.2.1 Метод трапеций
- •Лабораторная работа № 10
- •Лабораторная работа № 16
- •5. Содержание отчета
- •Директива #include
- •7. Методические указания
- •8. Варианты заданий.
- •Лабораторная работа № 17
- •Лабораторная работа № 18
- •Лабораторная работа № 19
- •5. Содержание отчета
- •6.1.1 Доступ к элементам структуры
- •6.1.2 Присваивание структур
- •Лабораторная работа № 20
- •Например, формула
- •Задание на программирование
Лабораторная работа № 18
Тема: «Работа с текстовыми файлами»
Цель работы
1.1 Получение навыков в программировании ввода и вывода с использованием файлов.
1.2 Получение навыков обработки символьных данных, содержащихся в файлах.
Техническое обеспечение
Персональная ЭВМ IBM PC/286 и более поздних моделей.
Клавиатура.
Дисплей.
Печатающее устройство.
Программное обеспечение
Операционная система Windows
Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.
Постановка задачи
Создать текстовый файл и выполнить их обработку текста в файле согласно заданного варианта.
Содержание отчета
5.1. Тема и цель работы.
5.2. Схема алгоритма решения задачи.
5.3. Текст программы.
5.4. Результаты выполнения программы.
Общие сведения
Фундаментом понимания системы ввода-вывода языка С являются концепции потоков и файлов. Система ввода-вывода языка С поддерживает постоянный интерфейс независимо от устройства, к которому обращается программист. То есть система ввода-вывода языка С предоставляет уровень абстракции между программистом и аппаратурой. Данная абстракция называетсяпотоком, а собственно устройство называетсяфайлом. Важно знать, как они взаимодействуют между собой.
Потоки
Хотя каждое устройство ввода-вывода ЭВМ отличается от другого, система ввода-вывода преобразует их в единое логическое устройство поток. Все потоки похожи своим поведением. Поскольку потоки не зависят от устройств, одни и те же функции могут записывать информацию в файл на диске и использоваться для записи на другое устройство, например, на консоль. Существуют два типа потоков –текстовыеидвоичные.
Текстовые потоки– это последовательность символов. В текстовых потоках некоторые символы могут преобразовываться согласно требованиям среды. Например, символ новой строки (‘\n’) может преобразовываться в пару «возврат каретки – перевод строки». Следовательно, может не быть однозначного соответствия между записываемыми и считываемыми символами и символами во внешнем устройстве.
Двоичный поток– это последовательность байт, имеющих однозначное соответствие с байтами во внешнем устройстве. То не возникает преобразование символов. Также число байт, записанных или прочитанных из внешнего устройства совпадает с числом байт во внешнем носителе. Тем не менее, может добавляться некоторое количество нулевых байт к двоичному потоку. Эти нулевые байты могут использоваться, например, для заполнения сектора диска
Функции обработки символов
Функция
int isalnum(int ch);
возвращает ненулевое значение, если аргумент chявляется либо буквой алфавита (верхнего или нижнего регистра), либо цифрой. Иначе возвращается 0. Прототип находится в файлеcctype.h.
Функция
int isalpha(int ch);
возвращает ненулевое значение, если аргумент chявляется буквой алфавита (верхнего или нижнего регистров). В противном случае возвращается 0. Прототип находится в файлеcctype.h.
Функция
int isdigit(int ch);
возвращает ненулевое значение, если аргумент chявляется цифрой от 0 до 9, в противном случае возвращается 0. Прототип находится в файлеcctype.h.
Функция
int islower(int ch);
возвращает ненулевое значение, если аргумент chявляется в противном случае возвращается 0. Прототип находится в файлеcctype.h.
Функция
int ispunct(int ch);
возвращает ненулевое значение, если аргумент chявляется знаком препинания или пробелом, в противном случае возвращается 0. Прототип находится в файлеcctype.h.
Функция
int isspace(int ch);
возвращает ненулевое значение, если аргумент chявляется символом пробела, возврата каретки (‘\r’), горизонтальной табуляции (‘\t’), вертикальной табуляции (‘\v’), перевода формата (‘\f’) или новой строки (‘\n’), в противном случае возвращается 0. Прототип находится в файлеcctype.h.
Функция
int isupper(int ch);
возвращает ненулевое значение, если аргумент chявляется буквой верхнего регистра (от «A» до «Z»), в противном случае возвращается 0. Прототип находится в файлеcctype.h.
Функция
int tolower(int ch);
возвращает соответствующий нижнему регистру эквивалент символа ch, еслиch– это буква верхнего регистра. В противном случаеchостается неизменным. Прототип находится в файлеcctype.h.
Функция
int toupper(int ch);
возвращает соответствующий верхнему регистру эквивалент символа ch, еслиch– это буква нижнего регистра. В противном случаеchостается неизменным. Прототип находится в файлеcctype.h.
Функции обработки строк
Функция
char *strcpy(char *str1, const char *str2);
используется для копирования содержимого строки str2в строкуstr1. Аргументstr2должен быть указателем на строку, оканчивающуюся нулевым символом. Функцияstrcpy()возвращает указатель на конец строкиstr1. Прототип функции находится в файлеstring.h.
Функция
char *strcat(char *str1, const char *str2);
конкатенирует (соединяет в цепочку) строку str1и копию строкиstr2. В конце модифицированной строкиstr1функция устанавливает нулевой символ. Нулевой символ, первоначально завершавший строкуstr1, замещается первым символом строкиstr2. Строкаstr2 остается без изменений. Функцияstrcat()возвращаетstr1.
Следует иметь в виду, что функция не производит проверки границ, пожтому программист должен позаботиться о том, чтобы строка str1была достаточно длинной и могла вместить кроме своего первоначального содержания еще и содержание строкиstr2.
Прототип находится в string.h.
Функция
char *strchr(const char *str, int ch);
возвращает указатель на первое вхождение символа chв строку, на которую указываетstr. Если символchне найден, возвращаетсяNULL. Прототип находится вstring.h.
П р и м е р. Следующая программа выведет строку «isatest»:
char *p;
p = strchr(“this is a test”);
printf(p);
return 0;
}
Функция
int strcmp(const char *str1, const char *str2);
осуществляет лексикографическую проверку двух строк, оканчивающихся нулевыми символами, и возвращает целое число со следующим значением:
ЧислоЗначение
Меньше 0 str1 меньшеstr2
str1 равнаstr2
Больше 0 str1 большеstr2
Прототип находится в string.h.
Функция
size_t strcspn(const char *str1, const char *str2);
возвращает количество символов в начале строки с указателем str1, среди которых нет ни одного символа, входящего в строку с указателемstr2. Другими словами, для строкиstr1функцияstrcspn()возвращает значение индекса первого символа из числа символов, входящих в строкуstr2. Прототип находится вstring.h.
П р и м е р. Следующая программа выводит число 8:
#include <stdio.h>
#include <string.h>
int main(void)
{
int len;
len = strcspn(“this is a test”, “ab”);
printf(“%d”, len);
return 0;
}
Функция
char *strdup(const char str);
выделяет память, достаточную для хранения дубликата строки, на которую указывает str, а затем производит копирование этой строки в выделенную область и возвращает на нее указатель. Прототип находится вstring.h.
П р и м е р. Следующий фрагмент дублирует строку str:
char str[80], *p;
strcpy(str, “this is a test”);
p = strdup(str);
Функция
int stricmp(const char *str1, const char *str2);
осуществляет лексикографическое сравнение двух строк, оканчивающихся нулевыми символами. Функция не делает различия между буквами верхнего и нижнего регистров. Функция возвращает целое число, зависящее от результата следующим образом:
ЧислоЗначение
Меньше 0 str1 меньшеstr2
str1 равнаstr2
Больше 0 str1 большеstr2
Прототип находится в string.h.
П р и м е р. Следующая программа сравнивает имена двух файлов, заданных в командной строке:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[ ])
{
if (!stricmp(argv[1], argv[2]))
printf(“Имена файлов одинаковы.\n”);
elseprintf(“Имена файлов различны\n”);
return 0;
}
Функция
size_t strlen(const char *str);
возвращает длину строки, оканчивающуюся нулевым символом, на которую указывает str. При определении длины строки нулевой символ не учитывается. Прототип находится вstring.h.
Функция
char *strlwr(char *str)
преобразует символы строки, на которую указывает str, в символы нижнего регистра. Функция возвращаетstr.
Функция
char *strrev(char *str);
Изменяет на обратную последовательность символов в строке (за исключением нулевого символа в конце строки), на которую указывает str. Функция возвращаетstr. Прототип находится вstring.h.
Функция
char *strstr(const char *str1, const char *str2);
возвращает указатель на первое вхождение в строку, на которую указывает str1, строки, на которую указываетstr2. Если совпадений не обнаружено, возвращаетсяNULL. Прототип находится вstring.h.
П р и м е р. Следующая программа выведет строку “itisatest”:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *p;
p = strstr(“this is a test”, “is”);
printf(p);
return 0;
}
Функция
char *strupr(char *str);
преобразует символы строки, на которую указывает str, в символы верхнего регистра. Функция возвращаетstr. Прототип находится вstring.h.
Варианты заданий
1) Создать текстовый файл, состоящий из 5 строк, каждая из которых имеет не более чем по 10 строчных букв русского алфавита. Так как в языке С нет функции, которая преобразует символы русского алфавита из строчных в прописные (есть только для латинских букв), разработать такую функцию и использовать для преобразования символов из строчных в прописные в данном файле. Преобразованный текст записать в новый текстовый файл.
2) Создать текстовый файл, состоящий из 4 строк, каждая из которых имеет не более чем по 12 прописных букв русского алфавита и латинского алфавитов. Так как в языке С нет функции, которая преобразует символы русского алфавита из прописных в строчные (есть только для латинских букв), разработать функцию для преобразования любых букв из прописных в строчные и использовать для преобразования символов из прописных в строчные в данном файле. Преобразованный текст записать в новый файл.
3) Создать текстовый файл, состоящий из 6 строк не более чем по 15 символов. Написать программу, выполняющую следующие функции:
подсчет общего количества символов;
подсчет числа цифровых и нецифровых символов;
подсчет частоты встречаемости последовательности символов “abc”.
4) Даны два символьных файла S1 иS2, содержащих слова, разделенные символом ‘/ ’. Создать файлS3, каждое слово которого образуется сцеплением слов из файловS1 иS2, у которых совпадают первые символы. Для разделения слов использовать пробел. Если не произошло ни одного сцепления, выдать сообщение: “ФайлS3 пуст”.
5) Дан символьный файл T. Группы символов, разделенные пробелами образуют слова.
Подсчитать количество слов в файле, найти самое длинное слово, подсчитать количество слов, состоящих из одного, двух, трех и т. д. символов.
6) Дан текстовый файл (файл состоящий из строк) F, содержащий программу на языке С. Проверить эту программу на несоответствие числа открывающихся и закрывающихся круглых скобок. Считать, что каждый оператор программы занимает не боле одной строки файлаF.
7) Дан текстовый файл F. Записать в перевернутом виде строки файлаFв файлG. Порядок строк в файлеGдолжен быть обратным по отношению к порядку строк исходного файлаF.
8) Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файлаFне равна нулю. Числа в файле идут в следующем порядке: десять положительных, десять отрицательных, десять положительных, десять отрицательных и т. д. Число компонент файла должно быть кратно 40. Переписать компоненты файлаFв файлG, чтобы в файлеGчисла шли в следующем порядке: пять положительных, пять отрицательных, пять положительных, пять отрицательных и т. д.
9) Даны текстовый файл Fи строкаs. Получить все строки файла, содержащие в качестве фрагмента строкуs.
10) Даны два текстовых файла FиG. Определить, совпадают ли компоненты (строки) файлаFс компонентами файлаG. Если нет, то вывести номер первой строки и позицию первого символа в этой строке, в которых файлыFиGотличаются между собой.
11) Дан текстовый файл F, каждая строка в котором состоит из одного слова, размер которого не более 20 символов. Переписать этот файл, разместив слова в алфавитном порядке.
12) Дан символьный файл F. Считая, что количество символов в слове не превышает двенадцати, определить количество слов (слова отделяются пробелами) в файлеF; определить, сколько имеется в файле слов, соответственно, с одним, двумя, тремя и т. д. символами.