asrori

file processing with array of struct

Dec 16th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.92 KB | None | 0 0
  1. /*  file processing with array of struct
  2.     mula mula kita stream data dari file lalu dimasukkan ke dalam sebuah array of struct
  3.     kemudian data tersebut diolah disisi program (bukan diolah disisi file)
  4.     setelah diolah, data lalu dikembalikan lagi kedalam file
  5.  
  6.     konsep olah datanya sama seperti arraylist di java
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. /* struct dan array of struct */
  14. struct game
  15. {
  16.     char pemain[20];
  17.     int skorRata2,
  18.         banyakBermain;
  19. };
  20. struct game DotA2[100];
  21.  
  22. /* prototype fungsi */
  23. void clearbuffer( void );
  24. void menu( void ); //menampilkan menu
  25. void inisialisasi( void ); //semua data di file dipecah lalu dimasukkan kedalam array of struct
  26. int banyakData( struct game DotA2[] ); //menghitung banyak data dari array of struct
  27. void lihatData( struct game DotA2[] ); //lihat data yang ada didalam array of struct
  28. void tambahSkor( struct game DotA2[] );
  29. int cariIndex( struct game DotA2[], char pemain[], int n); //cari index pemain
  30. void tambahPemain( struct game DotA2[] );
  31. void hapusPemain( struct game DotA2[] );
  32. void inputKeFile( struct game DotA2[] ); //dari array of struct lalu input ke ke file
  33.  
  34. int main( void )
  35. {
  36.     int choice = 0;
  37.     inisialisasi();
  38.  
  39.     do {
  40.         system("clear");
  41.         menu();
  42.         printf("\nmasukkan pilihan kamu [1-5] : "); scanf("%d", &choice); clearbuffer();
  43.         if (choice == 1) lihatData( DotA2 );
  44.         if (choice == 2) tambahSkor( DotA2 );
  45.         if (choice == 3) tambahPemain( DotA2 );
  46.         if (choice == 4) hapusPemain( DotA2 );
  47.     } while(choice != 5);
  48.  
  49.     inputKeFile( DotA2 );
  50.  
  51.     return 0;
  52. }
  53.  
  54. /* cara paling aman buat clear buffer memory */
  55. void clearbuffer( void )
  56. {
  57.     char ch;
  58.     while ((ch = getchar()) != '\n' && ch != EOF);
  59. }
  60.  
  61. void menu( void )
  62. {
  63.     printf("mencatat skor pemain DotA2\n");
  64.     printf("==========================\n\n");
  65.     printf("1.Lihat Data\n");
  66.     printf("2.Tambah Skor Pemain\n");
  67.     printf("3.Tambah Pemain Baru\n");
  68.     printf("4.Hapus Pemain\n");
  69.     printf("5.Simpan dan Keluar\n");
  70. }
  71.  
  72. /* buka file lalu baca data perbaris lalu dimasukkan kedalam array of struct */
  73. void inisialisasi( void )
  74. {
  75.     FILE *fp;
  76.     int indeks = 0;
  77.     char baris[255]; //variabel untuk menampung banyak kata perbaris, maks 255 kata
  78.     fp = fopen( "file.txt", "r" );
  79.  
  80.     /* baca data perbaris dari file*/
  81.     while (fgets(baris, 255, fp)) {
  82.         int i=0;
  83.         char delimiter[] = " ",
  84.              data[2][20];
  85.         /*
  86.             data[0][20] untuk menampung data nama pemain
  87.             data[1][20] untuk menampung data skor rata2
  88.             data[2][20] untuk menampung data banyak bermain
  89.         */
  90.  
  91.         /* pecah data, lalu setiap data dimasukkan kedalam variabel data*/
  92.         char *token = strtok(baris, delimiter);
  93.         while (token) {
  94.             strcpy(data[i++], token);
  95.             token = strtok(NULL, delimiter);
  96.         }
  97.  
  98.         /* memasukkan tiap tiap data ke dalam elemen struct */
  99.         strcpy(DotA2[indeks].pemain, data[0]);
  100.         DotA2[indeks].skorRata2 = atoi(data[1]);
  101.         DotA2[indeks].banyakBermain = atoi(data[2]);
  102.         indeks++; //indeks dari array struct
  103.     }
  104.  
  105.     fclose (fp); //close file
  106. }
  107.  
  108. /* untuk mengetahui banyak data, null karakter tidak dihitung */
  109. int banyakData( struct game DotA2[] )
  110. {
  111.     int i=0, n=0;
  112.     while(strcmp(DotA2[i].pemain, "")) i++, n++; // cari string di indeks pemain
  113.  
  114.     return n;
  115. }
  116.  
  117. /* lihat data, harus tau banyak datanya dahulu */
  118. void lihatData( struct game DotA2[])
  119. {
  120.     system("clear");
  121.     int n = banyakData(DotA2);
  122.     printf("%-15s : \t%-15s \t: \t%-15s \n", "Nama Pemain", "Skor Rata-Rata", "bermain sebanyak");
  123.     printf("===================================================================================\n");
  124.     for (int i = 0; i < n; i++)
  125.         printf("%-15s : \t\t%-15d : \t\t%-15d \n", DotA2[i].pemain, DotA2[i].skorRata2, DotA2[i].banyakBermain);
  126.  
  127.     printf("\ntekan ENTER untuk melanjutkan..."); clearbuffer();
  128. }
  129.  
  130. /* fungsi ini untuk mengembalikan nilai berupa indeks data/pemain yang dicari*/
  131. int cariIndex( struct game DotA2[], char pemain[], int n)
  132. {
  133.     int i;
  134.     for (i = 0; i < n; i++)
  135.         if (strcmp(DotA2[i].pemain, pemain) == 0)
  136.             return i;
  137.  
  138.     return -1;
  139. }
  140.  
  141. /* untuk menambah skor harus tau posisi indeks dari pemain yang dicari */
  142. void tambahSkor( struct game DotA2[] )
  143. {
  144.     char pemain[20];
  145.     int n = banyakData(DotA2),
  146.         indeksPemain,
  147.         skor;
  148.  
  149.     do {
  150.         printf("\nmasukkan nama pemain : "); scanf("%s", pemain); clearbuffer();
  151.         indeksPemain = cariIndex(DotA2, pemain, n);
  152.         if (indeksPemain < 0) printf(" \"%s\" tidak ditemukan\n", pemain);
  153.     } while(indeksPemain < 0);
  154.  
  155.     do {
  156.         printf("masukkan skor [1-100] : "); scanf("%d", &skor); clearbuffer();
  157.     } while(skor < 0 || skor > 100);
  158.  
  159.     DotA2[indeksPemain].skorRata2 = ((DotA2[indeksPemain].skorRata2 * DotA2[indeksPemain].banyakBermain) + skor);
  160.     DotA2[indeksPemain].skorRata2 /= DotA2[indeksPemain].banyakBermain+1;
  161.     DotA2[indeksPemain].banyakBermain++;
  162.  
  163.     printf("\nskor \"%s\" berhasil diupdate\n", pemain);
  164.     printf("tekan ENTER untuk melanjutkan..."); clearbuffer();
  165. }
  166.  
  167. /* untuk menambah data harus mengetahui indeks terakhir dari suatu array bertipe struktur */
  168. void tambahPemain( struct game DotA2[] )
  169. {
  170.     char pemain[10];
  171.     int indeksTerakhir = banyakData(DotA2);
  172.  
  173.     do {
  174.         printf("\nmasukkan nama pemain [1-10 karakter]: "); scanf("%s", pemain); clearbuffer();
  175.     } while(strlen(pemain) > 20);
  176.  
  177.     strcpy(DotA2[indeksTerakhir].pemain, pemain);
  178.  
  179.     printf("\n\"%s\" berhasil ditambahkan\n", pemain);
  180.     printf("tekan ENTER untuk melanjutkan..."); clearbuffer();
  181. }
  182.  
  183. /* untuk menghapus suatu data dalam array bertipe struct harus tau dulu posisi indeks data yang dicari */
  184. void hapusPemain( struct game DotA2[] )
  185. {
  186.     char pemain[20];
  187.     int n = banyakData(DotA2),
  188.         indeksPemain;
  189.  
  190.     do {
  191.         printf("\nmasukkan nama pemain yang ingin dihapus : "); scanf("%s", pemain); clearbuffer();
  192.         indeksPemain = cariIndex(DotA2, pemain, n);
  193.         if (indeksPemain < 0) printf(" \"%s\" tidak ditemukan\n", pemain);
  194.     } while(indeksPemain < 0);
  195.  
  196.     //shift posisi indeks dari array bertipe struct
  197.     for (int i = indeksPemain; i <= n-1; i++)
  198.         DotA2[i] = DotA2[i+1];
  199.  
  200.     printf("\"%s\" berhasil dihapus\n", pemain);
  201.     printf("tekan ENTER untuk melanjutkan..."); clearbuffer();
  202. }
  203.  
  204. /* waktunya insert ke file, harus tau jumlah data dari array bertipe struct */
  205. void inputKeFile( struct game DotA2[] )
  206. {
  207.     FILE *fp;
  208.     fp = fopen( "file.txt", "w" );
  209.     int banyak = banyakData(DotA2);
  210.     char baris[255];
  211.  
  212.     //masukkan data ke file
  213.     for (int i = 0; i < banyak; i++) {
  214.         sprintf(baris, "%s %d %d\n", DotA2[i].pemain, DotA2[i].skorRata2, DotA2[i].banyakBermain);
  215.         fputs(baris, fp);
  216.     }
  217.  
  218.     fclose(fp);
  219. }
Add Comment
Please, Sign In to add comment