Program ini adalah aplikasi berbasis teks untuk sistem pembelian barang di sebuah toko, termasuk pengurutan barang, penghitungan harga, dan pencetakan struk. Saya akan membahas setiap bagian utama dari kode ini.
1. Preprocessor Directives dan Definisi Konstanta
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_ITEMS 5 // Maksimum item yang diizinkan
#define MAX_LEN 50 // Maksimum panjang string
#include
digunakan untuk menyertakan file header standar sepertistdio.h
(untuk input/output),stdlib.h
(untuk fungsi umum),string.h
(untuk manipulasi string), dantime.h
(untuk fungsi waktu).#define
digunakan untuk mendefinisikan konstantaMAX_ITEMS
danMAX_LEN
yang digunakan di seluruh program.
2. Fungsi clearScreen
void clearScreen() {
// Cross-platform clear screen
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
Fungsi ini membersihkan layar terminal. Untuk sistem operasi Windows, digunakan cls
, sementara di sistem lain seperti Linux atau MacOS, digunakan clear
.
3. Struct Definitions
struct Barang {
char no[3];
char nama[20];
int harga;
};
struct Pembelian {
char no[3];
int jumlah;
};
struct Barang
menyimpan informasi tentang barang, termasuk nomor, nama, dan harga.struct Pembelian
menyimpan informasi tentang pembelian, termasuk nomor barang dan jumlah yang dibeli.
4. Fungsi intToString
void intToString(int value, char* result) {
sprintf(result, "%d", value);
}
Mengkonversi bilangan bulat (int
) ke string menggunakan sprintf
.
5. Fungsi tampilkanMenu
void tampilkanMenu(struct Barang items[], int maxItems) {
clearScreen();
printf("Selamat datang di Toko Sensa\n");
printf("Silahkan pilih barang yang Anda inginkan:\n");
printf("-----------------------------------------\n");
printf("| No | Barang | Harga |\n");
printf("-----------------------------------------\n");
int i;
for (i = 0; i < maxItems; ++i) {
printf("| %-2s | %-15s | Rp.%-10d |\n", items[i].no, items[i].nama, items[i].harga);
}
printf("-----------------------------------------\n");
printf("\n");
printf("11. Input Barang\n");
printf("99. Struk Pembayaran\n");
printf("55. Reset Pilihan\n");
printf("00. Keluar\n");
printf("\n");
printf("-----------------------------------------\n");
printf("Inputkan pilihan yang anda inginkan: ");
}
Detail Fungsi
- Pemanggilan fungsi
clearScreen
:- Fungsi ini digunakan untuk membersihkan layar. Ini membantu dalam memberikan tampilan yang bersih setiap kali menu ditampilkan.
- Menampilkan Header dan Instruksi:
- Fungsi ini menggunakan
printf
untuk mencetak pesan selamat datang dan instruksi untuk memilih barang.
- Fungsi ini menggunakan
- Menampilkan Daftar Barang:
- Program kemudian mencetak header tabel untuk daftar barang yang tersedia (
No
,Barang
,Harga
). - Loop
for
digunakan untuk melewati setiap item dalam arrayitems
(yang berisi strukturBarang
). - Untuk setiap barang, nomor, nama, dan harga dicetak dalam format tabel.
- Program kemudian mencetak header tabel untuk daftar barang yang tersedia (
- Menampilkan Opsi Tambahan:
- Setelah daftar barang, menu menampilkan opsi tambahan seperti:
11. Input Barang
: Untuk menambah barang ke keranjang pembelian.99. Struk Pembayaran
: Untuk mengakhiri pembelian dan mencetak struk pembayaran.55. Reset Pilihan
: Untuk mengosongkan keranjang pembelian dan memulai lagi.00. Keluar
: Untuk keluar dari program.
- Setelah daftar barang, menu menampilkan opsi tambahan seperti:
- Meminta Input Pengguna:
- Di akhir fungsi, program meminta pengguna untuk memasukkan pilihan mereka.
Penjelasan Tambahan untuk siswa
- Format String dalam printf:
%s
digunakan untuk string,%d
untuk integer.- Modifikasi seperti
%-2s
dan%-15s
menetapkan lebar field dan rata kiri untuk output yang terformat rapi.
- Loop For:
- Loop ini penting untuk menampilkan setiap item di array
items
.i < maxItems
memastikan bahwa loop berjalan hanya untuk jumlah item yang valid.
- Loop ini penting untuk menampilkan setiap item di array
- Kebersihan Layar:
- Membersihkan layar sebelum menampilkan menu baru sangat penting dalam aplikasi berbasis teks untuk memastikan bahwa output tidak bercampur dengan teks sebelumnya.
Dengan menggunakan fungsi tampilkanMenu
, program dapat menyajikan antarmuka yang user-friendly dan terorganisir dengan baik untuk interaksi pengguna.
6. Fungsi swap dan bubbleSort
6.A Fungsi swap
void swap(struct Pembelian *a, struct Pembelian *b) {
struct Pembelian temp = *a;
*a = *b;
*b = temp;
}
- Tujuan: Menukar dua elemen
struct Pembelian
. - Parameter: Fungsi ini menerima dua pointer ke
struct Pembelian
, yaknia
danb
. - Proses:
- Fungsi ini pertama-tama menyimpan nilai dari
a
ke dalam variabel sementaratemp
. - Kemudian, isi dari
b
disalin kea
. - Akhirnya, isi dari
temp
(yang merupakan nilai awal daria
) disalin keb
.
- Fungsi ini pertama-tama menyimpan nilai dari
- Penggunaan: Fungsi ini digunakan dalam proses pengurutan untuk menukar posisi dua elemen jika diperlukan.
6.B Fungsi bubbleSort
void bubbleSort(struct Pembelian arr[], int n) {
int i, j;
for (i = 0; i < n-1; i++) {
for (j = 0; j < n-i-1; j++) {
if (arr[j].jumlah < arr[j+1].jumlah) {
swap(&arr[j], &arr[j+1]);
}
}
}
}
- Tujuan: Mengurutkan array
arr
daristruct Pembelian
berdasarkan jumlah pembelian dari yang terbesar ke terkecil. - Parameter:
arr[]
: Array yang akan diurutkan.n
: Ukuran dari array tersebut.
- Proses:
- Fungsi ini menggunakan dua loop bersarang (
for
). Loop luar berjalan dari awal array hingga elemen kedua terakhir, dan loop dalam berjalan dari awal array hingga elemen yang belum diurutkan. - Di dalam loop dalam, fungsi ini membandingkan elemen saat ini (
arr[j]
) dengan elemen berikutnya (arr[j+1]
). Jika elemen saat ini lebih kecil dari elemen berikutnya, mereka ditukar posisinya menggunakan fungsiswap
. - Proses ini berulang hingga semua elemen diurutkan.
- Fungsi ini menggunakan dua loop bersarang (
- Algoritma: Ini adalah implementasi dari algoritma pengurutan Bubble Sort, yang merupakan metode pengurutan sederhana. Algoritma ini bekerja dengan berulang kali melewati array untuk diurutkan, membandingkan dua item sekaligus, dan menukarnya jika urutannya salah.
Penjelasan Tambahan untuk siswa
- Konsep Bubble Sort:
- Bubble Sort adalah algoritma pengurutan yang sederhana di mana setiap pasangan elemen berdekatan dibandingkan, dan elemen ditukar jika tidak dalam urutan yang diinginkan. Proses ini diulangi hingga tidak ada lagi tukar yang diperlukan.
- Penggunaan Pointer:
- Dalam fungsi
swap
, pointer digunakan untuk referensi langsung ke posisi memori dari elemen yang ingin ditukar. Ini memungkinkan kita untuk memodifikasi array asli langsung dari dalam fungsiswap
.
- Dalam fungsi
7. Fungsi main
int main() {
// Inisialisasi variabel dan struktur data
...
// Loop utama aplikasi
while (1) {
// Menampilkan Menu dan menangani input pengguna
...
switch (pilihan) {
case 11:
// Logika untuk menambah barang ke keranjang
...
break;
case 99:
// Logika untuk mencetak struk pembayaran
...
break;
case 55:
// Logika untuk reset keranjang
...
break;
case 00:
// Logika untuk keluar dari program
...
break;
default:
// Tangani input yang tidak valid
...
}
}
return 0;
}
Detail Fungsi
- Inisialisasi Variabel dan Struktur Data:
- Inisialisasi waktu, variabel untuk struk, barang-barang yang tersedia, keranjang pembelian, dan variabel lain yang digunakan dalam program.
- Loop Utama Aplikasi (
while (1)
):- Program menggunakan loop
while
tak terbatas untuk terus menjalankan aplikasi sampai pengguna memutuskan untuk keluar.
- Program menggunakan loop
- Menampilkan Menu dan Input Pengguna:
- Memanggil fungsi
tampilkanMenu
untuk menampilkan opsi kepada pengguna. - Menerima input dari pengguna untuk memilih opsi yang diinginkan.
- Memanggil fungsi
- Switch Case untuk Mengelola Opsi:
- Berdasarkan input pengguna,
switch
case digunakan untuk menentukan aksi yang sesuai.case 11
: Menambah barang ke keranjang.- Meminta nomor barang dan jumlah yang akan dibeli.
- Menambahkan informasi ini ke dalam keranjang pembelian.
case 99
: Mencetak struk pembayaran.- Melakukan pengurutan keranjang menggunakan
bubbleSort
. - Menghitung total harga, diskon, dan total bayar.
- Mencetak struk pembayaran ke layar.
- Melakukan pengurutan keranjang menggunakan
case 55
: Mereset keranjang pembelian.- Mengosongkan isi keranjang dan mengatur ulang total harga dan diskon.
case 00
: Keluar dari program.- Menghentikan loop dan menutup program.
default
: Menangani pilihan yang tidak valid.- Menampilkan pesan error jika pengguna memasukkan pilihan yang tidak dikenali.
- Berdasarkan input pengguna,
- Akhir dari Fungsi
main
:- Fungsi mengembalikan 0, yang menandakan bahwa program berakhir dengan normal.
Penjelasan Tambahan untuk siswa
- Struktur Kontrol: Penggunaan loop
while
danswitch
case merupakan contoh struktur kontrol dasar dalam pemrograman. Mereka membantu dalam pengelolaan alur program berdasarkan kondisi atau pilihan pengguna. - Pengelolaan Data: Program ini mengelola data barang dan pembelian melalui array dari struktur, yang merupakan cara efektif untuk menangani kumpulan data yang terstruktur.
- Pemisahan Fungsi: Memisahkan logika ke dalam fungsi yang berbeda (seperti
tampilkanMenu
,bubbleSort
, dll.) membantu membuat kode lebih terorganisir dan mudah untuk dipahami atau dimodifikasi. - Importansi
return 0
: Di akhirmain
,return 0
menandakan bahwa program berakhir dengan sukses. Ini adalah konvensi dalam pemrograman C.
7.A Case ’11’
case 11:
do {
printf("\nMasukkan nomor barang: ");
fgets(noBarang, 3, stdin);
fflush(stdin); // Membersihkan buffer input
noBarang[strcspn(noBarang, "\n")] = 0; // Menghapus newline
printf("Masukkan jumlah: ");
scanf("%d", &jumlah);
fflush(stdin); // Membersihkan buffer input
// Mencari barang dan menambahkannya ke keranjang
int found = 0;
int i;
for (i = 0; i < MAX_ITEMS; i++) {
if (strcmp(items[i].no, noBarang) == 0) {
struct Pembelian pembelian;
strcpy(pembelian.no, noBarang);
pembelian.jumlah = jumlah;
keranjang[jumlahItemDiKeranjang++] = pembelian;
found = 1;
break;
}
}
if (!found) {
printf("Nomor barang tidak ditemukan.\n");
}
printf("Apakah Anda ingin memasukkan barang lagi? (Y/N): ");
tambahLagi = getchar();
fflush(stdin); // Membersihkan buffer input
} while (tambahLagi == 'Y' || tambahLagi == 'y');
break;
Detail Langkah-langkah:
- Input Nomor Barang:
- Pengguna diminta untuk memasukkan nomor barang menggunakan
fgets
. Ini membaca input sebagai string, termasuk baris baru (\n
). fflush(stdin)
digunakan untuk membersihkan buffer input untuk menghindari masalah bacaan input berikutnya.noBarang[strcspn(noBarang, "\n")] = 0
digunakan untuk menghapus karakter baris baru dari input yang diberikan oleh pengguna.
- Pengguna diminta untuk memasukkan nomor barang menggunakan
- Input Jumlah Barang:
- Pengguna diminta untuk memasukkan jumlah barang yang ingin dibeli menggunakan
scanf
. - Lagi-lagi,
fflush(stdin)
digunakan setelahscanf
untuk membersihkan buffer.
- Pengguna diminta untuk memasukkan jumlah barang yang ingin dibeli menggunakan
- Menambahkan Barang ke Keranjang:
- Loop
for
digunakan untuk mencari barang dengan nomor yang sesuai dari arrayitems
. - Jika barang ditemukan (
if (strcmp(items[i].no, noBarang) == 0)
), maka program:- Membuat struktur
Pembelian
baru. - Menyalin nomor barang ke dalam struktur tersebut.
- Menetapkan jumlah yang dimasukkan pengguna.
- Menambahkan struktur
Pembelian
ke arraykeranjang
. - Mengatur variabel
found
menjadi 1 (true) untuk menandakan bahwa barang ditemukan.
- Membuat struktur
- Jika barang tidak ditemukan, program mencetak pesan yang mengatakan bahwa nomor barang tidak ditemukan.
- Loop
- Pilihan untuk Menambah Barang Lagi:
- Setelah menambahkan barang, pengguna ditanya apakah ingin menambah barang lain ke keranjang.
- Input (
Y
atauN
) dibaca menggunakangetchar
. fflush(stdin)
digunakan setelahgetchar
untuk membersihkan buffer.
- Pengulangan:
- Semua proses ini diulang selama pengguna memilih untuk terus menambah barang (
tambahLagi == 'Y' || tambahLagi == 'y'
).
- Semua proses ini diulang selama pengguna memilih untuk terus menambah barang (
- Keluar dari Case:
- Setelah pengguna selesai menambah barang, program keluar dari case 11 dan kembali ke menu utama.
Poin Penting untuk siswa:
- Penggunaan
fgets
danscanf
: Cara untuk membaca input string dan numerik di C. - Buffer Flushing: Mengapa penting untuk membersihkan buffer input setelah membaca input.
- Penggunaan Loop
for
danif
: Untuk mencari data dalam array dan kondisi pengambilan keputusan. - Struktur Data: Cara menggunakan struktur (
struct
) untuk menyimpan dan mengelola data yang terkait. - Pengulangan dengan
do-while
: Memungkinkan pengguna untuk terus melakukan tindakan sampai kondisi tertentu tidak terpenuhi lagi.
7.B Case ’99’
case 99:
clearScreen();
totalHarga = 0; // Mengatur ulang nilai
totalDiskon = 0; // Mengatur ulang nilai
totalBayar = 0; // Mengatur ulang nilai
bubbleSort(keranjang, jumlahItemDiKeranjang);
printf("Toko SENS\n");
...
for (i = 0; i < jumlahItemDiKeranjang; i++) {
...
// Logika untuk menghitung harga, total, dan diskon
...
}
totalBayar = totalHarga - totalDiskon;
printf("==============================================================================\n");
...
printf("Masukkan uang bayar: ");
scanf("%d", &uangBayar);
kembalian = uangBayar - totalBayar;
...
getchar(); // Menangkap Enter
getchar(); // Untuk menangkap Enter kedua kali
break;
Detail Langkah-langkah:
- Pembersihan Layar dan Reset Nilai:
- Layar dibersihkan dan variabel
totalHarga
,totalDiskon
, dantotalBayar
diatur ulang ke nol.
- Layar dibersihkan dan variabel
- Pengurutan Keranjang (Bubble Sort):
bubbleSort
dipanggil untuk mengurutkan isi keranjang berdasarkan jumlah pembelian dari yang terbesar ke terkecil.
- Mencetak Header Struk:
- Menampilkan informasi toko dan header struk.
- Iterasi dan Perhitungan Item di Keranjang:
- Loop
for
digunakan untuk melewati setiap item di keranjang. - Untuk setiap item:
- Harga item dihitung berdasarkan harga satuan dan jumlah pembelian.
- Diskon dihitung jika jumlah pembelian memenuhi syarat diskon (diskon 15% untuk lebih dari 5 item, 10% untuk lebih dari 3 item).
- Harga item dan diskon ditambahkan ke total harga dan diskon.
- Loop
- Perhitungan Total Bayar:
- Total bayar dihitung dengan mengurangkan diskon dari total harga.
- Input Uang Bayar dan Kalkulasi Kembalian:
- Meminta pengguna untuk memasukkan jumlah uang yang dibayarkan.
- Menghitung kembalian dengan mengurangkan total bayar dari uang yang dibayarkan.
- Menampilkan Detail Struk:
- Menampilkan total harga, diskon, total bayar, uang yang dibayarkan, dan kembalian.
- Menunggu Respon Pengguna:
- Menggunakan
getchar()
dua kali untuk menangkap karakter Enter dan memberi waktu kepada pengguna untuk melihat struk sebelum kembali ke menu utama.
- Menggunakan
Poin Penting untuk siswa:
- Penggunaan Fungsi dan Loop: Demonstrasi bagaimana loop dan fungsi digunakan untuk menghitung dan menampilkan informasi.
- Pengelolaan Data dan Kalkulasi: Cara mengelola dan melakukan perhitungan pada data dalam struktur.
- Penggunaan
printf
untuk Output yang Terformat: Cara mencetak data ke layar dengan format yang rapi dan jelas. - Pengendalian Alur Program: Bagaimana
case
dalamswitch
digunakan untuk mengendalikan alur program berdasarkan pilihan pengguna. - Interaksi Pengguna: Mengambil input dari pengguna dan menggunakan input tersebut dalam perhitungan (uang bayar dan kembalian).
7.C Case ’55’
case 55:
// Mengosongkan keranjang
jumlahItemDiKeranjang = 0;
totalHarga = 0;
totalDiskon = 0;
totalBayar = 0;
printf("Keranjang pembelian telah direset.\n");
getchar(); // Menangkap Enter
break;
Detail Langkah-langkah:
- Mereset Keranjang Pembelian:
jumlahItemDiKeranjang
diatur ulang menjadi 0. Ini efektif menghapus semua item dari keranjang karena loop dan operasi lain yang berkaitan dengan isi keranjang akan menggunakan nilai variabel ini untuk menentukan jumlah item di keranjang.totalHarga
,totalDiskon
, dantotalBayar
juga diatur ulang menjadi 0. Ini penting untuk memastikan bahwa perhitungan yang dilakukan di sesi pembelian berikutnya tidak terpengaruh oleh nilai-nilai dari sesi sebelumnya.
- Menampilkan Konfirmasi Reset:
- Program mencetak pesan ke layar untuk memberitahu pengguna bahwa keranjang pembelian telah direset.
- Menunggu Respon Pengguna:
getchar()
digunakan untuk menangkap karakter Enter dari pengguna. Ini memberi waktu kepada pengguna untuk membaca pesan konfirmasi sebelum program kembali ke menu utama.
- Keluar dari Case:
break
digunakan untuk keluar daricase 55
dan kembali ke loop utama dariswitch
.
Poin Penting untuk siswa:
- Pengaturan Ulang Variabel: Demonstrasi bagaimana mengatur ulang variabel menjadi keadaan awal mereka, yang berguna dalam konteks seperti reset atau inisialisasi ulang.
- Interaksi Pengguna: Cara sederhana untuk memberikan umpan balik kepada pengguna dan menunggu respon sebelum melanjutkan.
- Pengelolaan Data: Pentingnya mengelola data secara efisien dalam sebuah aplikasi, terutama dalam konteks seperti keranjang pembelian di mana isi data dapat berubah-ubah.
- Penggunaan
getchar()
: Contoh penggunaan fungsi sederhana untuk menghentikan alur program sementara dan menunggu input pengguna. - Pentingnya
break
dalamswitch
: Memahami bagaimanabreak
digunakan untuk mencegah eksekusi kode melompat kecase
berikutnya dalam sebuah
7.D Case ’00’
case 00:
printf("Keluar dari program.\n");
return 0;
Detail Langkah-langkah:
- Menampilkan Pesan Keluar:
- Ketika
case 00
dieksekusi, program pertama-tama mencetak pesan"Keluar dari program."
. Ini memberikan umpan balik kepada pengguna bahwa pilihan mereka untuk keluar telah diterima dan program sedang dalam proses untuk dihentikan.
- Ketika
- Mengakhiri Program:
return 0;
adalah pernyataan yang mengakhiri fungsimain
, dan karenanya, mengakhiri eksekusi program. Dalam konteks bahasa C,return 0
biasanya menandakan bahwa program telah berakhir dengan sukses tanpa error. Nilai yang dikembalikan (dalam hal ini 0) biasanya dikembalikan ke sistem operasi.
Poin Penting untuk siswa:
- Mengakhiri Program: Cara mengakhiri eksekusi program dengan cara yang terkontrol. Ini penting karena memberikan kesempatan kepada program untuk menyelesaikan atau melepaskan sumber daya sebelum berhenti sepenuhnya.
- Pesan Feedback: Pentingnya memberikan umpan balik kepada pengguna. Dalam kasus ini, program memberi tahu pengguna bahwa aksi keluar telah dipilih dan sedang dijalankan.
return
dalammain
: Dalam bahasa C,main
adalah fungsi khusus dari mana eksekusi program dimulai. Menggunakanreturn
dalammain
mengakhiri program dan memberi tahu sistem operasi tentang status keluar program.- Nilai Kembalian
main
: Nilai yang dikembalikan olehmain
(dalam hal ini 0) sering digunakan untuk menandakan status keluar program. Kode keluar 0 umumnya menunjukkan bahwa program berakhir tanpa masalah. Kode keluar lainnya bisa digunakan untuk menandakan berbagai jenis kesalahan atau status keluar yang berbeda. - Pengendalian Alur Program: Demonstrasi penggunaan
switch
case sebagai cara untuk mengendalikan alur program berdasarkan input pengguna.return 0;
dalamcase 00
adalah contoh bagaimana menghentikan alur program sepenuhnya dari dalam blokswitch
.
Program ini memberikan contoh nyata dari aplikasi berbasis teks untuk sistem pembelian sederhana, memperkenalkan konsep-konsep dasar pemrograman dalam C.