программа. Программирование_Паскаль_ЛабРаб 1 семестр. Контроль обучения 4 Первое контрольное задание 5 Второе контрольное задание 31
Скачать 0.69 Mb.
|
Второе контрольное заданиеВторое контрольное (текстовое) задание посвящено созданию программ с использованием массивов (одномерных и матриц), переменных строкового типа (строк) и множеств. В этих задачах полезно использовать подпрограммы. Во всех задачах строки вводятся пользователем с клавиатуры. Задание состоит из четырех задач, вам требуется составить программы на языке Паскаль. Требуется писать программы в рамках структурного программирования. В частности, запрещается использовать операторы перехода и метки. Примеры задач с решением ОДНОМЕРНЫЕ МАССИВЫ 1. Дан массив чисел. Найти, сколько в нем пар одинаковых соседних элементов. Переменные: mas – массив чисел; n – размер массива; i – переменная цикла; k – количество одинаковых пар соседних элементов. Алгоритм решения задачи: вводим длину массива n, значение элементов массива и устанавливаем начальное значение k; последовательно просматриваем элементы и, если очередной mas[i] равен следующему mas[i+1], то увеличиваем значение k на единицу; выводим результат. const m=100; var mas : array [1..m] of integer; i, k, n : integer; begin write('Введите размер массива n='); readln(n); k:=0; for i:=1 to n do begin write('Введите элемент массива'); readln(mas[i]); end; for i:=1 to n–1 do if mas[i]=mas[i+1] then k:=k+1; wrietln('Одинаковых пар соседних элементов ',k); end. 2. Программа. Дано 100 целых чисел. Распечатать их в обратном порядке по 6 чисел в строке. const n=100; d=6; var x : array [1..n] of integer; i, k : integer; begin {ввод массива:} writeln('Введите массив из ', n,' чисел'); for i:=1 to n do read(x[i]); {вывод массива по d чисел в строке:} k:=0; {номер числа в строке} for i:=n downto 1 do begin k:=k+1; write(x[i]:4); if k=d then begin k:=0; writeln end end; if k<>0 then writeln end. 3. Сортировка слиянием const k=50; m=20; n=70; {n=k+m} var x : array [1..k] of real; y : array [1..m] of real; z : array [1..n] of real; i,p,j : integer; Элементы каждого из массивов x и y упорядочены по неубыванию. Объединить элементы этих двух массивов в один массив z так, чтобы они снова оказались упорядоченными по неубыванию. const k=50; m=20; n=70; {n=k+m} var x : array [1..k] of real; y : array [1..m] of real; z : array [1..n] of real; i, p, j : integer; begin writeln('Введите массив x'); for i:=1 to k do read(x[i]); writeln; writeln('Введите массив y'); for i:=1 to m do read(y[i]); writeln; writeln('Введенные Вами массивы'); writeln('Массив x'); for i:=1 to k do write(x[i]:7:3); writeln; writeln('Массив y'); for i:=1 to m do write(y[i]:7:3); writeln; p:=1; {индекс очередного элемента из z} i:=1; {из х} j:=1; {из y} {пока есть нерассмотренные элементы и в x, и в y: } repeat if x[i] begin z[p]:=x[i]; i:=i+1 end else begin z[p]:=y[j]; j:=j+1 end; p:=p+1 until (i>k)or(j>m); {один из массивов x или y исчерпан --> перепись в z оставшихся элементов другого массива:} if i>k {исчерпан массив x:} then repeat z[p]:=y[j]; j:=j+1; p:=p+1 until j>m else repeat z[p]:=x[i]; i:=i+1; p:=p+1 until i>k; writeln('Полученный массив: '); for i:=1 to n do write(z[i]:7:3); end. 4. type shift=1..99; scale=array [1..100] of real; Описать процедуру move(s,k), которая преобразует шкалу s, циклически сдвигая ее элементы на k позиций влево, где k – параметр типа shift. type shift=1..99; scale=array [1..100] of real; var a:scale; m:shift;n,i:integer; procedure move( var s:scale; k:shift); var i:integer; t:scale; {вспомогательный массив} begin {t[n–k+1..n]:=s[1..k]:} for i:=1 to k do t[n–k+i]:=s[i]; {t[1..n–k]:=s[k+1..n]:} for i:=k+1 to n do t[i–k]:=s[i]; s:=t end; begin writeln('Введите размер массива'); readln(n); writeln('Введите массив'); for i:=1 to n do read(a[i]); writeln('Введите цикл сдвига <=', n–1); readln(m); writeln('Исходный массив'); for i:=1 to n do write(a[i]:7:2); writeln; move(a,m); writeln('Полученный массив'); for i:=1 to n do write(a[i]:7:2); writeln; end. МНОГОМЕРНЫЕ МАССИВЫ 5. Дана матрица NM, состоящая из натуральных чисел. Выбрать в строках самые левые наименьшие элементы и поставить их в первый столбец. Для решения этой задачи нужно сначала найти самый левый минимальный элемент в каждой строке и запомнить его местоположение, а затем поменять его местами с элементом в первом столбце. Переменные: a – двумерный массив; n, m – количество строк и столбцов массива; i, j – переменные цикла; jm – столбец минимального элемента для каждой строки; min – текущий минимум. Алгоритм решения задачи: вводим размеры массива А и значения его элементов; просматриваем строки массива слева направо, ищем минимальное значение и запоминаем значения индексов; для каждой строки меняем местами минимальный элемент и элемент в первом столбце; выводим матрицу на экран. const t=100; s=100; var a : array [1..t,1..s] of integer; n, m, jm, i, j, min : integer; begin write('Введите количество строк n='); readln(n); write('Введите количество столбцов m='); readln(m); for i:=1 to n do begin write('Введите через пробел', m,'чисел'); for j:=1 to m do read(a[i,j]); end; for i:=1 to n do begin min:= a[i,1]; jm:=1; for j:=1 to m do if min > a[i,j] then begin jm:=j; min:=a[i,j]; end; a[i,jm]:=a[i,1]; a[i,1]:=min; end; for i:=1 to n do {вывод матрицы на экран в виде таблицы} begin for j:=1 to m do write(a[i,j]:4); writeln; end end. 6. Дана квадратная матрица NN, состоящая из натуральных чисел. Зеркально отразить ее элементы относительно побочной диагонали. Вывести результат на экран. Рассмотрим матрицу 33 и посмотрим, что происходит с элементами при зеркальном отображении: A11 A12 A13 A33 A23 A13 A21 A22 A23 <-> A32 A22 A12 A31 A32 A33 A31 A21 A11 Если считать, что после преобразования у нас появилась новая матрица B, то соответствие между элементами устанавливается следующим образом: B11 <-> A33 B12 <-> A23 B21 <-> A32 B22 <-> A22 и т.д., т.е. B[I,J] <-> A[L,M] Внимательно изучив соответствие, можно утверждать, что для элементов матрицы NxM справедлива следующая система уравнений: I+M = N+1, J+L = N+1. Отсюда правило преобразования элементов выглядит следующим образом: B[I,J] = A[N+1–J,N+1–I]. Переменные: a, b – двумерные массивы; m – количество строк и столбцов массива; i, j – переменные цикла; k– вспомогательная переменная. Алгоритм решения задачи: вводим размеры массива A и присваиваем значения его элементам; присваиваем значения элементам матрицы B по представленным выше формулам и выводим их на экран. Программа, решающая данную задачу, выглядит так: const n=100; var a,b : array [1..n] of integer; k, m, i, j : integer; begin write('Введите размер матрицы m='); readln(m); writeln('Исходная матрица'); k:=1; for i:=1 to m do for j:=1 to m do begin a[i,j]:=k; k:=k+1; if j else writeln(a[i,j]:4) end; writeln('Матрица после преобразования'); for i:=1 to m do for j:=1 to m do begin b[i,j]:= a[m+1–j, m+1–i]; if j else writeln(b[i,j]:4) end; end. 7. Вычислить: а) С = A + B Создадим две процедуры: tab_in(var a1 : mas) – для ввода элементов массива с клавиатуры. Параметр а1 – формируемый массив; tab_out(var b1 : mas) – для вывода массива на экран. Параметр b1 – имя выводимого массива. type mas=array [1..40,1..40] of real; vec=array[1..40] of real; var a,b,c : mas; x,y : vec; i, j, n, k : integer; r, s : real; procedure tab_in(var a1 : mas); var i, j : integer; begin for i:=1 to n do for j:=1 to n do read(a1[i,j]); writeln; end; procedure tab_out(var b1 : mas); var i,j:integer; begin for i:=1 to n do begin for j:=1 to n do write(b1[i,j]:7:3); writeln; end; end; begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу A'); tab_in(a); writeln('Введите матрицу B'); tab_in(b); writeln('Матрица A'); tab_out(a); writeln('Матрица B'); tab_out(b); for i:=1 to n do for j:=1 to n do c[i,j]:=a[i,j]+b[i,j]; writeln('Полученная матрица C=A+B'); tab_out(c); end. б) y = A * x Основная программа begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу A'); tab_in(a); writeln('Введите вектор x'); for i:=1 to n do read(x[i]); writeln; writeln('Матрица A'); tab_out(a); writeln('Введенный вектор x'); for i:=1 to n do write(x[i]:7:2); writeln; for i:=1 to n do begin s:=0; for j:=1 to n do s:=s+A[i,j]*x[j]; y[i]:=s end; writeln('Полученный вектор y=A*x'); for i:=1 to n do write (y[i]:7:3); writeln; end. в) С = A * B Основная программа begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу A'); tab_in(a); writeln('Введите матрицу B'); tab_in(b); writeln('Матрица A'); tab_out(a); writeln('Матрица B'); tab_out(b); for i:=1 to n do for j:=1 to n do begin s:=0; for k:=1 to n do s:=s+a[i,k]*b[k,j]; c[i,j]:=s; end; writeln('Полученная матрица C=A+B'); tab_out(c); end. г) транспонированную матрицу B Основная программа begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу B'); tab_in(b); writeln('Матрица B'); tab_out(b); for i:=1 to n–1 do for j:=i+1 to n do begin r:=b[i,j]; b[i,j]:=b[j,i]; b[j,i]:=r; end; writeln; writeln('Полученная транспонированная матрица B'); tab_out(b); end. СТРОКОВЫЙ ТИП И МНОЖЕСТВА 8. Вывести в одну строку ABBCCCDDDDE .... ZZ...Z. Переменные: i – переменная цикла; определяет, какая буква выводится; k – количество повторений буквы; j – переменная цикла. Алгоритм решения задачи: цикл for i:='A' to 'z' do определяет, какую букву выводим на печать; внутренний цикл for j:=1 to k do определяет, сколько раз будет печататься буква; выводим заданную букву k раз на экран; после вывода всех букв закрываем строку оператором writeln. var i : char; k,j : integer; begin k:=1; for i:= 'A' to 'Z' do begin for j:=1 to k do write(i); k:=k+1; end; writeln; end. 9. Дана строка символов. Удалить из нее все знаки препинания. Переменные: i – переменная цикла; L – длина строки; str – строка текста; str1 – вспомогательная строка; m – множество знаков препинания. Алгоритм решения задачи: задаем значение множества m – множества знаков препинания; вводим строку str с клавиатуры; цикл for i:=1 to l do осуществляет построение вспомогательной строки без знаков препинания: берем отдельный символ строки и проверяем, является ли он знаком препинания. Если да, то присоединяем этот символ к новой вспомогательной строке. Если нет, то переходим к следующему элементу строки; первоначальную строку заменяем на вспомогательную; выводим сроку на экран. var str, str1 : string; L, i : integer; m : set of char; begin m:=['.', ',', '!', ':', ';', '?', '-']; writeln('Введите текст'); readln(str); L:=length(str); str1:=''; for i:=1 to L do if not(str[i] in m) then str1:=str1+str[i]; str:=str1; writeln('Преобразованный текст ', str); end. 10. Дана строка символов. Выделить подстроку между первой и последней точкой. Переменные: i – номер позиции, которая соответствует точке; j – местоположение первой точки; m – местоположение последней точки; str – строка текста; s1 – вспомогательная переменная. Алгоритм решения задачи: вводим строку str и присваиваем значение вспомогательной переменной s1:=str; определяем местоположение первой точки в тексте; если точка есть, то вырезаем из s1 текст до нее; ищем последнюю точку в цикле while i<>0 do; если она есть, то значение переменной m указывает на ее местоположение; в зависимости от присутствия точек выделяем подстроку s1:=copy(str,j+1,m–j–1) и выводим результат на экран. var str, s1 : string; i, m, j : integer; begin writeln('Введите текст'); readln(str); s1:=str; i:=pos('.',s1); j:=i; m:=0; if (i<>0) then begin while i<>0 do begin delete(s1,1,i); m:=m+i; i:=pos('.',s1); end; if m<>j then begin s1:=copy(str,j+1,m–j–1); writeln('Часть текста между 1-й и последней точкой'); writeln(s1); end else writeln('В тексте только одна точка'); end else writeln('В тексте нет ни одной точки'); end. 11. Дана строка символов. Определить, является ли она записью десятичного числа, кратного трем. Необходимо удостовериться, что введенная строка состоит только из цифр, т.е. может быть преобразована в десятичное число. Само преобразование цифры в число сделать очень просто. Поскольку коды символьных переменных – цифр – следуют один за другим, то функция ord в выражении ord(s1[i])–ord('0') поможет нам сделать это. Переменные: i – переменная цикла; s1 – строка цифр; m – длина строчки; k – счетчик цифр. Алгоритм решения задачи: вводим строку s1; организуем в строке поиск цифр до тех пор, пока не встретим конец строчки или не обнаружим наличие ошибки в арифметическом выражении; если встречается цифра, то добавляем ее к общей сумме цифр; после определения суммы цифр, определяем, кратна ли она на трем; в зависимости от полученного результата выводим ответ на экран. var s1 : string; k, i, m : integer; begin writeln('Введите строку'); readln(s1); m:=length(s1); k:=0; i:=1; repeat case s1[i] of '0'..'9' : k:=k+(ord(s1[i])–ord('0')); ' ' : ; else k:=–1; end; i:=i+1; until (i>m) or (k<0); if k mod 3 = 0 then writeln('Это десятичное число, кратное 3') else writeln('Это не десятичное число, кратное 3') end. 12. Дана строка символов. Группы символов в ней между группами пробелов считаются словами. Посчитать, сколько слов содержит данная строка. Переменные: i – вспомогательная переменная; s – строка текста; k – счетчик слов. Алгоритм решения задачи: вводим строку s; на каждом шаге внешнего цикла отыскиваем очередное слово в строке и увеличиваем счетчик слов; выводим результат на экран. var s: string; i,k: integer; begin writeln('Введите строку'); readln(s); k:=0; i:=1; while i<=length(s) do begin {пропускаем пробелы} while (s[i]=' ') and (i<=length(s)) do i := i+1; if i<=length(s) then k := k+1; {ищем новый пробел} while (s[i]<>' ') and (i<=length(s)) do i := i+1; end; writeln('количество слов =',k) end. 13. Дана строка символов. Группы символов в ней между группами пробелов считаются словами. Определить длину самого короткого и самого длинного слова. Переменные: i – индекс очередного символа в строке; s – строка текста; beginStr и endStr – начало и конец слова; len – длина слова; max – длина наибольшего слова; min – длина наименьшего слова. Алгоритм решения задачи: вводим строку s; устанавливаем начальные значения max и min; организуем внешний цикл для поиска очередного слова в строке; найдя слово, определяем его длину и при необходимости корректируем max и min; выводим результат на экран. var s:string; i,min,max,beginStr,endStr,len:integer; begin writeln('Введите строку'); readln(s); max:=0; min:=255; i:=1; while i<=length(s) do begin {пропускаем пробелы} while (s[i]=' ') and (i<=length(s)) do i:=i+1; if i<=length(s) then begin beginStr:=i; {нашли начало слова, ищем его конец} while (s[i]<>' ') and (i<=length(s)) do i:=i+1; endStr:=i–1; writeln(beginStr,'–',endStr); len:=endStr–beginStr+1; if len>max then max:=len; if len end end; writeln('длина самого длинного слова =',max); writeln('длина самого короткого слова =',min) end. 14. Дана строка. Преобразовать строку, заменив в ней каждую группу стоящих рядом точек одной точкой. Переменные: s – строка текста. Для решения задачи: вводим строку s; найдем пару стоящих рядом точек, удалим одну из них; повторим поиск. И так до тех пор, пока в строке не окажется ни одной такой пары точек; выводим результат на экран. var s : string; begin writeln('Введите строку'); readln(s); while pos('..', s) <> 0 do delete (s, pos('..', s), 1); writeln('Полученная строка : ', s); end. 15. Присвоить литерным переменным с2, с1 и с0 соответственно левую, среднюю и правую цифры трехзначного числа k. var c0, c1, c2 : char; n0, k, d : integer; begin writeln('Введите трехзначное число'); readln(k); n0:=ord('0'); d:=k div 100; c2:=chr(n0+d); d:=k mod 100 div 10; c1:=chr(n0+d); d:=k mod 10; c0:=chr(n0+d); writeln('c2= ', c2); writeln('c1= ',c1); writeln('c0= ',c0); end. 16. Используя только литерный ввод, т.е. процедуру readln(c), где с – литерная переменная, ввести непустую последовательность цифр, перед которой может находиться знак «+» или «–» и за которой следует пробел, и, получив соответствующее число, присвоить его целой переменной k. var c : char; sign, n0, k : integer; begin {определение знака числа:} sign:=1; readln(c); if c='–' then begin sign:=–1; readln(c) end else if c='+' then readln(c); {чтение цифр (первая – в c) и вычисление абсолютной величины числа k по схеме Горнера:} n0:=ord('0'); k:=0; repeat k:=10*k+ord(c)–n0; readln(c) until c=' '; {учет знака:} k:=sign*k; writeln(k); end. 17. Программа. Напечатать заданную непустую строку: а) удалив из нее все цифры и удвоив знаки «+» и «–»: var s : string; i : integer; begin writeln('Введите строку:'); readln(s); for i:=1 to length(s) do if (s[i]='+')or(s[i]='–') then write(s[i],s[i]) else if (s[i]<'0')or(s[i]>'9') then write(s[i]); writeln end. б) удалив из нее все знаки «+», непосредственно за которыми идет цифра: var a, b : char; {a – очередная литера строки, b – следующая} s : string; i : integer; begin writeln('Введите строку:'); readln(s); for i:=1 to length(s) do begin a:=s[i]; if a<>'+' then write(a) else if i b:=s[i+1]; if (b<'0') or (b>'9') then write(a) end else write(a); end; writeln end. МНОЖЕСТВА 18. type str=string[100]; Описать функцию count(s), подсчитывающую общее количество цифр и знаков '+', '–' и '*', входящих в строку s. Переменные: а) в функции count: s – строка (формальный параметр); i – счетчик цикла (локальная переменная); k – общее количество цифр и знаков ‘+’, ‘*’, ‘–‘ в заданной строке (локальная переменная); б) в основной программе: s1 – введенная строка (локальная переменная); k1 – общее количество цифр и знаков ‘+’, ‘*’, ‘–‘ в заданной строке s1 (фактический параметр). Алгоритм решения задачи: создаем функцию count, подсчитывающую общее количество цифр и знаков ‘+’, ‘*’, ‘–‘ в заданной строке; вводим строку s1; вызываем функцию count и выводим значение счетчика k1 на экран; завершаем работу программы. type str=string[100]; var s1 : str; k1 : integer; function count(var s:str) : integer; var i, k : integer; begin k:=0; for i:=1 to length(s) do if s[i] in ['0'..'9', '+', '–', '*'] then k:=k+1; count:=k end; begin writeln('Введите строку'); readln(s1); k1:=count(s1); writeln('Количество цифр и знаков – ', k1:5); end. 19. type M=set of 0..99; Описать функцию card(A), подсчитывающую количество элементов множества A типа M (ноль используйте как прекращение ввода). (Например, card([5,8,23])=3.) Переменные: а) в функции card: A – множество (формальный параметр); p – счетчик цикла от 0 до 99 (локальная переменная); k – количество элементов множества А (локальная переменная); б) в основной программе: x – введенное число (локальная переменная); b – созданное множество (локальная переменная); k1 – количество элементов в созданном множестве (фактический параметр). Алгоритм решения задачи: создаем функцию card, подсчитывающую количество элементов множества; организуем пустое множество; в цикле repeat … until вводим числа до тех пор, пока не ввели 0, и дописываем их во множество; вызываем функцию card и выводим значение счетчика k1 на экран; завершаем работу программы. type M=set of 0..99; var b : m; k1, x : integer; function card(A:M) : integer; var p,k : integer; begin k:=0; for p:=0 to 99 do if p in A then k:=k+1; card:=k end; begin b:=[ ]; repeat write('Введите число >0<=99 – '); readln(x); b:=b+[x]; until x=0; k1:=card(b); writeln('Количество различных элементов множества', k1); end. 20. Программа. Дана строка из строчных латинских букв. Напечатать первые вхождения букв в текст, сохраняя их исходный взаимный порядок. Переменные: let – множество малых латинских букв; c – очередной символ строки; s – введенная строка; i – переменная цикла. Алгоритм решения задачи: организуем пустое множество let; вводим строчку s; организуем цикл, в котором просматриваем символы строки s до тех пор, пока не встретим ‘.’, и проверяем, входит ли этот символ во множество let (т.е. символ – малая латинская буква); если очередной символ строки не входит во множество let, то этот символ встретился впервые; выводим его на экран и дописываем во множество; завершаем работу программы. var let : set of 'a'..'z'; s : string; c : char; i : integer; begin let:=[ ]; {множество букв в рассмотренной части текста} readln(s); i:=1; while s[i]<>'.' do begin if not(s[i] in let) then {1-е вхождение} begin write(s[i]); c:=s[i]; let:=let+[c] end; i:=i+1; end; writeln end. Варианты заданий
|