Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Turbo C++ 3.0] Подсчёт слов 
V
    Опции темы
xStorm
Дата 25.4.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



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

#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 

Это сообщение отредактировал(а) xStorm - 25.4.2007, 08:43
PM MAIL ICQ   Вверх
darkart
Дата 25.4.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Код

#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;
}

PM MAIL WWW ICQ Skype GTalk   Вверх
xStorm
Дата 25.4.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) xStorm - 25.4.2007, 16:18
PM MAIL ICQ   Вверх
apook
Дата 25.4.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Начал разбираться и сразу на что то нанкнулся
Вдумайся
Код

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 )
Короче напутал с и или, далее по ходу в том-же духе.


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
apook
Дата 25.4.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



держи не парься 
Код

#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;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
xStorm
Дата 25.4.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



Извени, но не работает, попробуй ввести хотябы 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 
PM MAIL ICQ   Вверх
Xenon
Дата 25.4.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Код

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;
    }

}


Это сообщение отредактировал(а) Xenon - 25.4.2007, 22:30


--------------------
user posted image  
PM MAIL   Вверх
xStorm
Дата 26.4.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



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

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

а именно ценртальная часть. разъясните как мне переделать.
Да и вообще я всеголишь прошу 1 строчку кода у меня проверить! Зачем вы мне проги пишите? Извените конечно за настойчивость.
PM MAIL ICQ   Вверх
Xenon
Дата 26.4.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



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');
}


Это сообщение отредактировал(а) Xenon - 26.4.2007, 01:12


--------------------
user posted image  
PM MAIL   Вверх
apook
Дата 26.4.2007, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Код

#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;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
xStorm
Дата 26.4.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



Ни 1, ни 2 не работают правильно. Поэксперементируйте с вариантами ввода.
Darkart единственный кто написал работающий код. Просто думал поможете исправить мой код. Ну да ладно, задача решина, вопрос будем считать решенным.
PM MAIL ICQ   Вверх
Xenon
Дата 26.4.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



xStorm,  в чем некорректность моего кода?


--------------------
user posted image  
PM MAIL   Вверх
xStorm
Дата 27.4.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



В условии задачи сказано (условие в 1 посте), что нужно учесть различные варианты ввода, а программа не работает с табуляцией и некорректно отображает кол-во слов если вводить их через несколько пробелов, и при вводе пустой строки выводит 1.
PM MAIL ICQ   Вверх
Xenon
Дата 28.4.2007, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



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


Это сообщение отредактировал(а) Xenon - 28.4.2007, 02:31


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0991 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.