ПОС/Лаб 3 2021

Извор: SI Wiki
< ПОС
Датум измене: 15. мај 2021. у 19:30; аутор: Fedja (разговор | доприноси) (+l3 2021 rešenje od `@127324347948859392`)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

Лаб 3 је у школској години 2020/21 рађен у трећем термину вежби, што је одсуство од досадашњег шаблона услед пандемије.

Група 3

Задатак 1

Поставка

Написати bash скрипту која треба дапомогне[sic] наставницима Електротегничког[sic] факултета да открију студенте који недозвољено сарађују приликом израде домаћих задатака. Скрипта треба да пореди радове студената и да на крају испише парове студената са одређеном сличношћу њихових радова. Приликом поређења празне линије се не тумаче као идентичне. Скрипта прима следеће аругменте:

Опциони параметар са аргументом -f. Путања до директоријума у коме се налазе студентски радови. Студентски рад је текстуална датотека која се зове ccggggbbbb, где су cc иницијали студента, gggg година уписа, а bbbb број индекса.
Опциони параметар са аргументом -s. Број индекса студента чији ће се рад упоређивати са осталима. Број индекса се задаје у формату ggggbbbb, где је gggg година уписа, а bbbb број индекса.
Опциони параметар са аргументом -n. Минималан број идентичних линија које треба пронаћи у дварада[sic] да би се сматрало да је тај пар студенатанедозвољено[sic] сарађивао. Ако није наведена овај опција, сматрати да је минимум једна идентична линија.
Опциони параметар -l, исписује парове студената који су недозвољено сарађивали у формату ggggbbbb1 ggggbbbb2 broj_identičnih_linija, где је ggggbbbb1 број индекса студента за кога су се тражили слични радови, а ggggbbbb2 број индекса студента са чијим радом је пронађена сличност.

Опциони параметри -f и -s су обавезни, ако се не наведу пријавити грешку. Пријавити грешку иако се унесе индекс лошег формата. Ако опциони параметар -l није наведен исписати само пар са највише идентичних линија кода. Дозвољено је коришћење додатних фајлова, који морају бити избрисани након завршетка скрипте.

Решење

#!/bin/bash

uneti_obavezni=0
broj_identicnih=1
ispisi_parove=0

while getopts f:s:n:l opt
do
    case $opt in
        f) let uneti_obavezni++
            read -p "Putanja do direktorijuma: " direktorijum
            ;;
        s) let uneti_obavezni++
            read -p "Indeks studenta: " indeks_studenta
            ;;
        n) read -p "Minimalan broj identicnih linija: " broj_identicnih
            ;;
        l) ispisi_parove=1
            ;;
        *) echo "Koriscenje programa: -fsnl"
        exit
        ;;
    esac
done


if [ "$uneti_obavezni" -eq "2" ]; then
    echo "Nisu uneti obavezni parametri -f i -s!"
    exit
fi

shift "$(( OPTIND - 1 ))"

brojac=0
max_brojac=-1

# Za svaki fajl u direktorijumu gledam na osnovu ovog -s
pushd $direktorijum
for i in $(ls)
do
    echo "Gledam fajl $i"
    
    # Uzimam originalnog
    for linija in $(cat $(find . -maxdepth 1 -name "*" | grep -E "..$indeks_studenta"))
    do
        moj=$(find . -maxdepth 1 -name "*" | grep -E "..$indeks_studenta")
        if ! [ "./$i" = "$moj" ]; then
            # Za svaki njegov gledam sta ima isto sa $i
            for novi_linija in $(cat $(find . -maxdepth 1 -name "*" | grep -E "..$i"))
            do
                if ! [ "$novi_linija" = "\n" ] && [ "$novi_linija" = "$linija" ]; then
                    let brojac++
                fi
            done
            # Sad gledam treba li da ga ispisujem ili ne kasnije
            if ! [ "$brojac" -lt "$broj_identicnih" ]; then
                if [ "$ispisi_parove" -eq "1" ]; then
                    # Ispisujem ovo u fajl
                    echo "$indeks_studenta i $i imaju $brojac slicnosti" >> temp1
                else # Gledam da li je pre bio veci
                    if [ "$brojac" -gt "$max_brojac" ]; then
                        max_indeks=$i #$(sed "/$"max_index"/..(.*)/\1")
                    fi
                fi
            fi
        fi
    done
done

if [ "$ispisi_parove" -eq 0 ]; then
    echo "Maks indeks je $max_indeks"
else
    cat temp1
    rm -f temp1
fi