How I wanna sorting arra struct inside struct. This is my code. I already changed struct student to array. kelas=node. I want to use qsort but I don't know what to do.
Code:
#include <stdio.h>#include <stdlib.h>
#include <conio.h>
#include <string.h>
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();
}
static int sortByName(const void *a,const void *b)
{
mhs *ia = (mhs*)a;
mhs *ib = (mhs*)b;
return strcmp(ia->nama, ib->nama);
}
static int sortByNim(const void *a,const void *b)
{
const mhs *ia = a;
const mhs *ib = b;
return strcmp(ia->nim, ib->nim);
}
static int sortByAngkatan(const void *a,const void *b)
{
mhs *ia = (mhs *)a;
mhs *ib = (mhs *)b;
return (ia->angkatan-ib->angkatan);
}
static int sortByIpk(const void *a,const void *b)
{
mhs *ia = (mhs *)a;
mhs *ib = (mhs *)b;
return (int)(ib->ipk-ia->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 kelasku[40];
char tambahKelas[21],masukKelas[21];
int pil;
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:
qsort(mhs,40,sizeof(mhs),sortByNim);
printList();
default:
break;
}
}while(pil>=1&&pil<4);
freeMemory();
return 0;
}
I already tried to change function insertmhsto be like this
Code:
int insertMhs(mhs *kelasku, char *masukKelas)
{
kelas *itr = phead;
if(itr->jml<40)
{
int jumlah;
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;
int jmlMhs;
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);
jmlMhs=itr->jml;
strcpy(itr->mhs[jmlMhs].nama,namaMhs);
strcpy(itr->mhs[jmlMhs].nim,nimMhs);
itr->mhs[jmlMhs].angkatan=angkatanMhs;
itr->mhs[jmlMhs].ipk=ipkMhs;
itr->jml++;
}
}
}
else printf("Jumlah Mahasiswa yang anda masukkan sudah terlalu banyak");
getch();
}
This is how I called it in main
Code:
case 2:
printf("Memasukkan ke kelas\t:");getchar();fgets(masukKelas,21,stdin);
int jumlah;
if(cocokKelas(masukKelas)==1)
insertMhs(kelasku,masukKelas);
case 4:
structlen=sizeof(kelasku)/sizeof(mhs);
qsort(kelasku,structlen,sizeof(mhs),sortByName);
printList();
getch();
break;