Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по программированию и алгоритмизаци...doc
Скачиваний:
31
Добавлен:
05.09.2019
Размер:
2.24 Mб
Скачать

4.8.3. Шаблоны функций

Если при написании программ на С++ часто приходиться создавать множество почти одинаковых функций для обработки данных разных типов, то используя ключевое слово template («шаблон»), можно задать компилятору образец, по которому он сам сгенерирует код, необходимый для конкретного типа. Компилятор создаст подходящую функцию, когда "узнает" какой тип аргументов класса Т подходит в конкретном случае. Т может быть и именем простого типа данных.

Пример.

# include <stdio.h>

# include <string.h>

template <class T> void swap(T &a, T &b)

{

T c; // создать переменную для временного хранения значения

c=b; b=a; a=c; // Перед обменом

} // i = 0 j = 1

void main() // x=0.000 y=1.000

{ int i = 0, j =1; // s1=first s2 = second

double x = 0.0, y = 1.0;

char *s1= "first", *s2 = "second"; // После обмена

printf("\t Перед обменом: \n " " i=%d j=%d\n " " x= %f y= %f \n "

" s1= %s s2= %s \n ", i, j, x, y, s1, s2); // i=1 j=0

swap( i, j ); // x=1.000 y=0.0000

swap( x, y ); // s1= second s2= first

swap( s1, s2 );

printf("\t После обмена: \n " " i=%d j=%d \n" "x=%f y=%f\n"

"s1=%s s2=%s\n", i, j, x, y, s1, s2);

}

Для примера «ОБМЕН» можно организовать обмен значениями через указатели:

# include <stdio.h>

void OBMEN(int *x, int*y)

{

int t;

t = *x;

*x = *y;

*y = t;

}

void main()

{

int a = 5, b = 9;

OBMEN(&a, &b);

printf("\n a= %d b= %d", a, b);

}

4.8.4. Возврат из функции нескольких значений

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

Первый способ заключается в использовании глобальной переменной.

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

Пример. Написать программу, функция в которой будет вычислять квадрат и куб аргумента. (Одно значение будем возвращать из функции оператором return, другое будет записываться по указателю int*.)

# include <stdio.h>

# include <iostream.h>

int fun(int, int*); // прототип функции

void main()

{

int a, kub, qv;

cin>>a; // ввод из потока

qv=fun(a,&kub); //исходное число, адрес ячейки, куда поместить

//второе значение

cout<<"для числа " << a<< "\t квадрат=" <<qv<<"\t куб=" <<kub;

}

int fun(int k, int* p)

{

*p=k*k*k; // значение куба помещаем по адресу *p

return k*k;

}

4.9. Файлы

Прежде чем читать информацию из файла или записывать в него, нужно его открыть. В библиотеке <stdio.h> для этого имеется специальная функция:

FILE *fopen(char *fname, char *mode);

где *fname – имя файла, *mode – режим (табл. 8). Функция возвращает указатель (ссылку) на файл, который должен быть предварительно описан.

Таблица 8

Таблица режимов для открываемого файла

Режим

Действие

“r”

Открыть для чтения

“w”

Создать для записи

“a”

Открыть для добавления в существующий файл

“rb”

Открыть двоичный файл для чтения

“wb”

Создать двоичный файл для записи

“ab”

Открыть двоичный файл для добавления

“r+”

Открыть для чтения и записи

“w+”

Создать для чтения и записи

“a+”

Открыть для добавления или создать для чтения и записи

“r+b”

Открыть двоичный файл для чтения и записи

“w+b”

Создать двоичный файл для чтения и записи

“a+b”

Открыть двоичный файл для добавления или создать для чтения и записи

“rt”

Открыть текстовый файл для чтения

“wt”

Создать текстовый файл для записи

“at”

Открыть текстовый файл для добавления

“r+t”

Открыть текстовый файл для чтения и записи

“w+t”

Создать текстовый файл для чтения и записи

“a+t”

Открыть текстовый файл для добавления или создать для чтения и записи

Например. FILE *fu; *fuуказатель на файловый тип

Пример. Объявим указатели на переменные файлового типа

FILE *uin, *uout; // (указатели на переменные файлового типа)

uin = fopen(“name1”, “r”); // открыть файл “name1” для чтения и далее

// идентифицировать как uin

uout = fopen(”name2”, “w”); // открывается для записи и связывается с

// идентификатором uout.

Если производится открытие несуществующего файла, то он создается.

Для открытия файла с именем test рекомендуется метод, который позволяет определить ошибку при открытии файла.

# include <stdio.h> // работа с файлами и константа NULL (FILEOPEN.C)

# include <stdlib.h> //для функции exit()

void main()

{

FILE *fp;

if ((fp=fopen("test","w"))==NULL)

{

puts("Не могу открыть файл\n"); // печать строки

exit(1);

}

puts("Файл открыт\n"); }

В библиотеке <stdio.h> определены также следующие функции работы с файлами ( fp – указатель на файл, возвращаемый функцией):

  • fopen( ) – открытие файла;

  • int fclose(FILE *fp) – закрытие файла. Возвращает нуль, если операция выполнена успешно и иное значение в противном случае. Функция является рекомендуемой, поскольку файлы при нормальном завершении закрываются автоматически;

int puts(int ch, FILE *fp) – записать символы типа int в поток. Возвращается записанный символ, если операция была успешной. Если произошла ошибка возвращается EOF;

  • int gets(FILE *fp) – прочесть символ типа int из потока. Возвращает EOF, если достигнут конец файла, или произошла ошибка при чтении файла;

  • int feof(FILE *fp) – возвращает значение «истинно», если достигнут конец файла и нуль в противном случае;

Пример. while (!feof(fp)) {ch=getchar(fp);}

Выполняется ввод символа, пока не достигнут конец файла;

  • int ferror(FILE *fp) – возвращает значение нуль, если обнаружена ошибка. Рекомендуется для обнаружения ошибок чтения и записи после каждой операции с файлами;

  • int fprintf(FILE *fp, const, char *string, …) – форматированная запись в файл. Содержит указатель на файл и управляющую строку со списком;

  • int fscanf(ILE *fp, const,char *string) – форматированное чтение из файла;

  • unsign fread(void *buf, int bytes, int c, FILE *fp) – читает блок данных из потока (буферный обмен); buf – указатель на область памяти, откуда происходит обмен информации; с – количество единиц записи длиной bytes, которая будит считываться.

  • unsign fwrite(void *buf, int bytes, int c, FILE *fp) – пишется блок данных в поток;

  • int remove(char *filename) – уничтожается файл, возвращается нуль при успешной операции;

  • unsign rewind( FILE *fp) – устанавливается указатель на начало файла;

  • int fseck( FILE *fp, long numbyte, int orig) – установить указатель позиции файла в заданное место, numbyte – количество байт от точки отсчета (0,1,2), orig – макрос 0 – начало, 1– текущая позиция, 2 – конец;

  • void abort() –– немедленное прекращение программы без закрытия файлов и без освобождения буферов, функция описана в библиотеке <stdlib.h>.