#include <stdio.h>
#define MAX 6
 
 
 
void RevisarFinDatos (int* haydatos)
{
    char rta;
    do{
        fflush(stdin);
        printf("Desea ingresar dato? (S/N)");
        scanf("%c", &rta);
    }
    while(rta == 'S' && rta == 'N');
        *haydatos = 1;
    if(rta == 'N') {
        *haydatos = 0;
    }
}
 
void IngresarOrden (char *orden1,char *orden2){
    do
    {
        fflush(stdin);
        printf("Ingrese 'A' si desea que el orden de salida de datos sea ascendente o 'D' si desea que sea descendente");
        scanf("%c", orden1);
    }
    while(*orden1 != 'A' && *orden1 != 'D');
 
 
 
    do{
        fflush(stdin);
        printf("Ingrese 'M' si desea que se muestren los 5 mayores o 'E' si desea que se muestren los 5 menores");
        scanf("%c", orden2);
    }
    while(*orden2 != 'M' && *orden2 != 'E');
}
 
 
void PrimerIngreso (int* continuar,char* orden1,char* orden2)
{
    RevisarFinDatos(continuar);
    if(*continuar == 1){
        IngresarOrden (orden1, orden2);
    }
}
 
 
void MostrarRanking(char orden1,int A[],int CE)
{
    int i;
    if(CE != 0){
        if(orden1 == 'A'){
            for(i = 0; i == CE-1; i++){
                printf("%d", &A[i]);
            }
        }
        else
        {
            for(i = CE-1; i == 0; i--){
                printf("%d", &A[i]);
            }
        }
    }
    else
    {
        printf("No se ingresaron numeros");
    }
}
 
 
void Ranking (int dato,char orden2,int A[], int* CE)
{
int i;
if(orden2 == 'M'){
    i = *CE-1;
    while(i >= 0) {
        if(A[i] < dato ){
            A[i+1] = A[i];
            i = i-1;
        }
    }
 
 
    A[i+1] = dato;
    if(*CE < MAX-1){
        *CE++;
    }
    else
    {
        i = *CE-1;
    }
    while(i >= 0) {
        if(A[i] > dato ){
            A[i+1] = A[i];
            i--;
        }
    }
    A[i+1] = dato;
    if(*CE < MAX-1){
        *CE++;
    }
}
}
 
 
void IngresarEnteroPositivo(int* N)
{
    do
    {
        fflush(stdin);
        printf("Ingrese entero positivo");
        scanf("%d", N);
    }
    while(*N <= 0);
}
 
 
 
void Porcentaje (int total, int es)
{
    int h = es*100/total;
    if (total != 0) {
        printf("El porcentaje de numeros perfectos es %d", h);
    }
    else{
        printf("No se procesaron numeros");
    }
 
 
}
 
 
int EsSemiperfecto(int n)
{
    int i;
    int suma = 0;
    int es = 0;
    for(i = n; i >= 1; i--){
        if(n % i == 0)
        {
            suma=suma+n;
            if(suma > n)
            {
            suma=suma-n;
            }
        }
    }
    if(suma == n)
    {
        es = 1;
    }
    return es;
}
 
 
void main()
{
                int ce = 0;
                int total = 0;
                int es = 0;
                int continuar;
                int salida[MAX];
                char orden1;
                char orden2;
                int N;
                int CE;
 
                PrimerIngreso(&continuar, &orden1, &orden2);
 
 
                while (continuar != 0)
                {
 
 
                    IngresarEnteroPositivo(&N);
                    total++;
                    if (EsSemiperfecto(N)){
                        Ranking(N, orden2, salida, &CE);
                        es++;
                    }
                    RevisarFinDatos(&continuar);
                }
                MostrarRanking(orden1, salida, CE);
                Porcentaje(total, es);
}