Тема: Чи можете пояснити частину коду?

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

2 Востаннє редагувалося mamkin haker (26.11.2021 10:39:11)

Re: Чи можете пояснити частину коду?

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

3

Re: Чи можете пояснити частину коду?

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

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

#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). Буду дуже вдячна, якщо поясните як саме це працює. Дякую :)

4 Востаннє редагувалося koala (30.11.2021 11:31:15)

Re: Чи можете пояснити частину коду?

Римські цифри бувають двох типів: 10n (I,X,C,M) і 5*10n (V,L,D). Перший тип може записуватися перед більшою цифрою, другий - ні. t, фактично, розрізняє ці два типи: іноді беремо число на 2 далі по масиву (для X - I, для M - C), іноді - на 1 (для V - I, для L - X).

Подякували: lesivsolomiya, mamkin haker2

5

Re: Чи можете пояснити частину коду?

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