Вытащить данные с помощью keyNumber - PullRequest
0 голосов
/ 10 января 2019
struct Store {
    int number;
    char name[50];
    double caloNumber;
};

int main(int argc, const char * argv[]) {
    int totalCalo = 0;
    int keyNumber;

    struct Store store1 = {1,"A",390},
    store2 = {2, "B",710},
    store3 = {3, "C",569},
    store4 = {4, "D",450},
    store5 = {5, "E",630},
    store6 = {6, "F",370},
    store7 = {7, "G",720},
    store8 = {8, "H",680},
    store9 = {9, "I",570},
    store10 = {10, "J",530},
    store11 = {11, "K",570},
    store12 = {12, "L",380},
    store13 = {13, "M",670},
    store14 = {14, "N",590},
    store15 = {15, "O",430};


    printf("Enter the number");

    printf("/Breakfast : \n");
    scanf("%d",keyNumber);

    printf("/Lunch : \n");

    printf("/Dinner : \n");


    //caculate 3 calories

    return 0;
}

У меня возникли проблемы при извлечении определенных данных с номером, который вводит пользователь. Пример: A ~ O - название магазина, приложение спросит, какой пользователь магазина взял, и пользователь введет его «keyNumber», а третье число - данные о калориях. Мой вопрос заключается в том, как получить данные о калориях из keyNumber. На языке Си нет карты и словаря, поэтому я просто не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете использовать gperf (https://www.gnu.org/software/gperf/) для статической генерации идеального хэша, если вы действительно не хотите заставлять пользователя искать количество еды, но у вас все еще есть поиск O(1). Как то так,

%ignore-case
%readonly-tables
%struct-type
struct month { const char *name; int calories; };
%%
A, 390
B, 710
C, 569
D, 450
E, 630
F, 370
G, 720
H, 680
I, 570
J, 530
K, 570
L, 380
M, 670
N, 590
O, 430
%%

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

const struct month *month(const char *str) {
    return in_word_set(str, strlen(str));
}

int main(void) {
    const struct month *a = month("A"), *a_lc = month("a"), *z = month("z"),
        *j = month("j");
    printf("A: %d.\n"
        "a: %d.\n"
        "z: %d.\n"
        "j: %d.\n", a ? a->calories : -1, a_lc ? a_lc->calories : -1,
            z ? z->calories : -1, j ? j->calories : -1);
    return EXIT_SUCCESS;
}

Тогда gperf Calories.gperf > Calories.c. Что касается gperf 3.0.4, компилятор C жалуется, что параметр len не используется, но это, вероятно, потому что len == 1 для всех примеров в вашем примере. Он также жалуется на отсутствующий инициализатор, но это тривиально исправлено.

A: 390.
a: 390.
z: -1.
j: 530.
0 голосов
/ 10 января 2019

Я не парень C, но, как общая логика программирования, я думаю, вы можете поместить store1-store15 в массив, а затем перебирать массив, пока не найдете хранилище с заданным ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...