Ф Е Д Е РАЛ Ь Н О Е АГ Е Н Т С Т В О П О О БРАЗО В АН И Ю В О РО Н Е Ж С КИ Й Г О С У Д АРС Т В Е Н Н Ы Й У Н И В Е РС И...
20 downloads
232 Views
330KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Ф Е Д Е РАЛ Ь Н О Е АГ Е Н Т С Т В О П О О БРАЗО В АН И Ю В О РО Н Е Ж С КИ Й Г О С У Д АРС Т В Е Н Н Ы Й У Н И В Е РС И Т Е Т
ЯзыкпрограммированияPascal. С тро к и и зап и с и П р акти кум
С п ециа л ь но с ть 010101 (010100) М а тем а тика
ВО Р О Н Е Ж 2005
2
У тверждено научно-методическимсоветомМ атематического ф акуль тета– ( 28 ф евраля2005 года, протокол № 6 )
С оставители: В асиль евВ .В ., Х ливненко Л .В .
П рактикумподготовлен накаф едре математического моделированияматематического ф акуль тетаВ оронежского государственного университета. Рекомендуетсядлястудентоввечернего отделенияматематического ф акуль тетаВ оронежского государственного университета.
3
1. С тро ко вы й тип С тро ко вы й тип д а нны х исполь зуетсяпри обработке текстовой инф ормации. С троковый тип данных являетсяструктурированнымтипомданных и представляетсобой одномерный массивизсимволов. О тличие строки отмассиваизсимволовсостоитвтом, что массивимеет ф иксированную длину, заданную при описании. С трокаимеет максималь ную длину, определенную по умолчанию , и ф актическую длинустроки, равную количествунепустых символовстроки. С ущ ествуетдваподходакреализации строк. 1. Ф актическаядлинастроки указываетсявнулевомэ лементе строки. В нулевой э лементстроки записываетсясимвол, код которого равен ф актической длине строки. П ри выводе строки нулевой э лементневидим. Н апример, описанастрокаS. Ч тобы получить ее ф актический размер нужно исполь зовать ф ункцию ord(S[0]). П ри такомподходе максималь наядлинастроки не может превыш ать 255 символов. С троковый тип String построен наоснове первого подходакреализации строк. 2. Ф актическаядлинастроки ф иксируетсяспециаль нымсимволом. В П аскале такимсимволомявляетсяNULL, или \0. Когдапризнакф актической длины строки находитсявконце последователь ности символов, то нетнеобходимости накладывать ограничениянадлинустроки. С ледуетпомнить при э том, что длиналю бой структуры не можетпревыш ать 65534 бай та. С троки с заверш аю щ имнулемназываю тсяASCIIZ-строками. Т акие строки вП аскале описываю тсякакмассивы изсимволов, первый э лементкоторых имеет нулевой индекс. Н апример, var z: array[0..300] of char; В стандартноммодуле Stings.tpu собраны ф ункции, реализую щ ие операции над ASCIIZ-строками. П ро цед уры и ф ункции, работаю щ ие со строками типаString: • Ф ункцияConcat (S1, S2, … , Sn): string - проводитконкатенацию (с цепл ен и е) последователь ности строкS1, S2, … , Sn. • Ф ункцияCopy (S, p, n): string - возвращ аеткопию подстроки изn символов строки S, начинаяс символас номеромp. • Ф ункцияDelete (S, p, n): string - удаляетподстрокуизn символовизстроки S, начинаяс символас номеромp. • Ф ункцияInsert (S2, S1, p): string - вставляетподстрокуS2 встрокуS1, начиная с символас номеромp. • Ф ункцияLength (S): integer – возвращ аетдлинустроки S. • Ф ункцияPos (S2, S1): integer – возвращ аетномер позиции, начинаяс которой подстрокаS2 встречаетсявстроке S1. Е сли подстрокане най дена, возвращ ается ноль . • П роцедураStr (X, S) – преобразуетчисло Х вещ ественного или целого типав
4 строкусимволовS. П осле числаХ допустимо следомзадвоеточиемуказать количество позиций , выделяемых дляпредставлениячислаи после второго двоеточияколичество символоввдробной части (ка к в пр оцедур е writeln). • П роцедураVal (S, X, k) – преобразуетстрокусимволовS вчисло Х вещ ественного или целого типа. В переменной k возвращ аетсяноль , если преобразование прош ло успеш но. В противномслучае значение X не меняется, авk содержитсяномер позиции встроке S, где стоитпервый ош ибочный символ. Д опустимо перед значащ ими циф рами числавпеременной S оставлять пробелы. Е сли пробелы будут стоять после записи числа, то значение X не изменится и вk окажетсяномер позиции первого пробела. В задаче 1 мы напиш емсвою ф ункцию , работаю щ ую со строками. За д а ча 1. Н апиш ите ф ункцию rightposition, котораяполучаетдвапараметраstr1 и str2 типаstring и возвращ аетпозицию началапоследнего появления str2 вstr1. Н апример, ф ункцияrightposition(‘М ис с ис ип и’, ‘с и’) даетзначение 6. ♣ Будемсчитать , что если строкаstr2 отсутствуетвстроке str1, то значение ф ункции равно нулю . Рассмотримдваспособареш ениязадачи. 1. П росматриваясимволы встроке str1 справаналево, можно вырезать подстрокудлины str2 и сравнивать резуль тат со значениемпеременной str2. П ервое най денное совпадение будет искомым. П ервый подход реализован впрограмме Right1. 2. М ожно написать вспомогатель ную ф ункцию Invert, возвращ аю щ ую перевернутую строку-аргумент. И скомое значение можно выразить черезномер позиции, начинаяс которой перевернутаяподстрокаstr2 встречаетсявперевернутой строке str1. В торой подход реализован впрограмме Right2. ♠ Program Right; Uses crt; Var s1,s2:string; Function RightPosition(str1,str2:string):byte; var i:integer; Begin RightPosition:=0; for i:=length(str1) downto length(str2) do if copy(str1,i-length(str2)+1,length(str2))=str2 then begin RightPosition:=i-length(str2)+1; break end; End; {RightPosition} Begin Textbackground(7); Textcolor(blue); Clrscr; write('Введите строку:'); readln(s1); write('Введите подстроку:'); readln(s2); writeln('RightPosition=',RightPosition(s1,s2)); readkey End.{Right1} Program Right2; Uses crt; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 Var s1,s2:string; Function RightPosition(str1,str2:string):byte; function Invert(str:string):string; var i:integer; s:string; begin s:=''; for i:=1 to length(str) do s:=copy(str,i,1)+s; Invert:=s end;{Invert} Begin RightPosition:=length(str1)-pos(Invert(str2), Invert(str1))+1length(str2)+1; End; {RightPosition} Begin Textbackground(7); Textcolor(blue); Clrscr; write('Введите строку:'); readln(s1); write('Введите подстроку:'); readln(s2); writeln('RightPosition=',RightPosition(s1,s2)); readkey End.{Right2} К с и м в ол у с т р оки м ож н о об р а т и т ьс я т а кж е, ка к к эл ем ен т у одн ом ер н ого м а с с и в а . На пр и м ер , чт об ы об р а т и т ьс я к 3-м у с и м в ол у с т р оки s дос т а т очн о ука за т ь s[3]. К а к, и с пол ьзуя пр едш ес т в ующее за м еча н и е, м ож н о и зм ен и т ь фун кци ю Invert? П ри описании переменных типаString можно ограничить максималь но возможную длинустроки константой N типаbyte: Const N=50; Var Идентификатор_строки: String[N]; Рассмотримещ е однузадачуобработки текстовой инф ормации. За д а ча 2. Д ляболь ш инствасущ ествитель ных, оканчиваю щ ихсяна– он ок и –eн ок, множественное число образуетсяотдругой основы. К акправило, э то происходитпо образцу: цыпленок– цыплята, мыш онок– мыш атаи т.д. (в н ов ой ос н ов е пер ед пос л едн ей б укв ой m пи ш ет с я а и л и я в за в и с и м ос т и от пр едыдущей б укв ы: ес л и эт о ш и пяща я, т о а, и н а че - я ). И мею тсяслова-исклю чения, изкоторых укажемследую щ ие: ребенок(дети), бесенок(бесенята), опенок (опята), звонок(звонки), позвонок(позвонки), подонок(подонки), жаворонок (жаворонки), бочонок(бочонки). П усть дан русский текст, словакоторого разделены пробелами, запятой или точкой . В се слова, оканчиваю щ иесяна–он ок и –ен ок, представь те во множественномчисле. ♣ Т екстбудемчитать впеременную s типаstring. В цикле будемпросматривать буквы текстаслеванаправо. П озицияпросматриваемой буквы хранится впеременной i.
6 Кактоль ко обнаруживаетсясочетание букв–он ок или –ен ок, происходит выделение слова. Д ляэ того впеременной osnova накапливаю тсябуквы, предш ествую щ ие сочетанию –н ок, до тех пор, покане будетсчитан разделитель слов(т очка , пр об ел и л и за пят а я) или не закончитсятекст. Затемкзначению переменной osnova добавляетсябуквосочетание –н ок. Е сли выделенное слово являетсяисклю чением, то множественное число определяетсянепосредственно. В противномслучае, если впеременной osnova предпоследняябукваоказываетсяш ипящ ей , то кзначению переменной osnova (б езпос л едн ей б укв ы) добавляетсябуквосочетание –а т а , иначе –ят а . О бразованное множественное число сохраняетсявпеременной mnogo. П еременнаяp исполь зуетсядляхраненияпозиции буквы при ф ормировании основы слова. Л огическаяпеременнаяf хранит ответнавопрос: “Являетсяли слово исклю чением?” ♠ Program Multi; Uses crt; Var s:string; slovo, osnova, mnogo:string[20]; p,i:byte; f:boolean; Begin Textbackground(7); Textcolor(blue); Clrscr; writeln('Введите текст:'); readln(s); i:=5; while i=, =e do begin multy_(cur,sq,cur); div_(cur,(-1)*(2*n+2)*(2*n+3)); inc(n); add_(res,cur,res) end; end;{Sin_} Begin Textbackground(7); Textcolor(blue); Clrscr; writeln('* Введите комплексное число *'); write('вещественная часть: '); readln(z.re); write('мнимая часть: '); readln(z.im); writeln('* Введите точность вычислений eps *'); repeat readln(eps) until eps>0; sin_(z,eps,sin_z); {вывод результата}
14 write('Синус равен ',sin_z.re:5:3); if sin_z.im>=0 then write('+'); write(sin_z.im:5:3,'*i'); readkey End.{ComplexSin} Н апиш емпрограмму, работаю щ ую с записями - датами. За д а ча 4. Ст о лет с ем ье. С оставь те программу, печатаю щ ую датустолетнего ю билеясемь и. С то летсемь е исполнитсявдень , когдасуммарный возраст всех членовсемь и достигнетсталет. ♣ Будемсчитать , что мы пиш емпрограммудлясовременников. В э том случае встолетии будет36525 дней , потомучто вXX-мстолетии было 25 високосных лет(2000 год б ыл в и с окос н ым , т а к ка к 2000 дел и т с я н а 400). Когдачисло дней , прожитых всеми членами семь и, будетравно 36525, можно объявить “столетний ” ю билей семь и. Ч исло членовсемь и вводитсяс клавиатуры впеременную n_max. Д атустолетнего ю билеяможно най ти следую щ имобразом. П осчитать впеременной s количество прожитых дней всеми членами семь и до рождениясамого младш его членасемь и. Е сли окажется, что s боль ш е 36525, то столетний ю билей наступил до рождениямладш его членасемь и. В противномслучае надо най ти дату, котораянаступитчерез(36525 - s) дней после днярождениямладш его членасемь и. Д ляреализации описанного алгоритманамнужно реш ить три подзадачи: 1. Н ай ти число дней междудатами d1 и d2. 2. О пределить , являетсяли датаd2 более поздней , чемдатаd1. 3. Н ай ти дату, котораянаступитчерезdn дней . Рассмотримдеталь но каждую изподзадач. 1. Ч и с л одней м еж ду датам и d1 и d2 будемвычислять вф ункции days (d1,d2:data): integer. Т ип data - э то запись с полями число, месяц и год. Type year=1900..2100; month=1..12; day=1..31; data=record gd:year; mc:month; dn:day end; Д ляопределенности будемсчитать , что датаd2 позже даты d1. Т огдачисло дней междудатами d1 и d2 равно сумме числадней , прош едш их отначалагода d1.gd до началагодаd2.gd, и числадней , прош едш их отначалагодаd2.gd до даты d2, безколичествадней , прош едш их отначалагодаd1.gd до даты d1. days:=Д н ей_между_го да ми (d1,d2)+Д н ей_до _тек ущ ей_да ты (d2)Д н ей_до _тек ущ ей_да ты (d1) Д ляреализации описанного алгоритмы нужно реш ить две подзадачи: 1.1. В ычислить количество дней отначалагодаd1.gd до началагодаd1.gd. 1.2. О пределить количество дней отначалагодадо даты dt. Разберемдеталь но данные подзадачи. 1.1. Вы чи с л ени е к ол и чес тва дней от начал а года d1.gd доначал а го да d1.gd вф ункции dn_gd(d1,d2:data):integer. И скомое количество дней будемнакапливать впеременной dn, перебираявцикле годаотd1.gd до d2.gd-1. К аждый витокцикладобавляетвсумму366 дней , если год високосный , и 365 - впро-
15 тивномслучае. Д ляответанавопрос: “Являетсяли год високосным?” потребуетсялогическаяф ункция: 1.1.1. Проверк а явл яетс я л и год gd ви с ок осны м реализованав ф ункции visokos (gd:year): boolean. В современном(гр и гор и а н с ком ) календаре каждый год, номер которого делитсяна4, являетсявисокосным, заисклю чениемтех, которые делятсяна100 и не делятсяна400. Н апример, 1900 - невисокосный , 2000 - високосный . 1.2 Оп редел ени е к ол и чес тва дней от начал а года додаты dt. Н апиш ем ф ункцию dn_dt(dt:data):integer. И скомое количество дней будемнакапливать в переменной dn , перебираявцикле месяцы от1 до dt.mc-1. К аждый витокцикла добавляетвсуммуколичество дней вочередноммесяце. П о заверш ению цикла кзначению переменной dn добавляетсяколичество дней dt.dn. 1.2.1. Н ахож дени е к ол и чес тва дней в м ес яц е mc года gd реализовано в ф ункции dmes (mc:month; gd:year): integer. Блокоператоровф ункции состоитиз операторавыбора. Е сли mc in [4,6,9,11], то dmes будетравно 30. Е сли mc in [1,3,5,7,8,10,12], то dmes будетравно 31. Количество дней вф еврале определяетсявзависимости оттого, являетсяли год високосным. 2. Оп редел ени е, явл яетс я л и дата d2 бол ее п оздней, чем дата d1? О твет напоставленный вопрос будетдан вф ункции pos (d1,d2:data): boolean. Значение true ф ункцияпримет, если год даты d2.gd боль ш е годадаты d1.gd и л и если год даты d2.gd равен годудаты d1.gd и (месяц даты d2.mc боль ш е месяца даты d1. mc и л и если месяц даты d2.mc равен месяцудаты d1. mc и число дней даты d2.dn боль ш е числадней вдате d1.dn). 3. Н ахож дени е даты , к оторая нас ту п и т через dn дней п осл е даты dt, оф ормимввиде процедуры bd_dt (dn:integer; var dt:data). Н овую датуудобнее считать отначалагодаdt.gd. П оэ томуотdt надо отступить назад на1 января dt.gd года. Раздатапереноситсявпрош лое, то увеличиваетсячисло дней dn на количество дней , прош едш их от началагодаdt.gd до даты gd. Будемубавлять количество дней dn сначалагодами, потоммесяцами, азатемднями. Ч тобы най ти год новой даты, нужно вычитать изdn число дней вгоду dt.gd, до тех пор, покавdn не останетсячисло, мень ш ее числадней вгоду. П ри очередномвычитании год вdt.gd увеличиваетсянаединицу. Ч тобы най ти месяц новой даты, нужно вычитать изdn число дней вмесяце dt.mc, до тех пор, покавdn не останетсячисло, мень ш ее числадней вочередноммесяце. П ри очередномвычитании месяц вdt.mc увеличиваетсянаединицу. Почем у пр и опр едел ен и и м ес яца н ов ой да т ы м ы н е пер ес т упи м р уб еж года ? О ставш еесячисло дней вdn будетчисломдней вновой дате dt.dn. 3.1. Ч исло дней вгодупосчитаемвф ункции dgod(gd:year):integer. Е сли год високосный , то внем366 дней , иначе – 365. ♠ Program Sto_let;
16 Uses crt; Const sto=36524; Type year=1900..2100; month=1..12; day=1..31; data=record gd:year; mc:month; dn:day end; Var n,n_max,s:integer; dm,dc,dr:data; Function visokos (gd:year): boolean; (* Является ли год gd високосным? *) begin visokos:=(gd mod 400=0) or (gd mod 1000) and (gd mod 4=0) end;{visokos} Function dmes (mc:month; gd:year): integer; (* Число дней в месяце mc года gd *) begin case mc of 4,6,9,11:dmes:=30; 1,3,5,7,8,10,12:dmes:=31 else if visokos(gd) then dmes:=29 else dmes:=28 end; end;{dmes} Function pos (d1,d2:data): boolean; (* Позже ли дата d2 даты d1 ?*) begin pos:=(d2.gd>d1.gd) or (d2.gd=d1.gd) and ((d2.mc>d1.mc) or (d2.mc=d1.mc) and (d2.dn>d1.dn)) end;{pos} Function days (d1,d2:data): integer; (* Число дней от даты d1 до даты d2 *) function dn_gd(d1,d2:data):integer; (* Число дней от начала года gd1 до начала года gd2 *) var dn,gd:integer; begin dn:=0; for gd:=d1.gd to d2.gd-1 do if visokos(gd) then dn:=dn+366 else dn:=dn+365; dn_gd:=dn; end;{dn_gd} function dn_dt(dt:data):integer; (* Число дней от начала года dt.gd до даты dt*) var dn,mc:integer; begin dn:=0; for mc:=1 to dt.mc-1 do dn:=dn+dmes(mc,dt.gd); dn_dt:=dn+dt.dn; end;{dn_gd}
17 begin (* days *) days:=dn_gd(d1,d2)+dn_dt(d2)-dn_dt(d1) end;{days} procedure bd_dt (dn:integer; var dt:data); (* Дата, которая наступит через dn дней после даты dt *) var mc:integer; function dgod(gd:year):integer; (* Число дней в году *) begin if visokos(gd) then dgod:=366 else dgod:=365; end;{dgod} begin (* возврат от даты dt к началу года dt.gd *) for mc:=1 to dt.mc-1 do dn:=dn+dmes(mc,dt.gd); dn:=dn+dt.dn; (* нахождение года новой даты*) while dn>dgod(dt.gd) do begin dn:=dn-dgod(dt.gd); inc(dt.gd) end; (* нахождение месяца новой даты *) dt.mc:=1; while dn>dmes(dt.mc,dt.gd) do begin dn:=dn-dmes(dt.mc,dt.gd); inc(dt.mc) end; (* нахождение дня новой даты *) dt.dn:=dn end;{bd_dt} Begin (* Sto_let *) Textbackground(7); Textcolor(blue); Clrscr; n:=1; s:=0; write('Сколько людей в семье: '); readln(n_max); writeln('* Вв еди теда ту ро жден и я ',n,'-го чл ен а с емь и *'); write('День : '); readln(dm.dn); write('Месяц: '); readln(dm.mc); write('Год : '); readln(dm.gd); while nsto then writeln('С то л етн и й ю би л ей н а с туп и л до ро жден и я мл а дш его чл ен а с емь и ') else begin bd_dt((sto-s) div n, dr); writeln('Дата столетнего юбилея:'); write('День : '); writeln(dr.dn); write('Месяц: '); writeln(dr.mc); write('Год : '); writeln(dr.gd); end; readkey End.{Sto_let} Почем у в пр оцедур е bd_dt() н ел ьзя в ос пол ьзов а т ьс я фун кци ей dn_dt()? Д ляупрощ ениядоступакполямзаписи исполь зуетсяоператор присоединения: With Переменная_типа_запись Do Оператор; Н апример, впредыдущ ей задаче датустолетнего ю билеяможно вывести так: With dr do begin write('День : '); writeln(dn); write('Месяц: '); writeln(mc); write('Год : '); writeln(gd); end; Рассмотримзадачу, вкоторой исполь зуетсямассивиззаписей . За д а ча 5. С веденияо студентах вузазаписаны вмассиве и содержатследую щ ую инф ормацию : ф амилия, имя, пол (м и л и ж ), курс (с 1-го до 5-го). Н апиш ите программу, котораявводитэ туинф ормацию и печатаетследую щ ие данные: а) номер курса, накоторомнаиболь ш ий процентмужчин; б) самые распространенные мужские и женские имена. ♣ Ч тобы реш ить поставленную задачу, нужно: 1. ввести инф ормацию о студентах вмассивиззаписей ; 2. най ти номер курса, накоторомнаиболь ш ий процентмужчин; 3. напечатать самые распространенные мужские и женские имена. Рассмотримподробнее алгоритмы второй и треть ей задач. 2. И скомый номер курсавычислимвф ункции man(). Д ляэ того най демколичество студентови количество мужчин накаждомкурсе. Н аиболь ш ий процент мужчин окажетсянакурсе, накоторомполучитсямаксималь ное отнош е-
19 ние числамужчин кчислустудентов. С итуациясовпадениядляразных курсов отнош ениячисламужчин кчислустудентовне рассматривается. О с о бы й с л уча й: чтобы программаработалаустой чиво, желатель но предусмотреть проверкунанеравенство нулю общ его числастудентовнакурсе. За чем ? 3. Распространенные мужские и женские именанапечатаемвпроцедуре name(). С ф ормируеммассивы с мужскими и женскими именами. Д лякаждого имени подсчитаемнакопленную частотуего появления(кол и чес т в о появ л ен и я i-го и м ен и с р еди и м ен с н ом ер а м и 1 .. i). Н апример, И мя В аля Аля В аля Г аля Аля Ч астота 1 1 2 1 2 Н ай деммаксимумнакопленных частоти распечатаемимена, длякоторых накопленнаячастотаравнамаксимуму. Д лянахождениянакопленных частотпо массивуимен напиш емвнутренню ю процедуруhow_many(). П ечать самых распространенных имен оф ормимво внутренней процедуре print(). ♠ Program Student_; Uses crt; Const n=7; {количество студентов} Type n_kursa = 1..5; Student = record fam,im:string[30]; pol:char; kurs:n_kursa end; st = array[1..n] of student; imena = array[1..n] of string; nomera = array[1..n] of integer; Var sp:st; {список студентов} i:integer; {счетчик цикла} function man (const sp:st): n_kursa; {н о мер к урс а , н а к о то ро м н а и бо л ь ш и й п ро цен т мужчи н } var m,k:array[1..5] of integer; p: n_kursa; {к о л и чес тв о мужчи н и в с его с туден то в н а к а ждо м к урс е} begin for i:=1 to n do begin k[i]:=0; m[i]:=0 end; for i:=1 to n do begin inc(k[sp[i].kurs]); if sp[i].pol='м' then inc(m[sp[i].kurs]) end; p:=1; for i:=2 to 5 do if (k[i]0) and (k[p]0) then if m[i]/k[i]>m[p]/k[p] then p:=i; man:=p end; {man} procedure name (const sp:st); {самые распространенные мужские и женские имена}
20 var m,w: nomera; {массивы с накопленными частотами} m_im,w_im:imena; {массивы имен} k1,k2:integer; {количество мужчин и женщин} procedure how_many (const a: imena; k:integer; var b: nomera); var i,j:integer; begin for i:=1 to k do b[i]:=0; for i:=1 to k do for j:=1 to i do if a[i]=a[j] then inc(b[i]); end; {how_many} procedure print (const a: imena; b: nomera; k:integer); var max:integer; begin max:=b[1]; for i:=2 to k do if b[i]>max then max:=b[i]; for i:=1 to k do if b[i]=max then write(a[i],' '); writeln end;{print} begin {name} {Формирование массивов имен} k1:=1; k2:=1; for i:=1 to n do with sp[i] do if pol='м' then begin m_im[k1]:=im; inc(k1) end else begin w_im[k2]:=im; inc(k2) end; k1:=k1-1; k2:=k2-1; {Подсчет частоты употребления имен} how_many(m_im,k1,m); how_many(w_im,k2,w); {Печать распространенных имен} writeln('Распространенные мужские имена:'); print(m_im,m,k1); writeln('Распространенные женские имена:'); print(w_im,w,k2); end; {name} Begin (* Student_*) Textbackground(7); Textcolor(blue); Clrscr; {заполнение массива из записей} for i:=1 to n do
21 begin writeln('* Введите информацию о ',i,'-м студенте *'); write('Фамилия : '); readln(sp[i].fam); write('Имя : '); readln(sp[i].im); write('Пол (м/ж): '); repeat readln(sp[i].pol) until (sp[i].pol='м') or (sp[i].pol='ж'); write('Курс : '); readln(sp[i].kurs); end; writeln('Наибольший процент мужчин на курсе № ', man(sp)); name(sp); readkey End. {Student_} Различаю тф иксированные и вариантные записи. Ф икс иро ва нна я з а п ис ь состоит изодних и тех же полей . В задачах 1-5 мы исполь зовали толь ко ф иксированные записи. В а риа нтна я з а п ис ь состоитизф иксированной части (с пи с ка пос т оян н ыхпол ей) и вариантной части – аль тернативных групп полей , вклю чаемых в зависимости отзначенияполяпризнака. П усть нужно определить геометрические ф игуры: окружность , прямоуголь ники треуголь ник. Д лявсех ф игур нужно указать их цвети основные характеристические параметры. О пределимтри вспомогатель ных типа– т ип ф игу р, т ип цвет ов и т очка. type tFigure = (circle, rectangle, triangle); tColor = (red, green, blue); Point = record x, y: real end; О пределимвариантную запись Ф игу ры , состоящ ую изф иксированного поляЦ вет и вариантной части. В зависимости отзначенияполяпризнакаТип ф игу ры , взапись вклю чаетсяоднаизтрех аль тернативных групп полей – основных числовых характеристикэ той ф игуры. type Figures = record {Фиксированная часть записи} color: tColor; {Вариантная часть записи} case FigureType: tFigure of circle: (center: point; radius: real); rectangle: (s1, s2: point); triangle: (t1, t2, t3: point) end; В записи с вариантами однавариантнаячасть , котораярасполагаетсяза всеми ф иксированными полями. П амять длявариантной части записи выделяетсяпод необходимую вданный моментвремени аль тернативную группуполей . Н еобходимость задаетсязначениемполяпризнака. В наш емпримере по-
22 лемпризнакомявляетсяFigureType. П редложение case… of не требуетслужебного словаend, потомучто данное предложение обозначает начало вариантной части и лиш ь внеш не похоже на оператор выбора. П осколь кувариантнаячасть стоитпосле ф иксированной , то в конце нужно ставить end какпарукrecord. Д лявыборааль тернативных групп полей , нарядус полемпризнака исполь зуетсяклю ч выбора(пер ем ен н а я и л и и м я т и па ). К л юч в ыб ор а и пол е пр и зн а ка дол ж н ы б ыт ь с т а н да р т н ым и л и пр едв а р и т ел ьн о об ъяв л ен н ым пор ядков ым т и пом . Клю чувыбораможно присваивать значениявисполняемой части программы и такимобразомвлиять навыбор полей . Реш имзадачу, вкоторой исполь зуетсямассивизвариантных записей . За д а ча 6. П усть дан ф рагмент программы: type tFigure = (circle, rectangle, triangle); tColor = (red, green, blue); Point = record x, y: real end; Figures = record {Фиксированная часть записи} color: tColor; {Вариантная часть записи} case FigureType: tFigure of circle: (center: point; radius: real); rectangle: (s1, s2: point); triangle: (t1, t2, t3: point) end; tList = array [1..20] of Figures; var List: TList; О пределите, какое количество новых цветоввозникаетврезуль тате наложенияпрямоуголь никовразличных цветов. ♣ И зусловияследует, что максималь но возможное количество новых цветовравно четырем. Н овый цветможетполучить сяпри наложении красного и зеленого, красного и синего, зеленого и синего, красного, зеленого и синего. Реш ение задачи разобь емнадве части: 1. Заполнение массиваList вариантными записями. 2. П одсчет количествановых цветов. Д ляреш ениявторой задачи сф ормируеммассивMas изцветовимею щ ихся прямоуголь ников. В логические переменные r, g, b запиш емзначение true, если имеетсясоответственно красный , зеленый , синий прямоуголь ник. В зависимости отзначений логических переменных r, g, b определимколичество новых цветов. ♠ Program New_Color; Uses crt; Const n=5; Type tFigure = (circle, rectangle, triangle);
23 tColor = (red, green, blue); Point = record x,y: real end; Figures = record Color: tColor; case FigureType: tFigure of circle: (center: point; radius: real); rectangle: (s1, s2: point); triangle: (t1, t2, t3: point) end; tList = array[1..n] of Figures; ColorRect = array[1..n] of tColor; Var List:tList;{массив из фигур} i, j, s, c:byte; Mas: ColorRect; {массив цветов прямоугольников} r, g, b: boolean; Begin Textbackground(7); Textcolor(1); Clrscr; {Чтение информации о фигурах} for i:=1 to n do begin writeln('* Введите информацию о ',i,'-й фигуре *'); {Заполнение фиксированной части записи} write('Цвет (1-красный, 2-зеленый, 3-синий)'); repeat readln(c) until (c>=1) and (c=1) and (c0. В ычислите с точность ю ε значение комплексной ф ункции: ( − 1) n z 2 n+1 z3 z5 sin z = z − + −...+ +... (2n + 1) ! 3! 5! 64. С оставь те программу , печатаю щ ую датустолетнего ю билеясемь и. С то лет семь е исполнитсявдень , когдасуммарный возраствсех членовсемь и достигнет сталет. П роведите декомпозицию задачи и напиш ите программу. 65. С веденияо сту дентах вузазаписаны вмассиве и содержатследую щ ую инф ормацию : ф амилия, имя, пол (м и л и ж ), курс (с 1-го до 5-го). Н апиш ите программу, котораявводитэ туинф ормацию и печатает следую щ ие данные: а) номер курса, накоторомнаиболь ш ий процентмужчин; б) самые распространенные мужские и женские имена. 66. В у словии задачи 6 определите, какое количество новых цветоввозникаетв резуль тате наложенияпрямоуголь никовразличных цветов, и най дите суммарную площ адь всех ф игур. 67. И споль зу яследую щ ий ф рагментпрограммы, опиш ите логическую ф ункцию Бьет (К1, К2, КМ), проверяю щ ую , «бь ет»ли картаК1 картуК2, с уче-
28 томтого, что масть КМ являетсякозырной . type масть = (пики, трефы, бубны, червы); достоинство = (шесть, семь, восемь, девять, десять, валет, дама, король, туз); карта = record м: масть; д: достоинство end; 68. И споль зу яследую щ ий ф рагментпрограммы, опиш ите логическую ф ункцию Правильный ряд (Р), проверяю щ ую , правиль но ли выставлены кости домино врядуР (р а в н а л и пр а в а я ци фр а очер едн ой кос т и л ев ой ци фр е с л едующей кос т и ). type КостьДомино = record левая, правая: 0..6 end; Ряд = array[1..28] of КостьДомино; 69. И споль зу яследую щ ий ф рагментпрограммы, опиш ите перечисленные ниже ф ункции: type Поле = record вертикаль: (a,b,c,d,e,f,g,h), горизонталь: 1..8 end; а) ф ункцияХодКоня(n1,n2) проверяет, можно ли конемс поляn1 объявить ш ах, если король находитсянаполе n2; б) ф ункцияХодФерзя(n1,n2) проверяет, можетли ф ерзь заодин ход перей ти с поляn1 ш ахматной доски наполе n2. 70. В массиве содержитсяинф ормацияо зимней сессии 4-го ку рса. С веденияо каждомстуденте (максималь ное число студентов- 150) содержатследую щ ие данные: ф амилию (до 12 символов), номер группы (от 1 до7), оценки по тремпредметам(ф ункциональ ный анализ, компь ю терные науки и численные методы). Н апиш ите программу, котораявводит э туинф ормацию и печатаетследую щ ие данные: а) процентстудентов, сдавш их э кзамены на4 и 5; б) название предмета, который был сдан лучш е всего. 71. Т очказадаетсясвоими координатами, которые могу тбыть полярными или декартовыми. Н апиш ите ф ункцию , котораяопределяетрасстояние между двумяточками. 72. Инди ви ду ал ьно е(!) задани е, которое передаетсяпреподавателю перед началомсобеседованияпо э той теме: Ном ер и н ди в и дуа л ьн ого за да н и я опр едел яет пр епода в а т ел ь! Оп и ш и те п остановк у задачи , с оздайте м атем ати чес к у ю м одел ь ее реш ени я, разработайте бл ок -с хем у и работающ у ю п рограм м у , п роведи те тес ти ровани е и отл адк у п рограм м ы , обду м айте п ол у ченны е резу л ьтаты .
Инд ивид уа л ь ны е з а д а ния 1. С оставь те процеду рудлясложениядвух площ адей , выраженных вдю й мо-
вой системе (в кв . яр да х, кв . фут а хи кв . дюйм а х) и ф ункцию длязамены дю й мовых единиц измеренияплощ ади наквадратные метры. 2. В старинужидкости и сыпу чие телаизмерялись вмерах (н а пр и м ер , м ер а ов -
3.
4.
5.
29 с а ). В одной мере умещ алось 6 гарнцев, авгарнце - 4 кварты. С таринный гарнец, исполь зовавш ий сявВ еликомкняжестве Л итовском, был равен 5,6 л, ас 1765 г. был введен новый гарнец, равный 2,82 л. Т очно такаяже система мер исполь зовалась и удругих народов, толь ко различной оказывалась величинаединиц: старинный русский гарнец - 3,28 л, аполь ский гарнец равен 3,77 л. С оставь те процедуру, подходящ ую длятого, чтобы перевести количество жидкости излю бого упомянутого видаединиц влю бой другой . В В еликобритании жидкости измеряю твгаллонах и буш елях. О дин галлон равен 4,54609 л, 8 галлоновсоставляю т буш ель . С оставь те процедурудля сложениядвух объемовжидкости, измеренных ванглий ских единицах, и ф ункцию дляпереводаколичестважидкости, измеренного влитрах, вгаллоны и буш ели. И споль зуяследую щ ий ф рагментпрограммы, напиш ите процедуруValue(x,y), котораявычисляет y - значение квадратного трехчленаax2+bx+c вкомплексной точке x. type complex = record re, im: real end; coeff = record a, b, c: complex {a0} end; П усть даны комплексное число z (па р а в ещес т в ен н ыхчи с ел ) и вещ ественное число ε >0. В ычислить с точность ю ε значение комплексной ф ункции: n −1 −1) z n ( z2 z3 ln(1 + z ) = z − + −...+ +... , z < 1 . 2 3 n И споль зуяследую щ ий ф рагментпрограммы, опиш ите ф ункцию длянахожденияминималь ного отрицатель ного числаизспискачисел. const MaxN=30; type ВещТип = record знак: boolean; мантисса, порядок: real end; список = array [1..MaxN] of ВещТип; И споль зуяследую щ ий ф рагментпрограммы, опиш ите процедуруDP(d,p), преобразую щ ую координаты точки наплоскости издекартовых d вполярные p, и процедуруPD(p,d), выполняю щ ую обратное преобразование. type декарт = record x,y: real end; поляр = record r, fi: real {r ≥ 0, 0 ≤ fi< 2π } end; С веденияоб ученике состоят изего имени и ф амилии, названиякласса(года об учен и я и б укв ы), вкоторомон учится, оценок, полученных ученикомза последню ю четверть . П усть дан массив, содержащ ий сведенияоб учениках ш колы. С ф ормируй те массивизлучш их учениковш колы, то есть изучеников, не имею щ их отметокниже “четырех” и по сумме балловне уступаю щ их другимученикамсвоего и параллель ного классов. Багаж пассажирахарактеризуетсяколичествомвещ ей и общ имвесомвещ ей . П усть дан массив, содержащ ий инф ормацию о багаже несколь ких пассажиров. Д ай те сведенияо багаже, число вещ ей вкоторомне мень ш е, чемвлю бомдругомбагаже, авес вещ ей не боль ш е, чемвлю бомдругомбагаже с э тимже количествомвещ ей .
(
6.
7.
8.
9.
)
30 10. П у сть дан массив, содержащ ий сведенияоб игруш ках: указываетсяназвание игруш ки (н а пр и м ер , кукл а , куб и ки , м яч, кон с т р укт ор и т .д.), ее стоимость и возрастные границы детей , длякоторых игруш капредназначена(н а пр и м ер , дл я дет ей от 2 до 5 л ет ). П олучите инф ормацию о названиях игруш ек, цена которых не превыш аетn рублей и которые подходятдетямдо k лет. 11. С оставь те программу , котораябудетпечатать все годы и В аш возраствэ ти годы, когдаВ ы праздновали (б удет е пр а здн ов а т ь) день своего рожденияв тот же день недели, когдаВ ы родились . И сходное данное – датаВ аш его рождения. 12. П у сть дан массив, содержащ ий сведенияо претендентах нарукуи сердце. С ведениямогутсодержать следую щ ие данные: ф амилию , имя, отчество, возраст, рост, зарплату, наличие квартиры и т.п. С ф ормулируй те несколь ко критериев, по которымпретенденты будутотбирать ся. Н апиш ите программу, предназначенную длявводаданных о претендентах и печати сведений о наиболее подходящ их кандидатоввзависимости оттого или иного критерия. 13. П у сть дан массив, содержащ ий сведенияо продаваемых квартирах. С ведениямогут содержать следую щ ую инф ормацию : общ аяплощ адь , жилаяплощ адь , площ адь кухни, наличие лоджии, э таж, общ ее количество э тажей в доме, адрес, стоимость квартиры и т.п. С ф ормулируй те несколь ко критериев, по которымможно отбирать туили иную квартирудляпокупки и, основываясь наэ тих критериях, выведите сведенияо ней . 14. П у сть дан массив, содержащ ий сведенияо жителях, обслуживаемых данной поликлиникой . С ведениясодержатследую щ ую инф ормацию : ф амилию , имя, отчество жителя, адрес, место работы, датупрохожденияпоследней ф лю орограф ии, наличие прививки от диф терии. Н апечатай те ф амилии и адресатех жиль цов, которые не сделали прививкуотдиф терии. Распечатай те ф амилии и местаработы жиль цов, укоторых просроченаф лю орограф ия (да т а пр ос р очен а , ес л и с ее м ом ен т а пр ош л о б ол ьш е года ). 15. С веденияо каждой маш ине вклю чаю твсебяследу ю щ ую инф ормацию : модель , номер (код р еги он а , ци фр ов ой код, б укв ен н ый код), цвет, сведенияо владель це (фа м и л и я, и м я, от чес т в о), датапоследнего техосмотра. В ыберите данные обо всех маш инах, непрош едш их техосмотр втекущ емгоду. П о номерумаш ины выдай те всю инф ормацию о ней . 16. О пределите, насколь ко количество прямоу голь никовкрасного цветапревыш ает суммарное количество кругови треуголь никовзеленого цвета. Ф игуры описываю тсятакже, каквзадаче 6.
©
31
С оставители: В асиль евВ алерий В икторович, Х ливненко Л ю бовь В ладимировна
Редактор
Т ихомироваО .А.