Memori · Pelajaran 12 dari 12
Proyek: pengolah data mahasiswa
12 menit baca · BelajarCode
Program ini membaca data mahasiswa, menyimpannya di memori dinamis, menghitung statistik IPK, lalu menampilkan peringkat.
Format masukan
Baris pertama berisi N, banyaknya mahasiswa. N baris berikutnya berisi NIM, IPK, dan nama (nama boleh mengandung spasi).
1#include <stdio.h>2#include <stdlib.h>3#include <string.h>45typedef struct {6 char nim[12];7 double ipk;8 char nama[50];9} Mahasiswa;1011int banding_ipk(const void *a, const void *b) {12 const Mahasiswa *x = a;13 const Mahasiswa *y = b;14 if (x->ipk < y->ipk) return 1;15 if (x->ipk > y->ipk) return -1;16 return strcmp(x->nama, y->nama);17}1819int baca_mahasiswa(Mahasiswa *m) {20 if (scanf("%11s %lf ", m->nim, &m->ipk) != 2) return 0;21 if (fgets(m->nama, sizeof(m->nama), stdin) == NULL) return 0;22 m->nama[strcspn(m->nama, "\n")] = '\0';23 return 1;24}2526int main(void) {27 int n;28 if (scanf("%d", &n) != 1 || n <= 0) return 1;2930 Mahasiswa *data = malloc(n * sizeof(Mahasiswa));31 if (data == NULL) return 1;3233 double total = 0;34 for (int i = 0; i < n; i++) {35 if (!baca_mahasiswa(&data[i])) {36 printf("Data ke-%d tidak valid\n", i + 1);37 free(data);38 return 1;39 }40 total += data[i].ipk;41 }4243 qsort(data, n, sizeof(Mahasiswa), banding_ipk);4445 printf("%-3s %-12s %-20s %s\n", "No", "NIM", "Nama", "IPK");46 for (int i = 0; i < n; i++) {47 printf("%-3d %-12s %-20s %.2f\n", i + 1, data[i].nim, data[i].nama, data[i].ipk);48 }49 printf("Rata-rata IPK: %.2f\n", total / n);5051 int pujian = 0;52 for (int i = 0; i < n; i++) {53 if (data[i].ipk >= 3.50) pujian++;54 }55 printf("IPK minimal 3.50: %d mahasiswa\n", pujian);5657 free(data);58 return 0;59}5 2410511001 3.42 Rizky Ananda 2410511002 3.88 Sinta Maharani 2410511003 2.95 Bagas Pratama 2410511004 3.88 Dewi Lestari 2410511005 3.61 Fajar Nugroho
No NIM Nama IPK 1 2410511004 Dewi Lestari 3.88 2 2410511002 Sinta Maharani 3.88 3 2410511005 Fajar Nugroho 3.61 4 2410511001 Rizky Ananda 3.42 5 2410511003 Bagas Pratama 2.95 Rata-rata IPK: 3.55 IPK minimal 3.50: 3 mahasiswa
Hal penting dari proyek ini
qsortdaristdlib.hmengurutkan array apa pun. Ia menerima fungsi pembanding yang mengembalikan bilangan negatif, nol, atau positif. Di sini IPK diurutkan dari besar ke kecil, dan nama dipakai sebagai penentu jika IPK-nya sama.- Parameter fungsi pembanding bertipe
const void *supayaqsortbisa dipakai untuk tipe data apa pun. Di dalam fungsi, pointer itu diubah keconst Mahasiswa *. - Format
"%11s %lf "membaca NIM paling banyak 11 karakter supaya tidak melewati batas array, lalu spasi di akhir format melewati spasi sebelum nama. Setelah itufgetsmembaca nama sampai akhir baris. - Memori dari
mallocdibebaskan di setiap jalan keluar program, termasuk saat masukannya tidak valid.
Cek pemahaman
Apa yang harus dikembalikan fungsi pembanding qsort jika elemen pertama harus berada sebelum elemen kedua?
Latihan
Cari berdasarkan NIM
Tambahkan fungsi Mahasiswa *cari_nim(Mahasiswa *data, int n, const char *nim) yang mengembalikan pointer ke mahasiswa dengan NIM tertentu, atau NULL jika tidak ditemukan. Uji dengan array kecil.
Pembahasan
1#include <stdio.h>2#include <string.h>34typedef struct {5 char nim[12];6 double ipk;7 char nama[50];8} Mahasiswa;910Mahasiswa *cari_nim(Mahasiswa *data, int n, const char *nim) {11 for (int i = 0; i < n; i++) {12 if (strcmp(data[i].nim, nim) == 0) return &data[i];13 }14 return NULL;15}1617int main(void) {18 Mahasiswa data[] = {19 {"2410511001", 3.42, "Rizky Ananda"},20 {"2410511002", 3.88, "Sinta Maharani"},21 };22 Mahasiswa *m = cari_nim(data, 2, "2410511002");23 if (m != NULL) printf("Ditemukan: %s, IPK %.2f\n", m->nama, m->ipk);24 if (cari_nim(data, 2, "9999999999") == NULL) printf("NIM 9999999999 tidak ditemukan\n");25 return 0;26}Ditemukan: Sinta Maharani, IPK 3.88 NIM 9999999999 tidak ditemukan
Fungsi mengembalikan pointer ke elemen di dalam array, sehingga pemanggil bisa langsung membaca atau mengubah data mahasiswa itu tanpa menyalinnya.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler C online.