Code:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define SWAP(a,b) { int t; t=a; a=b; b=t; } // Macro for swapping
typedef struct mhs mhs;
typedef struct kelas kelas;
struct mhs
{
char nama[31];
char nim[16];
int angkatan;
float ipk;
};
struct kelas
{
char kls[13];
int jml;
mhs mhs[40];
kelas *next;
};
kelas *head;
kelas *phead;
int nodeKelas;
void init()
{
head=NULL;
nodeKelas=0;
}
int menu()
{
int pil;
printf("\t\t------------------------\n");
printf("\t\t|Program Data Mahasiswa|\n");
printf("\t\t------------------------\n\n\n");
printf("1. Menambah kelas\n");
printf("2. Memasukkan data mahasiswa\n");
printf("3. Menghapus data mahasiswa\n");
printf("4. Input data dari file\n");
printf("5. Tulis ke dalam file\n");
printf("Masukkan pilihan anda\t: ");scanf("%d",&pil);
return pil;
}
void insertKelas(char *klas)
{
kelas *newNode=malloc(sizeof(kelas));
if(newNode != NULL)
{
strcpy(newNode->kls,klas);
newNode->jml=0;
newNode->next=head;
head=newNode;
nodeKelas++;
}
else printf("Gagal menambah kelas");
getch();
}
int cocokKelas(char *klas)
{
kelas *itr = head;
while (itr != NULL)
{
if(strcmp(itr->kls,klas)==0)
{
phead=itr;
return 1;
}
else itr=itr->next;
}
}
int insertMhs(char *nama,char *nim,int angkatan,float ipk)
{
kelas *itr = phead;
if(itr->jml<40)
{
int jmlMhs;
jmlMhs=itr->jml;
strcpy(itr->mhs[jmlMhs].nama,nama);
strcpy(itr->mhs[jmlMhs].nim,nim);
itr->mhs[jmlMhs].angkatan=angkatan;
itr->mhs[jmlMhs].ipk=ipk;
itr->jml++;
}
else printf("Jumlah Mahasiswa yang anda masukkan sudah terlalu banyak");
getch();
}
void bubble_srt( int *a, int n )
{
int i, j;
for(i = 0; i < n; i++) // Make a pass through the array for each element
{
for(j = 1; j < (n-i); j++) // Go through the array beginning to end
{
if(a[j-1] > a[j]) // If the the first number is greater, swap it
SWAP(a[j-1],a[j]);
}
}
}
int sortByName(const void *a,const void *b)
{
kelas *ia = (kelas*)a;
kelas *ib = (kelas*)b;
return strcmp(ia->mhs->nama, ib->mhs->nama);
}
int sortByNim(const void *a,const void *b)
{
kelas *ia = (kelas *)a;
kelas *ib = (kelas *)b;
return strcmp(ia->mhs->nim, ib->mhs->nim);
}
int sortByAngkatan(const void *a,const void *b)
{
kelas *ia = (kelas *)a;
kelas *ib = (kelas *)b;
return (ia->mhs->angkatan - ib->mhs->angkatan);
}
int sortByIpk(const void *a,const void *b)
{
kelas *ia = (kelas *)a;
kelas *ib = (kelas *)b;
return (int)(ib->mhs->ipk - ia->mhs->ipk);
}
void printList()
{
kelas *itr = head;
while (itr != NULL)
{
printf("Kelas\t: %s",itr->kls);
printf("Jumlah\t: %d\n\n",itr->jml);
int i;
for(i=0;i<itr->jml;i++)
{
printf("\t%d. Nama\t: %s\n",i+1, itr->mhs[i].nama);
printf("\t NIM\t: %s\n",itr->mhs[i].nim);
printf("\t Angkatan\t: %d\n",itr->mhs[i].angkatan);
printf("\t IPK: %.2f\n\n",itr->mhs[i].ipk);
}
itr = itr->next;
}
}
void freeMemory()
{
kelas *deleteNode;
while (head != NULL)
{
deleteNode = head;
head = head->next;
free(deleteNode);
}
}
int main()
{
mhs *mhs;
kelas *kelas;
char tambahKelas[21],masukKelas[21];
int pil;
size_t structlen;
init();
do
{
system("CLS");
pil=menu();
switch (pil)
{
case 1:
printf("Menambah kelas\t:");getchar();fgets(tambahKelas,21,stdin);
insertKelas(tambahKelas);
break;
case 2:
printf("Memasukkan ke kelas\t:");getchar();fgets(masukKelas,21,stdin);
int jumlah;
if(cocokKelas(masukKelas)==1)
do
{
printf("Jumlah mahasiswa yang ingin anda masukkan di kelas %s\t",masukKelas);scanf("%d",&jumlah);
if (jumlah>40) printf("Jumlah mahasiswa yang ingin anda masukkan terlalu banyak");
else if (jumlah<=0) printf("Jumlah mahasiswa yang ingin anda masukkan tidak valid");
else
{
int i,angkatanMhs;
char namaMhs[31],nimMhs[16];
float ipkMhs;
for(i=0;i<40&&i<jumlah;i++)
{
printf("%d. Nama\t: ",i+1);getchar();fgets(namaMhs,30,stdin);
printf(" NIM\t: ");fgets(nimMhs,15,stdin);
printf(" Angkatan\t: ");scanf("%d",&angkatanMhs);
printf(" IPK\t: ");scanf("%f",&ipkMhs);
insertMhs(namaMhs,nimMhs,angkatanMhs,ipkMhs);
}
}
}while(jumlah>40&&jumlah<=0);
break;
case 3:
printList();
getch();
break;
case 4:
structlen=sizeof(kelas)/sizeof(mhs)[0];
qsort(kelas,structlen,sizeof(mhs),sortByName);
//kelas->mhs->angkatan=bubble_srt(&kelas->mhs->angkatan,4);
printList();
getch();
break;
default:
break;
}
}while(pil>=1&&pil<4);
freeMemory();
return 0;
}
And also why when I wanna use fgets I need to put getchar before it? If I not do it, my program will directly read it as "\n".