1

Тема: Вказівники

Код і умова:
В одновимірному масиві, що складається з n дійсних елементів, знайдіть:
1) максимальний елемент масиву (3 бали);
2) суму елементів масиву, розташованих до останнього додатного елемента (+1 бал);
3) стисніть масив, видаливши з нього всі елементи, модуль яких знаходиться в інтервалі [a, b].
Елементи, що звільняються в кінці масиву, заповніть нулями (+1 бал).

#include "pch.h"
#include <iostream>
#include <ctime>
using namespace std;
int maximum(int *p, int n)
{
    int max = *(p + 0);//нехай перший елемен - найбільший
    for (int i = 0;i < n;i++)
    {
        if (max < *(p + i))//якщо найбільший елемент менший за поточний то
        {
            *(p + i) = max;//тепер поточний елемент найбільший
        }
    }
    return max;
}
int summa(int *p, int n)
{
    int sum = 0;
    for (int i = n; i > 0;i--)// рухаємся з кінця до першого додатнього
    {
        if (*(p + i) > 0)//якщо додатній то:
        {
            for (int j = 0;j < i;j++)//сумуємо всі від першого елемента і до того, який задовільнив if (*(p + i) > 0)
            {
                sum += *(p + j);
            }
            break;//після додавання виходим з циклу
        }
    }
    return sum;
}
int main()
{
    srand(time(NULL));
    setlocale(LC_CTYPE, "ukr");
    int a, b, n;
    cout << "Введiть кiлькiсть чисел:";
    cin >> n;
    int *arr = new int[n];
    for (int i = 0;i < n;i++)
    {
        arr[i] = rand() % 50 - i;
        cout << arr[i] << "\t";
    }
    cout << endl;
    /*cout << "Введiть iнтервал стиснення масиву від ";
    cin >> a;
    cout << " до ";
    cin >> b;*/
    cout << " Максимальний елемент масиву:" << maximum(arr, n) << endl;
    cout << "Сума значень масиву до отаннього додатнього елемента:" << summa(arr, n) << endl;
    delete[]arr;
}

Результат:
Введiть кiлькiсть чисел:10
12      -1      47      17      24      40      25      35      28      2
Максимальний елемент масиву:12
Сума значень масиву до отаннього додатнього елемента:95

Максимальний завжди перший елемент, тобто цикл пошуку найбільшого числа не працює, і сума не зрозуміло яка виходить.
Допоміжіть знайти помилки будь-ласка *NO*

2 Востаннє редагувалося ExPy (29.07.2020 23:29:24)

Re: Вказівники

Замiнити

*(p + i) = max;//тепер поточний елемент найбільший

На

 max = *(p + i);
Подякували: grinyuk3091

3

Re: Вказівники

...недогледів, дякую працює, а що з сумою не так?

ExPy написав:

Замiнити

*(p + i) = max;//тепер поточний елемент найбільший

На

 max = *(p + i);

4

Re: Вказівники

Будь ласка, замість *(p+i) пишіть p[i]. Це синоніми, але другий запис значно зрозуміліший.
По першому (максимум) ExPy вже сказав.
По другому завданню: вам треба тримати дві змінні, поточну суму всіх елементів і суму всіх елементів до останнього додатного. Далі в циклі додаєте елемент до суми і якщо він додатний, то суму до останнього додатного оновлюєте. А ви припиняєте цикл, щойно зустрінете перший додатний. Можна також іти у зворотному напрямку - спочатку до першого (з кінця) додатного просто проходити, а потім додавати.
І ще я маю підозру, що назва теми має певний стосунок до задачі, але в умові про це нічого не сказано.

5

Re: Вказівники

ExPy,
1 2 -2 - сума до останнього додатного 1
1 2 4 - сума до останнього додатного 3
Ясно?

Подякували: ExPy1

6 Востаннє редагувалося grinyuk309 (02.02.2020 01:45:20)

Re: Вказівники

Так краще? тільки я не розумію умову про нулі
Елементи, що звільняються в кінці масиву, заповніть нулями

#include "pch.h"
#include <iostream>
#include <ctime>
#define M 100
using namespace std;
int maximum(int *p, int n)
{
    int max = p[0];//нехай перший елемен - найбільший
    for (int i = 0;i < n;i++)
    {
        if (max < p[i])//якщо найбільший елемент менший за поточний то
        {
            max = p[i];//тепер поточний елемент найбільший
        }
    }
    return max;
}
int summa(int *p, int n)
{
    int sum = 0, k;
    for (int i = 0; i <n;i++)//шукаєм індекс останнього додатнього
    {
        if (0 < p[i])
        {
            k = i;
        }
    }
    for (int i = 0;i < k;i++)//додаєм всі числа до останнього додатнього
    {
        sum += p[i];
    }
    return sum;
}
int compression(int *p, int n, int a, int b)
{
    int r[M], m = 0;// оголошуєм допоміжний масив
    for (int i = 0; i < n;i++)
    {
        if (p[i] < b && a < p[i]) 
        {
            r[m] = p[i];//заповнєм новий масив значеннями які належать інтервалу
            m++;
        }
    }
    for (int i = 0;i < m;i++)//записуєм відібрані значення у початковий масив
    {
        p[i] = r[i];
    }
    return m;// повертаєм розмір стисненого масиву
}
int main()
{
    srand(time(NULL));
    setlocale(LC_CTYPE, "ukr");
    int a, b, n;
    cout << "Введiть кiлькiсть чисел:";
    cin >> n;
    int *arr = new int[n];
    for (int i = 0;i < n;i++)
    {
        arr[i] = rand() % 30 - i*i;
        cout << arr[i] << "\t";
    }
    cout << endl;
    cout << "Введiть iнтервал стиснення масиву від ";
    cin >> a;
    cout << " до ";
    cin >> b;
    cout << " Максимальний елемент масиву:" << maximum(arr, n) << endl;
    cout << "Сума значень масиву до отаннього додатнього елемента:" << summa(arr, n) << endl;
    cout << "Масив пiсля стиснення: ";
    int x = compression(arr, n, a, b);
    for (int i = 0;i < x;i++)
    {
        cout << arr[i] << "\t";
    }
    delete[]arr;     
}

Введiть кiлькiсть чисел:5
26      13      14      -7      -2
Введiть iнтервал стиснення масиву в?д 12
до 15
Максимальний елемент масиву:26
Сума значень масиву до отаннього додатнього елемента:39
Масив пiсля стиснення: 13       14

koala написав:

ExPy,
1 2 -2 - сума до останнього додатного 1
1 2 4 - сума до останнього додатного 3
Ясно?

7

Re: Вказівники

grinyuk309 написав:

3) стисніть масив, видаливши з нього всі елементи, модуль яких знаходиться в інтервалі [a, b].

grinyuk309 написав:

Введiть кiлькiсть чисел:5
26      13      14      -7      -2
Введiть iнтервал стиснення масиву в?д 12
до 15
Максимальний елемент масиву:26
Сума значень масиву до отаннього додатнього елемента:39
Масив пiсля стиснення: 13       14

Так навпаки ж. 13 і 14 знаходяться в інтервалі 12..15 - значить, їх треба видалити. Має лишитися 26, -7, -2. А оскільки розмір масиву 5, то у нас ще 2 пустих місця в кінці, їх треба заповнити нулями: 26, -7, -2, 0, 0.

Подякували: plusxx, grinyuk3092