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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка последовательности символов 
V
    Опции темы
Metalex
Дата 7.11.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



user posted image
user posted image
Моя версия:
Код
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
main()
{const n=80; char name[n]; int i, k=0, p=0;
cout<<"Vvedit ne bilshe "<<n<<" sumvoliv\n";
gets (name);
for (i=0; i<n; i++)
{
    if (name[i]!=' ')
    k++;

    if ((name[i-1]!=' ')&(name[i]==' ')&(name[i-k]==name[i]))
    {p++;
     k=0;}
}
cout<<p<<"\n";
getch ();
return 0; }

Но! Если начать ввод name с символа, отличного от пробела, то получим всегда ноль, а если начать ввод с пробела, то всегда получим значение 1. Помогите найти ошибку(и).


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Pitlord
Дата 7.11.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Metalex, а почему нельзя было как-то переписать задание и по-своему его описать?

Если закрыть глаза на грубый код, то:
Код

int i, k=0, p=0, len; // len

// ...

for( i = 0, len = strlen(name); i < len; i++)
{
    if( name[i] != ' ' )
        k++;

    if( k && (name[i + 1] == ' ' ||  name[i + 1] == '\0') )
    {
        if( name[i + 1 - k] == name[i] )
            p++;
        
        k = 0;
    }
}

PM MAIL   Вверх
Valinur
Дата 8.11.2009, 04:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 21.9.2007
Где: Москва

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



Набросал вот кое-что... опять таки не идеальный код. Ибо желательно сделать так, чтобы пользователь мог сам ввести число символов! Но почему-то не получается, потому что начинает криво работать функция gets_s()  smile Не знаю почему, если кто знает - объясните пожалуйста.
Код достаточно понятный. Единственное, что можно отметить, это проверку на конец строки, ибо алгоритм предполагает, что после каждого слова стоит пробел, но конец может быть "беспробельным", а '\0' есть всегда smile
Код
#include <iostream>

using namespace std;

#define n 20

int main() {
    int prev=0;                // позиция первого символа в слове
    int count = 0;
    char *str;

    str = new char [n+1];
    gets_s(str,n);

    for (int i=0; i<strlen(str)+1; ++i) {
        if ((str[i] == ' ') || (str[i] == '\0')) {
            if (str[i-1] == str[prev]) {
                ++count;                
            }
            prev = i + 1;
        }
    }

    cout << count;
    delete [] str;

    return 0;
}

Ваш код... Я понял, что вы хотели сделать ) Но он в принципе не будет работать! 
Вот здесь
Код
. . .
if ((name[i-1]!=' ')&(name[i]==' ')&(name[i-k]==name[i]))
. . .
какой-то абсурд! Вы проверяете равность текущего символа пробелу (name[i]==' ') , и тут же, якобы, пытаетесь проверить равность его первому символу (name[i-k]==name[i]). "Якобы" здесь потому, что первый символ будет name[i-k-1], с учетом того, что name[i]==' ', а k это длина слова. Не пытался исправить ваш код, написал свой. Надеюсь поможет вам smile 
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Metalex
Дата 8.11.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



Ну попробовал так:
Код
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>

int main()
{
int i, sumbol=0, kolvo=0, n;

cout<<"Vvedite tseloe n - kolishestvo vashih simvolov\n";

char *str;
str=new char [n+1];

gets(str);

for (i=0; i<(strlen(str)+1); i++)
{
    if ((str[i]==' ')||(str[i]=='\0'))
    {
        if (str[i-1]==str[sumbol])
        {
            ++kolvo;
                }
        sumbol=i+1;
    }
}
cout<<"kolishestvo="<<kolvo<<"\n";
delete [] str;
str=0;
getch ();
return 0;
}

Но, почему-то сама процедура ввода строки пропускается  smile ! Подскажите в чем дело. 
З.Ы. gets_s по ходу слишком нова  для моего компилятора - Borland C++ 3.1


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Pitlord
Дата 8.11.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Metalex, n не опеределно.
PM MAIL   Вверх
Valinur
Дата 8.11.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 21.9.2007
Где: Москва

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



Код
#include <iostream>
#include <string>

using namespace std;

int main() {
    int prev=0;                // позиция первого символа в слове
    int count = 0;
    string str;
    int n=0;

    cout << "n = ";
    cin >> n;
    cin.ignore();    

    cout << "Put yout string please: ";
    getline(cin, str);
    if (str.length() > n) {
        cerr << "ERROR: length of your string is more than " << n <<" symbols\n";
        system("PAUSE");
        exit(1);
    }


    for (int i=0; i<str.length()+1; ++i) {
        if ((str[i] == ' ') || (str[i] == '\0')) {
            if (str[i-1] == str[prev]) {
                ++count;                
            }
            prev = i + 1;
        }
    }

    cout << "count = " <<count << endl;

    system("PAUSE");
    return 0;
}

Я думаю это то, что вам нужно smile

Это сообщение отредактировал(а) Valinur - 8.11.2009, 22:35
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Pitlord
Дата 8.11.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Valinur, обращение к элементам string'а делается через метод at: str.at(i) и при попытке доступа к элементу вне строки вылезет ошибка, причём нулевой байт в строку не входит.

Это сообщение отредактировал(а) Pitlord - 8.11.2009, 22:39
PM MAIL   Вверх
Valinur
Дата 8.11.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 21.9.2007
Где: Москва

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



Цитата(Pitlord @ 8.11.2009,  22:39)
Valinur, обращение к элементам string'а делается через метод at: str.at(i) и при попытке доступа к элементу вне строки вылезет ошибка...
Pitlord, обращение к отдельному символу производится одном из двух способов: оператором индексирования [] или функцией at()

Цитата(Pitlord @ 8.11.2009,  22:39)
...причём нулевой байт в строку не входит....
Это да, про это совсем забыл. Поэтому привожу, надеюсь, уже последний вариант кодаsmile

Код
#include <iostream>
#include <string>

using namespace std;

int main() {
    int prev=0;                // позиция первого символа в слове
    int count = 0;
    char *str;
    int n=0;

    cout << "n = ";
    cin >> n;
    cin.ignore();    

    str = new char[n+1];
    cout << "Put yout string please: ";
    cin.getline(str,n+1);

    for (int i=0; i<strlen(str)+1; ++i) {
        if ((str[i] == ' ') || (str[i] == '\0')) {
            if (str[i-1] == str[prev]) {
                ++count;                
            }
            prev = i + 1;
        }
    }

    cout << "count = " <<count << endl;

    system("PAUSE");
    return 0;
}


--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Metalex
Дата 9.11.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



Всем огромное спасибо за участие!


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Metalex
Дата 12.11.2009, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



Возникли вопросы:
зачем
Код
cin.ignore();

как работает
Код
cin.getline(str,n+1);

?


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
bsa
Дата 12.11.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Metalex, cin.ignore() нужен, чтобы пропустить символ конца строки, который появляется из-за нажатия на ввод.
Про std::istream::getline написано тут

Это сообщение отредактировал(а) bsa - 12.11.2009, 12:21
PM   Вверх
Metalex
Дата 12.11.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



То есть насколько я понял 
Код
cin.getline(str,n+1);

мы считываем с клавиатуры n+1 символов, которые записываются в str?
А cin.getline и std::istream::getline - это одно и то же.

Так?

Это сообщение отредактировал(а) Metalex - 12.11.2009, 13:57


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
bsa
Дата 12.11.2009, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Metalex, нет. мы считываем строку (до символа '\n'), но не более n+1 символов.
cin - это объект с поведением объекта класса std::istream. Таким образом, запись cin.getline() производит вызов метода std::istream::getline() с передачей указателя на cin в качестве параметра this.
PM   Вверх
Metalex
Дата 13.11.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



разобрался более-менее, спасибо


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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