Типовые алгоритмы и задачи, решаемые с их помощью
Задачи "Разбор предложения на слова"
-
Заменить слово Slovo1 на слово Slovo2 в предложении. Вывести новое предложение на экран.
Решение задачи на Бейсике:
input "введите предложение"; a$ input "искомое слово"; slovo1$ input "слово-замена"; slovo2$ n=len(a$) for i=1 to n if mid$(a$,i,1)=" " then k=k+1 next k=k+1 dim a$(k) j=1 for i=1 to n if mid$(a$,i,1)=" " then j=j+1 else a$(j)=a$(j)+mid$(a$,i,1) next for i=1 to k if a$(i)=slovo1$ then a$(i)=slovo2$ next for i=1 to k print a$(i); " "; next
Решение задачи на Паскале:
var b: array [1..10] of string; a, a1, a2: string; n, i, j, k: integer; begin writeln ('предложение'); readln (a); writeln ('искомое слово'); readln (a1); writeln ('слово-замена'); readln(a2); n:=length (a); k:=0; for i:=1 to n do if copy(a,i,1)=' ' then k:=k+1; k:=k+1; j:=1; for i:=1 to n do if copy(a,i,1)=' ' then j:=j+1 else b[j]:=b[j]+copy(a,i,1); for i:=1 to k do if b[i]=a1 then b[i]:=a2; for i:=1 to k do writeln (b[i]); end.
Тест:
-
Вывести на экран самое длинное и самое короткое слово в предложении.
Идея решения: Введенное с клавиатуры предложение, воспользовавшись типовым алгоритмом "РАЗБОРА" ПРЕДЛОЖЕНИЯ НА СЛОВА помещаем в массив. Затем, применив типовой алгоритм ПОИСКА МАКСИМАЛЬНОГО ЭЛЕМЕНТА найдем самое длинное и самое короткое слово в предложении.
Решение задачи на Бейсике:
input "введите предложение"; a$ n=len(a$) for i=1 to n if mid$(a$,i,1)=" " then k=k+1 next k=k+1 dim a$(k) j=1 for i=1 to n if mid$(a$,i,1)=" " then j=j+1 else a$(j)=a$(j)+mid$(a$,i,1) next min=len(a$(1)) max=len(a$(1)) for i=1 to k if len (a$(i))>max then max=len (a$(i)): nmax=i if len (a$(i))<min then min=len (a$(i)): nmin=i next print "самое короткое слово-"; a$(nmin) print "самое длинное слово-"; a$(nmax)
Решение задачи на Паскале:
var a: array [1..100] of string; b: string; nmax, nmin, max, min, n, s, i, j, x, k: integer; begin readln (b); n:=length(b); k:=0; for i:=1 to n do if copy(b,i,1)=' ' then k:=k+1; k:=k+1; j:=1; for i:=1 to n do if copy(b,i,1)=' ' then j:=j+1 else a[j]:=a[j]+copy(b,i,1); min:=length(a[1]); max:=length(a[1]); for i:=1 to k do begin if length(a[i])>max then begin max:=length (a[i]); nmax:=i; end; if length(a[i])<min then begin min:=length (a[i]); nmin:=i; end; end; writeln ('самое короткое слово-', a[nmin]); writeln ('самое длинное слово-', a[nmax]); end.
Тест:
-
Ввести предложение. Выдать его на экран, поменяв порядок следования слов в предложении.
Идея решения: Введенное с клавиатуры предложение, воспользовавшись типовым алгоритмом "РАЗБОРА" ПРЕДЛОЖЕНИЯ НА СЛОВА помещаем в массив. Выводим массив с конца. Для организации хранения в массиве слов в обратном порядке необходимо воспользоваться зависимостью УМЕНЬШАЮЩЕЙСЯ ПЕРЕМЕННОЙ ОТ УВЕЛИЧИВАЮЩЕГОСЯ СЧЕТЧИКА ЦИКЛА и поменять порядок следования слов в массиве (проделайте это самостоятельно).
Решение задачи на Бейсике:
input "введите предложение"; a$ n=len(a$) for i=1 to n if mid$(a$,i,1)=" " then k=k+1 next k=k+1 dim a$(k) j=1 for i=1 to n if mid$(a$,i,1)=" " then j=j+1 else a$(j)=a$(j)+mid$(a$,i,1) next for i= k to 1 step -1 print a$(i); " "; next
Решение задачи на Паскале:
var b: array[1..10] of string; a: string; n, i, j, k: integer; begin writeln ('предложение'); readln (a); n:=length (a); k:=0; for i:=1 to n do if copy(a,i,1)=' ' then k:=k+1; k:=k+1; j:=1; for i:=1 to n do if copy(a,i,1)=' ' then j:=j+1 else b[j]:=b[j]+copy(a,i,1); for i:=k downto 1 do writeln (b[i]); end.
Тест:
-
Ввести предложение. Выдать его на экран, изменив порядок следования букв в каждом слове, оставив порядок следования слов в предложении прежним.
Идея решения: Введенное с клавиатуры предложение, воспользовавшись типовым алгоритмом "РАЗБОРА" ПРЕДЛОЖЕНИЯ НА СЛОВА помещаем в массив. Инвертируем содержимое каждого элемента массива. В приведенной ниже программе на Паскале в массиве хранится предложение с обратным порядком слов. Изменить порядок слов можно, воспользовавшись зависимостью УМЕНЬШАЮЩЕЙСЯ ПЕРЕМЕННОЙ ОТ УВЕЛИЧИВАЮЩЕГОСЯ СЧЕТЧИКА ЦИКЛА.
Решение задачи на Бейсике:
input "введите предложение"; a$ n=len(a$) for i=1 to n if mid$(a$,i,1)=" " then k=k+1 next k=k+1 dim a$(k) j=1 for i=1 to n if mid$(a$,i,1)=" " then j=j+1 else a$(j)=a$(j)+mid$(a$,i,1) next rem=инвертируем слова========================== for i= 1 to k x$=" " for j=len (a$(i)) to 1 step -1 x$=x$+mid$ (a$(i),j,1) next j a$(i)=x$ next i for i= 1 to k print a$(i); " "; next
Решение задачи на Паскале:
var b: array[1..10] of string; a: string; n, i, j, k: integer; begin writeln ('предложение'); readln (a); n:=length (a); k:=0; for i:=1 to n do if copy(a,i,1)=' ' then k:=k+1; k:=k+1; j:=1; for i:=n downto 1 do if copy(a,i,1)=' ' then j:=j+1 else b[j]:=b[j]+copy(a,i,1); for i:=k downto 1 do writeln (b[i]); end.
Тест:
Ключевые термины
- Одномерный массив - именованный набор однотипных переменных, расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу.
- Латинский квадрат - двумерный массив, в каждой строке и столбце которого нет повторяющихся элементов.
- Циклический сдвиг элементов массива - сдвиг всех элементов массива вправо (влево) с помещением последнего элемента на первое место (первого элемента на последнее место).
- Число Армстронга - сумма цифр этого числа, возведенных в n-ую степень (n - количество цифр числа) равна самому числу.
- Цифровой корень числа - получается при сложении цифр числа, затем при сложении цифр вновь полученного числа и так до тех пор, пока в сумме не будет получена одна цифра.
- Система счисления - символический метод записи чисел, представление чисел с помощью письменных знаков.
Краткие итоги
Необходимые для решения задач типовые алгоритмы обработки одномерных массивов:
- Заполнение, вывод элементов массива
- Сумма, произведение элементов
- Выбор по условию
- Максимальный (минимальный) элемент
- Вставка, удаление элементов
- Инвертирование элементов
Необходимые типовые алгоритмы обработки строк:
- "Разбор" числа на цифры, помещение каждой цифры в ячейку массива.
- "Разбор" строки, помещение каждого символа в ячейку массива.
- "Разбор" предложения, помещение каждого слова в ячейку массива.
Набор для практики
Вопросы.
- Какова зависимость индексов элементов, которые мы меняем местами при выполнении инвертирования элементов массива от счетчика цикла?
- Что произойдет, если в типовом алгоритме инвертирования элементов массива счетчик цикла отработает до n (n - количество элементов в массиве)?
- Что произойдет, если в типовом алгоритме вставки элементов перемещение элементов с i-ной в (i+1)-ую позицию производить не с конца массива, а начиная с номера вставляемого элемента?
- Каково назначение функций length (a) и copy(a,k,n)?
- Сформулируйте алгоритм перевода числа из n-ричной системы счисления в 10-ую.
- Сформулируйте алгоритм перевода числа из 10-тичной системы счисления в n-ричую.
Упражнения
- Найти произведение четных, сумму отрицательных, количество нулевых элементов одномерного массива размерностью 10, заполненного с клавиатуры.
- Удалить максимальный элемент из одномерного массива размерностью 10, заполненного с клавиатуры. Вставить после минимального элемента ноль.
- Ввести число. Найти произведение четных цифр в нем.
- Ввести число в десятичной системе счисления. Определить, чего больше - нулей или единиц в его двоичном представлении?
- Ввести предложение. Найти, сколько слов нем начинается и заканчивается одной и той же буквой.