Advertisement
asrori

Full Feature Array of Struct

Jan 7th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. /* definisi struct */
  6. struct inventory
  7. {
  8.     char namaBarang[30],
  9.          jenis[20],
  10.          supplier[30];
  11.  
  12.     int stok;
  13. };
  14.  
  15. /* prototype fungsi */
  16. void inisialisasi( struct inventory giant[] );
  17. void clearBuffer( void );
  18. void menu( void );
  19. int banyakData( struct inventory giant[] );
  20. void lihatData( struct inventory giant[] );
  21. void urutkanNama( struct inventory giant[], struct inventory temp);
  22. void urutkanStok( struct inventory giant[], struct inventory temp);
  23. void cariJenis( struct inventory giant[] );
  24. void cariStok( struct inventory tempGiant[], struct inventory temp);
  25. int binarySearch( struct inventory giant[], int n, int stok);
  26. void tambahData( struct inventory giant[] );
  27. int cariIndex( struct inventory giant[], char namaBarang[], int n);
  28. void updateStok( struct inventory giant[] );
  29. void hapusData( struct inventory giant[] );
  30. void simpan( struct inventory giant[] );
  31.  
  32. int main( void )
  33. {
  34.     /* deklarasi array bertipe struct (array of struct)
  35.        struct tempGiant digunakan untuk melakukan operasi algoritma binary search agar data utama kita di giant tidak berubah
  36.        karena untuk melakukan binary search harus melakukan  sorting terlebih dahulu
  37.     */
  38.     struct inventory giant[200],
  39.                      tempGiant[200],
  40.                      temp;
  41.     int choice;
  42.     inisialisasi( giant );
  43.  
  44.     do {
  45.         system("clear");
  46.         menu();
  47.         printf("masukkan pilihan kamu [1-6] : "); scanf("%d", &choice); clearBuffer();
  48.         if (choice == 1) lihatData( giant );
  49.         if (choice == 2) urutkanNama( giant, temp );
  50.         if (choice == 3) urutkanStok( giant, temp );
  51.         if (choice == 4) cariJenis( giant );
  52.         if (choice == 5){
  53.             memcpy(tempGiant, giant, sizeof(giant));
  54.             cariStok( tempGiant, temp );
  55.         };
  56.         if (choice == 6) tambahData( giant );
  57.         if (choice == 7) updateStok( giant );
  58.         if (choice == 8) hapusData( giant );
  59.         if (choice == 9) simpan( giant );
  60.     } while(choice != 0);
  61.  
  62.     return 0;
  63. }
  64.  
  65. void clearBuffer( void )
  66. {
  67.     char ch;
  68.     while ((ch = getchar()) != '\n' && ch != EOF);
  69. }
  70.  
  71. void inisialisasi( struct inventory giant[] )
  72. {
  73.     /* buka file dengan mode read */
  74.     FILE *inventory;
  75.     inventory = fopen("inventory.txt", "r");
  76.     if (!inventory)
  77.     {
  78.         printf("file tidak ada\n");
  79.         exit(EXIT_FAILURE);
  80.     }
  81.  
  82.     /* variabel untuk menentukan maks baris yg mau dibaca */
  83.     char baris[255];
  84.     int indeks = 0;
  85.  
  86.     /* membaca tiap baris dari file dengan maks 225 karakter tiap baris
  87.     dari file yang ditunjuk oleh pointer inventory */
  88.     while (fgets(baris, 255, inventory))
  89.     {
  90.         int i = 0;
  91.         char delimiter[] = "|",
  92.              data[3][20];
  93.  
  94.         /* pecah kalimat menjadi kata kata, lalu tiap kata masukkan ke variabel data*/
  95.         char *token = strtok(baris, delimiter);
  96.         while (token)
  97.         {
  98.             strcpy(data[i++], token);
  99.             token = strtok(NULL, delimiter);
  100.         }
  101.  
  102.         /* masukkan nilai dari variabel data ke dalam array of struct */
  103.         strcpy(giant[indeks].namaBarang, data[0]);
  104.         strcpy(giant[indeks].jenis, data[1]);
  105.         strcpy(giant[indeks].supplier, data[2]);
  106.  
  107.         giant[indeks].stok = atoi(data[3]);
  108.  
  109.         /* setelah selesai memasukkan data ke baris pertama kita lalu menaikkan indeksnya
  110.         supaya data yg berikutnya bisa disimpan di row berikutnya */
  111.         indeks++;
  112.     }
  113.  
  114.     /* tutup file*/
  115.     fclose(inventory);
  116. }
  117.  
  118. void menu( void )
  119. {
  120.     printf("===== GIANT INVENTORY =====\n\n");
  121.     printf("1. Lihat Data\n");
  122.     printf("2. Urutkan Data Nama Barang\n");
  123.     printf("3. Urutkan Data Stok\n");
  124.     printf("4. Cari Jenis Barang\n");
  125.     printf("5. Cari Stok Terkecil\n");
  126.     printf("6. Tambah Data\n");
  127.     printf("7. Update Stok\n");
  128.     printf("8. Hapus Data\n");
  129.     printf("9. Simpan\n");
  130.     printf("0. keluar\n\n");
  131. }
  132.  
  133. int banyakData( struct inventory giant[] )
  134. {
  135.     int n = 0,
  136.         i = 0;
  137.  
  138.     /* looping data nama barang sampai tidak ada karakter, jika menemukan karakter nilai i bertambah 1*/
  139.     while (strcmp(giant[i].namaBarang,""))
  140.         n++, i++;
  141.  
  142.     return n;
  143. }
  144.  
  145. void lihatData( struct inventory giant[] )
  146. {
  147.     int n = banyakData( giant ),
  148.         halaman = n/10, //untuk melimit data yang ditampilkan, data yang dilimit untuk ditampoilkan berjumlah 10
  149.         sisa = n%10, //sisa data
  150.         dataPage = 1; //halaman sekarang yang ditampilkan, dimulai dari nomor satu
  151.     if( sisa != 0) halaman++; //jika ada sisa data maka tambahkan 1 halaman
  152.  
  153.     do {
  154.         system("clear");
  155.         printf("\t\t\t        *****************************\n");
  156.         printf("\t\t\t\t*JUMLAH DATA GIANT INVENTORY*\n");
  157.         printf("\t\t\t        *****************************\n\n");
  158.         printf("============================================================================================\n");
  159.         printf("%s \t\t: %s \t\t: %s \t\t: %s\t\t   |\n", "NAMA BARANG", "JENIS", "SUPPLIER", "STOK");
  160.         printf("============================================================================================\n");
  161.         for (int i = (dataPage*10) - 10; i < (dataPage*10); i++)
  162.             printf("%s \t\t: %s \t\t: %s \t\t: %d\t\t   |\n", giant[i].namaBarang, giant[i].jenis, giant[i].supplier, giant[i].stok);
  163.         printf("============================================================================================\n\n");
  164.         printf("halaman : %d, dari total %d halaman\n", dataPage, halaman);
  165.         printf("masukkan halaman [0 = keluar] : "); scanf("%d", &dataPage); clearBuffer();
  166.     } while(dataPage != 0);
  167.  
  168.     printf("tekan ENTER untuk kembali ke menu..."); clearBuffer();
  169. }
  170.  
  171. void urutkanNama( struct inventory giant[], struct inventory temp )
  172. {
  173.     int n = banyakData( giant ),
  174.         i,
  175.         j;
  176.  
  177.     /* mengapa ada variable2 temp seperti itu..? karena pada dasarnya bubble sort membandingkan dua nilai lalu di tukar(swap)
  178.        --- proses swap apabila nilai yang sebelah kiri lebih besar dari yang kanan ---
  179.        left -> temp (artinya nilai yang sebelah kiri dimasukkan ke tempat sementara)
  180.        kanan -> kiri (artinya nilai yang sebelah kanan dimasukkan ke nilai yang sebelah kiri)
  181.        temp -> kanan (artinya nilai dari tempat sementara dimasukkan ke nilai yang sebelah kiri)
  182.     */
  183.  
  184.     // /* bubble sort */
  185.     for ( i = 0; i < n - 1; i++ ) {
  186.         for ( j = i + 1; j < n; j++) {
  187.             if (strcmp(giant[i].namaBarang, giant[j].namaBarang) > 0) {
  188.                 temp = giant[j];
  189.                 giant[j] = giant[i];
  190.                 giant[i] = temp;
  191.             }
  192.         }
  193.     }
  194. }
  195.  
  196. void urutkanStok( struct inventory giant[], struct inventory temp )
  197. {
  198.     int n = banyakData( giant ),
  199.         i,
  200.         j;
  201.  
  202.     /* insertion sort */
  203.     for (i = 1; i < n; i++) {
  204.         temp = giant[i];
  205.  
  206.         for ( j = i; j > 0 && giant[j-1].stok > temp.stok; j--)
  207.             giant[j] = giant[j-1];
  208.  
  209.         giant[j] = temp;
  210.     }
  211. }
  212.  
  213. void cariJenis( struct inventory giant[] )
  214. {
  215.     system("clear");
  216.     char jenis[20];
  217.     int n = banyakData( giant ),
  218.         i,
  219.         banyakKategori = 0;
  220.     printf("masukkan jenis barang yang ingin kamu cari : "); scanf("%s", jenis); clearBuffer();
  221.     printf("\n============================================================================================\n");
  222.     printf("%s \t\t: %s \t\t: %s \t\t: %s\t\t   |\n", "NAMA BARANG", "JENIS", "SUPPLIER", "STOK");
  223.     printf("============================================================================================\n");
  224.  
  225.     /* linear search */
  226.     /* looping seluruh data, apabila ditemukan data yang dicari langsung tampilkan */
  227.     for ( i = 0; i < n; i++) {
  228.         if (strcmp(giant[i].jenis, jenis) == 0){
  229.             printf("%s \t\t: %s \t\t: %s \t\t: %d\t\t   |\n", giant[i].namaBarang, giant[i].jenis, giant[i].supplier, giant[i].stok);
  230.             banyakKategori++;
  231.         }
  232.     }
  233.     if (banyakKategori == 0)
  234.         printf("kategori yang anda cari tidak ada\n");
  235.     printf("============================================================================================\n\n");
  236.     printf("\ntekan ENTER untuk kembali ke menu..."); clearBuffer();
  237. }
  238.  
  239. void cariStok( struct inventory tempGiant[], struct inventory temp )
  240. {
  241.     system("clear");
  242.     int stok,
  243.         end = banyakData(tempGiant),
  244.         maks,
  245.         j;
  246.     printf("masukkan stok maksimal yang ingin dicari : "); scanf("%d", &stok); clearBuffer();
  247.     urutkanStok( tempGiant, temp ); //sorting stok array of struct tempGiant
  248.     /* binary search */
  249.     maks = binarySearch( tempGiant, end, stok); //variabel maks menampung nilai kembalian dari fungsi binary search
  250.  
  251.     printf("\n============================================================================================\n");
  252.     printf("%s \t\t: %s \t\t: %s \t\t: %s\t\t   |\n", "NAMA BARANG", "JENIS", "SUPPLIER", "STOK");
  253.     printf("============================================================================================\n");
  254.     for (j = 0; j <= maks; j++)
  255.         printf("%s \t\t: %s \t\t: %s \t\t: %d\t\t   |\n", tempGiant[j].namaBarang, tempGiant[j].jenis, tempGiant[j].supplier, tempGiant[j].stok);
  256.     printf("============================================================================================\n");
  257.     if (maks < 0)
  258.         printf("stok yang anda cari tidak ada\n");
  259.     printf("tekan ENTER untuk kembali ke menu..."); clearBuffer();
  260. }
  261.  
  262. int binarySearch( struct inventory tempGiant[], int end, int stok)
  263. {
  264.     int start = 0;
  265.  
  266.     while(start < end)
  267.     {
  268.         int mid = (start + end) / 2;
  269.         if (tempGiant[mid].stok == stok) {
  270.             return mid;
  271.         } else if (tempGiant[mid].stok < stok) {
  272.             start = mid + 1;
  273.         } else {
  274.             end = mid;
  275.         }
  276.     }
  277.  
  278.     return -1;
  279. }
  280.  
  281. void tambahData( struct inventory giant[] )
  282. {
  283.     int n = banyakData( giant ); //indeks terakhir
  284.  
  285.     /* semuanya non validasi, silahkan tambahkan validasi sendiri*/
  286.     printf("\nmasukkan nama barang : "); scanf("%[^\n]", giant[n].namaBarang); clearBuffer();
  287.     printf("masukkan kategori barang : "); scanf("%[^\n]", giant[n].jenis); clearBuffer();
  288.     printf("masukkan supplier : "); scanf("%[^\n]", giant[n].supplier); clearBuffer();
  289.     printf("masukkan stok : "); scanf("%d", &giant[n].stok); clearBuffer();
  290.  
  291.     printf("\ndata berhasil ditambahkan\n");
  292.     printf("tekan ENTER untuk melanjutkan..."); clearBuffer();
  293. }
  294.  
  295. int cariIndex( struct inventory giant[], char namaBarang[], int n)
  296. {
  297.     int indeks;
  298.  
  299.     //looping sampai ketemu nama barang yang dicari, apabila ditemukan kembalikan indeksnya
  300.     for ( indeks = 0; indeks < n; indeks++)
  301.         if (strcmp(giant[indeks].namaBarang, namaBarang) == 0)
  302.             return indeks;
  303.  
  304.     return -1;
  305. }
  306.  
  307. void updateStok( struct inventory giant[] )
  308. {
  309.     char namaBarang[30];
  310.     int posisi,
  311.         n = banyakData( giant );
  312.  
  313.     do {
  314.         printf("masukkan nama barang : "); scanf("%[^\n]", namaBarang); clearBuffer();
  315.         posisi = cariIndex( giant, namaBarang, n);
  316.         if (posisi < 0) printf("nama barang tidak ditemukan\n");
  317.     } while(posisi < 0);
  318.     printf("stok %s saat ini : %d\n", namaBarang, giant[posisi].stok);
  319.     printf("masukkan stok barang : "); scanf("%d", &giant[posisi].stok); clearBuffer(); //non validasi
  320.  
  321.     printf("\nstok %s berhasil diupdate\n", namaBarang);
  322.     printf("tekan ENTER untuk melanjutkan..."); clearBuffer();
  323. }
  324.  
  325. void hapusData( struct inventory giant[] )
  326. {
  327.     char namaBarang[30];
  328.     int posisi,
  329.         n = banyakData( giant );
  330.  
  331.     do {
  332.         printf("masukkan nama barang : "); scanf("%[^\n]", namaBarang); clearBuffer();
  333.         posisi = cariIndex( giant, namaBarang, n);
  334.         if (posisi < 0) printf("nama barang tidak ditemukan\n");
  335.     } while(posisi < 0);
  336.  
  337.     for (int i = posisi; i <= n-1; i++)
  338.         giant[i] = giant[i+1];
  339.    
  340.     printf("\ndata berhasil dihapus\n");
  341.     printf("tekan ENTER untuk melanjutkan..."); clearBuffer();
  342. }
  343.  
  344. void simpan( struct inventory giant[] )
  345. {
  346.     /* buka file dengan mode write */
  347.     FILE *inventory;
  348.     inventory = fopen("inventory.txt", "w");
  349.     if (!inventory)
  350.     {
  351.         printf("file tidak ada\n");
  352.         exit(EXIT_FAILURE);
  353.     }
  354.  
  355.     /* memasukkan data maksimal perbaris sebanyak 255 karakter*/
  356.     char baris[255];
  357.     int n = banyakData( giant );
  358.  
  359.     /* masukkan data dari array of struct ke file */
  360.     for (int i = 0; i < n; i++)
  361.     {
  362.         sprintf(baris, "%s|%s|%s|%d\n", giant[i].namaBarang, giant[i].jenis, giant[i].supplier, giant[i].stok);
  363.         fputs(baris, inventory);
  364.     }
  365.  
  366.     /* tutup file*/
  367.     fclose(inventory);
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement