El2208 03 13221086

Anda mungkin juga menyukai

Anda di halaman 1dari 18

Program Studi Teknik Elektro ITB

Nama Kuliah (Kode) : Praktikum Pemecahan Masalah dengan C (EL2208)


Tahun / Semester : 2022-2023 / Genap
Modul : 3 – Pointers and Function
Nama Asisten / NIM : Jessen Javier Kurniawan / 18320014
Nama Praktikan / NIM : Najmi Azzahra F / 13221086

BCL / Log Praktikum


Pilihan Soal Praktikum Yang Dikerjakan
Nomor 2, karena saat membaca deskripsi soal mengenai perhitungan status di genshin impact, saya
sudah cukup familiar sehingga sedikit terbayang algoritma serta langkah apa yang harus dilakukan. Tidak
memilih nomor 1 karena tentang konvolusi dan menurut saya jauh lebih rumit dibanding soal nomor 2.

I. Penjelasan Rancangan /Algoritma kode yang dibuat


Berikut adalah source code yang dibuat beserta penjelasan rancangannya:
 Preprosesor
Kode Penjelasan
#include <stdio.h> Include library yang digunakan serta
#include <stdlib.h> mendefinisikan panjang maksimal untuk
#include <string.h> array of char, yaitu 50.
#define maxLen 50
 Prosedur tambah senjata
Kode Penjelasan
void tambah_senjata(float *key, int weapon){ Prosedur untuk menghitung pertambahan
// Lengkapi parameter status karakter berdasarkan senjata yang
/** @brief Fungsi digunakan untuk digunakan.
mengubah nilai status karakter berdasarkan
Prosedur ini memiliki dua parameter. Yang
pilihan senjata
pertama adalah suatu pointer bertipe float
*
yang akan digunakan untuk menyiman
**/
alamat array of string, yang kedua adalah
integer yang merupakan kode senjata yang
digunakan karakter.

//Variabel penambah status Mendeklarasikan variabel yang menyimpan


int atkHBD = 400 , crHBD = 28 ; status tiap senjata sebagai integer.
int atkSOH = 600, cdSOH = 66;
int atkAS = 550, cdAS = 88;
int atkEL = 600, erEL = 55;
int atkTFD = 540, emTFD = 265;

// Lengkapi fungsi Menetukan status apa yang ditambah


if (weapon == 1) { berdasarkan kode senjata dengan
key[1] += atkHBD ; menggunakan conditional statement.
key[2] += crHBD;
} else if (weapon ==2) {
key[1] += atkSOH ;
key[3] += cdSOH;
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap

} 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;
}
}

 Prosedur tambah artifak


Kode Penjelasan
void tambah_artifak(float *key, int arte1, Prosedur untuk menghitung pertambahan
int arte2){ // Lengkapi parameter status karakter berdasarkan artifak yang
/** @brief Fungsi digunakan untuk digunakan. Prosedur ini memiliki tiga
mengubah nilai status karakter berdasarkan parameter. Yang pertama adalah suatu
pilihan artifak karakter pointer bertipe float yang akan digunakan
* untuk menyiman alamat array of string,
*/ yang kedua adalah integer yang merupakan
kode untuk artifak pertama yang digunakan,
serta terakhir juga merupakan integer yang
merupakan kode untuk artifak kedua yang
digunakan.

//Deklarasi variabel Mendeklarasikan variabel yang menyimpan


double hpTenacity = 20, atkTenacity = 20 status tiap senjata sebagai float atau
; integer. Mendeklarasikan variabel
int erEmblem = 20; persenAtk dan persenHP yang digunakan
int emEmblem = 80; untuk menyimpan data kenaikan persen hp
int crBerserk = 12 , cdBerserk = 24;
dan atk akibat kontribusi artifak,
sertavariabel down yang menyimpan nilai
float atkDeepwood = 15;
float 0.5. Down akan digunakan untuk
int emDeepwood = 80;
membulatkan hasil hitungan float ke
float atkNoblesse = 20;
bawah.
int crNoblesse = 10;
//var untuk menghitung pertambahan
persen atk dan hp
float persenAtk = 100 , persenHP = 100;
//var untuk pembulatan ke bawah
float down = 0.5 ;

// Lengkapi fungsi Menetukan status apa yang ditambah


//Untuk artifak 1 berdasarkan kode artifak dengan
if (arte1 == 1) { menggunakan conditional statement.
persenHP += hpTenacity ; Conditional statement pertama untuk
persenAtk += atkTenacity; artifak 1, conditional statement kedua
} else if (arte1 == 2) {
untuk artifak 2. Pada akhir kode, total
penambahan atk dan hp dari dua artifak
key[4] += erEmblem ;
akan dihitung, lalu hasilnya akan dibulatkan
key[5] += emEmblem ;
ke bawah dengan mengurangi dengan 0.5 .
Halaman 2 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap

} 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 adalah array of float yang


menyimpan status flat karakter dari baris
kedua file.
 Token adalah pointer bertipe character
yang digunakan untuk menyimpan string
hasil parsing dari file. Untuk menyimpan
hasil parsing digunakan pointer agar
ukuran tokel bisa ebih dinamis.
 Variabel hp, atk, cr, cd, er serta em adalah
tempat penyimpanan sementara string
yang diubah jadi float yang awalnya
disimpan pada pointers token.
 Weapon, arte1 serta arte2 adalah variabel
integer untuk menyimpan kode senjata
dan artifak yang digunakan karakter.
// Input nama file Membaca nama file, membuka file dalam
printf("Gensin Impek - Berpetualang di mode membaca lalu menyimpannya pada
Dunia Fantasi\n"); pointers charPtr.
printf("Masukkan nama file yang berisi
status karakter: ");
scanf("%s", charFile) ;

//Simpan alamat file ke pointer


FILE* charPtr = fopen(charFile, "r") ;
// Validasi File Validasi dan parsing file. Jika file kosong,
if(!charPtr) { maka program berakhir. Jika file tidak
printf("File tidak dapat dibuka. kosong, maka program parsing file akan
Program Berakhir."); berjalan.
}
Program parsing file diawali dengan
membaca baris pertama dari file
else {
menggunakan fungsi fscanf. Baris pertama
//Membaca string di baris pertama
ini akan disimpan pada variabel charName
serta menyimpannya dalam array charName
sebagai nama karakter yang akan dihitung
fscanf(charPtr, "%[^\n]", charName);
penambahan statusnya.

int j = 0 ; Selanjutnya, akan dilakukan iterasi untuk


//Melakukan iterasi terhadap file embaca setiap baris pada file. Dengan
while (fgets(line, maxLen, charPtr)) menggunakan fgets, isi file akan dibaca
{ sebagai string. Mula, mula, token akan
//Memisahkan baris pertama dan menyimpan string pertama yang terpisah
kedua oleh karakter new line (“\n”), untuk
token = strtok(line, "\n"); memisahkan baris pertama dan kedua.
//Membaca string pertama yang
dipisahkan oleh "," di baris kedua Selanjutnya, token akan menyimpan setiap
token = strtok(line, ","); string di baris kedua yang dipisahkan oleh
hp = atof(token);
karakter koma (“,”). Setiap string ini akan
diubah menjadi float dengan fungsi atoi,
statChar[0] = hp;
lalu disimpan sementara pada variabel atk,
//Membaca string kedua yang
hp, cr, cd, er dan em, baru selanjutnya nilai
dipisahkan oleh "," di baris kedua
dari variabel tersebut akan diassign ke
token = strtok(NULL, ",");
elemen-elemen array statChar sebagai
atk = atof(token); status dari karakter.
Halaman 4 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

printf("Crit Rate: %.0f%%\n",


statChar[2]);
printf("Crit Damage: %.0f%%\n",
statChar[3]);
printf("ER: %.0f%%\n", statChar[4]);
printf("EM: %.0f\n", statChar[5]);
}
return 0;

II. Kendala yang dialami:


Pada mulanya, saya membuat terlebih dahulu prosedur tambah_senjata dan tambah_artifak. Membuat
prosedur ini cukup singkat dan mudah. Setelahnya, saya baru membuat kode untuk membaca file. Pada
pembuatan kode ini, saya cukup terkendala karena bingung bagaimana cara membaca file di baris kedua
lalu menyimpannya ke array dengan benar.

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

III. Flowchart Kode yang Dibuat

Flowchart program utama

Halaman 7 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap

Flowchart prosedur tambah_senjata Flowchart prosedur tambah_artifak

Halaman 8 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap

IV. DFD Dari Kode yang Dibuat

V. Analisis Kompleksitas Algoritma

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

void tambah_senjata(float *key, int weapon){ // Lengkapi parameter


/** @brief Fungsi digunakan untuk mengubah nilai status karakter berdasarkan pilihan
senjata
*
**/
//Variabel penambah status
int atkHBD = 400 , crHBD = 28 ;
int atkSOH = 600, cdSOH = 66;
int atkAS = 550, cdAS = 88;
int atkEL = 600, erEL = 55;
int atkTFD = 540, emTFD = 265;
// 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;

Halaman 9 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap

} else if (weapon ==4) {


key[1] += atkEL;
key[4] += erEL;
} else {
key[1] += atkTFD;
key[5] += emTFD;
}
}
Berdasarkan potongan kode diatas, kita tahu bahwa setiap kondisi (setiap statement dibawah if serta
else if) dari prosedur ini hanya terdiri operasi aritmatika dasar yaitu pertambahan. Untuk setiap
statement yang merupakan operasi dasar berupa assignment, operasi aritmatika atau perbandingan,
maka waktu yang dibutuhkan adalah konstan, yaitu O(1) untuk tiap statement pada setiap kondisional.

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

void tambah_artifak(float *key, int arte1, int arte2){ // Lengkapi parameter


/** @brief Fungsi digunakan untuk mengubah nilai status karakter berdasarkan pilihan
artifak karakter
*
*/
//Deklarasi variabel
double hpTenacity = 20, atkTenacity = 20 ;
int erEmblem = 20;
int emEmblem = 80;
int crBerserk = 12 , cdBerserk = 24;
float atkDeepwood = 15;
int emDeepwood = 80;
float atkNoblesse = 20;
int crNoblesse = 10;
//var untuk menghitung pertambahan persen atk dan hp
float persenAtk = 100 , persenHP = 100;
//var untuk pembulatan ke bawah
float down = 0.5 ;

// 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

int weapon, arte1, arte2;


// Input nama file
printf("Gensin Impek - Berpetualang di Dunia Fantasi\n");
printf("Masukkan nama file yang berisi status karakter: ");
scanf("%s", charFile) ;
//Simpan alamat file ke pointer
FILE* charPtr = fopen(charFile, "r") ;
// Validasi File
if(!charPtr) {
printf("File tidak dapat dibuka. Program Berakhir.");
}
else {
//Membaca string di baris pertama serta menyimpannya dalam array charName
fscanf(charPtr, "%[^\n]", charName);
int j = 0 ;
//Melakukan iterasi terhadap file
while (fgets(line, maxLen, charPtr))
//Memisahkan baris pertama dan kedua
token = strtok(line, "\n");
//Membaca string pertama yang dipisahkan oleh "," di baris kedua
token = strtok(line, ",");
hp = atof(token);
statChar[0] = hp;
//Membaca string kedua yang dipisahkan oleh "," di baris kedua
token = strtok(NULL, ",");
atk = atof(token);
statChar[1] = atk;

//Membaca string ketiga yang dipisahkan oleh "," di baris kedua


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
float *key = statChar;

Halaman 12 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap

//Input nomor senjata dan set artifak


printf("Masukkan nomor senjata, set artifak 1, dan set artifak 2 : ");
scanf("%d %d %d", &weapon, &arte1, &arte2);
//Menjalankan fungsi untuk menghitung status
tambah_senjata(key, weapon);
tambah_artifak(key, arte1, arte2);
// 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]);
printf("Crit Rate: %.0f%%\n", statChar[2]);
printf("Crit Damage: %.0f%%\n", statChar[3]);
printf("ER: %.0f%%\n", statChar[4]);
printf("EM: %.0f\n", statChar[5]);
}
return 0;
}
Pada main program, sama halnya dengan pada prosedur tambah_senjata dan prosedur
tambah_artifak, untuk tiap statement atau kode per baris yang hanya merupakan oeprasi dasar berupa
operasi aritmatika serta assignment, maka waktu yang dibutuhkan untuk tiap kode tersebut adalah
konstan yaitu O(1). Akan tetapi, karena pada main program ini terdapat loop berupa while loop yang
memiliki jumlah iterasi sebanyak jumlah baris yang terisi pada file, maka kita tahu bahwa file sebagai
input dari program mempengaruhi jumlah iterasi program, sehingga dapat disimpulkan bahwa jumlah
kerja program bergantung pada ukuran input. Untuk program yang kerjanya diengaruhi oleh ukuran
satu input, maka waktu yang dibutuhkan adalah linier dengan ukuran input tersebut, yaitu O(n). Big –
O- notation sendiri akan menjadikan pangkat tertinggi sebagai kompleksitas algoritma, sehingga dari
konstan O(1) dan linier O(n), pada worst-case, kompleksitas algoritma dari main program adalah:
𝑂𝑂(𝑛𝑛)
 Kesimpulan : Analisis kompleksitas waktu keseluruhan program
Secara keseluruha, kompleksitas waktu dari program ini adalah kompleksitas waktu program utama,
yaitu :
𝑂𝑂(𝑛𝑛)

Halaman 13 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap
Lampiran : source code program (sudah dibenarkan)

/** EL2208 Praktikum Pemecahan Masalah dengan C 2022/2023


* Modul : 3 - Pointers dan file eksternal
* Hari dan Tanggal : Jumat, 24 Februari 2023 (diedit pada 27 Februari 2023)
* Nama (NIM) : Najmi Azzahra F (13221086)
* Nama File : main.c
* Deskripsi : Menghitung status karakter genshin impact
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxLen 50

// Kerjakan soal dengan konsep pointer


// Fungsi yang disediakan hanya referensi untuk menjawab soal.
// Silahkan ubah parameter fungsi atau menambah/mengurangi fungsi sesuai
keperluan

void tambah_senjata(float *key, int weapon){ // Lengkapi parameter


/** @brief Fungsi digunakan untuk mengubah nilai status karakter
berdasarkan pilihan senjata
*
**/
//Variabel penambah status
int atkHBD = 400 , crHBD = 28 ;
int atkSOH = 600, cdSOH = 66;
int atkAS = 550, cdAS = 88;
int atkEL = 600, erEL = 55;
int atkTFD = 540, emTFD = 265;

// 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

void tambah_artifak(float *key, int arte1, int arte2){ // Lengkapi parameter


/** @brief Fungsi digunakan untuk mengubah nilai status karakter
berdasarkan pilihan artifak karakter
*
*/
//Deklarasi variabel
double hpTenacity = 20, atkTenacity = 20 ;
int erEmblem = 20;
int emEmblem = 80;
int crBerserk = 12 , cdBerserk = 24;
float atkDeepwood = 15;
int emDeepwood = 80;
float atkNoblesse = 20;
int crNoblesse = 10;
//var untuk menghitung pertambahan persen atk dan hp
float persenAtk = 100 , persenHP = 100;
//var untuk pembulatan ke bawah
float down = 0.5 ;

// 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;

// Input nama file


printf("Gensin Impek - Berpetualang di Dunia Fantasi\n");
printf("Masukkan nama file yang berisi status karakter: ");
scanf("%s", charFile) ;

//Simpan alamat file ke pointer


FILE* charPtr = fopen(charFile, "r") ;

// Validasi File
if(!charPtr) {
printf("File tidak dapat dibuka. Program Berakhir.");
}

else {

//Membaca string di baris pertama serta menyimpannya dalam array


charName
fscanf(charPtr, "%[^\n]", charName);

int j = 0 ;
//Melakukan iterasi terhadap file
while (fgets(line, maxLen, charPtr)) {

//Memisahkan baris pertama dan kedua


token = strtok(line, "\n");

//Membaca string pertama yang dipisahkan oleh "," di baris kedua


token = strtok(line, ",");
hp = atof(token);
statChar[0] = hp;

Halaman 16 dari 18
Praktikum Pemecahan Masalah dengan C (EL2208) | Tahun 2020-2021 | Semester Genap

//Membaca string kedua yang dipisahkan oleh "," di baris kedua


token = strtok(NULL, ",");
atk = atof(token);
statChar[1] = atk;

//Membaca string ketiga yang dipisahkan oleh "," di baris kedua


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


float *key = statChar;

//Input nomor senjata dan set artifak


printf("Masukkan nomor senjata, set artifak 1, dan set artifak 2 : ");
scanf("%d %d %d", &weapon, &arte1, &arte2);

//Menjalankan fungsi untuk menghitung status


tambah_senjata(key, weapon);
tambah_artifak(key, arte1, arte2);

// 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

printf("Crit Rate: %.0f%%\n", statChar[2]);


printf("Crit Damage: %.0f%%\n", statChar[3]);
printf("ER: %.0f%%\n", statChar[4]);
printf("EM: %.0f\n", statChar[5]);
}
return 0;
}

Halaman 18 dari 18

Anda mungkin juga menyukai