Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по инфе, лучше пересмотреть их!!!!.docx
Скачиваний:
4
Добавлен:
15.04.2019
Размер:
127.67 Кб
Скачать

2.Объявление пользовательского (typedef) типа структуры. Объявление переменных и массивов данного типа. Привести примеры.

typedef-объявление На стадии компиляции производится полная идентификация типов всех входящих в программу выражений. Даже отсутствие имени типа в объявлении как, например,  unsigned long MMM; // Вместо имени типа - комбинация модификаторов unsigned long.  восстанавливается транслятором в соответствии с принятыми в C++ правилами умолчания.  Помимо явного объявления типа в C++ предусмотрены дополнительные средства описания имён типов. Таким средством является typedef-объявление. С его помощью в программу можно ввести новые имена, которые затем используются для обозначения производных и основных типов.  typedef-объявление - это инструмент объявления. Средство ввода новых имён в программу, средство замены громоздких последовательностей имён в объявлениях (но не определениях!) новыми именами.  Синтаксис typedef-объявления как подмножества объявления представляется внушительным списком форм Бэкуса-Наура. Но при известной степени концентрации это нагромождение БНФ всё же можно разобрать:  Объявление ::= [СписокСпецификаторовОбъявления][СписокОписателей]; СписокСпецификаторовОбъявления ::= СпецификаторОбъявления [СписокСпецификаторовОбъявления] СпецификаторОбъявления ::= typedef ::= ***** СписокОписателей ::= [СписокОписателей,] ОписательИнициализатор ОписательИнициализатор ::= Описатель [Инициализатор] Описатель ::= dИмя ::= ***** dИмя ::= Имя ::= ОписанноеИмяТипа ::= ***** ОписанноеИмяТипа ::= Идентификатор СписокСпецификаторовТипа ::= СпецификаторТипа [СписокСпецификаторовТипа] СпецификаторТипа ::= ИмяПростогоТипа ::= СпецификаторКласса ::= *****  Таким образом, typedef-объявление является объявлением, которое начинается спецификатором typedef и состоит из последовательностей разнообразных спецификаторов объявления и описателей. Список описателей (элементы списка разделяются запятыми) может содержать языковые конструкции разнообразной конфигурации. В него могут входить описатели (в конце концов, это всего лишь разнообразные имена) с символами ptrОпераций (* и &), описатели, заключённые в круглые скобки, описатели в сопровождении заключённых в скобки списков объявлений параметров, описателей const и volatile, а также заключённых в квадратные скобки константных выражений (последние, надо полагать, предназначены для спецификации массивов).  В качестве примера рассмотрим, следующее typedef-объявление:  typedef int Step, *pInteger;  Это объявление начинается спецификатором typedef, содержит спецификатор объявления int и список описателей, в который входит два элемента: имя Step и имя pInteger, перед которым стоит символ ptrОперации *.  Объявление эквивалентно паре typedef-объявлений следующего вида:  typedef int Step; typedef int *pInteger;  В соответствии с typedef-объявлениями, транслятор производит серию подстановок, суть которых становится понятной из анализа примера, в котором пара операторов объявления  Step StepVal; extern pInteger pVal;  заменяется следующими объявлениями:  int StepVal; extern int * pVal;  На основе этого примера можно попытаться воспроизвести алгоритм подстановки:  после возможного этапа декомпозиции списка описателей typedef-объявления, в результате которого может появиться новая серия typedef-объявлений, транслятор переходит к анализу операторов объявлений;  в очередном операторе объявления выделяется идентификатор, стоящий на месте спецификатора объявления;  среди typedef-объявлений производится поиск соответствующего объявления, содержащего вхождение этого идентификатора в список описателей. Таким образом, транслятор находит соответствующий контекст для подстановки. Мы будем называть этот контекст контекстом замены. Контекст замены оказывается в поле зрения транслятора вместе с оператором объявления, в котором транслятор различает спецификатор объявления и описатель;  оператор объявления заменяется контекстом замены, в котором совпадающий со спецификатором объявления идентификатор заменяется соответствующим описателем.  //Функция Ввода void Input() { cout << endl; cout << "Imya - "; cin >> Imya; cout << "Kolichestvo - "; cin >> Kol; cout << "Cena - "; cin >> Cena; cout << "Strana - "; cin >>Strana; cout << endl; } //Функция Вывода void Output() { cout << endl; cout << "Imya - : '" << Imya << "'"<< endl; cout << "Kolichestvo - : " << Kol << " shtuk" << endl; cout << "Cena - : $" << Cena << endl; cout << "Strana - : " << Strana << endl;  cout << endl

#include "stdafx.h" #include "conio.h" #include "iostream" #include "string" using namespace std; //Создание структуры struct Tovar { string Imya; int Kol;

float Cena; string Strana; //Начальное значение структуры Tovar () { Imya = "NoName"; Kol = 0; Cena = 0; Strana = "None"; } //Функция Ввода void Input() { cout << endl; cout << "Imya - "; cin >> Imya; cout << "Kolichestvo - "; cin >> Kol; cout << "Cena - "; cin >> Cena; cout << "Strana - "; cin >>Strana; cout << endl; } //Функция Вывода void Output() { cout << endl; cout << "Imya - : '" << Imya << "'"<< endl; cout << "Kolichestvo - : " << Kol << " shtuk" << endl; cout << "Cena - : $" << Cena << endl; cout << "Strana - : " << Strana << endl;  cout << endl; } }; // Функция определения соответствия заданной и вводимой цены void RaschodTovar (Tovar *mas, int size, float cen) { bool eden = false; for (int i = 0; i cen) { mas[i].Output(); eden = true;} } if (eden == false) cout << "Net tovarov s cenoy vishe ukazannoy" << endl << endl; } //Главная функция int main() { cout << "Vvedite probniy tovar - odin:" << endl; Tovar PervTov; //Обращение к функциям ввода и вывода PervTov.Input(); PervTov.Output(); int p; cout << "Vvedite kolichestvo elementov tipa 'Tovar' - "; cin >> p; Tovar *MnTovar = new Tovar[p]; //Создание динамического массива for (int i=0;i<p;i++) { MnTovar [i].Input(); } for (int i=0;i<p;i++) { MnTovar [i].Output(); } float cen; cout << "Vvedite cenu. Vse tovari, s cenoi vishe ukazannoy? budut vivedeni na ekran - "; cin >> cen; RaschodTovar (MnTovar, p, cen); //Обращение функции отвеч за цену return 0; }