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

АТД список. Заменить меньшую часть списка символом "#" - C++

Восстановить пароль Регистрация
 
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
29.09.2011, 14:47     АТД список. Заменить меньшую часть списка символом "#" #1
Здравствуйте!!

Подскажите пожалуйста!!

Нужна заменить меньшую часть (половину) списка символом "#" !

Например:

Есть список a b M o z o, пользователь вводит символ "М" и на выходе должен получиться список # # M o z o .

или такой пример:

Есть список a b о o M z o , пользователь вводит символ "М" и на выходе должен получиться список a b о o M # # .

Спасибо!! расчитываю на вашу помощь!)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2011, 14:47     АТД список. Заменить меньшую часть списка символом "#"
Посмотрите здесь:

АТД список. Переставить местами элементы списка C++
Строка: заменить первую "о" на "а", удалив остальные "о" C++
Все слова, не содержащие "bc" и заканчивающиеся на "ad" заменить на "!" C++
C++ Выполнить над файлом действия (Заменить все пробелы символом "*")
C++ разработать программу для работы со строками: найти и заменить в ней все символы "а" на "b"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.09.2011, 15:07     АТД список. Заменить меньшую часть списка символом "#" #2
Код, реализующий список, в студию
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
29.09.2011, 15:10  [ТС]     АТД список. Заменить меньшую часть списка символом "#" #3
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
#include "iostream"
#include "list"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"");
    list<char> lst;
 
    char num;
    int n;
    cout << "Введите размер списка: ";
    cin >> n;
    cout << '\n';
    cout << "Введите элементы списка: ";
    for(int i = 0; i < n; i++)
    {
        cin >> num;
        lst.push_back(num);
    }
    cout << '\n';
    
    //вот тут замену сделать
 
    
    
    cout << "Наш списка: ";
    for(list<char>::iterator iter1 = lst.begin(); iter1 != lst.end(); iter1++)
    {
        cout << *iter1 << " ";
    }
    cout << '\n';
 
    system("pause >> NULL");
    return 0;
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.09.2011, 15:37     АТД список. Заменить меньшую часть списка символом "#" #4
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
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::list<char> lst;
 
    char c;
 
    size_t size;
    
    std::cout << "Input the number of elements: ";
    std::cin >> size;
            
    for(size_t i = 0; i < size; ++i)
    {
    std::cout << "> ";
    std::cin >> c;
    lst.push_back(c);
    }
    
    std::cout << "Initial list:" << std::endl;
    
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<char>(std::cout, " "));
    std::cout << std::endl;
 
    std::cout << "Input a character: ";
    std::cin >> c;
 
    std::list<char>::iterator it, next;
 
    if((it = next = std::find(lst.begin(), lst.end(), c)) == lst.end())
    {
    std::cerr << "Not found: " << c << std::endl;
    return 1;
    }
 
    ++next;
 
    if(std::count_if(lst.begin(), it, [](char){return true;}) <
       std::count_if(next, lst.end(), [](char){return true;}))
        std::fill(lst.begin(), it, '#');
    else
    std::fill(next, lst.end(), '#');
 
    std::cout << "Resulting list:" << std::endl;
    
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<char>(std::cout, " "));
    std::cout << std::endl;
    
    return 0;
}
Подсчет элементов в половинах списка мне не нравится, буду рад, если кто-то предложит менее костыльное решение
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
29.09.2011, 16:43  [ТС]     АТД список. Заменить меньшую часть списка символом "#" #5
Nameless One, Спасибо все четко работает!!! Спасибо!

Добавлено через 58 минут
Nameless One, твой код нормально компилиться и программа норм работает на MSVS 2010

а на MSVS 2005 не хочет даже компилиться не распознаеться строку

C++
1
 if(count_if(lst.begin(), it, [](char){return true;}) <  count_if(next, lst.end(), [](char){return true;}))

вот ошибки!!

C++
1
2
3
4
5
6
7
1>d:\my files\языки програмирование\visual c++ 2005\бгпу\структуры данных\списки\низкий уровень\v_16\v_16.cpp(47) : error C2143: syntax error : missing ')' before '{'
1>d:\my files\языки програмирование\visual c++ 2005\бгпу\структуры данных\списки\низкий уровень\v_16\v_16.cpp(47) : error C2143: syntax error : missing ';' before '{'
1>d:\my files\языки програмирование\visual c++ 2005\бгпу\структуры данных\списки\низкий уровень\v_16\v_16.cpp(47) : error C2059: syntax error : ')'
1>d:\my files\языки програмирование\visual c++ 2005\бгпу\структуры данных\списки\низкий уровень\v_16\v_16.cpp(47) : error C2143: syntax error : missing ';' before '<'
1>d:\my files\языки програмирование\visual c++ 2005\бгпу\структуры данных\списки\низкий уровень\v_16\v_16.cpp(47) : error C2143: syntax error : missing ')' before '{'
1>d:\my files\языки програмирование\visual c++ 2005\бгпу\структуры данных\списки\низкий уровень\v_16\v_16.cpp(47) : error C2059: syntax error : ')'
1>d:\my files\языки програмирование\visual c++ 2005\бгпу\структуры данных\списки\низкий уровень\v_16\v_16.cpp(47) : error C2059: syntax error : ')'

В чем может быть проблема?? Есть ли другой вариант решения этой задачи???
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.09.2011, 16:52     АТД список. Заменить меньшую часть списка символом "#" #6
Infinity3000, дело в том, что там использованы лямбда-выражения из нового стандарта (который старыми версиями студии не поддерживается). Сделай так:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
 
template <class T, class V>
class const_val
{
public:
    const_val(const T&);
    T operator () (const V&) const;
 
private:
    T c;
};
 
template <class T, class V>
const_val<T, V>::const_val(const T& _c)
    : c(_c)
{
}
 
template <class T, class V>
T const_val<T, V>::operator () (const V&) const
{
    return c;
}
 
int main()
{
    std::list<char> lst;
 
    char c;
 
    size_t size;
    
    std::cout << "Input the number of elements: ";
    std::cin >> size;
            
    for(size_t i = 0; i < size; ++i)
    {
    std::cout << "> ";
    std::cin >> c;
    lst.push_back(c);
    }
    
    std::cout << "Initial list:" << std::endl;
    
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<char>(std::cout, " "));
    std::cout << std::endl;
 
    std::cout << "Input a character: ";
    std::cin >> c;
 
    std::list<char>::iterator it, next;
 
    if((it = next = std::find(lst.begin(), lst.end(), c)) == lst.end())
    {
    std::cerr << "Not found: " << c << std::endl;
    return 1;
    }
 
    ++next;
 
    if(std::count_if(lst.begin(), it, const_val<bool, char>(true)) <
       std::count_if(next, lst.end(), const_val<bool, char>(true)))
        std::fill(lst.begin(), it, '#');
    else
    std::fill(next, lst.end(), '#');
 
    std::cout << "Resulting list:" << std::endl;
    
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<char>(std::cout, " "));
    std::cout << std::endl;
    
    return 0;
}
Можно, конечно, не мудрить и просто передать в count_if указатель на функцию, которая возвращает true, но это не так интересно
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
29.09.2011, 17:00  [ТС]     АТД список. Заменить меньшую часть списка символом "#" #7
Nameless One, Все шикарно работает, спасибо!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2011, 23:10     АТД список. Заменить меньшую часть списка символом "#"
Еще ссылки по теме:

Удалить из двусвязного списка все элементы до первого "*" и после последнего "*" C++
C++ Программа по созданию АТД "Фотоаппарат"
Поиск дискриминанта, АТД "Квадратное уравнение" C++

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

Или воспользуйтесь поиском по форуму:
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
29.09.2011, 23:10     АТД список. Заменить меньшую часть списка символом "#" #8
Цитата Сообщение от Nameless One Посмотреть сообщение
Подсчет элементов в половинах списка мне не нравится, буду рад, если кто-то предложит менее костыльное решение
Ну можно добавить альтернативу арифметикой и при том обойдёмся всего одним вызовом подсчёта узлов.
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
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
 
int main () {
   char str[] = "abMozo";
   list<char> lst(str, str + strlen(str));
 
   char nch = '#';
   char ch  = 'M';
   size_t  size;
   list<char>::iterator iter;
 
   if((iter = find(lst.begin(), lst.end(), ch)) == lst.end())
           abort();
   if((size = distance(lst.begin(), iter)) < (lst.size() >> 1)) 
         fill_n(lst.begin(), size, nch);
   else
         fill_n(++iter, lst.size() - size, nch);
 
   copy(lst.begin(), lst.end(), ostream_iterator<char>(cout, " "));
   cin.get();
   return 0;
}
Yandex
Объявления
29.09.2011, 23:10     АТД список. Заменить меньшую часть списка символом "#"
Ответ Создать тему
Опции темы

Текущее время: 09:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru