{"id":19492607,"url":"https://github.com/rafifiaan/learn-processing-c","last_synced_at":"2026-05-15T06:41:53.169Z","repository":{"id":192198682,"uuid":"618349558","full_name":"rafifiaan/learn-Processing-C","owner":"rafifiaan","description":"Repo in pure running process using C!","archived":false,"fork":false,"pushed_at":"2023-08-24T16:23:06.000Z","size":2687,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-08T09:12:07.644Z","etag":null,"topics":["c","operating-system","processing"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rafifiaan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-03-24T09:26:42.000Z","updated_at":"2023-09-02T07:01:48.000Z","dependencies_parsed_at":"2023-09-03T09:48:17.006Z","dependency_job_id":"9c8dcc7e-38cd-4295-ae8f-3fc58c30041e","html_url":"https://github.com/rafifiaan/learn-Processing-C","commit_stats":null,"previous_names":["rafifiaan/learn-processing-c"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafifiaan%2Flearn-Processing-C","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafifiaan%2Flearn-Processing-C/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafifiaan%2Flearn-Processing-C/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafifiaan%2Flearn-Processing-C/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rafifiaan","download_url":"https://codeload.github.com/rafifiaan/learn-Processing-C/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240738122,"owners_count":19849549,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","operating-system","processing"],"created_at":"2024-11-10T21:22:12.139Z","updated_at":"2026-05-15T06:41:48.145Z","avatar_url":"https://github.com/rafifiaan.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Processing - Get files and processing in various forms using C Languages\n\n## **Documentation In *Bahasa (ID/INA)***\n\n### Question Description\nGrape-kun adalah seorang penjaga hewan di kebun binatang, dia mendapatkan tugas dari atasannya untuk melakukan penjagaan pada beberapa hewan-hewan yang ada di kebun binatang sebelum melakukan penjagaan Grape-kun harus mengetahui terlebih dahulu hewan apa aja yang harus dijaga dalam drive kebun binatang tersebut terdapat folder gambar dari hewan apa saja yang harus dijaga oleh Grape-kun. Berikut merupakan link download dari drive kebun binatang tersebut : https://drive.google.com/uc?export=download\u0026id=1oDgj5kSiDO0tlyS7-20uz7t20X3atwrq\n\n* Grape-kun harus mendownload file tersebut untuk disimpan pada penyimpanan local komputernya. Dan untuk melakukan melihat file gambar pada folder yang telah didownload Grape-kun harus melakukan unzip pada folder tersebut.\n* Setelah berhasil melakukan unzip Grape-kun melakukan pemilihan secara acak pada file gambar tersebut untuk melakukan shift penjagaan pada hewan tersebut.\n* Karena Grape-kun adalah orang yang perfeksionis Grape-kun ingin membuat direktori untuk memilah file gambar tersebut. Direktori tersebut dengan nama HewanDarat, HewanAmphibi, dan HewanAir. Setelah membuat direktori tersebut Grape-kun harus melakukan filter atau pemindahan file gambar hewan sesuai dengan tempat tinggal nya.\n* Setelah mengetahui hewan apa saja yang harus dijaga Grape-kun melakukan zip kepada direktori yang dia buat sebelumnya agar menghemat penyimpanan.\n\n**Catatan : untuk melakukan `zip` dan `unzip` tidak boleh menggunakan system**\n\n### Running Program\nUntuk compile dengan perintah sebagai berikut :\n```R\ngcc -0 binatang binatang.c -lcurl -lzip  \n```\nSetelah berhasil compile, maka jalankan dengan menggunakan command berikut :\n```R\n./binatang\n```\n\n### Problem Solving\nPertama, definisikan library yang akan digunakan untuk membuat sebuah program penyelesaian tersebut. Dalam kasus penyelesaian tersebut, saya menggunakan library antara lain :\n\n- `stdio.h`: library standar C yang menyediakan fungsi input/output standar seperti printf(), scanf(), dan lain-lain.\n- `curl/curl.h`: library untuk melakukan transfer data dengan protokol internet seperti HTTP, FTP, SMTP, dan lain-lain.\n- `stdlib.h`: library standar C yang menyediakan fungsi untuk manajemen memori seperti alokasi dan dealokasi memori, konversi tipe data, dan lain-lain.\n- `unistd.h`: library standar C yang menyediakan fungsi-fungsi sistem seperti sleep(), fork(), dan lain-lain.\n- `sys/wait.h`: library standar C yang menyediakan fungsi untuk mengatur proses seperti wait(), waitpid(), dan lain-lain.\n- `dirent.h`: library untuk mengakses direktori dan berkas-berkas yang ada di dalamnya.\n- `string.h`: library standar C yang menyediakan fungsi-fungsi pemrosesan string seperti strcpy(), strcat(), dan lain-lain.\n- `sys/stat.h`: library untuk mendapatkan informasi tentang status suatu berkas atau direktori seperti ukuran, waktu pembuatan, dan lain-lain.\n- `zip.h`: library untuk melakukan kompresi dan dekompresi berkas dalam format ZIP.\n- `time.h`: library untuk mengakses dan memanipulasi informasi waktu seperti tanggal, jam, dan lain-lain.\n- `sys/types.h`: library standar C yang menyediakan definisi tipe data umum seperti pid_t, size_t, dan lain-lain.\n- `errno.h`: library standar C yang menyediakan variabel errno untuk menangkap kesalahan sistem yang terjadi selama program berjalan.\n\n***Kemudian membuat 1 fungsi yaitu `int main ()` sebagai program utama dengan berbagai fungsi didalamnya yaitu :***\n\n#### ***Poin 1***\n```R\n// diubah menjadi docs karena pake wget dan no check-certif (non-aktif ssl/tls saat unduh lwt https)\nchar *srcf_download = \"wget --no-check-certificate 'https://docs.google.com/uc?export=download\u0026id=1oDgj5kSiDO0tlyS7-20uz7t20X3atwrq' -O binatang.zip\";\n// Perintah untuk download file dari link\nsystem(srcf_download);\n```\nUntuk hasil-nya seperti berikut :\n\n![dwnld](https://user-images.githubusercontent.com/91828276/227481705-c073c1c9-bbec-4be6-b513-27e765499258.png)\n\nPenjelasan : \n- Mendefinisikan perintah `download` menggunakan `char pointer` dengan nama variabel `srcf_download`\n- Menjalankan perintah `download` dengan menggunakan perintah `system` dan bantuan perintah `wget` dengan `URL Drive` diubah di-passing menjadi `URL Docs` untuk mengunduh file secara non-interaktif dari jaringan (tidak memerlukan interaksi/input user). Opsi `--no-check-certificate` pada perintah `wget` digunakan untuk menonaktifkan SSL/TLS saat melakukan pengunduhan.\n- `-O binatang.zip` merupakan argumen untuk menentukan nama file dari hasil download. Dalam hal ini, tentu nama yang akan disimpan yaitu sesuai dengan nama file pada drive yaitu `binatang.zip`.\n\n```R\nint pid, outStatus;\nCURL *myCurl; //req http ke server untuk download (wget)\nCURLcode resCurl; //def status hasil dari curl \nFILE *fiPo; //repr file (menyimpan hasil download)\n    \nsrand(time(NULL)); //inisiasi seed acak\n```\nPenjelasan : \n- `pid` sebagai Process ID yang dihasilkan oleh fungsi `fork()` nantinya\n- `outStatus` sebagai output status dari proses child yang dihasilkan oleh fungsi `waitpid()`\n- `myCurl` sebagai variabel untuk menyimpan pointer ke objek CURL, yang berfungsi untuk melakukan request HTTP menggunakan library curl\n- `resCurl` sebagai variabel hasil yang digunakan untuk menyimpan hasil status operasi yang dijalankan oleh objek CURL\n- `fiPo` sebagai representasi file pointer untuk menyimpan pointer ke file yang akan digunakan untuk menyimpan hasil download\n- `srand(time(NULL))` digunakan untuk inisiasi seed acak dengan menggunakan fungsi `srand()` dan memasukkan nilai `time(NULL)` sebagai parameter.\n\n```R\n// Unzip file hasil download\npid = fork(); //make child process\n   \nif (pid == 0) {\n    execlp(\"unzip\", \"unzip\", \"binatang.zip\", NULL); \n    exit(1);\n} else if (pid \u003e 0) {\n\twaitpid(pid, \u0026outStatus, 0);\n```\nUntuk hasil-nya seperti berikut :\n\n![unzip](https://user-images.githubusercontent.com/91828276/227487796-d5e7c298-d0c3-467b-b607-0eb4f66d4700.png)\n\nPenjelasan :\n- Membuat child proses dengan `pid = fork()`\n- Child proses digunakan untuk menjalankan perintah `unzip` pada file `binatang.zip` dengan `execlp()`. Jika gagal program akan terminate dengan `exit(1)`\n- Setelah child proses selesai, maka parent process akan menunggu hingga child process selesai dijalankan menggunakan fungsi `waitpid()` Fungsinya yaitu digunakan untuk menunggu hingga child process dengan pid yang diidentifikasi selesai dijalankan dan memberikan status keluaran (output) dari child process tersebut pada variabel `outStatus`\n\n```R\n//cek child process apakah clear (0 = sukses)\t\nif (WIFEXITED(outStatus) \u0026\u0026 WEXITSTATUS(outStatus) == 0) {\n   // pilih file gambar acak\n   DIR *dir;\n   struct dirent *itm; //item to dirent\n   char *imgName = malloc(sizeof(char) * 500); //size name img\n```\nPenjelasan :\n- `if (WIFEXITED(outStatus) \u0026\u0026 WEXITSTATUS(outStatus) == 0)` digunakna untuk Memeriksa status keluaran child process. WIFEXITED digunakan untuk memeriksa apakah child process telah berakhir, dan WEXITSTATUS digunakan untuk memeriksa status keluaran dari child process. Dalam hal ini, jika status keluaran dari child process sama dengan `0`, maka child process dianggap berhasil dan program akan melanjutkan ke tahap selanjutnya.\n- `DIR *dir` digunakan untuk membuat pointer untuk direktori yang akan diproses.\n- `struct dirent *itm`  digunakan untuk membuat pointer untuk item yang ditemukan dalam direktori.\n- `char *imgName = malloc(sizeof(char) * 500)` digunakan untuk membuat pointer `imgName` dengan alokasi memori sebesar `500 byte`. `imgName` akan menyimpan nama file gambar `acak` yang dipilih selanjutnya.\n\n```R\n//current dir\nchar *currDir = \".\"; \ndir = opendir(currDir);\nif (dir  == NULL) {\n\tperror(\"Gagal membuka direktori.\");\n\texit(1);\n    }\n```\nPenjelasan :\n- `char *currDir = \".\"` digunakan untuk mendefinisikan variabel `currDir` sebagai string dengan nilai `\".\"`, yang merupakan `direktori saat ini`.\n- `dir = opendir(currDir)` digunakan untuk membuka direktori yang diarahkan oleh variabel currDir menggunakan fungsi opendir. Fungsi ini akan mengembalikan pointer ke direktori yang telah dibuka.\n- `if (dir == NULL)` digunakan untuk memeriksa apakah pembukaan direktori berhasil. Jika dir sama dengan `NULL`, maka pembukaan direktori gagal dengan mengeluarkan pesan error `\"Gagal membuka direktori.\"` dan program terminate dengan `exit(1)`.\n\n```R\nif (dir != NULL) {\n        int fileCount = 0;\n        \n         while ((itm = readdir(dir)) != NULL) {\n             //menangkap hanya nama file ber-ekstensi .jpg\n             if (strstr(itm-\u003ed_name, \".jpg\") == NULL) {\n            \t continue;\n             }\n             //di generate random\n             if (rand() % ++fileCount == 0) {\n                 strcpy(imgName, itm-\u003ed_name);\n             }\n         } \n         closedir(dir);\n       } else {\n         perror(\"\");\n         return 1;\n       }\n```\nPenjelasan :\n- Kebalikan dengan kondisi sebelumnya, yaitu jika `dir != NULL` atau berhasil membuka direktori maka melakukan inisiasi variabel `fileCount` (untuk menyimpan jumlah file gambar) dengan nilai `0`\n- Kemudian dilakukan loop while untuk membaca `setiap item` di dalam direktori hingga tidak ada lagi item yang bisa dibaca.\n- Didalam loop, dilakukan pengecekan apakah nama file mengandung ekstensi `\".jpg\"`. Jika tidak, maka loop dilanjutkan ke item selanjutnya. Loop hanya menangkap file yang mengandung ekstensi `.jpg`\n- Setelah itu, jika file memiliki ekstensi \".jpg\", `increment nilai fileCount`, lalu dilakukan perhitungan random untuk menentukan apakah file tersebut akan dipilih. Jika file terpilih (nilai random adalah 0), maka nama file disalin ke variabel `imgName`.  \n- Setelah loop selesai, direktori ditutup dengan `closedir(dir)`.\n- Jika dir bernilai NULL (gagal membuka direktori), akan menampilkan pesan error dan mengembalikan nilai 1 (terminate).\n\n#### ***Poin 2***\n```R\n// Shift Grape-kun menjaga hewan\nprintf(\"Saat ini, Grape-kun melakukan penjagaan hewan : %s\\n\\n\", imgName);\n```\nUntuk hasil-nya seperti berikut :\n\n![rndmpick](https://user-images.githubusercontent.com/91828276/227487784-eb0bea9c-9577-445c-8af8-a2aa64125b0b.png)\n\nPenjelasan :\n- Setelah dipilih secara acak, pilihan yang telah dipilih tersebut `dicetak dalam console` dengan menggunakan `printf`\n\n#### ***Poin 3***\n```R\n//array habitat\nchar* jenisHewan[] = {\"HewanDarat\", \"HewanAmphibi\", \"HewanAir\"};   \n//sum elemen dalam jenisHewan\nint totalJenis = sizeof(jenisHewan) / sizeof(jenisHewan[0]); //ukuran total \n```\nPenjelasan : \n- Setelah berhasil memilih random, selanjutnya yaitu deklarasi array `jenisHewan` berisi tiga elemen yaitu `\"HewanDarat\"`, `\"HewanAmphibi\"`, dan `\"HewanAir\"`\n- Kemudian dilakukan `perhitungan jumlah elemen pada array jenisHewan` dengan cara menghitung `total ukuran array dalam byte (sizeof(jenisHewan))` **dibagi** dengan `ukuran tiap elemen (sizeof(jenisHewan[0]))`\n- Dengan cara ini, kita bisa mendapatkan jumlah total elemen pada array jenisHewan tanpa harus menghitung manual. Hasil perhitungan tersebut disimpan dalam variabel `totalJenis`\n\n```R\n// perulangan untuk cek direktori hewan\nfor (int idx = 0; idx \u003c totalJenis; idx++) {\n\t// inisiasi file/dir\n\tstruct stat FD = {};\n\t// cek kondisi direktori\n\tif (stat(jenisHewan[idx], \u0026FD) == -1) {\n\t\tif (mkdir(jenisHewan[idx], 0777) == -1) { // mode semua (rwx)\n\t\t\tprintf(\"Direktori gagal dibuat!\\n\");\n\t\t\texit(1);\n\t\t} else {\n\t\t\tprintf(\"Direktori %s berhasil dibuat! \\n\", jenisHewan[idx]);\n\t\t}\n\t}\n}\n```\nPenjelasan :\n- Setelah mendeklarasi array direktori, selanjutnya yaitu memeriksa direktori hewan dengan perulangan.\n- Didalamnya di-inisiasi filde/direktori variabel `FD` dengan `struct stat kosong`\n- Setelah itu melakukan cek kondisi direktori dengan menggunakan stat. Fungsi ini akan mengembalikan nilai `-1` jika tidak dapat membaca status dari direktori.\n- Jika direktori tidak ada, maka akan dibuat direktori baru menggunakan fungsi `mkdir` dengan mode akses `0777` (semua memiliki hak akses read, write, dan execute). Jika tidak berhasil dibuat, maka program akan mencetak pesan `\"Direktori gagal dibuat!\"` dan program keluar/terminate dengan exit status `1`\n- Sebaliknya, jika direktori berhasil dibuat, akan mencetak pesan `\"Direktori %s berhasil dibuat!\"` dengan nama direktori yang dibuat.\n\n**NB : Untuk membuat direktori tidak disertakan dokumentasi karena program hanya sekali jalan dari download hingga melakukan zipping, tetapi hanya ditampilkan berupa bukti pesan telah berhasil seperti berikut :*\n\n![mkdir](https://user-images.githubusercontent.com/91828276/227487791-57830c20-5601-4b6a-be32-07a3669238c5.png)\n\n```R\n// Pindahkan file-file hewan sesuai habitat nya (direktori-nya)\nsystem(\"find . -iname '*_darat.jpg' -exec mv -n {} HewanDarat/ \\\\;\");\nsystem(\"find . -iname '*_amphibi.jpg' -exec mv -n {} HewanAmphibi/ \\\\;\");\nsystem(\"find . -iname '*_air.jpg' -exec mv -n {} HewanAir/ \\\\;\");\nprintf(\"Bagus! Hewan berhasil dipindahkan sesuai jenisnya.\\n\\n\");\n        }\n}\n```\nPenjelasan :\n- Setelah direktori berhasil dibuat, langkah selanjutnya yaitu `meng-klasifikasikan` hewan sesuai dengan `jenisnya`\n- Klasifikasi dengan menggunakan bantuan `system` dan perintah `find` yang digunakan untuk mencari nama file dengan akhiran `'*_darat.jpg'`, `'*_amphibi.jpg'`, `'*_air.jpg'` pada direktori tempat program dijalankan. Kemudian dipindahkan sesuai jenisnya yaitu `HewanDarat/`, `HewanAmphibi/`, `HewanAir/`. Pemindahan file-file ini dengan bantuan perintah `mv` dan argumen `-n` yang digunakan tersebut bertujuan agar file tidak ditimpa jika file dengan nama yang sama sudah ada di direktori tujuan.\n- Terakhir jika proses pemindahan sudah selesai, akan mengeluarkan pesan `\"Bagus! Hewan berhasil dipindahkan sesuai jenisnya\"`\n\n**NB : Untuk meng-klasifikasikan/memindahkan sesuai direktori jenis juga tidak disertakan dokumentasi karena program hanya sekali jalan dari download hingga melakukan zipping, tetapi hanya ditampilkan berupa bukti pesan telah berhasil seperti berikut :*\n\n![pindahjenis](https://user-images.githubusercontent.com/91828276/227487792-9b6a1352-f3d9-41bd-993b-c072d7e50d0d.png)\n\n#### ***Poin 4***\n```R\n//fungsi zip menggunakan data pointer\nvoid zipDir(const char* dir_name) {\n            \n        pid_t pid;\n        int statPros;\n            \n        pid = fork(); // buat child proses\n\n        if (pid \u003c 0) {\n            fprintf(stderr, \"Yah Proses fork gagal!\\n\");\n            exit(EXIT_FAILURE);\n        } else if (pid == 0) {\n            // child process\n            char zip_name[100];\n            sprintf(zip_name, \"%s.zip\", dir_name);\n            execlp(\"zip\", \"zip\", \"-r\", zip_name, dir_name, NULL);\n            exit(EXIT_SUCCESS);\n        } else {\n            \n            // parent process\n            waitpid(pid, \u0026statPros, 0);\n```\nPenjelasan :\n- Setelah di-klasifikasikan sesuai dengan jenisnya, langkah selanjutnya yaitu melakukan `zip` pada ketiga direktori tersebut\n- Langkah awal yaitu membuat fungsi `zipDir` dengan satu argumen yaitu `dir_name` menggunakan `const char pointer`\n- Setelah itu mendeklarasikan variabel `pid` dengan tipe data `pid_t` dan variabel `statPros` dengan tipe data `int`\n- Kemudian membuat child proses dengan `pid = fork()`\n- Setelah membuat child proses, terdapat conditional statement dengan pernyataan jika `pid \u003c 0` maka kondisi gagal yang kemudian mengeluarkan pesan `\"Yah Proses fork gagal!\"` dan program akan selesai/terminate\n- Sebaliknya, jika kondisi `pid == 0` maka program akan berjalan dengan mendeklarasikan variabel `char zip_name[100]` dengan tipe data `char` dan berukuran `100`.\n- Setelah itu, `sprintf(zip_name, \"%s.zip\", dir_name)` akan menyalin `nama direktori (dir_name)` ke variabel `zip_name` dengan menambahkan ekstensi `.zip`\n- Kemudian terdapat proses `execlp(\"zip\", \"zip\", \"-r\", zip_name, dir_name, NULL)` yang digunakan untuk menjalankan perintah zip dengan argumen `-r (rekursif)` dan `nama file zip (zip_name)` yang ingin dicompress beserta direktorinya (dir_name).\n- Jika proses menjalankan perintah zip telah selesai maka program akan `exit(EXIT_SUCCESS)`\n- Kondisi sebaliknya, `waitpid(pid, \u0026statPros, 0)` menunggu child process selesai dieksekusi dengan menggunakan `waitpid` dan menyimpan status dari child process ke variabel `statPros`.\n\n```R\n // remove dir setelah zip\n    char rmvDir[100];\n    sprintf(rmvDir, \"rm -rf %s\", dir_name);\n    system(rmvDir);  \n        }\n}\n```\nPenjelasan :\n- Setelah proses zip selesai, dikarenakan pada perintah `agar menghemat penyimpanan`, maka dilakukan `remove` pada folder yang sebelumnya dilakukan `zip`.\n- Langkah awal yang dilakukan yaitu dengan mendeklarasikan variabel `rmvDir` sebagai array dengan panjang karakter `100` dan tipe data `char`.\n- Setelah itu, dalam `sprintf(rmvDir, \"rm -rf %s\", dir_name)` digunakan `sprintf` untuk memformat string ke variabel rmvDir. String ini akan berisi command `rm -rf` yang akan digunakan untuk menghapus direktori dengan nama yang disimpan di `dir_name`.\n- Dan pada akhirnya menggunakan bantuan `system(rmvDir)` untuk menjalankan command `rm -rf` untuk menghapus direktori yang disimpan di `dir_name`. Fungsi system digunakan untuk mengeksekusi command di dalam shell dan mengembalikan status hasil eksekusi.\n\n```R\n// def value dari dir_name\nchar dirDar[100] = \"HewanDarat\";\nchar dirAmp[100] = \"HewanAmphibi\";\nchar dirAir[100] = \"HewanAir\";\n\t   \n// zip semua dir\nzipDir(dirDar);\nzipDir(dirAmp);\nzipDir(dirAir);\n\nprintf(\"Selamat! Proses Zip folder berhasil.\\n\");\n\n    return 0;\n}\n```\nUntuk hasil-nya seperti berikut :\n\n**Tampilan ketika didalam folder linux :*\n\n![zipAll](https://user-images.githubusercontent.com/91828276/227489352-bc5135f0-dd44-4c57-adfe-a176fa7a682a.png)\n\n**Tampilan jika dibuka satu-per-satu dalam folder linux :*\n\n![zipDar](https://user-images.githubusercontent.com/91828276/227489371-fee3d8e4-738f-4585-86ff-80c48c954fee.png)\n\n![zipAmp](https://user-images.githubusercontent.com/91828276/227489363-ede5620d-95bc-4cc9-96d0-e5f205eacbd1.png)\n\n![zipAir](https://user-images.githubusercontent.com/91828276/227489339-3e91e239-5d38-4a8f-a244-fa02e50c519e.png)\n\n**Tampilan pesan console :*\n\n![zipCons](https://user-images.githubusercontent.com/91828276/227489411-05d85e48-c6ea-43d6-bfb5-9a9313ee851b.png)\n\nPenjelasan :\n- `char dir...[100] = \"Hewan...\"` merupakan variabel definisi dari argumen `dir_name` pada fungsi `zipDir`\n- `zipDir(...)` merupakan proses fungsi dijalankan setelah melewati conditional statements\n- Setelah proses zip selesai, akan mengeluarkan pesan `\"Selamat! Proses Zip folder berhasil\"` dan program selesai. \n\n***Thank you for visiting this repository, stay tuned for more projects!***\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafifiaan%2Flearn-processing-c","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frafifiaan%2Flearn-processing-c","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafifiaan%2Flearn-processing-c/lists"}