Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Turbo C++ 3.0] Подсчёт слов


Автор: xStorm 25.4.2007, 08:20
Задача: Подсчитать количиство слов, состоящих только из цифр. (Учесть различные варианты ввода строки)
Код

#include"stdio.h"
#include"conio.h"
#include"string.h"

int counter(char* fstr)
{
   int d=0, i, j=0, flag;
   for(i=0; i<=strlen(fstr); i++)
   {
      if(!(fstr[i] == ' ')) flag=0;

      if((fstr[i] >= '0' && fstr[i] <= '9') || ((fstr[i] == ' ' && j > 0) && flag == 0))
      {
     if(fstr[i] == ' ') flag=1;
     j++;
     if((i-1 >= 0) && !(fstr[i-1] == ' ') && !(fstr[i-1] == '\t') && !(fstr[i-1] >= '0' && fstr[i-1] <= '9')) j=0;
      } else j=0;

      if((fstr[i] == ' ' || i+1 == strlen(fstr) || fstr[i+1] == '\t') && j > 0) d++;
   }
   return(d);
}

void main()
{
   char str[103], c;
   int count=0;

   do{
      clrscr();
      printf("Vvedite stroky: ");
      gets(str);
      count=counter(str);
      printf("\nKol-vo slov, sost. iz cifr: %d\n",count);
      printf("\nProdolzit'? (N - Net):");
   }while(!((c=getch())=='N' || c=='n'));
}


Вот так я решил решил эту проблему, но задача работает некорректно если слово оканчивается на цифру, поэтому я добавил условие if((i-1 >= 0) && !(fstr[i-1] == ' ') && !(fstr[i-1] == '\t') && !(fstr[i-1] >= '0' && fstr[i-1] <= '9')) j=0; Почему оно не работает?? (16 строка кода) В С я новичок, строго не судите  smile 

Автор: darkart 25.4.2007, 11:43
Код

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
#define MAX_STRING_LENGTH 255//максимальная длина строки
const int TRUE=1;//истина
const int FALSE=0;//ложь
int IsNumber(char* strWord)//функция возвращает TRUE, если строка strWord состоит только из цифр
{
  int len=strlen(strWord);//узнаем длину строки
  int i=0;//тициализация счетчика
  while(i<len&&isdigit(strWord[i]))//пока не конец строки и I-ый символ цифра
    i++;//увеличение i
  if(i==len)//если дошли до конца строки
    return TRUE;//строка из цифр
  else
    return FALSE;//есть не цифра
}
int GetNumberWordsAmount(char* strText)//функция возвращает количество слов, состоящих только из цифр в строке strText
{
  int i,j,iResult;//i,j - счетчики, iResult - результат
  int len=strlen(strText);//узнаем длину строки
  char strWord[MAX_STRING_LENGTH+1];//слово
  iResult=0;//инициализация результата
  i=0;//инициализация счетчика в строке текста
  while(i<len)//пока не конец строки
  {
    j=0;//инициализация счетчика в строке-слове
    while(i<len&&!(isalpha(strText[i])||isdigit(strText[i])))//пока не конец строки и I-ый символ не буква и не цифра
      i++;//переходим к следующему символу
    while(i<len&&(isalpha(strText[i])||isdigit(strText[i])))//пока не конец строки и i-ый символ буква или цифра
    {
      strWord[j]=strText[i];//запоминаем i-ый символ строки strText в j-ом strWord
      i++;//увеличение
      j++;//увеличение
    }
    strWord[j]='\0';//добавляем NULL символ
    if(IsNumber(strWord))//если строка strWord - из цифр
      iResult++;//увеличение результата
  }
  return iResult;//возвращаем результат
}
int main()
{
  char ch;//для выбора действия
  char strText[MAX_STRING_LENGTH+1];//строка текста
  do
  {
    printf("Please enter a string:\n");
    gets(strText);//ввод строки
    printf("Number words: %d\n",GetNumberWordsAmount(strText));//печать результата(кол-во слов из цифр)
    printf("Exit?(y - yes, else -no)");//выход по y
    scanf("%c",&ch);//ввод символа
  }
  while(ch!='y'&&ch!='Y');//пока ch не равно y или Y
  return 0;
}

Автор: xStorm 25.4.2007, 16:13
Спасибо. Это вы сидели писали? Но вопрос к сожалению не решен, я всеголишь хотел узнать почему моё условие на 16 строчке кода не выполняется. Моя идея решения: посимвольно проверять слово и если при его окончании (пробел, забой, конец строки) переменная j > 0 то слово состоит из цифр. Почти Все работает, кроме условия на 16 строчке, в нём я проверяю ситуацию, что если предшествующий символ не пробел и не забой и не цифра то j = 0. Понимаю писать программу гораздо приятнее чем копаться в коде непрофессионала, но меня интересует 1 строчка, да и задачка короткая, если возможно помогите разобраться.
ЗЫ: Спосибо за написанную прогу, кое-что для себя отметил. Да, в ней маленький жучок сидит. Но его всего ничего править.

Автор: apook 25.4.2007, 16:57
Начал разбираться и сразу на что то нанкнулся
Вдумайся
Код

fstr[i] >= '0' && fstr[i] <= '9'

так можно, но странновато, тогда уж не &&, а || или только <9
но это мелочь. Далее:
Код

    if( fstr[ i ] != ' ') flag=0;
    //             ^ - посмотри сюда    
    if( (fstr[ i ]>='0' && fstr[ i ]<='9' ) || ((fstr[ i ]==' ' && j>0) && flag==0) )
    //                                                     ^- а теперь сюда    ^ -и сюда 

Если у тебя flag равен нулю если символ fstr[ i ] не равен пробелу то условие
если символ fstr[ i ] равен пробелу и flag равен нулю не выполнится никогда( наверно smile )
Короче напутал с и или, далее по ходу в том-же духе.

Автор: apook 25.4.2007, 17:59
держи не парься 
Код

#include"stdio.h"
#include"conio.h"
#include"string.h"
#include"ctype.h"

int counter( char *fstr )
{
int d=0, i, j=0, flag=0;

for( i=0, flag=0; i<=strlen(fstr); i++ )
{
     if( fstr[ i ]==' ' || fstr[ i ]=='\t' || fstr[ i ]=='\0' || fstr[ i ]=='\n' )
     {
        ++j;
        if( flag==1 ) ++d;
        flag=0; 
        }
    else if( isdigit(fstr[ i ]) )
        flag=1;
     }
return d;
}


void main( void )
{
char str[ 103 ], c;
int count=0;

do {
    clrscr();
    printf( "Vvedite stroky: " );
    gets( str );
    count=counter( str );
    printf( "\nKol-vo slov, sost. iz cifr: %d\n", count );
    printf( "\nProdolzit'? (N - Net):" );
   } while( !((c=getch())=='N' || c=='n') );
return;
}

Автор: xStorm 25.4.2007, 21:11
Извени, но не работает, попробуй ввести хотябы qq11 11qq должно быть 0, а он 2 выдаёт.
(fstr[i] >= '0' && fstr[i] <= '9') равняется isdigit(fstr[ i ]), просто модуль я не подключал. Непонимаю ваших возмущений
Код

      if(!(fstr[i] == ' ')) flag=0;

      if((fstr[i] >= '0' && fstr[i] <= '9') || ((fstr[i] == ' ' && j > 0) && flag == 0))

Всё выполняется тут ^^. Мне ведь не это надо  smile 
Попробую ещё спросить:
Почему не выполняется условие на 16 строчке? Идея у меня правильная, а может с лексикой языка что намудрил, да намудрил точно иначе бы работало, токо где именно найти не могу.
Так что вопрос ещё открыт  smile 

Автор: Xenon 25.4.2007, 22:04
Код

const char* str = "9 am a 99 e9 man 5 a";
bool are_digits = true;
int count = 0;
for (int i = 1; i < std::strlen(str); ++i)
{
    if ((str[i] < '0' || str[i] > '9') && (str[i] != ' ' || str[i-1] == ' ') )  are_digits = false;
    if (str[i] == ' ' || str[i] == '\n' || str[i+1] == '\0')
    {
        if (are_digits == true) ++count;
        else are_digits = true;
    }

}

Автор: xStorm 26.4.2007, 00:46
Я в теме указал какой у меня комптлятор. тип bool с помощью #define легко воспроизвести, а вот эта строчка вообще никак 
Код

for (int i = 1; i < std::strlen(str); ++i)

а именно ценртальная часть. разъясните как мне переделать.
Да и вообще я всеголишь прошу 1 строчку кода у меня проверить! Зачем вы мне проги пишите? Извените конечно за настойчивость.

Автор: Xenon 26.4.2007, 00:55
xStorm, а я твой код и поправил.
Чем твоя строчка
Код

for(i=0; i<=strlen(fstr); i++)

координально отличается от
Код

for (int i = 1; i < std::strlen(str); ++i)

?
А насчет компилятора виноват - не заметил. std:: сотри.

Код

#include "stdio.h"
#include "conio.h"
#include "string.h"

int counter(char* fstr)
{
    int are_digits = 1;
    int count = 0;
    for (int i = 1; i < strlen(str); ++i)
    {
        if ((str[i] < '0' || str[i] > '9') && (str[i] != ' ' || str[i-1] == ' ') )  are_digits = 0;
        if (str[i] == ' ' || str[i] == '\n' || str[i+1] == '\0')
        {
            if (are_digits == 1) ++count;
            else are_digits = 1;
        }
    }
    return count;
}

void main()
{
   char str[103], c;
   int count = 0;
   do
   {
      clrscr();
      printf("Vvedite stroky: ");
      gets(str);
      count=counter(str);
      printf("\nKol-vo slov, sost. iz cifr: %d\n",count);
      printf("\nProdolzit'? (N - Net):");
      c = getch();
   }while(c != 'N' && c != 'n');
}

Автор: apook 26.4.2007, 04:46
Код

#include"stdio.h"
#include"conio.h"
#include"string.h"
#include"ctype.h"

int counter( char *fstr )
{
int d=0, i, j=0, flag=0;

for( i=0, flag=0; i<=strlen(fstr); i++ )
{
     if( fstr[ i ]==' ' || fstr[ i ]=='\t' || fstr[ i ]=='\0' || fstr[ i ]=='\n' )
     {
        ++j;
        if( flag==0 ) ++d;
        flag=0; 
        }
    else if( !isdigit(fstr[ i ]) )
        flag=1;
     }
return d;
}


void main( void )
{
char str[ 103 ], c;
int count=0;

do {
    clrscr();
    printf( "Vvedite stroky: " );
    gets( str );
    count=counter( str );
    printf( "\nKol-vo slov, sost. iz cifr: %d\n", count );
    printf( "\nProdolzit'? (N - Net):" );
   } while( !((c=getch())=='N' || c=='n') );
return;
}

Автор: xStorm 26.4.2007, 17:51
Ни 1, ни 2 не работают правильно. Поэксперементируйте с вариантами ввода.
Darkart единственный кто написал работающий код. Просто думал поможете исправить мой код. Ну да ладно, задача решина, вопрос будем считать решенным.

Автор: Xenon 26.4.2007, 19:52
xStorm,  в чем некорректность моего кода?

Автор: xStorm 27.4.2007, 18:36
В условии задачи сказано (условие в 1 посте), что нужно учесть различные варианты ввода, а программа не работает с табуляцией и некорректно отображает кол-во слов если вводить их через несколько пробелов, и при вводе пустой строки выводит 1.

Автор: Xenon 28.4.2007, 02:21
xStorm, эх ... Как же ты тестировал? Я только проблему с табуляцией нашел:
Код

#include <iostream>
#include <string>

int count(const char* str)
{
    bool are_digits = true;
    int count = 0;
    for (int i = 1; i < strlen(str); ++i)
    {
        if ((str[i] < '0' || str[i] > '9') && (str[i] != ' ' || str[i-1] == ' ') )  are_digits = false;
        if (str[i] == ' ' || str[i] == '\n' || str[i+1] == '\0' || str[i] == '\t')
        {
            if (are_digits == true) ++count;
            else are_digits = true;
        }
    }
    return count;
}
int main(int argc, char* argv[])
{
    const char* str = "";
    const char* str2 = "9\t 40 m4 30 3\t      ";
    const char* str3 = "abt \t";
    cout << "str |" << str << " | " << count(str) << endl;
    cout << "str2 |" << str2 << " | " << count(str2) << endl;
    cout << "str3 |" << str3 << " | " << count(str3) << endl;
    cin.sync();
    cin.get();
    return 0;
}

Вывод:
Код

str   | | 0
str2 |9  40 m4 30 3            | 4
str3 |abt        | 0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)