1

Тема: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Ось завдання "https://pastenow.ru/90006a622a1e1594b64356459f51c943"
Ось мій код:

#include<iostream>
#include<math.h>
#include<stdlib.h>
using namespace std;

void main() {
    int * a = 0, * b = 0, * c = 0;
    int sizeA, sizeB, sizeC;
    int b1, b2;
    float avg1=0, avg2=0;
    cout << "Vvedit kilkist elementiv massuvy A: ";
    cin >> sizeA;
    a = new int[sizeA];
    cout << "Vvedit elementu massuvy A : ";
    for (int i = 0; i < sizeA; i++) {
        cin >> a[i];
    }
    cout << "Massuv A[" << sizeA << "]={";
    for (int i = 0; i < sizeA; i++) {
        printf("%d ", a[i]);
    }
    cout << "}"<<endl;
    int min = a[0];
    for (int i = 0; i < sizeA; i++) {
        if (a[i] < min) {
            min = a[i];
        }
    }
    cout << min << endl;
    for (int i = 0; i < sizeA; i++) {
        avg1 = avg1 + a[i];
        }
    avg1 = avg1 / sizeA;
    printf("Seredne znachenna massuvy A = %.2f", avg1);
        cout << endl;
    int ix = 0, d = 0;
    for (int i = 0; i < sizeA; i++) {
        if (i == 0) {
            d = fabs(avg1 - a[i]);
            ix = i;
        }
        else if (fabs(avg1 - a[i]) < d) {
            d = fabs(avg1 - a[i]);
            ix = i;
        }
    }
    cout << ix <<", e naybluzcum do avg massumy A";
    cout << endl;
    //***********************************************************************************
    cout << endl;
    cout << "Vkazit rozmir massuvy B: ";
    cin >> sizeB;
    b = new int[sizeB];
    cout << endl;
    cout << "Vkazit diapazon elementiv massuvy B: ";
    cin >> b1 >> b2;
    for (int i = 0; i < sizeB; i++) {
        b[i] = rand() % (b2 - b1 + 1) + b1;
    }
    cout << "Zhenerovanuy massuv B[" << sizeB << "]={";
    for (int i = 0; i < sizeB; i++) {
        printf("%d ", b[i]);
    }
    cout << "}" << endl;
    for (int i = 0; i < sizeA; i++) {
        avg2 = avg2 + b[i];
    }
    avg2 = avg2 / sizeB;
    printf("Seredne znachenna massuvy B = %.2f", avg2);
    cout << endl;
    int ix1 = 0, d1 = 0;
    for (int i = 0; i < sizeB; i++) {
        if (i == 0) {
            d = fabs(avg2 - b[i]);
            ix1 = i;
        }
        else if (fabs(avg2 - b[i]) < d1) {
            d1 = fabs(avg2 - b[i]);
            ix1 = i;
        }
    }
    cout << ix1 << ", e naybluzcum do avg massumy B";
    cout << endl;
    //***********************************************************************************
    

    
    
}

2 Востаннє редагувалося koala (01.06.2022 10:23:43)

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Як ставити питання так, щоб на них відповідали
Чи ви просто похвалитися вирішили? Ну тоді вітаю!

3

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Я не розумію в якому сенсі похвалитися, хочу просто допомоги в зпвершальному етапі програми, але не знаю як це правильно зробити

koala написав:

Як ставити питання так, щоб на них відповідали
Чи ви просто похвалитися вирішили? Ну тоді вітаю!

4

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Ви можете пояснити, чого саме вам не вистачає в цій програмі?
До речі, функції ви вже вивчали?

5

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Функцію я вивчав, але тут я не використовую функцію, чи потрібно використовувати?
#Unhandled exception at 0x00007FF6136C7770 in laba18.exe: 0xC0000005: Access violation writing location 0x0000000000000000.#Саме ця проблеви виникає у мене і не розумію як виправити! Ось код з цим фрагментом

#include<iostream>
#include<math.h>
#include<stdlib.h>
using namespace std;

void main() {
    int * a = 0, * b = 0, * c = 0;
    int sizeA, sizeB, sizeC;
    int b1, b2;
    float avg1=0, avg2=0;
    cout << "Vvedit kilkist elementiv massuvy A: ";
    cin >> sizeA;
    a = new int[sizeA];
    cout << "Vvedit elementu massuvy A : ";
    for (int i = 0; i < sizeA; i++) {
        cin >> a[i];
    }
    cout << "Massuv A[" << sizeA << "]={";
    for (int i = 0; i < sizeA; i++) {
        printf("%d ", a[i]);
    }
    cout << "}"<<endl;
    int min = a[0];
    for (int i = 0; i < sizeA; i++) {
        if (a[i] < min) {
            min = a[i];
        }
    }
    cout << min << endl;
    for (int i = 0; i < sizeA; i++) {
        avg1 = avg1 + a[i];
        }
    avg1 = avg1 / sizeA;
    printf("Seredne znachenna massuvy A = %.2f", avg1);
        cout << endl;
    int ix = 0, d = 0;
    for (int i = 0; i < sizeA; i++) {
        if (i == 0) {
            d = fabs(avg1 - a[i]);
            ix = i;
        }
        else if (fabs(avg1 - a[i]) < d) {
            d = fabs(avg1 - a[i]);
            ix = i;
        }
    }
    cout << ix <<", e naybluzcum do avg massumy A";
    cout << endl;
    //***********************************************************************************
    cout << endl;
    cout << "Vkazit rozmir massuvy B: ";
    cin >> sizeB;
    b = new int[sizeB];
    cout << endl;
    cout << "Vkazit diapazon elementiv massuvy B: ";
    cin >> b1 >> b2;
    for (int i = 0; i < sizeB; i++) {
        b[i] = rand() % (b2 - b1 + 1) + b1;
    }
    cout << "Zhenerovanuy massuv B[" << sizeB << "]={";
    for (int i = 0; i < sizeB; i++) {
        printf("%d ", b[i]);
    }
    cout << "}" << endl;
    for (int i = 0; i < sizeA; i++) {
        avg2 = avg2 + b[i];
    }
    avg2 = avg2 / sizeB;
    printf("Seredne znachenna massuvy B = %.2f", avg2);
    cout << endl;
    int ix1 = 0, d1 = 0;
    for (int i = 0; i < sizeB; i++) {
        if (i == 0) {
            d = fabs(avg2 - b[i]);
            ix1 = i;
        }
        else if (fabs(avg2 - b[i]) < d1) {
            d1 = fabs(avg2 - b[i]);
            ix1 = i;
        }
    }
    cout << ix1 << ", e naybluzcum do avg massumy B";
    cout << endl;
    //***********************************************************************************
    for (int i = 0; i < sizeB; i++) {
        if (b[i] > min) {
            c[i] = b[i];
        }
    }
    for (int i = 0; i < sizeB; i++) {
        printf("%d", c[i]);
    }


    
    
}
koala написав:

Як ставити питання так, щоб на них відповідали
Чи ви просто похвалитися вирішили? Ну тоді вітаю!

6

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Ну, загалом, вам досить зрозуміло пише: ви намагаєтеся щось зробити за адресою в пам'яті 0x0000000000000000, а це заборонено. Оскільки єдині вказівники, що ви використовуєте в цьому фрагменті - це b і c, то передусім треба перевірити, щоб вони не були нульовими. Рядок

b = new int[sizeB];

я бачу, але c так і лишається nullptr, як і на початку. Спершу порахуйте елементи, далі виділіть пам'ять під c, а потім переносьте. І не на і-е місце, а послідовно заповнюйте. Створіть ще один індекс, скажімо j, і робіть

        if (b[i] > min) {
            c[j++] = b[i];
        }

Про функції - не обов'язково, але ви б зекономили трохи рядків коду, якби винесли спільні операції (пошук найближчого до середнього) в окрему функцію.

Подякували: vzaluskiy23, leofun012

7

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Я все ще не зрозумів як це реалізувати в коді, змоглиб ще з цим допомогти?

koala написав:

Ну, загалом, вам досить зрозуміло пише: ви намагаєтеся щось зробити за адресою в пам'яті 0x0000000000000000, а це заборонено. Оскільки єдині вказівники, що ви використовуєте в цьому фрагменті - це b і c, то передусім треба перевірити, щоб вони не були нульовими. Рядок

b = new int[sizeB];

я бачу, але c так і лишається nullptr, як і на початку. Спершу порахуйте елементи, далі виділіть пам'ять під c, а потім переносьте. І не на і-е місце, а послідовно заповнюйте. Створіть ще один індекс, скажімо j, і робіть

        if (b[i] > min) {
            c[j++] = b[i];
        }

Про функції - не обов'язково, але ви б зекономили трохи рядків коду, якби винесли спільні операції (пошук найближчого до середнього) в окрему функцію.

8

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

І ще одне перевірте та підкажіть як правильно написати функцію знаходження сер знач

float avg(int avg, int x[], int size) {
    for (int i = 0; i < size; i++) {
        avg = avg + x[i];
        avg = avg / size;
    }
    return avg;
}
avg1 = avg(avg1, a[sizeA], sizeA);
koala написав:

Ну, загалом, вам досить зрозуміло пише: ви намагаєтеся щось зробити за адресою в пам'яті 0x0000000000000000, а це заборонено. Оскільки єдині вказівники, що ви використовуєте в цьому фрагменті - це b і c, то передусім треба перевірити, щоб вони не були нульовими. Рядок

b = new int[sizeB];

я бачу, але c так і лишається nullptr, як і на початку. Спершу порахуйте елементи, далі виділіть пам'ять під c, а потім переносьте. І не на і-е місце, а послідовно заповнюйте. Створіть ще один індекс, скажімо j, і робіть

        if (b[i] > min) {
            c[j++] = b[i];
        }

Про функції - не обов'язково, але ви б зекономили трохи рядків коду, якби винесли спільні операції (пошук найближчого до середнього) в окрему функцію.

9

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Вибачте, це так не працює. Якщо у вас є питання - формулюйте його повністю. Якщо ви хочете, щоб хтось перевірив код - то одразу кажіть, чому. Якщо не бачите проблем - то, може, вам нормально буде? Ну і або ви не писали цей код, або ви знаєте, як полічити елементи, виділити пам'ять і заповнити її (особливо оскільки останній пункт я навіть кодом вам написав).

10

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Типу щось такого, але воно всерівно не працює!!

for (int i = 0; i < sizeB; i++) {
        b[i] = rand() % (b2 - b1 + 1) + b1;
        for (int j = 0; j < sizeB; j++) {
            if (b[i] > min) {
                c[j++] = b[i];
            }
    }

Після того я виділив память:

c = new int[sizeC];

, а тоді як вивести, ато воно не виводить,чи я чогось не розумію?

for (int j = 0; j < sizeC; j++) {
        cout << c[j];
    }
koala написав:

Вибачте, це так не працює. Якщо у вас є питання - формулюйте його повністю. Якщо ви хочете, щоб хтось перевірив код - то одразу кажіть, чому. Якщо не бачите проблем - то, може, вам нормально буде? Ну і або ви не писали цей код, або ви знаєте, як полічити елементи, виділити пам'ять і заповнити її (особливо оскільки останній пункт я навіть кодом вам написав).

11

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

vzaluskiy23 написав:

Типу щось такого, але воно всерівно не працює!!

Доки ви мислите категоріями "не працює", нічого і не працюватиме. Що конкретно відбувається?

vzaluskiy23 написав:

Після того я виділив память:

Вибачте, а ви коли, наприклад, яблука в коробку збираєте, ви що спершу робите: ставите коробку, а потім кладете туди яблука, чи спершу кладете яблука, а потім ставите коробку? Що саме ви намагаєтеся заповнювати, якщо ви не виділили пам'ять, яку хочете заповнювати?

12

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Я зрозумів що це

c = new int[sizeC];

потрібно поміняти місцем, та перемістити вгору? Тоді після того писати це ?

for (int i = 0; i < sizeB; i++) {
        b[i] = rand() % (b2 - b1 + 1) + b1;
        for (int j = 0; j < sizeB; j++) {
            if (b[i] > min) {
                c[j++] = b[i];
            }
    }
koala написав:
vzaluskiy23 написав:

Типу щось такого, але воно всерівно не працює!!

Доки ви мислите категоріями "не працює", нічого і не працюватиме. Що конкретно відбувається?

vzaluskiy23 написав:

Після того я виділив память:

Вибачте, а ви коли, наприклад, яблука в коробку збираєте, ви що спершу робите: ставите коробку, а потім кладете туди яблука, чи спершу кладете яблука, а потім ставите коробку? Що саме ви намагаєтеся заповнювати, якщо ви не виділили пам'ять, яку хочете заповнювати?

13

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Зрозуміли в певному сенсі правильно, але до кінця не продумали. Звідки ви берете значення sizeC?

14

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

sizeC на початку я просто оголосив. Це потрібно порахувати елементи массиву б які є більші за мін, потім це число присвоїти sizeC?

koala написав:

Зрозуміли в певному сенсі правильно, але до кінця не продумали. Звідки ви берете значення sizeC?

15

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

vzaluskiy23 написав:

Це потрібно порахувати елементи массиву б які є більші за мін, потім це число присвоїти sizeC?

Саме так.

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

16

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Дивіться ще одне, я зробив функцію по підрахунку елементів массиву В які мені потрібно, а саме більші за мін. Ось фрагмент функції

int counter(int mas[], int size, int m) {
    int count = 0;
    for (int i = 0; i < size; i++) {
        if (mas[i] > m)
            count++;
    }
    return count;
}

В мене чогось якась проблема в саме виклику функції, ось :

counter(b[sizeB], sizeB, min);
    cout << "kilkist elementiv massuvy B, scho e bilshi za min massuvy A: " << counter << endl;

Тут щось b свариться

koala написав:
vzaluskiy23 написав:

Це потрібно порахувати елементи массиву б які є більші за мін, потім це число присвоїти sizeC?

Саме так.

17

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

30 років тому, коли компілятори влізали на дискету (і добре, якщо це була 1.2М дискета, а не 720К), компілятори іноді дійсно видавали незрозумілі повідомлення, добре якщо рядок правильно вказували.
Але у 2022 я сильно сумніваюся, що "щось b свариться" адекватно передає те, що вам повідомляє компілятор. Вперед, ви можете це прочитати.

18

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Я перше ніби був зрозумів. Отож я зробив наступне:

#include<iostream>
#include<math.h>
#include<stdlib.h>
using namespace std;


int main() {
    int* a = 0, * b = 0, * c = 0;
    int sizeA, sizeB;
    int b1, b2;
    float avg1 = 0, avg2 = 0;
    cout << "Vvedit kilkist elementiv massuvy A: ";
    cin >> sizeA;
    a = new int[sizeA];
    cout << "Vvedit elementu massuvy A : ";
    for (int i = 0; i < sizeA; i++) {
        cin >> a[i];
    }
    cout << "Massuv A[" << sizeA << "]={";
    for (int i = 0; i < sizeA; i++) {
        printf("%d ", a[i]);
    }
    cout << "}" << endl;
    int min = a[0];
    for (int i = 0; i < sizeA; i++) {
        if (a[i] < min) {
            min = a[i];
        }
    }
    cout << min << endl;
    for (int i = 0; i < sizeA; i++) {
        avg1 = avg1 + a[i];
    }
    avg1 = avg1 / sizeA;
    printf("Seredne znachenna massuvy A = %.2f", avg1);
    cout << endl;
    int ix = 0, d = 0;
    for (int i = 0; i < sizeA; i++) {
        if (i == 0) {
            d = fabs(avg1 - a[i]);
            ix = i;
        }
        else if (fabs(avg1 - a[i]) < d) {
            d = fabs(avg1 - a[i]);
            ix = i;
        }
    }
    cout << ix << ", e naybluzcum do avg massumy A";
    cout << endl;
    //***********************************************************************************
    cout << endl;
    cout << "Vkazit rozmir massuvy B: ";
    cin >> sizeB;
    b = new int[sizeB];
    int counter = 0;
    int sizeC=counter;
    cout << endl;
    cout << "Vkazit diapazon elementiv massuvy B: ";
    cin >> b1 >> b2;
    for (int i = 0; i < sizeB; i++) {
        b[i] = rand() % (b2 - b1 + 1) + b1;
    }
    cout << "Zhenerovanuy massuv B[" << sizeB << "]={";
    for (int i = 0; i < sizeB; i++) {
        printf("%d ", b[i]);
    }
    cout << "}" << endl;
    for (int i = 0; i < sizeB; i++) {
        if (b[i] > min) {
            counter++;
        }
    }
    cout << "kilkist elementiv massuvy B, scho e bilshi za min massuvy A: " << counter << endl;
    c = new int[sizeC];
    for (int i = 0; i < sizeB; i++) {
        for (int j = 0; j < sizeC; j++) {
            c[j] = b[i];
        }
    }
    for (int j = 0; j < sizeC; j++) {
        printf("%d ", c[j]);
    }
    for (int i = 0; i < sizeA; i++) {
            avg2 = avg2 + b[i];
    }
    avg2 = avg2 / sizeB;
    printf("Seredne znachenna massuvy B = %.2f", avg2);
    cout << endl;
    int ix1 = 0, d1 = 0;
    for (int i = 0; i < sizeB; i++) {
        if (i == 0) {
                d = fabs(avg2 - b[i]);
                ix1 = i;
        }
        else if (fabs(avg2 - b[i]) < d1) {
                d1 = fabs(avg2 - b[i]);
                ix1 = i;
            }
    }
    cout << ix1 << ", e naybluzcum do avg massumy B";
    cout << endl;
    //***********************************************************************************
        return 0;
    }

Але все ж таки воно не хоче виводити массив С на консоль!

koala написав:

30 років тому, коли компілятори влізали на дискету (і добре, якщо це була 1.2М дискета, а не 720К), компілятори іноді дійсно видавали незрозумілі повідомлення, добре якщо рядок правильно вказували.
Але у 2022 я сильно сумніваюся, що "щось b свариться" адекватно передає те, що вам повідомляє компілятор. Вперед, ви можете це прочитати.

19 Востаннє редагувалося wander (02.06.2022 20:08:53)

Re: Утворення Массиву С, із елементів массиву В, що є більші за мін знач А

Ви вже визначтесь нарешті якою мовою ви пишете С чи С++? Пан Koala дав вам слушну пораду, роздробити ваш код на функції, це зменшило б кількість коду і підвищило його здатність до прочитання. В такому спагеті-коді, як у вас і не дивно, що щось не працює, мені здається ви й самі в ньому губитесь. Раджу вам почати таки писати однією мовою (С або С++), поправити форматування (вам же самому буде легше тоді), пройтись зневаджувачем по коду та\або додати проміжний вивід в консоль.

Прихований текст
vzaluskiy23 написав:

Але все ж таки воно не хоче виводити массив С на консоль!

Що означає не хоче?! Може ви образили якось компілятор, от він і не хоче.