0

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

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

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

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

  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 &lt; max_place - 1; i++)
    {
        if (information[i].quantity &gt; information[i + 1].quantity)
        {
            swap = information[i];
            information[i] = information[i + 1];
            information[i + 1] = swap;

            flag = 1;

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

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

}

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

  • По крайней мере тут if (information[i].product_type == nameproduct) вы сравниваете указатели а не содержимое строк. Используйте strcmp() – avp Feb 13 '21 at 11:41

1 Answers1

1

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

  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, если строки одинаковые.
  • Спасибо за ответ. – Илья Емельяненко Feb 13 '21 at 12:07
  • В ходе исправления я смог исправить подсчет общей суммы через функцию, но при вводе даты, в консоль выводится завершение программы, а должна таблица. Как это можно исправить? – Илья Емельяненко Feb 13 '21 at 12:21
  • @ИльяЕмельяненко В последнем цикле? Вы там тоже исправили сравнение строк? –  Feb 13 '21 at 12:31
  • Да, или нужно было как-то по другому. По условию там нужно дни сравнивать. Возможно стоило оставить. – Илья Емельяненко Feb 13 '21 at 12:32