Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
71
Добавлен:
26.05.2014
Размер:
67.77 Кб
Скачать

вШСТО уФТБХУФТБР. чЧЕДЕОЙЕ Ч СЪЩЛ уЙ++, чЩТБЦЕОЙС Й ПРЕТБФПТЩ A.noneline { font-family: Arial, Serif; text-decoration: none; } FONT.arial { font-family: Arial, Serif; } TD.arial { font-family: Arial, Serif; } TH.arial { font-family: Arial, Serif; } PRE { font-family: Monospace; color: navy; } SAMP { font-family: Monospace; color: navy; } TT { font-family: Monospace; color: navy; } VAR { font-family: Monospace; color: navy; }

уЕТЧЕТ РПДДЕТЦЙЧБЕФУС

гЕОФТПН йОЖПТНБГЙПООЩИ фЕИОПМПЗЙК

(095) 932-9212, 932-9213, 939-0783

E-mail: info@citforum.ru уЕТЧЕТ йОЖПТНБГЙПООЩИ фЕИОПМПЗЙК УПДЕТЦЙФ НПТЕ(!) БОБМЙФЙЮЕУЛПК ЙОЖПТНБГЙЙ зМБЧБ 3 чЩТБЦЕОЙС Й ПРЕТБФПТЩ у ДТХЗПК УФПТПОЩ, НЩ ОЕ НПЦЕН ЙЗОПТЙТПЧБФШ ЬЖЖЕЛФЙЧОПУФШ

- дЦПО вЕОФМЙ C++ ЙНЕЕФ ОЕВПМШЫПК, ОП ЗЙВЛЙК ОБВПТ ТБЪМЙЮОЩИ ЧЙДПЧ ПРЕТБФПТПЧ ДМС ЛПОФТПМС РПФПЛБ ХРТБЧМЕОЙС Ч РТПЗТБННЕ Й ВПЗБФЩК ОБВПТ ПРЕТБГЙК ДМС НБОЙРХМСГЙЙ ДБООЩНЙ. у ОБЙВПМЕЕ ПВЭЕРТЙОСФЩНЙ УТЕДУФЧБНЙ ЧБУ РПЪОБЛПНЙФ ПДЙО ЪБЛПОЮЕООЩК РТЙНЕТ. рПУМЕ ОЕЗП РТЙЧПДЙФУС ТЕЪАНЙТХАЭЙК ПВЪПТ ЧЩТБЦЕОЙК Й У ДПЧПМШОП РПДТПВОП ПРЙУЩЧБАФУС СЧОПЕ ПРЙУБОЙЕ ФЙРБ Й ТБВПФБ УП УЧПВПДОПК РБНСФША. рПФПН РТЕДУФБЧМЕОБ ЛТБФЛБС УЧПДЛБ ПРЕТБГЙК, Б Ч ЛПОГЕ ПВУХЦДБАФУС УФЙМШ ЧЩТБЧОЙЧБОЙС*1 Й ЛПННЕОФБТЙЙ. 3.1 оБУФПМШОЩК ЛБМШЛХМСФПТ 3.1.1 рТПЗТБННБ УЙОФБЛУЙЮЕУЛПЗП ТБЪВПТБ 3.1.2 жХОЛГЙС ЧЧПДБ 3.1.3 фБВМЙГБ ЙНЕО 3.1.4 пВТБВПФЛБ ПЫЙВПЛ 3.1.5 дТБКЧЕТ 3.1.6 рБТБНЕФТЩ ЛПНБОДОПК УФТПЛЙ у ПРЕТБФПТБНЙ Й ЧЩТБЦЕОЙСНЙ ЧБУ РПЪОБЛПНЙФ РТЙЧЕДЕООБС ЪДЕУШ РТПЗТБННБ ОБУФПМШОПЗП ЛБМШЛХМСФПТБ, РТЕДПУФБЧМСАЭЕЗП ЮЕФЩТЕ УФБОДБТФОЩЕ БТЙЖНЕФЙЮЕУЛЙЕ ПРЕТБГЙЙ ОБД ЮЙУМБНЙ У РМБЧБАЭЕК ФПЮЛПК. рПМШЪПЧБФЕМШ НПЦЕФ ФБЛЦЕ ПРТЕДЕМСФШ РЕТЕНЕООЩЕ. оБРТЙНЕТ, ЕУМЙ ЧЧПДЙФУС r=2.5 area=pi*r*r

(pi ПРТЕДЕМЕОП ЪБТБОЕЕ), ФП РТПЗТБННБ ЛБМШЛХМСФПТБ ОБРЙЫЕФ: 2.5 19.635

ЗДЕ 2.5 - ТЕЪХМШФБФ РЕТЧПК ЧЧЕДЕООПК УФТПЛЙ, Б 19.635 - ТЕЪХМШФБФ ЧФПТПК.

лБМШЛХМСФПТ УПУФПЙФ ЙЪ ЮЕФЩТЕИ ПУОПЧОЩИ ЮБУФЕК: РТПЗТБННЩ УЙОФБЛУЙЮЕУЛПЗП ТБЪВПТБ (parser'Б), ЖХОЛГЙЙ ЧЧПДБ, ФБВМЙГЩ ЙНЕО Й ХРТБЧМСАЭЕК РТПЗТБННЩ (ДТБКЧЕТБ). жБЛФЙЮЕУЛЙ, ЬФП НЙОЙБФАТОЩК ЛПНРЙМСФПТ, Ч ЛПФПТПН РТПЗТБННБ УЙОФБЛУЙЮЕУЛПЗП ТБЪВПТБ РТПЙЪЧПДЙФ УЙОФБЛУЙЮЕУЛЙК БОБМЙЪ, ЖХОЛГЙС ЧЧПДБ ПУХЭЕУФЧМСЕФ ЧЧПД Й МЕЛУЙЮЕУЛЙК БОБМЙЪ, Ч ФБВМЙГЕ ЙНЕО ИТБОЙФУС ДПМЗПЧТЕНЕООБС ЙОЖПТНБГЙС, Б ДТБКЧЕТ ТБУРПТСЦБЕФУС ЙОЙГЙБМЙЪБГЙЕК, ЧЩЧПДПН Й ПВТБВПФЛПК ПЫЙВПЛ. нПЦОП ВЩМП ВЩ НОПЗПЕ ДПВБЧЙФШ Ч ЬФПФ ЛБМШЛХМСФПТ, ЮФПВЩ УДЕМБФШ ЕЗП ВПМЕЕ РПМЕЪОЩН, ОП Ч УХЭЕУФЧХАЭЕН ЧЙДЕ ЬФБ РТПЗТБННБ Й ФБЛ ДПУФБФПЮОП ДМЙООБ (200 УФТПЛ), Й ВПМШЫБС ЮБУФШ ДПРПМОЙФЕМШОЩИ ЧПЪНПЦОПУФЕК РТПУФП ХЧЕМЙЮЙФ ФЕЛУФ РТПЗТБННЩ ОЕ ДБЧБС ДПРПМОЙФЕМШОПЗП РПОЙНБОЙС РТЙНЕОЕОЙС C++. 3.1.1 рТПЗТБННБ УЙОФБЛУЙЮЕУЛПЗП ТБЪВПТБ чПФ ЗТБННБФЙЛБ СЪЩЛБ, ДПРХУЛБЕНПЗП ЛБМШЛХМСФПТПН: program: END // END - ЬФП ЛПОЕГ ЧЧПДБ expr_list END expr_list: expression PRINT // PRINT - ЬФП ЙМЙ '\n' ЙМЙ ';' expression PRINT expr_list expression: expression + term expression - term term term: term / primary term * primary primary primary: NUMBER // ЮЙУМП У РМБЧБАЭЕК ФПЮЛПК Ч C++ NAME // ЙНС C++ ЪБ ЙУЛМАЮЕОЙЕН '_' NAME = expression - primary ( expression )

дТХЗЙНЙ УМПЧБНЙ, РТПЗТБННБ ЕУФШ РПУМЕДПЧБФЕМШОПУФШ УФТПЛ. лБЦДБС УФТПЛБ УПУФПЙФ ЙЪ ПДОПЗП ЙМЙ ВПМЕЕ ЧЩТБЦЕОЙК, ТБЪДЕМЕООЩИ ЪБРСФПК. пУОПЧОЩНЙ ЬМЕНЕОФБНЙ ЧЩТБЦЕОЙС СЧМСАФУС ЮЙУМБ, ЙНЕОБ Й ПРЕТБГЙЙ *, /, +, - (ХОБТОЩК Й ВЙОБТОЩК) Й =. йНЕОБ ОЕ ПВСЪБФЕМШОП ДПМЦОЩ ПРЙУЩЧБФШУС ДП ЙУРПМШЪПЧБОЙС.

йУРПМШЪХЕНЩК НЕФПД УЙОФБЛУЙЮЕУЛПЗП БОБМЙЪБ ПВЩЮОП ОБЪЩЧБЕФУС ТЕЛХТУЙЧОЩН УРХУЛПН; ЬФП РПРХМСТОЩК Й РТПУФПК ОЙУИПДСЭЙК НЕФПД. ч ФБЛПН СЪЩЛЕ, ЛБЛ C++, Ч ЛПФПТПН ЧЩЪПЧЩ ЖХОЛГЙК ПФОПУЙФЕМШОП ДЕЫЕЧЩ, ЬФПФ НЕФПД Л ФПНХ ЦЕ Й ЬЖЖЕЛФЙЧЕО. дМС ЛБЦДПЗП РТБЧЙМБ ЧЩЧПДБ ЗТБННБФЙЛЙ ЙНЕЕФУС ЖХОЛГЙС, ЧЩЪЩЧБАЭБС ДТХЗЙЕ ЖХОЛГЙЙ. фЕТНЙОБМШОЩЕ УЙНЧПМЩ (ОБРТЙНЕТ, END, NUMBER, + Й -) ТБУРПЪОБАФУС МЕЛУЙЮЕУЛЙН БОБМЙЪБФПТПН get_token(), Б ОЕФЕТНЙОБМШОЩЕ УЙНЧПМЩ ТБУРПЪОБАФУС ЖХОЛГЙСНЙ УЙОФБЛУЙЮЕУЛПЗП БОБМЙЪБ expr(), term() Й prim(). лБЛ ФПМШЛП ПВБ ПРЕТБОДБ (РПД)ЧЩТБЦЕОЙС ЙЪЧЕУФОЩ, ПОП ЧЩЮЙУМСЕФУС; Ч ОБУФПСЭЕН ЛПНРЙМСФПТЕ Ч ЬФПК ФПЮЛЕ РТПЙЪЧПДЙФУС ЗЕОЕТБГЙС ЛПДБ.

рТПЗТБННБ ТБЪВПТБ ДМС РПМХЮЕОЙС ЧЧПДБ ЙУРПМШЪХЕФ ЖХОЛГЙА get_token(). ъОБЮЕОЙЕ РПУМЕДОЕЗП ЧЩЪПЧБ get_token() ОБИПДЙФУС Ч РЕТЕНЕООПК curr_tok; curr_tok ЙНЕЕФ ПДОП ЙЪ ЪОБЮЕОЙК РЕТЕЮЙУМЕОЙС token_value: enum token_value { NAME NUMBER END PLUS='+' MINUS='-' MUL='*' DIV='/' PRINT=';' ASSIGN='=' LP='(' RP=')' }; token_value curr_tok;

ч ЛБЦДПК ЖХОЛГЙЙ ТБЪВПТБ РТЕДРПМБЗБЕФУС, ЮФП ВЩМП ПВТБЭЕОЙЕ Л get_token(), Й Ч curr_tok ОБИПДЙФУС ПЮЕТЕДОПК УЙНЧПМ, РПДМЕЦБЭЙК БОБМЙЪХ. ьФП РПЪЧПМСЕФ РТПЗТБННЕ ТБЪВПТБ ЪБЗМСДЩЧБФШ ОБ ПДЙО МЕЛУЙЮЕУЛЙК УЙНЧПМ (МЕЛУЕНХ) ЧРЕТЕД Й ЪБУФБЧМСЕФ ЖХОЛГЙА ТБЪВПТБ ЧУЕЗДБ ЮЙФБФШ ОБ ПДОХ МЕЛУЕНХ ВПМШЫЕ, ЮЕН ЙУРПМШЪХЕФУС РТБЧЙМПН, ДМС ПВТБВПФЛЙ ЛПФПТПЗП ПОБ ВЩМБ ЧЩЪЧБОБ. лБЦДБС ЖХОЛГЙС ТБЪВПТБ ЧЩЮЙУМСЕФ "УЧПЕ" ЧЩТБЦЕОЙЕ Й ЧПЪЧТБЭБЕФ ЪОБЮЕОЙЕ. жХОЛГЙС expr() ПВТБВБФЩЧБЕФ УМПЦЕОЙЕ Й ЧЩЮЙФБОЙЕ; ПОБ УПУФПЙФ ЙЪ РТПУФПЗП ГЙЛМБ, ЛПФПТЩК ЙЭЕФ ФЕТНЩ ДМС УМПЦЕОЙС ЙМЙ ЧЩЮЙФБОЙС: double expr() // УЛМБДЩЧБЕФ Й ЧЩЮЙФБЕФ { double left = term(); for(;;) // ``ОБЧУЕЗДБ`` switch(curr_tok) { case PLUS: get_token(); // ЕУФ '+' left += term(); break; case MINUS: get_token(); // ЕУФ '-' left -= term(); break; default: return left; } }

жБЛФЙЮЕУЛЙ УБНБ ЖХОЛГЙС ДЕМБЕФ ОЕ ПЮЕОШ НОПЗП. ч НБОЕТЕ, ДПУФБФПЮОП ФЙРЙЮОПК ДМС ЖХОЛГЙК ВПМЕЕ ЧЩУПЛПЗП ХТПЧОС Ч ВПМШЫЙИ РТПЗТБННБИ, ПОБ ЧЩЪЩЧБЕФ ДМС ЧЩРПМОЕОЙС ТБВПФЩ ДТХЗЙЕ ЖХОЛГЙЙ. ъБНЕФШФЕ, ЮФП ЧЩТБЦЕОЙЕ 2-3+4 ЧЩЮЙУМСЕФУС ЛБЛ (2-3)+4, ЛБЛ ХЛБЪБОП ЗТБННБФЙЛПК. уФТБООБС ЪБРЙУШ for(;;) - ЬФП УФБОДБТФОЩК УРПУПВ ЪБДБФШ ВЕУЛПОЕЮОЩК ГЙЛМ; НПЦОП РТПЙЪОПУЙФШ ЬФП ЛБЛ "ОБЧУЕЗДБ" *2. ьФП ЧЩТПЦДЕООБС ЖПТНБ ПРЕТБФПТБ for; БМШФЕТОБФЙЧБ - while(1). чЩРПМОЕОЙЕ ПРЕТБФПТБ switch РПЧФПТСЕФУС ДП ФЕИ РПТ, РПЛБ ОЕ ВХДЕФ ОБКДЕОП ОЙ + ОЙ -, Й ФПЗДБ ЧЩРПМОСЕФУС ПРЕТБФПТ return Ч УМХЮБЕ default.

пРЕТБГЙЙ += Й -= ЙУРПМШЪХАФУС ДМС ПУХЭЕУФЧМЕОЙС УМПЦЕОЙС Й ЧЩЮЙФБОЙС. нПЦОП ВЩМП ВЩ ОЕ ЙЪНЕОСС УНЩУМБ РТПЗТБННЩ ЙУРПМШЪПЧБФШ left=left+term() Й left=left-term(). пДОБЛП left+=term() Й left- =term() ОЕ ФПМШЛП ЛПТПЮЕ, ОП Л ФПНХ ЦЕ СЧОП ЧЩТБЦБАФ РПДТБЪХНЕЧБЕНПЕ ДЕКУФЧЙЕ. дМС ВЙОБТОПК ПРЕТБГЙЙ @ ЧЩТБЦЕОЙЕ x@=y ПЪОБЮБЕФ x=x@y ЪБ ЙУЛМАЮЕОЙЕН ФПЗП, ЮФП x ЧЩЮЙУМСЕФУС ФПМШЛП ПДЙО ТБЪ. ьФП РТЙНЕОЙНП Л ВЙОБТОЩН ПРЕТБГЙСН + - * / % & | ^ >

РПЬФПНХ ЧПЪНПЦОЩ УМЕДХАЭЙЕ ПРЕТБГЙЙ РТЙУЧБЙЧБОЙС: += -= *= /= %= &= |= ^= =

лБЦДБС СЧМСЕФУС ПФДЕМШОПК МЕЛУЕНПК, РПЬФПНХ a+ =1 СЧМСЕФУС УЙОФБЛУЙЮЕУЛПК ПЫЙВЛПК ЙЪ-ЪБ РТПВЕМБ НЕЦДХ + Й =. (% СЧМСЕФУС ПРЕТБГЙЕК ЧЪСФЙС РП НПДХМА; &,| Й ^ СЧМСАФУС РПВЙФПЧЩНЙ ПРЕТБГЙСНЙ й, ймй Й ЙУЛМАЮБАЭЕЕ ймй; > СЧМСАФУС ПРЕТБГЙСНЙ МЕЧПЗП Й РТБЧПЗП УДЧЙЗБ). жХОЛГЙЙ term() Й get_token() ДПМЦОЩ ВЩФШ ПРЙУБОЩ ДП expr().

лБЛ ПТЗБОЙЪПЧБФШ РТПЗТБННХ Ч ЧЙДЕ ОБВПТБ ЖБКМПЧ, ПВУХЦДБЕФУС Ч зМБЧЕ 4. ъБ ПДОЙН ЙУЛМАЮЕОЙЕН ЧУЕ ПРЙУБОЙС Ч ДБООПК РТПЗТБННЕ ОБУФПМШОПЗП ЛБМШЛХМСФПТБ НПЦОП ХРПТСДПЮЙФШ ФБЛ, ЮФПВЩ ЧУЕ ПРЙУЩЧБМПУШ ТПЧОП ПДЙО ТБЪ Й ДП ЙУРПМШЪПЧБОЙС. йУЛМАЮЕОЙЕН СЧМСЕФУС expr(), ЛПФПТБС ПВТБЭБЕФУС Л term(), ЛПФПТБС ПВТБЭБЕФУС Л prim(), ЛПФПТБС Ч УЧПА ПЮЕТЕДШ ПВТБЭБЕФУС Л expr(). ьФПФ ЛТХЗ ОБДП ЛБЛ-ФП ТБЪПТЧБФШ; ПРЙУБОЙЕ double expr(); // ВЕЪ ЬФПЗП ОЕМШЪС

РЕТЕД prim() РТЕЛТБУОП УРТБЧМСЕФУС У ЬФЙН.

жХОЛГЙС term() БОБМПЗЙЮОЩН ПВТБЪПН ПВТБВБФЩЧБЕФ ХНОПЦЕОЙЕ Й УМПЦЕОЙЕ: double term() // ХНОПЦБЕФ Й УЛМБДЩЧБЕФ { double left = prim(); for(;;) switch(curr_tok) { case MUL: get_token(); // ЕУФ '*' left *= prim(); break; case DIV: get_token(); // ЕУФ '/' double d = prim(); if (d == 0) return error("ДЕМЕОЙЕ ОБ 0"); left /= d; break; default: return left; } }

рТПЧЕТЛБ, ЛПФПТБС ДЕМБЕФУС, ЮФПВЩ ХДПУФПЧЕТЙФШУС Ч ФПН, ЮФП ОЕФ ДЕМЕОЙС ОБ ОПМШ, ОЕПВИПДЙНБ, РПУЛПМШЛХ ТЕЪХМШФБФ ДЕМЕОЙС ОБ ОПМШ ОЕ ПРТЕДЕМЕО Й ЛБЛ РТБЧЙМП СЧМСЕФУС ТПЛПЧЩН. жХОЛГЙС error(char*) ВХДЕФ ПРЙУБОБ РПЪЦЕ. рЕТЕНЕООБС d ЧЧПДЙФУС Ч РТПЗТБННЕ ФБН, ЗДЕ ПОБ ОХЦОБ, Й УТБЪХ ЦЕ ЙОЙГЙБМЙЪЙТХЕФУС. чП НОПЗЙИ СЪЩЛБИ ПРЙУБОЙЕ НПЦЕФ ТБУРПМБЗБФШУС ФПМШЛП Ч ЗПМПЧЕ ВМПЛБ. ьФП ПЗТБОЙЮЕОЙЕ НПЦЕФ РТЙЧПДЙФШ Л ДПЧПМШОП УЛЧЕТОПНХ ЙУЛБЦЕОЙА УФЙМС РТПЗТБННЙТПЧБОЙС Й/ЙМЙ ЙЪМЙЫОЙН ПЫЙВЛБН. юБЭЕ ЧУЕЗП ОЕЙОЙГЙБМЙЪЙТПЧБООЩЕ МПЛБМШОЩЕ РЕТЕНЕООЩЕ СЧМСАФУС РТПУФП РТЙЪОБЛПН РМПИПЗП УФЙМС; ЙУЛМАЮЕОЙЕН СЧМСАФУС РЕТЕНЕООЩЕ, РПДМЕЦБЭЙЕ ЙОЙГЙБМЙЪБГЙЙ РПУТЕДУФЧПН ЧЧПДБ, Й РЕТЕНЕООЩЕ ЧЕЛФПТОПЗП ЙМЙ УФТХЛФХТОПЗП ФЙРБ, ЛПФПТЩЕ ОЕМШЪС ХДПВОП ЙОЙГЙБМЙЪЙТПЧБФШ ПДОЙНЙ РТЙУЧБЙЧБОЙСНЙ *3. ъБНЕФШФЕ, ЮФП = СЧМСЕФУС ПРЕТБГЙЕК РТЙУЧБЙЧБОЙС, Б == ПРЕТБГЙЕК УТБЧОЕОЙС.

жХОЛГЙС prim, ПВТБВБФЩЧБАЭБС primary, ОБРЙУБОБ Ч ПУОПЧОПН Ч ФПН ЦЕ ДХИЕ, ОЕ УЮЙФБС ФПЗП, ЮФП ОЕНОПЗП ТЕБМШОПК ТБВПФЩ Ч ОЕК ЧУЕ-ФБЛЙ ЧЩРПМОСЕФУС, Й ОЕФ ОХЦДЩ Ч ГЙЛМЕ, РПУЛПМШЛХ НЩ РПРБДБЕН ОБ ВПМЕЕ ОЙЪЛЙК ХТПЧЕОШ ЙЕТБТИЙЙ ЧЩЪПЧПЧ: double prim() // ПВТБВБФЩЧБЕФ primary (РЕТЧЙЮОЩЕ) { switch (curr_tok) { case NUMBER: // ЛПОУФБОФБ У РМБЧБАЭЕК ФПЮЛПК get_token(); return number_value; case NAME: if (get_token() == ASSIGN) { name* n = insert(name_string); get_token(); n->value = expr(); return n->value; } return look(name-string)->value; case MINUS: // ХОБТОЩК НЙОХУ get_token(); return -prim(); case LP: get_token(); double e = expr(); if (curr_tok != RP) return error("ДПМЦОБ ВЩФШ )"); get_token(); return e; case END: return 1; default: return error("ДПМЦОП ВЩФШ primary"); } }

рТЙ ПВОБТХЦЕОЙЙ NUMBER (ФП ЕУФШ, ЛПОУФБОФЩ У РМБЧБАЭЕК ФПЮЛПК), ЧПЪЧТБЭБЕФУС ЕЗП ЪОБЮЕОЙЕ. жХОЛГЙС ЧЧПДБ get_token() РПНЕЭБЕФ ЪОБЮЕОЙЕ Ч ЗМПВБМШОХА РЕТЕНЕООХА number_value. йУРПМШЪПЧБОЙЕ Ч РТПЗТБННЕ ЗМПВБМШОЩИ РЕТЕНЕООЩИ ЮБУФП ХЛБЪЩЧБЕФ ОБ ФП, ЮФП УФТХЛФХТБ ОЕ УПЧУЕН РТПЪТБЮОБ, ЮФП РТЙНЕОСМБУШ ОЕЛПФПТПЗП ТПДБ ПРФЙНЙЪБГЙС. ъДЕУШ ДЕМП ПВУФПЙФ ЙНЕООП ФБЛ. фЕПТЕФЙЮЕУЛЙ МЕЛУЙЮЕУЛЙК УЙНЧПМ ПВЩЮОП УПУФПЙФ ЙЪ ДЧХИ ЮБУФЕК: ЪОБЮЕОЙС, ПРТЕДЕМСАЭЕЗП ЧЙД МЕЛУЕНЩ (Ч ДБООПК РТПЗТБННЕ token_value), Й (ЕУМЙ ОЕПВИПДЙНП) ЪОБЮЕОЙС МЕЛУЕНЩ. х ОБУ ЙНЕЕФУС ФПМШЛП ПДОБ РТПУФБС РЕТЕНЕООБС curr_tok, РПЬФПНХ ДМС ИТБОЕОЙС ЪОБЮЕОЙС РПУМЕДОЕЗП УЮЙФБООПЗП NUMBER РПОБДПВЙМБУШ ЗМПВБМШОБС РЕТЕНЕООБС number_value. ьФП ТБВПФБЕФ ФПМШЛП РПФПНХ, ЮФП ЛБМШЛХМСФПТ РТЙ ЧЩЮЙУМЕОЙСИ ЙУРПМШЪХЕФ ФПМШЛП ПДОП ЮЙУМП РЕТЕД ЮФЕОЙЕН УП ЧИПДБ ДТХЗПЗП.

фБЛ ЦЕ, ЛБЛ ЪОБЮЕОЙЕ РПУМЕДОЕЗП ЧУФТЕЮЕООПЗП NUMBER ИТБОЙФУС Ч number_value, Ч name_string Ч ЧЙДЕ УЙНЧПМШОПК УФТПЛЙ ИТБОЙФУС РТЕДУФБЧМЕОЙЕ РПУМЕДОЕЗП РТПЮЙФБООПЗП NAME. рЕТЕД ФЕН, ЛБЛ ЮФП-МЙВП УДЕМБФШ У ЙНЕОЕН, ЛБМШЛХМСФПТ ДПМЦЕО ЪБЗМСОХФШ ЧРЕТЕД, ЮФПВЩ РПУНПФТЕФШ, ПУХЭЕУФЧМСЕФУС МЙ РТЙУЧБЙЧБОЙЕ ЕНХ, ЙМЙ ПОП РТПУФП ЙУРПМШЪХЕФУС. ч ПВПЙИ УМХЮБСИ ОБДП УРТБЧЙФШУС Ч ФБВМЙГЕ ЙНЕО. уБНБ ФБВМЙГБ ПРЙУЩЧБЕФУС Ч #3.1.3; ЪДЕУШ ОБДП ЪОБФШ ФПМШЛП, ЮФП ПОБ УПУФПЙФ ЙЪ ЬМЕНЕОФПЧ ЧЙДБ: srtuct name { char* string; char* next; double value; }

ЗДЕ next ЙУРПМШЪХЕФУС ФПМШЛП ЖХОЛГЙСНЙ, ЛПФПТЩЕ РПДДЕТЦЙЧБАФ ТБВПФХ У ФБВМЙГЕК: name* look(char*); name* insert(char*);

пВЕ ЧПЪЧТБЭБАФ ХЛБЪБФЕМШ ОБ name, УППФЧЕФУФЧХАЭЕЕ РБТБНЕФТХ - УЙНЧПМШОПК УФТПЛЕ; look() ЧЩТБЦБЕФ ОЕДПЧПМШУФЧП, ЕУМЙ ЙНС ОЕ ВЩМП ПРТЕДЕМЕОП. ьФП ЪОБЮЙФ, ЮФП Ч ЛБМШЛХМСФПТЕ НПЦОП ЙУРПМШЪПЧБФШ ЙНС ВЕЪ РТЕДЧБТЙФЕМШОПЗП ПРЙУБОЙС, ОП РЕТЧЩК ТБЪ ПОП ДПМЦОП ЙУРПМШЪПЧБФШУС Ч МЕЧПК ЮБУФЙ РТЙУЧБЙЧБОЙС. 3.1.2 жХОЛГЙС ЧЧПДБ юФЕОЙЕ ЧЧПДБ - ЮБУФП УБНБС ЪБРХФБООБС ЮБУФШ РТПЗТБННЩ. рТЙЮЙОБ Ч ФПН, ЮФП ЕУМЙ РТПЗТБННБ ДПМЦОБ ПВЭБФШУС У ЮЕМПЧЕЛПН, ФП ПОБ ДПМЦОБ УРТБЧМСФШУС У ЕЗП РТЙЮХДБНЙ, ХУМПЧОПУФСНЙ Й ЧОЕЫОЕ УМХЮБКОЩНЙ ПЫЙВЛБНЙ. рПРЩФЛЙ ЪБУФБЧЙФШ ЮЕМПЧЕЛБ ЧЕУФЙ УЕВС ВПМЕЕ ХДПВОЩН ДМС НБЫЙОЩ ПВТБЪПН ЮБУФП (Й УРТБЧЕДМЙЧП) ТБУУНБФТЙЧБАФУС ЛБЛ ПУЛПТВЙФЕМШОЩЕ. ъБДБЮБ ОЙЪЛПХТПЧОЕЧПК РТПЗТБННЩ ЧЧПДБ УПУФПЙФ Ч ФПН, ЮФПВЩ ЮЙФБФШ УЙНЧПМЩ РП ПДОПНХ Й УПУФБЧМСФШ ЙЪ ОЙИ МЕЛУЙЮЕУЛЙЕ УЙНЧПМЩ ВПМЕЕ ЧЩУПЛПЗП ХТПЧОС. дБМЕЕ ЬФЙ МЕЛУЕНЩ УМХЦБФ ЧЧПДПН ДМС РТПЗТБНН ВПМЕЕ ЧЩУПЛПЗП ХТПЧОС. х ОБУ ЧЧПД ОЙЪЛПЗП ХТПЧОС ПУХЭЕУФЧМСЕФУС get_token(). пВОБДЕЦЙЧБЕФ ФП, ЮФП ОБРЙУБОЙЕ РТПЗТБНН ЧЧПДБ ОЙЪЛПЗП ХТПЧОС ОЕ СЧМСЕФУС ЕЦЕДОЕЧОПК ТБВПФПК; Ч ИПТПЫЕК УЙУФЕНЕ ДМС ЬФПЗП ВХДХФ УФБОДБТФОЩЕ ЖХОЛГЙЙ.

дМС ЛБМШЛХМСФПТБ РТБЧЙМБ ЧЧПДБ УПЪОБФЕМШОП ВЩМЙ ЧЩВТБОЩ ФБЛЙНЙ, ЮФПВЩ ЖХОЛГЙСН РП ТБВПФЕ У РПФПЛБНЙ ВЩМП ОЕХДПВОП ЬФЙ РТБЧЙМБ ПВТБВБФЩЧБФШ; ОЕЪОБЮЙФЕМШОЩЕ ЙЪНЕОЕОЙС Ч ПРТЕДЕМЕОЙЙ МЕЛУЕН УДЕМБМЙ ВЩ get_token() ПВНБОЮЙЧП РТПУФПК.

рЕТЧБС УМПЦОПУФШ УПУФПЙФ Ч ФПН, ЮФП УЙНЧПМ ОПЧПК УФТПЛЙ '\n' СЧМСЕФУС ДМС ЛБМШЛХМСФПТБ УХЭЕУФЧЕООЩН, Б ЖХОЛГЙЙ ТБВПФЩ У РПФПЛБНЙ УЮЙФБАФ ЕЗП УЙНЧПМПН РТПРХУЛБ. фП ЕУФШ, ДМС ЬФЙИ ЖХОЛГЙК '\n' ЪОБЮЙН ФПМШЛП ЛБЛ ПЗТБОЙЮЙФЕМШ МЕЛУЕНЩ. юФПВЩ РТЕПДПМЕФШ ЬФП, ОБДП РТПЧЕТСФШ РТПРХУЛЙ (РТПВЕМ, УЙНЧПМЩ ФБВХМСГЙЙ Й Ф.Р.): char ch do { // РТПРХУЛБЕФ РТПРХУЛЙ ЪБ ЙУЛМАЮЕОЙЕН '\n' if(!cin.get(ch)) return curr_tok = END; } while (ch!='\n' && isspace(ch));

чЩЪПЧ cin.get(ch) УЮЙФЩЧБЕФ ПДЙО УЙНЧПМ ЙЪ УФБОДБТФОПЗП РПФПЛБ ЧЧПДБ Ч ch. рТПЧЕТЛБ if(!cin.get(ch)) ОЕ РТПИПДЙФ Ч УМХЮБЕ, ЕУМЙ ЙЪ cin ОЕМШЪС УЮЙФБФШ ОЙ ПДОПЗП УЙНЧПМБ; Ч ЬФПН УМХЮБЕ ЧПЪЧТБЭБЕФУС END, ЮФПВЩ ЪБЧЕТЫЙФШ УЕБОУ ТБВПФЩ ЛБМШЛХМСФПТБ. йУРПМШЪХЕФУС ПРЕТБГЙС ! (ое), РПУЛПМШЛХ get() ЧПЪЧТБЭБЕФ Ч УМХЮБЕ ХУРЕИБ ОЕОХМЕЧПЕ ЪОБЮЕОЙЕ.

жХОЛГЙС (inline) isspace() ЙЪ ПВЕУРЕЮЙЧБЕФ УФБОДБТФОХА РТПЧЕТЛХ ОБ ФП, СЧМСЕФУС МЙ УЙНЧПМ РТПРХУЛПН (#8.4.1); isspace(c) ЧПЪЧТБЭБЕФ ОЕОХМЕЧПЕ ЪОБЮЕОЙЕ, ЕУМЙ c СЧМСЕФУС УЙНЧПМПН РТПРХУЛБ, Й ОПМШ Ч РТПФЙЧОПН УМХЮБЕ. рТПЧЕТЛБ ТЕБМЙЪХЕФУС Ч ЧЙДЕ РПЙУЛБ Ч ФБВМЙГЕ, РПЬФПНХ ЙУРПМШЪПЧБОЙЕ isspace() ОБНОПЗП ВЩУФТЕЕ, ЮЕН РТПЧЕТЛБ ОБ ПФДЕМШОЩЕ УЙНЧПМЩ РТПРХУЛБ; ЬФП ЦЕ ПФОПУЙФУС Й Л ЖХОЛГЙСН isalpha(), isdigit() Й isalnum(), ЛПФПТЩЕ ЙУРПМШЪХАФУС Ч get_token().

рПУМЕ ФПЗП, ЛБЛ РХУФПЕ НЕУФП РТПРХЭЕОП, УМЕДХАЭЙК УЙНЧПМ ЙУРПМШЪХЕФУС ДМС ПРТЕДЕМЕОЙС ФПЗП, ЛБЛПЗП ЧЙДБ ЛБЛПЗП ЧЙДБ МЕЛУЕНБ РТЙИПДЙФ. дБЧБКФЕ УОБЮБМБ ТБУУНПФТЙН ОЕЛПФПТЩЕ УМХЮБЙ ПФДЕМШОП, РТЕЦДЕ ЮЕН РТЙЧПДЙФШ ЧУА ЖХОЛГЙА. пЗТБОЙЮЙФЕМЙ МЕЛУЕН '\n' Й ';' ПВТБВБФЩЧБАФУС ФБЛ: switch (ch) { case ';': case '\n': cin >> WS; // РТПРХУФЙФШ РТПРХУЛ return curr_tok=PRINT;

рТПРХУЛ РХУФПЗП НЕУФБ ДЕМБФШ ОЕПВСЪБФЕМШОП, ОП ПО РПЪЧПМСЕФ ЙЪВЕЦБФШ РПЧФПТОЩИ ПВТБЭЕОЙК Л get_token(). WS - ЬФП УФБОДБТФОЩК РТПРХУЛПЧЩК ПВЯЕЛФ, ПРЙУБООЩК Ч ; ПО ЙУРПМШЪХЕФУС ФПМШЛП ДМС УВТПУБ РТПРХУЛБ. пЫЙВЛБ ЧП ЧЧПДЕ ЙМЙ ЛПОЕГ ЧЧПДБ ОЕ ВХДХФ ПВОБТХЦЕОЩ ДП УМЕДХАЭЕЗП ПВТБЭЕОЙС Л get_token(). пВТБФЙФЕ ЧОЙНБОЙЕ ОБ ФП, ЛБЛ НПЦОП ЙУРПМШЪПЧБФШ ОЕУЛПМШЛП НЕФПЛ case (УМХЮБЕЧ) ДМС ПДОПК Й ФПК ЦЕ РПУМЕДПЧБФЕМШОПУФЙ ПРЕТБФПТПЧ, ПВТБВБФЩЧБАЭЙИ ЬФЙ УМХЮБЙ. ч ПВПЙИ УМХЮБСИ ЧПЪЧТБЭБЕФУС МЕЛУЕНБ PRINT Й РПНЕЭБЕФУС Ч curr_tok.

юЙУМБ ПВТБВБФЩЧБАФУС ФБЛ: case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin >> number_value; return curr_tok=NUMBER;

тБУРПМБЗБФШ НЕФЛЙ УМХЮБЕЧ case ЗПТЙЪПОФБМШОП, Б ОЕ ЧЕТФЙЛБМШОП, ОЕ ПЮЕОШ ИПТПЫБС НЩУМШ, РПУЛПМШЛХ ЮЙФБФШ ЬФП ЗПТБЪДП ФТХДОЕЕ, ОП ПФЧПДЙФШ РП ПДОПК УФТПЛЕ ОБ ЛБЦДХА ГЙЖТХ ОХДОП.

рПУЛПМШЛХ ПРЕТБГЙС >> ПРТЕДЕМЕОБ ФБЛЦЕ Й ДМС ЮФЕОЙС ЛПОУФБОФ У РМБЧБАЭЕК ФПЮЛПК Ч double, РТПЗТБННЙТПЧБОЙЕ ЬФПЗП ОЕ УПУФБЧМСЕФ ФТХДБ: УРЕТЧБ ОБЮБМШОЩК УЙНЧПМ (ГЙЖТБ ЙМЙ ФПЮЛБ) РПНЕЭБЕФУС ПВТБФОП Ч cin, Б ЪБФЕН НПЦОП УЮЙФЩЧБФШ ЛПОУФБОФХ Ч number_value. йНС, ФП ЕУФШ МЕЛУЕНБ NAME, ПРТЕДЕМСЕФУС ЛБЛ ВХЛЧБ, ЪБ ЛПФПТПК ЧПЪНПЦОП УМЕДХЕФ ОЕУЛПМШЛП ВХЛЧ ЙМЙ ГЙЖТ: if (isalpha(ch)) { char* p = name_string; *p++ = ch; while (cin.get(ch) && isalnum(ch)) *p++ = ch; cin.putback(ch); *p = 0; return curr_tok=NAME; }

ьФБ ЮБУФШ УФТПЙФ Ч name_string УФТПЛХ, ЪБЛБОЮЙЧБАЭХАУС ОХМЕН. жХОЛГЙЙ isalpha() Й isalnum() ЪБДБОЩ Ч ; isalnum(c) ОЕ ОПМШ, ЕУМЙ c ВХЛЧБ ЙМЙ ГЙЖТБ, ОПМШ Ч РТПФЙЧОПН УМХЮБЕ.

чПФ, ОБЛПОЕГ, ЖХОЛГЙС ЧЧПДБ РПМОПУФША: token_value get_token() { char ch; do { // РТПРХУЛБЕФ РТПРХУЛЙ ЪБ ЙУЛМАЮЕОЙЕН '\n' if(!cin.get(ch)) return curr_tok = END; } while (ch!='\n' && isspace(ch)); switch (ch) { case ';': case '\n': cin >> WS; // РТПРХУФЙФШ РТПРХУЛ return curr_tok=PRINT; case '*': case '/': case '+': case '-': case '(': case ')': case '=': return curr_tok=ch; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin >> number_value; return curr_tok=NUMBER; default: // NAME, NAME= ЙМЙ ПЫЙВЛБ if (isalpha(ch)) { char* p = name_string; *p++ = ch; while (cin.get(ch) && isalnum(ch)) *p++ = ch; cin.putback(ch); *p = 0; return curr_tok=NAME; } error("РМПИБС МЕЛУЕНБ"); return curr_tok=PRINT; } }

рПУЛПМШЛХ token_value (ЪОБЮЕОЙЕ МЕЛУЕНЩ) ПРЕТБГЙЙ ВЩМП ПРТЕДЕМЕОП ЛБЛ ГЕМПЕ ЪОБЮЕОЙЕ ЬФПК ПРЕТБГЙЙ *4, ПВТБВПФЛБ ЧУЕИ ПРЕТБГЙК ФТЙЧЙБМШОБ. 3.1.3 фБВМЙГБ ЙНЕО л ФБВМЙГЕ ЙНЕО ДПУФХР ПУХЭЕУФЧМСЕФУС У РПНПЭША ПДОПК ЖХОЛГЙЙ name* look(char* p, int ins =0);

еЕ ЧФПТПК РБТБНЕФТ ХЛБЪЩЧБЕФ, ОХЦОП МЙ УОБЮБМБ РПНЕУФЙФШ УФТПЛХ УЙНЧПМПЧ Ч ФБВМЙГХ. йОЙГЙБМЙЪБФПТ =0 ЪБДБЕФ РБТБНЕФТ, ЛПФПТЩК ОБДМЕЦЙФ ЙУРПМШЪПЧБФШ РП ХНПМЮБОЙА, ЛПЗДБ look() ЧЩЪЩЧБЕФУС У ПДОЙН РБТБНЕФТПН. ьФП ДБЕФ ХДПВУФЧП ЪБРЙУЙ, ЛПЗДБ look("sqrt2") ПЪОБЮБЕФ look("sqrt2",0), ФП ЕУФШ РТПУНПФТ, ВЕЪ РПНЕЭЕОЙС Ч ФБВМЙГХ. юФПВЩ РПМХЮЙФШ ФБЛПЕ ЦЕ ХДПВУФЧП ЪБРЙУЙ ДМС РПНЕЭЕОЙС Ч ФБВМЙГХ, ПРТЕДЕМСЕФУС ЧФПТБС ЖХОЛГЙС: inline name* insert(char* s) { return look(s,1);}

лБЛ ХЦЕ ПФНЕЮБМПУШ ТБОШЫЕ, ЬМЕНЕОФЩ ЬФПК ФБВМЙГЩ ЙНЕАФ ФЙР: srtuct name { char* string; char* next; double value; }

юМЕО next ЙУРПМШЪХЕФУС ФПМШЛП ДМС УГЕРМЕОЙС ЧНЕУФЕ ЙНЕО Ч ФБВМЙГЕ. уБНБ ФБВМЙГБ - ЬФП РТПУФП ЧЕЛФПТ ХЛБЪБФЕМЕК ОБ ПВЯЕЛФЩ ФЙРБ name: const TBLSZ = 23; name* table[TBLSZ];

рПУЛПМШЛХ ЧУЕ УФБФЙЮЕУЛЙЕ ПВЯЕЛФЩ ЙОЙГЙБМЙЪЙТХАФУС ОХМЕН, ЬФП ФТЙЧЙБМШОПЕ ПРЙУБОЙЕ ФБВМЙГЩ table ЗБТБОФЙТХЕФ ФБЛЦЕ ОБДМЕЦБЭХА ЙОЙГЙБМЙЪБГЙА.

дМС ОБИПЦДЕОЙС ЬМЕНЕОФБ Ч ФБВМЙГЕ Ч look() РТЙОЙНБЕФУС РТПУФПК БМЗПТЙФН ИЬЫЙТПЧБОЙС (ЙНЕОБ У ПДОЙН Й ФЕН ЦЕ ИЬЫ-ЛПДПН ЪБГЕРМСАФУС ЧНЕУФЕ): int ii = 0; // ИЬЫЙТПЧБОЙЕ char* pp = p; while (*pp) ii = iinext = table[ii]; table[ii] = nn; return nn; }

рПУМЕ ЧЩЮЙУМЕОЙС ИЬЫ-ЛПДБ ii ЙНС ОБИПДЙФУС РТПУФЩН РТПУНПФТПН ЮЕТЕЪ РПМС next. рТПЧЕТЛБ ЛБЦДПЗП name ПУХЭЕУФЧМСЕФУС У РПНПЭША УФБОДБТФОПК ЖХОЛГЙЙ strcmp(). еУМЙ УФТПЛБ ОБКДЕОБ, ЧПЪЧТБЭБЕФУС ЕЕ name, ЙОБЮЕ ДПВБЧМСЕФУС ОПЧПЕ name.

дПВБЧМЕОЙЕ ОПЧПЗП name ЧЛМАЮБЕФ Ч УЕВС УПЪДБОЙЕ ОПЧПЗП ПВЯЕЛФБ Ч УЧПВПДОПК РБНСФЙ У РПНПЭША ПРЕТБГЙЙ new (УН. #3.2.6), ЕЗП ЙОЙГЙБМЙЪБГЙА, Й ДПВБЧМЕОЙЕ ЕЗП Л УРЙУЛХ ЙНЕО. рПУМЕДОЕЕ ПУХЭЕУФЧМСЕФУС РТПУФП РХФЕН РПНЕЭЕОЙС ОПЧПЗП ЙНЕОЙ Ч ЗПМПЧХ УРЙУЛБ, РПУЛПМШЛХ ЬФП НПЦОП ДЕМБФШ ДБЦЕ ОЕ РТПЧЕТСС, ЙНЕЕФУС УРЙУПЛ, ЙМЙ ОЕФ. уЙНЧПМШОХА УФТПЛХ ДМС ЙНЕОЙ ФПЦЕ ОХЦОП УПИТБОЙФШ Ч УЧПВПДОПК РБНСФЙ. жХОЛГЙС strlen() ЙУРПМШЪХЕФУС ДМС ПРТЕДЕМЕОЙС ФПЗП, УЛПМШЛП РБНСФЙ ОХЦОП, new - ДМС ЧЩДЕМЕОЙС ЬФПК РБНСФЙ, Й strcpy() - ДМС ЛПРЙТПЧБОЙС УФТПЛЙ Ч РБНСФШ. 3.1.4 пВТБВПФЛБ ПЫЙВПЛ рПУЛПМШЛХ РТПЗТБННБ ФБЛ РТПУФБ, ПВТБВПФЛБ ПЫЙВПЛ ОЕ УПУФБЧМСЕФ ВПМШЫПЗП ФТХДБ. жХОЛГЙС ПВТБВПФЛЙ ПЫЙВПЛ РТПУФП УЮЙФБЕФ ПЫЙВЛЙ, РЙЫЕФ УППВЭЕОЙЕ ПВ ПЫЙВЛЕ Й ЧПЪЧТБЭБЕФ ХРТБЧМЕОЙЕ ПВТБФОП: int no_of_errors; double error(char* s) { cerr tp)->b_name; // ЖХОЛГЙПОБМШОБС ЪБРЙУШ Pname n3 = ((Pbase)n2->tp)->b_name; // ЪБРЙУШ РТЙЧЕДЕОЙС Л ФЙРХ

рПУЛПМШЛХ ПРЕТБГЙС -> ЙНЕЕФ ВПМШЫЙК РТЙПТЙФЕФ, ЮЕН РТЙЧЕДЕОЙЕ, РПУМЕДОЕЕ ЧЩТБЦЕОЙЕ ЙОФЕТРТЕФЙТХЕФУС ЛБЛ ((Pbase)(n2->tp))->b_name

у РПНПЭША СЧОПЗП РТЕПВТБЪПЧБОЙС ФЙРБ Л ХЛБЪБФЕМШОЩН ФЙРБН НПЦОП УЩНЙФЙТПЧБФШ, ЮФП ПВЯЕЛФ ЙНЕЕФ УПЧЕТЫЕООП РТПЙЪЧПМШОЩК ФЙР. оБРТЙНЕТ: any_type* p = (any_type*)&some_object;

РПЪЧПМЙФ ТБВПФБФШ РПУТЕДУФЧПН p У ОЕЛПФПТЩН ПВЯЕЛФПН some_object ЛБЛ У МАВЩН ФЙРПН any_type.

лПЗДБ РТЕПВТБЪПЧБОЙЕ ФЙРБ ОЕ ОЕПВИПДЙНП, ЕЗП УМЕДХЕФ ЙЪВЕЗБФШ. рТПЗТБННЩ, Ч ЛПФПТЩИ ЙУРПМШЪХЕФУС НОПЗП СЧОЩИ РТЕПВТБЪПЧБОЙК ФЙРПЧ, ФТХДОЕЕ РПОЙНБФШ, ЮЕН ФЕ, Ч ЛПФПТЩИ ЬФП ОЕ ДЕМБЕФУС. пДОБЛП ФБЛЙЕ РТПЗТБННЩ МЕЗЮЕ РПОЙНБФШ, ЮЕН РТПЗТБННЩ, РТПУФП ОЕ ЙУРПМШЪХАЭЙЕ ФЙРЩ ДМС РТЕДУФБЧМЕОЙС РПОСФЙК ВПМЕЕ ЧЩУПЛПЗП ХТПЧОС (ОБРТЙНЕТ, РТПЗТБННХ, ЛПФПТБС ПРЕТЙТХЕФ ТЕЗЙУФТПН ХУФТПКУФЧБ У РПНПЭША УДЧЙЗБ Й НБУЛЙТПЧБОЙС, ЧНЕУФП ФПЗП, ЮФПВЩ ПРТЕДЕМЙФШ РПДИПДСЭХА struct Й ПРЕТЙТПЧБФШ ЕА; УН. #2.5.2 ). лТПНЕ ФПЗП, РТБЧЙМШОПУФШ СЧОПЗП РТЕПВТБЪПЧБОЙС ФЙРБ ЮБУФП ЛТЙФЙЮЕУЛЙН ПВТБЪПН ЪБЧЙУЙФ ПФ РПОЙНБОЙС РТПЗТБННЙУФПН ФПЗП, ЛБЛЙН ПВТБЪПН ПВЯЕЛФЩ ТБЪМЙЮОЩИ ФЙРПЧ ПВТБВБФЩЧБАФУС Ч СЪЩЛЕ, Й ПЮЕОШ ЮБУФП ПФ РПДТПВОПУФЕК ТЕБМЙЪБГЙЙ. оБРТЙНЕТ: int i = 1; char* pc = "asdf"; int* pi = &i; i = (int)pc; pc = (char*)i; // ПУФЕТЕЗБКФЕУШ: ЪОБЮЕОЙЕ pc НПЦЕФ ЙЪНЕОЙФШУС // ОБ ОЕЛПФПТЩИ НБЫЙОБИ // sizeof(int) 3.2.6 уЧПВПДОБС РБНСФШ йНЕОПЧБООЩК ПВЯЕЛФ СЧМСЕФУС МЙВП УФБФЙЮЕУЛЙН, МЙВП БЧФПНБФЙЮЕУЛЙН УН. #2.1.3). уФБФЙЮЕУЛЙК ПВЯЕЛФ ТБЪНЕЭБЕФУС ЧП ЧТЕНС ЪБРХУЛБ РТПЗТБННЩ Й УХЭЕУФЧХЕФ Ч ФЕЮЕОЙЕ ЧУЕЗП ЧЩРПМОЕОЙС РТПЗТБННЩ. бЧФПНБФЙЮЕУЛЙК ПВЯЕЛФ ТБЪНЕЭБЕФУС ЛБЦДЩК ТБЪ РТЙ ЧИПДЕ Ч ЕЗП ВМПЛ Й УХЭЕУФЧХЕФ ФПМШЛП ДП ФЕИ РПТ, РПЛБ ЙЪ ЬФПЗП ВМПЛБ ОЕ ЧЩЫМЙ. пДОБЛП ЮБУФП ВЩЧБЕФ РПМЕЪОП УПЪДБФШ ОПЧЩК ПВЯЕЛФ, УХЭЕУФЧХАЭЙК ДП ФЕИ РПТ, РПЛБ ПО ОЕ УФБОЕФ ВПМШЫЕ ОЕ ОХЦЕО. ч ЮБУФОПУФЙ, ЮБУФП РПМЕЪОП УПЪДБФШ ПВЯЕЛФ, ЛПФПТЩК НПЦОП ЙУРПМШЪПЧБФШ РПУМЕ ЧПЪЧТБФБ ЙЪ ЖХОЛГЙЙ, ЗДЕ ПО УПЪДБЕФУС. фБЛЙЕ ПВЯЕЛФЩ УПЪДБЕФ ПРЕТБГЙС new, Б Ч РПУМЕДУФЧЙЕ ХОЙЮФПЦБФШ ЙИ НПЦОП ПРЕТБГЙЕК delete. рТП ПВЯЕЛФЩ, ЧЩДЕМЕООЩЕ У РПНПЭША ПРЕТБГЙЙ new, ЗПЧПТСФ, ЮФП ПОЙ Ч УЧПВПДОПК РБНСФЙ. фБЛЙНЙ ПВЯЕЛФБНЙ ПВЩЮОП СЧМСАФУС ЧЕТЫЙОЩ ДЕТЕЧШЕЧ ЙМЙ ЬМЕНЕОФЩ УЧСЪБООЩИ УРЙУЛПЧ, СЧМСАЭЙЕУС ЮБУФША ВПМШЫЕК УФТХЛФХТЩ ДБООЩИ, ТБЪНЕТ ЛПФПТПК ОЕ НПЦЕФ ВЩФШ ЙЪЧЕУФЕО ОБ УФБДЙЙ ЛПНРЙМСГЙЙ. тБУУНПФТЙН, ЛБЛ НПЦОП ВЩМП ВЩ ОБРЙУБФШ ЛПНРЙМСФПТ Ч ДХИЕ ОБРЙУБООПЗП ОБУФПМШОПЗП ЛБМШЛХМСФПТБ. жХОЛГЙЙ УЙОФБЛУЙЮЕУЛПЗП БОБМЙЪБ НПЗХФ УФТПЙФШ ДТЕЧПЧЙДОПЕ РТЕДУФБЧМЕОЙЕ ЧЩТБЦЕОЙК, ЛПФПТПЕ ВХДЕФ ЙУРПМШЪПЧБФШУС РТЙ ЗЕОЕТБГЙЙ ЛПДБ. оБРТЙНЕТ: struct enode { token_value oper; enode* left; enode* right; }; enode* expr() { enode* left = term(); for(;;) switch(curr_tok) { case PLUS: case MINUS: get_token(); enode* n = new enode; n->oper = curr_tok; n->left = left; n->right = term(); left = n; break; default: return left; } }

рПМХЮБАЭЕЕУС ДЕТЕЧП ЗЕОЕТБФПТ ЛПДБ НПЦЕФ ЙУРПМШЪПЧБФШ ОБРТЙНЕТ ФБЛ: void generate(enode* n) { switch (n->oper) { case PLUS: // ДЕМБЕФ ОЕЮФП УППФЧЕФУФЧХАЭЕЕ delete n; } }

пВЯЕЛФ, УПЪДБООЩК У РПНПЭША new, УХЭЕУФЧХЕФ, РПЛБ ПО ОЕ ВХДЕФ СЧОП ХОЙЮФПЦЕО delete, РПУМЕ ЮЕЗП РТПУФТБОУФЧП, ЛПФПТПЕ ПО ЪБОЙНБМ, ПРСФШ НПЦЕФ ЙУРПМШЪПЧБФШУС new. оЙЛБЛПЗП "УВПТЭЙЛБ НХУПТБ", ЛПФПТЩК ЙЭЕФ ПВЯЕЛФЩ, ОБ ЛПФПТЩЕ ОЕФ УУЩМПЛ, Й РТЕДПУФБЧМСЕФ ЙИ Ч ТБУРПТСЦЕОЙЕ new, ОЕФ. пРЕТБГЙС delete НПЦЕФ РТЙНЕОСФШУС ФПМШЛП Л ХЛБЪБФЕМА, ЛПФПТЩК ВЩМ ЧПЪЧТБЭЕО ПРЕТБГЙЕК new, ЙМЙ Л ОХМА. рТЙНЕОЕОЙЕ delete Л ОХМА ОЕ ЧЩЪЩЧБЕФ ОЙЛБЛЙИ ДЕКУФЧЙК.

у РПНПЭША new НПЦОП ФБЛЦЕ УПЪДБЧБФШ ЧЕЛФПТБ ПВЯЕЛФПЧ. оБРТЙНЕТ: char* save_string(char* p) { char* s = new char[strlen(p)+1]; strcpy(s,p); return s; }

уМЕДХЕФ ЪБНЕФЙФШ, ЮФП ЮФПВЩ ПУЧПВПДЙФШ РТПУФТБОУФЧП, ЧЩДЕМЕООПЕ new, delete ДПМЦОБ ЙНЕФШ ЧПЪНПЦОПУФШ ПРТЕДЕМЙФШ ТБЪНЕТ ЧЩДЕМЕООПЗП ПВЯЕЛФБ. оБРТЙНЕТ: int main(int argc, char* argv[]) { if (argc < 2) exit(1); char* p = save_string(argv[1]); delete p; }

ьФП РТЙЧПДЙФ Л ФПНХ, ЮФП ПВЯЕЛФ, ЧЩДЕМЕООЩК УФБОДБТФОПК ТЕБМЙЪБГЙЕК new, ВХДЕФ ЪБОЙНБФШ ВПМШЫЕ НЕУФБ, ЮЕН УФБФЙЮЕУЛЙК ПВЯЕЛФ (ПВЩЮОП, ВПМШЫЕ ОБ ПДОП УМПЧП).

нПЦОП ФБЛЦЕ СЧОП ХЛБЪЩЧБФШ ТБЪНЕТ ЧЕЛФПТБ Ч ПРЕТБГЙЙ ХОЙЮФПЦЕОЙС delete. оБРТЙНЕТ: int main(int argc, char* argv[]) { if (argc < 2) exit(1); int size = strlen(argv[1])+1; char* p = save_string(argv[1]); delete[size] p; }

ъБДБООЩК РПМШЪПЧБФЕМЕН ТБЪНЕТ ЧЕЛФПТБ ЙЗОПТЙТХЕФУС ЪБ ЙУЛМАЮЕОЙЕН ОЕЛПФПТЩИ ФЙРПЧ, ПРТЕДЕМСЕНЩИ РПМШЪПЧБФЕМЕН (#5.5.5).

пРЕТБГЙЙ УЧПВПДОПК РБНСФЙ ТЕБМЙЪХАФУС ЖХОЛГЙСНЙ (#У.7.2.3): void operator new(long); void operator delete(void*);

уФБОДБТФОБС ТЕБМЙЪБГЙС new ОЕ ЙОЙГЙБМЙЪЙТХЕФ ЧПЪЧТБЭБЕНЩК ПВЯЕЛФ.

юФП РТПЙУИПДЙФ, ЛПЗДБ new ОЕ ОБИПДЙФ РБНСФЙ ДМС ЧЩДЕМЕОЙС? рПУЛПМШЛХ ДБЦЕ ЧЙТФХБМШОБС РБНСФШ ЛПОЕЮОБ, ЬФП ЙОПЗДБ ДПМЦОП РТПЙУИПДЙФШ. ъБРТПУ ЧТПДЕ char* p = new char[100000000];

ЛБЛ РТБЧЙМП, РТЙЧПДЙФ Л ЛБЛЙН-ФП ОЕРТЙСФОПУФСН. лПЗДБ Х new ОЙЮЕЗП ОЕ РПМХЮБЕФУС, ПОБ ЧЩЪЩЧБЕФ ЖХОЛГЙА, ХЛБЪЩЧБЕНХА ХЛБЪБФЕМЕН _new_handler (ХЛБЪБФЕМЙ ОБ ЖХОЛГЙЙ ПВУХЦДБАФУС Ч #4.6.9). чЩ НПЦЕФЕ ЪБДБФШ ХЛБЪБФЕМШ СЧОП ЙМЙ ЙУРПМШЪПЧБФШ ЖХОЛГЙА set_new_handler(). оБРТЙНЕТ: #include void out_of_store() { cerr

Соседние файлы в папке Введение в язык С++ - Б. Страустрап