Instantly share code, notes, and snippets.

@rmsubekti rmsubekti/AnimasiStack.cpp
Last active Dec 14, 2016

Embed
What would you like to do?
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