Страница 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;, что она делает?
тонкости не знаю, знаю что "дебагер" запускает
Тут еще посмотри,
http://www.cyberforum.ru/cpp-beginners/ ... 99198.html
парни обсуждали
Пасиб всем !
Re: Подсчет слов
Добавлено: 08 дек 2010, 11:40
Albor
JeyKip писал(а):может уже ни к чему, но, может пригодится...
Безусловно, любое решение имеет право на жизнь. В данном случае нужно подсчитать
слова. Я специально выделил ключевое слово к построению алгоритма подсчёта. В слове могут быть только буквы - это определяющий фактор. Проверка символа заключается в том, что является ли символ буквой или нет - всё остальное не слова, а разделители слов. Функция подсчёта будет всего в несколько строк, с одним проходом по массиву. Если есть желание, попробуйте реализовать. Вы удивитесь, на сколько всё просто. Удачи!