Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/48: Рейтинг темы: голосов - 48, средняя оценка - 4.71
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255

АТД список. Замена элементов в списке

28.09.2011, 00:03. Показов 8926. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Нужна ваша помощь!

Подскажите пожалуйста как заменить элементы в списке которые стоят на четных позициях?

Суть примера такова!!

Пользователь вводит символ 'Х' и если есть такой символ на четных позициях в списке, то его заменить на "Y".

Например:

A х C х x меняем x->y получилось A y C y x. Видите "х" поменялся на "y" на четной позиция.

Вот то что у меня пока получилось:
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
#include "iostream"
#include "list"
#include <algorithm>
 
using std::cout;
using std::cin;
using std::list;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
    list<char> lst;
 
    char num;
    char ch, ch1;
    int n;
 
    cout << "Введите длину списка: ";
    cin >> n;
    cout << '\n';
 
    cout << "Введите элементы списка: ";
    for (int i = 0; i < n; i++)
    {
        cin >> num;
        lst.push_back(num);
    }
    cout << '\n';
 
    cout << "Введите символ который хотите заменить: ";
    cin >> ch;
    cout << '\n';
 
    cout << "Введите символ на который хотите заменить символ " << "'" << ch << "': " ;
    cin >> ch1;
    cout << '\n';
 
    list<char>::iterator iter = find(lst.begin(), lst.end(), ch); // ищем наш символ
 
    //вот тут нужно осуществить замену.
 
    cout << "Наш список: ";
 
    for(list<char>::iterator iter1 = lst.begin(); iter1 != lst.end(); iter1++)
    {
        cout << *iter1 << " ";
    }
    system("pause >> NULL");
    return 0;
}
подскажите хотя бы функцию или алгоритм! но желательно примерчик спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2011, 00:03
Ответы с готовыми решениями:

АТД список. Сравнение элементов
Здравствуйте!! Тут возникла такая проблема! Подскажите пожалуйста каким образом можно сравнить элементы списка в цикле!!! В...

АТД список. Расположение одинаковых элементов друг за другом
Здравствуйте! Подскажите, пожалуйста, как расположить одинаковые элементы друг за другом??? Например: Есть такой список: ...

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

12
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:14
Каждое следующее чётное число на два больше предыдущего. Соответственно, инкрементируйте итератор два раза, чтобы прыгать по чётным позициям:

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
#include <iostream>
#include <list>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
int main( )
{
    srand( time(0) );
 
    list<char> lst;
    int lng;
 
    cout << "List length: ";
    cin >> lng;
 
    for( int i = 0; i < lng; i++ )
       lst.push_back( rand() % ('z' - 'a') + 'a' );
 
    for( list<char>::iterator it = lst.begin(); it != lst.end(); it++ )
       cout << *it << ' ';
 
    char ch;
    cout << "\nEnter a character: ";
    cin >> ch;
 
    for( list<char>::iterator it = lst.begin(); it != lst.end(); it++, it++ )
    {
       if( *it == ch )
          *it = '#';
    }
 
    for( list<char>::iterator it = lst.begin(); it != lst.end(); it++ )
       cout << *it << ' ';
 
    return 0;
}
Следите за тем, с чего у вас нумерация. 0 считается чётным, 1 - нечётным. В моём примере нумерация с нуля.

Добавлено через 1 минуту
Отлаживайте на длинах больше 50, чтобы видеть эффект
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:25  [ТС]
Спасибо большое! все замечательно работает!!! спасибо огромное!!

Добавлено через 6 минут
Цитата Сообщение от talis Посмотреть сообщение
Следите за тем, с чего у вас нумерация. 0 считается чётным, 1 - нечётным. В моём примере нумерация с нуля.
как сделать отчет с 1! что то вообще не думается!))))
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:29
Infinity3000, объявите итератор до цикла и тут же инкрементируйте один раз, потом входите в цикл...
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:34  [ТС]
Не хочет оно так

C++
1
2
list<char>::iterator iter1;
    iter1++;
я уже пытался!!))
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:36
C++
1
2
3
4
5
6
7
8
    list<char>::iterator it = lst.begin()
    it++;
 
    for( ; it != lst.end(); it++, it++ )
    {
       if( *it == ch )
          *it = '#';
    }
Так тоже не хочет?
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:46  [ТС]
не хотит!! компилится но когда нужно выводить список после замены вылетает!!!
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:49
Infinity3000, какая среда? В mingw всё прекрасно.
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:51  [ТС]
Visual C++ 2010! та и по логике все должно работать, но увы!
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:54
Infinity3000, рискну предположить, что в Visual C++ 2010 при попытке выполнить it++, когда it стоит на конце списка, приводит к переходу на нулевой или неопределённый адрес, что и вызывает ошибку. Однако, это только предположение.
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 01:42  [ТС]
вот так

C++
1
2
3
4
5
6
7
8
9
10
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++ )
    {
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     }
начинается замена со второго элемента и заменяет все подряд вхождения даного символа где бы он не стоял что говорит что инкремент до цикла срабатывает, но если так

C++
1
2
3
4
5
6
7
8
9
10
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++, iter1++ )
    {
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     }
то он не хочет заменять символы только на четных позициях, вылетает не понятная ошибка

Добавлено через 13 минут
вот так коректно работает если в списке не четное количество элементов

C++
1
2
3
4
5
6
7
8
9
10
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++, iter1++)
    {
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     }
Ну если четное то вылетает ошибка!! И я догадываюсь почему!

Когда циклом считываешь предпоследний элемент он пытается считать следующий через один, а там не чего нет!

Как можно решить эту проблему??

Добавлено через 26 минут
talis, а для твоего первого варианта если количество элементов в списке не четное то вылетает такая же ошибка!!

Тут мне кажется нужно все таки использовать

C++
1
2
3
4
5
6
7
8
9
10
11
12
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++, iter1++)
    {
    
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     
     }
только если количество элементов в списке не четное, то просматриваем весь список, а если четное то до предпоследнего!!

Вопрос

Каким способом можно просмотреть список до предпоследнего элемента??
0
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
28.09.2011, 05:40
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Пользователь вводит символ 'Х' и если есть такой символ на четных позициях в списке, то его заменить на "Y".
Типа этого.
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>
using namespace std;
 
int  main(void) {   
   list<char>   lst;
   for(const char* s = "X AJAX-XOR, XXX"; *s; lst.push_back(*s++));
 
   char ch = 'X', cnew = 'W';
   //cin >> ch >> cnew;
 
   size_t  i = 1u;
   for(list<char>::iterator iter = lst.begin(); iter != lst.end(); *iter++, i++) {
           if( *iter == ch && !(i % 2u)) 
                *iter = cnew;
   }
 
   // выводим результат
   for(; ! lst.empty(); lst.pop_front())
        cout << lst.front();
   cout.put('\n');
    
   cin.get();
   return 0;
}
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 11:10  [ТС]
xAtom, Спасибо то что надо!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2011, 11:10
Помогаю со студенческими работами здесь

АТД список. Объединение списков.
Здравствуйте! Подскажите пожалуйста как объединить два списка в один?? Или второй список добавить в конец первого? Вот так...

Атд список. Удалить одинаковые элементы.
Здравствуйте!!!!! Вот еще одна проблемка, расчитываю на Вашу помощь! Суть такова! Есть АТД список, в нем нужно оставить...

АТД список. Переставить местами элементы списка
Здравствуйте!! Возник очередной вопрос, что то мне туговато даются АТД! Есть список котором может быть только одна открывающая...

Реализуйте АТД “Список” для любого типа данных
Помогите решить задачку. 1. Реализуйте АТД “Список” для любого типа данных и его операторы (INSERT, LOCATE, RETRIEVE, DELETE, NEXT,...

АТД список. Перемещение заданного элемента на первую позицию
Здравствуйте!! Подскажите пожалуйста как переместить элемент списка на первую позицию? Например: есть список o o t o t,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru