Ф Е Д Е РАЛ Ь Н О Е АГ Е Н Т С Т В О П О О БРАЗО В АН И Ю В О РО Н Е Ж С КИ Й Г О С У Д АРС Т В Е Н Н Ы Й У Н И В Е РС И Т Е Т
Языкпрограммирования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<=length(s)+1 do begin {в ы дел ен и ео с н о в ы с л о в , о к а н чи в а ю щ и хс я н а –о н о к и -ен о к } if (copy(s,i-4,4)='онок') or (copy(s,i-4,4)='енок') then begin osnova:=''; p:=i-4; repeat osnova:=s[p]+osnova; p:=p-1 until (p=0) or (s[p] in [' ',',','.']); slovo:=osnova+'нок'; f:=false; {проверка совпадения слова с исключением} if slovo='ребенок' then begin mnogo:='дети'; f:=true end; if slovo='бес ен о к ' then begin mnogo:='бес ен ята '; f:=true end; if slovo='опенок' then begin mnogo:='опята';f:=true end; if slovo='звонок' then begin mnogo:='звонки';f:=true end; if slovo='п о з в о н о к ' then begin mnogo:='п о з в о н к и ';f:=true end; if slovo='п о до н о к ' then begin mnogo:='п о до н к и ';f:=true end; if slovo='жа в о ро н о к ' then begin mnogo:='жа в о ро н к и ';f:=true end; if slovo='бо чо н о к ' then begin mnogo:='бо чо н к и '; f:=true end; {образование множественного числа и вывод на экран} if not(f)
7 then if osnova[length(osnova)-1] in ['ч','ш','щ'] then mnogo:=copy(osnova,1,length(osnova)-1)+'ата' else mnogo:=copy(osnova,1,length(osnova)-1)+'ята'; writeln(slovo,' - ',mnogo); end; i:=i+1 end; readkey End.{Multi} О перации отнош ения=, <>, <, >, >=, <= можно выполнять над строками. С троки сравниваю тсяпосимволь но слеванаправо. И здвух строкболь ш е та, где обнаруживаетсясимвол, код которого боль ш е кодасоответствую щ его символа другой строки. Е сли сравниваемые строки разной длины, то недостаю щ ие символы более короткой строки заменяю тсязначениемchr(0). С равнение строкисполь зуетсявзадачах, связанных с сортировкой . Рассмотримтакую задачу. За д а ча 3. П усть текстпредставляетсобой последователь ность строк. Н а каждой строке находитсяф амилия, имяи отчество. Распечатай те текст, содержащ ий строки, состоящ ие толь ко изф амилий и имен, атакже все отчествапо алф авиту. ♣ С троки текстабудемсчитать э лементами одномерного массиваа. В ыделимизкаждой строки подстроку, содержащ ую ф амилию и имя. Д ляэ того впеременной s будемнакапливать символы изстроки a[i] до тех пор, покане встретитсявторой пробел. Количество обнаруженных пробеловбудемсчитать впеременной f (фл а г). В ыведемнаэ кран ф амилию и имя, азатемудалимданную подстрокуиз строки a[i]. В строке останетсятоль ко отчество. У порядочиммассивизотчеств методомсортировки выбором. Распечатаемупорядоченный массив. ♠ Program Stroki; Uses crt; Const n=3; Var a:array [1..n] of string[100]; max, s: string[100]; p,f,i,j:byte; Begin Textbackground(7); Textcolor(blue); Clrscr; writeln('Введите фамилии,имена и отчества:'); for i:=1 to n do readln(a[i]); {Вывод текста из фамилий и имен} for i:=1 to n do begin s:=''; f:=0; j:=1; repeat s:=s+copy(a[i],j,1);
8 if copy(a[i],j,1)=' ' then f:=f+1; inc(j) until f=2; writeln(s); delete(a[i],1,length(s)); end; {Вывод отчеств в алфавитном порядке} for i:=n downto 1 do begin max:=a[1]; p:=1; for j:=2 to i do begin if max
9 заглавных букв. ♠ Program Shifr_Cezar; Uses crt; Var s:integer; a:char; Begin Textbackground(7); Textcolor(blue); Clrscr; write('Введите величину скачка для шифра Цезаря'); readln(s); writeln('Введите текст:'); while not eoln do begin read(a); if a in ['А'..'Я'] then write(chr(ord('А')+(ord(a)-ord('А')+s) mod 32)) else write(a); end; readkey End.{Shifr_Cezar} П ознакомимсяс более сложнымалгоритмомш иф рованиятекстов, основаннымнаш иф ре Ц езаря. АлгоритмГ ронсф ель дапредполагаетналичие ш иф ра - клю ча, представляю щ его собой n-значное число. Ц иф ры n-значного числаопределяю тклю чи ш иф раЦ езаря(кол и чес т в а б укв , чер езкот ор ые дел а ет с я с ка чок). Буквы текстаразбиваю тсянагруппы по n (с и м в ол ы, н е яв л яющи ес я б укв а м и , и гн ор и р уют с я). П ервые буквы вкаждой группе ш иф рую тсяпо алгоритму Ц езаряс клю чом, равнымпервой циф ре n-значного числа. В торые буквы вкаждой группе ш иф рую тсяпо алгоритмуЦ езаряс клю чом, равнымвторой циф ре n-значного числаи т.д. За д а ча 5. Ш иф р Гронс ф ельда. Заш иф руй те русские заглавные буквы в тексте кодомГ ронсф ель да. Н апример, если клю ч k=1223, то вместо ф разы УЧЕНЬ Е - СВЕТ! должно получить сяФ Щ ЗРЭЗ - УЕЖ Ф ! Об р а т и т е в н и м а н и е н а т о, чт о одн и и т е ж е б укв ы ш и фр уют с я пор а зн ом у! ♣ Д ляш иф рованиясимволаa по алгоритмуЦ езаряс клю чомс напиш ем ф ункцию Shifr(a:char; c:cifra):char. В основной программе циф ры клю чаk запиш емводномерный массивkod:array[0..n-1]. Ч итаятекст, будемсчитать количество русских заглавных букввпеременной i. О статокотцелочисленного деленияi наn определяетпозицию буквы вгруппе. С ледователь но, клю чомш иф ра Ц езарядлябуквы являетсяциф раизмассиваkod, стоящ аяпод номером, равнымпозиции буквы вгруппе. ♠ Program Shifr_Gronsfeld; Uses crt; Const n=5; Type cifra=0..9; Var i,k:integer; kod:array[0..n-1] of cifra; a:char;
10 function Shifr(a:char; c:cifra):char; var i:integer; begin Shifr:=chr(ord('А')+(ord(a)-ord('А')+c) mod 32) end;{Shifr} Begin Textbackground(7); Textcolor(blue); Clrscr; write('Введите ключ для шифра Гронсфельда: '); readln(k); for i:=n-1 downto 0 do begin kod[i]:=k mod 10; k:=k div 10 end; writeln('Введите текст:'); i:=0; while not eoln do begin read(a); if a in ['А'..'Я'] then begin write(Shifr(a,kod[i mod n]));inc(i) end else write(a); end; readkey End.{Shifr_Gronsfeld} Попр об уйт е пр и дум а т ь с в ой а л гор и т м ш и фр ов а н и я т екс т ов !
2. За п ис и, о п ера то р п рис о ед инения За п ис ь являетсяструктурированнымтипомданных. Запись является структурой данных, состоящ ей изкомпонент. Компонентзаписи называется п о л ем . В отличие от массива, полязаписи могутбыть разных типов. Каждое поле записи имеетсвое имя, определяемое при описании. И мена полей одной и той же записи должны быть различны. И менаполей различных записей могутсовпадать . П олязаписи могутбыть простого и структурированного типа(в т ом чи с л е м а с с и в ом и за пи с ью). Записи могутиметь вложенную структуру. У ровень вложенности записей ограничиваетсямаксималь нымразмеромлю бой структуры. Т о есть объемпамяти, необходимый дляхранениязначений всех полей записи, не должен превыш ать 65520 бай т. И менаполей одной записи могут повторять сянаразных уровнях вложенности. В общ емвиде тип записи объявляетсятак: имя типа = record список полей end; С писокполей состоитизописаний полей записи, разделенных точками с запятыми. Ч тобы описать поле записи, нужно указать имяполя(и ден т и фи ка т ор ), поставить двоеточие и указать тип поля. О бъявимзапись , описываю щ ую длину, заданную вдю й мовой системе измерения. type dlina = record yard:0..maxint;
11 fut:0..2; dyum:0..11 end; В настоящ ее времянаиболее распространенной являетсяметрическаясистемамер, основаннаянадесятичной системе счисления. Д о сих пор внекоторых местах исполь зую тдю й мовую системуизмерениядлин. 1 дю й м≈ 2,54 см. 12 дю й мовсоставляю тф ут. 3 ф утаравны 1 ярду. С огласно легенде, э талон ярда был установлен вАнглии в1101 г. (яр д р а в н ял с я р а с с т оян и ю от кон чи ка н ос а кор ол я Ген р и ха I до кон чи ка б ол ьш ого па л ьца его в ыт ян ут ой р уки ). За д а ча 1. С оставь те программу, заменяю щ ую дю й мовые единицы длины наметрические. Program Dyum_system; Uses crt; Type dlina = record yard:0..maxint; fut:0..2; dyum:0..11 end; Var d:dlina; Begin Textbackground(7); Textcolor(blue); Clrscr; Writeln('* Вв еди тедл и н у в дю ймо в о й с и с темеи з мерен и я *'); Write('Ярды: '); Readln(d.yard); Write('Футы: '); Readln(d.fut); Write('Дюймы: '); Readln(d.dyum); Write('В метрической системе длина = '); Write((d.dyum+12*d.fut+36*d.yard)*0.0254:7:4,' м'); readkey End.{Dyum_system} Ч и т а т ь и в ыв оди т ь за пи с ь м ож н о т ол ько поэл ем ен т н о, ес л и дл я эл ем ен т ов за пи с и опр едел ен ы опер а ци и в в ода -в ыв ода . С с ыл ка н а эл ем ен т за пи с и ос ущес т в л яет с я по и м ен и пер ем ен н ой т и па за пи с ь и и м ен и пол я, р а здел ен н ыхт очкой! С о с та вно е им я - имяэ лементасоставной структуры данных, состоящ ее изимени структуры, имен компонент(в кот ор ые в л ож ен да н н ый эл ем ен т ) и имени э лемента, разделенных точками. За д а ча 2. С оставь те программудлясложениядвух расстояний , измеренных вдю й мовой системе. Program Add_dyum; Uses crt; Var a,b,r:record yard:0..maxint; fut:0..2; dyum:0..11 end; s:integer; Begin Textbackground(7); Textcolor(blue); Clrscr; Writeln('* Вв еди тедл и н у a в дю ймо в о й с и с темеи з мерен и я *'); Write('Ярды: '); Readln(a.yard); Write('Футы: '); Readln(a.fut);
12 Write('Дюймы: '); Readln(a.dyum); Writeln('* Вв еди тедл и н у b в дю ймо в о й с и с темеи з мерен и я *'); Write('Ярды: '); Readln(b.yard); Write('Футы: '); Readln(b.fut); Write('Дюймы: '); Readln(b.dyum); Write('Сумма длин a и b = '); s:=a.dyum+b.dyum; r.dyum:=s mod 12; s:=s div 12 + a.fut + b.fut; r.fut:=s mod 3; r.yard:=s div 3+a.yard+b.yard; Write(r.yard,' ярд. ',r.fut,' ф ут. ',r.dyum,' дю йм.'); readkey End.{Add_dyum} Каки вмассивах, значенияпеременных типазапись можно присваивать другимпеременнымтого же типа. Н апример, длянаписанной выш е программы допустимоператор присваиванияa:=b. Значениявсех полей записи b будут присвоены соответствую щ имполямзаписи a. За д а ча 3. П усть даны комплексное число z (па р а в ещес т в ен н ыхчи с ел ) и вещ ественное число ε >0. В ычислить с точность ю ε значение комплексной
( − 1) z 2 n+1 z3 z5 +... . ф ункции: sin z = z − ! + ! −...+ ( n 3 5 2 + 1) ! n
♣ О пиш емтип Complex – запись с полями Re (в ещес т в ен н а я ча с т ь ком пл екс н ого чи с л а ) и Im (м н и м а я ча с т ь ком пл екс н ого чи с л а ) вещ ественного типа. Аргументz и резуль тат sin_z искомой ф ункции объявимпеременными типа Complex. Ч лен рядаТ ей лора(с м . ус л ов и е за да чи ) можетбыть задан с помощ ь ю следую щ ей рекуррентной ф ормулы: ( − 1) ⋅ z 2 z = z , n = 0,1,2,... zn+1 = z ( 2n + 2)( 2n + 3) n , 0 Д лявычислениятекущ его членаряданампотребуетсяпроцедура multy_(z1,z2, var res), возвращ аю щ аярезуль татумножениякомплексных чисел z1 и z2 впеременной res. Н апомним, что произведение комплексных чисел, заданных валгебраической ф орме, вычисляетсяпо ф ормуле:
z1 ⋅ z2 = (a1 ⋅ a2 − b1 ⋅ b2 ) + (a1 ⋅ b2 + b1 ⋅ a2 ) ⋅ i . 2
П остоянный множитель z имеетсмысл вычислить впеременной sq один развблоке установки началь ных значений . Д ляделенияпроизведения z ⋅ zn на − ( 2n + 2)( 2n + 3) понадобитсяпроцедураделенияdiv_(var z, r) комплексного числаz нацелое r. Ч тобы складывать члены ряданапиш емпроцедуруadd_(z1,z2, var res), возвращ аю щ ую резуль татсложениякомплексных чисел z1 и z2 впеременной res. Комплексный синус будемвычислять впроцедуре Sin_(z; el; var res). О рганизуемитерационные вычисления. В переменной res будемнакапливать сумму 2
13 членоврядадо тех пор, покаочередной член рядаcur не станетмень ш е заданной точности e. Д лямонотонно убываю щ их по модулю знакочередую щ ихсярядовостаток вряде Т ей лоране превосходит первого отбрасываемого члена. ♠ Program ComplexSin;Uses crt;Type complex=record re, im: real end;{комплексное число} Var eps:real; z,sin_z:complex; function abs_(z:complex):real; {мо дул ь к о мп л ек с н о го чи с л а } begin abs_:=sqrt(sqr(z.re)+sqr(z.im)) end;{abs_z} procedure Add_(z1,z2:complex; var res:complex); {сложение комплексных чисел z1 и z2} begin res.re:=z1.re+z2.re; res.im:=z1.im+z2.im end;{Add_} procedure multy_(z1,z2:complex; var res:complex); {умножение комплексных чисел z1 и z2} begin res.re:=z1.re*z2.re-z1.im*z2.im; res.im:=z1.re*z2.im+z1.im*z2.re end;{multy_} procedure div_(var z:complex; r:integer); {дел ен и ек о мп л ек с н о го чи с л а z н а цел о е r} begin if r<>0 then begin z.re:=z.re/r; z.im:=z.im/r end; end;{div_} procedure Sin_(z:complex; e:real; var res:complex); {вычисление комплексной функции sin(z)} var cur,sq:complex; n:integer; begin multy_(z,z,sq); {в ы чи с л ен и ек в а дра та z} res:=z; cur:=z; n:=0; {ус та н о в к а н а ча л ь н ы х з н а чен и й} while abs_(cur)>=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 100<>0) 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 n
18 begin s:=s+n*days(dm,dc); dm:=dc end; inc(n) end; dr.gd:=dm.gd; dr.mc:=dm.mc; dr.dn:=dm.dn; if s>sto 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<=3); case c of 1: List[i].Color:=Red; 2: List[i].Color:=Green; 3: List[i].Color:=Blue end; {Чтение значения поля признака} write('Форма (1-круг, 2-прямоугольник, 3-треугольник)'); repeat readln(c) until (c>=1) and (c<=3); case c of 1: List[i].FigureType:=Circle; 2: List[i].FigureType:=Rectangle; 3: List[i].FigureType:=Triangle end; {Заполнение вариантной части записи} with List[i] do case FigureType of Circle: begin write('Координаты центра: '); readln(center.x, center.y);
24 write('Радиус : '); readln(radius); end; Rectangle: begin write('Координаты точек на диагонали: '); readln(s1.x, s1.y, s2.x, s2.y) end; Triangle: begin write('Координаты вершин треугольника: '); readln(t1.x, t1.y, t2.x, t2.y, t3.x, t3.y) end; end; end; {Подсчет количества новых цветов} s:=0; j:=0; for i:=1 to n do with List[i] do if FigureType=Rectangle then begin inc(j); Mas[j]:=Color end; c:=j; {количество прямоугольников} r:=false; g:=false; b:=false; for i:=1 to c do begin if Mas[i]=Red then r:=true; if Mas[i]=Green then g:=true; if Mas[i]=Blue then b:=true; end; if r and g then s:=s+1; if r and b then s:=s+1; if b and g then s:=s+1; if r and g and b then s:=s+1; writeln('Количество новых цветов = ',s); readkey End.{New_Color} М ассивMas можно было заполнить цветами прямоуголь никовпри вводе инф ормации о ф игурах. М ы разделили впрограмме блоки вводаи обработки вариантных записей дляучебных целей , чтобы показать , какзаписать и получить доступ каль тернативнымгруппамполей . Подгот ов ьт ес ь к от в ет а м н а в се(!) кон т р ол ьн ые в опр ос ы и в ыпол н и т е в се(!) кон т р ол ьн ые за да н и я. Дор огу ос и л и т и дущи й!
Ко нтро л ь ны е во п ро с ы и з а д а ния
25 1. С тро ко вы й тип 1. Д лячего ну жен строковый тип данных? К какимтипамданных он относится? 2. Ч то представляетсобой строковый тип данных? 3. О пиш ите дваподходакреализации строк? 4. Какое максималь но возможное количество символовможетсодержать строка? 5. Ч то такое общ аяи ф актическаядлинастроки? 6. Ч то находитсявэ лементе с индексом0 строки типаstring? 7. Д лячего ну жен символ NULL? К акещ е он обозначается? 8. Ч то такое ASCIIZ-строки? Каковаих общ аядлина? 9. Какописать ASCIIZ-строку ? 10. Ч то находитсявмоду ле Stings.tpu? П риведите примеры процедур и ф ункций . 11. О пиш ите синтаксис и назначение ф у нкций и процедур дляобработки строк тип string. 12. В какомслу чае процедураval() возвращ аетвтреть емпараметре число, отличное от нуля? 13. М ожно ли ограничить максималь ну ю длинустроки типаstring? 14. Какимобразомвпеременну ю типаstring можно поместить конкретное значение? 15. М ожетли впроцессе выполненияпрограммы изменять сяф актическаядлина строки? 16. Ч емотличаетсятип string[n] отодномерного массивас им волов array[0..n] of char? 17. М ожно ли кэ лементустроки обратить сятакже, каккэ лементуодномерного массива? 18. Какпроисходитсравнение строк? 19. Н апиш ите ф у нкцию rightposition, котораяполучаетдвапараметраstr1 и str2 типаstring и возвращ аетпозицию началапоследнего появленияstr2 вstr1. 20. Д ляболь ш инствасу щ ествитель ных, оканчиваю щ ихсяна– он ок и –eн ок, множественное число образуетсяотдругой основы. К акправило, э то происходитпо образцу: цыпленок– цыплята, мыш онок– мыш атаи т.д. (в н ов ой ос н ов е пер ед пос л едн ей б укв ой m пи ш ет с я а и л и я в за в и с и м ос т и от пр едыдущей б укв ы: ес л и эт о ш и пяща я, т о а, и н а че я ). И мею тсясловаисклю чения, изкоторых укажемследую щ ие: ребенок(дети), бесенок(бесенята), опенок(опята), звонок(звонки), позвонок(позвонки), подонок(подонки), жаворонок(жаворонки), бочонок(бочонки). П усть дан русский текст, словакоторого разделены пробелами, запятой или точкой . В се слова, оканчиваю щ иесяна–он ок и –ен ок, представь те во множественномчисле. 21. Каксравниваю тсястроки одинаковой длины? Разной длины? 22. П у сть текстпредставляетсобой последователь ность строк. Н акаждой строке находитсяф амилия, имяи отчество. Распечатай те текст, содержащ ий
26 строки, состоящ ие толь ко изф амилий и имен, атакже все отчествапо алф авиту. 23. В чемзаклю чаетсяалгоритмЦ езаряш иф рованиятекстов? П риведите пример. 24. Д лячего слу житф ункцияeoln? 25. Заш иф ру й те русские заглавные буквы втексте кодомЦ езаря. В еличина скачка- входное данное. 26. П очемувпрограмме Shifr_Cezar беретсяостатокотцелочисленного деления на32, ане на33? 27. В чемзаклю чаетсяалгоритмГ ронсф ель даш иф рованиятекстов? П риведите пример. 28. Заш иф ру й те русские заглавные буквы втексте кодомГ ронсф ель да. 29. В ыясните, имею тсяли среди вводимых символоввсе бу квы, входящ ие в слово “др узья” . 30. Н апиш ите ф у нкцию revpositn, котораяполучаетдвапараметраstr1 и str2 типаstring и возвращ аетпозицию началапервого появлениявstr1 текста, содержащ его литеры str2 вобратномпорядке. Н апример, revpositn(‘внеш нос т ь’, ‘с он’) должно возвратить 5, потомучто подстрока‘нос ’ (пер ев ер н ут ое ‘с он’) содержитсявслове ‘внеш нос т ь’, начинаяс 5-й позиции. Заметимтакже, что revpositn (‘внеш нос т ь’, ‘нос ’) дает0. 31. Инди ви ду ал ьно е(!) задани е, которое передаетсяпреподавателю перед началомсобеседованияпо э той теме: Ном ер и н ди в и дуа л ьн ого за да н и я опр едел яет пр епода в а т ел ь! Оп и ш и те п остановк у задачи , с оздайте м атем ати чес к у ю м одел ь ее реш ени я, разработайте бл ок -с хем у и работающ у ю п рограм м у , п роведи те тес ти ровани е и отл адк у п рограм м ы , обду м айте п ол у ченны е резу л ьтаты . Заш иф руй те текст, состоящ ий изнесколь ких строк, по собственномуалгоритму. 2. За п ис и, о п ера то р п рис о ед инения 32. К какимтипамданных относитсязапись ? 33. Ч то такое поле записи? 34. Ч емзапись отличаетсяотмассива? 35. М огу тли совпадать именаполей ? О бъясните ответ. 36. Какого типамогу тбыть полязаписи? 37. Каковмаксималь но допу стимый уровень вложенности записей ? 38. Каквобщ емвиде объявляетсятип записи? 39. Какзадаетсяполе записи? 40. О пиш ите комбинированный тип дляопределенияследу ю щ его понятия: а) бланктребованиянакнигу(сведенияо книге: ш иф р, автор, название; сведенияо читателе: номер читатель ского билета, ф амилия, датазаказа); б) э кзаменационнаяведомость (предмет, номер группы, датаэ кзамена, 25 строчекс полями: ф амилиястудента, номер его зачетной книжки, э кзаменационнаяоценка).
27 41. Какосу щ ествляетсяввод-вывод записей ? 42. Ч то такое составное имя? 43. Какосу щ ествляетсяссылканакомпоненты записи? 44. В сегдали работас записями сводитсякработе с ее компонентами? О боснуй те свой ответ. 45. Ч то такое оператор присоединения? К аковего ф ормат? 46. Какполу чить доступ кполю записи вмассиве иззаписей ? 47. Какполу чить доступ кэ лементумассива, являю щ егосяполемзаписи? 48. Ч то такое ф иксированные записи? В ариантные записи? 49. И зкаких частей состоитзапись с вариантами? 50. Когдаприменяетсязапись с вариантами? 51. Ч то такое поле признака? 52. Г де располагаетсявариантнаячасть записи? 53. Какописываю тсякомпоненты каждого вариантазаписи? 54. Какможно оценить объемпамяти, выделяемой длязаписи с вариантами? 55. П очемуввариантной части записи не ставитсяслово end, закрываю щ ее оператор case… of? 56. Ч то такое клю ч выбора? Какого типаможетбыть клю ч выбора? 57. Какчерезклю ч выборавлиять навыбор аль тернативных гру пп полей ? 58. В ерно ли, что все полязаписи должны быть разных типов? 59. Какзаписать инф ормацию вполе изаль тернативной гру ппы? 60. Какполу чить доступ кинф ормации изполяаль тернативной группы? 61. С оставь те программу , заменяю щ ую дю й мовые единицы длины наметрические. 62. С оставь те программудлясложениядву х расстояний , измеренных вдю й мовой системе. 63. П у сть даны комплексное число z (па р а в ещес т в ен н ыхчи с ел ) и вещ ественное число ε >0. В ычислите с точность ю ε значение комплексной ф ункции: ( − 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 {a<>0} 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
С оставители: В асиль евВ алерий В икторович, Х ливненко Л ю бовь В ладимировна
Редактор
Т ихомироваО .А.