Форум программистов, компьютерный форум CyberForum.ru

Подсчет слов в строке - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 17:41     Подсчет слов в строке #1
Кто-нибудь может помочь с такой проблемой: нужно написать программу на С, которая подсчитывает количество слов в строке, заканчивающихся на согласную букву.. Слова разделяются пробелами. Пробовал разные варианты, но корректно они не работают ( не учитываются первое и последнее слова в строке )..
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dxdy
 Аватар для dxdy
97 / 97 / 5
Регистрация: 14.06.2010
Сообщений: 283
02.11.2010, 17:48     Подсчет слов в строке #2
Покажите ваш код...поможем исправить ошибки.
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 17:50  [ТС]     Подсчет слов в строке #3
Вот одна из последних попыток
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX 1000
void main()
{
int k,c,i,j,counter,line[MAX],word[MAX];
const char my_Consonants[]={'q','w','r','t','p','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
c=i=j=k=counter=0;
printf("This application solves task 6 from laboratory work 4.\n");
printf("*******************************************************************************\n");
printf("Please input your string:\n");
for(i=0;(c=getchar())!='\n';i++)
{
line[i]=tolower(c);
if(line[i]==' ')
{
    word[j]=i;
    ++j;
}
}
for(k=0;k<j;++k)
{
    for(i=0;i<20;++i)
    {
        if((line[word[k]-1]==my_Consonants[i]))
        ++counter;
    }
 
}
for(i=0;i<20;++i)
{
if(line[(int)strlen(line)-1]==my_Consonants[i])
++counter;
}
printf("%s%d","Number of words which end with consonant letter is: ", counter);
scanf("%d", &c);
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
02.11.2010, 17:54     Подсчет слов в строке #4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string.h>
/*Считает количество слов в строке str, разделённых символами из строки delim, 
которые заканчиваются на любую из букв, переданных в строке tails.  
Возвращает количество найденных слов или -1 в случае ошибки. */
int tails_count(const char * str, const char * delim, const char * tails){
  char * buf, * p;
  int cnt;
  
  if ( ! str || ! delim || ! tails )
    return -1;
 
  if ( ( buf = strdup(str) ) == NULL )
    return -1;
 
  cnt = 0;
  for ( p = strtok(buf, delim); p; p = strtok(NULL, delim) )
    if ( strchr(tails, p[strlen(p) - 1]) )
      ++cnt;
 
  free(buf);
  return cnt;
}
передавайте в tails все буквы, которые считаете согласными, и будет Вам счастье...

Цитата Сообщение от BrumbleHorse Посмотреть сообщение
const char my_Consonants[]={'q','w','r','t','p','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
только вместо вот этого нужно
C
1
const char * consonants = "bcdfgh...";
строка должна нулём завершаться, а то strchr не отработает
KpeHDeJIb
 Аватар для KpeHDeJIb
56 / 56 / 3
Регистрация: 31.10.2010
Сообщений: 103
02.11.2010, 17:55     Подсчет слов в строке #5
Разделение по словам достаточно простое:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
int main()
{
    char string[] = "Веселые ночи уместно хмуры а страшные сказки уютом полны", *ptr;
    ptr = strtok(string, " ");
    while (ptr != NULL)
    {
        printf("%s\n", ptr);
        ptr = strtok(NULL, " ");
    }
    return 0;
}
Дальше сам сообразишь?
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 18:24  [ТС]     Подсчет слов в строке #6
Всем спасибо, помогли разобраться..
JerryJackson
50 / 6 / 1
Регистрация: 15.07.2010
Сообщений: 112
02.11.2010, 19:26     Подсчет слов в строке #7
А можно как-то подсчитать количество слов только не используя string?
silent_1991
Эксперт C++
4947 / 3023 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.11.2010, 19:42     Подсчет слов в строке #8
А что тут считать. Считаешь количество пробелов, увеличиваешь результат на 1 - вот и количество слов.
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 19:50  [ТС]     Подсчет слов в строке #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Просто посчитать количество слов в строке без использования string.h несложно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <conio.h>
#define IN 1
#define OUT 0
void main()
{
int c, counter,state;
state=OUT;
c=counter=0;
while((c=getchar())!='\n')
{
if(c==' ')
state=OUT;
if(state==OUT)
{
state=IN;
++counter;
}
}
printf("%d",counter);
getch();
}
JerryJackson
50 / 6 / 1
Регистрация: 15.07.2010
Сообщений: 112
02.11.2010, 19:54     Подсчет слов в строке #10
Все понятно но как можно написать программу подсчета слов у котрых к примеру в конце стои "!"
без использования string, а пользоваться только массивами и тп.

Добавлено через 1 минуту
огромное спасибо
silent_1991
Эксперт C++
4947 / 3023 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.11.2010, 19:55     Подсчет слов в строке #11
А в чём разница, с точки зрения приведённой программы, между строками
abcdefg
и
abcdef!
?
JerryJackson
50 / 6 / 1
Регистрация: 15.07.2010
Сообщений: 112
02.11.2010, 19:58     Подсчет слов в строке #12
только немного не понятно что за переменная state и out но out походу равен 0 и если в слове нет пробела то state присваивает значение out то есть правильно?

Добавлено через 2 минуты
сори я уже понял, я думал что для "!" or "?" надо создавать отдельную переменную, мне надо написать программу которая считала те слова у которых в конце стоит символы ! ?* и тп
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 20:09  [ТС]     Подсчет слов в строке #13
Ну можно сделать как-то так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <conio.h>
#define IN 1
#define OUT 0
void main()
{
int line[1000],i,counter,state;
state=IN;
counter=0;
for(i=0;(line[i]=getchar())!='\n';++i)
{
if((line[i]==' ')&&(line[i-1]=='!'))
state=OUT;
if(state==OUT)
{
state=IN;
++counter;
}
}
printf("%d",counter);
getch();
}
Но тут мы сталкиваемся с недостатком: если последнее слово будет с ! на конце и мы перед завершением ввода не поставим лишний пробел, то это слово не будет учтено.. Честно говоря пока не могу придумать как это исправить.. а почему нужно это сделать обязательно без string.h?
JerryJackson
50 / 6 / 1
Регистрация: 15.07.2010
Сообщений: 112
02.11.2010, 20:15     Подсчет слов в строке #14
Дали такое задание.... я хотел с string сделать но сказали нет сделайте без string, потом будете делать со string....
я пытался сделать но почеему-то не получалось Visual C++ постоянно выдает какие-то странные ошибки типа после if должно стоять ; хотя после if не должно стоять ; ....
сейчас попытаюсь с переменными разобраться
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 20:21  [ТС]     Подсчет слов в строке #15
Вот вроде получилось.. программа считает количество слов,содержащих на конце ! в строке
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <conio.h>
#define IN 1
#define OUT 0
void main()
{
int line[1000],i,counter,state;
state=IN;
counter=0;
for(i=0;(line[i]=getchar())!='\n';++i)
{
if((line[i]==' ')&&(line[i-1]=='!'))
state=OUT;
if(state==OUT)
{
state=IN;
++counter;
}
}
if(line[i-1]=='!')
++counter;
printf("%d",counter);
getch();
}
JerryJackson
50 / 6 / 1
Регистрация: 15.07.2010
Сообщений: 112
02.11.2010, 20:43     Подсчет слов в строке #16
Написатьпрограммуна языке C++, реализующиюперегруженнуюфункциюxcount, получа-
ющую в качестве аргумента или массив целых чисел, или символьную строку, и возвраща-
ющую количество подсчитанных элементов. Признаком конца числового массива считать
нулевой элемент. Функция не должна изменять переденные ей массивы.
Для массива целых чисел функция должна подсчитать количество последовательно-
стей из нечётных чисел, а для символьной строки – количество слов, которые оканчиваются
не на пробельный символ (конец строки также считать не пробельным символом).
Пример:
[ 12 7 5 54 67 3 3 4 1 0 ] - 2
"Привет! nil laba_12 chaos? UFO" - 3
В функции main следует подготовить исходные данные, вызвать оба варианта функ-
ции, а затем вывести исходные данные и результаты. Предусмотреть меры против аварий-
ного завершения программы из-за неправильно указанных аргументов.

Добавлено через 3 минуты
слушай можеш обьяснить что у тебя значит state ?

Добавлено через 1 минуту
не могу понять это кусок
C++
1
2
3
4
5
6
7
8
9
while((cin >> c)!='\n')
{
if(c==' ')
state=OUT;
if(state==OUT)
{
state=IN;
++counter;
}
Добавлено через 2 минуты
если переменная c(эта наша переменная для слов) равна пробелу то state присваивает OUT(присваивает 0) если state=OUT (0) то state = IN (1) а потом counter начинает считать?
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 20:47  [ТС]     Подсчет слов в строке #17
IN и OUT означают состояние: внутри или вне слова мы находимся.. если встречаем символ пробел значит предыдущее слово закончилось и следовательно state становится out(вне слова).. как только state становится OUT мы проверяем: если предыдущее слово удовлетворяет условию, увеличиваем счетчик и начинаем новое слово(state=IN), а если не удовлетворяет,то просто начинаем новое слово(state=IN) без увеличения счетчика

Добавлено через 1 минуту
Это я про программу, которая считает слова с ! на конце..В самой первой программе еще проще: там мы просто увеличиваем счетчик переходя к новому слову
JerryJackson
50 / 6 / 1
Регистрация: 15.07.2010
Сообщений: 112
02.11.2010, 20:52     Подсчет слов в строке #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
char c[50];
int counter;
counter=0;
 
while((cin >> c)!='\n')
{
if(c[50]==' ')
counter++;
if(c[50]!=' ')
counter--;
}
cout << counter;
Добавлено через 1 минуту
Все понял

Добавлено через 4 минуты
спасибо еще раз
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
02.11.2010, 21:01  [ТС]     Подсчет слов в строке #19
Только у массива из 50 элементов последний элемент будет Array[49], так как первый элемент имеет индекс [0] а не [1]..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2010, 19:40     Подсчет слов в строке
Еще ссылки по теме:

Подсчет слов в предложении C++
Подсчет кол-ва слов C++
C++ Подсчет слов в тексте
C++ Подсчет количества слов
Подсчет пятизначных слов в строке C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
JerryJackson
50 / 6 / 1
Регистрация: 15.07.2010
Сообщений: 112
03.11.2010, 19:40     Подсчет слов в строке #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stdafx.h"
#include <iostream>
#include <cctype>
 
using namespace std;
 
int xcount1(char*);
int xcount2(int*);
 
int _tmain(int argc, _TCHAR* argv[])
{
    char str1[]="Привет! nil laba_12 chaos? UFO";
    int str2[]={12,7,5,54,67,3,3,4,1,0};
    
 
    cout << xcount2(str2) << endl;
    cout <<  xcount1(str1) << endl;
 
 
    return 0;
}
int xcount1(char* a)
{
    int i=0;
    int counter=0;
    int n=0;
    while(a[i]!='\0')
    {
if((a[i]==' ')&&(a[i-1]==isalpha(a[i])))
counter++;
else
n=0;
    }
    cout << "Char=" << counter << endl;
    return counter;
}
int xcount2(int* b)
{
 int i=0;
 int counter1=0;
 int n1=0;
 while(b[i]!='\0')
 {
     if(b[i]%2!=0)
         counter1++;
     else
         n1=0;
 }
 cout << "Int=" << counter1 << endl;
 return counter1;
}
Yandex
Объявления
03.11.2010, 19:40     Подсчет слов в строке
Ответ Создать тему
Опции темы

Текущее время: 16:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru