osnovyiprogrammirovaniyanac
.pdfЗадачи к главе 11.Функции
Задача 11.1. Напишите функцию, которая сравнивает два целых числа и возвращает один символ: >, < или =.
Задача 11.2. Напишите функцию, которая вычисляет значение аь, не используя |
'» |
стандартную функцию pow(). |
|
Задача 11.3. Напишите функцию, которая считает количество гласных букв во введенной строке.
Задача 11.4. Напишите функцию, которая случайным образом генерирует пароль из 8 символов. В пароле должны присутствовать только латинские буквы и цифры.
Задача 11.5. Напишите функцию - телеграф, которая кодирует введенное предложение, азбукой Морзе, зная что:
А .- |
Б |
в.— |
г — . |
Д -•• |
Е . |
|
3--.. |
и . . |
И . — |
к - . - |
л . - . . |
м - |
Н-. |
0 — |
П |
р.-. |
С ... |
Т - |
У ..- |
ф |
X .... |
ц - . - . |
ч — . |
ш — |
|
|
ы |
|
э |
ю . . ~ |
я |
Задача 11.6. Напишите функцию, которая генерирует и выводит на экран всевозможные сочетания цифр и букв в пароле из 4 символов.
Задача 11.7. Напишите функцию, которая рисует на экране рамку. В качестве параметра функция получает размеры рамки и координаты левого верхнего угла.
Задача 11.8. Напишите функции, которые рисуют на экране линиями все 10 (от 0 до 9) цифр. В качестве параметра функция получает цифру и её положение на экране.
Задача 11.9. Используя задачу 11.7, напишите программу-секундомер, которая в графическом режиме отсчитывает на экране 30 секунд.
Гпава 12
Файлы
В файлах размещаются данные, предназначенные для длительного хранения. Каждому файлу приписывается используемое при обращении к нему уникальное имя. Для работы с файлами в С++ необходимо подключить стандартную библиотеку stdio.h. Все файлы можно условно разделить на две категории: текстовые и двоичные (их еще называют бинарными). Текстовые - это файлы, в которых записан только текст. Такие файлы обычно имеют расширения *.txt, *.ini, *.bat, *.log и т.д. Например, файлы, в которых содержатся исходные тексты программ, также являются текстовыми. То есть файлы с расширениями *.с, *.срр, *.pas, *.asm и т.д. можно просмотреть любым текстовым редактором, например WordPad'oM. Файлы, содержащие информацию, коды программ, рисунки, звуковые данные и т.д., являются бинарными (двоичными). Например, *.ехе, *.com, *.avi, *.dat, *.bmp - двоичные файлы. Файлы с расширением *.doc тоже относятся к двоичным, т.к. кроме текста они могут содержать и другую информацию, например, рисунки, графики, таблицы.
Прежде чем читать или записывать информацию в файл, он должен быть открыт. Это можно сделать с помощью функции fopen. Она возвращает указатель на файл. Далее в программе мы будем работать именно с указателем на файл, а не писать каждый раз имя того или иного файла. Указатель на файл необходимо объявить:
FILE *ist;
FILE - имя типа, описанное в стандартном определении stdio.h, ist - указатель на файл. Обращение к функции fopen в программе производится выражением:
ist = гореп("имя ф а й л а " , " в и д и с п о л ь з о в а н и я ф а й л а " ) ;
Необходимо указать полный путь к файлу, включая диск, например: "c:\\my_file.txt", "a:\\doc\\data.txt". Если файл находится в том же каталоге, что и программа, которая к нему обращается, то можно ограничиться именем файла и его расширением "temp.txt".
"вид использования файла" - это константа, которая определяет цель открытия
файла:
"rt" - открыть существующий текстовый файл для чтения;
"wt" - создать новый текстовый файл для записи (если файл с указанным именем
уже существует, то он будет переписан); |
* |
"at" - дополнить текстовый файл; |
|
"rt+" - открыть существующий текстовый файл для записи и чтения; |
|
"wt+" - создать новый файл для записи и чтения. |
|
Здесь используются сокращения от английских слов г (read) - читать, w (write) - писать, a (add) - добавлять. Буква t (text) - означает, что мы будем работать с текстовым файлом. Если мы хотим работать с бинарным файлом, то вместо t надо написать b (binary). Например, ist = fopen("max.dat", "rb") - открывает двоичный файл max.dat из текущего каталога для чтения. Если в результате обращения к функции fopen возникает ошибка (например, файла max.dat не существует), то она возвращает указатель на константу NULL. Поэтому после каждого вызова функции fopen желательно проверять значение ссылки указателя. К примеру, так:
if(ist = fopen("max.dat", "rb")==NULL) printf("Ошибка открытия файла!");
После окончания работы с файлом его нужно закрыть. Это делается с помощью функции fclose. В качестве входного параметра ей необходимо передать указатель на тот файл, который мы хотим закрыть,
f c l o s e ( i s t ) ;
Рассмотрим другие библиотечные функции, используемые для работы с файлами
(все они описаны в файле stdio.h): |
9 |
1. Функция putc записывает символ в файл:
p u t c f c h , |
i s t ) ; |
ch - символ для записи (переменная типа char), ist - указатель на файл, возвращенный функцией fopen.
2. Функция getc читает символ из файла:
ch = g e t c ( i s t ) ;
Здесь также ch типа char, ist - указатель на файл, из которого читается очередной символ и записывается в ch. Если вызывать эту функцию в цикле, то будут последовательно прочитаны все символы из файла. При достижении конца файла функция вернет значение константы EOF (End Of File) - коноц файла.
3. Функция feof определяет конец файла при чтении двоичных данных:
s t a t u s = f e o f ( i s t ) ;
Здесь ist - указатель на файл, status - переменная типа int, в которую при достижении конца файла записывается ненулевое значение. В противном случае записывается 0.
4.Функция fputs записывает строку символов в файл. Она отличается от функции puts только тем, что в качестве второго параметра должен быть записан еще и указатель на файл. Например:
F I L E |
* i s t ; |
|
i s t |
= fopen("my.txt", |
wt" ) ; |
fputs ( " П р и в е т , Вася!" |
i s t ) ; |
|
f c l o s e ( i s t ) ; |
|
Записывает в файл, связанный с указателем ist строчку текста "привет, Вася!".
5.Функция fgets читает строчку символов из файла. Она отличается от функции gets только тем, что в качестве второго параметра должен быть записан еще и указатель на файл. Например:
F I L E |
* р ; |
c h a r |
s t r [ 5 0 ] ; |
р = f o p e n ( " с : W s t o r y . t x t " , " r t " ) ; f g e t s ( s t r , p ) ;
f c l o s e ( p ) ;
82
6.Функция fprintf выполняет те же действия, что и функция printf, но работает с файлом. Ее отличие в том, что в качестве первого параметра также задается указатель на файл:
FILE *р; |
|
int х = 10; |
|
р = f open ("а : W d a t a . t x t " , "wt") ; |
|
fprintf(p, " З н а ч е н и е п е р е м е н н о й x = %i", |
x ) ; |
fclose(p); |
* |
Функция выводит строчку текста и значение переменной х, но только не на экран, как это делала функция printf, а в файл a:\data.txt.
7.Функция fscanf отличается от похожей на неё функции scanf тем, что у неё первый параметр - указатель на файл, и читает информацию она не с клавиатуры, а из файла.
FILE *р;
char str[100]; int х, у;
р = f o p e n ( " n o n a m e . c p p " , " r t " ) ; fscanf(p, "Is %i %i", &str, &x, &y); fclose(p);
Здесь мы читаем из файла строчку текста (до первого пробела) и далее два целых числа х и у.
8.При открытии файла мы автоматически оказываемся в его начале и далее перемещаемся по файлу, читая последовательно данные. А что, если нам необходимо прочитать только одно число, находящееся на 100 позиции? Или нужная информация находится в конце файла? Для этих целей существует функция fseek, которая позволяет выполнять чтение и запись с произвольной позиции файла. Она имеет вид:
fseek(ist, count, access);
Здесь ist - указатель на файл, count - номер байта относительно заданной начальной позиции, access - способ задания начальной позиции. Переменная access может принимать следующие значения:
|
0 - начальная позиция задана в начале файла; |
, |
|||||
|
1 - начальная позиция считается текущей; |
|
|||||
|
2 - начальная позиция считается с конца файла. |
|
|||||
Например: |
|
|
|
|
|
|
|
/* |
Ч и т а е т |
10-ый |
символ |
из |
файла |
с у к а з а т е л е м ist |
*/ |
fseek(ist, 10, 0 ) ; |
|
|
|
|
|||
ch = getc(ist); |
|
|
|
|
|
||
/* |
Ч и т а е т |
5-ый |
символ |
от |
конца |
файла */ |
|
fseek(ist, - 5, 2 ) ; ch = getc(ist);
/* Читает из файла 10 символов через один и печатает их на экран */ for(i = 0; i < 10; i++)
{
fseek(ist, 2, 1 ) ; fscanf(ist, "%c", &ch); printf("%c", c h ) ;
}
Пример 12.1. Напишите программу, которая сохраняет в файл имя, возраст и вес студента, введенные пользователем в ходе выполнения программы.
int |
main() |
|
* |
{ |
|
|
|
FILE |
*f; |
|
|
char name[15]; |
// |
имя |
|
int |
age; |
// |
возраст |
int weight; |
// |
вес |
|
f = |
fopen("x:\\<Login_Name>\\database.txt", " w t + ) ; |
// создаем на диске x: файл if (f == NULL)
{
printf("Ошибка создания файла ! \ n " ) ; return 1; // выход из программы
}
/* Считываем данные с клавиатуры */ printf("Введите имя студента : " ) ;
scanf("%s", |
&name); |
|
printf("Введите его возраст : " ) ; |
|
|
scanf("%i", |
&age); |
* |
printf("Введите вес : " ) ; |
|
|
scanf("%f", &weight); |
|
/* Сохраним все это в файл */
fprintf(f, "%s \n %i \n %f", name, age, weight);
fclose(f); |
// закроем файл |
} |
|
Пример 12,2. Напишите программу, которая считывает из файла имя, возраст и вес студента и выводит их на экран.
int main() |
|
|
|
{ |
|
|
|
FILE *f; |
|
|
|
char name[15]; |
// |
имя |
|
int age; |
// |
возраст |
|
float weight; |
// |
вес |
„ |
(f == NULL)
{
printf("He могу открыть файл ! \ n " ) ; return 1; // выход из программы
}
/* Считываем данные из файла */
fscanf(f, "%s %i %\", Sname, Sage, Sweight);
/* Выводим данные на экран */ printf("Имя студента : %s \n", name);
printf("Возраст : %i \n", age); printf("Вес : %f \n", weight );
fclose(f); |
// закроем файл |
return 0; |
|
}
Пример 12.3. Напишите программу, которая посимвольно выводит на экран содержимое текстового файла:
/* Программа для чтения текстовых файлов */
FILE *f; // Указатель на файл char ch; // Читаемый символ
f = fopen("х:\\<Login_Name>\\my.txt", "rt");
while (feof (f) ===0) // цикл: пока не конец файла f, выполняем цикл
{
ch = getc(f); printf("%с", c h ) ;
}
fclose(f);
Задачи к главе 1 2 . Файлы
Задача 12.1. Напишите программу, в которой описана функция, цель которой - сообщать пользователю об ошибке открытия файла, если такая имеет место, и открывать файл, если ошибок нет. В качестве входного параметра функция принимает имя файла, введенное пользователем.
Задача 12.2. Напишите программу, которая создает файл numbers.txt и записывает в него 5 введенных пользователем чисел.
Задача 12.3. Напишите программу, которая вычисляет среднее арифметическое чисел, находящихся в файле numbers.txt.
Задача 12.4. Напишите программу, которая дописывает в файл phones.txt имя, отчество и номер телефона абонента. Информация вводится пользователем в ходе выполнения программы.
Задача 12.5. Напишите программу, которая осуществляет поиск по телефонной книге phones.txt и в случае нахождения соответствий выводит информацию об абоненте или абонентах (если совпадений несколько) на экран.
Задача 12.6. Напишите программу, которая объединяет возможности программ
«добавление в телефонный, справочник» (задача 12.4.)И «поиск в телефонной книге»
(задача 12.5.).При запуске программы выводится меню: ,
**** Телефонный справочник**** 1. Добавление 2. Поиск
3. Завершение работы Введите номер пункта меню:
Задача 12.7. Напишите программу, которая считывает изменение курса валют пары EUR/USD (значение курса и номер, которым по счету вводится значение) и записывает в файл. А потом считывает эти значения из файла и выводит на экран график дневного изменения курса.
Задача 12.8. Напишите программу, которая считывает параметры пяти эллипсов, вводимые пользователем с клавиатуры, и записывает их в файл. А потом выводит эти эллипсы на экран.
Приложение 1.Таблица кодов ASCII
»
Литература
1.Керниган Б., Ричи Д. "Язык программирования "С".
2.Азаров А. "Программирование на C/C++. Часть 1".
3.Шилдт Г. "С - для профессиональных программистов".
4.Стивен А. "Техника программирования на Turbo С".
5.Березин Б., Березин С. "Начальный курс С и С++".
6.Скляров В. "Программирование на языках С и С++".
7.Поддубная Л., Шаньгин В. "Мне нравится паскаль".
8.Шикин А. "Компьютерная графика".
9.Культин Н. "Turbo Pascal в задачах и примерах".
10.Попов В. "Turbo Pascal для школьников".
11.Дейтел X., Дейтел П. "Как программировать на С++".