Нужно решить контрольную студенту (Программирование на С)

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Собственно задание
Контрольное задание: Покупки в супермаркете
Задача
Сканер в кассе супермаркета выдает последовательность штрих-кодов для товаров в корзине поку¬пок, например
1234, 4719, 3814, 1112, 1111, 1111, 1234
которая должна быть преобразована в чек
С supermarket
Dry Sherry, lit (x2) $108.20
Fish Fingers (xl) $12.11
Orange Jelly (xl) $5.61
Giant Hula Hoops (xl) $13.31
Hula Hoops (x2) $4.22
TOTAL $143.27
Решение
Построение решения начнем с анализа данных. Для представления номенклатурной единицы супер¬маркета создадим структуру, хранящую данные о штрих-коде товара, его наименовании и цене. Цену будем хранить в центах.
/**
* Информация о товаре магазина
V
struct Item {
/// штрих-код товара
int m_barCode;
/// наименование товара, не более 85 символов
char m name[86];
/// цена 1 единицы товара в центах
int m_price; };
База данных товаров в простейшем случае - массив, которых хранит структуры товара и количество номенклатурных позиций супермаркета. Опишем БД товаров в виде следующей структуры.
' База данных товаров */ struct ItemDatabase {
/// количество товаров в БД int m_count; /// массив товаров struct Item *m_items; } ;
Для поиска товара по его штрих коду в БД создадим функцию Findltem (), которая будет принимать два аргумента: указатель на БД товаров и штрих-код товара, информацию по которому необходимо извлечь их БД
/**
* Поиск товара в БД по штрих-коду
"/
struct Item *
Findltem (const struct ItemDatabase *database, int barcode)
{
int i;





assert (database != NULL); assert (database->m_count > 0);
for (i = 0; i < database->m__count; ++i)
if (database->m_items.m_barCode == barCode) return database->m_items + i; return database->m items;
Функция линейным поиском проходит по БД товаров, и если ей удается найти товар с соответст¬вующим штрих-кодом, возвращает указатель на структуру с информацией о нем. Если товара с та¬ким штрих-кодом нет, функция возвращает указатель на первый товар в БД.
Для представления товара в чеке введем дополнительную структуру, которая будет хранить пару то¬вар - количество товара в чеке.
/**
* Строка счета V struct Billltem {
/// товар
const struct Item *m_item; /// количество в счете int m_quantity; };
Чек - это массив структур Billltem.
/**
* Счет */ struct Bill
/// количество товаров в счете int m_count;
/// массив товаров в счете struct Billltem *m items;
Создадим две вспомогательные функции, которые будут выполнять управление памятью для струк¬туры чека. Функция АПосВШ () выделяет память под структуру чека и резервирует память под мас¬сив товаров. Функция FreeBill () освобождает всю память, связанную с чеком.
/**
* Выделяет память под счет
*/
struct Bill *
AUocBill (int itemsCount)
{
struct Bill *result;
result = malloc (sizeof (struct Bill)); if ( !result)
return NOLL; // выделение памяти было неуспешным result->m_count = 0;
result->m_items = malloc (itemsCount * sizeof (struct Billltem)); if (!result->m_items && itemsCount > 0) {
free (result);
return NULL; )
return result; )
/**
* Освобождает память, связанную со структурой счете
*/
void
FreeBill (struct Bill *bill)
(
assert (bill != NULL);
if (bill->m items)










free (bill->m_items); free (bill);
}
Для печати чека на кране создадим функцию PrintBill (). На входе она принимает указатель на печа¬таемый чек, и выводит его на экран с соответствующим форматированием.
/**
* Печатает счет на экран
*/
void
PrintBill (const struct Bill *bill)
{
int i;
int totalBill = 0;
assert (bill != NULL);
// печатаем заголовок
printf ("С supermarket\n\n");
// печатаем список товаров
for (i = 0; i < bill->m_count; ++i) {
int totalLine = bi11->m_iterns.m_item->m_price * bill->m_items.m_quantity;
totalBill += totalLine; printf ("%s (x%d) $%d.%d\n",
bill->m_items.m_item->m_name, bill->m_items.m_quantity, totalLine / 100, totalLine % 100 ); )
// печатаем строку итого
printf ("\nTOTAL $%d.%d\n", totalBill / 100, totalBill % 100); }
Центральной функцией является функция ProduceBill (), которая по массиву штрих-кодов создает структуру счета. Функция сначала выделяет память под результат при помощи AllocBill (), затем проходит по списку переданных штрих кодов, ищет информацию о соответствующем товаре в БД, и включает ее в счет. При этом, если в счете уже имеется такой товар, то функция просто увеличивает его количество. Если такого товара еще нет, функция включает в счет новую строку.
/**
* Создает счет по списку товаров
*/
struct Bill *
ProduceBill (const struct ItemDatabase *database, const int *barCodes, int count)
{
int i;
struct Bill *result;
assert (database != NULL); assert (barcodes != NULL);
result = AllocBill (count); if (!result)
return NULL;
// формируем счет
for (i = 0; i < count; ++i) {
// выполняем поиск элемента в счете, может он был добавлен ранее int index = IndexOfBillltem (result, barcodes); if (index == -1) {
// не нашли, добаляем новый элемент
result->m_items[result->m_count].m_item = Findltem (database, barCodes);
result->m_items[result->m_count].m_quantity = 1;
++result->m_count;
} else {
// нашли, тогда увеличиваем количество ++result->m_items[index].m_quantity; } }
return result; }











Для проверки, есть ли уже товар с некоторым штрих-кодом в счете функция ProduceBill () использу¬ет вспомогательную функцию IndexOfBillltem (). Функция возвращает индекс товара в счете, либо -1 если такого товара в счете нет.
* Поиск товара в счете
*/ int
IndexOfBillltem (const struct Bill *bill, int barCode) {
int i;
assert (bill != NULL);
for (i = 0; i < bill->m_count; ++i)
if (bill->m_items.m_item->m_barCode == barCode) return i; return -1;
Базу данных товаров определим в виде константы.
/**
* База данных товаров в супермаркете */ static struct Item g_databaseltems [ ] = {
{ 0, "Unknown item", 0 },
{ 4719, "Fish Fingers", 1211 },
{ 5643, "Nappies", 1010 },
{ 3814, "Orange Jelly", 561 },
{ 1111, "Hula Hoops", 211 },
{ 1112, "Giant Hula Hoops", 1331 },
{ 1234, "Dry Sherry, lit", 5401 } };
const struct ItemDatabase g_database = {
sizeof (g_databaseltems) / sizeof (g_databaseltems[0]),
g_databaseIterns
};
Функция main () выполняет создание и печать счета.
int
main (int argc, char* argv[])
{
int codes[] = { 1234, 4719, 3814, 1112, 1111, 1111, 1234 };
struct Bill *bill = ProduceBill (&g_database, codes, sizeof (codes) / sizeof (codes[0]));
if (!bill) {
printf ("Error: out of memory while creating a bill"); return -1;
}
PrintBill (bill);
FreeBill (bill);
return 0;
Задания
1. Форматирование счета. Измените функцию PrintBill () чтобы она печатала счет в соответствии с форматированием, приведенным в условии. Ширина строки счета - 40 символов.
2. Отбрасывание неизвестных товаров. Измените функцию ProduceBill () таким образом, чтобы товары, не найденные в БД не включались в счет.
3. Вычисление скидки. За каждые две купленные бутылки шерри (код 1234) супермаркет дает скидку $5.00 с суммы счета. Добавьте вычисление скидки по счету. Результирующий счет должен выглядеть следующим образом
С supermarket

Dry Sherry, lit (x2) $108.20







Fish Fingers (xl) $12.11
Orange Jelly (xl) $5.61
Giant Hula Hoops (xl) $13.31
Hula Hoops (x2) $4.22
Discount $5.00
TOTAL $138.27
4. Оптимизация поиска товара в БД. Функция Findltem () имеет сложность 0(N). Измените структуру БД или тело функции Findltem () таким образом, чтобы уменьшить алгоритмиче¬скую сложность поиска.
5. Загрузка БД из файла. Разработайте функции, выполняющие загрузку списка товаров супер¬маркета из CSV-файла. CSV файлом (или файлом значений, разделенных запятыми - comma-separated values) называется текстовый файл, в котором содержаться записи, состоящие из не¬скольких полей. При этом каждая новая строка соответствует одной записи. Поля одной запи¬си разделяются запятыми. Если значение поля не содержит запятых, то оно записывается не¬посредственно. Если значение содержит запятые, то оно заключается в двойные кавычки ("). При том, если в такой последовательности содержится двойная кавычка, она удваивается. Имеется разновидность формата, когда все строковые значения заключаются в кавычки. Пример БД товаров в CSV файле:
4719,"Fish Fingers",1211 5643,"Nappies",1010 3814,"Orange Jelly",561 1111,"Hula Hoops",211 1112,"Giant Hula Hoops",1331 1234,"Dry Sherry, lit",5401
6. Редактирование БД. Добавьте функции для добавления/удаления товаров в БД. Функция Addltem () должна добавлять описание товара в БД. При этом, если товар с таким штрих-кодом уже существует в БД, он должен замещаться новым. Функция Removeltem () должна удалять товар по его штрих-коду из БД.
7. Анализ продаж. Разработайте функцию TotalSales (), которая принимает на вход массив чеков, и печатает на экране таблицу проданных товаров по всем чекам. В таблице должна присутствовать информация о названии товара, проданном количестве, сумме (возможно с учетом скидки по соответствующим позициям). Разработайте функцию AnalyzeSales (), которая принимает на вход массив чеков, и печатает на экране таблицу пар товаров, которые чаще всего покупают вместе. Пара товаров должна включаться в таблицу пар, если она присутствует более чем в одном чеке.







-----------------------------------------------------
Вопрос - за сколько денег и времени?
 
R

roobex

#3
Какой срок и сколько будет стоить? icq:379-038-293
 
Статус
Закрыто для дальнейших ответов.