Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
13
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Программа 51. Сумматор чисел

Напишем программу, которая вводит с клавиатуры числа с плавающей точкой и суммирует их. Числа поступают с клавиатуры в виде строк, которые следует преобразовывать в числовые значения.

Строки символов можно вводить стандартным образом с помощью cin >>, разделяя вводимые числа пробелами, но в данной программе будем читать с клавиатуры строки символов, а затем преобразовывать строки в числа.

Для чтения строк напишем функцию

int readline(),

которая читает не более MAXLINE символов в массив line, извлекает из входного потока символ новой строки \n, но не помещает его в формируемую строку, и возвращает длину прочитанной строки. Массив line и предельный размер строки MAXLINE зададим как внешние переменные. Функцию readline разместим в файле Readline.cpp.

Для преобразования строк в числа с плавающей точкой напишем функцию strtof и поместим ее в отдельном файле StrTof.cpp.

Главную функцию main, которая будет вводить и суммировать числа, поместим в файле SumNumb.cpp.

Функция strtof преобразует строку цифр, в которой может быть знак и десятичная точка, отделяющая целую часть от дробной, в число двойной точности. Сначала устанавливается знак числа, затем вычисляется целая часть val. Если присутствует десятичная точка, продолжается вычисление val как целого и параллельно накапливается степень 10, на которую надо поделить val, чтобы сформировать правильное значение.

// Файл Strtof.cpp

#include <ctype.h>

// strtof: преобразование строки s в double

double strtof(char s[])

{

double val, pow10;

int i, sign;

for(i = 0; isspace(s[i]); i++) // Пропуск начальных пробелов

;

sign = (s[i] == '-') ? -1: 1; // Получение знака

if('+' == s[i] || '-' == s[i]) // Если есть знак,

i++; // переходим к следующему символу

for(val = 0.0; isdigit(s[i]); i++) // Получаем целую часть

val = val * 10 + s[i] - '0';

if('.' == s[i]) // Если есть десятичная точка

i++; // Переход к дробной части

for(pow10 = 1.0; isdigit(s[i]); i++){ // Получение дробной части

val = val * 10 + s[i] - '0';

pow10*=10.0; // Степень 10

}

return sign * val / pow10;

}

Для проверки того, что символ является пробельным, применяется функция isspace, а для проверки того, что символ есть цифра – isdigit.

// Файл ReadLine.cpp

#include <iostream.h>

// Объявление внешних переменных

extern int MAXLINE;

extern char line[];

/* readline: читает не более MAXLINE символов в массив line, возвращает длину строки */

int readline()

{

int c, i;

for(i = 0; i < MAXLINE - 1 && (c = cin.get()) != EOF && c != '\n'; ++i)

line[i] = c;

line[i] = '\0';

return i; // Возвращаем длину строки

}

Для чтения отдельных символов в readline применена библиотечная функция int cin.get().

В функции main читаются строки, пока не встретится строка нулевой длины (пустая), строки преобразуются в числа, которые добавляются к сумме. Очередное значение суммы выводится.

// Файл SumNumb.cpp

#include <iostream.h>

#include <conio.h>

int readline(); // Прототип функции чтения строки

double strtof(char[]); // Прототип функции преобразования строки в число

// Сумматор вводимых чисел

int main()

{

double sum = 0.0; // Сумма

extern char line[]; // Объявление массива line

while(readline() > 0) // Пока есть строки, преобразуем

cout << (sum+=strtof(line)) << endl; // их в числа и суммируем

getch();

return 0;

}

// Определение внешних переменных

int MAXLINE = 100;

char line[100]; // Массив под строку

В файл SumNumb.cpp необходимо поместить объявления используемых в main функций strtof и readline, иначе при компиляции данного файла будет выдана ошибка вида:

•Error LECTC_~1\SUMNUMB.CPP 18: Function 'readline' should have a prototype

Ниже приведен пример работы программы

33.21

33.21

-10.12

23.09

65.66

88.75

^Z

Часто кажется удобным делать переменные внешними потому, что в этом случае становятся короче списки аргументов функций, так как переменные видны везде. Например, в программе 51 массив для вводимой строки и его размер не передаются в функцию readline потому, что они доступны в этой функции как внешние переменные. Однако чрезмерное использование внешних переменных приводит к программам, в которых связи по данным не очевидны, поэтому такие программы трудны для понимания и модификации, их трудно отлаживать, так как сложно следить за изменениями внешних переменных.

Кроме того, функции, в которые данные передаются с помощью внешних переменных, являются менее общими, так как в них используются конкретные имена. Это относится, например, к функции readline, в которой использовано имя конкретного внешнего массива line. При изменении имени массива придется переписывать и функцию readline.