Проблемы со структурами

Объясните ошибки и что я не так сделал по поводу кода. Работа со структурами

Товар на складе Поля: Вид товара, Количество на складе Цена за единицу Дата поступления

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

В ходе выполнения у меня вылезли три проблемы:

  1. Неккоректный ввод и вывод(При вводе все сместилось вверх, при выводе русского языка выводит символы)
  2. Вывод единицы при попытке умножения элементов массива структуры.
  3. Не выводит информацию, после того как была введена переменная типа char

Вот код:

#define _CRT_SECURE_NO_WARNINGS
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

struct Products
{
    char product_type[20];
    int quantity;
    int price;
    char date[20];
};



int func_scan(char query[40])
{
    int number;
    int flag = 1;
    while (flag)
{
    printf("%s ", query);
    if (scanf("%d ", &number) == 0 || number < 0)
    {
        while (getchar() != '\n');
        puts("Ошибка — повторите ввод");

    }
    else
        flag = 0;
}
return number;
}
void showinformaboutproducts(struct Products prod[50], int max_place)
{
    for (int i = 0; i < max_place; i++)
    {
        printf("Вид товара %10s | Количество: %4d | Цена за единицу: %4d | Дата: %10s \n", 
        prod[i].product_type, prod[i].quantity, prod[i].price, prod[i].date);
    }
}
int main()
{
setlocale(LC_ALL, "rus");
int max_place;
struct Products information[50];
struct Products swap;

max_place = func_scan("Сколько помещений вы хотите зарегистрировать для товара");
char date_register[20];

for (int i = 0; i < max_place; i++)
{
    printf("\nВведите вид товара(название:(Английский или Транслит):");
    scanf("%s", &information[i].product_type);
    information[i].quantity = func_scan("Введите количество товара: ");
    information[i].price = func_scan("Введите цену за единицу товара: ");
    printf("\nВведите дату регистрации товара(Английский или Транслит: ");
    scanf("%s", &information[i].date);
}
printf("Вы зарегистрировали товары на складе в следующем виде: \n ");
showinformaboutproducts(information, max_place);

char nameproduct[20];

printf("Введите вид товара, чью стоимость хотите подсчитать(Английский или Транслит): ");
scanf("%s ", &nameproduct);
int all_price = 1;
for (int i = 0; i < max_place; i++)
{
    if (information[i].product_type == nameproduct)
    {
        all_price = information[i].quantity * information[i].price;
    }

}
    printf("Общая сумма указанного товара равна %d \n", all_price);

    //Вывести информацию о товарах, которые поступили в указанный день
    int flag = 1;
    while (flag)
    {
        flag = 0;
        for (int i = 0; i < max_place - 1; i++)
        {
            if (information[i].quantity > information[i + 1].quantity)
            {
                swap = information[i];
                information[i] = information[i + 1];
                information[i + 1] = swap;

                flag = 1;

            }
        }
    }
    printf("Укажите день, в который поступили товары, чтобы получить информацию");
    scanf("%s ", &date_register);

    for (int i = 0; i < max_place; i++)
    {
        if (information[i].date == date_register)
        {
            printf("Название: %10s | Количество: %4d | Цена за единицу: %4d | Дата поступления: %10s ", information[i].product_type, information[i].quantity, information[i].price, information[i].date);
        }
    }
    system("pause");
}

Хотелось бы узнать где именно допущены ошибки и как можно их исправить.


Ответы (1 шт):

Автор решения: EOF

Сразу скажу, что код детально не изучал и не запускал, но вот что было замечено бегло пробежавшись по нему:

  1. По поводу русского языка в консоли загляните сюда.
  2. При успешном вводе функция func_scan оставляет символ новой строки в буфере. Это может быть проблемой. Также она принимает char*, а Вы передаете ей const char*.
  3. По поводу умножения есть несколько вопросов: 1) Почему all_price имеет начальное значение 1? По идее должно быть 0. 2) В этой переменной вроде как должно аккумулироваться сумма. Может Вы хотели это: all_price += information[i].quantity * information[i].price;?
  4. Ещё одна ошибка в том, что Вы сравниваете строки используя операцию ==. Для сравнения строк используйте функцию strcmp. Просто передавайте ей обе строки, которые хотите сравнить. Она возвращает 0, если строки одинаковые.
→ Ссылка