Berikut ini adalah pertanyaan dari 4dministraktor pada mata pelajaran TI untuk jenjang Sekolah Menengah Atas
======================
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.
Jawaban dan Penjelasan
Berikut ini adalah pilihan jawaban terbaik dari pertanyaan diatas.
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:
- 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.
- OUTPUT: (setelah penambahan aksi ke-5)
Stack UNDO: TOP => A5, A4, A3, A2, A1]
Stack REDO: kosong.
Lalu, kita coba undo 2 kali dengan pilihan nomor 2 sebanyak 2 kali.
- OUTPUT: (setelah undo 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.
- OUTPUT: (setelah redo 2 kali)
Stack UNDO: TOP => A5, A4, A3, A2, A1]
Stack REDO: kosong.
Setelah itu, kita coba redo lagi. Maka program akan menampilkan output:
- ==> Tidak bisa redo karena stack REDO kosong.
Dan seterusnya.
Silahkan lihat gambar.
Semoga dengan pertanyaan yang sudah terjawab oleh henriyulianto dapat membantu memudahkan mengerjakan soal, tugas dan PR sekolah kalian.
Apabila terdapat kesalahan dalam mengerjakan soal, silahkan koreksi jawaban dengan mengirimkan email ke yomemimo.com melalui halaman Contact
Last Update: Mon, 07 Nov 22