МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
КИЇВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ імені Тараса Шевченка
ФАКУЛЬТЕТ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра програмних систем і технологій



Дисципліна:
«Функціональне програмування»


Лабораторна робота № 4
на тему:
«Програмування списків мовами функціонального програмування»


Виконав:
студент групи ІПЗ-44мс
Косенко Клим Сергійович

Перевірила:
Ніколаєнко Анастасія Юріївна


Київ 2023












Мета роботи

Опанувати теоретичні основи використання списків функціональними мовами та розробити програми обробки списків.




Умова завдання
Умова завдання


Код 1
        "(define (factorial n)
        (if (= n 0)
            1
            (* n (factorial (- n 1)))))
      
      (define (create-factorial-list n)
        (define (iter i acc)
          (if (> i n)
              acc
              (begin
                (display "Введіть число: ")
                (let ((numb (read)))
                  (newline)
                  (iter (+ i 1) (cons (factorial numb) acc))))))
        (reverse (iter 1 '())))
      
      (display "Задайте кількість факторіалів: ")
      (define number (read))
      (define factorial-list (create-factorial-list number))
      (display "Список факторіалів: ")
      (display factorial-list)
      (newline)
      
      (define (find-max-min lst)
        (if (null? lst)
            '()
            (let ((max-min (find-max-min (cdr lst))))
              (if (null? max-min)
                  (list (car lst) (car lst))
                  (list (max (car lst) (car max-min))
                        (min (car lst) (cadr max-min)))))))
      
      (define (list-sum lst)
        (if (null? lst)
            0
            (+ (car lst) (list-sum (cdr lst))))
        )
      
      (define (index-of lst value)
        (define (iter lst index)
          (cond ((null? lst) #f)
                ((equal? (car lst) value) index) 
                (else (iter (cdr lst) (+ index 1)))))
      
        (iter lst 0))
      
      (define (take-while pred lst)
        (if (not (pred (car lst)))
            (list(car lst))
            (cons (car lst) (take-while pred (cdr lst)))))
      
      (define (drop-while pred lst)
        (if (not (pred (car lst)))
            lst
            (drop-while pred (cdr lst))))
      
      (define (add-elements-between-max-min lst new-lst max min)
        (if (> (index-of lst max) (index-of lst min))
        (let ((before (take-while (lambda (x) (not (= x min))) lst))
               (after (drop-while (lambda (x) (not (= x max))) lst)))
          (append before new-lst after))
        (let ((before (take-while (lambda (x) (not (= x max))) lst))
              (after (drop-while (lambda (x) (not (= x min))) lst)))
          (append before new-lst after))))
      
      (define max-min (find-max-min factorial-list))
      (display "Максимальний елемент: ")
      (display (car max-min))
      (newline)
      (display "Мінімальний елемент: ")
      (display (cadr max-min))
      (newline)
      (display "Задайте кількість факторіалів: ")
      (define new-number (read))
      (define new-factorial-list (create-factorial-list new-number))
      (display "Список нових факторіалів: ")
      (display new-factorial-list)
      (newline)
      (display "Сума нових факторіалів: ")
      (display (list-sum new-factorial-list))
      (newline)
      (display "Оновлений список: ")
      (newline)
      (define update-factorial-list (add-elements-between-max-min factorial-list new-factorial-list (car max-min) (cadr max-min)))
      (display update-factorial-list)
      "
      




Скріншот роботи та результату
Результат виконання



Висновок

Лабораторна робота дозволила опанувати теорію та практику використання списків у функціональному програмуванні (Scheme).
Розроблені програми ілюструють ефективне використання списків для вирішення завдань моделювання процесів та обчислення коренів алгебраїчних рівнянь.
Лабораторна допомогла розвинути навички функціонального програмування та роботи зі списками.