Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 42
1

Изменить порядок следования элементов массива a[n], расположенных между k и k+5 элементами, на обратный

27.11.2018, 00:11. Просмотров 2669. Ответов 14

Изменить порядок следования элементов массива a[n], расположенных между k и k+5 элементами, на обратный Значение k ввести с клавиатуры, проверить его на корректность.Помогите написать на С++.А то условие понять понял,но на языке с++ написать тяжело.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2018, 00:11
Ответы с готовыми решениями:

Изменить порядок следования элементов массива на обратный
Привет всем! Нужна помощь по решению задачи на языке С++. Принципиально я знаю как решать, но не...

Изменить порядок следования элементов массива на обратный
Массив заданного размера N (от 3 до 10) ввести произвольные числа (вещественные по значению)....

Изменить порядок следования элементов исходного массива на обратный
Задан массив В(L). Изменить порядок следования элементов исходного массива на обратный и записать...

Изменить порядок следования элементов массива на обратный, используя одну вспомогательную переменную
Заданы целое число M(M<100) и массив А, состоящий из M целых элементов. Изменить порядок следования...

14
Параллельный Кот
1898 / 821 / 349
Регистрация: 25.03.2016
Сообщений: 2,039
27.11.2018, 01:31 2
Лучший ответ Сообщение было отмечено Алексей Близнюк как решение

Решение

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
#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
 
using namespace std;
 
int main() {
 
    const int ARRAY_SIZE = 10;
    const unsigned MIN_NUMBER = 0;
    const unsigned MAX_NUMBER = 100;
 
    int a[ARRAY_SIZE];
 
    long seed = chrono::system_clock::now().time_since_epoch().count();
    default_random_engine generator(seed);
    uniform_int_distribution<int> distribution(MIN_NUMBER, MAX_NUMBER);
 
    for (auto &item : a) {
        item = distribution(generator);
    }
 
    for (auto item : a) {
        cout << item << " ";
    }
    cout << endl;
 
    int k = 0;
    for (;;) {
        cout << "k = ";
        cin >> k;
 
        if (k < 0) {
            cerr << "k must be greater than or equal to 0! Repeat, please." << endl;
        }
        else if (k >= (ARRAY_SIZE - 5)) {
            cerr << "k must be less than " << (ARRAY_SIZE - 5) << "! Repeat, please." << endl;
        }
        else {
            break;
        }
    }
 
    // Между k и k+5 включительно или нет?!
//    swap(a[k + 0], a[k + 5]);
    swap(a[k + 1], a[k + 4]);
    swap(a[k + 2], a[k + 3]);
 
    for (auto item : a) {
        cout << item << " ";
    }
    cout << endl;
 
    return 0;
}
1
Yetty
27.11.2018, 02:40
  #3

Не по теме:

Цитата Сообщение от valen10 Посмотреть сообщение
Между k и k+5 включительно или нет?!
valen10, если нужно выкопать траншею между двумя столбами, столбы тоже убираем ? :)

0
valen10
27.11.2018, 02:52
  #4

Не по теме:

Цитата Сообщение от Yetty Посмотреть сообщение
столбы тоже убираем ?
Нет, зачем лишнюю работу делать? Пусть стоят =)
Хорошая аналогия на самом деле, спасибо. Тоже сначала сделал без включения, но затем обратил внимание, что тогда первый и последний элементы вообще не могут быть сдвинуты. Потому и спросил.

0
0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 42
27.11.2018, 16:21  [ТС] 5
long seed = chrono::system_clock::now().time_since_epoch().count();
default_random_engine generator(seed);
uniform_int_distribution<int> distribution(MIN_NUMBER, MAX_NUMBER);
Эти строки можно попроще написать? Я понял,что вы хотите случайные числа получить.
0
Параллельный Кот
1898 / 821 / 349
Регистрация: 25.03.2016
Сообщений: 2,039
27.11.2018, 17:43 6
Лучший ответ Сообщение было отмечено Алексей Близнюк как решение

Решение

Цитата Сообщение от Алексей Близнюк Посмотреть сообщение
Эти строки можно попроще написать?
Можно, в стиле Си. Уберите строки:

C++
1
2
3
4
5
6
#include <chrono>
#include <random>
 
    long seed = chrono::system_clock::now().time_since_epoch().count();
    default_random_engine generator(seed);
    uniform_int_distribution<int> distribution(MIN_NUMBER, MAX_NUMBER);
И добавьте:

C++
1
2
3
4
#include <cstdlib>
#include <ctime>
 
    srand((unsigned)time(nullptr));
Генерация случайного числа будет выглядеть так:

C++
1
2
3
4
5
// Чсла от MIN_NUMBER до MAX_NUMBER.
item = MIN_NUMBER + rand() % (MAX_NUMBER - MIN_NUMBER + 1);
 
// Или числа от 0 до MAX_NUMBER.
item = rand() % (MAX_NUMBER + 1);
Кликните здесь для просмотра всего текста
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
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
 
using namespace std;
 
int main() {
 
    const int ARRAY_SIZE = 10;
    const unsigned MIN_NUMBER = 1;
    const unsigned MAX_NUMBER = 100;
 
    int a[ARRAY_SIZE];
 
    srand((unsigned)time(nullptr));
 
    for (auto &item : a) {
        item = MIN_NUMBER + rand() % (MAX_NUMBER - MIN_NUMBER + 1);
    }
 
    for (auto item : a) {
        cout << item << " ";
    }
    cout << endl;
 
    int k = 0;
    for (;;) {
        cout << "k = ";
        cin >> k;
 
        if (k < 0) {
            cerr << "k must be greater than or equal to 0! Repeat, please." << endl;
        }
        else if (k >= (ARRAY_SIZE - 5)) {
            cerr << "k must be less than " << (ARRAY_SIZE - 5) << "! Repeat, please." << endl;
        }
        else {
            break;
        }
    }
 
//    swap(a[k + 0], a[k + 5]);
    swap(a[k + 1], a[k + 4]);
    swap(a[k + 2], a[k + 3]);
 
    for (auto item : a) {
        cout << item << " ";
    }
    cout << endl;
 
    return 0;
}


Задавайте вопросы, если еще что-то не понятно. Попробуем объяснить или упростить.
1
0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 42
27.11.2018, 18:22  [ТС] 7
У меня по вашей программе возникли некоторые вопросы:
1)srand((unsigned)time(nullptr)); (можно ли написать time=NULL? nullptr и null это одно и тоже?)
2)auto &item : a (поясните,что вы этим хотели сделать и что значит auto в данной строке?)
3)swap(a[k + 1], a[k + 4]);
swap(a[k + 2], a[k + 3]);(swap это вы меняли одно значение на другое?)
4)Скажите,почему здесь в for 2 раза точка с запятой? А то я забыл в каком случае так можно писать.

Добавлено через 3 минуты
И можно ли как-то без swap? А то swap не проходили
0
Параллельный Кот
1898 / 821 / 349
Регистрация: 25.03.2016
Сообщений: 2,039
27.11.2018, 18:59 8
Лучший ответ Сообщение было отмечено Алексей Близнюк как решение

Решение

Цитата Сообщение от Алексей Близнюк Посмотреть сообщение
1)srand((unsigned)time(nullptr)); (можно ли написать time=NULL? nullptr и null это одно и тоже?)
nullptr это типизированное нулевое значение указателя, которое не приводится к целым числам, что является более безопасным вариантом. Введен в C++11. NULL это макрос, численно равный целому 0. Можно time(NULL) или даже time(0), но первый вариант предпочтительнее.

Цитата Сообщение от Алексей Близнюк Посмотреть сообщение
2)auto &item : a (поясните,что вы этим хотели сделать и что значит auto в данной строке?)
Range-based for loop. Используется для перебора всех элементов массива по порядку. auto пишется вместо явного указания типа данных, тут можно было int написать. А символ & говорит о том, что доступ будет производиться по ссылке, а не по значению, что позволит изменять сами значения. Можно заменить на:

C++
1
2
3
for (int i = 0; i < ARRAY_SIZE; i++) {
    a[i] = новое_значение;
}
Цитата Сообщение от Алексей Близнюк Посмотреть сообщение
4)Скажите,почему здесь в for 2 раза точка с запятой? А то я забыл в каком случае так можно писать.
for без параметров превращается в бесконечный цикл, который будет прерван вручную. Можно было ввести булеву переменную для проверки и использовать while, или бесконечный while(true).

Цитата Сообщение от Алексей Близнюк Посмотреть сообщение
3)swap(a[k + 1], a[k + 4]);
swap(x, y) выполняет обмен значений двух переменных. Без него можно, но не красиво.

C++
1
2
3
int temp = x;
x = y;
y = temp;
x и y соответственно нужно заменить на свои переменные.
1
481 / 362 / 232
Регистрация: 24.02.2017
Сообщений: 1,313
27.11.2018, 19:58 9
valen10, а если к=0?
0
0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 42
27.11.2018, 20:02  [ТС] 10
Теперь я всё понял.Спасибо за объяснения!
0
Параллельный Кот
1898 / 821 / 349
Регистрация: 25.03.2016
Сообщений: 2,039
27.11.2018, 20:29 11
Цитата Сообщение от повар1 Посмотреть сообщение
а если к=0?
Переставим в обратном порядке a[1], a[2], a[3], a[4]. Вроде не заметил тут проблем. Или что-то упустил?
0
481 / 362 / 232
Регистрация: 24.02.2017
Сообщений: 1,313
27.11.2018, 20:47 12
Массив — набор значений (элементов массива), значит элемент может быть (не индекс) первый, второй и т.д. Утверждение
Цитата Сообщение от valen10 Посмотреть сообщение
cerr << "k must be greater than or equal to 0! Repeat, please." << endl;
не имеет смысла.

Добавлено через 15 минут
1 2 3 4 5 6 номер элемента к=1, а к+5=6
0 0 0 0 0 0 значение массива
0 1 2 3 4 5 индекс массива

C++
1
swap(a[k + 1], a[k + 4])== swap(a[2], a[5])
а надо между.
0
Параллельный Кот
1898 / 821 / 349
Регистрация: 25.03.2016
Сообщений: 2,039
27.11.2018, 20:47 13
Цитата Сообщение от повар1 Посмотреть сообщение
Массив — набор значений (элементов массива), значит элемент может быть (не индекс) первый, второй и т.д
Холиваром пахнет. Где сказано, что нужно указывать именно порядковый номер в привычном нам смысле, а не индекс?

Если это важно, то всегда указывается, что нумерацию необходимо начать с 1. Иначе зависит от реализации. Мною было принято решение сделать нумерацию элементов и индексы идентичными.

Не по теме:


Компьютерщик с женой отправились в супермаркет.
Сделав все необходимые закупки, они вышли на улицу, и жена сказала:
- Стой здесь и смотри в оба за этими сумками, пока я схожу и разыщу такси.
Когда жена вернулась, то увидела обалдевшего мужа, переставляющего
сумки с места на место:
- Ты сказала, что здесь десять сумок, а я насчитал только девять!
- Но их было десять!
- Нет, давай вместе считать: 0, 1, 2...

0
4373 / 2979 / 1820
Регистрация: 18.12.2017
Сообщений: 9,322
27.11.2018, 21:05 14
Цитата Сообщение от valen10 Посмотреть сообщение
Холиваром пахнет. Где сказано, что нужно указывать именно порядковый номер в привычном нам смысле, а не индекс?
никаких холиваров, повар1 прав. в условии не говорится, что условие под язык С++. элементы нумеруются так: 1,2,3.... а в самом коде, написанном на С++ индексируются с 0.

т.е. в массиве 2 1 3 7 6 между первым и пятым элементом находятся элементы 1 3 7
0
Параллельный Кот
1898 / 821 / 349
Регистрация: 25.03.2016
Сообщений: 2,039
27.11.2018, 22:27 15
Цитата Сообщение от Yetty Посмотреть сообщение
никаких холиваров
По моему скромному мнению, мы сейчас обсуждаем несущественный вопрос, имеющий мало общего с первоначальной задачей. И каждый пытается доказать свою правоту.

Вы считаете, что нумерация с 1 является единственной правильной. Согласен, что такая нумерация является привычной (первый, второй, третий, ...). Но кто запрещает сделать ее с нуля? Даже в поездах бывает вагон № 0. Мотивация - совпадение с индексами. Не знаю, как вам, но мне так удобнее (в программе, отладчике и терминале одни и те же цифры).

В условии нет явных указаний по этому поводу. Поэтому считаю не принципиальным выбор начала с 0 или с 1. Суть решения от этого меняется чуть меньше чем никак. Если это и правда будет так важно (программа будет поставляться третьим лицам, или препод в универе требует), думаю, каждый из нас сможет внести в код необходимые изменения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2018, 22:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Изменить порядок следования цифр на обратный между 1-й и последней цифрой
Здравствуйте! На начале обучения ломаю голову как решить следующие задачи с маленькими знаниями в...

Изменить порядок следования массива на обратный
Дан одномерный массив. Изменить порядок следования массива на обратный. Помогите пожалуйста)

Изменить порядок следования элементов в массиве на обратный
Здравствуйте. Надо написать функцию, но почему-то он у меня вылетает. Что я неправильно сделал?...

Изменить порядок следования элементов в массиве на обратный
Изменить порядок следования элементов в массиве на обратный.

Изменить порядок следования элементов в массиве на обратный
Обработка одномерных массивов. Изменить порядок следования элементов в массиве на обратный.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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