# Soal-soal
## Prelab 1.1 Struktur Data
1. Tipe data manakah dari tipe-tipe data berikut yang bukan termasuk ke dalam tipe data built-in pada Python:
a. Integer
b. Floating Point
c. String
*d. Stack
2. Tipe-tipe data yang terdiri dari suatu himpunan nilai-nilai dalam bentuk paling dasar dan tidak dapat dipecah menjadi bentuk yang lebih kecil disebut dengan:
*a. Tipe data primitive
b. Tipe data non-primitive
c. Abstract Data Type
d. Tipe data built-in
3. Tipe data yang dibuat oleh programmer disebut sebagai:
*a. Tipe data user-defined
b. Tipe data non-primitive
c. Tipe data primitive
d. Tipe data built-in
4. Definisi dari suatu himpunan nilai-nilai dan operasi-operasi yang dapat dilakukan terhadap himpunan nilai-nilai tersebut dan tidak terikat pada implementasinya disebut sebagai:
a. Struktur data
*b. Abstract Data Type
c. Tipe data user-defined
d. Tipe data built-in
5. Wujud nyata hasil implementasi dari ADT adalah:
*a. Struktur data
b. Tipe data built-in
c. Class
d. Abstraksi data
## Prelab 1.2 ADT Bag
1. Implementasi dari method berikut diperlukan untuk membuat suatu strutkur data dapat bekerja dengan fungsi built-in `len()`:
a. Method `__length`
b. Method `__length__`
c. Method `len`
*d. Method `__len__`
2. Implementasi dari method berikut diperlukan untuk membuat suatu struktur data dapat bekerja dengan operator `in`:
a. Method `in`
b. Method `__in__`
*c. Method `__contains__`
d. Method `__inside__`
3. Untuk membuat sebuah object dari suatu class dapat di-traverse (diiterasi) menggunakan loop `for`, kita harus mengimplementasikan di dalam class tersebut method bernama:
a. `__iterasi__`
b. `__traverse__`
*c. `__iter__`
d. `__iterator__`
4. Untuk membuat bag dapat ditraverse kita harus menuliskan sebuah class iterator. Dua method apa yang harus diimplementasikan dalam class iterator tersebut:
a. Method `__iter__` dan method `__next__`
b. Method `__for__` dan method `__next__`
c. Method `__for__` dan method `__iterator__`
d. Method `__traverse__` dan method `__next__`
5. Perhatikan kode berikut:
```
myBag = Bag()
myBag.add(4)
myBag.add(9)
myBag.add(10)
myBag.add(5)
```
Ekspresi manakah yang dapat digunakan untuk mendapatkan banyaknya data dalam `myBag`:
a. `myBag.length()`
*b. `len(myBag)`
c. `myBag.__len__()`
d. `myBag.__length___()`
6. (soal code runner) Perhatikan kode berikut:
```
myBag = Bag()
myBag.add(4)
myBag.add(9)
myBag.add(10)
myBag.add(5)
```
Tuliskan kode untuk menampilkan nilai-nilai data di dalam `myBag` seperti output berikut:
```
4
9
10
5
```
Jawab:
```
for nilai in myBag:
print(nilai)
```
## Lab Activity Ch. 2 Array
#### 2.1 Implementasi operasi substract.
Implementasikan operasi `substract(matriksLain)` pada ADT Matriks!
Operasi `substract(matriksLain)` membuat dan mengembalikan matriks baru yang merupakan hasil pengurangan matriks ini dengan `matriksLain` yang diberikan. Operasi pengurangan dua matriks dalam matematika didefinisikan sebagai berikut:
***Pengurangan***. Dua buah matriks dengan ukuran $m \times n$ dapat dikurangkan dengan mengurangkan setiap elemen dari matriks ruas kiri dengan elemen berindeks sama dari matriks ruas kanan. Berikut adalah contoh operasi pengurangan dua matriks:
$$\begin{bmatrix}
6 & 7 \\
8 & 9 \\
1 & 0 \\
\end{bmatrix} +
\begin{bmatrix}
0 & 1 \\
2 & 3 \\
4 & 5 \\
\end{bmatrix} =
\begin{bmatrix}
{6 - 0} & {7 - 1} \\
{8 - 2} & {9 - 3} \\
{1 - 4} & {0 - 5} \\
\end{bmatrix} =
\begin{bmatrix}
{6} & {6} \\
{6} & {6} \\
{-3} & {-5} \\
\end{bmatrix}
$$
Anda harus mengimplementasikan operasi `substract(matriksLain)` dalam sebuah method `__substract__` pada class Matriks dalam kotak jawaban. Implementasi method Anda harus memperhatikan kondisi yang menguji apakah ukuran `matriksLain` sama dengan ukuran matriks. Jika ukuran matriksLain berbeda, method Anda harus meng-raise sebuah eksepsi `ValueError`. (Lihat implementasi method `__add__` yang telah dibahas pada modul tulis.)
Anda dapat menggunakan kode berikut untuk menguji implementasi operasi `substract(matriksLain)` Anda:
```python
from matriks import Matriks
def cetakMatriks(matriks):
for brs in range(matriks.bykBaris()):
for klm in range(matriks.bykKolom()):
print(f'{matriks[brs, klm]: 4d}', end=' ')
print()
def main():
# Definisikan matrixA = | 6 7 |
# | 8 9 |
# | 1 0 |
matrixA = Matriks(3, 2)
matrixA[0, 0] = 6
matrixA[0, 1] = 7
matrixA[1, 0] = 8
matrixA[1, 1] = 9
matrixA[2, 0] = 1
matrixA[2, 1] = 0
# Definisikan matrixB = | 0 1 |
# | 2 3 |
# | 4 5 |
matrixB = Matriks(3, 2)
matrixB[0, 0] = 0
matrixB[0, 1] = 1
matrixB[1, 0] = 2
matrixB[1, 1] = 3
matrixB[2, 0] = 4
matrixB[2, 1] = 5
# Definisikan matrixC = | -1 -2 |
# | 3 4 |
matrixC = Matriks(2, 2)
matrixC[0, 0] = -1
matrixC[0, 1] = -2
matrixC[1, 0] = 3
matrixC[1, 1] = 4
# Lakukan pengurangan matrixA - matrixB
# menggunakan operasi substract dengan operator -.
matrixS = matrixA - matrixB
# Cetak selisih matriks
print('MatrixA - MatrixB =')
print()
cetakMatriks(matrixS)
print()
# Uji pengurangan dua matriks berbeda ukuran
try:
matrixT = matrixA - matrixC
cetakMatriks(matrixT)
except ValueError:
print('Matriks yang diberikan tidak berukuran sama!')
main()
```
Jika implementasi Anda benar, maka output dari kode di atas akan seperti berikut:
```
MatrixA - MatrixB =
6 6
6 6
-3 -5
Uji pegurangan dua matriks berbeda ukuran:
Matriks yang diberikan tidak berukuran sama!
```
**Catatan:**
- Download implemementasi ADT Array dan ADT Array2D pada link berikut: [[array1D.py]] dan [[array2D.py]]
#### 2.2 Implementasi operasi multiply.
Implementasikan operasi `multiply(matriksLain)` pada ADT Matriks!
Operasi `multiply(matriksLain)` membuat dan mengembalikan matriks baru yang merupakan hasil perkalian matriks ini dengan `matriksLain` yang diberikan. Operasi perkalian dua matriks dalam matematika didefinisikan sebagai berikut:
***Pengurangan***. Dua buah matriks dengan ukuran $m \times n$ dapat dikurangkan dengan mengurangkan setiap elemen dari matriks ruas kiri dengan elemen berindeks sama dari matriks ruas kanan. Berikut adalah contoh operasi pengurangan dua matriks:
$$\begin{bmatrix}
6 & 7 \\
8 & 9 \\
1 & 0 \\
\end{bmatrix} +
\begin{bmatrix}
0 & 1 \\
2 & 3 \\
4 & 5 \\
\end{bmatrix} =
\begin{bmatrix}
{6 - 0} & {7 - 1} \\
{8 - 2} & {9 - 3} \\
{1 - 4} & {0 - 5} \\
\end{bmatrix} =
\begin{bmatrix}
{6} & {6} \\
{6} & {6} \\
{-3} & {-5} \\
\end{bmatrix}
$$
Anda harus mengimplementasikan operasi `substract(matriksLain)` dalam sebuah method `__substract__` pada class Matriks dalam kotak jawaban. Implementasi method Anda harus memperhatikan kondisi yang menguji apakah ukuran `matriksLain` sama dengan ukuran matriks. Jika ukuran matriksLain berbeda, method Anda harus meng-raise sebuah eksepsi `ValueError`. (Lihat implementasi method `__add__` yang telah dibahas pada modul tulis.)
Anda dapat menggunakan kode berikut untuk menguji implementasi operasi `substract(matriksLain)` Anda:
```python
from matriks import Matriks
def cetakMatriks(matriks):
for brs in range(matriks.bykBaris()):
for klm in range(matriks.bykKolom()):
print(f'{matriks[brs, klm]: 4d}', end=' ')
print()
def main():
# Definisikan matrixA = | 6 7 |
# | 8 9 |
# | 1 0 |
matrixA = Matriks(3, 2)
matrixA[0, 0] = 6
matrixA[0, 1] = 7
matrixA[1, 0] = 8
matrixA[1, 1] = 9
matrixA[2, 0] = 1
matrixA[2, 1] = 0
# Definisikan matrixB = | 0 1 |
# | 2 3 |
# | 4 5 |
matrixB = Matriks(3, 2)
matrixB[0, 0] = 0
matrixB[0, 1] = 1
matrixB[1, 0] = 2
matrixB[1, 1] = 3
matrixB[2, 0] = 4
matrixB[2, 1] = 5
# Definisikan matrixC = | -1 -2 |
# | 3 4 |
matrixC = Matriks(2, 2)
matrixC[0, 0] = -1
matrixC[0, 1] = -2
matrixC[1, 0] = 3
matrixC[1, 1] = 4
# Lakukan pengurangan matrixA - matrixB
# menggunakan operasi substract dengan operator -.
matrixS = matrixA - matrixB
# Cetak selisih matriks
print('MatrixA - MatrixB =')
print()
cetakMatriks(matrixS)
print()
# Uji pengurangan dua matriks berbeda ukuran
try:
matrixT = matrixA - matrixC
cetakMatriks(matrixT)
except ValueError:
print('Matriks yang diberikan tidak berukuran sama!')
main()
```
Jika implementasi Anda benar, maka output dari kode di atas akan seperti berikut:
```
MatrixA - MatrixB =
6 6
6 6
-3 -5
Uji pegurangan dua matriks berbeda ukuran:
Matriks yang diberikan tidak berukuran sama!
```
**Catatan:**
- Download implemementasi ADT Array dan ADT Array2D pada link berikut: [[array1D.py]] dan [[array2D.py]]
## Lab Activity Ch. 3 Linked List
#### 3.1 Implementasi operasi addLast(data)
ADT LinkedList dapat ditambahkan sebuah operasi `addLast(data)` yang digunakan untuk menambahkan data pada node baru di akhir dari linked list. Ilustrasi dari operasi addLast ini dapat dilihat pada gambar berikut:
#### 3.2 ADT Doubly Linked List
Doubly linked list adalah linked list yang setiap nodenya mempunyai field yang merujuk ke node berikutnya dan node sebelumnya. Gambar berikut adalah contoh dari doubly linked list:
Operasi-operasi yang terdapat pada doubly linked list:
- addFirst()
- addLast()
-
#### 3.3 (alternative) ADT Sorted Linked List
Doubly linked list adalah linked list yang setiap nodenya mempunyai field yang merujuk ke node berikutnya dan node sebelumnya. Gambar berikut adalah contoh dari doubly linked list:
Operasi-operasi yang terdapat pada doubly linked list:
- addFirst()
- addLast()
-
## Lab Activity Ch 4 Stack



Reversing data using stack
https://www.geeksforgeeks.org/stack-set-3-reverse-string-using-stack/
Infix to Postfix
#### 4.1 Balik Stack
Tuliskan sebuah fungsi yang menerima
#### 4.2 HTML Tag Matching
Aplikasi lainnya dari
#### 4.3 Infix ke Postfix
https://www.cs.man.ac.uk/~pjj/cs212/fix.html
## Lab Activity Ch 5 Queue
#### 5.1 Deque
Deque (dibaca deck) singkatan dari double ended queue adalah queue yang mempunyai dua bagian depan. Implementasikan ADT Deque
## Lab Activity Ch 6 Binary Tree

