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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2021, 11:41   #1
Lovskiy
Пользователь
 
Регистрация: 16.10.2021
Сообщений: 27
По умолчанию Обясните небольшую часть кода

Код:
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
 
#define DET struct det
#define SDET sizeof(struct det)
#define N 100
 
struct det {
    char name[15];
    char sc;
    int cnt;
    float sq;
};
int check_number(int);
void del_item(int);
void show_all(void);
void print_head(void);
void print_line(void);
void show_row(DET*);
int get_number(void);
void show_1(DET*);
int ent_data(DET*);
DET mmm[N];
int n = 0;
 
int main() {
    system("chcp 1251");
    int op;
    int num;
    char eoj;
    for (eoj = 0; !eoj;) {
        printf_s("1-Добавити елемент\n");
        printf_s("2-Видалити елемент\n");
        printf_s("3-Покащати елемент по номеру\n");
        printf_s("4-Показати все\n");
        printf_s("Введіть:\n");
        scanf_s("%d", &op);
        switch (op) {
        case 0:
            eoj = 1;
            break;
        case 1:
            if (!ent_data(mmm + n))n++;
            break;
        case 2:
            if (!check_number(num = get_number())) {
                del_item(num);
                n--;
            }
            break;
        case 3:
            if (!check_number(num = get_number()))
                show_1(mmm + num - 1);
            break;
        case 4:
            show_all();
            break;
        default:
            printf_s("Невірна операція\n");
            break;
        }
        if (op) {
            printf_s("Нажміть клавішу n=%d\n", n);
            _getch();
        }
    }
    return 0;
}
 
int check_number(int a) {
    if (a < 1) {
        printf_s("Мінімальний номер:1\n");
        return -1;
    }
    if (a > n) {
        printf_s("Максимальний номер: %d\n", n);
        return -1;
    }
    return 0;
}
 
void del_item(int m) {
    int i;
    for (; m < n; m++)
        memcpy(mmm + m - 1, mmm + m, SDET);
}
 
void show_all() {
    int i;
    print_head();
    for (i = 0; i < n; i++)
        show_row(mmm + i);
    print_line();
}
 
int get_number() {
    int b;
    printf_s("Введіть номер>");
    scanf_s("%d", &b);
    return b;
}
 
int ent_data(DET* m) {
    float sqx;
    printf_s("Введіть найменування, тип(З П О), к-сть, вагу 1 деталі.>");
    scanf_s("%s", m->name, 14);
    getchar();
    scanf_s("%c", &m->sc);
    scanf_s("%d", &m->cnt);
    scanf_s("%f", &sqx);
    m->sq = sqx;
    if (!strcmp(m->name, "***"))return -1;
    if (strchr("ЗПО", m->sc) == NULL) {
        printf_s("Помилка\n");
        return -2;
    }
    return 0;
}
 
void show_1(DET* m) {
    printf_s("\nНайменування   :%s\n ", m->name);
    printf_s("Тип            :");
    switch (m->sc) {
    case 'З':printf_s("Запозичена"); break;
    case 'П':printf_s("Покупна"); break;
    case 'О':printf_s("Оригінальна"); break;
    }
    printf_s("\nК-сть деталей:%d\n", m->cnt);
    printf_s("Вага однієї деталі :%6.2f\n", m->sq);
    print_line();
}
void show_row(DET* m) {
    printf_s("| %8s |  %7c  |   %5d   | %-5.1f       |\n", m->name, m->sc, m->cnt, m->sq);
}
void print_line() {
    printf_s("-----------------------------------------------\n");
}
 
void print_head() {
    print_line();
    printf_s("|                Відомость деталей              |\n");
    printf_s("|-----------------------------------------------|\n");
    printf_s("|Найменуван|   Тип     |   К-сть   |   Вага     |\n");
    printf_s("|     ня   |           |  деталей  | 1 деталі г |\n");
    printf_s("|----------|-----------|-----------|------------|\n");
}
Нужно обяснить эту часть (52 строка):
Код:
case 3:
			if (!check_number(num = get_number()))
				show_1(mmm + num - 1);
			break;
а именно как происходит добавление массива к числу
Lovskiy вне форума Ответить с цитированием
Старый 29.12.2021, 23:32   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Раз объявлен массив, то сама переменная хранит адрес начала массива. Затем используется адресная арифметика, чтобы получить адрес элемента в массиве.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 31.12.2021, 10:31   #3
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Справедливости ради получить элемент массива можно и по индексу. Я даже больше скажу, использовать обычный массив (не говоря уже об огромном списке глобальный переменных, но это уже все лирика) не нужно, можно использовать вектор, получая там элемент массива по индексу, даже с проверкой на таковой.
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 31.12.2021, 12:24   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от Lovskiy Посмотреть сообщение
а именно как происходит добавление массива к числу
объект автоматического массива неявно преобразуется к указателю на его первый элемент. И получается, что mmm + num - 1 эквивалентно

Код:
mmm[(size_t)(num - 1)]
Алексей1153 вне форума Ответить с цитированием
Старый 31.12.2021, 14:58   #5
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Код:
mmm[(size_t)(num - 1)]
Зачем тут (size_t)? Результатом вычитания будет значение типа Int, которое и так подходит в качестве индекса
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 01.01.2022, 09:13   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от maks1331 Посмотреть сообщение
Зачем тут (size_t)
потому что этот тип используется для индексации массивов. К нему всё равно неявно будет выполнено приведение

Цитата:
Сообщение от maks1331 Посмотреть сообщение
типа Int
такого типа в C++ нет
Алексей1153 вне форума Ответить с цитированием
Старый 01.01.2022, 12:56   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Я в ++ не копенгаген, но вот заинтересовало: что, указом упразднили тип Int? Или ++ чувствителен к ВЕРХНЕМУ-нижнему регистру исходника и Int "моя не понимай"?
digitalis вне форума Ответить с цитированием
Старый 01.01.2022, 14:08   #8
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Ну как это нет, если есть, вы когда такое заявляете, будьте добры как то обосновывать свои доводы, иначе вас за сумасшедчего принять можно
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 01.01.2022, 14:37   #9
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

maks1331, да не вопрос, вот доводы https://onlinegdb.com/QfeWw8ZYr
Алексей1153 вне форума Ответить с цитированием
Старый 01.01.2022, 15:28   #10
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

А, ну я понял, с новым годом
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адаптировать часть кода с VS6 на VS19 deluxe90139 Помощь студентам 10 18.07.2020 11:53
Изменить часть кода СтаСС Microsoft Office Excel 12 27.03.2018 17:36
Какая часть кода вредоносная? shy_plumbum PHP 10 09.01.2016 11:37
Объясните часть кода (Delphi) Начинающий програм Помощь студентам 2 29.03.2012 20:49
Прокомментировать часть кода Kasper1 Общие вопросы по Java, Java SE, Kotlin 4 08.01.2011 20:42