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

   
На этом шаге мы рассмотрим особенности работы такой программы.

   
Договоримся, что слово - это любая последовательность символов, не содержащая пробелов, символов табуляции (\t) и новой строки (\n). Наряду с количеством слов программа
будет подсчитывать количество символов и строк.

   
Текст программы приведен ниже:

// Count_Words.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

#define YES 1 // для придания значения переменной in 
#define NO 0  // для придания значения переменной in 

int main()
{
	setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами
	                             //для корректного вывода кириллицы

	int c;   //для ввода символа
	int nc;  //для подсчета количества введенных символов
	int nl;  //счетчик строк
	int nw;  //счетчик слов
	int in;  //флажок слежения за тем, находится ли в данный
	         //момент программа внутри слова или нет
	
	nc=nl=nw=0; //обнуление счетчиков
	in = NO; //до ввода находимся вне слова

	printf("Задайте строку и нажмите Enter >\n"); 
	while((c=getchar()) != eof) 
	{
		if (c != '\n') //если символ - не конец строки...
			nc++; //...его надо учитывать в счетчике
		          // (кроме Ctrl+Z и \n)
		else
			nl++; //...иначе это конец строки
		          //увеличиваем число строк

		if (c==' ' || c=='\n' || c=='\t') //если символ хотя бы один из... 
			in = NO; //сколько бы раз ни нажимали на клавиши пробел,
		                 //конец строки, табуляция, всегда будем 
                                 //находиться вне слова
		else //сюда попадаем только тогда, когда нажали любую клавишу,
	    	     //кроме пробела, Enter и конца строки
			 if (in == NO)
			 {
				 in = YES; //попали на начало слова
				 nw++;     //и слово надо учесть в счетчике
			 }
			 else
				 ; //эта часть выполняется, когда мы, находясь внутри 
                                   //слова (in != NO) ввели любой символ, кроме 
                                   //пробела, знака табуляции и знака конца 
		                   //строки. В этом случае подсчет слов не ведется, 
                                   //а программа возвращается на ввод
		                   //следующего символа
	} //конец цикла while
	printf("Строк    = %d\n", nl);
	printf("Слов     = %d\n", nw);
	printf("Символов = %d\n", nc);

	_getch();  /*вводит символ, но без эхо-сопровождения 
			   (для организации задержки экрана) */
    return 0;
}

Архив проекта можно взять здесь.

   
Весь ход работы программы ясен из подробного комментария. Стоит обратить внимание на некоторые нововведения:

  • nc=nl=nw=0; - так можно писать, потому что операция "присвоить (=)" выполняется справа налево. Поэтому сначала выполнится nw=0, потом выражение
    nl=nw (уже равное нулю), затем выполнится nc=nl;
  • появилась конструкция else. Это необязательная часть условной конструкции if. Если условие в скобках if ложно и нет части else, то тело условной конструкции
    if не выполняется, а начинает работать следующий за if оператор. Если есть необязательная часть else и условие if ложно, то выполняется тело конструкции else
    (тело else обладает такими же свойствами, как и тело if). Если условие if истинно, то выполняется тело этого оператора, а конструкция else пропускается;
  • появилась комбинация else if. Она работает точно так же, как и конструкция if: если в ее скобках условие выполняется, то выполняется ее тело, в противном случае тело пропускается;
  • появилась логическая операция || (или) или операция дизъюнкции. Это бинарная операция, результат которой истинен, когда истинен хотя бы один из операндов.
    В противоположность ей существует бинарная логическая операция && (и) или операция конъюнкции. Ее результат истинен только тогда, когда оба операнда истинны. Если хотя бы один из них ложен, то ложен и результат;
  • у последней конструкции else тело состоит из одного (пустого) оператора. Эту конструкцию else можно было бы опустить (она оставлена для более ясного понимания логики работы программы).

   
Результат расчетов приведен на рисунке 1.


Рис.1. Результат работы приложения

   
Со следующего шага мы начнем знакомиться с массивами.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий