---
# System prepended metadata

title: CS CRASHOUT JIR
tags: [Archived]

---

# Pembahasan CS4 Selasa

> Author: Misc/Andrew

## 1. Pendahuluan
Program ini merupakan simulasi sederhana dari sistem pinjaman online (pinjol) yang mencatat data peminjam, menghitung tagihan berdasarkan bunga, dan menentukan status peminjam setiap bulan. Program ini juga memungkinkan pengguna untuk melewatkan waktu satu bulan, sehingga bunga bertambah dan status peminjam berubah.

![image](https://hackmd.io/_uploads/SyysDnUskl.png)


Program ini mengharuskan:
- **Struct (`struct`)** untuk menyimpan data peminjam.
- **Pointer (`Peminjam *p`)** untuk memodifikasi nilai secara langsung dalam fungsi.
- **Loop (`for`, `while`)** untuk iterasi input dan pembaruan data.
- **Input/Output (`scanf`, `printf`, `fgets`)** untuk interaksi pengguna.
- **`#define`** untuk mendefinisikan konstanta.

Mari kita bahas setiap bagian program secara detail.

---

## 2. Struktur Data
```c
#define MAX_PEMINJAM 100

typedef struct
{
    char nama[50];
    char alamat[100];
    char telp[20];
    float pinjaman;
    float rate_bunga;
    float tagihan;
    char status[10];
} Peminjam;
```
**Penjelasan:**
- `#define MAX_PEMINJAM 100` → Konstanta untuk membatasi jumlah peminjam maksimal 100.
- `typedef struct { ... } Peminjam;` → Mendefinisikan tipe data `Peminjam` yang berisi informasi:
  - `nama`, `alamat`, `telp` → Data string (array karakter) untuk menyimpan informasi peminjam.
  - `pinjaman`, `rate_bunga`, `tagihan` → Data numerik float untuk jumlah pinjaman, suku bunga, dan total tagihan.
  - `status` → String untuk menyimpan status pembayaran.

Struct ini mempermudah pengelolaan data peminjam sebagai satu kesatuan informasi.

---

## 3. Fungsi `hitungTagihan`
```c
void hitungTagihan(Peminjam *p)
{
    p->tagihan = p->tagihan * (1 + p->rate_bunga);

    if (p->tagihan < 2000000)
        sprintf(p->status, "Tunggu");
    else if (p->tagihan < 4000000)
        sprintf(p->status, "Telpon");
    else if (p->tagihan < 6000000)
        sprintf(p->status, "Buru");
    else
        sprintf(p->status, "Eksekusi");
}
```
**Penjelasan:**
- `p->tagihan = p->tagihan * (1 + p->rate_bunga);`
  - Mengupdate tagihan dengan menambahkan bunga


- **Logika `if-else`** menentukan status berdasarkan jumlah tagihan:
  - `< 2.000.000` → **"Tunggu"** (belum mendesak)
  - `< 4.000.000` → **"Telpon"** (pengingat lewat telepon)
  - `< 6.000.000` → **"Buru"** (penagihan lebih agresif)
  - `>= 6.000.000` → **"Eksekusi"** (tindakan hukum atau kunjungan langsung)
- `sprintf(p->status, "...")` → Memformat string status ke dalam struct.

Fungsi ini dipanggil setiap bulan untuk memperbarui tagihan dan status.

**Beda -> dan . dalam mengakses variabel menggunakan struct;**
**p->tagihan** digunakan untuk mengakses anggota struct "tagihan" menggunakan pointer, 
**p.tagihan** hanya mengakses anggota struct "tagihan" seperti biasa.
https://www.geeksforgeeks.org/arrow-operator-in-c-c-with-examples/

---

## 4. Fungsi `tampilkanDatabase`
```c
void tampilkanDatabase(Peminjam peminjam[], int jumlah)
{
    printf("\nDatabase Pinjol\n\n");
    for (int i = 0; i < jumlah; i++)
    {
        printf("Peminjam %d\n", i + 1);
        printf("Nama - Alamat : %s - %s\n", peminjam[i].nama, peminjam[i].alamat);
        printf("Telp: %s\n", peminjam[i].telp);
        printf("Pinjaman - Rate Bunga : Rp%.0f - %.0f%%\n", peminjam[i].pinjaman, peminjam[i].rate_bunga * 100);
        printf("Tagihan Bulan Ini : Rp%.0f\n", peminjam[i].tagihan);
        printf("Status : %s\n\n", peminjam[i].status);
    }
}
```
**Penjelasan:**
- Loop `for` mencetak data setiap peminjam.
- `printf` menampilkan informasi termasuk nama, alamat, telepon, jumlah pinjaman, bunga, tagihan, dan status.

Fungsi ini memastikan pengguna dapat melihat perkembangan tagihan setiap bulan.

---

## 5. Fungsi `main`
### 5.1. Input Data Peminjam
```c
int main()
{
    int n;
    char pilihan;

    printf("Jumlah Peminjam : ");
    scanf("%d", &n);
    getchar();

    Peminjam peminjam[MAX_PEMINJAM];
```
**Penjelasan:**
- `scanf("%d", &n);` → Meminta jumlah peminjam dari pengguna.
- `getchar();` → Menghapus newline setelah `scanf` agar `fgets` bekerja dengan benar.

### 5.2. Mengisi Data Peminjam
```c
    for (int i = 0; i < n; i++)
    {
        printf("\nNama Peminjam %d : ", i + 1);
        fgets(peminjam[i].nama, 50, stdin);
        peminjam[i].nama[strcspn(peminjam[i].nama, "\n")] = 0;
```
**Penjelasan:**
- `fgets` digunakan untuk membaca input string (lebih aman daripada `scanf`).
- `strcspn(..., "\n")] = 0;` → Menghapus newline dari `fgets`.

### 5.3. Menghitung Tagihan Awal
```c
        peminjam[i].tagihan = peminjam[i].pinjaman;
        hitungTagihan(&peminjam[i]);
    }
```
**Penjelasan:**
- Awalnya, `tagihan = pinjaman`.
- `hitungTagihan(&peminjam[i]);` → Menghitung tagihan awal.

### 5.4. Loop Perjalanan Waktu
```c
    while (1)
    {
        tampilkanDatabase(peminjam, n);
        printf("a. Skip 1 Bulan\nb. Exit Program\n\n");
        scanf(" %c", &pilihan);
        getchar();

        if (pilihan == 'b')
        {
            printf("\nProgram Selesai!\n");
            break;
        }

        for (int i = 0; i < n; i++)
        {
            hitungTagihan(&peminjam[i]);
        }
    }
```
**Penjelasan:**
- **Loop `while (1)`** menjalankan program tanpa henti sampai pengguna memilih keluar.
- **Menu pilihan:**
  - `'a'` → Melewati satu bulan, menghitung ulang tagihan.
  - `'b'` → Keluar dari program.

---
## Full code
```c
#include <stdio.h>

#define MAX_PEMINJAM 100

typedef struct
{
    char nama[50];
    char alamat[100];
    char telp[20];
    float pinjaman;
    float rate_bunga;
    float tagihan;
    char status[10];
} Peminjam;

void hitungTagihan(Peminjam *p)
{
    p->tagihan = p->tagihan * (1 + p->rate_bunga);

    if (p->tagihan < 2000000)
        sprintf(p->status, "Tunggu");
    else if (p->tagihan < 4000000)
        sprintf(p->status, "Telpon");
    else if (p->tagihan < 6000000)
        sprintf(p->status, "Buru");
    else
        sprintf(p->status, "Eksekusi");
}

void tampilkanDatabase(Peminjam peminjam[], int jumlah)
{
    printf("\nDatabase Pinjol\n\n");
    for (int i = 0; i < jumlah; i++)
    {
        printf("Peminjam %d\n", i + 1);
        printf("Nama - Alamat : %s - %s\n", peminjam[i].nama, peminjam[i].alamat);
        printf("Telp: %s\n", peminjam[i].telp);
        printf("Pinjaman - Rate Bunga : Rp%.0f - %.0f%%\n", peminjam[i].pinjaman, peminjam[i].rate_bunga * 100);
        printf("Tagihan Bulan Ini : Rp%.0f\n", peminjam[i].tagihan);
        printf("Status : %s\n\n", peminjam[i].status);
    }
}

int main()
{
    int n;
    char pilihan;

    printf("Jumlah Peminjam : ");
    scanf("%d", &n);
    getchar();

    Peminjam peminjam[MAX_PEMINJAM];

    for (int i = 0; i < n; i++)
    {
        printf("\nNama Peminjam %d : ", i + 1);
        fgets(peminjam[i].nama, 50, stdin);
        peminjam[i].nama[strcspn(peminjam[i].nama, "\n")] = 0;

        printf("Alamat Peminjam %d : ", i + 1);
        fgets(peminjam[i].alamat, 100, stdin);
        peminjam[i].alamat[strcspn(peminjam[i].alamat, "\n")] = 0;

        printf("No Telp Peminjam %d : ", i + 1);
        fgets(peminjam[i].telp, 20, stdin);
        peminjam[i].telp[strcspn(peminjam[i].telp, "\n")] = 0;

        printf("Pinjaman Peminjam %d : ", i + 1);
        scanf("%f", &peminjam[i].pinjaman);

        printf("Rate Bunga Peminjam %d : ", i + 1);
        scanf("%f", &peminjam[i].rate_bunga);
        getchar();

        peminjam[i].tagihan = peminjam[i].pinjaman;
        hitungTagihan(&peminjam[i]);
    }

    printf("\n---\n");

    while (1)
    {
        tampilkanDatabase(peminjam, n);
        printf("a. Skip 1 Bulan\nb. Exit Program\n\n");
        scanf(" %c", &pilihan);
        getchar();

        if (pilihan == 'b')
        {
            printf("\nProgram Selesai!\n");
            break;
        }

        for (int i = 0; i < n; i++)
        {
            hitungTagihan(&peminjam[i]);
        }
    }

    return 0;
}
```

## Terimakasih