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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
#1

Использование функциональных классов - C++

19.02.2013, 00:48. Просмотров 1703. Ответов 13
Метки нет (Все метки)

Помогите решить задачу:

Создать список из строк длиной не более 100 символов.
Из всех подряд идущих строк с одинаковым количеством цифр оставить только одну. Физически уменьшить размер списка.

Примечание: Во всех вариантах этого задания требуется написать собственный функциональный класс и использовать его в подходящих для выполнения задания алгоритмах STL. Соответствующие контейнеры должны содержать не менее 30 элементов, данные в них следует читать из текстового файла.

Моя потытка выглядела так:
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
52
53
54
55
56
57
58
59
60
61
62
#include <string>
#include <list>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
 
class Fun
{public:
    int number (string);
    bool operator () (string,string);
};
bool Fun::operator()(string a, string b)
{
    return(number(a)==number(b));
}
int number (string a)
{
    a.c_str();
    for (char i='0';i!='9';i++)
    {
    if (a.find(a)!=string::npos)
        int i = 0;
        i++;
        return i;
    }
}
 
 
 
int main()
{
    setlocale(LC_ALL,"");
 
    list <string> L(100);
    list <string> :: iterator it;
 
    ifstream f ("string.txt");
    string i;
    for(it = L.begin(); it!=L.end();it++);
    {
    while(!f.eof())
    {
        f>>i;
        L.push_back(i);
    }
    }
    cout<<"Введенные данные:"<<endl;
    for(it = L.begin(); it!=L.end(); it++)
    cout<<*it<<" ";
    cout<<endl;
 
    Fun F;
    //for(it = L.begin(); it!=L.end();it++);
    remove_if(L.begin(),L.end(),F); //здесь пытаюсь удалить лишние строки, успользуя предикат, но не знаю будет ли работать ошибку выдало еще раньше в файле algorithm
 
    
    cout<<"Обработанные данные:"<<endl;
    for(it = L.begin(); it!=L.end(); it++)
    cout<<*it<<" ";
    cout<<endl;
}
P.S. Програмка нужна срочно т.к. здавать уже завтра...

Добавлено через 12 минут
В файле string было вот это:
a a a a a a a a a 1
b b b b b b b b b 1
c c c c c c c c 2 2
d d d d d d d d 2 2
e e e e e e e e 2 2
f f f f f f f 3 3 3
g g g g g g g 3 3 3
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
19.02.2013, 00:58     Использование функциональных классов #2
я не понимаю, что ты вообще пытаешься сделать с этими итераторами.
Вот здесь, что по-твоему происходит?
C++
1
2
3
4
5
6
7
8
for(it = L.begin(); it!=L.end();it++);
    {
    while(!f.eof())
    {
        f>>i;
        L.push_back(i);
    }
    }
Зачем цикл for?
Зачем вообще учить кресты, если есть Си?
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
19.02.2013, 01:08     Использование функциональных классов #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Зачем вообще учить кресты, если есть Си?
Зачем писать в раздел ++ если есть Си- раздел ?

Добавлено через 3 минуты
Цитата Сообщение от Vyzov Посмотреть сообщение
Создать список из строк длиной не более 100 символов.
Из всех подряд идущих строк с одинаковым количеством цифр оставить только одну. Физически уменьшить размер списка.
Чет не понял список строк, о каком количестве до одинаковых цифр речь ?
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
19.02.2013, 01:21  [ТС]     Использование функциональных классов #4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я не понимаю, что ты вообще пытаешься сделать с этими итераторами.
Вот здесь, что по-твоему происходит?
C++
1
2
3
4
5
6
7
8
for(it = L.begin(); it!=L.end();it++);
    {
    while(!f.eof())
    {
        f>>i;
        L.push_back(i);
    }
    }
Здесь идет чтение из файла и запись данных из вайча в список.

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Чет не понял список строк, о каком количестве до одинаковых цифр речь ?
Тоесть если даны строки
a a a 2 2
b b b 3 3
c c 4 4 4
d d 5 5 5

то после обработки дожно остаться:

a a a 2 2
c c 4 4 4
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
19.02.2013, 01:29     Использование функциональных классов #5
Между буквами пробелы ?
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
19.02.2013, 01:35  [ТС]     Использование функциональных классов #6
По идее в строке может быть что угодно, хоть сплошной текст, хоть цифры через 3 пробела. Ограничение только в том что строка не должна быть длиннее 100 символов.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
19.02.2013, 01:37     Использование функциональных классов #7
Ну так это
Цитата Сообщение от Vyzov Посмотреть сообщение
f>>i
пропускает пробелы
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
19.02.2013, 01:42  [ТС]     Использование функциональных классов #8
Оу.. просто за основу брал другой проект (который был на практике) там так было...
Добавлено через 2 минуты
Но и задача там была другая
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
19.02.2013, 01:42     Использование функциональных классов #9
Вот чтение из файла ( с учетом пробелов)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
list<string> ls;
 
ifstream ifs("..\\..\\strings.txt");
if(!ifs) { cerr<<"error"; return 1; }
 
// Чтение из файла
string line;
while(getline(ifs,line) )
    {
        ls.push_back(line);
    }
 
// Вывод
copy(ls.begin(),ls.end(),ostream_iterator<string>(cout,"\n") );
 
getchar();
return 0;
}
//---------------------------------------------------------------------------
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
19.02.2013, 02:02  [ТС]     Использование функциональных классов #10
Ошибка 1 error C2065: ostream_iterator: необъявленный идентификатор
Ошибка 2 error C2275: std::string: недопустимое использование этого типа в качестве выражения
3 IntelliSense: идентификатор "ostream_iterator" не определен
4 IntelliSense: использование имени типа не допускается
Эти ошибки в строке
C++
1
copy(ls.begin(),ls.end(),ostream_iterator<string>(cout,"\n") );
Может нужно подключить чего?
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
19.02.2013, 02:11     Использование функциональных классов #11
Вот набрасал ...
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
52
53
54
55
56
57
58
59
60
61
62
#include <fstream>
#include <iostream>
#include <iomanip>
 
#include <string>
#include <list>
 
#include <algorithm>
#include <iterator>
//---------------------------------------------------------------------------
using namespace std;
 
class is_dig
{
    public:
    bool operator()(char ch)
     {
         return isdigit(ch);
     }
};
//---------------------------------------------------------------------------
class rm
{
     int last_count;
    public:
     rm():last_count(-1){};
     bool operator()(string s)
        {
            int count = count_if(s.begin(),s.end(),is_dig() );
            bool result= (count == last_count);
            last_count= count;
 
            return result;
        }
};
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
list<string> ls;
 
ifstream ifs("..\\..\\strings.txt");
if(!ifs) { cerr<<"error"; getchar(); return 1; }
 
// Чтение из файла
string line;
while(getline(ifs,line) )
    {
        ls.push_back(line);
    }
// Вывод
copy(ls.begin(),ls.end(),ostream_iterator<string>(cout,"\n") );
cout<<endl;
 
ls.erase( remove_if(ls.begin(),ls.end(),rm()), ls.end() );
 
// Вывод
copy(ls.begin(),ls.end(),ostream_iterator<string>(cout,"\n") );
 
getchar();
return 0;
}
//---------------------------------------------------------------------------
Как по другому сделать, чет не пришло в голову...

Вывод :
a a a a a a a a a 1
b b b b b b b b b 1
c c c c c c c c 2 2
d d d d d d d d 2 2
e e e e e e e e 2 2
f f f f f f f 3 3 3
g g g g g g g 3 3 3

a a a a a a a a a 1
c c c c c c c c 2 2
f f f f f f f 3 3 3
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
19.02.2013, 02:13  [ТС]     Использование функциональных классов #12
Спасибо большое, особенно за оперативность.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
19.02.2013, 02:18     Использование функциональных классов #13
Можно конечно сначала делать sort() потом unique() но тогда порядок следования строк в списке может изменится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 13:28     Использование функциональных классов
Еще ссылки по теме:

Использование классов C++
C++ Шаблоны функциональных классов, модульное программирование
C++ Использование классов
C++ Использование классов
C++ Использование классов (sha1)

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

Или воспользуйтесь поиском по форуму:
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
19.02.2013, 13:28     Использование функциональных классов #14
Vyzov, да.

В самый верх добавь:

C++
1
2
3
4
5
6
7
#include <iostream>
#include <fstream>
#include <list>
#include <algorithm>
#include <string>
#include <iterator>
using namespace std;
Что-то невнимательно проглядел сообщения предыдущие.
Yandex
Объявления
19.02.2013, 13:28     Использование функциональных классов
Ответ Создать тему
Опции темы

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