#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

int jumlah_siswa, iterasi,iterasi_level,metode,dataterisi=0;;
char tombol,tempnama[30];

struct smahasiswa
 {
  char nama[30];
  double level;
  float nilai_ipk;
 } mahasiswa[10];

void hitunglevel()
{
 mahasiswa[iterasi].level=0;
 for(iterasi_level=0;iterasi_level<strlen(mahasiswa[iterasi].nama);iterasi_level++)
 {
  mahasiswa[iterasi].level+=mahasiswa[iterasi].nama[iterasi_level]*pow(10,64-(iterasi_level*2));
 }
}

void tukar(int dari, int ke)
{
 float temp_nilai_ipk;
 double temp_level;
 temp_nilai_ipk=mahasiswa[dari].nilai_ipk;
 mahasiswa[dari].nilai_ipk=mahasiswa[ke].nilai_ipk;
 mahasiswa[ke].nilai_ipk=temp_nilai_ipk;

 temp_level=mahasiswa[dari].level;
 mahasiswa[dari].level=mahasiswa[ke].level;
 mahasiswa[ke].level=temp_level;

 strcpy(tempnama,mahasiswa[dari].nama);
 strcpy(mahasiswa[dari].nama,mahasiswa[ke].nama);
 strcpy(mahasiswa[ke].nama,tempnama);
}


void ANama()
{
 for (iterasi=0;iterasi<jumlah_siswa-1;iterasi++)
 {
  for (iterasi_level=iterasi+1;iterasi_level<jumlah_siswa;iterasi_level++)
  {
   if (mahasiswa[iterasi].level>mahasiswa[iterasi_level].level)
   {
    tukar(iterasi,iterasi_level);
   }
  }
 }
}

void DNama()
{
 for (iterasi=0;iterasi<jumlah_siswa-1;iterasi++)
 {
  for (iterasi_level=iterasi+1;iterasi_level<jumlah_siswa;iterasi_level++)
  {
   if (mahasiswa[iterasi].level<mahasiswa[iterasi_level].level)
   {
    tukar(iterasi,iterasi_level);
   }
  }
 }
}

void AIPK()
{
 for (iterasi=0;iterasi<jumlah_siswa-1;iterasi++)
 {
  for (iterasi_level=iterasi+1;iterasi_level<jumlah_siswa;iterasi_level++)
  {
   if (mahasiswa[iterasi].nilai_ipk>mahasiswa[iterasi_level].nilai_ipk)
   {
    tukar(iterasi,iterasi_level);
   }
  }
 }
}

void DIPK()
{
 for (iterasi=0;iterasi<jumlah_siswa-1;iterasi++)
 {
  for (iterasi_level=iterasi+1;iterasi_level<jumlah_siswa;iterasi_level++)
  {
   if (mahasiswa[iterasi].nilai_ipk<mahasiswa[iterasi_level].nilai_ipk)
   {
    tukar(iterasi,iterasi_level);
   }
  }
 }
}

void metode_apa()
{
 if (dataterisi==0)
 {
  printf("\nAnda belum memiliki data !");
  getch();
 } else
 {
  metode=0;
  printf("\nData akan di sort : Nama/IPK [N/I] : ");
  do tombol=getch(); while ((_toupper(tombol)!='N') && (_toupper(tombol)!='I'));
  printf("%c",_toupper(tombol));
  if (_toupper(tombol)=='N') metode+=1; else metode+=2;
  printf("\nPilih metode sort : Ascending/Descending ? [A/D] : ");
  do tombol=getch(); while ((_toupper(tombol)!='A') && (_toupper(tombol)!='D'));
  printf("%c",_toupper(tombol));
  if (_toupper(tombol)=='A') metode+=4; else metode+=8;
  if (metode==5) ANama();
  if (metode==9) DNama();
  if (metode==6) AIPK();
  if (metode==10) DIPK();
 }
}

void tampilkandata()
{
 if (dataterisi==0) printf("\nMaaf, anda belum memiliki data !"); else
 {
  printf("\n-------NAMA-------------------------------IPK-----");
  for(iterasi=0;iterasi<jumlah_siswa;iterasi++)
  {
   printf("\n| %2d. %s",iterasi+1,mahasiswa[iterasi].nama);
   gotoxy(38,wherey());printf("|  %5.2f    |",mahasiswa[iterasi].nilai_ipk);
  }
 }
  printf("\n--------------------------------------------------");
 printf("\nTekan sembarang tombol !");
 getch();
}

void masukaninput()
{
 printf("\nmasukan jumlah mahasiswa [2..10] : "); scanf("%d",&jumlah_siswa);
 gets(mahasiswa[0].nama);
 for (iterasi=0;iterasi<jumlah_siswa;iterasi++)
 {
  printf("masukan nama  mahasiswa ke %d : ",iterasi+1);
  gets(mahasiswa[iterasi].nama);
  fflush(stdin);
  printf("masukan nilai mahasiswa ke %d : ",iterasi+1);
  scanf("%f", &mahasiswa[iterasi].nilai_ipk);
  fflush(stdin);
  hitunglevel();
  dataterisi=1;
 }
}


void main()
{
 char pilihan;
 do
 {
  clrscr();
  masukaninput();
  metode_apa();
  tampilkandata();
  printf("\nMau Lagi ? [Y/T]");
  do
   pilihan=getch();
  while ((toupper(pilihan)!='Y') && (toupper(pilihan)!='T'));
 }
 while (pilihan!='T');

}