ПОС/Лаб 3 2021

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Лаб 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