Смекни!
smekni.com

Основы программирования на языке Си (стр. 9 из 27)

курсе объектно-ориентированногопрограммирования.

#ifndef AVERAGES_H

# define AVERAGES_H

38

// (Определения констант и пользовательских типов)

// ПРОТОТИП ФУНКЦИИ ДЛЯ ВЫЧИСЛЕНИЯ ЦЕЛОЧИСЛЕННОГО СРЕДНЕГО

// ЗНАЧЕНИЯ 3-Х ЦЕЛЫХ ЧИСЕЛ:

int average( int first_number, int second_number,

int third_number );

// ПРОТОТИП ФУНКЦИИ ДЛЯ ВЫЧИСЛЕНИЯ ЦЕЛОЧИСЛЕННОГО СРЕДНЕГО

// ЗНАЧЕНИЯ 2-Х ЦЕЛЫХ ЧИСЕЛ:

int average( int first_number, int second_number );

#endif

Заголовочный файл averages.h.

Ниже показаносодержимоефайла "averages.cpp" сисходнымтекстомполь-

зовательских функций:

#include <iostream.h>

#include "averages.h"

// ФУНКЦИЯ ДЛЯ ВЫЧИСЛЕНИЯ ЦЕЛОЧИСЛЕННОГО СРЕДНЕГО

// ЗНАЧЕНИЯ 3-Х ЦЕЛЫХ ЧИСЕЛ:

int average( int first_number, int second_number,

int third_number )

{

return ((first_number + second_number + third_number)/3);

}

// ФУНКЦИЯ ДЛЯ ВЫЧИСЛЕНИЯ ЦЕЛОЧИСЛЕННОГО СРЕДНЕГО

// ЗНАЧЕНИЯ 2-Х ЦЕЛЫХ ЧИСЕЛ:

int average( int first_number, int second_number )

{

return ((first_number + second_number)/2);

}

Файл реализации averages.cpp.

Программа 6.1 демонстрирует основное достоинство модульного подхода: при

изменении деталей реализации в файле "averages.cpp" не обязательно вносить из-

менения в файл "averages.h" или в главный файл программы.

7. Сводка результатов

В данной лекции описано, как в Си++ можно создавать новые функции. Есть

два способа передачи параметров внутрь функции: по значению и по ссылке. Функ-

ции облегчают применение процедурной абстракции при разработке программ мето-

дом "сверху вниз". При модульном подходе описание и реализация функций разме-

щаются в отдельных файлах, в таком случае для вызова функции необходимо вклю-

чать в текст программы заголовочный файл.

39

8. Упражнения

Упражнение 1

В программе из упражнения 2 лекции 2 (файл ex2_2.cpp) выделите 6 функций,

имена и назначение которых перечислены ниже:

fahrenheit_of

Возвращает значение температуры по шкале Фаренгейта для передан-

ного значения по шкале Цельсия.

absolute_value_of

Возвращает значение температуры в абсолютной шкале для передан-

ного значения по шкале Цельсия.

print_preliminary_message

Печать сообщения, поясняющего назначение программы.

input_table_specifications

Запрос параметров таблицы с клавиатуры.

print_message_echoing_input

Повторное отображение параметров, введенных пользователем.

print_table

Печать таблицы температур.

Проверьте свою программу для различных исходных данных. В качестве кон-

трольного примера можете использовать следующие выходные данные:

Эта программа печатает значения температур в разных шкалах.

Введите минимальное (целое) значение температуры

по Цельсию, которое будет в первой строке таблицы: 0

Введите максимальное значение температуры: 100

Введите разницу температур между соседними строками таблицы: 20

Преобразование значений температуры от 0 градусов Цельсия

до 100 градусов Цельсия, с шагом 20 градусов:

Цельсий Фаренгейт Абсолютная температура

0 32.00 273.15

20 68.00 293.15

40 104.00 313.15

... ... ...

... ... ...

100 212.00 485.15

Упражнение 2

Разделите программу из упражнения 1 на три файла:

1) главный файл программы;

2) заголовочный файл "conversions.h" с прототипами функций

"fahrenheit_of(...)" и "absolute_value_of(...)";

3) файл реализации с определением этих двух функций.

Снова проверьте свою программу для различных исходных данных.

40

Упражнение 3

(а) Создайте заголовочный файл "statistics.h" и соответствующий файл реализа-

ции "statistics.cpp" с функциями "average(...)" и "standard_deviation(...)".

Эти функции должны вычислять среднее значение и среднеквадратическое откло-

нение для последовательности из 1, 2, 3 или 4 вещественных чисел. Среднеквадра-

тическое отклонение чисел r1, ..., rN определяется как корень из среднего значения

квадратов отклонений чисел от своего среднего:

Σ=

= −

N

i

i r m

N 1

2 ) ( 1 σ , где Σ=

=

N

i

i r

N

m

1

1

Подсказки: (1) Примените средства перегрузки функций Си++. (2) Функции

можно вызывать изнутри друг друга. (3) Максимально используйте возможности

текстового редактора по копированию фрагментов исходного текста.

(б) Напишите тестовую программу для проверки функций из файла "statistics.h",

которая в цикле запрашивает исходные данные до тех пор, пока пользователь не

сообщит о завершении работы (некоторым специально оговоренным числом). Ва-

ша тестовая программа должна выдавать на экран сообщения, подобные приве-

денным ниже:

Эта программа предназначена для тестирования функций из

заголовочного файла "statistics.h".

Сколько чисел будет в тестовой последовательности – 1, 2, 3

или 4? (для завершения работы введите 0): 3

Введите первое число: 5

Введите второе число: 7

Введите третье число: 9

Среднее значение: 7. Среднеквадратическое отклонение: 1.63299.

Сколько чисел будет в тестовой последовательности – 1, 2, 3

или 4? (для завершения работы введите 0): 1

Введите первое число: 5.8

Среднее значение: 5.8. Среднеквадратическое отклонение: 0.

Сколько чисел будет в тестовой последовательности – 1, 2, 3

или 4? (для завершения работы введите 0): 8

Извините, но эта программа может работать только с 1, 2, 3

или 4-мя числами.

Сколько чисел будет в тестовой последовательности – 1, 2, 3

или 4? (для завершения работы введите 0): 0

Программа тестирования функций из заголовочного файла

"statistics.h" завершила работу.

Подсказки: (1) Разрабатывайте свою программу методом "сверху вниз ". Начни-

те с написания короткой главной функции, в которой вызываются функции-

заглушки, например, "test_three_values()". Детали этих функций вы уточни-

те позже, после отладки функции "main()". (2) В качестве высокоуровневой

структуры программы вы можете использовать цикл for с пустым разделом

инициализации и пустым оператором изменения значений (эквивалент цикла

while, который будет рассматриваться в следующих лекциях).

41

ЛЕКЦИЯ 4. Текстовые файлы и потоки ввода/вывода

1. Назначение файлов

Во всех рассматривавшихся до сих пор программах ввод данных производился

только с клавиатуры, а вывод только на экран. Если в качестве устройств вво-

да/вывода ограничиться только клавиатурой и экраном, то в таком случае будет

сложно обработать большие объемы входных данных. Выходные данные, отображен-

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

Для устранения подобных проблем удобно сохранять данные на запоминаю-

щих устройствах, предназначенных для долговременного хранения данных (обычно

это магнитные диски). Данные, сгенерированные с помощью одной программы, мож-

но сохранить на диске и в дальнейшем, при необходимости, извлечь и обработать в

другой программе.

На дисках данные хранятся в виде структур данных, обслуживаемых операци-

онной системой, в виде файлов. Файл проще всего представить как линейную по-

следовательность символов. Текст этой лекции (если не учитывать специальные сим-

волы форматирования) можно сохранить в файле с именем "Lecture_4.txt" в виде

(рис. 1):

Рис. 1. Начало файла "lecture_4.txt".

2. Потоки ввода/вывода

Перед началом изучения файловых операций в Си++, необходимо ознакомить-

ся с понятием потока ввода/вывода. Поток напоминает "канал" или "трубу", через ко-

торую данные поступают от передатчика к приемнику. Исключительно важная осо-

бенность потоковой обработки данных состоит в том, что элементы данных можно

посылать или считывать из потока только по одному за раз, т.е. последовательно.

В данном курсе рассматриваются только однонаправленные потоки, в которых

данные всегда передаются в одном направлении. Из программы данные можно отпра-

вить (записать) в поток вывода, а получить (прочитать) их в программе из потока

ввода. Например, сразу после запуска программы, поток стандартного ввода "cin"

подключается к клавиатуре, а поток стандартного вывода "cout" к экрану.

Потоки ввода/вывода, вроде "cin" и "cout", являются примерами объектов