На этом шаге мы изменим программу из предыдущего шага.
Изменим несколько предыдущую программу, применив новый оператор и новую операцию. Программа будет выглядеть, как показано ниже:
// Count_Sym2.cpp: главный файл проекта. #include "stdafx.h" #include <clocale> //обязательно для функции setlocale() using namespace System; #include <conio.h> // для getch() #include <stdio.h> // для getchar(), putchar(), printf() #define eof -1 // признак конца файла Ctrl+Z int main() { setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы double nc; printf("Вводимые символы>\n"); for(nc=0; getchar() !=eof; nc++) ; printf("Введено символов: %0.f\n", nc); printf("Введено символов: %f\n", nc); _getch(); /*вводит символ, но без эхо-сопровождения (для организации задержки экрана) */ return 0; }
Для подсчета символов в файле мы применили переменную нового типа double (это длинное float), т. к. таких символов, возможно, окажется больше, чем может поместиться в переменную, описанную в примере из предыдущего шага. Размер занимаемой памяти для переменной типа double больше или равен, чем для типа float, но меньше или равен, чем для типа long double. Последний тип совпадает с типом double.
В таблице 1 приведены значения размеров памяти для основных типов данных в Microsoft C++.
Тип | Размер памяти |
---|---|
bool | 1 байт |
char, unsigned char, signed char | 1 байт |
short, unsigned short | 2 байта |
int, unsigned int | 4 байта |
intn | 8, 16, 32, 64, или 128 битов (зависит от значения n) |
long, unsigned long | 4 байта |
float | 4 байта |
double | 8 байтов |
long double | 8 байтов |
long long | 8 байтов |
Накапливать по единице мы можем в любой числовой переменной, а не только в переменной типа int. Для обеспечения цикличности ввода символов в этой программе использован цикл for, работу которого мы ранее рассматривали. В его заголовочной части имеются три выражения:
Поскольку все удалось разместить в заголовочной части, то в теле цикла for нет необходимости. Но тело циклической конструкции должно присутствовать в любом случае, поэтому здесь тело цикла задано так называемым пустым оператором - точкой с запятой.
Работа программы будет происходить так: сначала сработает первое заголовочное выражение и переменная цикла nc обнулится. Затем начнет проверяться на истинность/ложность второе заголовочное выражение. Но чтобы его проверить, надо выполнить функцию getchar(), т. е нажать на клавишу и ввести символ. Только после этого getchar() получит значение, и это значение будет сравниваться с признаком конца файла. Если проверяемое выражение истинно, то начнет выполняться тело цикла for. Поскольку оно пусто, то управление передастся на вычисление третьего заголовочного выражения nc++. Для одного введенного символа в nc добавится одна единица. После этого управление передастся на вычисление второго заголовочного выражения, т. е. придется ввести следующий символ, который будет проверен на признак конца файла. Если введенный символ не соответствует комбинации клавиш Ctrl+Z, то снова будет выполняться тело цикла и т. д. В конце концов, когда мы нажмем Ctrl+Z, второе заголовочное выражение станет ложным, и цикл for завершит свою работу, управление будет передано на следующий за циклом for оператор.
После этого начнет выполняться оператор вывода printf(). Мы привели в программе два таких оператора, чтобы показать различие в форматах вывода переменной типа double, которая всегда выдается по формату f. Если формат задан как %0.f, то дробная часть, которая является свойством чисел с плавающей точкой, будет отброшена и число выведется как целое. Если же задать формат в виде %f, не указав количество цифр в дробной части, то после точки выведется столько цифр, сколько определено по умолчанию.
Результат работы программы представлен на рисунке 1.
Рис.1. Результат работы программы
Отметим, что программа подсчитывает также вспомогательные символы.
На следующем шаге мы рассмотрим программу, подсчитывающую количество строк в файле.