Skip to content

Instantly share code, notes, and snippets.

@kresnasatya
Last active October 31, 2021 13:11
Show Gist options
  • Save kresnasatya/7660cd7d8872ec101d2863f9cdf18867 to your computer and use it in GitHub Desktop.
Save kresnasatya/7660cd7d8872ec101d2863f9cdf18867 to your computer and use it in GitHub Desktop.
TK4_W9_S14_R1

Jawaban Nomor 1

File adalah bentuk penyimpanan data yang sifatnya permanen. Stream adalah kumpulan karakter yang disusun baris per baris yang berpindah dari satu media ke media lain dalam suatu sistem komputer.

Jawaban Nomor 2

Jika file dibuka dengan mode "w+" dan sudah ada datanya maka ada dua kemungkinan:

  • Pertama, file tersebut bisa dibaca isi datanya karena mode file adalah "w+"
  • Kedua, jika ada data baru diinput ke dalam file tersebut maka data yang sebelumnya ada di file tersebut akan dihapus dan digantikan oleh data yang baru.

Jawaban Nomor 3

a. Dynamic memory merupakan sebuah istilah yang memberikan suatu program untuk mendapatkan ruang memory (RAM) yang lebih fleksibel. Misalnya, suatu program menghitung suatu nilai rata-rata suatu kelas yang jumlah siswa nya 10, kemudian suatu ketika jumlah siswa tersebut berubah-ubah sebesar "n", sehingga program harus memiliki kemampuan untuk menghitung nilai rata-rata kelas dengan jumlah siswa yang fleksibel.

Contoh menggunakan malloc():

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float *marks, sum = 0;
    int i, n;

    printf("Masukkan jumlah siswa: ");
    scanf("%d", &n);

    // alokasi memori untuk menyimpan n variable bertipe float.
    marks = (float*)malloc(n * sizeof(float));

    // Jika alokasi memori gagal maka keluar dari program.
    if (marks == NULL) {
        printf("Gagal alokasi memori \n");
        exit(1);
    }

    for (i = 0; i < n; i++) {
        printf("Masukkan nilai rata-rata siswa ke -%d: ", i+1);
        scanf("%f", marks+i);
    }

    for (i = 0; i < n; i++)
    {
        sum += *(marks+i);
    }
    
    printf("Nilai rata-rata kelas adalah %.2f \n", sum / n);

    // free memory
    free(marks);
}

b. Macro merupakan sebuah perintah yang mana dieksekusi pertama kali oleh compiler C. Umumnya Macro ini diletakkan di awal program dan sintaks deklarasi Macro adalah #define. Umumnya Macro dipakai untuk mendefinisikan sebuah konstanta. Konstanta ini bertujuan sebagai ketetapan bahwa nilainya adalah "X" atau semacamnya.

Contoh program:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Maksimal 5 mahasiswa
#define MAX_STUDENT_SIZE 5

struct Mahasiswa {
char NIM[255], Nama[255], MataKuliah[255];
};

struct Mahasiswa mahasiswaBINUS[MAX_SIZE];

Jawaban Nomor 4

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Drink {
    char name[256], size[256], presentation[256];
    int price;
} classicDrink;

FILE *fptr;

int check_drink(char drink[256]) {
    char drinks_code[4][256] = {"K", "T", "C", "S"};
    int length_arr = sizeof(drinks_code) / sizeof(*drinks_code);
    int result = 0;
    for (int i = 0; i < length_arr; i++) {
        if (strcmp(drink, drinks_code[i]) == 0) {
            result = 1;
            break;
        }
    }

    return result;
}

int check_size(char size[256]) {
    char size_codes[3][256] = {"S", "M", "L"};
    int length_arr = sizeof(size_codes) / sizeof(*size_codes);
    int result = 0;
    for (int i = 0; i < length_arr; i++) {
        if (strcmp(size, size_codes[i]) == 0) {
            result = 1;
            break;
        }
    }

    return result;
}

int check_presentation(char presentation[256]) {
    char presentation_codes[3][256] = {"D", "P", "H"};
    int length_arr = sizeof(presentation_codes) / sizeof(*presentation_codes);
    int result = 0;
    for (int i = 0; i < length_arr; i++) {
        if (strcmp(presentation, presentation_codes[i]) == 0) {
            result = 1;
            break;
        }
    }

    return result;
}

int check_decision(char decision[4]) {
    char decision_codes[2][4] = {"y", "n"};
    int length_arr = sizeof(decision_codes) / sizeof(*decision_codes);
    int result = 0;
    for (int i = 0; i < length_arr; i++) {
        if (strcmp(decision, decision_codes[i]) == 0) {
            result = 1;
            break;
        }
    }

    return result;
}

void print_order(char drink[256], char size[256], char presentation[256]) {

    if (strcmp(drink, "K") == 0) {
        strcpy(classicDrink.name, "Kopi");
    } else if (strcmp(drink, "T") == 0) {
        strcpy(classicDrink.name, "Teh");
    } else if (strcmp(drink, "C") == 0) {
        strcpy(classicDrink.name, "Coklat");
    } else if (strcmp(drink, "S") == 0) {
        strcpy(classicDrink.name, "Soda");
    }

    // ASUMSI:
    // Dikarenakan nilai size tidak diketahui maksudnya
    // apakah nilai size itu adalah panjang karakter size atau bukan
    // maka harga nilai size sebagai berikut
    // Small = 5
    // Medium = 6
    // Large = 7
    int size_price;
    if (strcmp(size, "S") == 0) {
        strcpy(classicDrink.size, "Small");
        size_price = 5;
    } else if (strcmp(size, "M") == 0) {
        strcpy(classicDrink.size, "Medium");
        size_price = 6;
    } else if (strcmp(size, "L") == 0) {
        strcpy(classicDrink.size, "Large");
        size_price = 7;
    }

    if (strcmp(presentation, "D") == 0) {
        strcpy(classicDrink.presentation, "Dingin");
    } else if (strcmp(presentation, "P") == 0) {
        strcpy(classicDrink.presentation, "Panas");
    } else if (strcmp(presentation, "H") == 0) {
        strcpy(classicDrink.presentation, "Hangat");
    }

    int price;
    
    price = size_price * strlen(classicDrink.name) * strlen(classicDrink.presentation) * 100;

    classicDrink.price = price;

    printf("Berikut pesanan minuman Anda: \n");
    printf("Nama Minuman: %s \n", classicDrink.name);
    printf("Size: %s \n", classicDrink.size);
    printf("Penyajian: %s \n", classicDrink.presentation);
    printf("Harga: %d \n", classicDrink.price);

    printf("Apakah pesanan sudah benar? \n");
    printf("Ketik y untuk Ya dan n untuk Tidak \n");
    printf("Pilihan Anda: ");
    char decision[4];
    fgets(decision, sizeof(decision), stdin);
    decision[strcspn(decision, "\n")] = '\0';

    while(check_decision(decision) != 1) {
        printf("Masukkan y untuk Ya dan n untuk Tidak untuk konfirmasi pesanan! \n");
        printf("Berikut pesanan minuman Anda: \n");
        printf("Nama Minuman: %s \n", classicDrink.name);
        printf("Size: %s \n", classicDrink.size);
        printf("Penyajian: %s \n", classicDrink.presentation);
        printf("Harga: %d \n", classicDrink.price);

        printf("Apakah pesanan sudah benar? \n");
        printf("Ketik y untuk Ya dan n untuk Tidak \n");
        printf("Pilihan Anda: ");
        fgets(decision, sizeof(decision), stdin);
        decision[strcspn(decision, "\n")] = '\0';

        check_decision(decision);
    }

    if (strcmp(decision, "y") == 0) {
        fwrite(&classicDrink, sizeof(classicDrink), 1, fptr);
        printf("Pesanan berhasil disimpan! \n");
    } else if (strcmp(decision, "n") == 0) {
        printf("Pesanan dibatalkan! Kembali ke menu utama! \n");
        exit;
    }
}

void inputData() {
    char drink[256], size[256], presentation[256];

    fptr = fopen("dataminuman.txt", "ab");

    if (fptr == NULL) {
        printf("File tidak ditemukan \n");
        exit(1);
    }

    printf("Daftar minuman \n");

    printf("K untuk Kopi \n");
    printf("T untuk Teh \n");
    printf("C untuk Coklat \n");
    printf("S untuk Soda \n");
    
    printf("Pilihan Anda: ");
    fgets(drink, sizeof(drink), stdin);
    drink[strcspn(drink, "\n")] = '\0';
    
    while (check_drink(drink) != 1) {
        printf("Daftar minuman tidak sesuai, silakan coba lagi \n");
        printf("Daftar minuman \n");

        printf("K untuk Kopi \n");
        printf("T untuk Teh \n");
        printf("C untuk Coklat \n");
        printf("S untuk Soda \n");
        
        printf("Pilihan Anda: ");
        fgets(drink, sizeof(drink), stdin);
        drink[strcspn(drink, "\n")] = '\0';

        check_drink(drink);        
    }

    printf("Ukuran minuman \n");

    printf("S untuk Small \n");
    printf("M untuk Medium \n");
    printf("L untuk Large \n");
    
    printf("Pilihan Anda: ");
    fgets(size, sizeof(size), stdin);
    size[strcspn(size, "\n")] = '\0';
    
    while (check_size(size) != 1) {
        printf("Ukuran minuman tidak sesuai, silakan coba lagi \n");
        printf("Ukuran minuman \n");

        printf("S untuk Small \n");
        printf("M untuk Medium \n");
        printf("L untuk Large \n");
        
        printf("Pilihan Anda: ");
        fgets(size, sizeof(size), stdin);
        size[strcspn(size, "\n")] = '\0';

        check_size(size);
    }

    printf("Penyajian minuman \n");

    printf("D untuk Dingin \n");
    printf("P untuk Panas \n");
    printf("H untuk Hangat \n");
    
    printf("Pilihan Anda: ");
    fgets(presentation, sizeof(presentation), stdin);
    presentation[strcspn(presentation, "\n")] = '\0';
    
    while (check_presentation(presentation) != 1) {
        printf("Penyajian minuman tidak sesuai, silakan coba lagi \n");
        printf("Penyajian minuman \n");

        printf("D untuk Dingin \n");
        printf("P untuk Panas \n");
        printf("H untuk Hangat \n");
        
        printf("Pilihan Anda: ");
        fgets(presentation, sizeof(presentation), stdin);
        presentation[strcspn(presentation, "\n")] = '\0';
        

        check_presentation(presentation);
    }

    print_order(drink, size, presentation);

    fclose(fptr);
}

void viewHistory() {

    fptr = fopen("dataminuman.txt", "rb");

    if (fptr == NULL) {
        printf("File tidak ditemukan \n");
        exit(1);
    }

    printf("\n Riwayat penjualan minuman \n");
    
    int i = 0;
    while (fread(&classicDrink, sizeof(classicDrink), 1, fptr) == 1)
    {
        printf("\n==============================\n");
        printf("Nomor Pesanan: %d \n", i + 1);
        printf("Nama minuman: %s \n", classicDrink.name);
        printf("Size: %s \n", classicDrink.size);
        printf("Penyajian: %s \n", classicDrink.presentation);
        printf("Harga: %d \n", classicDrink.price);
        printf("==============================\n");
        i++;
    }
    
    fclose(fptr);
}

void deleteHistory() {
    fptr = fopen("dataminuman.txt", "rb");

    if (fptr == NULL) {
        printf("File tidak ditemukan \n");
        exit(1);
    }

    printf("\n Riwayat penjualan minuman \n");
    
    int total = 0;
    struct Drink tempClassicDrink;
    while (fread(&tempClassicDrink, sizeof(tempClassicDrink), 1, fptr) == 1)
    {
        total++;
    }

    fclose(fptr);

    fptr = fopen("dataminuman.txt", "rb");

    if (fptr == NULL) {
        printf("File tidak ditemukan \n");
        exit(1);
    }

    printf("Total pesanan: %d \n", total);

    struct Drink arrClassicDrink[total];

    fread(&arrClassicDrink, sizeof(arrClassicDrink), 1, fptr);

    fclose(fptr);

    for (int i = 0; i < total; i++) {
        printf("\n==============================\n");
        printf("Nomor Pesanan: %d \n", i + 1);
        printf("Nama minuman: %s \n", arrClassicDrink[i].name);
        printf("Size: %s \n", arrClassicDrink[i].size);
        printf("Penyajian: %s \n", arrClassicDrink[i].presentation);
        printf("Harga: %d \n", arrClassicDrink[i].price);
        printf("==============================\n");
    }

    char order_number_str[4];
    int order_number;
    printf("Pilih nomor pesanan yang akan dihapus: ");
    fgets(order_number_str, sizeof(order_number_str), stdin);
    sscanf(order_number_str, "%d", &order_number);

    while (order_number < 1) {
        printf("Nomor pesanan harus dimulai dari angka 1 sampai %d \n", total);
        fgets(order_number_str, sizeof(order_number_str), stdin);
        sscanf(order_number_str, "%d", &order_number);
    }

    for(int i = (order_number - 1); i <= (total - 1); i++)
    {
        strcpy(arrClassicDrink[i].name, arrClassicDrink[i + 1].name);
        strcpy(arrClassicDrink[i].size, arrClassicDrink[i + 1].size);
        strcpy(arrClassicDrink[i].presentation, arrClassicDrink[i + 1].presentation);
        arrClassicDrink[i].price = arrClassicDrink[i + 1].price;
    }

    fptr = fopen("dataminuman.txt", "wb");

    fwrite(&arrClassicDrink, sizeof(arrClassicDrink), 1, fptr);

    total--;

    printf("Data successfully delete... \n");
    
    fclose(fptr);
}

int main() {
    char menu_str[256];
    int menu;
    printf("Toko Minuman \n");
    while (menu != 4) {
        printf("1. Input Data \n");
        printf("2. View History \n");
        printf("3. Delete History \n");
        printf("4. Exit \n");
        printf("Pilihan Anda: ");
        fgets(menu_str, sizeof(menu_str), stdin);
        sscanf(menu_str, "%d", &menu);

        if (menu == 1) {
            inputData();
        } else if (menu == 2) {
            viewHistory();
        } else if (menu == 3) {
            deleteHistory();
        } else if (menu == 4) {
            break;
        }
    }

    return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment