Mostrando entradas con la etiqueta problema. Mostrar todas las entradas
Mostrando entradas con la etiqueta problema. Mostrar todas las entradas

jueves, 17 de diciembre de 2020

Subconjunto ordenado de array

El siguiente ejemplo pide ingresar una lista de números positivos y guardarlos en un array, para luego leerlos y copiar a otro array de forma ordenada sólo aquellos que son múltiplos de 5.

Un ejemplo de ejecución:



¿Qué cambiarías en el programa para que extraiga los múltiplos de otro número?

¿Qué cambiarías para que el orden sea ascendente?

¿Qué otras variaciones añadirías al programa?


#include <iostream>

int main(int argc, char** argv) {

int fin = 0;

int numero;

int listaNumeros[20];

int totalNumeros = 0;

int listaOrdenada[20];

int totalOrdenada = 0;

//lectura por teclado de un conjunto de números positivos, como máximo 20 números

while(!fin && totalNumeros<20){

printf("ingrese un numero:");

scanf("%d", &numero);

if(numero > 0) {

listaNumeros[totalNumeros] = numero;

totalNumeros++;

}else{

fin++;

}

}

//imprimir la lista

for(int i = 0; i<totalNumeros; i++) printf("%d ", listaNumeros[i]);

//seleccionar los múltiplos de 5 ordenados descendente

for(int i = 0; i<totalNumeros; i++){

if( (listaNumeros[i]%5) == 0 ){

int encuentra = 0;

int indice; //indice que recorre la lista ordenada para encontrar la posición donde insertar

int multiploInsertar = listaNumeros[i];//número a insertar en la lista ordenada

indice = totalOrdenada - 1;

//recorremos la lista ordenada de forma descendente y vamos desplazando hasta qu encontramos la posición correcta

while(!encuentra && indice >= 0){

//comparo el número a ubicar con el elemento en la ListaOrdenada en la posición índice

if(multiploInsertar > listaOrdenada[indice]){

//como es mayor muevo el valor de lista ordenada al siguiente índice

listaOrdenada[indice + 1 ] = listaOrdenada[indice];

}

else{

listaOrdenada[indice+1] = multiploInsertar;

totalOrdenada++;

encuentra = 1;

}

indice--;

}

if(!encuentra) {//en el caso que recorra todo el arrayOrdenado y sea mayor a todos, se coloca en el primer elemento

listaOrdenada[0] = multiploInsertar;

totalOrdenada++;

}


}

}

//imprimir la lista

printf("\nNumero de multiplos encontrados %d\n", totalOrdenada);

for(int i = 0; i<totalOrdenada; i++) printf("%d ", listaOrdenada[i]);

return 0;

}

lunes, 14 de diciembre de 2020

Problema de los rombos

El siguiente problema lo he venido encontrado a menudo en diferentes clases, el objetivo es el correcto manejo de la sentencia FOR y el printf.

Lo que busca es ingresar el valor de un número que representa el lado de un rombo e imprimir en pantalla el rombo. un ejemplo de ejecución:


Lo he resuelto utilizando un función para imprimir cada línea, de esta forma el programa me parece más ordenado.

Os dejo el código:

#include <iostream>

void imprimirFila(int fila, int lado)

{

//calculo de fila en el caso de estar en el triangulo inferior

if(fila>lado) fila = (lado * 2) - fila;

//calcular el número de blancos a imprimir

int blancos = (lado * 2) - fila;

//calcular el número de caracteres a imprimir

int impreso = (fila * 2) - 1;

//impresion de blancos

for(int i=1; i<=blancos; i++) printf(" ");

//impresion de caracteres

for(int i=1; i<=impreso; i++) printf("X");

//imprime salto de linea

printf("\n");

}


int main(int argc, char** argv) {

//ingresa el valor del rombo

int lado = 0;

printf("ingrese el lado del rombo:");

scanf("%d", &lado);

printf("el valor del lado ingresado es: %d\n", lado);

//calculamos el número de lineas a imprimir

int lineas = (lado * 2) - 1;

//un for para imprimir cada linea

for(int fila = 1; fila<=lineas; fila++)

{

imprimirFila(fila, lado);

}

return 0;

}



jueves, 10 de enero de 2013

¿Por dónde empiezo?

Antes de empezar a programar se debe "Plantear el problema"


Para plantear el problema debemos preguntar 3 cosas (en este orden):
1. ¿Qué quiero conseguir?
2. ¿Qué tengo para conseguirlo?
3. ¿Cómo lo hago?

Nuestro problema es una caja que recibe información, la procesa y retorna un resultado.



Ejemplo. Hacer un programa que calcule el área de un cuadrado

1. ¿Qué quiero conseguir? El área de un cuadrado (en m2)
2. ¿Qué tengo para conseguirlo? La medida del lado de un cuadrado (en m)
3. ¿Cómo lo hago? Utilizo la fórmula de cálculo de área: área = lado al cuadrado



L es una variable, que puede tomar muchos valores, pero sea el valor que sea, la caja devolverá el área A calculada en función al lado L.

Implementación del ejemplo




f: función que calcula el área a la que llamaremos calcular_area.
L: parámetro de entrada de la función, contiene un valor numérico (puede tener decimales).
A: variable de salida, contiene un valor numérico (puede tener decimales).

En C, la estructura de definición de una función es la siguiente:

//¿Qué tengo? nombre_parametro1
tipo nombre_función ( tipo nombre_parametro1, ... )
{
      tipo nombre_variable_retorno;
      //¿Cómo lo hago?
      //aquí se hacen los cálculos

      //¿Qué quiero?
      return nombre_variable_retorno;
}

para el problema del ejemplo sería:

//¿Qué tengo? L
float calcular_area ( float L )
{
     float A;
     //¿Como lo hago?
     A = L * L;


     //¿Qué quiero?
     return A;