Страница 1 из 2

Подсчет слов

Добавлено: 03 дек 2010, 23:43
Lotles

Код: Выделить всё

#include "stdafx.h"
#include "conio.h"
using namespace std;
void Podchet(char* p){
	int kol=0;
	char ch;
	int pos;
	int i;
	pos=0;
	for(i=1;pos!=strlen(p);i++){
		ch=p[i];
		if (ch==' '&& p[i-1]!=' ')
			kol++;
		pos++;
	}
	cout << "Kolichestvo slov " << kol << endl;
}
int main(){
	char* p;
	cout << "Vvedite stroku: ";
	cin >> p;
	Podchet(p);
	return 0;
}

Re: Подсчет слов

Добавлено: 04 дек 2010, 17:22
Albor
Не понятно, в чём проблема. Цикл можно было организовать проще - последний символ строки '\0'. А strtok() запрещено использовать?. Ещё: ты считаешь, что слова разделяются только пробелом, но может быть и знак препинания без последующего пробела или любой другой разделитель.

Re: Подсчет слов

Добавлено: 04 дек 2010, 19:43
Lotles
Да уже разобрался
Память под p не выделил
Но все равно пасиб

Re: Подсчет слов

Добавлено: 04 дек 2010, 20:23
Lotles
Так подредактировал, почему цикл зависает(не то что бы окончательно зависает, просто долго проходит его)
Почему неправильно работает?

Код: Выделить всё

#include "stdafx.h"
#include "conio.h"
using namespace std;
void Podchet(char* p){
	int kol=0;
	char ch;
	int pos;
	int i;
	pos=0;
	for(i=1;pos!=strlen(p);i++){
		ch=p[i];
		if ((ch==' '&& p[i-1]!=' ') || (ch==',' || ch=='/'))
			kol++;
		pos++;
	}
	cout << "Kolichestvo slov " << kol << endl;
}
int main(){
	__asm int 3;
	char* stroka = new char[100];
	cout << "Vvedite stroku: ";
	cin >> *stroka;
	Podchet(stroka);
	return 0;
}

Re: Подсчет слов

Добавлено: 05 дек 2010, 07:14
Albor
Lotles писал(а):Так подредактировал, почему цикл зависает(не то что бы окончательно зависает, просто долго проходит его)
Почему неправильно работает?
А где присваивается начальное значение переменной pos? Да и зачем она нужна, если в цикле, на кажой итерации, она изменяется одинаково с переменной i?
Ты всё равно проходишься по всему массиву, как тебе такой алгоритм: заводим булевую переменную b изначально равную false, начинаем цикл с начала массива, если встретили букву - устанавливаем b в true, иначе сбрасываем, если перед сбросом b была установлена, то увеличиваем счётчик слов. Определитель букв можешь написать сам (посмотри таблицу ASCII кодов), или посмотри на функции isalpha(), isdigit() и т.д.

Re: Подсчет слов

Добавлено: 05 дек 2010, 21:06
Lotles
Я ж присвоил pos=0
Можно обойтись и без pos, просто так для меня легче представлять алгоритм
Алгоритм я ваш попробую
Мне интересно где в этом коде ошибка, потому что задачки решаю для себя(учусь)

Re: Подсчет слов

Добавлено: 05 дек 2010, 21:50
Albor
Lotles писал(а):Я ж присвоил pos=0
Виноват, не заметил.
Lotles писал(а):Мне интересно где в этом коде ошибка, потому что задачки решаю для себя(учусь)
Во-первых, cin >> *stroka; прочитает один символ, даже если напишешь cin >> stroka; больше одного слова в массив не попадёт. для чтения полной строки нужно применять cin.getline(stroka,99). И, явно ошибка в условии оператора if. Протестируй (теоретически) поведение оператора при обработке классической строки "Hello, world!". Первое слово будет определено верно, второе -нет, вторым будет запятая, поскольку справа пробел, а слева не пробел, а последнее слово вообще проигнорируется, поскольку восклицательный знак не пробел, а пробела после него нет.
PS Просвети, что за магическая строка __asm int 3;, что она делает?

Re: Подсчет слов

Добавлено: 07 дек 2010, 21:26
JeyKip
может уже ни к чему, но, может пригодится... ;)

Код: Выделить всё

#include "iostream"
#include "conio.h"
using namespace std;
void Podchet(char *p){
    int kol=0;
    int i=0;
	cout<<p<<endl;
	//исключаем эти символы в самом начале строки
	//9 - код табуляции
	while (p[i] == ' ' || p[i] == 9 || p[i] == ',' || p[i] == '/' || p[i] == '-')
		//проматываем позицию массива
		i++;

    for(i;i<=strlen(p);i++){
		//лучше проверить сначала следующего элемента
		//если попался один из этих символов, и текущий не равен ни одному из 
		//таких элементов, то очередное слово закончилось, увеличили счетчик
        if ((p[i+1] == ' ' || p[i+1] == 9 || p[i+1] == ',' || p[i+1] == '/' || p[i+1] == '-' || p[i+1] == '\0') 
		&& (p[i] != ' ' && p[i] != 9 && p[i] != ',' && p[i] != '/' && p[i] != '-'))
            kol++;
    }
    cout << "Kolichestvo slov " << kol << endl;
}
int main()
{
    char *stroka = new char [100];
    cout << "Vvedite stroku: ";
	cin.getline(stroka,100);
    Podchet(stroka);
	getch();
    return 0;
}

Re: Подсчет слов

Добавлено: 08 дек 2010, 00:24
Lotles
PS Просвети, что за магическая строка __asm int 3;, что она делает?

Код: Выделить всё

__asm int 3;
тонкости не знаю, знаю что "дебагер" запускает
Тут еще посмотри,
http://www.cyberforum.ru/cpp-beginners/ ... 99198.html
парни обсуждали
Пасиб всем !

Re: Подсчет слов

Добавлено: 08 дек 2010, 11:40
Albor
JeyKip писал(а):может уже ни к чему, но, может пригодится... ;)
Безусловно, любое решение имеет право на жизнь. В данном случае нужно подсчитать слова. Я специально выделил ключевое слово к построению алгоритма подсчёта. В слове могут быть только буквы - это определяющий фактор. Проверка символа заключается в том, что является ли символ буквой или нет - всё остальное не слова, а разделители слов. Функция подсчёта будет всего в несколько строк, с одним проходом по массиву. Если есть желание, попробуйте реализовать. Вы удивитесь, на сколько всё просто. Удачи!