Ejercicios de Funciones

Sitio: Facultad de Ingeniería U.Na.M.
Curso: Computación ET-344
Libro: Ejercicios de Funciones
Imprimido por: Invitado
Día: miércoles, 3 de julio de 2024, 06:34

1. Ejercicio 1

Cargar matriz de NxM. Presentar menú (con función).

Opciones de menú:

  1. ingresar nro fila, validar y mostrar el mayor elemento de la fila.
  2. ingresar nro columna, validar y ordenar columna.
  3. mostrar matriz en forma estética.
  4. salir

2. Ejercicio 2

Una persona hace presupuestos y le pide a un estudiante de Ingeniería que le escriba un programa que le ayude en la tarea de cargar los precios unitarios, validándolos y que luego permita sacar un presupuesto. Para ello se va a tener una matriz de N filas por 2 columnas donde se almacenan los Items a presupuestar. Para el programa se utilizará una matriz de tipo float ITEMS donde el valor N será definido con #define.


Escribir un programa en lenguaje C++ en el editor de texto de Linux que realice lo siguiente:

El programa deberá mostrar el siguiente menú: (Main y otras consignas valor: 20 puntos)

1.- Cargar código de producto y precio unitario en matriz ITEMS.

2.- Hacer un presupuesto y mostrar.

3.-Mostrar Matriz Items.

F ó f Finalizar.


Cuando el usuario elija alguna de las opciones el programa deberá llamar a la función correspondiente.

Si se elige cualquier otro valor deberá mostrar un cartel por pantalla "OPCION NO VALIDA" y deberá reingresar. Notar que NO puede invocar al punto 2 ó 3 si NO se ejecutó

Solamente saldrá del programa si ingresa f ó F.



  1. Función "carga"

Es llamada en el punto 1 del menú. Esta función, al ser llamada no recibe ningún argumento y dentro de la función cargará solo las tres primeras columnas de DE UNA FILA VACÍA.

Columna 0: código, solo debe poder cargarse un número entero positivo

Columna 1: precio unitario del Item, valor Real.

Una vez invocada la Función carga se cargan TODAS las filas de la Matriz. Deberá validar que los datos cargados sean correctos sino deberá reingresarlos. La función no recibe ningún argumento. Puede ser invocada todas las veces que se quiera.


  1. Función “presupuesto”

Esta función es llamada en el punto 2 del menú y debe cargar una mariz local en la función, con los códigos que se ingresen y estén en la matriz ITEMS, se recomienda usar una función buscar para que valide el código de producto ingresado. y luego solicitar ingreso de la cantidad y calcular el sub total (precio x cantidad) de ese Item.. En presupuesto no podrá tener mas items que los que tiene la matriz ITEMS. Se finaliza la carga de la matriz presupuesto al ingresar código 0.

Para cualquier columna si los valores que se intentan cargar no son válidos ( ejemplo cantidad negativa o cero, código inexistente, se debe pedir reingreso. Se muestra todos los items del presupuesto una fila por línea de pantalla.


3 -Función Mostrar

Muestra la matriz ITEMS enuna función llamada mostrar, una fila por línea de pantalla.

3. Ejercicio 3

El alumno deberá escribir el código que intentará llevar un registro de las bolillas sorteadas en un Bingo que van del 0 al 99. Para ello utilizará una matriz global de nombre BINGO (única variable global). Se usará cada fila de la matriz para cargar los números sorteados de cada decena.

Al iniciar el programa la matriz deberá inicializarse en 0.

Luego deberá mostrar en pantalla el siguiente menú:

1- Cargar un número sorteado.

2- Qué decena tiene más números cargados

3.- Mostrar matriz

F- Finalizar

Cada uno de los puntos 1, 2, 3 del menú deberá realizarse llamando a una función.

El programa finalizará UNICAMENTE con la tecla F de finalizar. Si ingresa cualquier otra opción deberá informar “Opción Incorrecta” y luego mostrar nuevamente el menú.


Detalles de lo que realiza cada función:


1) Cargar UN número sorteado

Esta función llamada CARGA recibirá un número que representa el número sorteado (validado en main. Sólo números entre 0 y 99)

Deberá cargar un número en la posición correspondiente al número sorteado. Respetando que para cada decena pertenece una fila y para cada unidad una columna.

Por ejemplo:

- si sale el número 15, se cargará un 1 en la fila 1 columna 5.

- si sale el número 46, se cargará un 1 en la fila 4 columna 6.

- si sale el número 4, se cargará un 1 en la fila 0 columna 4.

Deberá retornar true si se pudo completar la carga o false si el número ya fue cargado con anterioridad. Se indica desde main con un mensaje que el número ya fue sorteado en caso de retornar false. Se llama a la función CARGA cada vez que se sortea un número, NO se carga toda la matriz de una vez. Esta función recibe un entero y retorna verdadero o falso.


2) Qué decena tiene más números cargados

Esta función llamada Buscar deberá buscar en toda la matriz cuál fue la decena que más números tiene sorteados hasta el momento. Ese valor (el número de decena) deberá retornar a main y desde allí mostrarlo. Tener en cuenta que para realizar esta función ya debe haber por lo menos un número sorteado. Esta función no recibe nada y retorna un entero a main.


3) Mostrar los números cargados

Esta función llamada MUESTRA deberá mostrar en la función los números que han sido sorteados/cargados hasta el momento.Tener en cuenta que para realizar esta función ya debe haber por lo menos un número sorteado. Esta función no recibe nada y ni retorna nada a main.


4. Ejercicio 4

Escribir el código en C++.

La empresa de libros LIBROMIX tiene a la venta 6 títulos de libros de un autor X. Codificados como titulo 1, titulo 2….y titulo 6. Este año, en la feria del libro, se venderán dichos libros en 3 puestos diferentes, denominadas Puesto 1, Puesto 2 y Puesto 3. Acabada la feria, se quieren informatizar los resultados de las ventas de cada libro en cada puesto. Realizar un menú con una función que permita ejecutar los puntos a,b,c y la S de salir.

Se deberá realizar un programa en C++ que:

a) Almacene en una matriz la cantidad de ejemplares de cada uno de los 6 títulos que se han vendido en cada una de los 3 puestos. Dicha información se solicitará al usuario del siguiente modo:

“Introduzca las ventas del título 1 en el puesto nº 1:”

“Introduzca las ventas del título 2 en Puesto nº 1:”

….

“Introduzca las ventas del título 6 en el Puesto 3:”

Realizar este punto con una función.

b) A partir de dicha matriz, se deberá almacenar en un vector el número de ejemplares totales vendidos (suma de todas las ventas en cada puesto) de cada uno de los 6 títulos. Luego, se deberá mostrar por pantalla el número de puesto que más ejemplares haya vendido. Realizar este punto con una función que retorne el ejemplar mas vendido.

c) Se quiere obtener más información sobre el último libro del autor (titulo x). Para ello, en la función se mostrará un listado con el número de ejemplares que de este libro se han vendido en cada puesto, el puesto en la que se han vendido menos ejemplares y la mayor cantidad vendida de dicho ejemplar y a que puesto pertenece. Realizar este punto con una función, x se recibe como argumento y al finalizar se regrese a main el promedio de venta del título x , y este se muestra por pantalla.


5. Ejercicio 5

Escribir un programa en lenguaje C++ en el editor de texto de Linux que realice lo siguiente.

El programa deberá presentar el siguiente menú:

1-Calcular la dispersión maxima de valores

2-Mostar una serie.

3-Mostrar el mayor de 2 números reales usando el operador ternario.

F-f Finalizar.

El programa tendrá al menos 5 funciones: main, menú, dispersión, serie, mayor. NO hay variables Globales.


1)Función menú

Esta función, no recibe argumento, presenta el menú mostrado. Esta función retorna un char que puede ser 1,2,3,F ó f SOLAMENTE.

Si el usuario presiona 1,2,3,F ó f, retorna este valor a main. Si se elige cualquier otro valor deberá mostar un cartel por pantalla " OPCION NO VALIDA". Por tanto la única manera de salir de la función es eligiendo alguno de los valores permitidos:1,2,3,F,f.


2)Función dispersión.

Es llamada en el punto 1 del menú. Esta función , al ser llamada no recibe ningún argumento y dentro de la función carga una matriz de valores Reales, de 4 x 3. Luego muestra la matriz de manera ordenada (una fila por línea) y a continuación muestra los valores de la matriz que tengan máxima disperión respecto promedio. Ver ejemplo explicativo en el pizarron.


3)Función serie.

Esta función es llamda en el punto 2 del menú. Recibe como argumento un valor entero que llamaremos M y detro de la función genera y muestra los primeros terminos M de la serie:

3/2 ; 5/4 ; 7/6 ; 9/8 ; 13/12; 15/14; 17/16; 19/18; 23/22 ..

Esta función retorna un valor booleano TRUE si pudo calcular y mostrar la serie, y retorna un False si no pudo , esto sería para el caso que M sea negativo o cero. En este ultimo caso de retornar FALSE , desde main se muestra un carté por pantalla: "Valor pasado como argumento no valido".

Observación:

Ver que no existen lo términos /10 , /20 en la serie.

Ver que no se muestra 0,5 , si no 1/2.


4) Función mayor

Esta función es llamada en el punto 3 del menu.

Recibe dos argumentos del tipo real, y utilizando el operador ternario devuelve el mayor, este se mostrará desde main con el cartél: " El mayo valor es: " y el VALOR retornado de la función mayor.


6. Ejercicio 6

Escribir un programa en lenguaje C++ en el editor de texto de Linux que realice lo siguiente:

El programa deberá llamar a la función MENU que presentará el siguiente menú:

1-Cargar Desniveles

2-Buscar máximo promedio.

3-Desnivel en un punto.

4-Mostrar.

F-f Finalizar.

El programa tendrá al menos 5 funciones: MAIN, MENU, BUSCAR, DESNIVEL, MOSTRAR.

Cuando el usuario elija alguna de las opciones el programa deberá llamar a la función correspondiente.

Para el programa se utilizará la matriz DATOS de 50x10 como UNICA variable global. Será una matriz con datos de tipo REAL, donde se cargarán valores positivos para puntos altos y negativos para las depresiones. Un punto es un elemento del Arreglo DATOS.


  1. Función menú

Esta función, no recibe argumento, presenta el menú mostrado. Esta función retorna un char que puede ser 1, 2, 3, ,4 , F ó f SOLAMENTE.

Si el usuario presiona 1, 2, 3, F ó f, retorna este valor a main. Si se elige cualquier otro valor la función MENU deberá mostrar un cartel por pantalla "OPCION NO VALIDA" y deberá reingresar. Por tanto, la única manera de salir de la función es eligiendo alguno de los valores permitidos: 1, 2, 3, 4, F, f.


  1. Función carga

Es llamada en el punto 1 del menú. Esta función, al ser llamada no recibe ningún argumento y dentro de la función carga TODA LA MATRIZ DATOS. Los datos pueden ser Positivos, negativos o Cero. Regresa un valor Booleano TRUE a main, que se utiliza para controlar que el punto 1 fué ejecutado. La función no recibe ningún argumento y no retorna nada a main.


  1. Función buscar

Esta función es llamada en el punto 2 del menú, calcula el promedio de los valores positivos de la matriz y el promedio de los negativos y retorna el que tenga mayor valor absoluto a main, desde donde se muestra por pantalla. Este punto solo puede ser llamado si se cargó la matriz.


  1. Función Desnivel

Esta función es llamada en el punto 3 del menú.

Esta función recibe como argumento una fila , columna válida y un caracer P ( de positivo) y N ( de negativo) y retorna un valor booleanor true en caso de que el valor alamcenado en esa posición coincida, Si de pasó P el valor debería ser positivo para retornar TRUE o si se pasó N el valor debería ser negativo. En caso contrario retorna FALSE.Este punto solo puede ser llamado si se cargó la matriz.


  1. Función mostrar

Esta función es llamada en el punto 4 del menú. Este punto solo puede ser llamado si se cargó la matriz.

Esta función no recibe argumento y muestra por pantalla la matriz de manera ordenada (una fila por línea).


7. Ejercicio 7

En una fábrica necesitan cargar datos del movimiento de ingreso y egreso de camiones.

Para ello se deberán utilizar dos Arreglos: una matriz Movimientos y un vector Patentes, ambos globales. El vector es un arreglo del tipo entero de longitud 5 , donde se cargarán los tres últimos dígitos de las patentes de una flota de camiones. En el Arreglo de 3 columnas por N filas ( con N definida como constante) se cargarán una columna el peso inicial del camión al ingresar, en otra el peso al salir de la fábrica y la restante columna el nro. de la patente. Esta patente debería elegir ser SOLAMENTE de una de las cargadas en el vector y validar esta condición.

Luego de cargado el vector se presentará un menú como el siguiente.

1- Cargar un ingreso/egreso.

2- Mostrar la patente del camión con mas ingreso/egreso.

3- Ver si un Camión registro ingreso/egreso.

4- Mostrar los dos Arreglos.

S o s – Salir.


  • El menú se deberá realizar mediante una función menú, que no recibe nada y regresa un char válido: 1, 2, 3, 4, S, s. En caso de un ingreso no válido se pedirá el reingreso.

  • El punto 1. Invoca a la función "carga" que carga SOLO UNA FILA, de la matriz Movimientos, validando en main el argumento pasado ( nro. patente de la que figura en el vector Patentes) y que luego cargue los movimientos, validando dentro de la función, que ambos deben ser positivos y el ingreso mayor que el egreso. Si no es así solicitar el reingreso indefinidamente. Ver que no se puede cargar mas de N movimientos.

  • El punto 2. Se invoca a una función que no recibe nada . Esta función retorna y muestra en main la patente del camión que tuvo mas movimientos.

  • El punto 3. Se realiza con una función validando en main el argumento pasado (nro. patente de la que figura en el vector Patentes) y que luego busca la existencia de alguna carga o movimiento de ese camión, en caso de que exista retorna TRUE, caso contrario FALSE. Desde main se presenta un cartel que dice: "Existe un movimiento de ese camión" ó "No existe un movimiento de ese camión".

  • El punto 4. Invoca a la función mostrar, que muestra ambos arreglos por pantalla.

Obs. Se asegura que el operador No ingresará valores repetidos para las patentes en el Vector Patentes.


8. Encontrar todos los números primos menores a un límite dado

Encontrar todos los números primos, de manera eficiente, menores a un límite dado.

8.1. Solución

Encontrar todos los números primos, de manera eficiente, menores a un límite dado.

/*Copyright 2021 Germán Andrés Xander <german.xander@fio.unam.edu.ar>
*
* Encontrar todos los números primos, de manera eficiente, menores a un límte dado.
* Para ello se utiliza el método de Criba de Eratóstenes
* https://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes
*/

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;

void criba(int valor){
    bool marcados[valor]={}; //se crea un arreglo de tamaño ingresado
    //¡¡¡CUIDADO!!! analizar el problema con esto
    
    // se recorre y marca como true los valores que son múltiplos
    for (int p=2; p*p<valor; p++){ //p*p es mucho más "barato" que raíz de
        // si p no está marcado es un primo
        if (marcados[p] == false){
            // marcar todos los múltiplus de p
            //se comienza de p*p porque es el 1er múltiplo de p que no es múltiplo de un número menor que p
            for (int i=p*p; i<valor; i+=p){
                marcados[i] = true;
            }
        }
    }
    // mostrar todos los primos
    for (int p=2; p<valor; p++){
        marcados[p] ? cout:(cout << p<<" ")
    }
}

int main(int argc, char **argv){
    auto start = high_resolution_clock::now();
    
    criba(10000); //¡¡¡CUIDADO!!!
    
    auto stop = high_resolution_clock::now();
    auto duration = duration_cast<microseconds>(stop - start);
    cout <<endl<< "duracion "<< duration.count() << " us"<<endl;
    return 0;
}

9. Convertir texto <=> real

/*
 *   funciones para convertir de texto a real (solo positivos)
 *   y de real a texto (solo positivos)
 *
 *   Germán Andrés Xander 2021
 *
 */

#include <iostream>
#define contidad_de_decimales 4
using namespace std;

int potencia(int x, int y);
float texto_a_real(char *texto);
char* real_a_texto(float valor);

int main() {
    char texto[]="123,431594";
    cout.precision(9);

    cout<<texto_a_real(texto)<<endl;

    char * letras=real_a_texto(12345.89646);
    cout<<letras;
    delete[] letras;
    return 0;
}

int potencia(int x, int y) {
    int i,potencia=1;
    if(y == 0){
        return 1;
    }
    for(i=1; i<=y; i++){
        potencia=potencia*x;
    }
    return potencia;
}

float texto_a_real(char *texto) {
    int i = 0;
    float resultado=0;
    while (texto[i]!='.' && texto[i]!=',' && texto[i]) {	//encuentro la posición del separador
        i++;
    }
    for(int j=0; j<i; j++) {
        resultado=resultado+(texto[j]-'0')*potencia(10,i-j-1);
    }
    i++;  //salteo el punto
    int decimal=1;
    while (texto[i]) {
        float parte_decimal=float(texto[i]-'0')/potencia(10,decimal);
        resultado=resultado+parte_decimal;
        i++;
        decimal++;
    }
    return resultado;
}

char* real_a_texto(float valor) {
    int digitos=1;
    int parte_entera= int(valor);
    float parte_decimal=valor-parte_entera;
    while(parte_entera > 1) {	//cuento los dígitos enteros
        parte_entera=parte_entera/10;
        digitos++;
    }
    parte_entera= int(valor);
    char * texto = new char[digitos + contidad_de_decimales + 1]();	// +1 para el \null
    for(int i=digitos-1; i>=0; i--) {
        int resto=parte_entera%10;
        parte_entera=parte_entera/10;
        texto[i]=resto+'0';
    }
    texto[digitos]='.';

    for(int i=1; i<=contidad_de_decimales; i++) {
        parte_decimal=parte_decimal*10;
        int cifra=int(parte_decimal);
        texto[digitos+i]=cifra+'0';
        parte_decimal=parte_decimal-cifra;
    }
    return texto;
}

10. ISO/IEC 7064, MOD 11,10

programa para calcular la cifra de verificación según ISO/IEC 7064, MOD 11,10
https://de.wikipedia.org/wiki/ISO/IEC_7064#Algorithmus_f%C3%BCr_hybride_Systeme