Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с подсчётом строк и символов (C/C++)  (Прочитано 8919 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nightmare
Гость
« : 23-11-2008 14:31 » 

25. Написать программу, которая показывает на экран весь файл и подсчитывает количество:
   строк;
   слов;
   букв верхнего регистра латинского алфавита;
   букв нижнего регистра латинского алфавита;
   букв верхнего регистра русского алфавита;
   букв нижнего регистра русского алфавита;
   цифр;
   пробелов.



ПЛИЗЗЗ....................
Записан
nightmare
Гость
« Ответ #1 : 23-11-2008 14:36 » 

void main()
{
   FILE*f=fopen ("D:\\1.txt","r+");
   char*str=new char[2];
   while (feof(f)==0){
   str[0]=fgetc(f);
   str[1]='\0';
   AnsiToOem(str,str);
   cout<<str;
   }
   
   fclose(f);
}


Вот начальный код, что нужно делать дальше???
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 23-11-2008 14:46 » 

зачем делается вот это:
Код:
str[1]='\0';
AnsiToOem(str,str);
?

Ладно, пусть ты читаешь посимвольно: тогда нужно прогнать символ через ряд условий, проверяющих, к какому диапазону он принадлежит - цифра это, латинская буква, пробел, перевод строки или что ещё - и увеличить соответствующий счётчик.

Число слов, как я понимаю, определяется примерно так: если символ - не пробел и не перевод строки, то устанавливаешь флаг, что идёт слово. Как только встречается перевод строки или пробел, проверяешь флаг - если он указывает, что предыдущий символ принадлежал слову, то надо увеличить счётчик слов.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 23-11-2008 14:53 » 

Код:
int nLowerCaseLatin = 0;

while (feof(f)==0){
   char c = fgetc(f);

   if (c>='a' && c <= 'z')
     nLowerCaseLatin++;
}
остальные диапазоны символов - по образцу. Проверки на пробел - сравнение с ' ', проверка на конец строки - сравнение с '\n' ('\r' лучше специально игнорировать, наверное).
Целиком программу писать не стану.
Записан
nightmare
Гость
« Ответ #4 : 23-11-2008 15:16 » 

void main()
{
   FILE*f=fopen ("D:\\1.txt","r+");
   char*str=new char[2];
   int aaa=0;
   while (feof(f)==0)
   {
      char c = fgetc(f);

         if (c>='a' && c <= 'z')
            aaa++;
   }
   int bbb=0;
      while (feof(f)==0)
   {
      char c = fgetc(f);

         if (c>=' ' && c <= 'z')
            bbb++;
   }
   int ddd=0;
      while (feof(f)==0)
   {
      char c = fgetc(f);

         if (c>='\n' && c <= 'z')
            ddd++;
   }
      cout<<aaa<<" "<<bbb<<" "<<ddd;
}


вот написал прогу, а она выписывает токо 3 ноля
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 23-11-2008 17:12 » 

а нафига столько циклов?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 24-11-2008 13:55 » 

Вот, только нет подсчета по кириллице (причина: разные платформы используют разные кодировки).

Код:
#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
FILE *fp;
int line,word,ch_low,ch_up,digit,blank,other;
int word_flags;
int ch;

if (argc != 2) {
fprintf(stderr,"usage: %s TEXT_FILE\n",argv[0]);
return 1;
}

fp = fopen(argv[1],"r");
if (fp == NULL) {
fprintf(stderr,"Failed open file '%s'!\n",argv[1]);
return 1;
}

line = word = ch_low = ch_up = digit = blank = other = 0;
word_flags = 0;
while ((ch = fgetc(fp)) != EOF) {
int blank_flags;

putchar(ch);

if (ch == '\n') {         /* check 'line' */
line++;
blank_flags = 1;
} else if (isspace(ch)) { /* check 'blank' */
blank++;
blank_flags = 1;
} else if (isdigit(ch)) { /* check 'digit' */
digit++;
blank_flags = 0;
} else if (islower(ch)) { /* check 'ch_low' */
ch_low++;
blank_flags = 0;
} else if (isupper(ch)) { /* check 'ch_up' */
ch_up++;
blank_flags = 0;
} else {                  /* other */
other++;
blank_flags = 1;
}

if (blank_flags) {
if (word_flags) {     /* check end word */
word++;
word_flags = 0;
}
} else {
if (!word_flags) {    /* check begin word */
word_flags = 1;
}
}
}

/* final word */
if (word_flags)
word++;

fclose(fp);

printf("line: %d; word: %d; ch_low: %d; ch_up: %d; "
"digit: %d; blank: %d; other: %d;\n",line,word,ch_low,
ch_up,digit,blank,other);

return 0;
}
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines