#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);
}