Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
 Аватар для JohnBlack123
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520

В данном массиве перед символами X вставить цифру 2

28.12.2018, 18:18. Показов 3585. Ответов 20

Студворк — интернет-сервис помощи студентам
Дано одномерный массив char (можно динамический). В нем перед элементами X вставить цифру 2.
Ввод :
X Y X Y X Y Y
Вывод :
2 X Y 2 X Y 2 X Y Y
У меня получилось сделать лишь с одним элементом (с введенным индексом введенного элемента - X, но только с одним!)
Как сделать, чтобы работало, как на примере?
(задача с расширением массива)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.12.2018, 18:18
Ответы с готовыми решениями:

Вставить в массиве 2 элемента, один перед макс, другой перед минимальным
Проблема такая, последнее число массива не выводится, точнее выводится но как 0. Элементы то вставляются где надо, но вот с последним...

Вставить пробел перед последними 2-мя символами в слова, имеющего минимальную (заданную) длину
Люди, добрые! Помогите пожалуйста решить задачу Вот и сама задача Вставить пробел перед последними 2-мя символами в слова, имеющие...

Вывести цифру наиболее часто встречающуюся в данном массиве
помогите пожалуйсто Пусть дан непустой массив. Вывести цифру наиболее часто встречающуюся в данном массиве

20
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
28.12.2018, 22:54
JohnBlack123, здравствуйте! Для решения этой задачи можно использовать вектор:

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
#include <iostream> 
#include <vector>
 
    using namespace std;
 
int main() {
    int n;
    cout << "Enter an array size\n";
    cout << "n = ";
    cin >> n;
    vector<char> arr(n);
    cout << "Enter an array:\n";
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    for (int i = 0; i < arr.size(); i++) {
        if (arr[i] == 'X') {
            arr.insert(arr.begin() + i, '2');
            i++;
        }
    }
    cout << "Output of the program:\n";
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    system("pause");
    return 0;
}
1
 Аватар для JohnBlack123
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
28.12.2018, 22:56  [ТС]
Fixer_84, спасибо за решение! Но мне нужно без вектора решить эту задачу.
0
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 13
28.12.2018, 23:02
Можно динамический массив использовать?
0
 Аватар для JohnBlack123
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
28.12.2018, 23:03  [ТС]
21m3, да, можно
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
28.12.2018, 23:06
Лучший ответ Сообщение было отмечено JohnBlack123 как решение

Решение

Цитата Сообщение от JohnBlack123 Посмотреть сообщение
Fixer_84, спасибо за решение! Но мне нужно без вектора решить эту задачу.
Вот без вектора:

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
#include <iostream>
 
    void insert(char* arr, int j, char elem, int size) {
        for (int i = size; i >= j; i--) {
            arr[i] = arr[i-1];
        }
        arr[j] = elem;
    }
 
using namespace std;
 
int main() {
    int n, k;
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n;
    char* a = new char[2*n];
    cout << "Enter an array:\n";
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    k = 0;
    for (int i = n - 1; i >= 0; i--) {
        if (a[i] == 'X') {
            insert(a, i, '2', n + k);
            k++;
        }
    }
    n += k;
    char* b = new char[n];
    b = a;
    cout << "Output of the program:\n";
    for (int i = 0; i < n; i++) {
        cout << b[i] << " ";
    }
    delete [] a;
    delete [] b;
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 13
28.12.2018, 23:09
Fixer_84, Я плохо понял что ты сделал, но на мой взгляд наиболее оптимально будет считать символ в отдельную переменную, и если символ равен иксу, добавить в массив чаров 2Х, если не равен, то просто добавить символ. И так пока строка не кончится
Тогда лишний цикл не нужен
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
28.12.2018, 23:12
Цитата Сообщение от 21m3 Посмотреть сообщение
Fixer_84, Я плохо понял что ты сделал
21m3, я написал свою функцию вставки элемента в массив с помощью сдвига. Если вам не лень, можете скинуть свою идею
0
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 13
28.12.2018, 23:18
Fixer_84, Только вспомню синтаксис динамических массивов в Си)

Добавлено через 4 минуты
Fixer_84, Ты не против, если я с векторами сделаю, не могу вспомнить как выделяется память под массивы в си
0
 Аватар для JohnBlack123
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
28.12.2018, 23:19  [ТС]
Fixer_84, благодарю. Но Ваша программа падает при запуске. В связи с этим, внес следующую правку:
C++
1
b = a;
Изменил на :
C++
1
2
for (int i = 0; i < n + k; i++)
    b[i] = a[i];
Спасибо!
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
28.12.2018, 23:19
Цитата Сообщение от 21m3 Посмотреть сообщение
Fixer_84, Ты не против, если я с векторами сделаю, не могу вспомнить как выделяется память под массивы в си
Нет, я не против. Мне даже очень интересно.
0
 Аватар для JohnBlack123
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
28.12.2018, 23:21  [ТС]
21m3, выложите свое решение, если будет время
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
28.12.2018, 23:21
JohnBlack123, странно. У меня все работает. Впрочем, не важно как вы скопируйте элементы в b. Главное, чтобы на выходе размер был n = n + k.
1
 Аватар для JohnBlack123
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
28.12.2018, 23:24  [ТС]
21m3,
Цитата Сообщение от 21m3 Посмотреть сообщение
добавить в массив чаров 2Х
Вы имеете ввиду добавить добавить элемент 2X?
Но ведь это char, не string, тут так нельзя. В char же только один символ можно запихнуть, вроде бы.
0
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 13
28.12.2018, 23:34
Fixer_84, ну вот как то так

Хотел еще реализовать ввод строки пока она не кончится, без дополнительной переменной - длины строки, но почему-то не работает(
Осталось только поменять вектор на динамический массив, и все станет идеально
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
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    vector<char>work(1);
    char read = ' ';
    int length,now_length;
    cin >> length;
    now_length = 0;
    while (now_length < length) {
        cin >> read;
        if (read == 'X') {
            work.resize(work.end()-work.begin()+2);
            work.push_back('2');
            work.push_back('X');
        }
        else {
            work.resize(work.end()-work.begin()+1);
            work.push_back(read);
        }
        now_length++;
    }
    for (auto i: work){
        cout << i;
    }
}
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
29.12.2018, 00:23
Лучший ответ Сообщение было отмечено JohnBlack123 как решение

Решение

Цитата Сообщение от Fixer_84 Посмотреть сообщение
char* a = new char[2*n];
Цитата Сообщение от 21m3 Посмотреть сообщение
Осталось только поменять вектор на динамический массив, и все станет идеально
молодцы, ребята

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
#include <iostream>
 
int main() {
    size_t length = 0;
    std::cin >> length;
    char* before = new char[length];
    
    size_t new_length = length;
    for (size_t i = 0; i < length; ++i) {
        std::cin >> before[i];
        if (before[i] == 'X') {
            ++new_length;
        }
    }
    
    char* after = new char[new_length];
    for (size_t i = 0, j = 0; i < length; ++i) {
        if (before[i] == 'X') {
            after[j++] = '2';
        }
        after[j++] = before[i];
    }
    
    delete [] before;
    for (size_t i = 0; i < new_length; ++i) {
        std::cout << after[i];
    }
    delete [] after;
}
2
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 13
29.12.2018, 00:26
Babysitter, а зачем 2 массива?
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
29.12.2018, 00:33
Цитата Сообщение от 21m3 Посмотреть сообщение
Babysitter, а зачем 2 массива?
Цитата Сообщение от JohnBlack123 Посмотреть сообщение
(задача с расширением массива)
вот почему, задача на тренировку именно этого элемента.

а еще потому что реаллокация - это боль, а тут либо как ты делать вектор и реаллоциовать каждый раз, когда не влезает, либо как твой коллега брать в два раза больше, так точно влезет, можно не думать.
0
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 13
29.12.2018, 00:34
Babysitter, Понял, просто меня так учат, что для меня чем больше итераторов - тем больше боли, так что я стараюсь юзать как можно меньше циклов)
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
29.12.2018, 20:29
Babysitter, спасибо за более гибкий подход. Раньше почти не решал таких задач на вставку элементов (всегда сдвигал элементы при вставке и удалении).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2018, 20:29
Помогаю со студенческими работами здесь

Вставить число К перед и после всех элементов? заканчивающихся на данную цифру.
Всем доброго времени суток! Задача:Вставить число К(вводится с клавиатуры) перед и после всех эллементов заканчивающихся на данную цифру....

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

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

Вставить нулевой элемент перед максимальным элементом в одномерном массиве
Решить через процедуры или функции 1.Вставить нулевой элемент перед максимальным элементом в одномерном массиве 2. Удалить из...

В одномерном массиве вставить элемент перед последним отрицательным элементом
помогите пожалуйста) в одномерный массив вставить элемент перед последним отрицательным элементом с++


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru