Skip to content

Commit c365512

Browse files
committed
week1 materjalid
1 parent 61a05ab commit c365512

11 files changed

Lines changed: 642 additions & 0 deletions

File tree

inputs/mini.aktk

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
print 5
2+
3+
x = 4
4+
y =35 + 78- x
5+
print x+ 78 -23
6+
7+
# See on kommentaar
8+
print y
9+
y = y + 1 # kirjutame muutujasse uue väärtuse
10+
print y

inputs/sum.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
10
2+
24
3+
18
4+
23
5+
40

src/main/java/week1/MiniAktk.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package week1;
2+
3+
import java.io.IOException;
4+
5+
public class MiniAktk {
6+
7+
static void main(String[] args) throws IOException {
8+
9+
}
10+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package week1.soojendus;
2+
3+
/*
4+
import week1.soojendus.animals.Animal;
5+
import week1.soojendus.animals.Kass;
6+
import week1.soojendus.animals.Koer;
7+
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
// Väljund peaks olema:
12+
// Loom #1: Mjau!
13+
// Loom #2: Auh-auh!
14+
// Loom #1: Mjau!
15+
// Loom #3: Mjau!
16+
// Loom #2: Auh-auh!
17+
public class Exercise2 {
18+
static void main() {
19+
Kass a1 = new Kass();
20+
Koer a2 = new Koer();
21+
Kass a3 = new Kass();
22+
23+
List<Animal> animals = Arrays.asList(a1, a2, a1, a3, a2);
24+
for (Animal animal : animals) animal.makeNoise();
25+
}
26+
}
27+
*/
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package week1.soojendus;
2+
3+
import java.util.*;
4+
5+
public class Exercise3 {
6+
7+
/**
8+
* Defineeri meetod eval, mis väärtustab etteantud avaldise.
9+
* @param str on plussidega eraldatud arvude jada, näiteks "5 + 35+ 10".
10+
* @return arvude summa, antud näide puhul 50.
11+
*/
12+
public static int eval(String str) {
13+
throw new UnsupportedOperationException();
14+
}
15+
16+
/**
17+
* Tuletame lihtsalt meelde Java List ja Map andmestruktuurid!
18+
* Selle ülesanne puhul võiks tegelikult tüüpide ja main meetodi põhjal aru saada, mida tegema peaks...
19+
*
20+
* @param list sõnedest, kus on vaheldumisi nimi ja arv (sõne kujul). Võib eeldada, et pikkus on paarisarv.
21+
* @return listile vastav map nimedest arvudesse.
22+
*/
23+
public static Map<String, Integer> createMap(List<String> list) {
24+
throw new UnsupportedOperationException();
25+
}
26+
27+
static void main() {
28+
System.out.println(eval("2+2"));
29+
Map<String, Integer> ageMap = createMap(Arrays.asList("Carmen", "17", "Jürgen", "44", "Tarmo", "10", "Mari", "83"));
30+
System.out.println(ageMap.get("Carmen")); // vastus: 17
31+
System.out.println(ageMap.get("Tarmo")); // vastu: 10
32+
}
33+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package week1.soojendus;
2+
3+
/**
4+
* Klass on mõeldud kahendpuu tipu esitamiseks. Tüübiparameeter T määrab, millist
5+
* tüüpi väärtust saab tipus hoida. Väärtuse küsimiseks on meetod getValue.
6+
*/
7+
public class Node<T> {
8+
9+
public Node(T value, Node<T> leftChild, Node<T> rightChild) {
10+
// Mida võiks siin teha? Kas midagi on äkki kuskil puudu?
11+
}
12+
13+
public T getValue() {
14+
throw new UnsupportedOperationException();
15+
}
16+
17+
/**
18+
* Tagastab vasaku alampuu. Selle puudumisel tagastab null-i.
19+
*/
20+
public Node<T> getLeftChild() {
21+
throw new UnsupportedOperationException();
22+
}
23+
24+
public Node<T> getRightChild() {
25+
throw new UnsupportedOperationException();
26+
}
27+
28+
/**
29+
* Tagastab true tippude korral, millel pole ühtegi alampuud.
30+
*/
31+
public boolean isLeaf() {
32+
throw new UnsupportedOperationException();
33+
}
34+
35+
36+
/**
37+
* Meetod peab tagastama true või false vastavalt sellele, kas antud (alam)puus
38+
* leidub näidatud väärtus. Võrdlemine toimub meetodi equals alusel.
39+
*/
40+
public boolean contains(T value) {
41+
throw new UnsupportedOperationException();
42+
}
43+
44+
45+
/// toString peab tagastama puu suluesituse.
46+
///
47+
/// Formaat:
48+
/// Puu iga tipp on esitatud ümarsulgudes antud kolmikuna, kus esimene
49+
/// element on tipu väärtus, teine element on vasak alluv ning kolmas on parem alluv.
50+
/// Kui alluv puudub, siis on sõnes vastaval kohal allkriips.
51+
///
52+
/// Komponentide vahel peab olema koma ja üks tühik.
53+
///
54+
/// Näited:
55+
/// kui `t` on ühetipuline puu tüübiga `Node<Integer>`,
56+
/// mille tipu väärtus on 3, siis `t.toString()` peab tagastama
57+
/// "(3, _, _)"
58+
///
59+
///
60+
/// Kui `t` on selline puu:
61+
/// ```
62+
/// 1
63+
/// / \
64+
/// / \
65+
/// 2 -44
66+
/// \
67+
/// 3
68+
/// ```
69+
/// siis `t.toString()` peab tagastama
70+
///
71+
/// "(1, (2, _, (3, _, _)), (-44, _, _))"
72+
@Override
73+
public String toString() {
74+
return super.toString(); // Asenda oma koodiga
75+
}
76+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package week1.soojendus;
2+
3+
public class NodeUtils {
4+
5+
/**
6+
* Meetod peab tagastama täisarvu, mis näitab mitu korda esineb antud (alam)puus
7+
* näidatud väärtus. NB! Võrdlemiseks kasutada meetodit equals!
8+
*/
9+
public static <T> int count(Node<T> tree, T value) {
10+
throw new UnsupportedOperationException();
11+
}
12+
13+
14+
/// NB! See on raskem ülesanne. Enne selle üritamist lahenda ja esita teised ülesanded ära!
15+
///
16+
///
17+
/// See meetod peab võtma suluesituses sõnena antud puu ja tagastama vastava
18+
/// puu andmestruktuuri. Tippudes oleva väärtuse tüüp on `Integer`.
19+
///
20+
/// Sõne formaat on sama, nagu kirjeldatud `Node.toString` juures.
21+
///
22+
/// Näited
23+
///
24+
/// Kui käivitada
25+
/// ```java
26+
/// puu = parseIntegerTree("(1, (2, _, (3, _, _)), (3, _, _))");
27+
/// ```
28+
/// siis `puu.getLeft().getRight().getValue()` peab tagastama 3
29+
/// ja `puu.getRight().isLeaf()` peab tagastama true
30+
/// ja `NodeUtils.count(puu, 3)` peab tagastama 2
31+
public static Node<Integer> parseIntegerTree(String s) {
32+
throw new UnsupportedOperationException();
33+
}
34+
}
35+
36+
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package utils;
2+
3+
import java.io.*;
4+
import java.lang.reflect.Constructor;
5+
import java.lang.reflect.InvocationTargetException;
6+
import java.lang.reflect.Method;
7+
import java.lang.reflect.Modifier;
8+
import java.net.URL;
9+
import java.net.URLClassLoader;
10+
import java.nio.charset.StandardCharsets;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
public class MainRunner {
15+
16+
private final String className;
17+
private final Class<?> reloadClazz;
18+
private final List<URL> extraUrls;
19+
20+
public MainRunner(String className, Class<?> reloadClazz, List<URL> extraUrls) {
21+
this.className = className;
22+
this.reloadClazz = reloadClazz;
23+
this.extraUrls = extraUrls;
24+
}
25+
26+
public ExecutionResult runJavaClass(String input, String... args) throws IOException {
27+
28+
InputStream origIn = System.in;
29+
PrintStream origOut = System.out;
30+
PrintStream origErr = System.err;
31+
32+
ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
33+
ByteArrayOutputStream out = new ByteArrayOutputStream();
34+
ByteArrayOutputStream err = new ByteArrayOutputStream();
35+
36+
// https://stackoverflow.com/a/20094513/854540
37+
ArrayList<URL> allUrls = new ArrayList<>(extraUrls);
38+
allUrls.add(reloadClazz.getProtectionDomain().getCodeSource().getLocation());
39+
URL[] urls = allUrls.toArray(new URL[0]);
40+
41+
try (URLClassLoader classLoader = new URLClassLoader(urls, reloadClazz.getClassLoader().getParent())){
42+
43+
// https://stackoverflow.com/a/1119559/854540
44+
System.setIn(in);
45+
System.setOut(new PrintStream(out));
46+
System.setErr(new PrintStream(err));
47+
48+
Class<?> clazz = classLoader.loadClass(className);
49+
50+
Method mainMethod;
51+
Object[] invokeArgs;
52+
try {
53+
mainMethod = getMainMethod(clazz, String[].class);
54+
invokeArgs = new Object[]{args};
55+
}
56+
catch (NoSuchMethodException _) {
57+
mainMethod = getMainMethod(clazz);
58+
invokeArgs = new Object[0];
59+
}
60+
61+
Object invokeObj;
62+
if (Modifier.isStatic(mainMethod.getModifiers())) {
63+
invokeObj = null;
64+
}
65+
else {
66+
Constructor<?> constructor = clazz.getDeclaredConstructor();
67+
constructor.setAccessible(true);
68+
invokeObj = constructor.newInstance();
69+
}
70+
71+
mainMethod.setAccessible(true);
72+
mainMethod.invoke(invokeObj, invokeArgs);
73+
74+
return new ExecutionResult(out.toString(StandardCharsets.UTF_8), err.toString(StandardCharsets.UTF_8));
75+
}
76+
catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException e) {
77+
throw new RuntimeException(e); // avoid changing all throws signatures although ideally should
78+
}
79+
catch (InvocationTargetException e) {
80+
e.getTargetException().printStackTrace(); // ugh
81+
return new ExecutionResult(out.toString(StandardCharsets.UTF_8), err.toString(StandardCharsets.UTF_8));
82+
}
83+
finally {
84+
System.setIn(origIn);
85+
System.setOut(origOut);
86+
System.setErr(origErr);
87+
}
88+
}
89+
90+
private Method getMainMethod(Class<?> clazz, Class<?>... parameterTypes) throws NoSuchMethodException {
91+
while (clazz != null) {
92+
try {
93+
return clazz.getDeclaredMethod("main", parameterTypes);
94+
}
95+
catch (NoSuchMethodException e) {
96+
clazz = clazz.getSuperclass();
97+
}
98+
}
99+
throw new NoSuchMethodException();
100+
}
101+
102+
public record ExecutionResult(String out, String err) {
103+
}
104+
}

0 commit comments

Comments
 (0)