El2208 03 13221086
El2208 03 13221086
El2208 03 13221086
} else if (weapon == 3) {
key[1] += atkAS;
key[3] += cdAS;
} else if (weapon ==4) {
key[1] += atkEL;
key[4] += erEL;
} else {
key[1] += atkTFD;
key[5] += emTFD;
}
}
} else if (arte1 == 3) {
key[2] += crBerserk;
key[3] += cdBerserk;
} else if (arte1 == 4) {
persenAtk += atkDeepwood;
key[5] += emDeepwood;
} else {
persenAtk += atkNoblesse ;
key[2] += crNoblesse;
}
//Untuk artifak 2
if (arte2 == 1) {
persenHP += hpTenacity ;
persenAtk += atkTenacity;
} else if (arte2 == 2) {
key[4] += erEmblem ;
key[5] += emEmblem ;
} else if (arte2 == 3) {
key[2] += crBerserk;
key[3] += cdBerserk;
} else if (arte2 == 4) {
persenAtk += atkDeepwood;
key[5] += emDeepwood;
} else {
persenAtk += atkNoblesse ;
key[2] += crNoblesse;
}
//Menghitung status hp dan atk yang
didapat dari 2 artifak
key[0] = ((persenHP/100)*key[0])-down;
key[1] = ((persenAtk/100)*key[1])-down;
Main program
Kode Penjelasan
int main(){ Mendeklarasikan variabel yang akan
char charFile[maxLen]; digunakan untuk menyimpan data. Berikut
char line[maxLen]; penjelasan mengenai masing-masing
char charName[maxLen]; variabel:
float statChar[maxLen]; charFile adalah array of character yang
char* token;
digunakan untuk menyimpan nama file
yang ingin dibaca.
float hp, atk, cr, cd, er, em;
Line adalah array of character yag
int weapon, arte1, arte2;
digunakan untuk menyimpan isi file.
charName adalah array of character yang
digunakan untuk menyimpan string
berupa nama karakter yang terletak pada
baris pertama file.
Halaman 3 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
statChar[1] = atk;
Setelah mendapat nama karakter dan status
//Membaca string ketiga yang flat karakter pada array statChar, file sudah
dipisahkan oleh "," di baris kedua tidak dibutuhkan lagi, sehingga file ditutup.
token = strtok(NULL, ",");
cr = atof(token);
statChar[2] = cr;
//Membaca string keempat yang
dipisahkan oleh "," di baris kedua
token = strtok(NULL, ",");
cd = atof(token);
statChar[3] = cd;
//Membaca string kelima yang
dipisahkan oleh "," di baris kedua
token = strtok(NULL, ",");
er = atof(token);
statChar[4] = er;
//Membaca string keenam yang
dipisahkan oleh "," di baris kedua
token = strtok(NULL, ",");
em = atof(token);
statChar[5] = em;
++j;
}
//Menutup file
fclose(charPtr);
//Simpan alamat array di pointer Selanjutnya, array statChar akan disimpan
float *key = statChar; alamatnya pada variabel pointers key.
Digunakan pointers agar array yang
//Input nomor senjata dan set digunakan untuk menyimpan status
artifak karakter bisa di-pass sebagai parameter
printf("Masukkan nomor senjata, set
fungsi tanpa harus memperhatikan ukuran
array.
artifak 1, dan set artifak 2 : ");
scanf("%d %d %d", &weapon, &arte1,
Setelahnya, akan diminta kode senjata dan
&arte2);
artifak yang digunakan karakter, dilanjutkan
dengan fungsi untuk menghitung status
//Menjalankan fungsi untuk akhir karakter berdasarkan senjata dan
menghitung status artifak yang digunakan menggunakan
tambah_senjata(key, weapon); prosedur tambah_senjata dan
tambah_artifak(key, arte1, arte2); tambah_artifak yang sudah didefinisikan
sebelumnya.
// Print Akhir Di akhir program, status final karakter
printf("Status akhir karakter %s setelah penambahan status dari senjata dan
setelah menggunakan senjata dan artifak artifak akan ditempilkan di layar.
adalah:\n", charName);
printf("HP: %.0f \n", statChar[0]);
printf("ATK: %.0f \n", statChar[1]);
Halaman 5 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Setelah menghabiskan waktu cukup lama untuk mencoba dan memikirkan hal ini, akhirnya saya bertanya
pada asisten dan mendapatkan bantuan yang cukup signifikan. Meskipun demikian, pada percobaan
pertama saya mengimplementasikan saran dari kakak asisten, pembacaan file tetap belum berhasil.
Setelah beberapa waktu saat asisten sudah giliran bisa saya tanyakan, saya menanyakan lagi terkait hal ini.
Kakak asisten pun memberi saran lain, bahkan hingga mendikte dan memberikan contoh pada saya.
Setelah mengimplementasikan dan sedikit mengedit kode kedua yang disarankan oleh kakak asisten,
akhirnya pada pukul 10 lewat saya berhasil untuk menyimpan status karakter pada baris kedua sebagai
array of float.
Setelahnya, saya mencoba untuk mengetes hasil final status pada file char1.txt, char2.txt dan char3.txt.
Status akhir yang tampil pada layar untuk file char1.txt sama seperti contoh program di naskah soal, tetapi
ada sedikit perbedaan pada atk dan cd akhir untuk file char2.txt dan char3.txt. Setelah saya memeriksa,
perbedaan ini disebakan oleh kesalahan kecil berupa salah mencocokan variabel status penambahan
dengan artifak serta untuk atk adalah karena cara perhitungan atk dan hp yang salah untuk artifak. Setelah
membenarkan kesalahn ini, status akhir yang ditamilkan di layar untuk file char1.txt, char2.txt, serta
char3.txt sudah sama dengan contoh program pada naskah soal.
Sayang sekali, hingga 30 menit terakhir kode ini masih memiliki kendala yaitu baris pertama nama karakter
tidak bisa disimpan. Kode token = strtok(line, “\n”) tidak membuat token menyimpan baris pertama file
saja, tetapi entah kenapa seluruh baris file, sehingga nama karakter saja tidak bisa di akses. Saat saya
bertanya pada kakak asisten, kakak asisten juga sudah cukup sibuk dengan praktikan lain sehingga hingga
akhir saya tetap belum bisa membaca baris pertama file saja lalu menyimpannya sebagai karakter,
sehingga kode saya di autograder salah semua (kecuali yang validasi). Saking paniknya, saya tidak sadar
jika header di file main.c saya mengenai nama praktikan serta overview program belum saya isi.
Setelah praktikum selesai dan saya ingin memperbaiki kode saya, saya pun searching di google cara untuk
membaca baris pertama saja suatu file, dan langsung ketemu dengan mudahnya. Saya merasa sangat
menyesal kenapa saat praktikum saya tidak kepikiran untuk searching di google terkait membaca baris
pertama ini. Padahal, tidak perlu waktu berlama-lama saya langsung menemukan solusinya. Ini menjadi
pembelajaran bagi saya untuk lebih tenang dalam mengerjakan kodenya.
Halaman 6 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Halaman 7 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Halaman 8 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Dengan menggunakan big-O-Notation, saya akan menganalisis kompleksitas waktu pada kondisi terburuk.
Berikut adalah tabel yang berisi kode berikut penjelasan mengenai analisis kompleksitas waktu :
Analisis kompleksitas waktu prosedur tambah senjata
Kode 5.1 Potongan kode prosedur tambah senjata
Halaman 9 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Kita tahu bahwa berapapun ukuran data yang ditunjuk oleh pointers key, serta berapapun nilai integer
weapon, tetap dijalankan kondisional dengan jumlah yang sama, sebanyak 5 kondisi. Dengan demikian,
dapat disimpulkan bahwa untuk prosedur tambah_senjata, ukuran dari input atau parameter fungsi
tidak mempengaruhi jumlah statement yang harus dieksekusi oleh program. Sehingga untuk worst-
case, secara keseluruhan kompleksitas algoritma untuk prosedur tambah_senjata adalah:
𝑂𝑂(1)
Analisis kompleksitas waktu prosedur tambah artifak
Kode 5.2 Potongan kode prosedur tambah_artifak
// Lengkapi fungsi
//Untuk artifak 1
if (arte1 == 1) {
persenHP += hpTenacity ;
persenAtk += atkTenacity;
} else if (arte1 == 2) {
key[4] += erEmblem ;
key[5] += emEmblem ;
} else if (arte1 == 3) {
key[2] += crBerserk;
Halaman 10 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
key[3] += cdBerserk;
} else if (arte1 == 4) {
persenAtk += atkDeepwood;
key[5] += emDeepwood;
} else {
persenAtk += atkNoblesse ;
key[2] += crNoblesse;
}
//Untuk artifak 2
if (arte2 == 1) {
persenHP += hpTenacity ;
persenAtk += atkTenacity;
} else if (arte2 == 2) {
key[4] += erEmblem ;
key[5] += emEmblem ;
} else if (arte2 == 3) {
key[2] += crBerserk;
key[3] += cdBerserk;
} else if (arte2 == 4) {
persenAtk += atkDeepwood;
key[5] += emDeepwood;
} else {
persenAtk += atkNoblesse ;
key[2] += crNoblesse;
}
//Menghitung status hp dan atk yang didapat dari 2 artifak
key[0] = ((persenHP/100)*key[0])-down;
key[1] = ((persenAtk/100)*key[1])-down;
}
Sama seperti prosedur tambah_senjata, prosedur tambah_artifak juga hanya terdiri operasi aritmatika
dasar pada setiap statement per baris kodenya. Sehingga, untuk tiap statementnya waktu yang
dibutuhkan adalah konstan, yaitu O(1) untuk setiap statement atau kode perbarisnya. Untuk
keseluruhan prosedur, sama seperti prosedur tambah_senjata, dapat kita lihat pada kode 5.2 bahwa
berapapun ukuran data yang ditunjuk oleh pointers key, serta berapapun nilai integer weapon, tetap
dijalankan kondisional dengan jumlah yang sama, sebanyak 5 kondisi, yang berarti untuk prosedur ini
juga ukuran dari input atau parameter fungsi tidak mempengaruhi jumlah statement yang harus
dieksekusi oleh program. Sehingga, untuk worst-case, secara keseluruhan kompleksitas algoritma
untuk prosedur tambah_artifak juga adalah:
𝑂𝑂(1)
Analisis kompleksitas waktu main program
Kode 5.3 Potongan kode main program
int main(){
char charFile[maxLen];
char line[maxLen];
char charName[maxLen];
float statChar[maxLen];
char* token;
float hp, atk, cr, cd, er, em;
Halaman 11 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Halaman 12 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Halaman 13 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Lampiran : source code program (sudah dibenarkan)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxLen 50
// Lengkapi fungsi
if (weapon == 1) {
key[1] += atkHBD ;
key[2] += crHBD;
} else if (weapon ==2) {
key[1] += atkSOH ;
key[3] += cdSOH;
} else if (weapon == 3) {
key[1] += atkAS;
key[3] += cdAS;
} else if (weapon ==4) {
key[1] += atkEL;
key[4] += erEL;
} else {
key[1] += atkTFD;
key[5] += emTFD;
}
}
Halaman 14 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
// Lengkapi fungsi
//Untuk artifak 1
if (arte1 == 1) {
persenHP += hpTenacity ;
persenAtk += atkTenacity;
} else if (arte1 == 2) {
key[4] += erEmblem ;
key[5] += emEmblem ;
} else if (arte1 == 3) {
key[2] += crBerserk;
key[3] += cdBerserk;
} else if (arte1 == 4) {
persenAtk += atkDeepwood;
key[5] += emDeepwood;
} else {
persenAtk += atkNoblesse ;
key[2] += crNoblesse;
}
//Untuk artifak 2
if (arte2 == 1) {
persenHP += hpTenacity ;
persenAtk += atkTenacity;
} else if (arte2 == 2) {
key[4] += erEmblem ;
key[5] += emEmblem ;
} else if (arte2 == 3) {
key[2] += crBerserk;
key[3] += cdBerserk;
} else if (arte2 == 4) {
Halaman 15 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
persenAtk += atkDeepwood;
key[5] += emDeepwood;
} else {
persenAtk += atkNoblesse ;
key[2] += crNoblesse;
}
//Menghitung status hp dan atk yang didapat dari 2 artifak
key[0] = ((persenHP/100)*key[0])-down;
key[1] = ((persenAtk/100)*key[1])-down;
}
int main(){
char charFile[maxLen];
char line[maxLen];
char charName[maxLen];
float statChar[maxLen];
char* token;
float hp, atk, cr, cd, er, em;
int weapon, arte1, arte2;
// Validasi File
if(!charPtr) {
printf("File tidak dapat dibuka. Program Berakhir.");
}
else {
int j = 0 ;
//Melakukan iterasi terhadap file
while (fgets(line, maxLen, charPtr)) {
Halaman 16 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
++j;
}
//Menutup file
fclose(charPtr);
// Print Akhir
printf("Status akhir karakter %s setelah menggunakan senjata dan
artifak adalah:\n", charName);
printf("HP: %.0f \n", statChar[0]);
printf("ATK: %.0f \n", statChar[1]);
Halaman 17 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Halaman 18 dari 18