43395

Разработка информационно-поискового справочника «Шеф-повар»

Курсовая

Информатика, кибернетика и программирование

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

Русский

2013-11-04

1.14 MB

19 чел.

Р Е Ф Е Р А Т

 

 

Курсовая работа : 31 с., 20 рис., 5 источников, 3 прил.

 

ПРОГРАММИРОВАНИЕ, С++ Builder 6.0, БАЗА ДАННЫХ, ФАЙЛ, СТРУКТУРА,  МАССИВ

 

Объектом и предметом исследования является среда программирования С++ Builder 6.0. 

Цель работы -  разработка информационно-поискового справочника «Шеф-повар».

При выполнении работы использованы методы работы со структурами и массивами. 

В  процессе  работы  проведены  следующие  исследования  и разработки  использование средств среды программирования С++ Builder 6.0 для обработки массивов структур и массивов.

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


Содержание

[1]
Содержание

[2]
Введение

[3]
Обзор литературы

[3.1] Структуры

[3.2] Декларация структурного типа данных

[3.3] Создание структурных переменных

[3.4] Обращение к полям структур

[3.5] Массивы структур

[3.6] Размещение структурных переменных в памяти

[4]
Описание программы

[5]
Описание применения программы.

[6]
Тестирование программы

[7]
Заключение

[8]
Список литературы

[9]
Приложение 1. Блок-схема программы

[10]
Приложение 2. Листинг программы

[11]
Приложение 3. Результаты выполнения программы


Введение

Данная работа посвящена разработке программы «Шеф повар», позволяющей вводить, выводить и обрабатывать информацию о продуктах, рецептах и заказах.

Программа выполнена на языке С в среде программирования Borland C++ Builder 6 в виде консольного приложения.

Программа может работать на любых x86-совместимых ЭВМ. Для работы с программой необходимо наличие клавиатуры.

В программе предусмотрено главное меню, позволяющее пользователю выбирать порядок действий.

Данный программный продукт может быть использован как средство для удобного ввода и просмотра информации о работе ресторана.


Обзор литературы

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

Структуры

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

Термин «структура» в языке Си соответствует двум разным по смыслу понятиям:

– структура – это обозначение участка оперативной памяти, где располагаются конкретные значения данных; в дальнейшем – это структурная переменная, поля которой располагаются в смежных областях ОП;

– структура – это правила формирования структурной переменной, которыми руководствуется компилятор при выделении ей места в ОП и организации доступа к ее полям.

Определение объектов типа структуры производится за два шага:

– декларация структурного типа данных, не приводящая к выделению участка памяти;

– определение структурных переменных объявленного структурного типа с выделением для них памяти.

Декларация структурного типа данных

Структурный тип данных задается в виде шаблона, общий формат описания  которого следующий:

struct  ID структурного типа {

описание полей

};

Атрибут «ID структурного типа» является необязательным и может отсутствовать. Описание полей производится обычным способом: указываются типы переменных и их идентификаторы.

Пример определения структурного типа 

Необходимо создать шаблон, описывающий информацию о студенте: номер группы, Ф.И.О. и средний балл. Один из возможных вариантов:

struct Stud_type  {

char Number[10];       

char Fio[40];      

double S_b;       

};

Поля одного типа при описании можно объединять в одну группу:

struct Stud_type  {

char Number[10], Fio[40];      

double S_b;       

};

Размещение данного объекта типа Stud_type в ОП схематически будет выглядеть следующим образом:

Number

Fio

S_b

10 байт

40 байт

8 байт

Структурный тип данных удобно применять для групповой обработки логически связанных объектов. Параметрами таких операций являются адрес и размер структуры.

Примеры групповых операций:

– захват и освобождение памяти для объекта;

– запись и чтение данных, хранящихся на внешних носителях как физические и/или логические записи с известной структурой (при работе с файлами).

Так как одним из параметров групповой обработки структурных объектов является размер, не рекомендуется декларировать поле структуры указателем на объект переменной размерности, т.к. в данном случае многие операции со структурными данными будут некорректны, например,

struct Stud_type  {

char *Number, *fio;      

double S_b;       

};

В данном случае, вводя строки Number и fio различной длины, размеры объектов будут также различны.

Создание структурных переменных

Как уже отмечалось, само описание структуры не приводит к выделению под нее места в ОП. Для работы со структурами необходимо создать нужное количество переменных приведенного структурного типа, сделать это можно двумя способами.

Способ 1. В любом месте программы для декларации структурных переменных, массивов, функций и т.д. используется объявленный в шаблоне структурный тип, например:

struct Stud_type  student;       – структурная переменная;

Stud_type  Stud[100];   – массив структур

Stud_type  *p_stud;     – указатель на структуру

Stud_type*  Fun(Stud_type);    – прототип функции с параметром структурного типа, возвращающей указатель на объект структурного типа.

Способ 2. В шаблоне структуры между закрывающейся фигурной скобкой и символом «;» указывают через запятые идентификаторы структурных данных.

Для нашего примера можно записать:

struct Stud_type  {

char Number[10], Fio[40];      

double S_b;       

} student, Stud[100], *p_stud;

Если дальше в программе не понадобится вводить новые данные объявленного структурного типа, идентификатор Stud_type можно не указывать.

При декларации структурных переменных возможна их одновременная инициализация, например:

struct Stud_type  {

char Number[10], Fio[40];      

double S_b;       

} student = {"123456", "Иванов И.И.", 6.53 };

или:

Stud_Type  stud1 = {"123456", "Иванов И.И." };

Если список инициализаций будет короче, то оставшиеся поля структурной переменной заполняются нулями.

Обращение к полям структур 

Обращение к полям структур производится путем создания составных имен, которые образуются двумя способами:

1) при помощи операции принадлежности (.) общий вид которой

ID_структуры . ID_поля

или

     (*указатель_структуры) . ID_поля

2) при помощи операции косвенной адресации (–>) в виде

указатель_структуры –> ID_поля

или

      (&ID_структуры) –> ID_поля

Если в программе созданы объекты объявленного ранее шаблона:

  Stud_Type  s1, *s2;

то к полям объекта s1 можно обратиться следующим образом:

s1. Number,   s1. Fio,   s1. S_b;

или     

(&s1) –> Number,  (&s1) –> Fio,  (&s1) –> S_b;

а к полям объекта, адрес которого s2:

s2 –> Number,   s2 –> Fio,   s2 –> S_b;

или   

(*s2) . Number,   (*s2) . Fio,   (*s2) . S_b;

Массивы структур

Структурный тип «struct ID_структуры», как правило, используют для декларации массивов, элементами которых являются структурные переменные. Это позволяет создавать программы, оперирующие с простейшими базами данных.

Например, массив структур, объявленного ранее типа:

struct Person spisok[100];  

причем ключевое слово struct можно не писать. Декларацию массива можно выполнить и в описании шаблона следующим образом:

struct Рerson {

       char fio[40];

       int day, month, year;

     }  spisok[100];

В данном случае обращение к полю, например, day элемента массива с индексом i может быть выполнено одним из следующих способов:

spisok[i].day=22;  *(spisok+i).day=22; (spisok+i)–>day=22;

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

struct Spisok {

      char Fio[20];

      double S_Bal;

};

//  Описание прототипов функций пользователя

void Out(int, Spisok);

void In(int, Spisok *);

void main(void)  

{

Spisok Stud[50], *sved;

. . .

for(i=0;i<N;i++)

Vvod(i, &Stud[i]);

puts("\n Spisok Students");

for(i=0;i<N;i++)

Out(i+1, Stud[i]);

. . .

}

// Функция вывода на экран данных одного элемента структуры

void Out(int nom, Spisok dan)   {

printf("\n %3d – %20s  %4.2lf ",nom, dan.Fio, dan.S_Bal);   

}

// Функция ввода данных одного элемента структуры

void In (int nom, Spisok *sved)  {       

printf("\n Введите сведения %d : ", nom+1);

 fflush(stdin);

puts("\n ФИО      – ");      

gets(sved–>Fio);

puts("\n Средний балл   – ");      

scanf(“%lf”, &sved–>S_Bal);

}

Размещение структурных переменных в памяти

При анализе размеров структурных переменных иногда число байт, выделенных компилятором под структурную переменную, оказывается больше, чем сумма байт ее полей. Это связано с тем, что компилятор выделяет участок ОП для структурных переменных с учетом выравнивания границ, добавляя между полями пустые байты по следующим правилам:

– структурные переменные, являющиеся элементами массива, начинаются на границе слова, т.е. с четного адреса;

– любое поле структурной переменной начинается на границе слова, т.е. с четного адреса и имеет четное смещение по отношению к началу переменной;

– при необходимости в конец переменной добавляется пустой байт, чтобы общее число байт было четное.


Описание программы

 

 Можно выделить следующие процедуры будущей программы:

  •  добавление данных о продуктах;
  •  добавление данных о рецептах;
  •  просмотр всех рецептов;
  •  формирование заказа;
  •  привоз продуктов;

Рисунок 1. Схема взаимодействия функциональных частей

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


Главное меню будет содержать следующие пункты:

  •  добавление данных о продуктах;
  •  добавление данных о рецептах;
  •  просмотр всех рецептов;
  •  формирование заказа;
  •  привоз продуктов;
  •  выход.

Описание разработанных функций

Название

Назначение

AddProd

добавление данных о продуктах

AddRec

добавление данных о рецептах

PrintRec

просмотр всех рецептов

Menu

формирование заказа

EditProd

привоз продуктов


Описание применения программы.

Разработанная программа «Шеф-повар»   позволяет организовать:

  •  Формировать базу рецептур блюд: раскладка, рецепт приготовления;
  •  Формировать базу продуктов на складе: наименование, цена, количество;
  •  Формирование меню;
  •  Проверку достаточности товаров;
  •  Корректировку запасов.


Тестирование программы

Общий вид программы приведён на рисунке 1:

Рисунок 1 – Главное меню программы

1. Добавить продукт. Предоставляется возможность добавить в базу данных информацию о продукте, как показано на рис.2:

Рисунок 2 – Добавление продукта

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

Рисунок 3 – Добавление рецепта


4. Просмотр рецептов
. Список рецептов выводится на экран:

Рисунок 4 – Просмотр рецептов

5. Сформировать заказ. Происходит формирование заказа, подсчет общей стоимость заказа и проверка наличия продуктов на складе:

Рисунок 5 – Формирование заказа

При отсутствии необходимого количества ингредиентов на складе выводится соответствующее сообщение:

Рисунок 6 – Попытка формирования заказа

6. Привоз продуктов. Выводится список имеющихся продуктов на складе и предоставляется возможность изменить количество любого из продуктов (рис. 7).

 

Рисунок 8 – Привоз продуктов


Заключение

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


Список литературы

  1.  Шилдт, Герберт. С++ Базовый курс, 3-е издание. : Пер. с англ. – Алексей Жданов: СПб.: БХВ-Петербург, 2002. – 683 с. : ил.
  2.  Б. Страуструп. Язык программирования С++, 3-е изд пер. с англ. - М.: "Бином", СПб.: "Невский диалект", 1999. - 991 с., ил.
  3.  Т.А. Павловская. С/C++. Программирование на языке высокого уровня. – СПб.: Питер,2007. – 461 с.: ил.
  4.  Красиков И.В., Красикова И.Е. C++. Просто как дважды два - 2 изд. – ЭКСМО,  2007. -  336 с.: ил.
  5.  Т.А. Павловская, Ю.А. Щупак. С/C++. Структурное программирование: Практикум. – СПб.: Питер, 2007. – 239 с.: ил.


Приложение 1. Блок-схема программы

Рисунок 1 – Основное меню программы

Рисунок 2 – Добавление продукта

Рисунок 3 – Добавление рецепта

Рисунок 4 – Просмотр рецептов

Рисунок 5 – Формирование меню


Приложение 2. Листинг программы

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

typedef struct TProd   //структура продуктов

{

  char naim[20];

  int cena;

  double kol;

} Prod;

typedef struct TRec   //структура рецептов

{

  char nazv[20];

  int prods;

  int prod[100];

  double kol[100];

  char rec[100];

  int cena;

} Rec;

Prod prod[100];      //массив продуктов

int nprod=0;        //число продуктов

Rec rec[100];    //массив рецептов

int nrec=0;       //число рецептов

void AddProd()

{

 printf("Naimenovanie: "); scanf("%s",prod[nprod].naim);

 printf("Cena: ");scanf("%d",&prod[nprod].cena);

 printf("Koli4estvo: ");scanf("%lf",&prod[nprod].kol);

 nprod++;

 printf("Produkt dobavlen\n");getch();

}

void AddRec()

{

 int i, c;

 double kol;

 printf("Nazvanie bluda: "); scanf("%s",rec[nrec].nazv);

 rec[nrec].prods=0;

 rec[nrec].cena=0;

 printf("Spisok ingridientov:\n");

 printf("%3s%20s%15s%10s\n","N","Naimenovanie","Na sklade","Cena");

 for (i=0; i<nprod; i++)

    printf("%3d%20s%15.1lf%10d\n",i+1,prod[i].naim,prod[i].kol,prod[i].cena);

 while (1)

 {

   printf("Vibirite produkt (0-vihod): ");

   scanf("%d",&c);

   if ((c<1) || (c>nprod))

      break;

   else

   {

      c--;

      rec[nrec].prod[rec[nrec].prods]=c;

      printf("Trebuemoe koli4estvo: ");

      scanf("%lf",&rec[nrec].kol[rec[nrec].prods]);

      rec[nrec].cena+=rec[nrec].kol[rec[nrec].prods]*prod[c].cena;

      rec[nrec].prods++;

      printf("Produkt dobavlen v recept\n");

   }

 }

 printf("Recept prigonovlenija: ");

 fflush(stdin);

 gets(rec[nrec].rec);

 nrec++;

}

void PrintRec()

{

 int i,j;

 printf("Spisok receptov:\n");

 for(i=0;i<nrec;i++)

 {

   printf("\n%d. %s\n",i+1,rec[i].nazv);

   printf("Sostav:\n");

   for (j=0; j<rec[i].prods; j++)

     printf("%s, %.1lf\n",prod[rec[i].prod[j]].naim,rec[i].kol[j]);

   printf("Recept prigonovlenija: %s\n",rec[i].rec);

 }

 getch();

}

void Menu()

{

 int i,j,c,kol;

 printf("Spisok blud:\n");

 printf("%3s%20s%15s\n","N","Nazvanie","Stoimost`");

 for(i=0;i<nrec;i++)

   printf("%3d%20s%15.1d\n",i+1,rec[i].nazv,rec[i].cena);

 printf("Vibirite bludo: ");

 scanf("%d",&c);

 if ((c<1) || (c>nrec)) return;

 c--;

 printf("Koli4estvo blud: ");

 scanf("%d",&kol);

 for (j=0; j<rec[c].prods; j++)

   if (kol*rec[c].kol[j] > prod[rec[c].prod[j]].kol)

   {

     printf("Ne hvataet ingridientov na sklade\n");

     getch();

     return;

   }

 for (j=0; j<rec[c].prods; j++)

    prod[rec[c].prod[j]].kol-=kol*rec[c].kol[j];

 printf("Zakaz stoimost`ju %d prinjat.",kol*rec[c].cena);

 getch();

}

void EditProd()

{

 int i, c;

 printf("Spisok ingridientov:\n");

 printf("%3s%20s%15s%10s\n","N","Naimenovanie","Na sklade","Cena");

 for (i=0; i<nprod; i++)

    printf("%3d%20s%15.1lf%10d\n",i+1,prod[i].naim,prod[i].kol,prod[i].cena);

 printf("Vibirite produkt: ");

 scanf("%d",&c);

 if ((c<1) || (c>nprod)) return;

 c--;

 printf("Vvedite novoje koli4estvo: ");

 scanf("%lf",&prod[c].kol);

 printf("Koli4estvo izmeneno\n");

 getch();

}

void main ()

{int j;

while (1)

{

 system("cls");

 printf("%20s%s"," ","1.Dobavit` product\n");

 printf("%20s%s"," ","2.Dobavit` recept\n");

 printf("%20s%s"," ","3.Prosmotr receptov\n");

 printf("%20s%s"," ","4.Sformirovat` zakaz\n");

 printf("%20s%s"," ","5.Privoz produktov\n");

 printf("%20s%s"," ","0.Vihod\n");

 printf("Vash vibor: ") ;scanf("%d",&j);

 switch(j)

  {

   case 1:AddProd();break;

   case 2:AddRec();break;

   case 3:PrintRec();break;

   case 4:Menu();break;

   case 5:EditProd();break;

   case 0:printf("Rabota zavershena\n");getch ();return;

   default :printf("Neverniy vibor\n povtorite\n");getch();

  }

}

}


Приложение 3. Результаты выполнения программы

Рисунок 1 – Главное меню программы

Рисунок 2 – Добавление продукта

Рисунок 3 – Добавление рецепта

Рисунок 4 – Просмотр рецептов

Рисунок 5 – Формирование заказа

Рисунок 6 – Попытка формирования заказа

Рисунок 8 – Привоз продуктов


 

А также другие работы, которые могут Вас заинтересовать

53769. Баскетбол, конспект уроку для 8 класу 44 KB
  Ноги трохи зігнуті, лікоть руки опущений вниз, пальці рук супроводжають м’яч. Відстань між студентами 4 м. пальці рук розставлені. Ведення правою – лівою рукою. Відстань 4 м. Кидок виконується після ведення, кидок м’яча в ціль.
53770. Організовуючі вправи. Загальнопідготовчі вправи. Стрибки зі скакалкою 85 KB
  Стійка ноги 810 Руки розводити долонями нарізно руки за голову. разів догори прогинаючись у 1 поворот тулуба ліворуч попереку голову відводити руки в сторони вдих; 2 в. видих; 3 поворот тулуба праворуч руки в сторони вдих; 4 в. нарізно руки в сторони; разів Ноги поставити 1 нахил уперед руки якнайширше.
53771. Конспект уроку з фізичної культури Для учнів 2-А класу - реферат українською 29.5 KB
  Ходьба: руки за голову навприсядки стрибками на носках на п‘ятках4. Загальнорозвиваючі вправи на місціА Вп руки до плечейКолові рухи руками вперед назад 8р вперед8р назадБ Вп руки в сторониКолові рухи руками вперед назад 1012 раз Руки пряміВ Вп права рука вгорі ліва внизу; 12 переміна положень рук 1012 раз Руки пряміГ Вп руки вперед. Схрещення рук 1012 раз Руки пряміД Вп ноги нарізно руки на поясі 1 нахил вліво 2 – в. 1012 раз Руки опущені ноги пряміІІ.
53772. Організуючі, стройові та ЗРВ. Спеціальні бігові та стрибкові вправи. Рухливі ігри 75 KB
  Стройові вправи: Праворуч Ліворуч Кругом Ліворуч Ліворуч Рівняйсь струнко Ходьба: звичайна навшпиньках на п’ятках з високим підніманням стегна руки перед собою у напівприсіді у повному присіді звичайна. руки на пояс. руки до плечей колові оберти зігнутими в ліктях руками вперед назад. руки в сторони сжаті в кулачки на 123 – розвести руки в сторони на 4 – зігнути руки до...
53773. Ярослав Стельмах. «Митькозавр із Юрківки, або химера лісогвого озера». Характеристика образів Сергія і Митька, їхньої поведінки у складних ситуаціях 48.5 KB
  Мета: Удосконалювати навички визначення рис характеру героїв твору вміння висловлювати свої думки про прочитане; розвивати навички переказу виразного і вибіркового читання спостережливість увагу; виховувати допитливість доброту любов до ближніх. Обладнання: схема з рисами характеру героїв портрет Ярослава Стельмаха. Завдання: учні мають удосконалити навички визначати риси характеру героїв твору і оцінювати їхні вчинки; закріпити вміння переказувати твір віднаходити цитати за поданим завданням висловлювати своє враження про...
53774. Малювання композиції Дерева у лісі 656 KB
  Провести бесіду В художникаграфіка; розвивати умінняспостерігати і виявляти особливості будови дерев різних порід; ознайомити звиразними особливостями ліній різної товщини навчити прийомам роботи зпаличкою пензлем пером або восковими крейдами на вибір учителя ітушшю; формувати уміння заповнювати зображенням усю площину аркушапаперу; виховувати любов до рідної природи дбайливе ставлення до матеріалівта інструментів акуратність під час роботи з тушшю;...
53775. Дієслова майбутнього часу 65.5 KB
  Життя прожити не поле перейти Хочеш знати – не соромся питати Гарно того вчити – хто хоче все знати Щоб довго жити треба працю любити Знайдіть дієслова в неозначеній формі. Чи можна визначити за цими дієсловами коли відбулася дія і хто її виконує Чому Не можна бо неозначена форма дієслова не вказує ні на час ні на особу 2. Запитання вчителя : Що називається дієсловом Частина мови що означає дію предмета і відповідає на питання що робити Що робив Що зробив Що робить Що зробить Що буде робити Яким...