Anda di halaman 1dari 11

Laporan Praktikum 1

Struktur Data

Oleh:
Mohammad Fahmi 11181048
Merlyn Muchtar 11181047
Muhhadi Adi Manyu 11181065
Pramana Ade Putra 11181070

Nama Asisten:
Holilurrahman 11171002

PROGRAM STUDI INFORMATIKA


JURUSAN MATEMATIKAN DAN TEKNOLOGI INFORMASI
INSTITUT TEKNOLOGI KALIMANTAN
BALIKPAPAN
2019
Tugas Pratikum

1. Implementasikan metode sederhana getNum dan getDen yang akan


mengembalikan pembilang (numerator) dan penyebut (denominator)
dari suatu pecahan (fraction).

• Source Code
No Pratikum1.py
1 class Fraction:
2 def __init__(self, top, bottom):
3 self.num = top
4 self.den = bottom
5
6 def __str__(self):
7 return "getNum : " + str(self.num) + " | getDen : " +
8 str(self.den)
9
10
11 num = 12
12 den = 2
13 print(str(num) + "/" + str(den))
14 print(Fraction(num, den))

• Penjelasan
1. Pada line pertama akan di inisiasi class dengan nama Fraction.
2. Kemudian dalam class tersebut terdapat 2 buah function yang akan
berfungsi sebagai konstruktur bagi bilangan pecahan.
3. Pada function __str__ disini akan dilakukan keluaran yang akan
mengeluarkan pembilang dan penyebut dari sebuah pecahan.
4. Kemudian terdapat dua input karena class Fraction membutuhkan 2
imputan.
5. Output dari class Fraction adalah function dari __str__.

• Screen Shot
2. Implementasikan operator aritmatika sederhana (__sub__, __mul__,
dan__truediv__).

• Source Code
No Pratikum1.py
1 def gcd(m, n):
2 while m % n != 0:
3 oldm = m
4 oldn = n
5
6 m = oldn
7 n = oldm % oldn
8 return n
9
10 class Fraction:
11 def __init__(self, top, bottom):
12 self.num = top
13 self.den = bottom
14
15 def __str__(self):
16 return str(self.num) + "/" + str(self.den)
17
18 def show(self):
19 return str(self.num)+"/"+str(self.den)
20
21 def __sub__(self, other):
22 newnum = self.num*other.den - self.den*other.num
23 newden = self.den * other.den
24 common = gcd(newnum, newden)
25 return Fraction(newnum//common, newden//common)
26
27 def __mul__(self, other):
28 newnum = self.num*other.den
29 newden = self.den*other.den
30 common = gcd(newnum, newden)
31 return Fraction(newnum//common, newden//common)
32
33 def __truediv__(self, other):
34 newnum = self.num * other.den
35 newden = self.den * other.num
36 common = gcd(newnum,newden)
37 return Fraction(newnum//common,newden//common)
38
39 x = Fraction(10,6)
40 y = Fraction(8,4)
41 print("__sub__ : " + str(x-y))
42 print("__mul__ : " + str(x*y))
43 print("__truediv__ : " + str(x/y))

• Penjelasan
1. Pada line ditambahkan sebuah fungsi baru dimana berguna untuk
mencari KPK.
2. Kemudian dalam class tersebut terdapat 3 buah operasi function
yang akan berfungsi sebagai konstruktur bagi bilangan pecahan.
3. Function __sub__ berguna untuk mengurangkan pecahan, function
ini akan aktif apabila terdapat operator – (kurang).
4. Function __mul__ berguna untuk mengkalikan pecahan, function ini
akan aktif apabila terdapat operator * (kali).
5. Function __truediv__ berguna untuk membagi pecahan function ini
akan aktif apabila terdapat operator / (bagi).
6. Masing-masing function tersebut memiliki keluaran hasil pecahan
yang didapatkan dari masing-masing proses yang berbeda.
7. Kemudian terdapat dua input karena class Fraction membutuhkan 2
imputan.
8. Output dari masing-masing function.

• Screen Shot

3. Implementasikan operator relasional yang diperlukan: (__gt__, __ge__,


__lt__,__le__, dan __ne__)

• Source Code
No Pratikum1.py
1 def __gt__(self, other):
2 firstnum = self.num * other.den
3 secondnum = other.num * self.den
4 return firstnum > secondnum
5
6 def __ge__(self, other):
7 firstnum = self.num * other.den
8 sec = other.num * self.den
9 return firstnum >= sec
10
11 def __lt__(self, other):
12 firstnum = self.num * other.den
13 secondnum = other.num * self.den
14 return firstnum < secondnum
15
16 def __le__(self, other):
17 firstnum = self.num * other.den
18 secondnum = other.num * self.den
19 return firstnum <= secondnum
20
21 def __ne__(self, other):
22 firstnum = self.num * other.den
23 secondnum = other.num * self.den
24 return firstnum != secondnum
25
26 x = Fraction(10,6)
27 y = Fraction(8,4)
28 print(str(x)+ " | " +str(y) )
29 print("__gt__ : " + str(x>y))
30 print("__ge__ : " + str(x>=y))
31 print("__lt__ : " + str(x<y))
32 print("__le__ : " + str(x<=y))
33 print("__ne__ : " + str(x!=y))
• Penjelasan
1. Function __gt__ digunakan untuk mendapatkan nilai kembali berupa
true atau false, function ini akan aktif apabila terdapat operator > .
2. Function __ge__ digunakan untuk mendapatkan nilai kembali
berupa true atau false, function ini akan aktif apabila terdapat
operator >= .
3. Function __lt__ digunakan untuk mendapatkan nilai kembali berupa
true atau false, function ini akan aktif apabila terdapat operator < .
4. Function __le__ digunakan untuk mendapatkan nilai kembali berupa
true atau false, function ini akan aktif apabila terdapat operator <= .
5. Function __ne__ digunakan untuk mendapatkan nilai kembali
berupa true atau false, function ini akan aktif apabila terdapat
operator != .

• Screen Shot

4. Modifikasi konstruktor untuk kelas fraction sehingga mampu memeriksa


untuk memastikan bahwa pembilang dan penyebut keduanya bertipe
integers. Jika salah satunya bukan integer, maka konstruktor akan
memunculkan suatu exception.

• Source Code
No Pratikum1.py
1 class Fraction:
2 def __init__(self, top, bottom):
3 try :
4 self.num = int(top)
5 self.den = int(bottom)
6 except ValueError :
7 print("not Integer")
8 exit()
9
10 x = Fraction(10,"LUL")
11 y = Fraction(8,4)
12 print(str(x)+ " | " +str(y) )
• Penjelasan
1. Pada class Fraction memiliki inisiasi __init__ yang mana
didalamnya memiliki parameter top dan bottom.
2. Kemudian dalam class Fraction diubah data typenya untuk masukan
parameter top dan bottom sebagai int.
3. Setelah itu, digunakan try dan exception, hal ini berguna sebagai
metode untuk menangkap sebuah exception atau pengecualian dari
sebuah codingan.
4. Inputan berisi data type string yang akan menguji sebuah
konstruktor.
• Screen Shot

5. Dalam definisi fraksi, kita menganggap bahwa pecahan negatif mempunyai


pembilang negatif dan penyebut positif. Menggunakan suatu penyebut
negatif dapat mengakibatkan beberapa operator relasi memberikan hasil
tidak benar. Secara umum, ini merupakan konstrain yang tidak penting.
Lakukan perubahan terhadap konstruktor agar memungkinkan pengguna
melewatkan suatu penyebut negatif sehingga semua operator tetap berlanjut
bekerja dengan benar.

• Source Code
No Pratikum1.py
1 class Fraction:
2 def __init__(self, top, bottom):
3 try :
4 self.num = int(top)
5 self.den = int(bottom)
6 if int(self.den) < 0 :
7 self.den = abs(self.den)
8 self.num = -self.num
9
10 except ValueError :
11 print("not Integer")
12 exit()
13
14 x = Fraction(10,-2)
15 y = Fraction(8,-1)
16 print(str(x)+ " | " +str(y) )

• Penjelasan
1. Pada class Fraction memiliki inisiasi __init__ yang mana
didalamnya memiliki parameter top dan bottom.
2. Kemudian dalam class Fraction diubah data typenya untuk masukan
parameter top dan bottom sebagai int.
3. Setelah itu, digunakan try dan exception, hal ini berguna sebagai
metode untuk menangkap sebuah exception atau pengecualian dari
sebuah codingan.
4. Setelah data valid maka dilakukan sebuah kondisi dimana jika
sebuah penyebut berupa negatif maka gunakan function build-in
abs() dimana berfungsi untuk merubah negatif menjadi positif.
5. Kemudian negatif yang diberikan pada penyebut di pindahkan pada
pembilang.

• Screen Shot

6. Telitilah metode __radd__ . Bagaimana perbedaannya dengan __add__?


kapan digunakan? Implementasikan metode__radd__.

• Source Code
No Pratikum1.py
1 def __radd__(self, other):
2 newnum = other.num * self.den + \
3 other.den * self.num
4 newden = other.den * self.den
5 common = gcd(newnum, newden)
6 return Fraction(newnum // common, newden // common)
7
8 x = Fraction(10,2)
9 y = Fraction(8,4)
10 print(str(x)+ " | " +str(y) )
11 print("__add__ : "+str(x+y))
12 print("__radd__ : " +str(y+x))

• Penjelasan
1. Function radd merupakan fungsi yang digunakan apabila terdapat
kesalahan pada function add yang tidak dapat dikerjakan.
2. Radd sendiri membalikkan other menjadi ke sebelah kiri dan self di
sebelah kanan.
• Screen Shot

7. Ulangi pertanyaan terakhir tetapi kali ini untuk metode __iadd__.

• Source Code
No Pratikum1.py
1 def __iadd__(self, other):
2 self.num = self.num * self.den + \
3 other.den * self.num
4 self.den = other.den * self.den
5 common = gcd(self.num, self.den)
6 return Fraction(self.num // common, self.den // common)
7
8
9 x = Fraction(10,2)
10 y = Fraction(8,4)
11 print(str(x)+ " | " +str(y) )
12 print("__add__ : "+str(x+y))
13 print("__radd__ : " +str(y+x))
14 print("__iadd__ : " +str(x+y))

• Penjelasan
1. Function iadd hampir sama dengan add akan tetapi lebih singkat.
Contohnya x + 5 itu sama dengan iadd x += 5.
• Screen Shot

8. Telitilah metode __repr__ . Apa bedanya dengan __str__? Kapan


digunakan? Implementasikan __repr__.
• Source Code
No Pratikum1.py
1 def __repr__(self):
2 return repr(str(self.num) + "/" + str(self.den))

• Penjelasan
1. Metode repr dapat merubah nilai menjadi string.

• Screen Shot

9. Temukan permainan sudoku di majalah atau situs web. Tulislah program


untuk menyelesaikan masalah puzzle tersebut..

• Source Code
No BacktrackSudoku.py
1 board = [
2 [9,0,0,1,0,0,0,6,7],
3 [0,0,8,5,0,0,0,9,0],
4 [0,0,0,0,0,0,0,4,0],
5 [0,7,0,0,0,9,0,2,6],
6 [0,1,6,8,5,3,4,0,0],
7 [5,0,4,0,6,2,1,0,0],
8 [1,8,2,0,0,6,9,0,0],
9 [4,5,7,9,0,1,0,3,0],
10 [0,0,0,2,4,5,0,1,8]
11 ]
12
13 def solve(bo) :
14 find = find_empty(bo)
15 if not find:
16 return True
17 else:
18 row, col = find
19
20 for i in range(1,10):
21 if valid(bo, i, (row, col)):
22 bo[row][col] = i
23
24 if solve(bo):
25 return True
26
27 bo[row][col] = 0
28
29 return False
30
31 def valid(bo, num, pos) :
32 # check baris
33 for i in range(len(bo[0])):
34 if bo[pos[0]][i] == num and pos[1] != i:
35 return False
36
37 #check column
38 for i in range(len(bo)):
39 if bo[i][pos[1]] == num and pos[0] != i :
40 return False
41
42 #check 1 kotak
43 box_x = pos[1] // 3
44 box_y = pos[0] // 3
45
46 for i in range(box_y * 3, box_y*3 + 3) :
47 for j in range(box_x * 3, box_x * 3 + 3):
48 if bo[i][j] == num and (i,j) != pos :
49 return False
50
51 return True
52
53 def print_board(bo) :
54 for i in range(len(bo)) :
55 if i % 3 == 0 and i != 0:
56 print("- - - - - - - - - - - - - ")
57 for j in range(len(bo)) :
58 if j % 3 == 0 and j != 0 :
59 print(" | ", end="")
60 if j == 8 :
61 print(bo[i][j])
62 else :
63 print(str(bo[i][j]) + " ", end= "")
64
65 def find_empty(bo) :
66 for i in range(len(bo)) :
67 for j in range(len(bo[0])) :
68 if bo[i][j] == 0 :
69 # baris dan coulumn
70 return (i, j)
71
72 return None
73
74 print_board(board)
75 solve(board)
76 print("Penyelesaian")
77 print_board(board)

• Penjelasan
1. Pertama, papan sudoku yang didapatkan dari generator sudoku
dimasukkan kedalam bentuk sebuah array.
2. Kemudian buat space yang kosong dengan angka 0
3. Function print_board() berguna untuk membagi array yang
dimasukkan tadi menjadi seperti sudoku board.
4. Function find_empty() berguna untuk mencari kotak yang kosong,
disini yang bernilai 0.
5. Kemudian Function solve() berguna untuk mencari jawaban dari
space yang kosong. Dengan menggunakan metode backtrack,
dimana angka dari 1-10 dicoba sampai semua kotak terisi semua.
Jika perhitungan tidak menemukan jawaban, maka percobaan akan
dimulai lagi dari awal.
6. Function valid() berguna untuk membagi sudoku menjadi 3x3 atau
per kotak dan menerjemahkannya menjadi index array.
• Screen Shot

Anda mungkin juga menyukai