Anda di halaman 1dari 25

81.

Jidat Tsunade

#include<stdio.h>

//author : Evelyn Tjitrodjojo

int main(){

int x,t,a,i,j,b,c,k;

scanf("%d",&x); //input test case

for(t=0;t<x;t++){

scanf("%d",&a); //input angka sbg tinggi

for(i=0;i<a;i++){ //fungsi segitiga atas

for(j=1;j<a-i;j++){

printf("-");

} //print – membentuk segitiga

for(k=0;k<=i;k++){

if(k==0){

printf("*");

//kemudian print * di sblhnya paling luar

else printf("-");

} //selain itu print -

for(c=1;c<=i;c++){

if(c==i){

printf("*");

} //untuk print * terluar

else printf("-"); //selain itu -

printf("\n");

}
for(i=1;i<a;i++){ //fungsi untuk segitiga bawah, kebalikan diatas

for(j=1;j<i+1;j++){

printf("-");

for(k=a-i;k>0;k--){

if(k==a-i){

printf("*");

else printf("-");

for(c=a-i;c>1;c--){

if(c==2){

printf("*");

else printf("-");

printf("\n");

return 0;

}
Program ini bertujuan untuk menampilkan ke layar, bentuk segiempat dengan tinggi tertentu sesuai
yang diiputkan, contoh output :

Program :

1. Input test case, dan looping sebanyak test case

for(t=0;t<x;t++) bertujuan untuk looping program sebanyak x(test case).


2. Input angka sebagai tinggi

Disimpan sebagai a.
3. Algoritma print segitiga atas (dari index 0 sampai a-1)
Penjelasan algortima :
Untuk menjelaskan algoritma kita langsung menggunakan contoh dari output.

0 1234

0
1
2
3
4

Saya tambahkan pula “grid” supaya lebih mudah dipahami. (*selalu perhatikan grid ketika
memahami algoritma)
a. Pertama dalam algoritma yang dilakukan :

Looping pertama untuk membentuk segitiga atas, dan looping kedua untuk menampilkan
“_“, kita mulai dari i=0(garis merah), dan j=1, maka program akan melakukan print “_”
sebanyak 2 kali karena nilai j=1 dan itu kurang dari a-i dimana nilai a-i adalah 2, sehingga
looping j akan menampilkan ke layar karakter ”_” sebanyak 2 kali tepatnya di kolom 0 dan
1 (garis hijau).
b. Kedua looping k akan dijalankan, karena looping j sudah selesai

Looping ini akan berjalan selama k<=i, nilai k adalah 0 sedangkan nilai i adalah 0 sehingga
memenuhi syarat dan program menampilka “*”, tepatnya di kolom ke 2 (garis hijau).
Selajutnya akan kembali ke looping i yang diatas karena kondisi percabangan dan looping
selajutnya tidak memenuhi.
Else tidak dijalakan karena if(k==0) benar, kemudian looping c tidak dijalankan karena c
tidak lebih kecil sama dengan i.
c. Lanjut ke baris berikutnya (i=1; garis merah)
Kembali ke looping i

Namun dengan nilai i=1, sekarang looping j hanya akan menampilkan ke layar karakter “_”
sekali saja, karena saat looping kedua j=2 dan nilai j=2 tidak memenuhi kondisi a-1(yang
nilainya 2). Pada gambar grid karakter ini diposisi (1,0).
d. Selanjutnya program mengeksekusi looping :

Looping k akan di lakukan 2 kali, karena k akan berjalan ketika k<=i dengan nilai i=1, maka
k akan dieksekusi 2 kali, untuk k=0 dan k=1, untuk k=0 akan ditampilkan karakter “*” dan
untuk k=1 akan ditampilkan karakter “_” apabila dalam gambar grid karakter ini berada
pada posisi (1,1) dan (1,2).
Selanjutnya looping c akan dieksekusi karena kondisi c<=1 terpenuhi dimana c=1 dan i=1,
maka looping hanya akan dilakukan sekali, karena nilai c sama dengan i (1=1) maka yang
dieksekusi adalah fungsi untuk menampilkan (“*”) sementara else tidak dijalankan.
Untuk i=2 (garis merah) cara kerjanya sama dengan baris i=1 ini. Untuk mempersingkat
kita akan langsung masuk ke algoritma segitiga bawah.
e. Fungsi segitiga bawah :

Pertama program akan mengeksekusi loop :

Loop i ditujukan untuk membuat baris (garis merah) dan loop j akan dieksekusi sebanyak
satu kali, karena nilai awal j adalah 1 dan ini memenuhi j<i+1(dimana i+1=2), maka
program akan menampilkan karakter “_” sebanyak satu kali (3,0).
f. Selanjutnya program akan mengeksekusi loop :

Loop ini akan diesekusi sebanyak 2 kali. Pertama nilai awal k adalah a-i=2, selanjutnya
karena 2>0 maka loop dijalankan. Sekarang nilai k==a-i maka program menampilkan
karakter “*” pada titik (3,1), selanjutnya nilai k dikurangi maka nilai k=1, maka program
menampilkan “_” titik (3,2), dan terakhir k dikurangi 1 maka nilai k=0, dan ini sudah tidak
memenuhi kondisi k>0 maka loop selesai.
g. Selanjutnya program akan mengeksekusi loop :

Loop c akan dijalankan sebanyak satu kali. Nilai awal c adalah a-i = 3-1 maka nilai awal c
adalah 2, karena 2>1 maka loop dieksekusi.
Sekarang nilai c==2, maka program menampilkan karakter “*” ke layar di titik (3,3).
Setelah itu loop selesai karena jika c di decrement nilai c akan sama dengan 1 dan tidak
memenuhi kondisi c>1.
h. Untuk baris terakhir, program akan kembali mengeksekusi loop :

Namun sekaran nilai i=2, kemudian program mengeksekusi loop j. nilai awal j=1, dimana
ini memenuhi j<i+1 dengan i+1=3, maka loop j akan dieksekusi sebanyak 2 kali, sehingga
program akan menampilkan “_” sebanyak dua kali, tepatnya di titik (4,0) dan (4,1).

i. Selanjutnya program mengeksekusi loop :

Nilai awal k adalah a-i=1, maka loop ini hanya dieksekusi sekali. Nilai k sekarang sama
dengan a-1 maka program akan menampilkan ke layar, karakter “*”, tepatnya di titik (4,3).
j. Terakhir loop :

Tidak dieksekusi karena nilai awal c adalah 1 dan ini tidak memenuhi c>1, maka program
selesai.

82. Tower of Hanoi

#include<stdio.h>

void towerOfHanoi(int n, char dari_tiang, char ke_tiang, char tengah_tiang){

if (n == 1) {

printf("Memindahkan cakram 1 dari tiang %c ke tiang %c\n", dari_tiang, ke_tiang);

return;

}
towerOfHanoi(n-1, dari_tiang, tengah_tiang, ke_tiang);

printf("Memindahkan cakram %d dari tiang %c ke tiang %c\n", n, dari_tiang, ke_tiang);

towerOfHanoi(n-1, tengah_tiang, ke_tiang, dari_tiang);

int main(){

int n; //angka banyak cakram

printf("Masukkan banyak cakram: ");

scanf("%d",&n);

if(n<=0) return 0;

towerOfHanoi(n, 'A', 'C', 'B'); //nama tiang A,B,C

return 0;

*jika penjelasan di bawah kurang jelas, penjelasan dapat dilihat di : https://www.geeksforgeeks.org/c-


program-for-tower-of-hanoi/

Output Program

Konsep Tower of Hanoi

Pada konsepnya program ini akan memindahkan beberapa buah piring dari tiang A ke tiang C, dengan
bantuan tiang B, namun dalam sekali langkah hanya diperkenankan memindahkan satu piringan, dan
piringan kecil selalu berada diatas piringan yang lebih besar.
Alur Program

1. Pertama program akan menerima input banyaknya piringan misal kita masukkan n=2

2. Jika n bernilai negatif atau nol, maka program akan berhenti

3. Jika tidak 0 maka program akan memanggil fungsi towerOfHanoi

Dengan mem-parsing jumlah piringan, ‘A’,’C’,’B’.


4. Di fungsi towerOfHanoi, n diparsing sebagai variabel n, ‘A’ sebagai variabel dari_tiang, ‘C’
sebagai variabel ke_tiang, dan ‘B’ sebagai variabel tengah_tiang.

Sehingga nilai awalnya :


Selanjutnya karena n tidak sama dengan 1, maka program mengeksekusi perintah :

Sehingga program kembali memanggil fungsi towerOf Hanoi, namun kini nilainya :

Karena n=1, maka program akan menjalankan fungsi :

Dan di layar ditampilkan : Memindahkan cakram 1 dari tiang A ke tiang B. kemudian program
return ke int main.
Namun karena masih ada nilai

Maka program kembali ke fungsi towerOfHanoi

Dan menjalankan printf sehingga di layar muncul :


“Memindahkan cakram 2 dari tiang A ke tiang C”
Terakhir program memanggil fungsi :

Sehingga program kembali memanggil fungsi towerOfHanoi, dan nilainya menjadi :


Sehingga program mengeksekusi perintah

Dan menampilkan ke layar : “Memindahkan cakram 1 dari tiang B ke tiang C”4


Program kemudian kembali ke int main() dan program selesai.

83. Rat In Maze

#include<stdio.h>

//author : Evelyn Tjitrodjojo

#define N 4 //ukuran maze

int solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N]);

void printSolution(int sol[N][N]){ //untuk print solusi

int i,j;

for (i = 0; i < N; i++) {

for (j = 0; j < N; j++)

printf(" %d ", sol[i][j]);

printf("\n");

//fungsi untuk memastikan sesuai ukuran maze

int isSafe(int maze[N][N], int x, int y){

//jika fungsi di dalam batas maze maka langsung return 1

if(x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 1)

return 1;

//jika fungsi di luar batas maze maka langsung return 0

return 0;

}
//fungsi maze menggunakan backtracking

int solveMaze(int maze[N][N]){

int sol[N][N] = { {0, 0, 0, 0},

{0, 0, 0, 0},

{0, 0, 0, 0},

{0, 0, 0, 0}

};

if(solveMazeUtil(maze, 0, 0, sol) == 0) {

printf("Tidak ada solusi, tidak ada jalan.");

return 0;

printSolution(sol);

return 1;

//rekursi

int solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N]){

// jika x, y benar return 1

if(x == N-1 && y == N-1){

sol[x][y] = 1;

return 1;

//mengecek apakah maze benar ada

if(isSafe(maze, x, y) == 1){

//tandai jika benar

sol[x][y] = 1;

//jika bisa berpindah ke samping kanan direturn 1

if (solveMazeUtil(maze, x+1, y, sol) == 1)

return 1;

//Jika tidak, pindah ke bawah jika bisa

if (solveMazeUtil(maze, x, y+1, sol) == 1)

return 1;

//jika tidak bisa berpindah, ditandai dengan 0

sol[x][y] = 0;

return 0;
}

return 0;

int main(){

int maze[N][N];

int i,j;

for(i=0;i<N;i++){ //input angka 0 atau 1 sebagai nilai maze 4x4

for(j=0;j<N;j++){

scanf("%d",&maze[i][j]);

solveMaze(maze); //masukkan ke fungsi

return 0;

Program Rat in Maze ini bertujuan untuk menemukan jalan bagi seekor tikus yang kita letakkan di satu
titik untuk menuju titik akhir.

Algoritma dapat dilihat di : https://www.geeksforgeeks.org/rat-in-a-maze-backtracking-2/

*disarankan untuk melihat juga video di tautan web tersebut untuk memudahkan dalam memahami
code.

Cara yang digunakan adalah backtracking, sehingga program akan memeriksa kemungkinan tikus bisa
berjalan ke kanan, apabila tidak bisa maka program akan memeriksa apakah tikus bisa berjalan ke
bawah, apabila tikus juga tidak bisa berjalan ke bawah maka tikus akan mundur sampai tikus tersebut
dapat bergerak ke bawah.

Program

1. Program akan menerima input bentuk maze yang kita inginkan, misalnya :
2. Memanggil fungsi solveMaze dengan memparsing Maze yg sudah diinputkan, namun isi maze
dikosongkan.

3. Memanggil fungsi solveMazeUntil, selanjutnya if pertama tidak dijalankan karena kondisi yang
tidak terpenuhi

Sehingga program memanggil fungsi isSafe.


4. Dalam isSafe if pertama benar maka akan dieksekusi dengan me-return 1

5. Masuk lagi ke fungsi solveMazeUntil untuk memasukkan nilai 1 pada array yang bersangkutan
Sehingga sekarang nilai array sol menjadi:

6. Program ini akan terus dieksekusi hingga tikus dapat mencapai titik 3,3.

Jika kurang jelas program ini bisa di trace menggunakan


:http://www.pythontutor.com/c.html#mode=edit

Karena tracer ini tidak bisa mengeksekusi scanf maka untuk tracing program, dalam int main bisa
dilakukan perubahan seperti berikut ini :

int main(){

int maze[N][N]={

{1, 0, 0, 0},

{1, 1, 1, 0},

{0, 1, 0, 0},

{0, 1, 1, 1}

};

int i,j;

return 0;

Untuk fungsi yang lain tetap sama, tidak ada perubahan.


84. Bujur Sangkar Ganjil

#include<stdio.h>

#include<string.h>

//author : Evelyn Tjitrodjojo

//fungsi bujur sangkar ganjil

void Square(int n){

int magicSquare[n][n];

//untuk mengeset semua arr menjadi 0

memset(magicSquare, 0, sizeof(magicSquare));

//untuk meletakkan angka pertama

int i = n/2;

int j = n-1;

//satu per satu angka diletakkan

int num;

for (num=1; num <= n*n; ){

if (i==-1 && j==n){ //kondisi ketiga

j = n-2;

i = 0;

else{

//kondisi pertama jika angka berikutnya

//keluar dari kotak sisi kanan

if (j == n) j = 0;

//kondisi pertama jika angka berikutnya

//keluar dari kotak sisi atas

if (i < 0) i=n-1;

}
if (magicSquare[i][j]){ //kondisi kedua

j -= 2;

i++;

//continue;

else magicSquare[i][j] = num++; //penambah jumlah

j++; i--; //kondisi pertama

printf("Magic Square untuk n = %d:\nDengan total jumlah tiap baris dan kolom %d:\n\n", n,
n*(n*n+1)/2);

for (i=0; i<n; i++){

for (j=0; j<n; j++) printf("%3d ", magicSquare[i][j]);

printf("\n");

int main() {

int n=0;

printf("Masukkan bil ganjil: "); //hanya ganjil

scanf("%d",&n);

if(n%2==0){ //untuk genap

printf("Bukan bil ganjil.\n");

return 0;

Square (n); //menuju fungsi

return 0;

*Program error
85. Janson yang Haus

#include<stdio.h>

//author : Evelyn Tjitrodjojo

//program mencari eliminasi gauss

int main(){

int i,j,k,n;

float m[20][20],c,x[10];

scanf("%d",&n); //input brp persamaan

for(i=1; i<=n; i++){

for(j=1; j<=(n+1); j++){

scanf("%f",&m[i][j]); //input per persamaan

for(j=1; j<=n; j++){

for(i=1; i<=n; i++){

if(i!=j){ //jika anga i tidak sama dgn j

c=m[i][j]/m[j][j]; //array i ke j dibagi array j ke j

for(k=1; k<=n+1; k++){

m[i][k]=m[i][k]-c*m[j][k]; //kemudian dikurangi hasil kali m

for(i=1; i<=n; i++){

x[i]=m[i][n+1]/m[i][i]; //array x adalah array m ke n+1 dibagi i

printf("X%d = %.2f\n",i-1,x[i]); //Print hasil

return(0);

}
Program

1. Pertama kita akan input banyaknya persamaan, dan persamaan itu sendiri.

Misal kita inputkan :

Maka :
n=1
m[1][1]=4
m[1][2]=6
2. Selanjutnya program akan mengeksekusi loop

Loop ini dieksekusi, namun kondisi di dalamnya tidak memenuhi, sehingga kita berlanjut ke
perintah berikutnya.
3. Perintah ini untuk menampilkan ke layar, dengan menggunakan looping

Disini nilai yang di printf adalah


i-1=0
x[1]=m[1][2]/m[1][1]
=6/4 = 1.5
Maka di layar tampil output:
X0 = 1.50

86. Konversi nilai detik yang diinputkan ke jam, menit dan detik
yang sesuai

#include<stdio.h>

//author : Evelyn Tjitrodjojo

int main(){

int a,b,c,x,y,z,sisa;

printf("Masukkan detik: ");

scanf("%d",&a); //input angka detik

x=a/3600; //dibagi 3600 detik agar menjadi jam

sisa=a-(x*3600); //sisanya dijadikan menit

y=sisa/60; //dibagi 60 agar menjadi menit

z=a-(x*3600)-(y*60); //sisanya dijadikan detik

printf("%d jam %d menit %d detik",x,y,z); //print jam menit dan detik

return 0;

Program ini bertujuan untuk mengkonversi dari detik ke jam, menit, dan detik yang sesuai

Cara kerja

1. Pertama diiinputkan detik yang ingin dikonversi

2. Setelah itu a dibagi 3600 untuk mendapatkan jam

3. Untuk mendapatkan menit, dilakukan perintah sebagai berikut :


4. Sedangkan sisanya dijadikan detik dan jam, menit, detik ditampilkan ke layar

87. Menentukan tahun kabisat atau bukan kabisat

#include<stdio.h>
//author : Evelyn Tjitrodjojo

int main(){
int a,b,c;
scanf("%d",&a); //input angka tahun
if((a%4==0 || a%100==0) && a%400!=0){
//jika bisa dibagi 4 atau 100 dan tidak bisa dibagi 400
printf("Tahun Kabisat");
}
else //selain itu bukan tahun kabisat
printf("Bukan tahun kabisat");
return 0;
}

Program ini berfungsi untuk menentukan apakah sebuah tahun yang diinputkan merupakan tahun
kabisat atau tidak.

Cara Kerja

1. Mendapat inputan tahun


2. Setelah itu program mengecek nilai tahun mod 4, tahun mod 100, tahun mod 400, setelah
itu akan dimasukkan ke logika :

Logika 1 : a%4==0||a%100==0
Logika 2 : && a%400!=0
Artinya apabila salah satu nilai a%4 atau a%100 sama dengan 0 maka nilai logika pertama
akan benar, dan apabila nilai logika kedua adalah benar maka fungsi dibawah if akan
dieksekusi, sebaliknya jika salah satu logika menghasilkan logika yang bernilai salah maka
akan masuk ke fungsi else.
3. Apabila benar maka akan ditampilkan ke layar “Tahun Kabisat”
4. Sebaliknya bila nilai logika salah akan ditampilkan ke layar “Bukan Tahun Kabisat”.
88. Konversi suhu dari nilai suhu serta kode suhu yang diinputkan
(C/R/F/K) ke suhu yang setara dalam C, R, F dan K

Program ini bertujuan untuk mengkonversi suhu dari salah satu parameter ke parameter yang lain,
rumus yang digunakan adalah

Cara kerja program

1. Program menerima input suhu berupa integer dan basis suhu (c/r/f/k).
2. Jika basis suhu yang dimasukkan adalah c maka :
3. Jika basis suhu yang dimasukkan adalah r maka :

4. Jika basis suhu yang dimasukkan adalah f maka :

5. Jika basis suhu yang dimasukkan adalah k maka :

89. Konversi nilai angka ke huruf

#include<stdio.h>

/*Konversi nilai angka ke nilai huruf

A (81-100), AB (71-80), B (66-70), BC (61-65), C (56-60), D (41-55), E (0-40)*/

//author : Evelyn Tjitrodjojo

int main () {

int n;

printf("Tuliskan Angka n = ");

scanf("%d", &n); //input nilai

//konversi nilai angka ke huruf

if(n>=81 && n<=100) printf("A");

else if(n>=71 && n<=80) printf("AB");

else if(n>=66 && n<=70) printf("B");

else if(n>=61 && n<=65) printf("BC");

else if(n>=56 && n<=60) printf("C");

else if(n>=41 && n<=55) printf("D");

else if(n>=0 && n<=40) printf("E");

else printf(".");

}
Program ini bertujuan untuk merubah nilai angka ke nilai huruf sesuai dengan batas yang telah
ditentukan.

Program

1. Program akan menerima input nilai berupa bilangan bulat.


2. Jika nilai antara 81-100

3. Jika nilai antara 71-80

4. Jika nilai antara 66-70

5. Jika nilai antara 61-65

6. Jika nilai antara 56-60

7. Jika nilai antara 41-55

8. Jika nilai antara 0-40

90. Konversi desimal ke biner

#include<stdio.h>

//author : Evelyn Tjitrodjojo

int main () {

int N, sisa, biner=0, i=0;

printf("Masukkan Bilangan Desimal : ");

scanf("%d",&N); //input desimal

while (N!=0 && N>0) { //diulang jika bilangan lebih dari nol

sisa=N%2; //bilangan dimod 2

N=N/2; //bilangan dibagi 2

biner=biner+(sisa*i); //biner = sisa hasil modnya dikali i


i=i*10; //i untuk penanda satuan, puluhan, ratusan dst

printf("%d", biner); //print biner

return 0;

Program ini bertujuan untuk mengkonversi bilangan desimal ke biner.

Program

1. Abc

*program selalu menghasilkan 0

Anda mungkin juga menyukai