--- title: TP_Modul4_Structs --- --- title: TP_Modul4_Structs --- # Tugas Pendahuluan Modul 4 - Structs ``` Nama : Hasan Abdullah Azzam NPM : 2406428314 ``` > Note: Soal Programming tidak perlu dicantumkan referensi, hanya soal Teori saja yang perlu referensi minimal 1. ## Teori ### 1. Bagaimana cara mendeklarasikan, menginisialisasi, dan mengakses anggota dari sebuah struct? (15 poin) --- **Deklarasi dan Inisialisai Struct** ```c struct Name { int member1 = 0; char member2 = 'A'; }; ``` untuk mendeklerasikanya kita bisa menggunakan kata kunci ***struct*** sebelum menentukan nama strukturnya, biasanya diawali oleh huruf kapital untuk nama structnya untuk memudahkan saat membedakanya dari variabel biasa. lalu untuk menginisialisaikanya, struct bisa menampung beberapa jenis tipe data, dan kita bisa mendeklarasikan isi dari tiap anggota didalam kurung kurawal `{}` selain cara ditas kita juga bisa menggunakkan typedef untuk membuat alias dari suatu struct, cara ini akan membuat lebih mudah dipahami saat membuat variabel dri struct tersebut **Mengakses Anggota** ```c Name.member1; Name.member2; ``` secara umum kita bisa mengakses secara langsung anggota dari suatu struct dengan menggunakan `.` sesuai dengan format tersebut. `Nama_struct.nama_anggota;` cara lain yaitu menggunakkan `->` untuk mengakses anggota dari suatu pointer struct ### Referensi: - GeeksforGeeks, “Structures in C,” GeeksforGeeks, Oct. 12, 2014. https://www.geeksforgeeks.org/structures-c/ . [Diakses: 02-Maret-2025] - Modul 9_Structure . [Diakses: 02-Maret-2025] - “struct Basics | C Programming Tutorial,” www.youtube.com. https://www.youtube.com/watch?v=dqa0KMSMx2w . [Diakses: 02-Maret-2025] ‌ ‌ --- ### 2. Jelaskan apa itu nested struct (struct dalam struct) dan bagaimana cara implementasinya! (10 poin) `(Note: Bisa menggunakan typedef agar struct jadi lebih ringkas)` di bahasa C kita bisa memasukkan suatu struct kedalam struct lainya, ini akan memudahkan kita saat mempunyai data yang cukup komplesk, sehingga bisa lebih mudah dan rapih dalam penyusunanya. Ada dua cara umum dalam mendeklarasikkan nested struct, - pertama, struct di buat terpisah, tetapi struct anak akan di inisialisasikan di dalam struct besar sehingga struct besar akan mempunyai anggota dari struck anak. ```C typedef struct{ int member_anak; }Anak; typedef struct{ int member_utama; Anak struct_anak; }Utama; int main(){ Utama tes; tes.struck_anak.member_anak = 10; // untuk mengakses anggota dari struct anak kita bisa menggunakkan 2 titik // format akses anggota nama_utama.nama_struct_anak.nama_anggota_anak; } ``` - kedua, struck anak akan di deklarasikkan didalam struck besar, tetapi jika menggunakan cara kedua ini, struck anak hanya bisa digunakkan didalam struck besarnya saja tidak bisa digunakkan di luar itu. ```c // dalam cara kedua kita tidak bisa menggunakkan typedef karena dalam bahasa c, tidak mendukung typedef didalam typedef sehingga kita menggunakkan struct biasa struct Utama{ int member_utama; struct Anak{ int member_anak; }anak; } // cara akses masih sama ``` sehingga untuk modularitas yang tinggi disarankan memdeklarasikkanya secara terpisah saja diluar. ### Referensi: - “Nested Structure in C with Examples,” GeeksforGeeks, Dec. 08, 2021. https://www.geeksforgeeks.org/nested-structure-in-c-with-examples/ . [Diakses: 03-Maret-2025] - AL-zami, “Nested structure in c,” Stack Overflow, Mar. 08, 2016. https://stackoverflow.com/questions/35869873/nested-structure-in-c . [Diakses: 03-Maret-2025] ‌ ‌ --- ### 3. Bagaimana cara mengirimkan struct sebagai parameter ke dalam fungsi (by value dan by reference)? Contohkan dengan singkat! (15 poin) ketika kita ingin mengirimkan struct ke dalam function, kita bisa mengirimkanya secara keseluruhan ataupun hanya salah satu anggota dari struct tersebut, tergantung kebutuhan dari function nya sendiri. jika hanya salah satu anggota dari struct, kita bisa mengirimkanya melalui cara variabel biasa, dan menyesuaikan dengan tipedata anggota. tetappi jika ingin mengirimkan keseluruhan dari struct nya kita bisa mengaturnya dalam paramter funstion sesuai dengan format yang ada. ```c void function(struct Nama_struct name){ name.anggota1 = 0; //mengakses anggota dari struct yang di passingkan kedalam function } //atau menggunakkan typedef void function(Nama_alias name){ name.anggota1 = 0; } ``` ### Referensi: - GeeksforGeeks, “How to Pass or Return a Structure To or From a Function in C?,” GeeksforGeeks, Feb. 23, 2023. https://www.geeksforgeeks.org/how-to-pass-or-return-a-structure-to-or-from-a-function-in-c/‌ . [Diakses: 03-Maret-2025] - “C Struct and Functions,” Programiz.com, 2020. https://www.programiz.com/c-programming/c-structure-function . [Diakses: 03-Maret-2025] ‌ ### 4. Apakah perbedaan dari metode akses anggota struct lewat titik (.) dibanding dengan panah (->)? (10 poin) perbedaan utama dari keduanya, `.` ataupun `->`, terletak pada bagaimana mereka digunakkan. . digunakkan ketika ingin mengakses anggota dari suatu struct secara langsung. sedangkan -> digunakkan untuj mengakses anggota melalui pointer. ```c struct Tes{ int member; } int main(){ struct Tes coba; coba.member = 10;// megakses member secara langsung struct Tes *tes = (struct Tes*) malloc (sizeof(struct Tes)); tes->member = 10;//megakses member dari suatu pointer return 0; } ``` ### Referensi: - GeeksforGeeks, “Structures in C,” GeeksforGeeks, Oct. 12, 2014. https://www.geeksforgeeks.org/structures-c/ . [Diakses: 03-Maret-2025] - Modul 9_Structure . [Diakses: 03-Maret-2025] ‌ --- ## Programming ### 5. Buatlah sebuah program yang dapat memanage data mahasiswa menggunakan array of structs dengan nested structs! (30 poin) #### Spesifikasi: - Program akan memberi opsi untuk menambahkan siswa baru atau menampilkan semua siswa yang ada dalam database - Boleh menggunakan array dengan dynamic memory allocation agar jumlah mahasiswa fleksibel, atau boleh juga menggunakan array dengan size 100 (max 100 mahasiswa) - Implementasikan nested structs untuk pemisahan data. * Struct `AkademikInfo` yang berisi: * Semester (int) * IPK (float / double) * Jurusan (string) Struct `PersonalInfo` yang berisi: * Nama (string) * NPM (string) * Alamat (string) Struct `Mahasiswa` yang berisi: * PersonalInfo (struct) * AkademikInfo (struct) * Kesibukan (string) Contoh: ``` Database Kuliah --------------- 1. Show Mahasiswa 2. Mahasiswa Baru 3. Exit 1 List Mahasiswa --------------- Database Kuliah --------------- 1. Show Mahasiswa 2. Mahasiswa Baru 3. Exit 2 Add Mahasiswa --------------- Data Personal: Nama : Theory NPM : 2307274500 Alamat : Jl M Kahfi II Jurusan : Teknik Elektro Semester : 4 IPK : 3.88 Kesibukan : Magang di BNI Mahasiswa ditambahkan! Database Kuliah --------------- 1. Show Mahasiswa 2. Mahasiswa Baru 3. Exit 2 Add Mahasiswa --------------- Data Personal: Nama : Hendy Bengkel NPM : 2408040201 Alamat : Bengkel Jurusan : Teknik Elektro Semester : 2 IPK : 2.1 Kesibukan : Bengkel Mahasiswa ditambahkan! Database Kuliah --------------- 1. Show Mahasiswa 2. Mahasiswa Baru 3. Exit 1 List Mahasiswa --------------- 1. Theory - 2307274500 Alamat: Jl M Kahfi II Jurusan: Teknik Elektro Semester 4 IPK 3.88 Kesibukan: Magang di BNI 2. Hendy Bengkel - 2408040201 Alamat: Bengkel Jurusan: Teknik Elektro Semester 2 IPK 2.1 Kesibukan: Bengkel Database Kuliah --------------- 1. Show Mahasiswa 2. Mahasiswa Baru 3. Exit 3 Program selesai! ``` Kode ```c #include <stdio.h> #include <stdlib.h> typedef struct{ int semester; float ipk; char jurusan[50]; }InfoAkademik; typedef struct{ char name[50]; char NPM[50]; char alamat[100]; }Identitas; typedef struct{ InfoAkademik data; Identitas ID; char kesibukkan[50]; }Mahasiswa; void printStruct(Mahasiswa *mhs){ printf("Nama/NPM : %s / %s\n", mhs->ID.name, mhs->ID.NPM); printf("Alamat : %s\n", mhs->ID.alamat); printf ("Jurusan : %s\n",mhs->data.jurusan); printf("Semester : %d\n", mhs->data.semester); printf("IPK : %.2f\n", mhs->data.ipk); printf("Kesibukkan : %s\n", mhs->kesibukkan); printf("------------------\n\n"); } void tampilkan(Mahasiswa *mhs, int jumlah){ printf("\ndaftar Mahasiswa\n"); printf("------------------\n"); if (jumlah == 0) { printf("\nDaftar Mahasiswa kosong.\n"); printf("------------------\n"); return; } for(int i = 0; i < jumlah; i++){ printf("Mahasiswa ke-%d:\n", i + 1); printStruct(mhs+i); } } void tambah(Mahasiswa **mhs, int *jml){ (*jml)++; *mhs = (Mahasiswa *)realloc(*mhs, (*jml) * sizeof(Mahasiswa)); if(*mhs == NULL){ printf("error"); return; } printf("\nSilahkan isi data berikut :\n"); printf("------------------\n"); printf("Nama : "); scanf(" %[^\n]", (*mhs)[*jml - 1].ID.name); printf("NPM : "); scanf(" %[^\n]", (*mhs)[*jml - 1].ID.NPM); printf("Alamat : "); scanf(" %[^\n]", (*mhs)[*jml - 1].ID.alamat); printf ("Jurusan : "); scanf(" %[^\n]", (*mhs)[*jml - 1].data.jurusan); printf("Semester : "); scanf(" %d", &(*mhs)[*jml - 1].data.semester); printf("IPK : "); scanf(" %f", &(*mhs)[*jml - 1].data.ipk); printf("Kesibukkan : "); scanf(" %[^\n]", (*mhs)[*jml - 1].kesibukkan); printf("------------------\n\n"); } int main(){ int option, jumlah = 0; Mahasiswa *mhs = (Mahasiswa *)malloc(sizeof(Mahasiswa)); if (mhs == NULL){ printf("error"); return 1; } while(1){ int cek = 0; printf("Database Mahasiswa\n"); printf("------------------\n"); printf("1. Tampilkan daftar Mahasiswa\n"); printf("2. Tambah Mahasiswa\n"); printf("3. Exit\n"); printf("masukkan pilihan anda : "); scanf(" %d", &option); switch(option){ case 1: tampilkan(mhs,jumlah); break; case 2: tambah(&mhs,&jumlah); break; case 3: cek = 1; break; default: printf("masukkan input yang sesuai!!"); } if(cek != 0){ break; } } printf("Program telah selesai, Terimakasih!!!"); free(mhs); return 0; } ... ``` SS Output Program Kalian : ![image](https://hackmd.io/_uploads/B1F-jLmikx.png)