Опубликован: 21.03.2012 | Доступ: свободный | Студентов: 2942 / 222 | Оценка: 4.44 / 4.19 | Длительность: 06:43:00
Специальности: Программист
Лекция 3:

Типовые алгоритмы и задачи, решаемые с их помощью

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Задачи "Разбор предложения на слова"
  1. Заменить слово 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.

    Тест:

    Дано:

    Мама мыла раму

    мыла

    красила

    Результат: Мама красила раму
  2. Вывести на экран самое длинное и самое короткое слово в предложении.

    Идея решения: Введенное с клавиатуры предложение, воспользовавшись типовым алгоритмом "РАЗБОРА" ПРЕДЛОЖЕНИЯ НА СЛОВА помещаем в массив. Затем, применив типовой алгоритм ПОИСКА МАКСИМАЛЬНОГО ЭЛЕМЕНТА найдем самое длинное и самое короткое слово в предложении.

    Решение задачи на Бейсике:

    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.
    

    Тест:

    Дано: Aaaa ss dddd fffff g hh
    Результат:

    самое короткое слово-g

    самое длинное слово-fffff

  3. Ввести предложение. Выдать его на экран, поменяв порядок следования слов в предложении.

    Идея решения: Введенное с клавиатуры предложение, воспользовавшись типовым алгоритмом "РАЗБОРА" ПРЕДЛОЖЕНИЯ НА СЛОВА помещаем в массив. Выводим массив с конца. Для организации хранения в массиве слов в обратном порядке необходимо воспользоваться зависимостью УМЕНЬШАЮЩЕЙСЯ ПЕРЕМЕННОЙ ОТ УВЕЛИЧИВАЮЩЕГОСЯ СЧЕТЧИКА ЦИКЛА и поменять порядок следования слов в массиве (проделайте это самостоятельно).

    Решение задачи на Бейсике:

    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.

    Тест:

    Дано: Мама мыла раму
    Результат: раму мыла Мама
  4. Ввести предложение. Выдать его на экран, изменив порядок следования букв в каждом слове, оставив порядок следования слов в предложении прежним.

    Идея решения: Введенное с клавиатуры предложение, воспользовавшись типовым алгоритмом "РАЗБОРА" ПРЕДЛОЖЕНИЯ НА СЛОВА помещаем в массив. Инвертируем содержимое каждого элемента массива. В приведенной ниже программе на Паскале в массиве хранится предложение с обратным порядком слов. Изменить порядок слов можно, воспользовавшись зависимостью УМЕНЬШАЮЩЕЙСЯ ПЕРЕМЕННОЙ ОТ УВЕЛИЧИВАЮЩЕГОСЯ СЧЕТЧИКА ЦИКЛА.

    Решение задачи на Бейсике:

    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, заполненного с клавиатуры. Вставить после минимального элемента ноль.
  • Ввести число. Найти произведение четных цифр в нем.
  • Ввести число в десятичной системе счисления. Определить, чего больше - нулей или единиц в его двоичном представлении?
  • Ввести предложение. Найти, сколько слов нем начинается и заканчивается одной и той же буквой.
< Лекция 2 || Лекция 3: 1234 || Лекция 4 >