Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

/С++/вычислить кол-во букв в последнем слове строки

17K
04 февраля 2007 года
S_A_M
10 / / 27.01.2007
[FONT=Times New Roman][SIZE=2]Простите за наглость,но со строками я не дружу(пока ещё), а решить задачки ну очень надо, а не то придётся сапоги покупать.:) Решаю я как и прежде не в Builder и не в Visual, а на самом, что ни на есть простом С++5.02.[/SIZE][/FONT]

[SIZE=2][FONT=Times New Roman]1. Даны натуральное число n, s1, …, sn. Группы символов, разделённые пробелами(одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами.[/FONT][/SIZE]
[SIZE=2][FONT=Times New Roman]Подсчитать количество букв а в последнем слове данной последовательности.[/FONT][/SIZE]
552
04 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
1

Код:
// Хоть убейте, не помню как в сишнике с буленами... )))
  boolean isWord = FALSE;
  int chars = 0;

  for (int i = n; i >= 1; i--)
  {
    if ((!isWord) && (s != ' '))
    {
      isWord = TRUE;
      chars = 1;
      continue;
    }

    if (isWord)
      if (s = ' ')
      {
        isWord = FALSE;
        break;
      }
      else
      {
        chars++;
      }
  }
Ну вроде вот... В chars будет количество букв в последнем слове.
242
04 февраля 2007 года
Оlga
2.2K / / 04.02.2006
идея
 
Код:
const int n = 14;
  int count = 0;
  char s[n+1] = "abc dfrt asder";
 
  for(int i = n - 1; i >= 0 && s != ' '; i--)
              count++;


Цитата:
Хоть убейте, не помню как в сишнике с буленами... )))


в С++ вполне хорошо, имеются, только не [COLOR=blue]boolean[/COLOR] , а [COLOR=blue]bool [COLOR=black](true, false).[/COLOR]
[/COLOR]индексация в С языках начинается с нуля, поэтому последний индекс равен n - 1

15K
04 февраля 2007 года
kamik
2 / / 16.12.2005
Подсчитать количество букв А в последнем слове данной последовательности.
 
Код:
const int n = 14;
int Count = 0;
char String[n+1] = "asdkj ksd assa";

for (int i = n; i >= 0 && String != ' '; i--)
    if (String == 'a')
        Count++;
17K
04 февраля 2007 года
S_A_M
10 / / 27.01.2007
Спасибо всем!
552
05 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
[quote=OlgaKr]в С++ вполне хорошо, имеются, только не boolean , а bool (true, false).[/quote]Ага, пасиб :)

[quote=OlgaKr]индексация в С языках начинается с нуля, поэтому последний индекс равен n - 1[/quote]Я знаю, просто в задании первый индекс стои 1 и последний n. Я уж для единообразия :)

OlgaKr, или меня глючит с просоня, или все-таки в Вашем кусочке кода не учитывается, что строка может кончаться пробелом...

А сама идея внести одно из условий в for - отличная :)
242
05 февраля 2007 года
Оlga
2.2K / / 04.02.2006
да, не учитывается :). автор помоему об этом ничего не пишит, строки обычно пробелом не заканчивают. если надо проверка - ещё один цикл с конца организовать не проблема, можно функцию Трим написать :), а вообще, студент может что то и сам написать - полезно для подготовки к экзаменам.
552
05 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Я просто очень раз на этом прокололся, теперь везде проверяю :)
Цитата:
а вообще, студент может что то и сам написать - полезно для подготовки к экзаменам.

Это точно!

9
05 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Надеюсь, не очень напугаю студента :)
Маленький юнион предложенных вариантов. Функция, подсчитывающая количество вхождений указанного символа в последнем слове строки (с учетом замыкающих пробелов). Если символ не указан, то возвращает размер последнего слова.
Код:
int calchar( char* str, char tok = '\0' )
{
    char* ptr = str;
    while( *(++ptr) );      // перемещаемся в конец строки
    while( *(--ptr) == ' ' );   // становимся на первый (с конца) символ, отличный от пробела

    int ncount = 0;
    while( *ptr-- != ' ' && ptr != str )
    {
    if( tok && *ptr != tok )
        continue;
    ncount++;
    }

    return ncount;
}


Update: Выяснилось, что ранняя функция не срабатывала в случаях, когда слово заканчивалось искомым символом, и если строка состояла из одного слова и начиналась искомым символом. Поэтому - еще вариант.
Код:
int calchar( char* str, char tok = '\0' )
{
    char* ptr = str;
    while( *(++ptr) );
    while( *(--ptr) == ' ' );

    int ncount = 0;
    do
    {
    if( tok && *ptr != tok )
        continue;
    ncount++;
    } while( *ptr-- != ' ' && ptr != (str - 1) );

    return ncount;
}


P.S. Можно еще более оптимально придумать.
552
05 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Один вопрос...
Когда поинтер вылезет за границу строки - он станет нулевым, я правильно понял? А это логически эквивалентно фэлсу.
9
05 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Ivanhoe
Один вопрос...
Когда поинтер вылезет за границу строки - он станет нулевым, я правильно понял? А это логически эквивалентно фэлсу.



Нет. Он просто будет указывать не на строку.

552
05 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Я вот к чему:
 
Код:
while( *(++ptr) );


Ну, если я не ошибаюсь, то строчки нулем заканчиваются? В смысле тем самым \0? А для char это просто ноль, поскольку chat вроде как числовой
тип. И 0 == FALSE. Я правильно выстроил цепочку рассуждений?
9
05 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Ivanhoe
Я вот к чему:
 
Код:
while( *(++ptr) );


Ну, если я не ошибаюсь, то строчки нулем заканчиваются? В смысле тем самым \0? А для char это просто ноль, поскольку chat вроде как числовой
тип. И 0 == FALSE. Я правильно выстроил цепочку рассуждений?



Правильно. В данном коде, цикл остановится, когда указатель "укажет" на замыкающий \0.
Если написать while( *ptr++ ), то указатель установится на следующий после \0 символ, поскольку инкремент здесь постфиксный.

552
05 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Эм... может быть имелось в виду:
 
Код:
while( *(ptr++) );

?
++a - это инкремент до проверки условия
a++ - после
Иль я опять туплю?
9
05 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Ivanhoe
Эм... может быть имелось в виду:
 
Код:
while( *(ptr++) );


while( *(ptr++) ) и while( *(++ptr) ) - разные вещи.

Цитата: Ivanhoe

++a - это инкремент до проверки условия
a++ - после


Совершенно справедливо.

552
05 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Ааа, все!! Догнал, спасибо! :)
Вот до чего джава людей доводит, уже не помню, как такие вещи работают )) (/пошел пить йад/ :D)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог