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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вырезать из строки слова, встречающиеся более двух раз 
V
    Опции темы
Metalex
Дата 9.11.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



user posted image
user posted image
Задача 269:
user posted image
Ни до чего лучшего я не додумался, кроме как записывать в динамический массив номер начала и конца каждого слова, а потом уже используя этот массив с номерами, сравнивать слова. Пока я только запрограммировал запись этих  номеров еще без сравнения:
Код
#include<iostream.h>
#include<conio.h>
#include<stdio.h>  //gets
#include<string.h> //strlen

int main()
{
int i, j, elem_i=0, elem_j=0, n, number=0;

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

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

gets(str);

int **word;
word=new int*[n];

for (i=0; i<(strlen(str)+1); i++)
{
    if ((str[i]==' ')||(str[i]=='\0'))
    {
        if ((str[i-1]!=' ')&(i!=0))
        {
            word[elem_i][0]=number;
            word[elem_i][1]=(i-1);
        }
        elem_i++;
    }
    else number++;
}

for (i=0; i<elem_i; i++)
for (j=0; j<2; j++)
cout<<word [i][j]<<"\n";

for (i=0; i<strlen(str); i++)
    delete word[i];

delete [] word;
delete [] str;
str=0;
word=0;

getch ();
return 0;
}

При исполнении ввод происходит нормально, а когда должены выводится номера, окно просто закрывается...(Borland C++ 3.1) Помогите найти ошибку здесь, а дальше буду пытатся сравнивать.


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


Вольноопределяющийся
*


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

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



Может стоит перейти на с++?
Вот пример из Страуструпа.
Программа считает количество повторений каждого слова.
До сабжа рукой подать.

Код

map<string,int>histogram;

void record(const string& s)
{
    histogram[s]++;
}

void print(const pair<const string,int>& r)
{
    cout << r.first << '\t' << r.second << '\n';
}

istream_iterator<string>ii(cin);
istream_iterator<string>eos;

for_each(ii,eos,record);
for_each(histogram.begin(),histogram.end(),print);

PM MAIL   Вверх
Metalex
Дата 10.11.2009, 17:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



и как она работает? мне ничего не понятно


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


Опытный
**


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

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



неужели программисты не могут найти ошибку в моем коде?


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


Опытный
**


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

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



Metalex, твой код большой, страшный и непонятный.
никто не хочет его читать
перепиши на С++

Это сообщение отредактировал(а) Abyx - 10.11.2009, 19:43
PM MAIL   Вверх
Metalex
Дата 10.11.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Abyx, а это что?


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


Опытный
**


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

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



Основная проблема по которой ты даже не можешь посмотреть результаты своей программы - это особенности оператора gets. Объясняю подробнее: перед его использованием ты вводишь колличество символов оператором cin>>n; Соответственно в n записывается введённое тобой число а во входной очереди остаётся последовательность '/n', собственно на которую gets и реагирует. Таким образом gets принимает эту последовательность и завершается и в твоём чаровском масиве записывается 0 символов. А вся строкаа, которую ты пишешь дальше - ты пишешь для оператора getch(). Поставь после cin>>n; оператор getch() и будешь уже получать содержательные результаты, на которые будешь уже сстветственно реагировать.

ЗЫ А сам код не смотрел, потому что он у тебя действительно кривовато написан и нет никакого желания тратить время на его проверку. 
ЗЫЫ И перейди с (Borland C++ 3.1) на что нибуть поновее. Слишком уж старая версия плюсов. =)

Это сообщение отредактировал(а) N1ko - 11.11.2009, 00:38
PM MAIL ICQ   Вверх
Metalex
Дата 11.11.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



N1ko, getch() - это для задержки экрана, чтоб он не пропадал сразу же после выполнения программы. 
Посоветуй, на что поновее?


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


Опытный
**


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

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



1) getch() насколько я помню ждёт принятия одного символа, а задержка экрана это только последствие работы этого оператора
Цитата

int getch();
Описание:
Функция getch читает без эхо-отображения отдельный символ прямо с консоли

2) Ну например dev C++ А если собираешься серьёхно этим заниматься то устанавливай visual studio и выбирай там консольный проект

Это сообщение отредактировал(а) N1ko - 11.11.2009, 02:11
PM MAIL ICQ   Вверх
Metalex
Дата 11.11.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dev C++, журнал компиляции:
Цитата
Компілятор: Default compiler
Виконання  g++.exe...
g++.exe "D:\BORLANDC\BIN\5laba\3ZADACHA.CPP" -o "D:\BORLANDC\BIN\5laba\3ZADACHA.exe"    -I"C:\Dev-Cpp\include\c++"  -I"C:\Dev-Cpp\include\c++\mingw32"  -I"C:\Dev-Cpp\include\c++\backward"  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib"
In file included from C:/Dev-Cpp/include/c++/backward/iostream.h:31,
                 from D:/BORLANDC/BIN/5laba/3ZADACHA.CPP:1:
C:/Dev-Cpp/include/c++/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.
D:/BORLANDC/BIN/5laba/3ZADACHA.CPP:49:2: warning: no newline at end of file

Виконання завершено
Компіляція успішна

Здесь есть какие-то предупреждения, но я не пойму какие..


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


Опытный
**


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

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



ну одна из ошибок Вместо <iostream.h> нужно писать <iostream> Это новый стандарт. Исходя из твоего изначального кода ещё нужно убрать getch () и conio.h так как это так это уже тоже не используется.  Перед каждым cin и cout напиши std:: Что это такое можешь почитать в инете. Благо инфы по этому поводу много. Вместо getch() используй cin.get(); фоператор принимающий один символ. 
<strstream.h> у тебя тож не правильный. Правда не помню для чего он юзается. В общем всё нужно заменить по новым стандартам. После того как прочтёшь это всё,и справишь и что то будет не получаться, кинь код - помогу.

Это сообщение отредактировал(а) N1ko - 11.11.2009, 12:00
PM MAIL ICQ   Вверх
ThisIsSparta
Дата 11.11.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Metalex @  10.11.2009,  22:43 Найти цитируемый пост)
getch() - это для задержки экрана, чтоб он не пропадал сразу же после выполнения программы. 

используй для этой цели лучше 
Код
std::cin.get();


Это сообщение отредактировал(а) ThisIsSparta - 11.11.2009, 12:15
PM MAIL   Вверх
N1ko
Дата 11.11.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну я вообщето это написал )))) А здесь как бы между этими вариантами выбрать не получится, по этому слово лучше здесь мягко говоря не уместно. Ведь всё зависит только от компилятора насколько я знаю. Только в зависимости от него мы будем выполнять тот или инной оператор.

Это сообщение отредактировал(а) N1ko - 11.11.2009, 16:44
PM MAIL ICQ   Вверх
ThisIsSparta
Дата 11.11.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(N1ko @  11.11.2009,  14:43 Найти цитируемый пост)
Ну я вообщето это написал ))))

мда, не заметил))
Цитата(N1ko @  11.11.2009,  14:43 Найти цитируемый пост)
Ведь всё зависит только от компилятора насколько я знаю. Только в зависимости от него мы будем выполнять тот или инной оператор.

не очень понял, это относится к cin.get() vs getch()? cin.get - это, насколько я знаю, кроссплатформенный вариант (из iostream), а getch() - не входит в стандартную библиотеку c++ (из conio.h).
PM MAIL   Вверх
N1ko
Дата 11.11.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я почему то думал что cin.get() в Borland 3.1 C++ не было ещё. Значит ошибался. =) Сорри =))
PM MAIL ICQ   Вверх
Metalex
Дата 12.11.2009, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ок займусь оптимизацией кода.


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


Опытный
**


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

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



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

using namespace std;

int main()
{
int i, j, elem_i=0, elem_j=0, n, number=0;

std::cout<<"Vvedite tseloe n - kolishestvo vashih simvolov\n";
std::cin>>n;

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

cin>>str;

int **word;
word=new int*[n];

for (i=0; i<(strlen(str)+1); i++)
{
    if ((str[i]==' ')||(str[i]=='\0'))
    {
        if ((str[i-1]!=' ')&(i!=0))
        {
            word[elem_i][0]=number;
            word[elem_i][1]=(i-1);
        }
        elem_i++;
    }
    else number++;
}

for (i=0; i<elem_i; i++)
for (j=0; j<2; j++)
std::cout<<word [i][j]<<"\n";

for (i=0; i<strlen(str); i++)
    delete word[i];

delete [] word;
delete [] str;
word=0;

std::cin.get();
return 0;
}

Массив с номерами не хочет выводится.


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


Эксперт
****


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

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



Metalex
Код
#include<string> //strlen
тебе дико повезло, что вообще скомпилировалось. Нужно подключать <cstring> для получения доступа к функциям strlen,strcpy и пр.
где ты выделяешь память под переменные типа int, которые инициализируешь в строках 27 и 28?
PM   Вверх
SemiC4
Дата 23.7.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mekhanikus @ 10.11.2009,  13:04)
Может стоит перейти на с++?
Вот пример из Страуструпа.
Программа считает количество повторений каждого слова.
До сабжа рукой подать.

Код

map<string,int>histogram;

void record(const string& s)
{
    histogram[s]++;
}

void print(const pair<const string,int>& r)
{
    cout << r.first << '\t' << r.second << '\n';
}

istream_iterator<string>ii(cin);
istream_iterator<string>eos;

for_each(ii,eos,record);
for_each(histogram.begin(),histogram.end(),print);

Здравствуйте, я токо начинаю. Читаю Страуструпа. вот этот пример про подчет количества вхождения слов в строке. у меня вопрос почему не заканчивается ввод, создается впечатление, что интер программа не воспринимет как конец ввода. и программа не выходит из алгоритма for_each(ii,eos,record);
PM MAIL   Вверх
azesmcar
Дата 23.7.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(SemiC4 @  23.7.2010,  15:37 Найти цитируемый пост)
создается впечатление, что интер программа не воспринимет как конец ввода

естественно, конец ввода это Ctrl+Z.
PM   Вверх
djamshud
Дата 23.7.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



>конец ввода это Ctrl+Z

В DOS и Win. Исторически и в unix конец передачи (или файла) - ctrl+d.

Добавлено через 2 минуты и 40 секунд
Исторически - я имел в виду аски-код, забинденный на это сочестание.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
SemiC4
Дата 23.7.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(azesmcar @ 23.7.2010,  17:15)

естественно, конец ввода это Ctrl+Z.

огромное спасибо  smile  . щас ещё разберусь почему программа завершается раньше времени и будет вобще хорошоsmile smile 

Код
#include<iostream>
#include<algorithm>
#include<map>
#include<iterator>

bool quit()
{
    int tries = 1;
    while (tries < 4)
    {
          std::cout<<"\nWhould you like exit? yes(y) no(n)\n";
          char answer;
          std::cin>>answer;
          switch(answer)
          {
          case 'y':
               return true;
          case 'n':
               return false;
          default:
               {
               std::cout<<"repat answer\n";
               tries++;
               }
          }
    }
    std::cout<<"I think, you mean \"yes\"\n";
    return true;
}

std::map<std::string, int> histogram;

void record (const std::string &s)
{
         histogram[s]++;
}

void print (const std::pair<const std::string, int> &r)
{
         std::cout<<r.first<<' '<<r.second<<'\n';
}

int main()
{
do
{
    std::istream_iterator<std::string> ii (std::cin);
    std::istream_iterator<std::string> eos;

    std::for_each(ii, eos, record);
    std::for_each(histogram.begin(), histogram.end(), print);
}while(!quit());
return 0;
}


не пойму почему после того как я ввел строку, нажал интер, потом ctrl+z, интер, программа выводит результат и закрывается, причем пишется что программа завершилась с тем кодом что указан в ретуне функции майн smile 

Это сообщение отредактировал(а) SemiC4 - 23.7.2010, 20:48
PM MAIL   Вверх
bsa
Дата 23.7.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



SemiC4, читать надо начинать c часто задаваемых вопросов
PM   Вверх
SemiC4
Дата 24.7.2010, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 23.7.2010,  22:32)
SemiC4, читать надо начинать c часто задаваемых вопросов

Спасибо конечно за совет, но то что описано  здесь, в часто задаваемых вопросах, (про быстрое закрытие программ, в самом конце) мне не помогло, потому как даже с такими изменениями в коде

Код
#include<iostream>
#include<algorithm>
#include<map>
#include<iterator>

bool quit()
{
    int tries = 1;
    while (tries < 4)
    {
          std::cout<<"\nWhould you like exit? yes(y) no(n)\n";
          char answer;
          std::cin>>answer;
          switch(answer)
          {
          case 'y':
               return true;
          case 'n':
               return false;
          default:
               {
               std::cout<<"repat answer\n";
               tries++;
               }
          }
    }
    std::cout<<"I think, you mean \"yes\"\n";
    return true;
}

std::map<std::string, int> histogram;

void record (const std::string &s)
{
         histogram[s]++;
}

void print (const std::pair<const std::string, int> &r)
{
         std::cout<<r.first<<' '<<r.second<<'\n';

         std::cin.ignore().get();
}

int main()
{
do
{
    std::istream_iterator<std::string> ii (std::cin);
    std::istream_iterator<std::string> eos;

    std::for_each(ii, eos, record);
    std::for_each(histogram.begin(), histogram.end(), print);

    std::cin.ignore().get();

}while(!quit());
return 0;
}

 

результат тот же smile 
PM MAIL   Вверх
bsa
Дата 25.7.2010, 17:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



блин. конечно тут не будет работать, так как после первого for_each поток std::cin перешел в состояние "конец файла" и из него больше ничего не читается. В данном случае, "паузу" можно сделать только через system("pause"), но функция quit() работать не будет. Решить проблему можно тремя путями:
1. читать значения из файла
2. зарезервировать определенное слово (или пустую строку) для выхода, например "quit" - в случае ее появления программа завершает ввод.
3. читать только определенное количество слов (например, предварительно спросив у пользователя)
PM   Вверх
SemiC4
Дата 25.7.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 25.7.2010,  17:24)
блин. конечно тут не будет работать, так как после первого for_each поток std::cin перешел в состояние "конец файла" и из него больше ничего не читается. В данном случае, "паузу" можно сделать только через system("pause"), но функция quit() работать не будет. Решить проблему можно тремя путями:
1. читать значения из файла
2. зарезервировать определенное слово (или пустую строку) для выхода, например "quit" - в случае ее появления программа завершает ввод.
3. читать только определенное количество слов (например, предварительно спросив у пользователя)

Огромное спасибо, bsa smile . теперь что-то проясняется smile 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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