Demonstrasikan mekanisme Undo-Redo dengan program Python/C++.
Program menampilkan menu spt berikut: ====================== 1. Lakukan/Tambah Aksi 2. Undo 3. Redo 4. Selesai Input pilihan: ======================
Program menampilkan output berupa informasi aksi, apa yang di-undo dan apa yang di-redo. Untuk aksi, menggunakan A1, A2, A3, dst. Jika terdapat penambahan aksi sampai 10 kali, maka terdapat aksi-aksi A1, A2, A3, dst. hingga A10.
void tampilkan_stack(stack<int> st, string nama) { cout << "Stack " << nama << ": "; if (st.empty()) { cout << "kosong." << endl; return; } string info = ""; for (stack<int> temp = st; !temp.empty(); temp.pop()) { info += "A" + to_string(temp.top()) + ", "; } info = info.substr(0, info.length()-2) + "]"; cout << "TOP => " << info << endl; }
int main() { stack<int> undo, redo; int pilihan = 0, aksi = 0; cout << endl; while (pilihan != 4){ tampilkan_stack(undo, "UNDO"); tampilkan_stack(redo, "REDO"); pilihan = menu(); switch (pilihan) { case 1: aksi++; cout << "\n==> Lakukan/tambah aksi A" << aksi << ".\n" << endl; undo.push(aksi); break; case 2: if (undo.empty()) { cout << "\n==> Tidak bisa undo karena stack UNDO kosong.\n" << endl; } else { cout << "\n==> Undo aksi A" << undo.top() << ".\n" << endl; redo.push(undo.top()); undo.pop(); } break; case 3: if (redo.empty()) { cout << "\n==> Tidak bisa redo karena stack REDO kosong.\n" << endl; } else { cout << "\n==> Redo aksi A" << redo.top() << ".\n" << endl; undo.push(redo.top()); redo.pop(); } break; case 4: cout << "Terima kasih.\n" << endl; default: break; } } return 0; } __________________
Pembahasan
Struktur data untuk mekanisme Undo-Redo adalah stack (tumpukan), di mana pada suatu waktu kita hanya bisa mengambil elemen teratas dari stack.
Penambahan data pada stack dilakukan dengan push. Pengambilan data dari stack dilakukan dengan pop. Pada operasi stack yang lebih advanced, kita bisa memilih mau undo/redo hingga beberapa aksi/operasi.
Sesuai dengan spesifikasi program pada pertanyaan, secara garis besar, algoritmenya cukup sederhana.
Program secara berulang:
menampilkan menu
menerima input pilihan menu
melakukan langkah-langkah sesuai pilihan
jika pilihan menu = "Selesai", maka keluar dari looping.
Representasi Data
Spesifikasi program pada pertanyaan meminta data aksi direpresentasikan dengan A1, A2, dan seterusnya. Kita lakukan abstraksi di sini.
Yang terpenting dari string "A1", "A2", dan seterusnya adalah angka iterasinya, yaitu 1, 2, 3, dan seterusnya. Oleh karena itu, kita hanya perlu struktur data stack dengan elemen stack bertipe data integer (atau unsigned integer). Sedangkan awalan "A" hanya untuk keperluan output saja.
Contoh Hasil Eksekusi
Pada saat awal eksekusi program, kedua stack masih kosong.
OUTPUT: Stack UNDO: kosong. Stack REDO: kosong. (menu tidak perlu ditampilkan, agar jawaban tidak terlalu panjang)
Kemudian dengan pilihan nomor 1 sebanyak 5 kali, kita menambahkan 5 aksi baru.
Kode Program (C++)
// undoredo.cpp
#include <iostream>
#include <stack>
using namespace std;
int menu() {
string pilihan = "0";
while (stoi(pilihan) < 1 || stoi(pilihan) > 4) {
cout << "======================\n"
<< "1. Lakukan/tambah aksi\n"
<< "2. Undo\n"
<< "3. Redo\n"
<< "4. Selesai\n"
<< "======================\n"
<< "Input pilihan : ";
getline(cin, pilihan);
}
return stoi(pilihan);
}
void tampilkan_stack(stack<int> st, string nama) {
cout << "Stack " << nama << ": ";
if (st.empty()) {
cout << "kosong." << endl;
return;
}
string info = "";
for (stack<int> temp = st; !temp.empty(); temp.pop()) {
info += "A" + to_string(temp.top()) + ", ";
}
info = info.substr(0, info.length()-2) + "]";
cout << "TOP => " << info << endl;
}
int main() {
stack<int> undo, redo;
int pilihan = 0, aksi = 0;
cout << endl;
while (pilihan != 4){
tampilkan_stack(undo, "UNDO");
tampilkan_stack(redo, "REDO");
pilihan = menu();
switch (pilihan) {
case 1:
aksi++;
cout << "\n==> Lakukan/tambah aksi A" << aksi << ".\n" << endl;
undo.push(aksi);
break;
case 2:
if (undo.empty()) {
cout << "\n==> Tidak bisa undo karena stack UNDO
kosong.\n" << endl;
}
else {
cout << "\n==> Undo aksi A" << undo.top() << ".\n" << endl;
redo.push(undo.top());
undo.pop();
}
break;
case 3:
if (redo.empty()) {
cout << "\n==> Tidak bisa redo karena stack REDO kosong.\n"
<< endl;
}
else {
cout << "\n==> Redo aksi A" << redo.top() << ".\n" << endl;
undo.push(redo.top());
redo.pop();
}
break;
case 4:
cout << "Terima kasih.\n" << endl;
default:
break;
}
}
return 0;
}
__________________
Pembahasan
Struktur data untuk mekanisme Undo-Redo adalah stack (tumpukan), di mana pada suatu waktu kita hanya bisa mengambil elemen teratas dari stack.
Penambahan data pada stack dilakukan dengan push. Pengambilan data dari stack dilakukan dengan pop. Pada operasi stack yang lebih advanced, kita bisa memilih mau undo/redo hingga beberapa aksi/operasi.
Sesuai dengan spesifikasi program pada pertanyaan, secara garis besar, algoritmenya cukup sederhana.
Program secara berulang:
Representasi Data
Spesifikasi program pada pertanyaan meminta data aksi direpresentasikan dengan A1, A2, dan seterusnya. Kita lakukan abstraksi di sini.
Yang terpenting dari string "A1", "A2", dan seterusnya adalah angka iterasinya, yaitu 1, 2, 3, dan seterusnya. Oleh karena itu, kita hanya perlu struktur data stack dengan elemen stack bertipe data integer (atau unsigned integer). Sedangkan awalan "A" hanya untuk keperluan output saja.
Contoh Hasil Eksekusi
Pada saat awal eksekusi program, kedua stack masih kosong.
Stack UNDO: kosong.
Stack REDO: kosong.
(menu tidak perlu ditampilkan, agar jawaban tidak terlalu panjang)
Kemudian dengan pilihan nomor 1 sebanyak 5 kali, kita menambahkan 5 aksi baru.
Stack UNDO: TOP => A5, A4, A3, A2, A1]
Stack REDO: kosong.
Lalu, kita coba undo 2 kali dengan pilihan nomor 2 sebanyak 2 kali.
Stack UNDO: TOP => A3, A2, A1]
Stack REDO: TOP => A4, A5]
Kemudian, kita coba redo 2 kali dengan pilihan nomor 3 sebanyak 2 kali.
Stack UNDO: TOP => A5, A4, A3, A2, A1]
Stack REDO: kosong.
Setelah itu, kita coba redo lagi. Maka program akan menampilkan output:
Dan seterusnya.
Silahkan lihat gambar.
yg lalu python, skrg pake c++. sy hrs bnyk belajar dr kakak nih.
big thanks kak.