Contoh Program C Kasir Sederhana

By | August 16, 2025
Contoh Program C Kasir Sederhana

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

1. Tampilkan Menu Utama
↓
2. Input Data Barang
↓
3. Hitung Total & Pajak
↓
4. Cetak Struk
↓
5. Simpan Transaksi

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++

  1. Buat project baru (Console Application)
  2. Copy paste source code ke main.c
  3. 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!

 

Leave a Reply

Your email address will not be published. Required fields are marked *