1

(7 відповідей, залишених у C++)

Щиро дякую вам! Зараз сяду і розберу, що робила не так :)
Як добре, що є ще такі люди, як ви, що допоможуть розібратись!

2

(7 відповідей, залишених у C++)

Я пробувала одразу оголошувати як

 int **matr 

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

3

(7 відповідей, залишених у C++)

Не розумію, а що не так?

4

(7 відповідей, залишених у C++)

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

Ось моє завдання, нижче наведу код:

Створити клас – квадратна матриця. У закритій частині описати поля: розмір матриці та двовимірний масив для зберігання її елементів (цілих чисел). Визначити конструктор та деструктор, функції для введення та виведення значень елементів матриці, обчислення сліду матриці (суми елементів головної діагоналі), сум елементів вище та нижче головної діагоналі.                                                                                                                                                                      Перевантажити операції > (порівняння матриць за слідом), + (додавання матриць), відсортувати масив екземплярів класу матриць за зростанням сліду з використанням алгоритму сортування вставками, обчислити суму двох заданих матриць з масиву (якщо це можливо). Використати оператори: new та delete.

Код:

#include <iostream>
#include <cmath>

using namespace std;

class Matrix
{
private:
    int matr[15][15];
    int Rank;
public:

    int sum;
    Matrix() {
        cout << "\nСonstructor was called for " << this << endl;
    }

    // Конструктор глибокого копіювання, а також тут ж виділяю пам'ять для свого динамічного масиву

    Matrix(const Matrix& source) {

        Rank = source.Rank;

        if (source.matr)
        {
            int** matr = new int* [Rank];
            for (int i = 0; i < Rank; i++)
                matr[i] = new int[Rank];

            for (int i = 0; i < Rank; ++i) {
                for (int j = 0; j < Rank; j++) {
                    matr[i][j] = source.matr[i][j];
                }
            }
        }
        else
            int** matr = nullptr;
    }

    ~Matrix() {
        if (matr != NULL) {
            for (int i = 0; i < Rank; ++i) {
                delete[] matr[i];
            }
            delete[] matr;
        }
        cout << "\nDestructor was called for " << this << endl;
    }

    void setMatrix() {
        cout << "\nInput rang of matrix (max 15):" << endl;
        cin >> Rank;
        if (Rank > 15) {
            while (Rank > 15) {
                cout << "Incorrect rang" << endl;
                cout << "Input rang of matrix (max 15):" << endl;
                cin >> Rank;
            }
        }
        cout << "Input elements of matrix:" << endl;
        for (int i = 0; i < Rank; i++) {
            for (int j = 0; j < Rank; j++) {
                cin >> matr[i][j];
            }
        }
        cout << endl;
    }

    void Data() {
        setMatrix();
        cout << "Elements:" << endl;
        printMatrix();
        cout << "\nSum of diagonal: " << mainDiagonal() << endl;
        cout << "Sum of elements above diagonal:  " << upSum() << endl;
        cout << "Sum of elements under diagonal: " << downSum() << endl;
    }

    void printMatrix() {
        for (int i = 0; i < Rank; i++) {
            for (int j = 0; j < Rank; j++) {
                cout << matr[i][j] << "  ";
            }
            cout << endl;
        }
    }

    int mainDiagonal() {
        sum = 0;
        for (int i = 0, j = 0; i < Rank && j < Rank; i++, j++) {
            sum = sum + matr[i][j];
        }
        return sum;
    }

    int upSum() {
        int upsum = 0;
        for (int i = 0; i < Rank - 1; i++) {
            for (int j = i + 1; j < Rank; j++) {
                upsum = upsum + matr[i][j];
            }
        }
        return upsum;
    }

    int downSum() {
        int downsum = 0;
        for (int i = 1; i < Rank; i++) {
            for (int j = 0; j < i; j++) {
                downsum = downsum + matr[i][j];
            }
        }
        return downsum;
    }

    bool Check(const Matrix& b) {

        if (this->Rank != b.Rank) {
            cout << "\nSum of these matrix is impossible!" << endl;
        }
        else {
            return true;
        }
    }

    bool operator> (const Matrix& a)
    {
        return this->sum > a.sum;

    }

    void operator+(const Matrix& b) {

        Matrix result;
        result.Rank = b.Rank;
        for (int i = 0; i < this->Rank; i++) {
            for (int j = 0; j < this->Rank; j++) {
                result.matr[i][j] = this->matr[i][j] + b.matr[i][j];
            }
        }
        cout << "\n\n Sum of two matrix = " << endl;
        result.printMatrix();
    }

};
int main() {
    system("chcp 1251");

    Matrix Matrix1;
    Matrix1.Data();
    Matrix Matrix2;
    Matrix2.Data();
    Matrix Matrix3;
    Matrix3.Data();
    Matrix Matrix4;
    Matrix4.Data();

    Matrix mass[4];
    mass[0] = Matrix1;
    mass[1] = Matrix2;
    mass[2] = Matrix3;
    mass[3] = Matrix4;

    Matrix temp;
    for (int j = 0; j < 3; j++) {
        if (mass[j] > mass[j + 1]) {
            temp = mass[j + 1];
            int t = j;
            while (mass[t] > temp) {
                mass[t + 1] = mass[t];
                if (t == 0) {
                    t--;
                    break;
                }
                t--;
            }
            mass[t + 1] = temp;
        }
    }

    cout << "\n\nArr of objects of class Matrix(slid):" << endl;
    for (int n = 0; n < 4; n++) {
        cout << mass[n].sum << endl;
    }

    if (mass[0].Check(mass[1])) {
        mass[0] + mass[1];
    }

    return 0;
}

Ця тема для мене нова, тому можуть бути якісь прості помилки, тому прошу вашої допомоги, якщо можна з наочним кодом)

Ось така вибиває помилка: Debug Assertion failed!

Підозрюю що діло в операторі new або delete, бо якщо без них і конструктора копіювання, то програма працює.

5

(4 відповідей, залишених у C)

Дуже вам дякую, тепер ясно. Дякуюю  *ROSE*

6

(4 відповідей, залишених у C)

Ну в університеті..

Ну дивіться, є код:

#include <stdio.h>
#include <stdlib.h>

typedef
struct Rom2Num {  // створюємо структуру для збереження відповідності латинської букви і  числа
    int lat;     // змінна для латинських букв
    int num;    // змінна для десяткових чисел
} ROMAN;       // "новий" тип для Rom2Num

ROMAN acc[] = { {'M',1000},{'D',500},{'C',100},    // відповідні Римські числа для десяткових
                    {'L',50},{'X',10},{'V',5},{'I',1} };

int  main()
{
    system("chcp 1251");   // підключення кирилиці
    system("cls");
    int digit;      // змінна для введення користувачем 10-ого числа

    printf("\t *************************************************************** \n"
        "\t Програма для подання десяткових чисел в Римській системі запису \n"
        "\t *************************************************************** \n");
    do {
        printf("\n\t Введіть число:");  // використовуємо цикл для введення даних
        scanf_s("%d", &digit);

        if (digit < 0 || digit >= 4000)   // цикл виконується до тих пір поки користувач не введе правильні дані
            printf(" Введено невірні дані! Спробуйте ще раз.\n Дані повинні бути > 0 та < 4000! \n");
    } while (digit < 0 || digit >= 4000);

    int number, t = 2;
    char result[20] = "", *pres = result; // створюємо змінну result для результату
    ROMAN* promnum = acc;        // promnum вказівник на масив acc

    while (digit > 0) {
        number = promnum->num;  // у dec записуємо десяткове значення з масиву acc, 
                                    // за допомогою -> отримуємо доступ до елемента структури
        while (digit >= number) {
            digit -= number;
            *pres++ = promnum->lat; // в res дописуємо значення у римській системі для decim з масиву асс
        }
        if (digit == 0) break;
        number = promnum->num - (promnum + t)->num; // у dec записуємо наступне десяткове значення з acc
        if (digit >= number) {
            digit -= number;
            *pres++ = (promnum + t)->lat;
            *pres++ = promnum->lat;
        }
        promnum++;  t = (t == 2 ? 1 : 2); // t- змінна для переходу між елементами масиву aсс;
    }
    printf("\t Ваше число в Римській СЧ: %s", result);
   
}

Мені не до кінця зрозуміло за змінну t, вона є вказівником на другий елемент елементу масиву?чи я мислю неправильно? і ще для чого нам її міняти(ну тобто, то вона 1, то вона 2). Буду дуже вдячна, якщо поясните як саме це працює. Дякую :)

7

(4 відповідей, залишених у C)

Добрий день! Чи можна мені скинути тут код і запитати про те як працює його частина(сама пробувала розібратись, ніби трішки зрозуміла, але не до кінця)?

8

(14 відповідей, залишених у C++)

всім дякую за відповідь)

9

(14 відповідей, залишених у C++)

ну це масив типо Римських чисел

10

(14 відповідей, залишених у C++)

використовую середовище Visual Studio 2019, windows 10,   
от я і не знаю чи все правильно зробила, бо код не працює, хоч компілятор в середовищі не видає помилок.
Так я ж і прийшла по допомогу(
пробачте, що забираю ваш час, я просто вже довго сиджу на тим завданням, от, а нормальний код написати не виходить(

11

(14 відповідей, залишених у C++)

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

12

(14 відповідей, залишених у C++)

Добрий ранок, написала ось такий код на С
(але він чомусь не працює, вибачте, що питаю про це(може це і банальщина), але просто вже дуже довго сиджу над цим завданням і ніяк не можу нормально написати код(...допоможіть, якщо не важко). Саме завдання: Подання десяткових чисел в римській системі.

Код:

#include <stdio.h> 
#include <stdlib.h> 


// Function to convert decimal to Roman Numerals
int printRoman(int number)
{
    int num[] = { 1,4,5,9,10,40,50,90,100,400,500,900,1000 };
    char sym[] = { 'I','IV','V','IX','X','XL','XC','C','CD','D','CM','M'};
    int i = 13;
    while (number > 0)
    {
        int div = number / num[i];
        number = number % num[i];
        while (div--)
        {
            printf("%s", *(sym + i));
        }
        i--;
    }
    return 0;
}
//Driver program
int main()
{
    int number;
    printf("Enter a number:");
    scanf_s("%d", &number);

    printRoman(number);

    return 0;
}

13

(6 відповідей, залишених у C++)

вибачте, я не бачила, дякую))

14

(6 відповідей, залишених у C++)

lucas-kane написав:

Для того, щоб згенерувати число, скажімо в діапазоні від [0, 10) в С пишемо int r = rand() % 10;        // 0 .. 9
Важливо зрозуміти, що 10 тут не верхня межа діапазону, а кількість чисел діапазону, відлік яких розпочинається в даному випадку від 0. Тобто, щоб згенерувати числа в діапазоні від 0 до 10 включно, тоді нам потрібно писати кількість чисел 11 (10 + 1)
int r = rand() % (10 + 1);     // 0..10
Для того, щоб задати нижню межу діапазону, пишемо наступне:
int r = 1 + rand() % 10;    // 1 .. 9

Тоді по аналогії оголосимо змінні A та B (нижня та верхня межі діапазону)

int a = 5;
int b = 10;

int r = a + rand() % (b - a); // 5 .. 9
int r = a + rand() % (b - a + 1); // 5 .. 10

Ще раз a - це нижня межа діапазону
b - верхня межа діапазону і щоб програма генерувала числа до цієї межі, потрібно вказати їй скільки чисел розташовано в цьому діапазоні, тобто (b - a); // 5 .. 9 (4 числа) або (b - a + 1); // 5 .. 10 (відповідно п'ять)

Приклад коду в діапазоні від -5 до 10 (розмір діапазону займе п'ятнадцять чисел + 1) включно буде мати вигляд

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10

int main()
{
  srand(time(0));

  int ra[SIZE], a, b;
  a = -5;
  b = 10;
  for (size_t i = 0; i < SIZE; i++)
    ra[i] = a + rand() % (b - a + 1);

  return 0;
}

Дуже вам дякую, тепер набагато ясніше стало :) *ROSE*
А чи не підкажете як саме вилучити непарні елементи?

15

(6 відповідей, залишених у C++)

Я не так давно вчу програмування і тому запитала, щоб краще зрозуміти,я звісно дякую, але ви трохи грубо відповіли. Не можна визначити знання людини тільки за запитанням заданим нею, а про лічильник не знала(ще не вивчали), дякую(

16

(6 відповідей, залишених у C++)

Допоможіть розібратись із завданням.
Завдання: Сформувати масив із N випадкових чисел, що потрапляють у заданий
проміжок А. .В. Надрукувати сформований масив. Потім вилучити з нього
всі непарні елементи. Надрукувати масив після скорочення і вказати, скільки
елементів вилучено. Підказка: для вилучення зсувати всі наступні елементи
масиву ліворуч.

1. Наприклад, для того, щоб користувач ввів проміжок використаємо такий код:

    
    int min, max;
    printf("\n Виберіть проміжок чисел N які будуть входити в масив( A - B ):\n ");
    scanf_s("%i  %i", &min, &max);

2. Для генерації випадкових чисел потрібно використати srand(time()) i rand(), але як їх використати так, щоб згенеровані ними числа входили у введений проміжок?

3. Вилучити непарні елементи створеного масиву можна так:

 printf("\n Новий масив:");
    for (i = 0; i < n; i++) {
        if (a[i] % 2 != 0) {
            a[i] = a[i] << 1;
            printf("%d\t", a[i]);
        }

Але як нам ще вказати к-сть елементів, яка була вилучена?

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

17

(4 відповідей, залишених у C++)

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

Хочу попросити поради. Написала такий код для реалізації цього завдання( мова С ):
Чи можна якось змінити код, щоб виглядав лаконічніше та зменшити, або може потрібно чи краще застосувати масиви? я новачок в сі, тому прошу вашої поради. 

#include <stdio.h> 
#include <stdlib.h>

int main(void) {

    system("chcp 1251");
    int num;
    printf("Введіть число: \n");
    scanf_s("%d", &num);


    if (num <= 0)
    {
        printf("не можливо обробити ваші дані");
    }
    else if (num >= 4000)
    {
        printf("не можливо обробити ваші дані");
    }
    else {
        printf("Число в Римській СЧ: \n ");
        while (num > 0) {

            if (num >= 1000)       // 1000 - M
            {
                printf("M");
                num -= 1000;
            }

            else if (num >= 900)   // 900 -  CM
            {
                printf("CM");
                num -= 900;
            }

            else if (num >= 500)   // 500 - D
            {
                printf("D");
                num -= 500;
            }

            else if (num >= 400)   // 400 -  CD
            {
                printf("CD");
                num -= 400;
            }

            else if (num >= 100)   // 100 - C
            {
                printf("C");
                num -= 100;
            }

            else if (num >= 90)    // 90 - XC
            {
                printf("XC");
                num -= 90;
            }

            else if (num >= 50)    // 50 - L
            {
                printf("L");
                num -= 50;
            }

            else if (num >= 40)    // 40 - XL
            {
                printf("XL");
                num -= 40;
            }

            else if (num >= 10)    // 10 - X
            {
                printf("X");
                num -= 10;
            }

            else if (num >= 9)     // 9 - IX
            {
                printf("IX");
                num -= 9;
            }

            else if (num >= 5)     // 5 - V
            {
                printf("V");
                num -= 5;
            }

            else if (num >= 4)     // 4 - IV
            {
                printf("IV");
                num -= 4;
            }

            else if (num >= 1)     // 1 - I
            {
                printf("I");
                num -= 1;
            }
        }
    }

    return 0;
}