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).

C
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}
Pengolah data mahasiswa
Masukan
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
Keluaran
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

  • qsort dari stdlib.h mengurutkan 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 * supaya qsort bisa dipakai untuk tipe data apa pun. Di dalam fungsi, pointer itu diubah ke const 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 itu fgets membaca nama sampai akhir baris.
  • Memori dari malloc dibebaskan 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.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler C online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi