Инфоурок Информатика Другие методич. материалыЗадачи к урока по теме "Подпрограммы"

Задачи к урока по теме "Подпрограммы"

Скачать материал

Задача1

Описать процедуру нахождения по заданной длине стороны треугольника и величинам двух прилежащих углов длин остальных сторон треугольника и величины третьего угла.

Алгоритм решения задачи: 

По известным двум углам треугольника и стороне между ними можно найти остальные стороны, используя теорему синусов: отношение синусов углов треугольника к длинам противолежащих сторон равны между собой. Для треугольника ABC получаем:
sin A / BC = sin B / AC = sin C / AB.

Отсюда AC = (sin B * AB) / sin C,
BC = (sin A * AB) / sin C.

Если известны два угла треугольника, то третий угол легко вычисляется, учитывая, что сумма углов треугольника равна 180 градусам.

В Pascal функция sin() принимает угол выраженный в радианах. Чтобы перевести градусы в радианы нужно воспользоваться формулой:
rad = Угол * pi / 180.

Программа на языке Паскаль: 

var
    K,L,M,KL,LM,KM: real;
 
procedure triangle(var A,B,C,AB,BC,AC: real);
    var radA, radB, radC: real;
    begin
        C := 180 - A - B;
        radA := A * PI/180;
        radB := B * PI/180;
        radC := C * PI/180;
        BC := (sin(radA) * AB) / sin(radC);
        AC := (sin(radB) * AB) / sin(radC);
    end;
 
begin
    write('A = '); readln(K);
    write('B = '); readln(L);
    write('AB = '); readln(KL);
    triangle(K,L,M,KL,LM,KM);
    writeln('C = ',M:7:2);
    writeln('BC = ',LM:6:2);
    writeln('AC = ',KM:6:2);
 
readln;
end.

Задача2: 

Описать функцию вычисления f(x) по формуле:
f(x)= x^2 при -2<=x<2;
x^2+4x+5 при x>=2;
4 при x<-2.

Используя эту функцию для n заданных чисел, вычислить f(x). Среди вычисленных значений найти наибольшее.

Программа на языке Паскаль: 

const
    n = 5;
var
    a, max: integer;
    i: byte;
    arr: array[1..n] of integer;
 
function func(x: integer): integer;
    begin
        if (x >= -2) and (x < 2) then
            func := x * x
        else
            if x >= 2 then
                func := x * x + 4 * x + 5
            else
                func := 4;
    end;
 
begin
    max := -32768;
    for i:=1 to n do begin
        write('a = '); readln(a);
        arr[i] := func(a);
        if arr[i] > max then
            max := arr[i];
    end;
 
    write('Result: ');
    for i:=1 to n do
        write(arr[i], ' ');
    writeln;
    writeln('max = ', max);
 
readln;
end.

 

 

Задача 3: 

Число представленное в шестнадцатеричной системе счисления перевести в десятичную систему счисления.

Алгоритм решения задачи: 

Алгоритм аналогичен переводу двоичного числа, за исключением того, что цифры обозначенные буквами от A до F следует заменить цифрами от 10 до 15.

Программа на языке Паскаль: 

var
    hexa: string; {шестнадцатеричное число}
    n: byte; {его длина}
    ch: char; {цифра очередного разряда как символ}
    digit: byte; {цифра очередного разряда}
    m: byte; {степень 16}
    decimal: integer; {десятичное число}
    i: byte;
 
 
function pow16(m: byte):integer;
var i: byte;
begin
    pow16 := 1;
    for i := 1 to m do
        pow16 := pow16 * 16;
end;
 
begin
    write('Hexadecimal: ');
    readln(hexa);
 
    n := length(hexa);
 
    decimal := 0;
    m := n;
    for i:=1 to n do begin
        ch := hexa[i];
        if ch in ['A'..'F'] then
            case ch of
            'A': digit := 10;
            'B': digit := 11;
            'C': digit := 12;
            'D': digit := 13;
            'E': digit := 14;
            'F': digit := 15
            end
        else
            digit := ord(ch) - ord('0');
        m := m - 1;
        decimal := decimal + digit * pow16(m);
    end;
 
    writeln('Decimal: ',decimal);
 
readln
end.

Задача 4.

Алгоритм решения задачи: 

Представленная ниже программа с процедурой вычисления корней квадратного уравнения не возвращает в основную программу ничего (просто выводит результат на экран). Однако можно написать такую процедуру, которая будет использовать глобальные переменные x1 и x2. В результате в основной ветке программы можно будет использовать полученные корни квадратного уравнения.

Программа на языке Паскаль: 

var
    a, b, c: real;
 
procedure sq (a,b,c: real);
    var d, x1, x2: real;
    begin
        d := b * b - 4 * a * c;
        if d >= 0 then begin
            x1 := (-b + sqrt (d)) / (2 * a);
            x2 := (-b - sqrt (d)) / (2 * a);
            if x1 = x2 then
                writeln ('x1 = ', x1:6:2)
            else
                writeln ('x1 = ', x1:6:2, '; x2 = ', x2:6:2)
        end
        else
            writeln ('Корней нет!')
    end;
 
begin
 
    write ('a = '); readln (a);
    write ('b = '); readln (b);
    write ('c = '); readln (c);
 
    writeln (a:6:2,'x*x + ',b:6:2,'x + ',c:6:2,' = 0');
 
    sq (a, b, c);
 
readln
end.

Задача5: 

Найти разность двух матриц по модулю, т.е. из большего элемента одной матрицы вычесть меньший элемент второй матрицы, находящийся в той же позиции.

Алгоритм решения задачи: 

Решение задачи нахождения разности двух матриц аналогично нахождению суммы матриц.

Поскольку нужно из большего элемента вычесть меньший, то можно было бы воспользоваться оператором ветвления. Однако проще использовать встроенную в Pascal функцию abs(), которая возвращает модуль переданного ей параметра. При этом не важно из большего элемента вычитается меньший (например, 5 - 3) или из меньшего больший (3 - 5), результат будет один и тот же.

Программа на языке Паскаль: 

const N = 2; M = 5;
type arr = array[1..N,1..M] of integer;
var
        one,two,three: arr;
        i,j: byte;
 
procedure matrix(var a: arr);
        begin
               for i:=1 to N do
                       for j:=1 to M do
                               a[i,j] := random(100);
        end;
 
procedure minus(var a: arr; b: arr; c: arr);
        begin
               for i:=1 to N do
                       for j:=1 to M do
                               a[i,j] := abs(b[i,j]-c[i,j]);
        end;
 
procedure printer(a: arr);
        begin
               for i:=1 to N do begin
                       for j:=1 to M do
                               write(a[i,j]:4);
                       writeln;
               end;
        end;
 
begin 
        randomize;
        matrix(one);
        printer(one);
        writeln;
        matrix(two);
        printer(two);
        writeln;
        minus(three,one,two);
        printer(three);
end.

Задача 6: 

Преобразовать строку так, чтобы буквы каждого слова в ней были отсортированы по алфавиту.

Алгоритм решения задачи: 

Решение данной задачи в общей сложности сводится к двум подзадачам. Это 1) найти индексы первого и последнего очередного слова, 2) отсортировать буквы между этими индексами. Эти две подзадачи должны выполняться столько раз, сколько слов в строке.

Вся строка в цикле перебирается посимвольно. Вводится флаговая переменная, которая сигнализирует о том, находимся ли мы внутри слова или нет. Если очередной символ не пробел и флаг показывает, что мы не в слове, то значит, текущий символ - первая буква слова. Присвоим его индекс переменной start, поменяем значение флаговой переменной (теперь она указывает, что мы внутри слова).

Если очередной символ не пробел, и флаг указывает, что мы внутри слова, то присвоим текущий индекс переменной finish. Если впоследствии за ним будет идти буква, то finish изменится, если же пробел - то эта переменная будет иметь индекс последней буквы слова.

Если встречается пробел, то флаг сбрасывается (мы вне слова). Также буквы с индексами от start до finish сортируются. Если после последнего слова строки нет пробела, то оно не будет отсортировано. Поэтому после цикла перебора символов строки выполняется еще одна сортировка.

Сортировка оформлена в виде отдельной процедуры. В качестве параметров передаются сама строка, начало и конец среза для сортировки. Используется сортировка выбором, т.к. можно использовать индексы непосредственно. В то время как в сортировке пузырьком находится разность между ними, что в данном случае приведет к ошибке.

Программа на языке Паскаль: 

var
    s: string;
    l, i, start, finish: byte;
    flag: boolean;
procedure sort(var s: string; first, last: byte);
    var
        max, i: byte;
        c: char;
    begin
        while last > first do begin
            max := first;
            for i:=first+1 to last do 
                if s[i] > s[max] then 
                    max := i;
            c := s[max];
            s[max] := s[last];
            s[last] := c;
            last := last - 1;
        end;
    end;
begin
    readln(s);
    l := length(s);
    start := 1;
    finish := 1;
    flag := False;
    for i:=1 to l do
        if s[i] = ' ' then begin
            flag := False;
            if start < finish then 
                sort(s,start,finish);
        end
        else
            if flag = False then begin
                flag := True;
                start := i;
            end
            else
                finish := i;
 
    if start < finish then // для последнего слова, когда после него не было пробела
        sort(s,start,finish);
 
    writeln(s);
end.

Задача 7: 

С помощью подпрограммы заполнить матрицы случайными числами. Написать подпрограмму, вычисляющую сумму двух матриц. Вывести на экран две исходные матрицы и их сумму (используя процедуру).

Описание переменных: 

one, two - исходные матрицы;
three - матрица-сумма двух предыдущих;
matrix - процедура, заполняющая массив случайными числами;
printer - процедура, выводящая содержимое массивов на экран;
plus - процедура, вычисляющая сумму матриц.

Алгоритм решения задачи: 

Под суммой матриц будем понимать сложение их элементов, находящихся в одинаковых позициях (имеющих одинаковые индексы). Таким образом уместно складывать матрицы одинаковой размерности. При этом будет получена третья матрица с такой же размерностью как исходные.

При решении подобной задачи лучше использовать подпрограммы (процедуры или функции), так как нам приходится заполнять несколько массивов и выводить их на экран. Без подпрограмм в коде будет содержаться много почти идентичного кода.

Используются процедуры, а не функции, так как при заполнении массивов в подпрограмму передается переменная, а не значение. Таким образом, процедура заполняет "внешнюю" для нее матрицу.

В процедуру, вычисляющую сумму матриц, передается три параметра: переменная матрицы-суммы, значения первой и второй матрицы.

В основной ветке программы процедуры последовательно вызываются.

Следует обратить внимание, что randomize вызывается единожды в основной ветке программы. Если данную команду вставить в процедуру заполнения массива, то оба массива будут заполнены одинаковыми числами. Это связано с тем, что "зерно" зависит от таймера, а между двумя вызовами проходит мало времени, чтобы таймер изменил значение. Таким образом, "зерно" в программе надо получать один раз. В этом случае при повторном вызове процедуры отсчет по формуле генерации псевдослучайных чисел продолжается, а не инициируется заново.

Программа на языке Паскаль: 

const N = 2; M = 5;
type arr = array[1..N,1..M] of integer;
var
        one,two,three: arr;
        i,j: byte;
 
procedure matrix(var a: arr);
        begin
               for i:=1 to N do
                       for j:=1 to M do
                               a[i,j] := random(100);
        end;
 
procedure plus(var a: arr; b: arr; c: arr);
        begin
               for i:=1 to N do
                       for j:=1 to M do
                               a[i,j] := b[i,j]+c[i,j];
        end;
 
procedure printer(a: arr);
        begin
               for i:=1 to N do begin
                       for j:=1 to M do
                               write(a[i,j]:4);
                       writeln;
               end;
        end;
 
begin 
        randomize;
        matrix(one);
        printer(one);
        writeln;
        matrix(two);
        printer(two);
        writeln;
        plus(three,one,two);
        printer(three);
end.

 

Просмотрено: 0%
Просмотрено: 0%
Скачать материал
Скачать материал "Задачи к урока по теме "Подпрограммы""

Методические разработки к Вашему уроку:

Получите новую специальность за 3 месяца

Специалист по продажам

Получите профессию

Методист-разработчик онлайн-курсов

за 6 месяцев

Пройти курс

Рабочие листы
к вашим урокам

Скачать

Скачать материал

Найдите материал к любому уроку, указав свой предмет (категорию), класс, учебник и тему:

6 651 836 материалов в базе

Скачать материал

Вам будут интересны эти курсы:

Оставьте свой комментарий

Авторизуйтесь, чтобы задавать вопросы.

  • Скачать материал
    • 08.02.2017 1410
    • DOCX 90 кбайт
    • 23 скачивания
    • Оцените материал:
  • Настоящий материал опубликован пользователем Рожкова Ирина Сергеевна. Инфоурок является информационным посредником и предоставляет пользователям возможность размещать на сайте методические материалы. Всю ответственность за опубликованные материалы, содержащиеся в них сведения, а также за соблюдение авторских прав несут пользователи, загрузившие материал на сайт

    Если Вы считаете, что материал нарушает авторские права либо по каким-то другим причинам должен быть удален с сайта, Вы можете оставить жалобу на материал.

    Удалить материал
  • Автор материала

    Рожкова Ирина Сергеевна
    Рожкова Ирина Сергеевна
    • На сайте: 8 лет и 1 месяц
    • Подписчики: 2
    • Всего просмотров: 164881
    • Всего материалов: 55

Ваша скидка на курсы

40%
Скидка для нового слушателя. Войдите на сайт, чтобы применить скидку к любому курсу
Курсы со скидкой

Курс профессиональной переподготовки

HR-менеджер

Специалист по управлению персоналом (HR- менеджер)

500/1000 ч.

Подать заявку О курсе

Курс профессиональной переподготовки

Информатика: теория и методика преподавания с применением дистанционных технологий

Учитель информатики

300 ч. — 1200 ч.

от 7900 руб. от 3950 руб.
Подать заявку О курсе
  • Этот курс уже прошли 18 человек

Курс профессиональной переподготовки

Теория и методика обучения информатике в начальной школе

Учитель информатики в начальной школе

300/600 ч.

от 7900 руб. от 3950 руб.
Подать заявку О курсе
  • Сейчас обучается 96 человек из 34 регионов
  • Этот курс уже прошли 222 человека

Курс профессиональной переподготовки

Информатика: теория и методика преподавания в профессиональном образовании

Преподаватель информатики

300/600 ч.

от 7900 руб. от 3950 руб.
Подать заявку О курсе
  • Сейчас обучается 48 человек из 21 региона
  • Этот курс уже прошли 148 человек

Мини-курс

Фундаментальные принципы здоровья и двигательной активности

2 ч.

780 руб. 390 руб.
Подать заявку О курсе

Мини-курс

Эффективная самопрезентация

4 ч.

780 руб. 390 руб.
Подать заявку О курсе
  • Сейчас обучается 52 человека из 31 региона
  • Этот курс уже прошли 32 человека

Мини-курс

Продажи и управление клиентским опытом: стратегии и аналитика

10 ч.

1180 руб. 590 руб.
Подать заявку О курсе