POS/Lab 3 2021

Izvor: SI Wiki
< ПОС
Datum izmene: 15. maj 2021. u 19:30; autor: Fedja (razgovor | doprinosi) (+l3 2021 rešenje od `@127324347948859392`)
(razl) ← Starija izmena | Trenutna verzija (razl) | Novija izmena → (razl)
Pređi na navigaciju Pređi na pretragu

Lab 3 je u školskoj godini 2020/21 rađen u trećem terminu vežbi, što je odsustvo od dosadašnjeg šablona usled pandemije.

Grupa 3

Zadatak 1

Postavka

Napisati bash skriptu koja treba dapomogne[sic] nastavnicima Elektrotegničkog[sic] fakulteta da otkriju studente koji nedozvoljeno sarađuju prilikom izrade domaćih zadataka. Skripta treba da poredi radove studenata i da na kraju ispiše parove studenata sa određenom sličnošću njihovih radova. Prilikom poređenja prazne linije se ne tumače kao identične. Skripta prima sledeće arugmente:

Opcioni parametar sa argumentom -f. Putanja do direktorijuma u kome se nalaze studentski radovi. Studentski rad je tekstualna datoteka koja se zove ccggggbbbb, gde su cc inicijali studenta, gggg godina upisa, a bbbb broj indeksa.
Opcioni parametar sa argumentom -s. Broj indeksa studenta čiji će se rad upoređivati sa ostalima. Broj indeksa se zadaje u formatu ggggbbbb, gde je gggg godina upisa, a bbbb broj indeksa.
Opcioni parametar sa argumentom -n. Minimalan broj identičnih linija koje treba pronaći u dvarada[sic] da bi se smatralo da je taj par studenatanedozvoljeno[sic] sarađivao. Ako nije navedena ovaj opcija, smatrati da je minimum jedna identična linija.
Opcioni parametar -l, ispisuje parove studenata koji su nedozvoljeno sarađivali u formatu ggggbbbb1 ggggbbbb2 broj_identičnih_linija, gde je ggggbbbb1 broj indeksa studenta za koga su se tražili slični radovi, a ggggbbbb2 broj indeksa studenta sa čijim radom je pronađena sličnost.

Opcioni parametri -f i -s su obavezni, ako se ne navedu prijaviti grešku. Prijaviti grešku iako se unese indeks lošeg formata. Ako opcioni parametar -l nije naveden ispisati samo par sa najviše identičnih linija koda. Dozvoljeno je korišćenje dodatnih fajlova, koji moraju biti izbrisani nakon završetka skripte.

Rešenje

#!/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