43395

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

Курсовая

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

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

Русский

2013-11-04

1.14 MB

22 чел.

Р Е Ф Е Р А Т

 

 

Курсовая работа : 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 – Привоз продуктов


 

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

12978. Математичний аналіз. Відповіді до екзамену 4.31 MB
  Математичний аналіз Числова послідовність та її границя. Означення. Послідовність це будьяка функція fn визначена на множині N натуральних чисел. Означення. Послідовність називають обмеженою якщо існують такі числа т і М що для всіх п викону
12979. Математичне моделювання та диференціальні рівняння 300.5 KB
  Лекція 1 Математичне моделювання та диференціальні рівняння. 1.1. Поняття математичного моделювання. Поняття математичного моделювання трактується різними авторами по своєму. Ми будемо його повязувати з нашою спеціалізацією прикладна математика. Під ма
12980. Теорія систем та математичне моделювання лабораторні роботи 252.63 KB
  Теорія систем та математичне моделювання лабораторні роботи. Лабораторна робота №1. ТЕМА: Моделі що описуються диференціальними рівняннями. Диференціальні моделі руху механічних систем модель популяцій модель протікання захворюванн...
12981. Математичний аналіз. Відповіді 976 KB
  Математичний аналіз Числова послідовність та її границя. Границя й неперервність функції в розумінні Коші та Гейне. Властивості неперервних функцій на відрізку. Диференційованість функції. Критерії диференційованості. Локальний екстремум. Нео
12982. Системы искусственного интеллекта. Функциональная структура использования СИИ 24.24 KB
  Системы искусственного интеллекта. Основные понятия и определения Область применения Краткий исторический обзор развития работ в области ИИ Функциональная структура использования СИИ...
12983. Модели и методы решения задач 42.78 KB
  Лекции 23: Модели и методы решения задач Классификация представления задач. Логические модели. Сетевые модели Продукционные модели. Сценарии. Интеллектуальный интерфейс Классификация уровней понимания Методы решения задач. Решение задач методом поиска
12985. Представление знаний в интеллектуальных системах 76.5 KB
  Лекция 4: Представление знаний в интеллектуальных системах Предисловие Данные и знания. Основные определения. Особенности знаний. Переход от Базы Данных к Базе Знаний. Модели представления знаний. Неформальные семантические модели. Формальные модели предста...
12986. Представление знаний в интеллектуальных системах. Продукционные системы 27.86 KB
  Лекция 5: Представление знаний в интеллектуальных системах часть 2 Продукционные системы Компоненты продукционных систем Стратегии решений организации поиска Логический подход Представление простых фактов в логических системах Примеры применени