Last active
December 14, 2016 14:38
-
-
Save rmsubekti/92992eca2faf8f5b18e757d7c55fc2cc to your computer and use it in GitHub Desktop.
Animasi push dan pop pada stack
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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