Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* file processing with array of struct
- mula mula kita stream data dari file lalu dimasukkan ke dalam sebuah array of struct
- kemudian data tersebut diolah disisi program (bukan diolah disisi file)
- setelah diolah, data lalu dikembalikan lagi kedalam file
- konsep olah datanya sama seperti arraylist di java
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- /* struct dan array of struct */
- struct game
- {
- char pemain[20];
- int skorRata2,
- banyakBermain;
- };
- struct game DotA2[100];
- /* prototype fungsi */
- void clearbuffer( void );
- void menu( void ); //menampilkan menu
- void inisialisasi( void ); //semua data di file dipecah lalu dimasukkan kedalam array of struct
- int banyakData( struct game DotA2[] ); //menghitung banyak data dari array of struct
- void lihatData( struct game DotA2[] ); //lihat data yang ada didalam array of struct
- void tambahSkor( struct game DotA2[] );
- int cariIndex( struct game DotA2[], char pemain[], int n); //cari index pemain
- void tambahPemain( struct game DotA2[] );
- void hapusPemain( struct game DotA2[] );
- void inputKeFile( struct game DotA2[] ); //dari array of struct lalu input ke ke file
- int main( void )
- {
- int choice = 0;
- inisialisasi();
- do {
- system("clear");
- menu();
- printf("\nmasukkan pilihan kamu [1-5] : "); scanf("%d", &choice); clearbuffer();
- if (choice == 1) lihatData( DotA2 );
- if (choice == 2) tambahSkor( DotA2 );
- if (choice == 3) tambahPemain( DotA2 );
- if (choice == 4) hapusPemain( DotA2 );
- } while(choice != 5);
- inputKeFile( DotA2 );
- return 0;
- }
- /* cara paling aman buat clear buffer memory */
- void clearbuffer( void )
- {
- char ch;
- while ((ch = getchar()) != '\n' && ch != EOF);
- }
- void menu( void )
- {
- printf("mencatat skor pemain DotA2\n");
- printf("==========================\n\n");
- printf("1.Lihat Data\n");
- printf("2.Tambah Skor Pemain\n");
- printf("3.Tambah Pemain Baru\n");
- printf("4.Hapus Pemain\n");
- printf("5.Simpan dan Keluar\n");
- }
- /* buka file lalu baca data perbaris lalu dimasukkan kedalam array of struct */
- void inisialisasi( void )
- {
- FILE *fp;
- int indeks = 0;
- char baris[255]; //variabel untuk menampung banyak kata perbaris, maks 255 kata
- fp = fopen( "file.txt", "r" );
- /* baca data perbaris dari file*/
- while (fgets(baris, 255, fp)) {
- int i=0;
- char delimiter[] = " ",
- data[2][20];
- /*
- data[0][20] untuk menampung data nama pemain
- data[1][20] untuk menampung data skor rata2
- data[2][20] untuk menampung data banyak bermain
- */
- /* pecah data, lalu setiap data dimasukkan kedalam variabel data*/
- char *token = strtok(baris, delimiter);
- while (token) {
- strcpy(data[i++], token);
- token = strtok(NULL, delimiter);
- }
- /* memasukkan tiap tiap data ke dalam elemen struct */
- strcpy(DotA2[indeks].pemain, data[0]);
- DotA2[indeks].skorRata2 = atoi(data[1]);
- DotA2[indeks].banyakBermain = atoi(data[2]);
- indeks++; //indeks dari array struct
- }
- fclose (fp); //close file
- }
- /* untuk mengetahui banyak data, null karakter tidak dihitung */
- int banyakData( struct game DotA2[] )
- {
- int i=0, n=0;
- while(strcmp(DotA2[i].pemain, "")) i++, n++; // cari string di indeks pemain
- return n;
- }
- /* lihat data, harus tau banyak datanya dahulu */
- void lihatData( struct game DotA2[])
- {
- system("clear");
- int n = banyakData(DotA2);
- printf("%-15s : \t%-15s \t: \t%-15s \n", "Nama Pemain", "Skor Rata-Rata", "bermain sebanyak");
- printf("===================================================================================\n");
- for (int i = 0; i < n; i++)
- printf("%-15s : \t\t%-15d : \t\t%-15d \n", DotA2[i].pemain, DotA2[i].skorRata2, DotA2[i].banyakBermain);
- printf("\ntekan ENTER untuk melanjutkan..."); clearbuffer();
- }
- /* fungsi ini untuk mengembalikan nilai berupa indeks data/pemain yang dicari*/
- int cariIndex( struct game DotA2[], char pemain[], int n)
- {
- int i;
- for (i = 0; i < n; i++)
- if (strcmp(DotA2[i].pemain, pemain) == 0)
- return i;
- return -1;
- }
- /* untuk menambah skor harus tau posisi indeks dari pemain yang dicari */
- void tambahSkor( struct game DotA2[] )
- {
- char pemain[20];
- int n = banyakData(DotA2),
- indeksPemain,
- skor;
- do {
- printf("\nmasukkan nama pemain : "); scanf("%s", pemain); clearbuffer();
- indeksPemain = cariIndex(DotA2, pemain, n);
- if (indeksPemain < 0) printf(" \"%s\" tidak ditemukan\n", pemain);
- } while(indeksPemain < 0);
- do {
- printf("masukkan skor [1-100] : "); scanf("%d", &skor); clearbuffer();
- } while(skor < 0 || skor > 100);
- DotA2[indeksPemain].skorRata2 = ((DotA2[indeksPemain].skorRata2 * DotA2[indeksPemain].banyakBermain) + skor);
- DotA2[indeksPemain].skorRata2 /= DotA2[indeksPemain].banyakBermain+1;
- DotA2[indeksPemain].banyakBermain++;
- printf("\nskor \"%s\" berhasil diupdate\n", pemain);
- printf("tekan ENTER untuk melanjutkan..."); clearbuffer();
- }
- /* untuk menambah data harus mengetahui indeks terakhir dari suatu array bertipe struktur */
- void tambahPemain( struct game DotA2[] )
- {
- char pemain[10];
- int indeksTerakhir = banyakData(DotA2);
- do {
- printf("\nmasukkan nama pemain [1-10 karakter]: "); scanf("%s", pemain); clearbuffer();
- } while(strlen(pemain) > 20);
- strcpy(DotA2[indeksTerakhir].pemain, pemain);
- printf("\n\"%s\" berhasil ditambahkan\n", pemain);
- printf("tekan ENTER untuk melanjutkan..."); clearbuffer();
- }
- /* untuk menghapus suatu data dalam array bertipe struct harus tau dulu posisi indeks data yang dicari */
- void hapusPemain( struct game DotA2[] )
- {
- char pemain[20];
- int n = banyakData(DotA2),
- indeksPemain;
- do {
- printf("\nmasukkan nama pemain yang ingin dihapus : "); scanf("%s", pemain); clearbuffer();
- indeksPemain = cariIndex(DotA2, pemain, n);
- if (indeksPemain < 0) printf(" \"%s\" tidak ditemukan\n", pemain);
- } while(indeksPemain < 0);
- //shift posisi indeks dari array bertipe struct
- for (int i = indeksPemain; i <= n-1; i++)
- DotA2[i] = DotA2[i+1];
- printf("\"%s\" berhasil dihapus\n", pemain);
- printf("tekan ENTER untuk melanjutkan..."); clearbuffer();
- }
- /* waktunya insert ke file, harus tau jumlah data dari array bertipe struct */
- void inputKeFile( struct game DotA2[] )
- {
- FILE *fp;
- fp = fopen( "file.txt", "w" );
- int banyak = banyakData(DotA2);
- char baris[255];
- //masukkan data ke file
- for (int i = 0; i < banyak; i++) {
- sprintf(baris, "%s %d %d\n", DotA2[i].pemain, DotA2[i].skorRata2, DotA2[i].banyakBermain);
- fputs(baris, fp);
- }
- fclose(fp);
- }
Add Comment
Please, Sign In to add comment