Prácticas y Ejercicios con Solución
Prácticas resueltas y Ejercicios con solución de programación en c, El enunciado de las prácticas y ejercicios que se plantea es el siguiente: realizar una práctica o ejercicio en la que se soliciten números de la lotería de 3 dígitos y a continuación se visualicen los principios de números que mas han salido, los finales de números que mas han salido, así como unidades, centenas y decenas, el ejercicio se ha intentado resolver utilizando vectores y un método de ordenación denominado hundimiento o burbuja.
La solución de los ejercicios que se plantean es la siguiente:
// El siguiente programa solicitado por un usuario del blog
// www.aprendoencasa.com al cual agradecemos mucho su visita tiene
// el siguiente enunciado: realizar una práctica en la que se soliciten
// números de lotería por pantalla, los cuales han de tener tres dígitos
// cada uno, para finalizar se ha de teclear el numero 0, y una vez
// solicitados todos los números se han de visualizar por pantalla
// los pares iniciales de números que mas han salido, los pares finales
// de números que más han salido, así como las unidades, decenas y centenas.
// Agradecemos el planteamiento de los ejercicios con solución propuesto
// y esperamos que os animéis a plantear nuevas soluciones en
// aprendoencasa.com
// Se ha de tener en cuenta que el programa no tiene en cuenta
// números con tres dígitos como 001, 002, 045. ya que se considera
// que los ceros a la izquierda no tienen efecto. Si se quisiera
// reflejar también estos números este programa que utiliza calculo
// matemático no serviría y habría que adaptarlo para que solicitase
// los números en formato de cadena en vez de numérico. También se
// podría utilizar memoria dinámica para una mejor optimización.
// Vuelvo a repetir que en muchas ocasiones la optimización del código
// puede ser mucho mejor e incluso emplear menos ordenes para realizar
// acciones concretas, pero como también utilizo muchas veces los
// ejercicios que realizo para que mis alumnos practiquen, insisto
// demasiado en utilizar o repetir ciertas ordenes para reforzar sus
// conocimientos de las mismas.
#include <stdio.h>
#include <stdlib.h>
void Funcion_Ordenar(int [],int);
int main(int argc, char *argv[])
{
// Vectores donde almacenar los resultados
int Inicios[99];
int Finales[99];
int Unidades[10];
int Decenas[10];
int Centenas[10];
// variables a utilizar por el programa
int Numero; // Numero que se solicita
int Contador; // variable auxiliar para bucles
int Contador2; // variable auxiliar para bucles
int Auxiliar; // variable auxiliar para cálculos y bucles
int error=0; // variable para controlar errores
int Inicio=0; // variable que almacena los dos dígitos iniciales
int Final=0; // variable que almacena los dos dígitos finales
// Inicializar los vectores a valores 0
for(Contador=0;Contador<100;Contador++) {
Inicios[Contador]=0;
Finales[Contador]=0;
if(Contador<10) {
Unidades[Contador]=0;
Decenas[Contador]=0;
Centenas[Contador]=0;
}
}
// Solicitar un numero hasta que se teclee 0 para finalizar
do {
// solo se aceptan números de tres valores
do {
// se inicializa la variable de error a cero
error=0;
// se visualiza el titulo de petición del numero
printf("Numero:");
// se solicita el numero
scanf(" %d",&Numero);
// se comprueba si el numero esta en el rango correcto
// en caso de ser incorrecto se cambia el valor de la variable
// error para que el numero se vuelva a solicitar sin tenerlo en
// cuenta para las estadísticas
if((Numero<100 || Numero>999) && Numero!=0) error=1;
// la condición de repetición es hasta que se teclee un valor cero
// en el numero
} while(error!=0);
// si se llega a este punto el numero es correcto y se
// realizan las estadísticas necesarias siempre y cuando el
// numero no sea cero
if(Numero!=0) {
// Se extrae el inicio del numero
Inicio = Numero / 10 ;
//printf("\nInicio %d",Inicio);
// Se extrae el final del numero
Final = Numero % 100 ;
//printf(" Final %d",Final);
// Se almacena el inicio en las estadísticas de inicio
Inicios[Inicio]++;
// Se almacena el final en las estadísticas de final
Finales[Final]++;
// Unidades, Decenas y Centenas guardar las estadísticas
Auxiliar = Numero / 100 ;
Centenas[Auxiliar]++;
//printf(" Centenas %d",Auxiliar);
Auxiliar = Numero % 100 ;
Auxiliar = Auxiliar / 10 ;
Decenas[Auxiliar]++;
//printf(" Decenas %d",Auxiliar);
Auxiliar = Numero % 10 ;
Unidades[Auxiliar]++;
//printf(" Unidades %d\n",Auxiliar);
}
} while(Numero!=0);
// Visualizar Ordenaciones realizadas
printf("\nPares Iniciales\n");
Funcion_Ordenar(Inicios,1);
printf("\nPares Finales\n");
Funcion_Ordenar(Finales,1);
printf("\nUnidades\n");
Funcion_Ordenar(Unidades,0);
printf("\nDecenas\n");
Funcion_Ordenar(Decenas,0);
printf("\nCentenas\n");
Funcion_Ordenar(Decenas,0);
printf("\n");
system("PAUSE");
return 0;
}
// Función para ordenar
void Funcion_Ordenar(int Vector[],int Tipo)
{
// Matriz para ordenar
int Ordenar[99][2];
int Contador; // variable auxiliar para bucles
int Contador2; // variable auxiliar para bucles
int Auxiliar=0;
int error=0;
int cuantos=0;
// Controlar el tipo de vector recibido
if (Tipo==1) cuantos=100; else cuantos=10;
// Inicializar la matriz para ordenar
for(Contador=0;Contador<100;Contador++) {
Ordenar[Contador][0]=0; // posición que almacenara el numero
Ordenar[Contador][1]=0; // posición que almacenara sus repeticiones
}
// Ordenar los números de inicio
// Traspasar los inicios a la matriz de ordenar
Auxiliar=0;
for(Contador=0;Contador<cuantos;Contador++) {
// Si el numero ha salido se traspasa a la matriz de ordenar
if(Vector[Contador]>0) {
Ordenar[Auxiliar][0] = Contador;
Ordenar[Auxiliar][1] = Vector[Contador];
Auxiliar++;
}
}
// Ordenar el vector utilizando el sistema de hundimiento o burbuja
for(Contador2=cuantos-1;Contador2>0;Contador2--) {
for(Contador=0;Contador<Contador2;Contador++) {
if(Ordenar[Contador][1]<Ordenar[Contador+1][1]) {
Auxiliar = Ordenar[Contador][0] ;
Ordenar[Contador][0] = Ordenar[Contador+1][0];
Ordenar[Contador+1][0] = Auxiliar;
Auxiliar = Ordenar[Contador][1] ;
Ordenar[Contador][1] = Ordenar[Contador+1][1];
Ordenar[Contador+1][1] = Auxiliar;
}
}
}
// Visualizar el vector ordenado
for(Contador=0;Contador<cuantos;Contador++) {
if(Ordenar[Contador][1]!=0)
printf("\n%d - %d",Ordenar[Contador][0],Ordenar[Contador][1]);
}
}
El resultado del ejercicio con unos pocos valores es el siguiente:
Gracias por vuestra visita y un saludo!!!