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

Оставить без изменения последовательность, если она упорядочена

21.10.2015, 00:27. Просмотров 2174. Ответов 37
Метки нет (Все метки)


Даны целые числа а1...аn, где n - целое положительное число (n<=100). Оставить без изменения последовательность, если она упорядочена по неубыванию или невозрастанию; в противном случае удалить из последовательности все члены, порядковые номера которых кратны четырем, сохранив прежним порядок остальных членов.

Добавлено через 1 час 55 минут
help
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2015, 00:27
Ответы с готовыми решениями:

Если последовательность отсортирована по возрастанию, оставить ее без изменения. Иначе получить иную последовательность
Дана последовательность действительных чисел X1,X2,X3,…,Xn (n&gt;2, заранее неизвестно). Если...

Последовательность упорядочена (не упорядочена) по возрастанию и упорядочена (не упорядочена) по убыванию
Всем доброго времени суток! Очень прошу помочь написать правильно решение задачи. Пользователь...

Даны действительные числа a1.an , где n – натуральное число. Оставить без изменения последовательность a1
Даны действительные числа a1...an , где n – натуральное число. Оставить без изменения...

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

37
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
21.10.2015, 13:03 2
Цитата Сообщение от Andrey1997 Посмотреть сообщение
Оставить без изменения последовательность, если она упорядочена
Намекаю.
0
-1 / 2 / 0
Регистрация: 03.10.2015
Сообщений: 67
21.10.2015, 15:22  [ТС] 3
Помогите плиз
0
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
21.10.2015, 16:04 4
Andrey1997, последовательность целых чисел - массив типа int. Вот такой, например:
C++
1
int arr[100];
Либо какой-нибудь контейнер STL, например такой:
C++
1
std::vector<int> arr;
С вектором, на мой взгляд, попроще будет.

Проверить вектор на упорядоченность просто:
C++
1
bool issorted = arr.is_sorted(arr.begin(), arr.end());
Дальше вставляете переменную issorted в качестве условия в оператор if, или в if else, либо в циклы (while или for):
C++
1
2
3
4
if (issorted)
    // делать что-то
else
    // делать что-то иное
Добавлено через 8 минут
Цитата Сообщение от Andrey1997 Посмотреть сообщение
удалить из последовательности все члены, порядковые номера которых кратны четырем
Это просто:
C++
1
2
3
4
5
6
7
8
for (size_t i = 0; i < arr.size(); ++i)
{
    if (!((i+1)%4))
    {
         arr.erase(arr.begin() + i);
    }
}
arr.shrink_to_fit();
0
-1 / 2 / 0
Регистрация: 03.10.2015
Сообщений: 67
21.10.2015, 16:31  [ТС] 5
gru74ik, надо с помощью массива решить
0
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
21.10.2015, 16:51 6
Цитата Сообщение от Andrey1997 Посмотреть сообщение
надо с помощью массива решить
Andrey1997, надо - решайте. Пока что Вы не написали ни строчки.
0
-1 / 2 / 0
Регистрация: 03.10.2015
Сообщений: 67
21.10.2015, 16:54  [ТС] 7
gru74ik, Этот раздел форума для начинающих программистов, которые слабы в программировании, если бы я знал как решать, то не писал бы сюда, если не знаете как решать , то хватит засорять тему.
0
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
21.10.2015, 17:02 8
Цитата Сообщение от Andrey1997 Посмотреть сообщение
Этот раздел форума для начинающих программистов, которые слабы в программировании
Это раздел для школьников, студентов и начинающих программистов, которые сами пишут код, и в ходе своей работы сталкиваются с трудностями и просят более опытных форумчан разъяснить непонятные моменты. Вы пока что не сделали ничего. Не написали ни строчки. Или Вы хотите готовое решение на блюдечке с голубой каёмочкой?

Цитата Сообщение от Andrey1997 Посмотреть сообщение
если не знаете как решать
Я знаю как решить Вашу простую задачку. И с радостью помог бы Вам прояснить трудные моменты. Но вместо Вас решать не хочу. Так Вы ничему не научитесь.

Добавлено через 56 секунд
Цитата Сообщение от Andrey1997 Посмотреть сообщение
хватит засорять тему
Минус за грубость и неблагодарность.
8
-1 / 2 / 0
Регистрация: 03.10.2015
Сообщений: 67
21.10.2015, 18:25  [ТС] 9
gru74ik,gru74ik, пока что вы ничего не прояснили и благодарить мне вас не за что, когда я сказал что надо решить с помощью массива вы вместо того чтобы дать дельные советы сказали мне решать самому и понизили просто так репутацию.

Добавлено через 49 минут
Вот , дальше не знаю что делать, подскажите плиз кто-нибудь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    int arr[100];
    int b;
    cout << "N= ";
    cin >> N;
    for (size_t i = 0; i < arr.size(); ++i)
    {
        if (!((i + 1) % 4))
        {
            arr.erase(arr.begin() + i);
        }
    }
    arr.shrink_to_fit();
    system("pause");
    return 0;
}
1
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
21.10.2015, 18:44 10
Дам первый дельный совет.Andrey1997, из массива нельзя удалить элементы. В массиве можно их только или скрыть или делать новый массив.

Добавлено через 2 минуты
Цитата Сообщение от Andrey1997 Посмотреть сообщение
Вот , дальше не знаю что делать,
Вы бы проверку сначала сделали на упорядоченность.
1
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
21.10.2015, 19:35 11
Лучший ответ Сообщение было отмечено Andrey1997 как решение

Решение

Andrey1997, будем считать, что извинения приняты. Хотя, мне кажется, что если кому-то публично нагрубил, то и извиняться надо так же публично, а не в личку. Ну да ладно, не будем мелочиться.
Что ж, посмотрим на Ваш код. Давайте немного поправим то, что Вы написали:
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
78
79
80
81
#include <iostream>     // для ввода-вывода
#include <ctime>        // для функции time()
#include <cstdlib>      // для функции srand() и rand()
#include <windows.h>    // для функции Sleep()
#include <algorithm>    // для функции сортировки std::sort()
 
// с помощью ключевого слова typedef зададим псевдоним для типа int:
typedef int Item;   // теперь Item то же самое, что и int
 
// то же самое для типа указатель на int:
typedef Item * Iter; // теперь Iter - то же самое, что и int*
 
// глобальная константа используется в функции show_sequence():
const int STEP = 10;
 
// прототипы для наших самодельных функций (прототипы нужны для
// компилятора, чтобы он знал тип возвращаемого из функции значения
// и  тип и количество аргументов, передаваемых в функцию):
void fill_range_rand(Iter beg, Iter end, Item fromNum, Item toNum);
void show_sequence(Iter beg, Iter end);
 
// главная функция:
int main()
{
    std::cout << "Please enter the size of the array: ";
    int arrSize;
    std::cin >> arrSize;
    
    // динамически выделяем память под наш массив
    int * arr = new int[arrSize];
    
    // заполняем наш массив псевдослучайными числами от 10 до 99:
    fill_range_rand(arr, arr + arrSize, 10, 99);
    
    // создаём переменную булева типа - она у нас будет показывать
    // сортирован массив или нет (библиотечная функция is_sorted
    // прекрасно решит эту задачу за нас):
    bool issorted = std::is_sorted(arr, arr + arrSize);
    
    // отобразим массив на экране с помощью самодельной функции
    // show_sequence() - в качестве аргументов передаём в функцию
    // указатели на первый элемент массива и элемент следующий за
    // последним элементом (в духе STL):
    show_sequence(arr, arr + arrSize);
    
    // если массив сортирован, выведем на экран сообщение об этом
    if (issorted)
        std::cout << "\nThe array is sorted.\n";
    
    // а если нет, сообщим, что нет:
    else
        std::cout << "\nThe array is not sorted.\n";
    
    // освобождаем память:
    delete [] arr;
 
    return 0;
}
 
// определение (реализация) функции fill_range_rand():
void fill_range_rand(Iter beg, Iter end, Item fromNum, Item toNum)
{
    Sleep(800); // делаем небольшую задержку
    srand(time(0));
    for ( ; beg != end; ++beg)
        *beg = fromNum + rand()%(toNum - fromNum);
}
 
// определение (реализация) функции show_sequence():
void show_sequence(Iter beg, Iter end)
{
    char delim;
    for (int i = 1; beg != end; ++beg, ++i)
    {
        if (i%STEP)
            delim = ' ';
        else
            delim = '\n';
        std::cout << *beg << delim;
    }
}
Добавлено через 9 минут
Andrey1997, насчёт удаления из массива - тут сложнее. Надо решить, как мы это будем делать. Дело в том, что обычные сишные массивы не могут менять свой размер динамически, как, скажем библиотечные контейнеры типа std::vector (почему я сразу именно его и предложил - с ним заморочек намного меньше). Поэтому изменить размер сишного массива можно лишь способом вроде этого:
  1. скопировать всё во временный массив
  2. освободить память из-под исходного массива
  3. создать новый массив меньшего размера
  4. скопировать в новый массив из временного все элементы, за исключением того, который надо было "удалить"
1
-1 / 2 / 0
Регистрация: 03.10.2015
Сообщений: 67
21.10.2015, 19:43  [ТС] 12
gru74ik, извините пожалуйста за хамство, спасибо большое за помощь!
1
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
21.10.2015, 20:21 13
Andrey1997, В вашем коде Вы использовали функции-члены библиотечного класса std::vector (например, size(), erase(), shrink_to_fit() ) - с обычными сишными массивами такой подход не сработает.

Вы из моего варианта кода хоть что-нибудь поняли? Какие-то вопросы, неясности по коду имеются? Вторую часть задания делать планируете?
0
-1 / 2 / 0
Регистрация: 03.10.2015
Сообщений: 67
21.10.2015, 21:57  [ТС] 14
gru74ik, ваш код является для меня малопонятным (по скольку я новичок в программировании), но я попытаюсь разобраться.
Цитата Сообщение от gru74ik Посмотреть сообщение
Вторую часть задания делать планируете?
Да, попробую

Добавлено через 1 час 19 минут
gru74ik,
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
#include "stdafx.h"
#include <iostream>     
#include <ctime>        
#include <cstdlib>      
#include <windows.h>    
#include <algorithm>    
typedef int Item;  
typedef Item * Iter; 
const int STEP = 10;
void fill_range_rand(Iter beg, Iter end, Item fromNum, Item toNum);
void show_sequence(Iter beg, Iter end);
int main()
{
    std::cout << "Please enter the size of the array: ";
    int arrSize;
    int arrSize2;
    std::cin >> arrSize;
int * arr = new int[arrSize];
fill_range_rand(arr, arr + arrSize, 10, 99);
bool issorted = std::is_sorted(arr, arr + arrSize);
show_sequence(arr, arr + arrSize);
int * arr = new int[arrSize];
delete[] arr;
int * arr2 = new int[arrSize2];
public:
    static void Copy(
        arrSize^ sourceArray,
        int sourceIndex,
        Array^ destinationArray,
        int destinationIndex,
        int length
        )
        if (arrSize %10!=4&&issorted)
            std::cout << "\nThe array is sorted.\n";
        else
            std::cout << "\nThe array is not sorted.\n";
system("pause");
    return 0;
}
void fill_range_rand(Iter beg, Iter end, Item fromNum, Item toNum)
{
    Sleep(800); 
    srand(time(0));
    for (; beg != end; ++beg)
        *beg = fromNum + rand() % (toNum - fromNum);
}
void show_sequence(Iter beg, Iter end)
{
    char delim;
    for (int i = 1; beg != end; ++beg, ++i)
    {
        if (i%STEP)
            delim = ' ';
        else
            delim = '\n';
        std::cout << *beg << delim;
    }
}
Вот я пытался делать по алгоритму из 4 действий, который вы дали, но не получилось
0
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
22.10.2015, 01:28 15
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
/*ФУНЦИЯ ЗАПОЛНЕНИЯ*/
void fill_rand_arr(int *&Arr, const unsigned &Row){
    for (unsigned i=0;i<Row;i++)  Arr[i] = rand()%50-25;
}
 
/*ФУНКЦИЯ ВЫВОДА НА ЭКРАН*/
void print_arr(int *&Arr, const unsigned &Row){
    for (unsigned i=0;i<Row;i++){
           cout << Arr[i] << "  ";
    }
}
 
/*ФУНКЦИЯ ВЫДЕЛЕНИЯ ПАМЯТИ*/
void create_arr(int *&Arr, const unsigned &Row){
    Arr = new int[Row];
}
 
/*ФУНЦИЯ ОЧИСТКИ ПАМЯТИ*/
void destroy_arr(int *&Arr, const unsigned &Row){
    delete []Arr;
    Arr = NULL;
}
 
/*ФУНКЦИЯ ПРОВЕРКИ УПОРЯДОЧЕННОСТИ ОБОИХ ВИДОВ*/
bool is_sorted(int *&Arr, const unsigned &Row){
    bool up, down;
    int i;
 
    for ( i = 0; i<Row-1; i++){
        up = Arr[i] < Arr[i+1];
        if (!up) break;
    }
 
    for ( i = 0 ; i<Row-1; i++){
        down = Arr[i] > Arr[i+1];
        if (!down) break;
    }
    return (up || down);
}
 
/*ФУНКЦИЯ СОЗДАНИЯ НОВОГО МАССИВА*/
void arr_transform(int *&Arr, int &Row){
    int temp1 = Row-1;
    int temp2 = Row;
    Row = (Row - Row/4) - 1; //Считаем число элементов без элементов на позициях кратных 4
 
    int *A = new int[Row];  //Создаем новый массив
    int i=0; //Индекс массива A
 
    cout << "\n";
    while (temp1>=0){
      if (0 != (temp2 - temp1 -1)%4) {  //Проверяем кратность позиции
            A[i++] = Arr[temp2 - temp1 -1]; //Записываем подходящие значения в массив
      }
       temp1--;
    }
    delete []Arr; //Очищаем память от старого
    Arr=A; //Делаем старый массив новым массивом
 
 
}
 
int main(){
    srand(time(NULL));
 
 
for (unsigned z=0;z<3;z++){
     bool f = false;
    while (!f){
    f=false;
    int Row(0);
    int *Arr = NULL;
        Row = rand()%20+3;  //Можно указывать число элементов в массиве.
       
        create_arr(Arr,Row); //Выделение памяти
        fill_rand_arr(Arr,Row); //Заполнение
        print_arr(Arr,Row); //Вывод на жкран
 
        /*Тут задача*/
          f = (is_sorted(Arr,Row)); //Проверяем упорядоченность
          if (!f) { //Если массив не отсортирован, то создавайте новый массив
           arr_transform(Arr,Row);  //Преобразование согласно задаче.
           cout <<"Array transformed: \n";
           print_arr(Arr,Row);
           cout << "\n\n=============\n\n";
          } else {
            cout << "Array is ordered\n";
          }
        /**************/
        destroy_arr(Arr,Row);
    delete []Arr;
 
    }
cout << "Press Enter\n";
cin.get();
}
 
}
1
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
22.10.2015, 06:20 16
daslex, не вынесла душа поэта? )))
0
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
22.10.2015, 12:22 17
Цитата Сообщение от gru74ik Посмотреть сообщение
Вы использовали функции-члены библиотечного класса std::vector (например, size(), erase(), shrink_to_fit() ) - с обычными сишными массивами такой подход не сработает.
С Вашего позволения, Я дополню это Ваше утверждение.
Но алгоритмы STL прекрасно работают с массивами, на которые указывают указатели.

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
#include <iostream>
 
using namespace std;
 
template <class ForwardIterator, class UnaryPredicate>
  ForwardIterator remove_if_ (ForwardIterator first, ForwardIterator last,
                             UnaryPredicate pred)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!pred(*first)) {
      *result = *first;
      --result;
    }
    --first;
  }
  return result;
}
 
int main()
{
    const int N=20;
    int *Arr= new int[N]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };  //N=20
    //int *Arr= new int[N]{ 1,2,3,4,5,6,7,8,9,10};  //Поменять N, N=10
 
 
 
    for (int i=0;i<N;i++) cout << Arr[i] << "  ";
    cout << "\n";
 
    remove_if_(Arr+N,Arr,[](const int &x){return x%2;});
 
    for (int i=N/2;i<N;i++) cout << Arr[i] << "\n";
 
}
ForwardIterator remove_if_(), это слегка подправленная функция из алгоритмов. Потребовалось переправить для демонстрации понятного кода. Даже если бы я и использовал библиотечную, то ошибки бы не возникло, а элементы бы поудалялись (сделали бы вид, что поудалялись). Только немного не те, какие можно было бы ожидать.

Добавлено через 6 минут
Цитата Сообщение от gru74ik Посмотреть сообщение
daslex, не вынесла душа поэта? )))
Сначала хотел выдать ТСу создание и пересоздание, а чтоб проверку и удаление сам делал. Но в удалении вся соль задания.
0
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
22.10.2015, 13:44 18
daslex, мне кажется, вряд ли ТС в данный момент сможет переварить твой код. Но мне твой код нравится. Опять же, если уж можно использовать классы, то проще создать свой класс "Массив".
0
daslex
22.10.2015, 13:56
  #19

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
вряд ли ТС в данный момент сможет переварить твой код
Если он учится по своей воле, то он спросит, при желании разобраться.
Если он учится: "все туда и я туда, но оно мне не надо", то ничего ему не поможет.

Мой код имеет недостаточность. Она видна когда этот код универсализировать. Нужны доп.проверки. Я их не стал приписывать.

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

0
-1 / 2 / 0
Регистрация: 03.10.2015
Сообщений: 67
22.10.2015, 15:55  [ТС] 20
daslex, что-то не так, программа удалила не все цифры кратные 4 (8 и 12 остались) и выдало еще какую-то ошибку
0
Миниатюры
Оставить без изменения последовательность, если она упорядочена  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2015, 15:55

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

Если эти числа равны, заменить их на 0, если нет - меньшое заменить большим, а большое оставить без изменения
Дано 2 целых числа, каждое из низ не больше 2*10^9 по модулю. Если эти числа равны, заменить их на...

Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа +, заменить символом -
Дан текст. Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр,...

Если заданная последовательность не упорядочена по убыванию, расположить её элементы в обратном порядке
Используя динамический массив надо Дана последовательность N действительных чисел. Если эта...

Поменять местами первый элемент массива с максимальным, другой с минимальным, остальное оставить без изменения
Дан массив С, состоящий из N элементов (N &lt;10). Поменять местами первый элемент массива с...


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

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

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