Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2019, 21:11   #1
oqi
 
Регистрация: 26.06.2018
Сообщений: 7
По умолчанию задаче на c++

Создать одномерный динамический массив. Размер массива вводится с клавиатуры.
1.Из полученного массива удалить элемент первый чётный положительный.
2. Ввести произвольное целое число с клавиатуры и вставить его перед минимальным положительным элементом.
3. Из полученного в задании 1 массива удалить отрицательные элементы, не превышающие заданную величину.
___________________________________ ____
Всё вроде сделал, но после такой комбинации:
1. Заполняем массив, например, 5 эл-ми.
2. вставляем 100 перед наименьшим положительным.
3. удаляем отрицательные не превышающие 100. После этого он удаляет отрицательные и зачем-то удаляет последний положительный.
Код:
#include"stdafx.h"
#include <iostream>
#include <ctime>
#include "clocale"
 
using namespace std;
 
void creation(int* mas, int);
void out(int* mas, int n);
void renew(int** mas, int & n, int);
void remov(int**, int & N);
void insert(int** mas, int N);
void not_exceed(int**, int & N);
 
int main()
 
{
    setlocale(0, "ru");
    int N;
    int z;
    int flag = 1;
    cout << "Введите число элементов массива: ";
    cin >> N;
    cout << "_______________________________________" << endl;
    int *mas = new int[N];
    creation(mas, N);
    while (flag == 1)
    {
        cout << "1 - вычислить первый четный положительный элемент и удалить его. " << endl;
        cout << "2 - вставить введенное число перед минимальным положительным элементом ." << endl;
        cout << "3 - удалить отрицательные элементы не превышающие заданную величину. " << endl;
        cout << "0 - закончить процесс." << endl;
        cin >> z;
        switch (z)
        {
        case 1:
        {
            remov(&mas, N);
            break;
        }
        case 2:
        {
            insert(&mas, N);
            break;
        }
        case 3:
        {
            not_exceed(&mas, N);
            break;
        }
        case 0:
        {
            flag = 0;
            break;
        }
        }
    }
 
 
    system("pause");
    return 0;
}
 
void creation(int* mas, int N)//заполнение массива
{
    int a;
    cout << "1 - заполнить массив самостоятельно." << endl;
    cout << "2 - рандомно." << endl;
    cin >> a;
    cout << "____________" << endl;
    if (a == 1)
    {
        cout << "Введите элементы массива.";
        for (int i = 0; i < N; ++i)
        {
            cout << "mas[" << i << "] =";
            cin >> mas[i];
        }
    }
 
    else
    {
        srand(time(NULL));
        for (int i = 0; i < N; i++)
        {
            mas[i] = -20 + rand() % 41;
            cout << "mas[" << i << "]=" << mas[i] << endl;
        }
        cout << "__________________________________________________" << endl;
    }
}
void renew(int **mas, int& n, int m)
{
    int size = (m < n) ? m : n;
    int* b = new int[m];
    memcpy(b, *mas, m * sizeof(int));
    delete[] * mas;
    *mas = b;
    n = m;
    // out(*mas, n);
}
 
void out(int* mas, int n)//вывод массива
{
    for (int i = 0; i <n; ++i)
    {
        cout << "mas[" << i << "]= ";
        cout << mas[i] << endl;
    }
    cout << "_______________________________________" << endl;
}
void remov(int** mas, int &N) // 1 задание. Вычисление 1-го чётного положительного эл-та и удаление его
{
    int i = 0;
    int k = 0; // смотрит был ли такой эл-т в массиве
    for (; i < N; ++i)
    {
        if ((*mas)[i] > 0 && (*mas)[i] % 2 == 0)
        {
            //cout << (*mas)[i]<< endl;
            k = 1;
            break;
        }
    }
    if (k == 1) {
        for (int j = i; j < N - 1; ++j)//сдвиг эл-та вниз
        {
            int f = (*mas)[j + 1];
            (*mas)[j + 1] = (*mas)[j];
            (*mas)[j] = f;
        }
        renew(mas, N, N - 1);
        out(*mas, N);
    }
    else
        cout << "В массиве нет подходящего элемента";
    system("pause");
}
void insert(int** mas, int N) // 2 задание. Вставить перед наименьшим положительным эл-ом число
{
    int i = 0, j, c, min = 9999, ind, z = 0;
    for (j = i + 1; j < N; ++j) // идём дальше по массиву и ищем минимальный положит.эл-т
    {
        if ((*mas)[j] < min && (*mas)[j]>0)
        {
            min = (*mas)[j];
            ind = j; // заполняем индекс эл-та
        }
        else
        {
            z++;
        }
    }
    if (z + 1 != N)
    {
        cout << "Введите число, которое вы хотите вставить в массив перед минимальным положительным эл-ом.";
        cin >> c;
        renew(mas, N, N + 1);
        (*mas)[N - 1] = c;// Присваивает добавленному эл-ту введённое число
        for (int j = N - 1; ind < j; --j) // передвигает добавленный эл-т на нужное место
        {
            int k = (*mas)[j - 1];
            (*mas)[j - 1] = (*mas)[j];
            (*mas)[j] = k;
        }
        out(*mas, N);
 
    }
    else {
        cout << "В массиве нет подходящего числа.";
 
    }
    system("pause");
}
void not_exceed(int** mas, int &N)
{
    int c, k = 0;
    cout << "Введите число - границу." << endl;
    cin >> c;
    int i = N - 1;
    int g = 0;
    for (; g <= i; --i)
    {
        if ((*mas)[i] < 0 && (*mas)[i] < c)
        {
            ++k; // счетчик чисел, которые нужно удалить
            k = 0;
        }
        else
        {
            for (int j = i; 0 < j; --j) // передвигает эл-т в начало, таким образом числа для удаления оказываются в конце
            {
                int k = (*mas)[j - 1];
                (*mas)[j - 1] = (*mas)[j];
                (*mas)[j] = k;
            }
            ++i; // так как эл-ты мы перемещаем вначало, то нужно продолжать цикл с того же индекса
            ++g; // и увеличить нижнюю границу, чтобы кол-во итерации осталось нужным
        }
    }
    renew(mas, N, N - k);
    out(*mas, N);
    system("pause");
 
}
Изображения
Тип файла: jpg ывшпрышвгпывгпывгпы.jpg (84.9 Кб, 160 просмотров)
oqi вне форума Ответить с цитированием
Старый 25.06.2019, 21:20   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Вы же в insert меняете размер, а переменную передаеет копированием.
p51x вне форума Ответить с цитированием
Старый 25.06.2019, 21:27   #3
oqi
 
Регистрация: 26.06.2018
Сообщений: 7
По умолчанию

Не много не понял, о чём идёт речь
oqi вне форума Ответить с цитированием
Старый 25.06.2019, 22:15   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
void insert(int** mas, int N)
Код:
       cin >> c;
        renew(mas, N, N + 1);
Код:
void renew(int **mas, int& n, int m)
{
    ...
    n = m;
p51x вне форума Ответить с цитированием
Старый 26.06.2019, 14:01   #5
oqi
 
Регистрация: 26.06.2018
Сообщений: 7
По умолчанию

Это я понимаю, но не понимаю, как исправить
oqi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код к задаче! sg-ua Помощь студентам 5 25.09.2013 19:26
тесты к задаче 22hope22 C# (си шарп) 6 12.06.2013 22:28
Что то не так в задаче djyuroktm Помощь студентам 9 15.12.2010 15:15
C++. Что не так в задаче?? ((((( LeNus'Ka Помощь студентам 13 16.10.2010 12:35
Вопрос по задаче VadEr Помощь студентам 3 10.05.2009 11:11