Курсовая работа: Работа с текстовыми строками, двумерными массивами, файловыми структурами данных
Название: Работа с текстовыми строками, двумерными массивами, файловыми структурами данных Раздел: Рефераты по информатике Тип: курсовая работа | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Оглавление 1 Задание №1. 1.1 Блок-схема программы. 1.2 Работа программы 2 Задание №2. 2.1 Блок-схема программы 2.2 Работа программы. 3 Задание №3. 3.1 Блок-схема программы 3.2 Работа программы 4 Задание №4. 4.1 Работа программы 5 Задание №5. 5.1 Блок-схема программы 5.2 Работа программы 6 Заключение. 7 Список используемой литературы. 8 Приложения А 9 Приложение Б 10 Приложение В 11 Приложение Г 12 Приложение Д 1 Задание №1Подсчитать количество слов последовательности, начинающихся с большой буквы и оканчивающихся цифрой. Напечатать слова, содержащие задаваемую цепочку символов и хотя бы один знак. 1.1 Блок-схема программы
Работа программы Основное тело программы. Begin Задаем переменные, которая будет обозначать о наличии введенного текста и признака продолжения работы программы. Vvod:=False; Cont:=True; while Cont do Begin Очмщаем экран для удобства ввода и вывода информации. clrscr; Выводим меню с номерами команд, которое можно увидеть на рисунке 1. Рисунок 1 – главное меню первой программы. menu; write('Vvedite komandu: '); Считываем команду в переменную Rem. readln(Rem); Распознаем команду и выберем необходимые функции для выполнения в соответствии с введенном знаком. case Rem of '0': Cont:=False; '1': begin Считываем введенную строку в переменную Txt и присваиваем Vvod значение True, показывая, что текст введен. writeln('Text:'); readln(Txt); Vvod:=True; end; '2': begin Если текст не введен то выводится соответствующее сообщение, в противном случае запускается функция вывода слова с максимальным количеством букв, расположенных в алфавитном порядке. if Not Vvod then writeln('Ne vveden text') else alfslovo(Txt); end; '3': begin Аналогично предыдущему, только запускается функция подсчета количества симметричных слов больше чем два знака. if Not Vvod then writeln('Ne vveden text') else colsimmslovo(Txt); end; '4': begin Вывод на экран введенной строки, если же она не введены, выводится соответствующее сообщение. if Not Vvod then writeln('Ne vveden text') else writeln(Txt); end else Если переменная Rem не удовлетворяет предыдущим условиям, то выводится сообщение о том что введена неизвестная команда. writeln('Neizvestnaya komanda'); end; Если программа все еще работает, то выводится предупреждающее сообщение о том что после нажатия клавиши ENTER необходимо будет ввести следующую команду. if Cont then begin write('Nagmite ENTER dlya vvoda sleduyuschei komandy... '); readln; end else clrscr; end; end. Процедура для нахождения слова с максимальным количеством букв, находящихся в алфавитном порядке. Она получает в качестве параметра строку S и считает в ней слова, в которых латинские буквы расположены по алфавиту и печатает такое слово, в котором максимально количество букв. procedure alfslovo(S: Stroka250); var Если переменная F становится True, то это показывает что найдено новое слово. F: boolean; Len: Byte; I: Byte; Counter: Byte; FSlovo, Buf: Slovo; Index, L: Byte; MaxCol: Byte; begin Len:=Length(S); Вставляем в конец строки пробел, если его там нет. if S[Len]<>' ' then begin S:=S+' '; Inc(Len); end; F:=False; MaxCol:=0; for I:=1 to Len do if S[I]<>' ' then begin Если находим начало нового слова, тогда устанавливаем признак нового слова, запоминаем номер символа начала слова в строке в переменную Index и вводим начальную длину слова в L. if F=False then begin F:=True; Index:=I; L:=1; end else Увеличиваем длину до тех пор, пока не находим пробел. Inc(L); end else Если i-й символ пробел, то сбрасываем признак слова, копируем слово в переменную Buf и длину строки в нулевую ячейку. if F=True then begin F:=False; Buf:=Copy1(S, Index, L); Buf[0]:=char(L); Следующая процедура проверяет слово. Если буквы расположены в алфавитном порядке, то возвращает True иначе False. if alforder(Buf, Counter) then begin Если в слове больше символов, чем в максимальном, то заносим слово в Fslovo и колличество букв в MaxCol. if Counter>MaxCol then begin FSlovo:=Copy1(S, Index, L); FSlovo[0]:=char(L); MaxCol:=Counter; end; end; end; Если таких слов нет то выводим сообщение об этом, иначе выводим слово. if MaxCol=0 then writeln('Net podhodyaschi slov v texte') else writeln(FSlovo, ' kol-vo bukv: ', MaxCol); end; Функция alforder получает в качестве параметров строку S1, если в строке латинские буквы расположены по алфавиту, то функция вернет True иначе False. Count – количество латинских букв в строке. function alforder(Sl: Slovo; var Count: Byte): Boolean; var I, L: Byte; F: Boolean; Buf: Char; begin L:=Length(Sl); Сбрасываем начальное количество букв в строке. Count:=0; Находим в цикле количество латинских букв в строке и приводим все заглавные буквы к строчному виду. for I:=1 to L do begin if (isletter(Sl[I])) then Inc(Count); if (Sl[I]>='A') and (Sl[I]<='Z') then Sl[I]:=char(byte(Sl[I])+32); end; if Count=0 then alforder:=False else if Count=1 then alforder:=True else begin F:=True; Перемещаем все буквы строки в начало строки. While F do begin F:=False; for I:=1 to L-1 do Если i-й символ не буква, а его сосед справа – буква, то меняем эти символы местами. if (Not isletter(Sl[I])) And (isletter(Sl[I+1])) then begin F:=True; Buf:=Sl[I]; Sl[I]:=Sl[I+1]; Sl[I+1]:=Buf; end; end; F:=true; Далее проверяем расположения букв по алфавиту. for I:=1 to Count-1 do if Sl[I]>Sl[I+1] then begin F:=False; break; end; alforder:=F; end; end; Процедура colsimmsolvo получает в качестве параметра строку S, и считает в ней симметричные слова, выводит их на экран и выводит количество найденных симметричных слов. procedure colsimmslovo(S: Stroka250); var F: boolean; Len: Byte; I: Byte; Counter: Byte; Buf: Slovo; Index, L: Byte; MaxCol: Byte; begin Len:=Length(S); Заносим в конец строки пробел, если его там нет. if S[Len]<>' ' then begin S:=S+' '; Inc(Len); end; За F обозначаем флаг нахождения слова, F=true –найдено новое слово. И сбрасываем начальное значение количества симметричных слов. F:=False; Counter:=0; writeln('Spisok simmetrichnyh slov iz bolshe chem 2 znaka:'); Начинаем поиск симметричных слов в строке. for I:=1 to Len do В случае, если i-й символ не пробел, устанавливаем флаг нового слова, запоминаем начало нового слова, и сбрасываем начальное значение длинны. if S[I]<>' ' then begin if F=False then begin F:=True; Index:=I; L:=1; end else Inc(L); end else Иначе, если установлен признак нового слова, то сбрасываем его. Если длинна слова больше двух символов, то копируем слово в буффер. if F=True then begin F:=False; if L>2 then begin Buf:=Copy(S, Index, L); {kopiruem slovo v Buf} Buf[0]:=char(L); Далее функцией проверяем слово на симметрию, и если оно симметрично, то увеличиваем счетчик на единицу, и выводим это слово на экран. if simmetr(Buf) then begin Inc(Counter); writeln(Buf); end; end; end; writeln('Kol-vo naidennyh slov: ', Counter); end; Процедура проверки словва на симметричность. function simmetr(S: Slovo):boolean; var L, I, R: Byte; F: Boolean; Begin Начинаем проверять симметричные относительно центра символы. Если они совпадают, то функции присваивается True. Если хоть один символ не сходится, то программа выходит из цикла и функции присваивается значение False. L:=Length(S); R:=L div 2; F:=True; for I:=1 to R do if S[I]<>S[L-I+1] then begin F:=False; break; end; simmetr:=F; end; 2 Задание №2Символьный квадратный массив заполнен случайным набором символов. Определить количество цепочек, расположенных по вертикали и/или горизонтали и состоящих только из латинских букв. 2.1 Блок-схема программы2.2 Работа программыВначале задаем 2 типа: самой матрицы и буффера. type Matrix=array[1..20,1..20] of Integer; type Vector=array[1..80] of Integer; Begin Делаем очистку экрана для удобного ввода и вывода информации и делаем запрос на ввод размера массива, согласно положению. clrscr; Повторяем ввод до тех пор, пока не будет введено число от 12 до 22. repeat write('Razmer matricy (12..20): '); readln(N); until (N>=12) and (N<=20); Используем процедуру для формирования матрицы Matr размером N на N ячеек. Затем выводим ее на экран. FormMatrix(Matr, N, N); writeln('Sformirovana matrica:'); PrintMatrix(Matr, N, N); Используем процедуру поворота матрицы и выводим матрицу на экран. TurnMatrix(Matr, N); writeln('Matrica posle povorota'); PrintMatrix(Matr, N, N); readln; end. Процедура FormMatrix Данная процедура присваивает значения от -99 до 99 элементам матрицы. procedure FormMatrix(var A: Matrix; N, M: Integer); var I, J: Integer; D: Integer; R: Integer; begin randomize; for I:=1 to N do for J:=1 to M do begin Присваиваем элементу любое значение от 0 до 99. A[I,J]:=random(100); Если случайное число от 0 до 999 четное, данный элемент становится отрицательным, иначе знак не изменяется. if (random(1000) mod 2)=0 then A[I,J]:=0-A[I,J]; end; end; Процедура вывода матрицы на экран. procedure PrintMatrix(var A: Matrix; N, M: Integer); var I, J: Integer; Begin Задаем два цикла, один для столбцов, второй для строк и поочередно выводим все элементы строки. После чего выводим следующую строку. for I:=1 to N do begin for J:=1 to M do write(A[I,J]:4); writeln; end; end; Процедура поворота матрицы на 90 градусов направо. procedure TurnMatrix(var A: Matrix; N: Integer); var Arr: Vector; I, J, K, Ot, L: Integer; R: Integer; Revers: Integer; Buf1, Buf2: Integer; begin R:=N div 2; Ставим начальное значение отступа Ot равным нулю. Ot:=0; for K:=1 to R do begin Переменная L отвечает за количество элементов в массиве Arr. Ставим начальное значение равное нулю, а затем заносим в массив Arr элементы матрицы. L:=0; for J:=1+Ot to N-Ot do begin Inc(L); Arr[L]:=A[1+Ot, J]; end; for I:=2+Ot to N-1-Ot do begin Inc(L); Arr[L]:=A[I, N-Ot]; end; for J:=N-Ot downto 1+Ot do begin Inc(L); Arr[L]:=A[N-Ot, J]; end; for I:=N-1-Ot downto 2+Ot do begin Inc(L); Arr[L]:=A[I, 1+Ot]; end; Находим на сколько элементов нужно сдвинуть массив Arr. Revers:=N-2*Ot-1; Далее, с помощью процедуры, циклически сдвигаем массив Arr из L элементов на Revers позиций вправо. И записываем получившийся массив обратно в матрицу. TurnArray(Arr, L, Revers); L:=0; for J:=1+Ot to N-Ot do begin Inc(L); A[1+Ot, J]:=Arr[L]; end; for I:=2+Ot to N-1-Ot do begin Inc(L); A[I, N-Ot]:=Arr[L]; end; for J:=N-Ot downto 1+Ot do begin Inc(L); A[N-Ot, J]:=Arr[L]; end; for I:=N-1-Ot downto 2+Ot do begin Inc(L); A[I, 1+Ot]:=Arr[L]; end; Увеличиваем значение отступа. Inc(Ot); end; Процедура циклического сдвига массива. procedure TurnArray(var V: Vector; NN: Integer; Rev: Integer); var Buf: Integer; I, J: Integer; Begin for J:=1 to Rev do begin Сохраняем значение элемента V[NN] в Buf, а затем сдвигаем элементы массива на 1 позицию. Buf:=V[NN]; for I:=NN downto 2 do V[I]:=V[I-1]; V[1]:=Buf; end; end; 3 Задание №3Соединить два файла в третий, добавив после содержимого первого файла только те строки второго файла, в которых имеются числа-палиндромы. 3.1 Блок-схема программы
3.2 Работа программыBegin Выводим на экран меню, представленное на рисунке 2. Рисунок 2 – главное меню третьей программы. menu; Задаем три переменных, которые будут отвечать за информацию о вводе имени для трех файлов. И еще одну, которая будет отвечать за работу программы. pf:=false; vf:=false; tf:=false; cont:=true; В будущем нам понадобится еще 2 переменных, flag1 и flag1, которые будут отвечать за наличие информации в файлах. flag1:=false; flag2:=false; while cont do begin writeln; write('Vvedite komandu: '); Считываем команду и запускаем одну из процедур. readln(command); case command of '0': cont:=false; '1': begin write('Vvedite imja pervogo faila: '); readln(p); Запускаем проверку правильности ввода имени файла, и если она проходит, то флаг ввода принимает значение True. Иначе будет выведено сообщение о неправильном вводе. if check1(p)=true then begin pf:=true; clrscr; menu; end else begin clrscr; menu; writeln('Error input'); end; end; '2': begin write('Vvedite imja vtorogo faila: '); readln(v); Запускаем проверку правильности ввода имени файла, и если она проходит, то флаг ввода принимает значение True. Иначе будет выведено сообщение о неправильном вводе. if check1(v)=true then begin; vf:=true; clrscr; menu; end else begin clrscr; menu; writeln('Error input'); end; end; '3': begin write('Vvedite imja tretego faila: '); readln(t); Запускаем проверку правильности ввода имени файла, и если она проходит, то флаг ввода принимает значение True. Иначе будет выведено сообщение о неправильном вводе. if check1(t)=true then begin tf:=true; clrscr; menu; end else begin clrscr; menu; writeln('Error input'); end; end; '4': begin Если все три имени файла введены верно, то запускается ряд процедур по составлению третьего файла. if (pf=true)and(vf=true)and(tf=true) then begin filepr; Данная процедура смотрит количество строк в файлах и выбирает максимальное и минимальное. chmax; Если оба файлы не пустые, то программа приступает к образованием слов и записи их в третий файл. if check2=false then begin Ставим цикл до минимального числа строк. for l:=1 to m do begin slv; obrslov(slova1,slova2,k1,k2,slova,k); for g:=1 to k do begin write(third,slova[g]); if g<k then write(third,' '); end; Здесь осуществляется переход на следующую строчку. writeln(third,''); end; Выбираем в каком из файлов больше строк и переписываем оставшиеся без изменений. if m1<>m2 then begin if m1>m2 then for L:=m to m1 do begin readln(first,S1); writeln(third,S1); end else for L:=m to m2 do begin readln(second,S2); Writeln(third,S2); end; end; closing; writeln('Operacia zavershena'); end else Если первые два файла не прошли проверку, то программа скажет, какой именно из файлов пустой. begin if flag1=true then writeln('Pervii fail pustoi'); if flag2=true then writeln('Vtoroi fail pustoi'); end; end else begin Если файл не прошел первую проверку, то программа скажет, имя какого из файлов введено неверно или совсем не было введено. if pf=false then writeln('Ne vvedeno imja pervogo faila'); if vf=false then writeln('Ne vvedeno imja vtorogo faila'); if tf=false then writeln('Ne vvedeno imja tretego faila'); end; end; else writeln('Neizvestnaya komanda'); end; end; end. Процедура правильности проверки ввода имени файлов. function check1(x:string):boolean; begin В данном случае проверяется пустой ввод, и имя файла, начинающееся с пробела. if length(x)>0 then begin if x[1]<>' ' then check1:=true; end; end; Процедура привязки и открытия файлов. procedure filepr; begin assign(first,p); assign(second,v); assign(third,t); reset(first); reset(second); rewrite(third); end; Процедура проверки количества строк в файлах. procedure chmax; begin Сбрасываем счетчик строк. m1:=0; m2:=0; И пока не конец файла перебираем строки и прибавляем по единице к счетчику. while not eof(first) do begin readln(first,S1); m1:=m1+1; end; Пока не конец файла перебираем строки и прибавляем по единице к счетчику. while not eof(second) do Begin readln(second,S2); m2:=m2+1; end; И присваиваем минимальное значение для переменной m. if m1<m2 then m:=m1 else m:=m2; Заново закрываем и открываем файлы. close(first); reset(first); close(second); reset(second); end; Процедура разбития строки на слова и перемещение их в массив. Procedure slv; var i,j:integer; begin Считываем первую строчку из обоих файлов и добавляем пробел вначале и в конце строки. Readln(first,S1); readln(second,S2); S1:=' '+S1+' '; S2:=' '+S2+' '; Сбрасываем счетчик количества слов. k1:=0; k2:=0; Начинаем перебор элементов до тех пор, пока не найдем пробел. Далее смотрим, если след элемент после пробела, тоже пробел, то пропускаем первый. Если же мы получаем слово, то копируем его в одну из ячеек массива. for i:=1 to length(S1) do begin if s1[i]=' ' then begin for j:=i+1 to length(s1) do if s1[i+1]<>' ' then if s1[j]=' ' then begin k1:=k1+1; slova1[k1]:=copy(s1,i+1,j-i-1); break; end; end; end; for i:=1 to length(S2) do begin if s2[i]=' ' then begin for j:=i+1 to length(s2) do if s2[i+1]<>' ' then if s2[j]=' ' then begin k2:=k2+1; slova2[k2]:=copy(s2,i+1,j-i-1); break; end; end; end; end; Процедура отсортировки слов. procedure obrslov(a,b:arr;na,nb:integer; var c:arr; var nc:integer); var i,j,k:integer; begin nc:=0; Делаем несколько циклов, среди которых перебираем элементы первого массива и сравниваем их со вторым. Затем элементы вторго с элементами первого и оставшиеся заносятся в новый массив. for i:=1 to na do begin k:=0; for j:=1 to nb do if a[i]=b[j] then k:=1; if k=0 then begin nc:=nc+1; c[nc]:=a[i]; end; end; for i:=1 to nb do begin k:=0; for j:=1 to na do if b[i]=a[j] then k:=1; if k=0 then begin nc:=nc+1; c[nc]:=b[i]; end; end; end; Функция проверки файлов на информацию. function check2:boolean; begin В данному случае мы смотри, не находится ли конец файла на первом месте, и если хоть один файл пустой, то функции присваивается значение False. if eof(first)=true then flag1:=true else flag1:=false; if eof(second)=true then flag2:=true else flag2:=false; if (flag1=false)and(flag2=false) then check2:=false else check2:=true; end; Процедура закрытия всех файлов. procedure closing; begin close(first); close(second); close(third); end; 4 Задание №4.На экране построить семейство кривых (Гипоциклоида), заданных функцией: X=A∙cos(t)+D∙cos(A∙t); [0<=t<=2∙pi] X=A∙sin(t)+D∙sin(A∙t); Группа параметров A,D для построения семейства дана в текстовом файле. 4.1 Работа программыBegin Присваиваем начальное значение t, и флаг работы программы. t:=0; menu; cont:=true; while cont do begin Вводим команду в появившееся меню, показанное на рисунке 3. Рисунок 3 – меню программы 4. Writeln('Vvedite komady: '); Readln(command); case command of '0':cont:=false; '1': begin writeln; Вводится имя файла. Имя проходит проверку, если проверка успешна, то из него читаются два значения (А и D) и файл сразу же закрывается. writeln('Vvedite imja faila: '); Readln(name); if check1 = true then begin namef:=true; read(fileg,a); read(fileg,d); close(fileg); end else namef:=false; end; '2': Begin Если из файла успешно считали информацию, программа переходит к построению графика, а именно: -Очистака окна. -Изменению разрешения. -Построению графика. -Завершению выполнения программы. if namef=false then writeln('Ne Vvedeno imja faila') else begin clearwindow; SetWindowSize(800,600); mnoj; graf; cont:=false; end; end; end; end; Следующая функция не дает изменять график до функции ReDraw. lockdrawing; OnResize же позволяет делать определенные процедуры при изменение размера окна. OnResize:=resize; end. Функция У function Yfunc(i: real): real; begin result:=A*sin(i)-D*sin(A*t); end; Функция Х function Xfunc(i:real):real; begin Xfunc:=A*cos(i)+D*cos(A*i); end; Процедура нахождения максимального значения функции, а заодно и множителя. procedure mnoj; begin t:=0; Задаем цикл и ищем максимальное значение. while t <= 2*pi do begin xx:=trunc(Xfunc(t)); ifabs(xx)> maxx then maxx:=abs(xx); yy:=trunc(Yfunc(t)); if abs(yy)> maxy then maxy:=abs(yy); Здесь изменяем точность поиска. t:=t+0.001; end; После чего ищем коэффициент координат. Он зависит от нескольких переменных: ширина, высота, и максимальной координаты. if WindowWidth<WindowHeight then if maxy>maxx then k:=(WindowHeight/2)/maxy else k:=(windowWidth/2)/maxx else If maxx>maxy then k:=(windowheight/2)/maxx else k:=(windowWidth/2)/maxy; end; Функция проверки файла на правильность ввода имени и на нахождения в нем данных. function check1:boolean; begin Проверка длинны имени файла. if length(name)>0 then begin assign(fileg, name); reset(fileg); if eof(fileg)=false then check1:= true else check1:=false; end; end; Процедура построения графика. procedure graf; begin Уменьшаем наш коэффициент, чтобы уместились обозначения системы координат. k:=k-k*0.1; Далее чертим ровно по центру оси Х и У. Стрелочки, показывающее направление. Все данные берутся в зависимости от размера экрана, для удобства просмотра как при маленьком, так и при большом разрешение. moveto(1, windowHeight div 2); lineto(WindowWidth, WindowHeight div 2); moveto(WindowWidth div 2, 1); lineto(WindowWidth div 2, WindowHeight); moveto(trunc((WindowWidth div 2)*0.98),trunc(0.04*WindowHeight)); Lineto((Windowwidth div 2),1); lineto(trunc((windowWidth div 2)*1.02),trunc(0.04*windowHeight)); moveto(trunc(windowwidth*0.96),trunc(0.98*(windowheight div 2))); lineto(windowwidth,windowheight div 2); lineto(trunc(windowwidth*0.96),trunc(1.02*(windowheight div 2))); T:=0; Вычисляем стартовые координаты и перемещаем туда курсор, для дальнейшего построения. xx:=(WindowWidth div 2)+trunc(k*Xfunc(t)); yy:=(WindowHeight div 2)+trunc(k*Yfunc(t)); moveto(xx,yy); Задаем цикл, в котором программа сама будет высчитывать значения, и рисовать график. while t<=2*pi do begin xx:=(WindowWidth div 2)+trunc(k*Xfunc(t)); yy:=(WindowHeight div 2)+trunc(k*Yfunc(t)); lineto(xx,yy); Число ниже влияет на точность построения графика. При больших значениях график может очень долго строится, а при маленьких график получается не точны и угловатый. t:=t+0.001; end; Для улучшения просматриваемости графика, при маленьких разрешениях подписи систем координат скрываются. If WindowWidth>400 then If Windowheight>200 then begin textout(trunc(1.05*(windowWidth div 2)),trunc(0.01*(WindowHeight )),'Y'); Textout(trunc(0.95*WindowWidth),trunc((WindowHeight div 2)*1.05),'X'); end; end; Процедура перечерчивания графика при смене разрешения. procedure resize; begin mnoj; ClearWindow; graf; redraw; lockdrawing; end; 5 Задание №5Написать программу, которая формирует файл записей данной структуры: Type Vladelez=Record Familia: String; Adress:String; Avto:lnteger; Nomer:Integer; End; и определяет: -количество автомобилей каждой марки; -владельца самого старого автомобиля; -фамилии владельцев и номера автомобилей данной марки. 5.1 Блок-схема программы
5.2 Работа программыBegin Задаем цикл, и заполняем массив ch, который будет отвечать за введение информации в другой массив. for i:=1 to 200 do ch[i]:=false; Очищаем экран для удобного ввода, и выводим меню на экран, которое представлено на рисунке 4. Рисунок 5 – меню пятой программы. clrscr; menu; Задаем две переменные, которые отвечают за работу программы и за введение количества элементов. cont:=true; fzap:=false; while cont do begin write('Vvedite komandu: '); readln(command); case command of '0': cont := false; '1': Begin Задаем общее количество элементов массива, если запись будет соответствовать условию, то fzap присвоится true. Write('Vvedite kol-vo zapisei(1..200): '); readln(n); if (n>0) and (n<=200) then fzap:=true else fzap:=false; end; '2': Begin Если было введено общее количество записей, то запустится цикл с повторяющейся процедурой, до тех пор пока не будут введены все записи. В противном случае выведется сообщение, что не введено общее количество записей. if fzap=true then begin for i:=1 to n do сhange(i, avtovl, ch); clrscr; menu; end else writeln('Ne vvedeno kol-vo zapisei'); end; '3': Begin Если было введено общее количество элементов, то можно редактировать записи по очереди. Если введено число больше общего числа элементов, то программа сообщит от ошибке ввода. if fzap=true then begin write('Vvedite nomer redaktiryemoi zapisi: '); readln(i); if i>n then writeln('Wrong input') else begin change(i, avtovl, ch); clrscr; menu; end; end else Writeln('Ne vvedeno obshee chislo zapisei'); end; '4': Begin Вначале программа проверяет, введено ли общее число элементов. Затем проверяет каждый элемент по очереди. Если все они заполнены, то начинается выполнятся процедура по подсчету машин каждой марки. if fzap=true then begin for i:=1 to n do if ch[i]=false then begin dzap:=false; writeln('Vvedeni ne vse zapisi'); end else dzap:=true; if dzap=true then mark(avtovl); end else Writeln('Ne vvedeno obshee chislo zapisei'); end; '5': Begin Все проверки выполняются аналогично предыдущему варианту, но здесь выбирается процедура нахождения хозяина самого старого авто. if fzap=true then begin for i:=1 to n do if ch[i]=false then begin dzap:=false; writeln('Vvedeni ne vse zapisi'); end else dzap:=true; if dzap=true then mostold(avtovl); end else Writeln('Ne vvedeno obshee chislo zapisei'); end; '6': Begin Все проверки выполняются аналогично предыдущему варианту, но здесь выбирается иная процедура. if fzap=true then begin for i:=1 to n do if ch[i]=false then begin dzap:=false; writeln('Vvedeni ne vse zapisi'); end else dzap := true; if dzap=true then oprmarki(avtovl); end else Writeln('Ne vvedeno obshee chislo zapisei'); end; end; end; end. Процедура oprmarki; procedure oprmarki(x: mas); var h:integer; m:string; begin Вводим название марки, и программа переберет все записи и при нахождение такой же марки выведет на экран фамилию владельца и номер автомобиля. Write('Vvedite marku avto: '); readln(m); for h:=1 to n do if x[h].Avto=m then writeln(x[h].Familia, ' nomer-', x[h].Nomer); end; Процедура нахождения самого старого авто procedure mostold(x: mas); var min,nmin,h:integer; begin min:=x[1].Vypusk; nmin:=0; Перебираем все записи и сохраняем минимальный год выпуска в переменную min, а номер записи в переменную nmin. А после цикла их выводит на экран. for h:=1 to n do if x[h].Vypusk<min then begin min:=x[h].Vypusk; nmin:=h; end; Writeln(x[nmin].Familia, ' - ', min,' god vypuska'); end; Процедура подсчета автомобилей каждой марки. procedure mark(x: mas); var h, l, k: integer; begin for h := 1 to n do begin Вначале программы задаем пустое множество. И запускаем цикл. Если определенной марки нет в множестве, тогда добавляем ее. И запускаем второй цикл, только начиная не с единицы, а с h-го элемента. Затем если h-ый и l-ый элементы совпадают, прибавляем к счетчику единицу .И в конце второго цикла выводим собранные данные на экран. if not (x[h].avto in marki) = true then begin k := 0; include(marki, x[h].avto); for l:=h to n do if x[h]=x[l] then if x[l].avto in marki then k:=k + 1; writeln(x[h].avto, '-', k); end; end; end; Процедура ввода данных в запись. procedure change(x: integer; var z: mas; var v: mas2); begin clrscr; В контрольный массив ставим, что данная запись с этим номер заполнена. v[x]:=true; write('Vvedite familiu: '); readln(z[x].familia); write('Vvedite adress: '); readln(z[x].adress); write('Vvedite marku avto: '); readln(z[x].avto); write('Vvedite nomer avto: '); readln(z[x].nomer); z[x].Vypusk:= 0; while (z[x].Vypusk < 1900) or (z[x].Vypusk > 2000) do begin write('Vvedite god vipuska(1900..2000): '); readln(z[x].vypusk); end; end; 6 Заключение.В ходе выполнения курсовой работы мною был изучен язык програмированния Pascal. Также получены практические навыки работы с текстовыми строками, двумерными массивами, файловыми структурами данных, элементами машинной графики и записями. 7 Приложения АКод программы 1 program slova1; uses crt; type Stroka250=string[250]; Slovo=string[20]; function Copy1(S: Stroka250; Start, Len: Integer):Stroka250; var Rez: Stroka250; L: Integer; I, J: Integer; begin L:=byte(S[0]); if (L<Start) then Rez[0]:=char(0) else begin if (Start+Len-1)>L then Len:=L-Start+1; J:=Start; for I:=1 to Len do begin Rez[I]:=S[J]; Inc(J); end; Rez[0]:=char(Len); end; Copy1:=Rez; end; function isletter(C: Char): Boolean; begin if ((C>='A') and (C<='Z')) or ((C>='a') and (C<='z')) then isletter:=True else isletter:=False; end; function alforder(Sl: Slovo; var Count: Byte): Boolean; var I, L: Byte; F: Boolean; Buf: Char; begin L:=Length(Sl); Count:=0; for I:=1 to L do begin if (isletter(Sl[I])) then Inc(Count); if (Sl[I]>='A') and (Sl[I]<='Z') then Sl[I]:=char(byte(Sl[I])+32); end; {esli v slove net bukv} if Count=0 then alforder:=False else if Count=1 then alforder:=True else begin F:=True; While F do begin F:=False; for I:=1 to L-1 do if (Not isletter(Sl[I])) And (isletter(Sl[I+1])) then begin F:=True; Buf:=Sl[I]; Sl[I]:=Sl[I+1]; Sl[I+1]:=Buf; end; end; F:=true; for I:=1 to Count-1 do if Sl[I]>Sl[I+1] then begin F:=False; break; end; alforder:=F; end; end; procedure alfslovo(S: Stroka250); var F: boolean; Len: Byte; I: Byte; Counter: Byte; FSlovo, Buf: Slovo; Index, L: Byte; MaxCol: Byte; begin Len:=Length(S); if S[Len]<>' ' then begin S:=S+' '; Inc(Len); end; F:=False; MaxCol:=0; for I:=1 to Len do if S[I]<>' ' then begin if F=False then begin F:=True; Index:=I; L:=1; end else Inc(L); end else if F=True then begin F:=False; Buf:=Copy1(S, Index, L); Buf[0]:=char(L); if alforder(Buf, Counter) then begin if Counter>MaxCol then begin FSlovo:=Copy1(S, Index, L); FSlovo[0]:=char(L); MaxCol:=Counter; end; end; end; if MaxCol=0 then writeln('Net podhodyaschi slov v texte') else writeln(FSlovo, ' kol-vo bukv: ', MaxCol); end; function simmetr(S: Slovo):boolean; var L, I, R: Byte; F: Boolean; begin L:=Length(S); R:=L div 2; F:=True; for I:=1 to R do if S[I]<>S[L-I+1] then begin F:=False; break; end; simmetr:=F; end; procedure colsimmslovo(S: Stroka250); var F: boolean; Len: Byte; I: Byte; Counter: Byte; Buf: Slovo; Index, L: Byte; MaxCol: Byte; begin Len:=Length(S); if S[Len]<>' ' then begin S:=S+' '; Inc(Len); end; F:=False; Counter:=0; writeln('Spisok simmetrichnyh slov iz bolshe chem 2 znaka:'); for I:=1 to Len do if S[I]<>' ' then begin if F=False then begin F:=True; Index:=I; L:=1; end else Inc(L); end else if F=True then begin F:=False; if L>2 then begin Buf:=Copy(S, Index, L); Buf[0]:=char(L); if simmetr(Buf) then begin Inc(Counter); writeln(Buf); end; end; end; writeln('Kol-vo naidennyh slov: ', Counter); end; procedure menu; begin writeln; writeln('++++++++++++++++++++++++++++++++++++++++++++++++'); writeln('+ Vvod texta --> 1 +'); writeln('+ Slovo s max. kol.bukv v alf. poryadke --> 2 +'); writeln('+ Simmetrichnye slova --> 3 +'); writeln('+ Vyvod texta --> 4 +'); writeln('+ +'); writeln('+ Konec --> 0 +'); writeln('++++++++++++++++++++++++++++++++++++++++++++++++'); writeln; end; var Txt: Stroka250; Vvod, Cont: Boolean; Rem: Char; begin Vvod:=False; Cont:=True; while Cont do begin clrscr; menu; write('Vvedite komandu: '); readln(Rem); case Rem of '0': Cont:=False; '1': begin writeln('Text:'); readln(Txt); Vvod:=True; end; '2': begin if Not Vvod then writeln('Ne vveden text') else alfslovo(Txt); end; '3': begin if Not Vvod then writeln('Ne vveden text') else colsimmslovo(Txt); end; '4': begin if Not Vvod then writeln('Ne vveden text') else writeln(Txt); end else writeln('Neizvestnaya komanda'); end; if Cont then begin write('Nagmite ENTER dlya vvoda sleduyuschei komandy... '); readln; end else clrscr; end; end. 8 Приложение БКод программы 2 program massiv1; uses crt; type Matrix=array[1..20,1..20] of Integer; type Vector=array[1..80] of Integer; procedure TurnArray(var V: Vector; NN: Integer; Rev: Integer); var Buf: Integer; I, J: Integer; begin for J:=1 to Rev do begin Buf:=V[NN]; for I:=NN downto 2 do V[I]:=V[I-1]; V[1]:=Buf; end; end; procedure TurnMatrix(var A: Matrix; N: Integer); var Arr: Vector; I, J, K, Ot, L: Integer; R: Integer; Revers: Integer; Buf1, Buf2: Integer; begin R:=N div 2; Ot:=0; for K:=1 to R do begin L:=0; for J:=1+Ot to N-Ot do begin Inc(L); Arr[L]:=A[1+Ot, J]; end; for I:=2+Ot to N-1-Ot do begin Inc(L); Arr[L]:=A[I, N-Ot]; end; for J:=N-Ot downto 1+Ot do begin Inc(L); Arr[L]:=A[N-Ot, J]; end; for I:=N-1-Ot downto 2+Ot do begin Inc(L); Arr[L]:=A[I, 1+Ot]; end; Revers:=N-2*Ot-1; TurnArray(Arr, L, Revers); L:=0; for J:=1+Ot to N-Ot do begin Inc(L); A[1+Ot, J]:=Arr[L]; end; for I:=2+Ot to N-1-Ot do begin Inc(L); A[I, N-Ot]:=Arr[L]; end; for J:=N-Ot downto 1+Ot do begin Inc(L); A[N-Ot, J]:=Arr[L]; end; for I:=N-1-Ot downto 2+Ot do begin Inc(L); A[I, 1+Ot]:=Arr[L]; end; Inc(Ot); end; end; procedure FormMatrix(var A: Matrix; N, M: Integer); var I, J: Integer; D: Integer; R: Integer; begin randomize; for I:=1 to N do for J:=1 to M do begin A[I,J]:=random(100); if (random(1000) mod 2)=0 then A[I,J]:=0-A[I,J]; end; end; procedure PrintMatrix(var A: Matrix; N, M: Integer); var I, J: Integer; begin for I:=1 to N do begin for J:=1 to M do write(A[I,J]:4); writeln; end; end; var Matr: Matrix; N: Integer; begin clrscr; repeat write('Razmer matricy (12..20): '); readln(N); until (N>=12) and (N<=20); FormMatrix(Matr, N, N); writeln('Sformirovana matrica:'); PrintMatrix(Matr, N, N); TurnMatrix(Matr, N); writeln('Matrica posle povorota'); PrintMatrix(Matr, N, N); readln; end. 9 Приложение ВКод программы 3 program textfile; uses crt; type arr = array [1..83] of string; var slova1, slova2, slova: arr; m, m1, m2, k1, k2, k, l, g: integer; first, second, third: text; command: char; p, v, t, S1, S2: string; pf, vf, tf, cont, flag1, flag2: boolean; function check2: boolean; begin if eof(first) = true then flag1 := true else flag1 := false; if eof(second) = true then flag2 := true else flag2 := false; if (flag1 = false) and (flag2 = false) then check2 := false else check2 := true; end; procedure closing; begin close(first); close(second); close(third); end; procedure obrslov(a, b: arr; na, nb: integer; var c: arr; var nc: integer); var i, j, k: integer; begin nc := 0; for i := 1 to na do begin k := 0; for j := 1 to nb do if a[i] = b[j] then k := 1; if k = 0 then begin nc := nc + 1; c[nc] := a[i]; end; end; for i := 1 to nb do begin k := 0; for j := 1 to na do if b[i] = a[j] then k := 1; if k = 0 then begin nc := nc + 1; c[nc] := b[i]; end; end; end; procedure slv; var i, j: integer; begin Readln(first, S1); readln(second, S2); S1 := ' ' + S1 + ' '; S2 := ' ' + S2 + ' '; k1 := 0; k2 := 0; for i := 1 to length(S1) do begin if s1[i] = ' ' then begin for j := i + 1 to length(s1) do if s1[i + 1] <> ' ' then if s1[j] = ' ' then begin k1 := k1 + 1; slova1[k1] := copy(s1, i + 1, j - i - 1); break; end; end; end; for i := 1 to length(S2) do begin if s2[i] = ' ' then begin for j := i + 1 to length(s2) do if s2[i + 1] <> ' ' then if s2[j] = ' ' then begin k2 := k2 + 1; slova2[k2] := copy(s2, i + 1, j - i - 1); break; end; end; end; end; procedure chmax; begin m1 := 0; m2 := 0; while not eof(first) do begin readln(first, S1); m1 := m1 + 1; end; while not eof(second) do begin readln(second, S2); m2 := m2 + 1; end; if m1 < m2 then m := m1 else m := m2; close(first); reset(first); close(second); reset(second); end; procedure filepr; begin assign(first, p); assign(second, v); assign(third, t); reset(first); reset(second); rewrite(third); end; function check1(x: string): boolean; begin if length(x) > 0 then begin if x[1] <> ' ' then check1 := true; end; end; procedure menu; begin writeln; writeln('++++++++++++++++++++++++++++++++++++++++++++++++'); writeln('+ Vvod imeni pervogo faila --> 1 +'); writeln('+ Vvod imeni vtorogo faila --> 2 +'); writeln('+ Vvod imeni tretiego faila --> 3 +'); writeln('+ Preobrazovat tretii fail --> 4 +'); writeln('+ +'); writeln('+ Konec --> 0 +'); writeln('++++++++++++++++++++++++++++++++++++++++++++++++'); writeln; end; begin menu; pf := false; vf := false; tf := false; cont := true; flag1 := false; flag2 := false; while cont do begin writeln; write('Vvedite komandu: '); readln(command); case command of '0': cont := false; '1': begin write('Vvedite imja pervogo faila: '); readln(p); if check1(p) = true then begin pf := true; clrscr; menu; end else begin clrscr; menu; writeln('Error input'); end; end; '2': begin write('Vvedite imja vtorogo faila: '); readln(v); if check1(v) = true then begin; vf := true; clrscr; menu; end else begin clrscr; menu; writeln('Error input'); end; end; '3': begin write('Vvedite imja tretego faila: '); readln(t); if check1(t) = true then begin tf := true; clrscr; menu; end else begin clrscr; menu; writeln('Error input'); end; end; '4': begin if (pf = true) and (vf = true) and (tf = true) then begin filepr; chmax; if check2 = false then begin for l := 1 to m do begin slv; obrslov(slova1, slova2, k1, k2, slova, k); for g := 1 to k do begin write(third, slova[g]); if g < k then write(third, ' '); end; writeln(third, ''); end; if m1 <> m2 then begin if m1 > m2 then for L := m to m1 do begin readln(first, S1); writeln(third, S1); end else for L := m to m2 do begin readln(second, S2); Writeln(third, S2); end; end; closing; writeln('Operacia zavershena'); end else begin if flag1 = true then writeln('Pervii fail pustoi'); if flag2 = true then writeln('Vtoroi fail pustoi'); end; end else begin if pf = false then writeln('Ne vvedeno imja pervogo faila'); if vf = false then writeln('Ne vvedeno imja vtorogo faila'); if tf = false then writeln('Ne vvedeno imja tretego faila'); end; end; else writeln( 'Neizvestnaya komanda'); end; end; end. 10 Приложение ГКод программы 4 program grafik; uses graphabc; var xx, yy, a, d, maxy, maxx: integer; t, k: real; fileg: text; cont, namef: boolean; command: char; name: string; function Yfunc(i: real): real; begin result := A * sin(i) - в * sin(A * t); end; function Xfunc(i: real): real; begin result := A * cos(i) + в * cos(A * i); end; procedure mnoj; begin t := 0; while t <= 2 * pi do begin xx := trunc(Xfunc(t)); if abs(xx) > maxx then maxx := abs(xx); yy := trunc(Yfunc(t)); if abs(yy) > maxy then maxy := abs(yy); t := t + 0.001; end; if WindowWidth < WindowHeight then if maxy > maxx then k := (WindowHeight / 2) / maxy else k := (windowWidth / 2) / maxx else if maxx > maxy then k := (windowheight / 2) / maxx else k := (windowWidth / 2) / maxy; end; procedure graf; begin k := k - k * 0.1; moveto(1, windowHeight div 2); lineto(WindowWidth, WindowHeight div 2); moveto(WindowWidth div 2, 1); lineto(WindowWidth div 2, WindowHeight); moveto(trunc((WindowWidth div 2) * 0.98), trunc(0.04 * WindowHeight)); Lineto((Windowwidth div 2), 1); lineto(trunc((windowWidth div 2) * 1.02), trunc(0.04 * windowHeight)); moveto(trunc(windowwidth * 0.96), trunc(0.98 * (windowheight div 2))); lineto(windowwidth, windowheight div 2); lineto(trunc(windowwidth * 0.96), trunc(1.02 * (windowheight div 2))); T := 0; xx := (WindowWidth div 2) + trunc(k * Xfunc(t)); yy := (WindowHeight div 2) + trunc(k * Yfunc(t)); moveto(xx, yy); while t <= 2 * pi do begin xx := (WindowWidth div 2) + trunc(k * Xfunc(t)); yy := (WindowHeight div 2) + trunc(k * Yfunc(t)); lineto(xx, yy); t := t + 0.0001; end; if WindowWidth > 400 then if Windowheight > 200 then begin textout(trunc(1.05 * (windowWidth div 2)), trunc(0.01 * (WindowHeight )), 'Y'); Textout(trunc(0.95 * WindowWidth), trunc((WindowHeight div 2) * 1.05), 'X'); end; end; function check1: boolean; begin if length(name) > 0 then begin assign(fileg, name); reset(fileg); if eof(fileg) = false then check1 := true else check1 := false; end; end; procedure menu; begin writeln; writeln('++++++++++++++++++++++++++++++++++++++++++++++++'); writeln('+ Vvod imeni faila s parametrami --> 1 +'); writeln('+ Porstroenie grafika --> 2 +'); writeln('+ Vihod --> 0 +'); writeln('++++++++++++++++++++++++++++++++++++++++++++++++'); writeln; end; procedure resize; begin mnoj; ClearWindow; graf; redraw; lockdrawing; end; begin; t := 0; menu; cont := true; while cont do begin Writeln('Vvedite komady: '); Readln(command); case command of '0': cont := false; '1': begin writeln; writeln('Vvedite imja faila: '); Readln(name); if check1 = true then begin namef := true; read(fileg, a); read(fileg, d); close(fileg); end else namef := false; end; '2': begin if namef = false then writeln('Ne Vvedeno imja faila') else begin clearwindow; SetWindowSize(800, 600); mnoj; graf; cont := false; end; end; end; end; lockdrawing; OnResize := resize; end. 11 Приложение ДКод программы 5 program zapisi; uses crt; type vladelez = record Familia: string; Adress: string; Avto: string; Nomer: string; Vypusk: integer; end; mas2 = array [1..200] of boolean; mas = array [1..200] of vladelez; var command: char; cont, fzap, dzap: boolean; avtovl: mas; n: integer; i: integer; ch: mas2; marki: set of string; procedure oprmarki(x: mas); var h: integer; m: string; begin Write('Vvedite marku avto: '); readln(m); for h := 1 to n do if x[h].Avto = m then writeln(x[h].Familia, ' nomer-', x[h].Nomer); end; procedure mostold(x: mas); var min, nmin, h: integer; begin min := x[1].Vypusk; nmin := 1; for h := 1 to n do if x[h].Vypusk < min then begin min := x[h].Vypusk; nmin := h; end; Writeln(x[nmin].Familia, ' - ', min, ' god vypuska'); end; procedure mark(x: mas); var h, l, k: integer; begin for h := 1 to n do begin if not (x[h].avto in marki) = true then begin k := 0; include(marki, x[h].avto); for l := h to n do if x[h] = x[l] then if x[l].avto in marki then k := k + 1; writeln(x[h].avto, '-', k); end; end; end; procedure change(x: integer; var z: mas; var v: mas2); begin clrscr; v[x] := true; write('Vvedite familiu: '); readln(z[x].familia); write('Vvedite adress: '); readln(z[x].adress); write('Vvedite marku avto: '); readln(z[x].avto); write('Vvedite nomer avto: '); readln(z[x].nomer); z[x].Vypusk := 0; while (z[x].Vypusk < 1900) or (z[x].Vypusk > 2000) do begin write('Vvedite god vipuska(1900..2000): '); readln(z[x].vypusk); end; end; procedure menu; begin writeln; Writeln('+++++++++++++++++++++++++++++++++++++++++++++++++++++'); writeln('+ Ykazat kolichestvo zapisei ->1 +'); writeln('+ Izmenit vse zapisi ->2 +'); writeln('+ Izmenit odny zapis ->3 +'); writeln('+ Kolichestvo avtomobilei kazdoi marki ->4 +'); writeln('+ Vladelec samogo starogo avtomobila ->5 +'); writeln('+ Familii vladelcev i nomera avto dannoi marki ->6 +'); Writeln('+ +'); writeln('+ Konec ->0 +'); Writeln('+++++++++++++++++++++++++++++++++++++++++++++++++++++'); writeln; end; begin for i := 1 to 200 do ch[i] := false; clrscr; menu; cont := true; fzap := false; while cont do begin write('Vvedite komandu: '); readln(command); case command of '0': cont := false; '1': begin Write('Vvedite kol-vo zapisei(1..200): '); readln(n); if (n > 0) and (n <= 200) then fzap := true else fzap := false; end; '2': begin if fzap = true then begin for i := 1 to n do change(i, avtovl, ch); clrscr; menu; end else writeln('Ne vvedeno kol-vo zapisei'); end; '3': begin if fzap = true then begin write('Vvedite nomer redaktiryemoi zapisi: '); readln(i); if i > n then writeln('Wrong input') else begin change(i, avtovl, ch); clrscr; menu; end; end else Writeln('Ne vvedeno obshee chislo zapisei'); end; '4': begin if fzap = true then begin for i := 1 to n do if ch[i] = false then begin dzap := false; writeln('Vvedeni ne vse zapisi'); end else dzap := true; if dzap = true then mark(avtovl); end else Writeln('Ne vvedeno obshee chislo zapisei'); end; '5': begin if fzap = true then begin for i := 1 to n do if ch[i] = false then begin dzap := false; writeln('Vvedeni ne vse zapisi'); end else dzap := true; if dzap = true then mostold(avtovl); end else Writeln('Ne vvedeno obshee chislo zapisei'); end; '6': begin if fzap = true then begin for i := 1 to n do if ch[i] = false then begin dzap := false; writeln('Vvedeni ne vse zapisi'); end else dzap := true; if dzap = true then oprmarki(avtovl); end else Writeln('Ne vvedeno obshee chislo zapisei'); end; end; end; end. |