Как я могу использовать массивы структур для вывода данной структуры на основе пользовательского ввода - PullRequest
0 голосов
/ 09 декабря 2018

ВЫПУСК: Я пытаюсь заполнить свой beerData struct данными, найденными в beer.dat, за исключением того, что я не понимаю, как структуры работают достаточно хорошо для реализации без сбоя моего кода.Я считаю, что мне нужен массив структур.

Содержимое файла beer.dat:

7 // total number of beers 
Coors //beer name
1234567 // beer id
72 // beer quantity
7.40 //beer price 
Miller
7777777
44
9.70
Bud
7654321
345
9.90
Wachusett
7799435
4
14.70
Corona
9999999
112
9.99
Zima
0000000
1
0.01
Mikes
0890398
12
10.99

КОД:

/*
    User interface, alloc, malloc 13 points
    Correct structure and array built 7 points
    Recursive sort
 */

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

struct beerData {
    char *beer[7]; // number of brands

    char *beer_name; //names
    int beer_id[7]; //ID number given to beer
    int beer_quantity; //stock
    float beer_price; // pricing
} beer_data;


void printStr(char *line) {

    char *look = "";
    printf("What would you like to search for? \n");
    scanf("%s", look);

    //printf("Line: %s\n", line);


    exit(0);
}

void search() {
    //look through beer.dat for a specific beer by ID number.
    char str[32];

    FILE *fp = fopen("beer.dat", "r");

    if (fp == NULL) {
        printf("Error: can't open file to read\n");
    } else {
        while (!feof(fp)) {
            fscanf(fp, "%s ", str);
            //printf("%s\n",str);
            printStr(str);
        }

    }

    fclose(fp);
}


int main() {

    int user_choice;
    printf("Enter 1 to search for a beer, 2 to view the entire catalogue,"
           " and 3 to place an order, press 4 to exit.\n");


    while (user_choice != 4) {
        scanf("%d", &user_choice);
        switch (user_choice) {

            case 1:
                printf("Searching for a beer\n");
                user_choice = 0;
                search();
                break;
            case 2:
                printf("Viewing Inventory\n");
                //viewInv();
                break;
            case 3:

                printf("Placing an order...\n");
                //placeOrder();
                break;
            case 4:
                printf("Goodbye!\n");
                exit(0);
            default:
                printf("Incorrect entry, try again.\n");
                continue;
        }
    }


}

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

Для полной ясности я опубликую вопросы о задании на случай, если я не передам свои потребности должным образом.Назначение:

  1. Поиск пива должен запросить у пользователя идентификационный номер, а результат должен отобразить его количество и цену, если они есть в вашем инвентаре.
  2. Aпросмотр всего инвентаря будет отображать все пиво с их идентификационным номером, ценой и количеством в порядке возрастания цены.Эта сортировка должна выполняться с использованием рекурсивного пузыря или рекурсивного выбора.
  3. При оформлении заказа на экран должна быть напечатана накладная заказа.

1 Ответ

0 голосов
/ 09 декабря 2018

Сначала вам нужно объявить содержательную структуру.Структура содержит соответствующую информацию для каждого элемента.Пример:

typedef struct beer_data 
{
    char name[20]; //names
    int id; //ID number given to beer
    int quantity; //stock
    float price; // pricing
} beer_data;

Далее вам нужен массив этой структуры.Используйте malloc, чтобы выделить достаточно памяти для total количества элементов.Пример:

beer_data *beers = malloc(total * sizeof(beer_data));

Теперь у вас есть beers[0], beers[1], beers[2]..., прочитайте каждый элемент в файле и поместите его в структуру.

Чтобы прочитать файл, вы можете использовать fscanf или fgets.

Первая строка в вашем файле:

7 // total number of beers 

Вы можете прочитать число 7, используя fscanf:

int maximum = 0;
fscanf(fp, "%d", &maximum);

Это должно работать нормально, нопосле этого есть символы, которые вас не интересуют. Используйте fgets, чтобы прочитать до конца строки и отбросить эти символы.

Запустите цикл и прочитайте каждую строку, добавьте к структуре.

При использовании этого метода, если вы добавляете новый элемент, вам необходимо увеличить объем памяти.Смотрите add_item, который использует realloc.Это может быть слишком продвинутым.Кроме того, вы можете сохранить новый элемент в файл, вызвать free(beers) и снова прочитать файл.

typedef struct beer_data 
{
    char name[20]; //names
    int id; //ID number given to beer
    int quantity; //stock
    float price; // pricing
} beer_data;

void search_by_name(beer_data *beers, int total)
{
    char buf[20];
    printf("Enter name to search: ");
    scanf("%19s", buf);
    //note, we put %19s because beers[count].name is only 20 bytes long

    for(int i = 0; i < total; i++)
    {
        if(strcmp(beers[i].name, buf) == 0)
        {
            printf("Found: %s, %d, %d, %.2f\n",
                beers[i].name, beers[i].id, beers[i].quantity, beers[i].price);
            return;
        }
    }
    printf("%s not found\n", buf);
}

void print_list(beer_data *beers, int total)
{
    for(int i = 0; i < total; i++)
    {
        printf("%s %d %d %.2f\n",
            beers[i].name, beers[i].id, beers[i].quantity, beers[i].price);
    }
}

void add_item(beer_data *beers, int *total)
{
    //note, total has to be passed as pointer 
    //because we are changing it

    //allocate more memory:
    beers = realloc(beers, sizeof(beer_data) * (*total + 1));

    printf("enter name: "); 
    scanf("%19s", beers[*total].name);

    printf("enter id:");
    scanf("%d", &beers[*total].id);

    printf("enter quantity:");
    scanf("%d", &beers[*total].quantity);

    printf("enter price:");
    scanf("%f", &beers[*total].price);

    //increase the total
    *total += 1;
}

int main() 
{
    FILE *fp = fopen("beer.dat", "r");
    if(!fp)
    {
        printf("Error: can't open file to read\n");
        return 0;
    }

    char buf[500];

    int maximum = 0;
    fscanf(fp, "%d", &maximum);

    //read the rest of the line and discard it 
    fgets(buf, sizeof(buf), fp);

    //allocate memory
    beer_data *beers = malloc(maximum * sizeof(beer_data));

    int total = 0;
    while(1)
    {
        fgets(buf, sizeof(buf), fp);
        sscanf(buf, "%19s", beers[total].name);

        if(fscanf(fp, "%d", &beers[total].id) != 1) break;
        fgets(buf, sizeof(buf), fp);

        if(fscanf(fp, "%d", &beers[total].quantity) != 1) break;
        fgets(buf, sizeof(buf), fp);

        if(fscanf(fp, "%f", &beers[total].price) != 1) break;
        fgets(buf, sizeof(buf), fp);

        total++;
        if(total == maximum)
            break;
    }

    fclose(fp);

    int stop = 0;
    while (!stop)
    {
        printf("\
    Enter 0 to exit\n\
    Enter 1 print list\n\
    Enter 2 for search\n\
    Enter 3 add new item\n");

        int choice;
        scanf("%d", &choice);
        switch(choice)
        {
        case 0: 
            stop = 1;
            break;

        case 1:
            print_list(beers, total);
            break;

        case 2:
            search_by_name(beers, total);
            break;

        case 3:
            add_item(beers, &total);
            break;
        }
        printf("\n");
    }

    //cleanup:
    free(beers);

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