Animasi push dan pop pada stack
/** | |
* Rahmat Subekti | |
* 11.12.5800 | |
*/ | |
#include <iostream> | |
#include <windows.h> | |
#include <conio.h> | |
//#include <dos.h> | |
//#include <stdlib.h> | |
//#include <cstdlib> | |
#include <stdio.h> | |
#include <string> | |
//#include <chrono> | |
//#include <thread> | |
#define MAX 20 // data maksimum sama seperti di contoh program | |
//using namespace std::literals::chrono_literals; //experimental | |
using namespace std; | |
//kapasitas awal = 0 | |
int kapasitas = 0; | |
struct Tumpukan | |
{ | |
// deklarasi struk seperi di modul | |
int atas; | |
char data[MAX]; | |
}T; | |
//memindahkan kursor pada konsole menggunakan koordinat x dan y | |
void gotoxy(int x, int y) { | |
//COORD coord; | |
//coord.X = x;//fungsi ini berjalan menggunakan | |
//coord.Y = y;//windows.h header file | |
//SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); | |
//memakai versi yang juga bisa jalan di linux | |
printf("%c[%d;%df",0x1B,y+1,x+1);//c version | |
} | |
void setColor(int foreground, int background){ | |
//bermain dengan warna dengan windows.h | |
int color_attr = foreground + (background * 16) ; | |
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_attr); | |
} | |
/* | |
//mengedipkan kursor, sehingga teks nantinya terlihat bergerak | |
void delay(int num) {//fungsi ini berjalan dengan menggunakan | |
for (int i = 0; i < num * 100; i++)//dos.h file header | |
for (int j = 0; j < num * 100; j++) {} | |
}// diganti fungsi Sleep() menggunakan windows.h header file | |
*/ | |
// agar cursor tidak kedip2 di karakter yang dianimasikan | |
// biarlah kedip disini saja | |
void loading(int i) { | |
//karena kursor banyak berkedip di loading jadi hilangkan kursor | |
fputs("\e[?25l", stdout);//DECSM pada saat loading saja | |
//Total delay 320ms setiap sekali putaran loading | |
// delay 160ms untuk satu tampilan pada animasi | |
if (i % 2 == 0) | |
{ | |
//jika i habis dibagi 2 animasikan karakter '|' dan '/' | |
gotoxy(40, 8); | |
//delay(60); | |
//this_thread::sleep_for(1); //experimental | |
Sleep(80);//delay sortcut, menggunakan windows.h | |
cout << '|'; | |
gotoxy(40, 8); | |
//delay(60); | |
//this_thread::sleep_for(1); | |
Sleep(80); | |
cout << '/'; | |
gotoxy(42, 8); | |
cout << "Loading"; | |
} | |
else { | |
//selain itu animasikan karakter '-' dan '\' | |
gotoxy(40, 8); | |
//delay(60); | |
//this_thread::sleep_for(1); | |
Sleep(80); | |
cout << '-'; | |
gotoxy(40, 8); | |
//delay(60); | |
//this_thread::sleep_for(1); | |
Sleep(80); | |
cout << '\\'; | |
gotoxy(42, 8);//kedipkan teks loading | |
cout << " "; | |
} | |
//kembalikan kursor setelah loading selesai | |
fputs("\e[?25h", stdout);//DECRM | |
} | |
// isEmpty? | |
int kosong() { | |
//cek T.atas apakah kosong (-1) | |
return T.atas ==-1; | |
} | |
void txtWarning(string txt){ | |
setColor(12,15); | |
cout << txt; | |
setColor(0,15); | |
getch(); | |
} | |
//isFull? | |
int penuh() { | |
//cek T.atas sudah sama dengan kapasitas yang diberikan | |
return T.atas == kapasitas-1; | |
} | |
void input() { | |
// Penginputan hanya dapat dilakukan jika kapasitas telah diisi | |
if (kapasitas > 0) | |
{ | |
char data; | |
cout << "Masukkan sebuah karakter : "; | |
cin >> data;//user menginputkan data | |
//cek apakah stack kosong (yang diharapkan) | |
//atau penuh (tidak diharapkan) agar berjalan | |
if (kosong() == 1 || penuh() == 0) { | |
T.atas++;//tambahkan data ke T.data ke sekian | |
T.data[T.atas] = data; | |
setColor(2,15); | |
for (int i = 0; i < 10; i++) | |
{ | |
//Animasikan ke kanan dengan menambahkan fungsi loading() | |
loading(i); | |
gotoxy(52 + i, 3);//mengubah koordinat coord.X menggunakan i | |
cout << " " << T.data[T.atas]; | |
} | |
for (int i = 0; i < kapasitas - T.atas; i++) | |
{ | |
//Animasikan ke bawah dengan menambahkan fungsi loading() | |
loading(i); | |
gotoxy(62, 3 + i);//mengubah koordinat coord.Y menggunakan i | |
cout << " "; | |
gotoxy(62, 4 + i); | |
cout << T.data[T.atas]; | |
} | |
setColor(0,15); | |
} | |
else | |
{ | |
gotoxy(57, 2); | |
txtWarning("TUMPUKAN PENUH"); | |
} | |
} | |
else txtWarning("Stack belum dibuat. Silakan buat stack dulu."); | |
} | |
void hapus() { | |
if (kapasitas > 0) | |
{ | |
// penghapusan hanya dapat dilakukan jika kapasitas telah diisi | |
if (kosong() == 0) | |
{ | |
setColor(2,15); | |
//menganimasikan karakter diambil dari stack | |
for (int i = kapasitas - T.atas; i >= 0; i--) | |
{ | |
//Animasikan ke atas dengan menambahkan fungsi loading() | |
loading(i); | |
gotoxy(62, 3 + i);//mengubah koordinat coord.Y menggunakan i | |
cout << T.data[T.atas]; | |
if (i < kapasitas - T.atas) | |
{ | |
//menghindari karakter sebelumnya dihapus dari tampilan | |
gotoxy(62, 4 + i); | |
cout << " "; | |
} | |
} | |
for (int i = 0; i < 10; i++) | |
{ | |
//Animasikan ke kanan dengan menambahkan fungsi loading() | |
loading(i); | |
gotoxy(62 + i, 3);//mengubah koordinat coord.X menggunakan i | |
cout << " " << T.data[T.atas]; | |
} | |
setColor(0,15); | |
// hilangkan karakter dari layar | |
gotoxy(72, 3); | |
cout << " "; | |
T.atas--;//sembunyikan karakter dengan mengurangi nilai T.atas | |
} | |
else | |
{ | |
gotoxy(57, 2); | |
txtWarning("DATA KOSONG"); | |
} | |
} | |
else txtWarning("Stack belum dibuat. Silakan buat stack dulu."); | |
} | |
void buat_stack() { | |
for (int i = 0; i < kapasitas+1; i++) | |
{ | |
//bersihkan gambar stack sebelum menggambar stack baru | |
gotoxy(60, 4 + i); | |
cout << " "; | |
} | |
T.atas = -1;//nilai awal T.atas | |
gotoxy(0, 10); | |
setColor(2,15); | |
cout << "Masukkan kapasitas stack (maksimal 20) : "; | |
cin >> kapasitas;//user menentukan kapasitas yang akan digunakan | |
for (int i = 0; i <= kapasitas; i++) | |
{ | |
//menggambar stack dari atas | |
if (i == kapasitas) | |
{ | |
//dieksekusi terakhir jika nilai i telah sama dengan kapasitas | |
//yang diperlukan | |
gotoxy(60, 4 + i); | |
cout << "| |"; | |
gotoxy(60, 4 + i); | |
cout << " --- "; | |
} | |
else | |
{ | |
//dieksekusi selama i lebih kecil dari kapasitas yang dipelukan | |
gotoxy(60, 4 + i); | |
cout << "| |"; | |
} | |
} | |
setColor(0,15); | |
} | |
int main() { | |
setColor(0,15); | |
system("cls"); //menghindari teks perintah setelah kompilasi program | |
int pilih; | |
//gambar menu | |
cout << "====================================\n" | |
<< " PROGRAM STACK\n" | |
<< "====================================\n" | |
<< " 1 : BUAT STACK BARU (CREATE)\n" | |
<< " 2 : TAMBAH ELEMEN (PUSH)\n" | |
<< " 3 : HAPUS ELEMEN (POP)\n" | |
<< " 4 : KELUAR\n\n" | |
<< "====================================\n" | |
<< "Masukkan pilihan : "; | |
do | |
{ | |
cin >> pilih;//inputan menu | |
switch (pilih) | |
{ | |
case 1://buat stack | |
buat_stack(); | |
break; | |
case 2://input data stack | |
input(); | |
break; | |
case 3:// hapus data | |
hapus(); | |
break; | |
case 4: | |
txtWarning("Bye Bye!!"); | |
break; | |
default: | |
txtWarning("Pilihan tidak tersedia"); | |
break; | |
} | |
gotoxy(40, 8);//menghapus teks loading jika sudah selesai animasinya | |
cout << " "; | |
gotoxy(55, 2);// menghapus teks stack penuh atau kosong diatas gambar stack | |
cout << " "; | |
gotoxy(0, 10);//menghapus teks setelah menu, hanya dari baris 1 | |
cout << " "; | |
gotoxy(0, 11);//dan baris 2 | |
cout << " "; | |
gotoxy(19, 9);//menghapus teks lama pada input pilihan menu | |
cout << " "; | |
gotoxy(19, 9); | |
} while (pilih !=4); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment