Nim : 1829101040
Soal 1
Terdapat banyak sekali kemungkinan dalam pembentukan struktur data dari mahasiswa dengan
menggunakan linked list, karenanya dalam hal ini akan ditunjukan salah satunya saja. Hal pertama
yang perlu dilakukan adalah mengenali atribut-atribut yang dimiliki oleh seorang mahasiswa.
1. Nim
2. Nama
3. Fakultas
4. Jurusan
5. Ipk
6. Matakuliah
Masih banyak atribut yang mungkin dimiliki oleh mahasiswa namun untuk menyederhanakan
permasalahan, hanya digunakan enam yang mendasar saja. Data-data tersebut dapat dibentuk
dalam psudocode yang dalam hal ini adalah psudo-C sebagai berikut :
struct siswa {
char *nim;
char *nama;
char *fakultas;
char *jurusan;
float ipk;
struct matkul *mk;
struct matkul *mk_head;
struct siswa *next;
struct siswa *prev;
};
Note : pemilihan tipe data atribute mungkin berbeda-beda namun pada dasarnya tipe data diatas
dapat digunakan dalam banyak kasus, seperti misalnya di beberapa tempat mungkin saja nim
hanya terbentuk dari angka akan tetapi nim sebenarnya bukanlah bilangan, karena kita tidak akan
melakukan operasi matematika terhadapnya
Pada kode diatas juga terlihat bahwa adanya suatu atribut bertipe matkul yang mana matkul juga
merupakan suatu struktur data bentukan yang dibentuk dari beberapa atribut sebagai berikut.
1. ID matakuliah
2. Nama matkuliah
3. Sks
4. Nilai
Sehingga jika dituliskan dalam bentuk kode menjadi seperti dibawah ini.
struct matkul {
char *id_matkul;
char *nama_matkul;
int sks;
char nilai;
struct matkul *next;
};
Atribute next disini juga berfungsi sama seperti pada siswa dimana berfungsi untuk mengikat node
node siswa satu sama lain dalam struktur data linked list.
Keseluruhan kode.
struct matkul {
char *id_matkul;
char *nama_matkul;
int sks;
char nilai;
struct matkul *next;
};
struct siswa {
char *nim;
char *nama;
char *fakultas;
char *jurusan;
float ipk;
struct matkul *mk;
struct matkul *mk_head;
struct siswa *next;
struct siswa *prev;
};
Kemungkinan lain adalah dengan memandang fakultas dan jurusan sebagai tipe data bentukan lain
seperti misalnya.
struct fakultas {
char *id_fakultas;
char *nama_fakultas;
char *alamat;
char *no_telp;
};
struct jurusan {
char *id_jurusan;
char *nama_jurusan;
char *alamat;
char *no_telp;
struct fakultas *fakultas;
struct jurusan *next;
struct jurusan *prev;
};
Kedua struktur memungkinkan digunakan untuk menggantikan tipe data char pada fakultas dan
jurusan dalam struktur siswa yang kita buat sebelumnya. Hal seperti ini mengingatkan kita akan
pemerograman berorientasi objek yang memandang entitas-entitas objek. Kembali karena alasan
kesederhanaan maka kita tetap focus pada struktur yang sebelumnya telah dibuat.
Selanjutnya tinggal membentuk untaian dari struktur data siswa dan matakuliah yang sudah kita
miliki, dalam hal ini juga terdapat banyak sekali kemungkinan seperti munggunakan single linked
list, double linked list, circular linked list, ataupun berbagai kreasi yang mungkin dibentuk
tergantung pada kebutuhan dari sistem yang akan di develop. Sekali lagi dalam jawaban ini hanya
disajikan salah satunya yakni menggunakan double linked list dan single linked list. Berikut
gambaran list yang akan terbentuk.
Jadi setiap siswa saling berkaitan dengan metode double linked list sedangkan masing-masing
siswa juga memiliki matakuliah yang saling berkaitan dengan single linked list.
Note : dalam kasus ini sebenarnya pemilihan jenis list bertipe single linked list sudah cukup
namun dalam jawaban digunakan double linked list guna memberikan mobilitas yang lebih
tinggi dalam kasus yang lebih umum. Selain itu menunjukan bahwa dapat dibentuk berbagai
jenis list untuk menyelesaikan suatu permesalahan.
siswa *siswa1=NULL;
siswa *siswaX=NULL;
struct matkul *mkX=NULL;
//siswa 1
siswaX=(struct siswa*)malloc(sizeof(struct siswa));
siswa1=siswaX;
siswaX->prev=NULL;
siswaX->nim="1208605033";
siswaX->nama="I Wayan Pio Pratama";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
siswaX->ipk=hitungIPK(siswaX);
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;
//siswa 2
siswaX->next=(struct siswa*)malloc(sizeof(struct siswa));
siswaX->next->prev=siswaX;
siswaX=siswaX->next;
siswaX->nim="1208605034";
siswaX->nama="Ni Komang Rai Mirayanti";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;
siswaX->ipk=hitungIPK(siswaX);
Terdapat fungsi hitung IPK pada kode diatas yang akan ditunjukan pada jawaban soal 2.
Soal 2
IPK seorang mahasiswa dapat dihitung dengan cara mengalikan sks dengan bobot nilai siswa
dibagi jumlah sks yang diambil oleh mahasiswa tersebut.
𝐼𝑃𝐾
𝑏𝑜𝑏𝑜𝑡 𝑛𝑖𝑙𝑎𝑖 𝑚𝑘1 ∗ 𝑠𝑘𝑠 𝑚𝑘1 + 𝑏𝑜𝑏𝑜𝑡 𝑛𝑖𝑙𝑎𝑖 𝑚𝑘2 ∗ 𝑠𝑘𝑠 𝑚𝑘2 + ⋯ + 𝑏𝑜𝑏𝑜𝑡 𝑛𝑖𝑙𝑎𝑖 𝑚𝑘𝑁 ∗ 𝑠𝑘𝑠 𝑚𝑘𝑁
=
𝑠𝑘𝑠 𝑚𝑘1 + 𝑠𝑘𝑠 𝑚𝑘2 + ⋯ + 𝑠𝑘𝑠 𝑚𝑘𝑁
Setelah itu dengan memanfaatkan linked list yang sudah terbentuk pada soal 1 dapat dibuat kode
untuk menghitung ipk dari mahasiswa dengan cara berikut.
while(siswaX->mk!=NULL)
{
bobot=cariBobot(siswaX->mk->nilai);
sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;
siswaX->mk=siswaX->mk->next;
}
Fungsi diatas menerima parameter berupa data bertipe bentukan siswa, yang mana siswa tersebut
menggenggam untaian dari matakuliah, sks, dan nilai-nilainya, sehingga dapat digunakan dalam
penghitungan ipk.
Dalam kode diatas terdapat fungsi cariBobot yang merupakan pemberian bobot angka kedalam
nilai mahasiswa yang berformat char (‘A’, ‘B’, ‘C’, ‘D’, ‘E’).
1. A = 4
2. B = 3
3. C = 2
4. D = 1
5. E = 0
Adapun fungsi bobot tersebut dapat dituliskan dalam bentuk kode sebagai berikut.
//input yang diterima berupa karakter nilai (‘A’, ‘B’, ‘C’, ‘D’,
‘E’)
int cariBobot(char nilai)
{
int bobot=0;
if(nilai=='A')
{
bobot=4;
}
else if(nilai=='B')
{
bobot=3;
}
else if(nilai=='C')
{
bobot=2;
}
else if(nilai=='D')
{
bobot=1;
}
return bobot;
}
Sedangkan untuk pencarian nilai berdasarkan siswa tertentu dan matakuliah tertentu dapat
diselesaikan sebagai berikut.
Note : dalam kasus ini pencarian mahasiswa tertentu dan matakuliah tertentu dibatasi hanya
dengan nim dan id matakuliah saja.
return nilai;
}
Kode diatas menunjukan bahwa pencarian dilakukan dari head of list (siswa ke 1) sampai
ditemukannya data atau sampai diujung list maka perulangan akan selesai. Jika ternyata data tidak
ditemukan maka akan di return karakter ‘-’. Input parameter yang digunakan adalah siswa pertama
dalam list, nim mahasiswa yang akan dicari, dan id matakuliah yang dicari.
Penalaran Lanjut
Permasalahan pada soal nomor 2 juga dapat diselesaikan dengan cara selain iterative yakni dengan
memanfaatkan fungsi rekursif sebagai berikut.
if(siswaX->mk==NULL)
{
if(jumlah_sks>0)
{
sum=sum/jumlah_sks;
}
else
{
sum=-1;
}
return sum;
}
else
{
bobot=cariBobot(siswaX->mk->nilai);
sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;
siswaX->mk=siswaX->mk->next;
hitungIPK(siswaX, sum, jumlah_sks);
}
}
Lampiran
#include <stdio.h>
struct matkul {
char *id_matkul;
char *nama_matkul;
unsigned int sks;
char nilai;
struct matkul *next;
};
struct siswa {
char *nim;
char *nama;
char *fakultas;
char *jurusan;
float ipk;
struct matkul *mk;
struct matkul *mk_head;
struct siswa *next;
struct siswa *prev;
};
if(siswaX->mk==NULL)
{
if(jumlah_sks>0)
{
sum=sum/jumlah_sks;
}
else
{
sum=-1;
}
return sum;
}
else
{
bobot=cariBobot(siswaX->mk->nilai);
sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;
siswaX->mk=siswaX->mk->next;
hitungIPK(siswaX, sum, jumlah_sks);
}
}
while(siswaX->mk!=NULL)
{
bobot=cariBobot(siswaX->mk->nilai);
sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;
siswaX->mk=siswaX->mk->next;
}
return nilai;
}
char cariNilai(struct siswa *siswaX,char *nim, char *id_mk)
{
char nilai;
int main()
{
struct siswa *siswa1=NULL;
struct siswa *siswaX=NULL;
struct matkul *mkX=NULL;
//siswa 1
siswaX=(struct siswa*)malloc(sizeof(struct siswa));
siswa1=siswaX;
siswaX->prev=NULL;
siswaX->nim="1208605033";
siswaX->nama="I Wayan Pio Pratama";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;
siswaX->ipk=hitungIPKIterative(siswaX);
//siswa 2
siswaX->next=(struct siswa*)malloc(sizeof(struct siswa));
siswaX->next->prev=siswaX;
siswaX=siswaX->next;
siswaX->nim="1208605034";
siswaX->nama="Ni Komang Rai Mirayanti";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;
siswaX->ipk=hitungIPKIterative(siswaX);
//siswa 3
siswaX->next=(struct siswa*)malloc(sizeof(struct siswa));
siswaX->next->prev=siswaX;
siswaX=siswaX->next;
siswaX->nim="1208605035";
siswaX->nama="Mr. X";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;
//printf("%.2f",siswa1->next->next->ipk);
free(siswa1);
free(siswaX);
free(mkX);
return 0;
}