
Pengenalan Program Kasir dalam Bahasa C
Program kasir adalah salah satu project praktis yang sangat baik untuk mempelajari tutorial bahasa c untuk pemula. Dalam tutorial ini, kita akan membuat aplikasi kasir sederhana yang mencakup fitur-fitur dasar seperti input barang, perhitungan total, dan cetak struk.
Project ini akan mengajarkan konsep-konsep penting seperti array, struct, fungsi, dan file handling dalam bahasa C. Mari kita mulai dengan membangun program kasir step by step.
Fitur Program Kasir
Fitur Utama
- Input Barang: Nama, harga, quantity
- Perhitungan: Subtotal, pajak, diskon
- Struk: Cetak receipt transaksi
- Validasi: Input validation
Fitur Tambahan
- Menu interaktif
- Laporan penjualan harian
- Manajemen inventory sederhana
- Save/load data ke file
šÆ Tujuan Pembelajaran
Setelah menyelesaikan tutorial ini, Anda akan memahami cara menggunakan struct, array, fungsi, dan file I/O dalam bahasa C untuk membuat aplikasi yang praktis dan fungsional.
Alur Program Kasir
Flow Chart Program
Struktur Dasar Program
Pertama, kita akan mendefinisikan struktur data yang diperlukan. Pemahaman tentang struktur data array dalam c sangat penting untuk project ini.
Header dan Struktur Data:
#include
#include
#include
#include
#define MAX_ITEMS 100
#define MAX_NAME 50
// Struktur untuk item barang
typedef struct {
char nama[MAX_NAME];
float harga;
int quantity;
float subtotal;
} Item;
// Struktur untuk transaksi
typedef struct {
Item items[MAX_ITEMS];
int jumlah_item;
float total_belanja;
float pajak;
float diskon;
float total_bayar;
char tanggal[20];
int nomor_transaksi;
} Transaksi;
// Global variables
Transaksi transaksi_saat_ini;
int nomor_transaksi_terakhir = 1000;
Fungsi-Fungsi Utama
Berikut adalah implementasi fungsi-fungsi utama program kasir. Konsep fungsi input output bahasa c akan banyak digunakan di sini.
Fungsi Menu Utama:
void tampilkan_menu() {
printf("\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā SISTEM KASIR SEDERHANA ā\n");
printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n");
printf("ā 1. Transaksi Baru ā\n");
printf("ā 2. Tampilkan Struk Terakhir ā\n");
printf("ā 3. Laporan Penjualan ā\n");
printf("ā 4. Keluar ā\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("Pilih menu (1-4): ");
}
void clear_screen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
void pause_screen() {
printf("\nTekan Enter untuk melanjutkan...");
getchar();
getchar();
}
Fungsi Input Barang:
void input_barang() {
char lanjut;
int index = 0;
printf("\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā INPUT BARANG ā\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
do {
printf("\n--- Barang ke-%d ---\n", index + 1);
// Input nama barang
printf("Nama Barang: ");
fflush(stdin);
fgets(transaksi_saat_ini.items[index].nama, MAX_NAME, stdin);
// Hapus newline dari fgets
transaksi_saat_ini.items[index].nama[strcspn(transaksi_saat_ini.items[index].nama, "\n")] = 0;
// Input harga
do {
printf("Harga Satuan: Rp ");
scanf("%f", &transaksi_saat_ini.items[index].harga);
if (transaksi_saat_ini.items[index].harga <= 0) {
printf("Harga harus lebih dari 0!\n");
}
} while (transaksi_saat_ini.items[index].harga <= 0);
// Input quantity
do {
printf("Jumlah: ");
scanf("%d", &transaksi_saat_ini.items[index].quantity);
if (transaksi_saat_ini.items[index].quantity <= 0) {
printf("Jumlah harus lebih dari 0!\n");
}
} while (transaksi_saat_ini.items[index].quantity <= 0);
// Hitung subtotal
transaksi_saat_ini.items[index].subtotal =
transaksi_saat_ini.items[index].harga * transaksi_saat_ini.items[index].quantity;
printf("Subtotal: Rp %.2f\n", transaksi_saat_ini.items[index].subtotal);
index++;
// Tanya apakah ingin menambah barang lagi
if (index < MAX_ITEMS) {
printf("\nTambah barang lagi? (y/n): ");
scanf(" %c", &lanjut);
} else {
printf("\nMaksimal %d barang tercapai!\n", MAX_ITEMS);
lanjut = 'n';
}
} while ((lanjut == 'y' || lanjut == 'Y') && index < MAX_ITEMS);
transaksi_saat_ini.jumlah_item = index;
}
Fungsi Perhitungan Total:
void hitung_total() {
float subtotal_keseluruhan = 0;
// Hitung total belanja
for (int i = 0; i < transaksi_saat_ini.jumlah_item; i++) { subtotal_keseluruhan += transaksi_saat_ini.items[i].subtotal; } transaksi_saat_ini.total_belanja = subtotal_keseluruhan; // Tanya diskon float persen_diskon = 0; printf("\nApakah ada diskon? (masukkan persentase, 0 jika tidak ada): "); scanf("%f", &persen_diskon); if (persen_diskon > 0 && persen_diskon <= 100) {
transaksi_saat_ini.diskon = (persen_diskon / 100) * subtotal_keseluruhan;
} else {
transaksi_saat_ini.diskon = 0;
}
// Hitung pajak (PPN 11%)
float subtotal_setelah_diskon = subtotal_keseluruhan - transaksi_saat_ini.diskon;
transaksi_saat_ini.pajak = 0.11 * subtotal_setelah_diskon;
// Total bayar
transaksi_saat_ini.total_bayar = subtotal_setelah_diskon + transaksi_saat_ini.pajak;
// Set nomor transaksi dan tanggal
transaksi_saat_ini.nomor_transaksi = ++nomor_transaksi_terakhir;
time_t t = time(NULL);
struct tm tm = *localtime(&t);
sprintf(transaksi_saat_ini.tanggal, "%02d/%02d/%d %02d:%02d",
tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900,
tm.tm_hour, tm.tm_min);
}
Fungsi Cetak Struk
Fungsi ini akan mencetak struk transaksi dengan format yang rapi dan profesional.
Fungsi Cetak Struk:
void cetak_struk() {
printf("\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā STRUK BELANJA ā\n");
printf("ā TOKO KELASPROGRAMMER ā\n");
printf("ā Jl. Programming No. 123 ā\n");
printf("ā Telp: 021-1234567 ā\n");
printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n");
printf("ā No. Transaksi: %-15d ā\n", transaksi_saat_ini.nomor_transaksi);
printf("ā Tanggal : %-15s ā\n", transaksi_saat_ini.tanggal);
printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n");
printf("ā No ā Nama Barang ā Qty ā Harga ā Total ā\n");
printf("ā āāāāāŖāāāāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāāŖāāāāāāāā£\n");
for (int i = 0; i < transaksi_saat_ini.jumlah_item; i++) { printf("ā %2d ā %-18s ā %3d ā %7.0f ā %5.0f ā\n", i + 1, transaksi_saat_ini.items[i].nama, transaksi_saat_ini.items[i].quantity, transaksi_saat_ini.items[i].harga, transaksi_saat_ini.items[i].subtotal); } printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n"); printf("ā Subtotal : Rp %8.2f ā\n", transaksi_saat_ini.total_belanja); if (transaksi_saat_ini.diskon > 0) {
printf("ā Diskon : Rp %8.2f ā\n", transaksi_saat_ini.diskon);
}
printf("ā Pajak (PPN 11%%) : Rp %8.2f ā\n", transaksi_saat_ini.pajak);
printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n");
printf("ā TOTAL BAYAR : Rp %8.2f ā\n", transaksi_saat_ini.total_bayar);
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
// Proses pembayaran
float uang_bayar;
do {
printf("\nUang yang dibayarkan: Rp ");
scanf("%f", &uang_bayar);
if (uang_bayar < transaksi_saat_ini.total_bayar) {
printf("Uang tidak cukup! Kurang Rp %.2f\n",
transaksi_saat_ini.total_bayar - uang_bayar);
}
} while (uang_bayar < transaksi_saat_ini.total_bayar);
float kembalian = uang_bayar - transaksi_saat_ini.total_bayar;
printf("\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā Uang Bayar : Rp %8.2f ā\n", uang_bayar);
printf("ā Kembalian : Rp %8.2f ā\n", kembalian);
printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n");
printf("ā TERIMA KASIH ATAS ā\n");
printf("ā KUNJUNGAN ANDA ā\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
}
Fungsi Penyimpanan Data
Untuk menyimpan data transaksi, kita akan menggunakan file operations dalam bahasa C.
Fungsi Save dan Load Data:
void simpan_transaksi() {
FILE *file = fopen("transaksi.dat", "ab");
if (file == NULL) {
printf("Error: Tidak dapat membuka file untuk menyimpan!\n");
return;
}
fwrite(&transaksi_saat_ini, sizeof(Transaksi), 1, file);
fclose(file);
printf("Transaksi berhasil disimpan!\n");
}
void load_nomor_transaksi() {
FILE *file = fopen("transaksi.dat", "rb");
if (file == NULL) {
nomor_transaksi_terakhir = 1000;
return;
}
Transaksi temp;
while (fread(&temp, sizeof(Transaksi), 1, file)) {
if (temp.nomor_transaksi > nomor_transaksi_terakhir) {
nomor_transaksi_terakhir = temp.nomor_transaksi;
}
}
fclose(file);
}
void tampilkan_laporan() {
FILE *file = fopen("transaksi.dat", "rb");
if (file == NULL) {
printf("Belum ada data transaksi!\n");
return;
}
printf("\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā LAPORAN PENJUALAN ā\n");
printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n");
printf("ā No.Trans ā Tanggal ā Items ā Total ā\n");
printf("ā āāāāāāāāāāāŖāāāāāāāāāāāāāāāāŖāāāāāāāāŖāāāāāāāāāāāāāāāāāāā£\n");
Transaksi temp;
float total_penjualan = 0;
int jumlah_transaksi = 0;
while (fread(&temp, sizeof(Transaksi), 1, file)) {
printf("ā %8d ā %-13s ā %5d ā Rp %12.2f ā\n",
temp.nomor_transaksi,
temp.tanggal,
temp.jumlah_item,
temp.total_bayar);
total_penjualan += temp.total_bayar;
jumlah_transaksi++;
}
printf("ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£\n");
printf("ā Total Transaksi: %3d ā\n", jumlah_transaksi);
printf("ā Total Penjualan: Rp %15.2f ā\n", total_penjualan);
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
fclose(file);
}
Fungsi Main dan Program Utama
Berikut adalah fungsi main yang menggabungkan semua fungsi menjadi program yang lengkap.
Fungsi Main:
void init_transaksi() {
transaksi_saat_ini.jumlah_item = 0;
transaksi_saat_ini.total_belanja = 0;
transaksi_saat_ini.pajak = 0;
transaksi_saat_ini.diskon = 0;
transaksi_saat_ini.total_bayar = 0;
strcpy(transaksi_saat_ini.tanggal, "");
transaksi_saat_ini.nomor_transaksi = 0;
}
int main() {
int pilihan;
// Load nomor transaksi terakhir dari file
load_nomor_transaksi();
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā SELAMAT DATANG DI SISTEM ā\n");
printf("ā KASIR KELASPROGRAMMER ā\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
do {
tampilkan_menu();
scanf("%d", &pilihan);
switch (pilihan) {
case 1:
clear_screen();
init_transaksi();
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā TRANSAKSI BARU ā\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
input_barang();
if (transaksi_saat_ini.jumlah_item > 0) {
hitung_total();
cetak_struk();
simpan_transaksi();
} else {
printf("Tidak ada barang yang diinput!\n");
}
pause_screen();
clear_screen();
break;
case 2:
clear_screen();
if (transaksi_saat_ini.jumlah_item > 0) {
cetak_struk();
} else {
printf("Belum ada transaksi yang dilakukan!\n");
}
pause_screen();
clear_screen();
break;
case 3:
clear_screen();
tampilkan_laporan();
pause_screen();
clear_screen();
break;
case 4:
printf("\nTerima kasih telah menggunakan sistem kasir!\n");
printf("Program dibuat oleh KelasProgranner.com\n");
break;
default:
printf("Pilihan tidak valid! Silakan pilih 1-4.\n");
pause_screen();
clear_screen();
break;
}
} while (pilihan != 4);
return 0;
}
Source Code Lengkap
Berikut adalah source code lengkap program kasir yang dapat langsung dikompilasi dan dijalankan.
kasir.c – Program Lengkap:
/*
* Program Kasir Sederhana dalam Bahasa C
* Dibuat untuk tutorial KelasProgranner.com
*
* Fitur:
* - Input multiple items
* - Perhitungan pajak dan diskon
* - Cetak struk
* - Simpan ke file
* - Laporan penjualan
*/
#include
#include
#include
#include
#define MAX_ITEMS 100
#define MAX_NAME 50
// [Semua struct dan fungsi yang sudah didefinisikan di atas]
// Gabungkan semua kode di atas menjadi satu file kasir.c
/*
* Cara kompilasi dan menjalankan:
*
* Windows (MinGW/Dev-C++):
* gcc kasir.c -o kasir.exe
* kasir.exe
*
* Linux/Mac:
* gcc kasir.c -o kasir
* ./kasir
*
* Code::Blocks:
* Buat project baru, copy paste kode, build & run
*/
š File yang Dihasilkan
- kasir.c: Source code utama
- kasir.exe: File executable (Windows)
- transaksi.dat: File data transaksi (binary)
Pengembangan Lebih Lanjut
š Fitur Tambahan
- Database inventory barang
- Multiple payment methods
- Barcode scanner simulation
- User authentication
- Export laporan ke CSV
š§ Optimasi
- Linked list untuk dynamic memory
- Hash table untuk pencarian cepat
- Error handling yang lebih robust
- GUI dengan library seperti GTK
- Network support untuk multi-terminal
Panduan Kompilasi dan Menjalankan
š» Windows (Command Prompt)
gcc kasir.c -o kasir.exe
kasir.exe
š§ Linux/Mac (Terminal)
gcc kasir.c -o kasir
./kasir
š§ Code::Blocks / Dev-C++
- Buat project baru (Console Application)
- Copy paste source code ke main.c
- Build & Run (F9)
Frequently Asked Questions (FAQ)
Bagaimana cara menambahkan fitur database inventory?
Anda bisa menambahkan struct untuk inventory dengan array barang yang tersedia, kemudian implementasikan fungsi untuk add/update/delete barang. Gunakan file terpisah untuk menyimpan data inventory dan load saat program dimulai.
Mengapa menggunakan file binary (.dat) instead of text file?
File binary lebih efisien dalam hal ukuran dan kecepatan akses. Struct dapat langsung ditulis/dibaca tanpa parsing. Namun, jika ingin human-readable, bisa gunakan CSV atau JSON format dengan parsing manual.
Bagaimana cara menangani input yang salah dari user?
Implementasikan input validation dengan loop do-while, cek range nilai (harga > 0, quantity > 0), gunakan fflush(stdin) untuk clear buffer, dan berikan pesan error yang jelas kepada user.
Apakah program ini bisa dijalankan di smartphone?
Program C console tidak bisa langsung dijalankan di smartphone. Namun bisa menggunakan compiler C di Android seperti C4droid, atau port ke web menggunakan Emscripten, atau buat ulang dalam Java/Kotlin untuk Android.
Bagaimana cara menambahkan fitur backup dan restore data?
Implementasikan fungsi export data ke format CSV/JSON yang human-readable, dan fungsi import untuk restore. Bisa juga buat sistem backup otomatis yang copy file transaksi.dat ke folder backup dengan timestamp.
Kesimpulan
Program kasir sederhana ini mendemonstrasikan penggunaan berbagai konsep penting dalam bahasa C seperti struct, array, fungsi, file I/O, dan input validation. Project ini sangat cocok untuk pemula yang ingin belajar membuat aplikasi praktis.
Dengan memahami dan mengembangkan program ini, Anda akan mendapatkan pengalaman berharga dalam software development dan siap untuk membuat aplikasi yang lebih kompleks. Jangan lupa untuk terus berlatih dan mengeksplorasi fitur-fitur baru!