View difference between Paste ID: BBzsYyQ8 and KiHvAHW3
SHOW: | | - or go back to the newest paste.
1
Java IO
2
3
(25 поени) Потребно е да направите апликација која пребарува Open Document датотеки кои се многу големи. За таа потреба имплементирајте метод findOdf(String in, String out) кој ќе го изминува рекурзивно директориумот претставен преку “in”. Доколку наиде на .odt или .ods кои се поголеми од 1 мегабајт, тогаш треба да ги ископира во “out”\brisenje, а доколку наиде на .ods или .odt кои се помали или еднакви на 1 мегабајти, тогаш треба да додаде линија во “out”\mali.txt од типот “Datotekata ima _in_kilobytes>”. На местото <filename> ставете го името на датотеката и на местото на <site_in_kilobytes> ставете ја големината на датотеката во килобајти. Внимавајте дека може да има многу вакви документи во “in”.
4
5
///////////////////////////////////////////////
6
7
Нитки и синхронизација
8
9
(35 поени) За потребите на ФИНКИ, потребно е да се имплементира софтвер кој ќе менаџира распоред за полагање на студенти во текот на еден ден во зависност од бројот на лаборатории и испити кои треба да бидат извршени истиот ден. При тоа, треба да се земе во предвид дека во една лабораторија може да се полага само еден испит едновремено. Исто така, во секоја лабораторија бројот на компјутери е 20, што значи само 20 студенти може да полагаат истовремено. Штом се ослободи компјутер, веднаш влегува друг студент да полага. Секој испит се состои од два дела, теоретски и практичен. Прво се полага теоретскиот испит, па потоа практичниот. Практичниот дел не може да започне се додека сите студенти не завршат со теоретскиот дел од испитот. На крај, по завршување на сите студенти со полагање на практичниот дел, се објавуваат резултати од полагањето за студентите кои полагале во таа лабораторија.
10
11
За време на теоретскиот испит важат следните правила:
12
13
-Студентот влегува во лабораторија со повик на методата enterLaboratory()
14
-Го решава тестот на компјутер со повик на методата solveTheory()
15
-Излегува од лабораторијата кога ќе заврши со повик на методата exitLaboratory()
16
17
За време на практичниот испит важат следните правила:
18
19
-Студентот влегува во лабораторија со повик на методата enterLaboratory()
20
-Го решава тестот на компјутер со повик на методата solvePractical()
21
-Излегува од лабораторијата кога ќе заврши со повик на методата exitLaboratory()
22
23
Ваша задача е да ги доимплементирате методите во кои стои TODO коментар од класите Exam, Student, Laboratory и ExamSchedule, кои се наоѓаат во Starter датотеката. При решавањето можете да користите семафори и монитори по ваша желба и нивната иницијализација треба да ја направите во init() методите на класите Exam и ЕxamSchedule.
24
25
Синхронизацијата треба да ја направете со користење на следните методи:
26
27
state.enterLaboratory() – Кажува дека студентот може да влезе на испит
28
state.solveTheory() – Кажува дека студент може да полага теорија
29
state.solvePractical() – Кажува дека студент може да полага практичен дел
30
state.exitLaboratory() - Кажува дека студентот моќе да излезе од испит
31
state.showReport() – Метод за приказ на резултати од испитите
32
За класата Laboratory, потребно е да ги согледате критичните региони и за следните методи:
33
34
checkNumActiveStudents() – проверка колку студенти се останати во лабораторијата
35
getFreeComputers() – проверка на број на слободни компјутери
36
studentEnters() –влез на студенти во лабораторија
37
studentExits() – излез на студенти од лабораторија
38
Во класата Exam, потребно е да направите синхронизација на startExam() методот во кој се дефинира однесувањето на студентите во рамките на еден испит. Во класата ExamSchedule, потребно е да направите синхронизација на методот startExams() во кој се дефинира бројот на испити кои може да се полагаат истовремено имајќи го во предвид бројот на слободни лаборатории
39
40
//Ima starter file
41
42
STARTER FILES:
43
44
1: ExamSchedule
45
46
package mk.ukim.finki.os;
47
48
import java.util.ArrayList;
49
import java.util.List;
50
51
public class ExamSchedule {
52
53
    private int numExams;
54
55
    private int numLabs;
56
57
    public ExamSchedule(int numExams, int numLabs) {
58
        this.numExams = numExams;
59
        this.numLabs = numLabs;
60
        init();
61
    }
62
63
    public void init() {
64
        //TODO: add initialization here
65
    }
66
67
    public void startExams() {
68
        //TODO: add synchronization in this block
69
        List<Exam> examList = new ArrayList<Exam>();
70
        for (int i = 0;i<numExams;i++) {
71
            Exam exam = new Exam((int)(Math.random()*100));
72
            examList.add(exam);
73
        }
74
        for (Exam exam:examList) {
75
            exam.start();
76
        }
77
78
    }
79
80
    public static void main(String[] args) {
81
        ExamSchedule examSchedule = new ExamSchedule(10,3);
82
        examSchedule.startExams();
83
    }
84
}
85
86
87
2. Exam
88
89
package mk.ukim.finki.os;
90
91
import java.util.ArrayList;
92
import java.util.List;
93
94
public class Exam extends Thread{
95
96
97
    Laboratory lab = new Laboratory(Exam.this);
98
99
    private int numStudents;
100
101
    public Exam(int numStudents) {
102
        this.numStudents = numStudents;
103
        init();
104
    }
105
106
    public void enterLaboratory() {
107
        lab.studentEnters();
108
        System.out.println("The student enters in laboratory.");
109
    }
110
111
    public void solveTheory() {
112
        System.out.println("The student solves theory.");
113
    }
114
115
    public void solvePractical() {
116
        System.out.println("The student solves practical.");
117
    }
118
119
    public void exitLaboratory() {
120
        lab.studentExits();
121
        System.out.println("The student exits practical.");
122
    }
123
124
    public void showReport() {
125
        System.out.println("The computer systems shows results.");
126
    }
127
128
    public void init() {
129
        //TODO: add initialization here
130
    }
131
132
    public void startExam() {
133
        //TODO: add synchronization in this block
134
        List<Student> studentList = new ArrayList<Student>();
135
        for (int i=0;i<numStudents;i++) {
136
            Student s = new Student(Exam.this);
137
            studentList.add(s);
138
        }
139
        for (Student s:studentList) {
140
            s.start();
141
        }
142
        this.showReport();
143
    }
144
145
    @Override
146
    public void run() {
147
        startExam();
148
    }
149
}
150
151
3. Laboratory
152
153
package mk.ukim.finki.os;
154
155
public class Laboratory {
156
157
    private final static int CAPACITY = 20;
158
159
    private int numActiveStudents;
160
161
    private Exam state;
162
163
    public Laboratory(Exam state) {
164
        this.numActiveStudents = 0;
165
        this.state = state;
166
    }
167
168
    public int checkNumActiveStudents() {
169
        //TODO: add synchronization in this block
170
        return numActiveStudents;
171
    }
172
173
    public int getFreeComputers() {
174
        //TODO: add synchronization in this block
175
        return CAPACITY - numActiveStudents;
176
    }
177
178
179
180
    public void studentEnters() {
181
        //TODO: implement this method
182
    }
183
184
    public void studentExits() {
185
        //TODO: implement this method
186
    }
187
}
188
189
190
4. Student
191
192
package mk.ukim.finki.os;
193
194
public class Student extends Thread{
195
196
    private Exam state;
197
198
    public Student(Exam state) {
199
        this.state = state;
200
    }
201
202
    @Override
203
    public void run() {
204
        //TODO: add synchronization in this block
205
        //theoretical part execution
206
        this.state.enterLaboratory();
207
        this.state.solveTheory();
208
        this.state.exitLaboratory();
209
210
        //practical part execution
211
        this.state.enterLaboratory();
212
        this.state.solvePractical();
213
        this.state.exitLaboratory();
214
    }
215
}
216
217
////////////////////////////////
218
219
UNIX команди
220
221
(15 поени) Со користење на концептите на цевки, редирекција и / или командите за филтрирање на текст, напишете кратка командна процедура во UNIX која ќе направи преименување на сите датотеки од тековниот именик кои се зачувани со различни варијации на екстензијата .txt во правилни датотеки чија екстензија ќе биде точно .txt. (Пример: zad1.TxT -> zad1.txt, zad2.TXT -> zad2.txt, итн.)
222
223
Кратката командна процедура да се зачува под името zad3-t1.sh.
224
225
226
/////////////////////////
227
228
229
UNIX командна процедура
230
231
232
(25 поени) Да се напише командна процедура која ќе ги најде сите студенти кои се логирале од лабораториите на ФИНКИ во периодот од X до Y часот на 20.06.2018. X и Y се цели броеви кои означуваат час и се даваат како прв и втор аргумент на скриптата. За сите логирани студенти ќе се креираат посебни именици (името на именикот е всушност корисничкото име од студентот) во именикот destination даден како трет аргумент на скриптата. Потоа за секој логиран студент ќе се ископираат сите датотеки од неговиот домашен именик (пр. /home/112345) од форматот zadA-tB.sh (каде A и B се цифри) во новокреираниот именик за студентот во именикот destination. Внимавајте, во домашниот именик на еден студент можно е да има подименици и подименици на подимениците, итн. Ваша задача е да ги пронајдете рекурзивно сите барани датотеки и да ги ископирате. Доколку се случи две датотеки да имаат исто име, тогаш се споредува нивната содржина. Доколку се исти се копира само едната, доколку се различни се остава во дестинацискиот именик онаа која е поголема. На крај во дестинацискиот именик треба да имате само по една копија од датотеките во бараниот формат.
233
234
На почеток на скриптата направете проверка за тоа дали се проследени сите аргументи. Доколку не се, прикажете соодветно упатство за употреба и излезете неуспешно. Да се внимава, доколку дестинацискиот именик не постои, да се креира нов, а ако постоел истиот да се избрише.
235
236
Командната процедура треба да се зачува како zad4-t1.sh.
237
238
Помош: Форматот на IP адресите на лабораториите од ФИНКИ е 10.10.X.Y
239
240
Пример:
241
242
./zad4-t1.sh 10 14 /home/user/destination/
243
244
Излез: /home/user/destination/ 112233: zad3-t1.sh zad4-t1.sh
245
246
222222: zad4-t2.sh
247
248
111111: zad3-t2.sh zad4-t2.sh
249
250
222111: zad3-t1.sh
251
252
555555: zad4-t2.sh