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 – Привоз продуктов


 

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

73803. Немецкая классическая философия XIX века 67.5 KB
  Общая характеристика Становление немецкой классической философии проходило на фоне радикальных социально-экономических преобразований в некоторых европейских странах высшей точкой которых стала Французская буржуазная революция 1789-1794 гг. Критическая философия Иммануила Канта Иммануил Кант 1724-1804 основатель немецкой классической философии...
73804. Примеры программ с циклическим алгоритмом 458.5 KB
  Вычисление суммы конечного числа слагаемых алгоритм накопления суммы Рассмотрим сумму конечного числа слагаемых: 1 Здесь n слагаемое или общий член суммы с номером n. В математике принята следующая сокращенная запись такой суммы: Здесь n слагаемое или общий член суммы с номером индексом суммирования n. Вычислять данную сумму будем последовательно добавляя очередное слагаемое к ранее вычисленному значению суммы. Алгоритм накопления суммы:...
73805. Основные направления западной философии конца XIX-XX веков 123 KB
  Основные направления западной философии конца XIX-XX веков. Основными тенденциями в развитии современной философии выступают сциентизм и антропологизм. Первая проявляется в позитивизме философии науки структурализме и других. Необходимо также отметить что тенденции к ограничению теоретического разума отчетливо проявлялись в недрах самой классической философии.
73806. Русская философия 104.5 KB
  Исследователи неоднократно отмечали что самое оригинальное и значительное было создано русскими мыслителями в области философии истории историософия и социальной философии. Высокая духовность обоснование нравственности как необходимого условия человеческого бытия важнейшая черта русской философии неизменный вектор многовековой социокультурной традиции. Кажется что грани этой вечной проблемы во многом определяют напряженное поле отечественной культуры и философии стремящихся определить свое собственное место в лоне мировой цивилизации....
73807. Учение о бытии (онтология) 84.5 KB
  Исторические корни возникновения понятия бытия. В европейской культуре первые определения бытия возникли еще в Древней Греции что исторически совпало со становлением философского знания переходом от образномифологического к теоретикологическому мышлению. Понятие бытия отвлекается от бесконечного многообразия свойств и качеств конкретных предметов кроме одного быть существующими. Исторические корни возникновения понятия бытия Бытие производное от слов быть есть весьма распространенных во многих языках мира имеет свое...
73808. Учение о развитии. Диалектика 113 KB
  Диалектика – теория и метод познания действительности, учение о всеобщей связи и развитии. Представления об изменчивости и взаимосвязанности всего сущего возникли в глубокой древности.
73809. Сознание. Современные представления о сознательной деятельности 95 KB
  Историческое развитие понятия сознания. Проблема сознания во все века привлекала внимание философов ибо она рассматривает одну из наиболее значимых и специфических сторон человеческой жизнедеятельности. В истории философии существуют различные иногда диаметрально противоположные точки зрения объясняющие сущность сознания его происхождение и роль в обществе. В современной отечественной философии возобладающим является понимание сознания как идеальной формы деятельности направленной на отражение и преобразование действительности.
73810. Познание. Познавательные способности человека 95.5 KB
  Теория истины. Центральной проблемой гносеологии является проблема истины под которой понимается соответствие знаний действительности. В качестве основного критерия истины признак по которому определяется достоверность знания выступает деятельность человека понятая как общественно-историческая практика. Интуиция это способность постижения истины без развернутого логического обоснования в ее непосредственности как единство чувственного и рационального.