Práctica 0 Repaso conceptos básicos de programación en C++

camilocorreaUdeA
1,782 views

Open Source Your Knowledge, Become a Contributor

Technology knowledge has to be shared and made accessible for free. Join the movement.

Create Content

Flujo de ejecución de aplicaciones en C++

A continuación hay 3 cortos programas en C++. Su tarea es explicar en comentarios hechos en el mismo código el porque del resultado final de la ejecución y que es lo que sucede en cada una de las líneas de código para llegar a ese resultado en específico. Es decir, en los comentarios se debe explicar como va cambiando el valor de las variables, el resultado de operaciones aritméticas, lógicas o condicionales, el número de iteraciones de los ciclos, entre otros.

// Codigo número 1
#include <iostream>
using namespace std;
int main()
{
int i = 10;
float a = 1000.0;
while(i > 0)
{
i /= 2;
a /= 10;
}
cout<<"El valor final de la variable 'a' es: "<<a<<endl;
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Codigo número 2
#include <iostream>
using namespace std;
int main()
{
int i = 1, j = 2;
if(i > j && j > i)
i++;
if(i > j || j > i)
j++;
if(i | j)
i++;
if(i & j)
j++;
cout<<i * j<<endl;
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Codigo número 3
#include <iostream>
using namespace std;
int main()
{
for(int i = 0; i < 4; ++i)
{
switch(i)
{
case 0: cout<<"0";
case 1: cout<<"1"; continue;
case 2: cout<<"2"; break;
default: cout<<"D"; break;
}
cout<<"*";
}
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Composición de funciones y recursión

La composición de funciones es una característica esencial de la programación estructurada o procedimental, y se refiere simplemente al hecho de que una función se puede definir como una composición de distintas invocaciones a otras funciones o incluso de invocaciones a sí misma. A esto último que se ha mencionado se le conoce como recursión, y es la capacidad que tienen las funciones de invocarse a sí mismas. El código a continuación permite calcular el máximo común divisor entre los elementos que componen un arreglo de números enteros

#include <iostream>
using namespace std;
// Función que retorna el MCD entre dos números a y b
int mcd(int a, int b)
{
//Desarrolle esta función de acuero al siguiente algoritmo:
// Si el valor del número 'a' es igual a cero entonces retorne el valor de 'b'
// Si 'a' no es cero, entonces retorne el resultado de ejecutar mcd (recursión)
// pero los parámetros de entrada son primero: el módulo entre 'b' y 'a', y segundo el número 'a'
}
// Función para encontrar el MCD de un arreglo de números
int mcdArreglo(int arr[], int n)
{
//Declare una variable 'resultado' e inicialicela con el primer elemento del arreglo 'arr'
//Calcule el MCD para los 'n' números del arreglo: en la variable 'resultado' almacene el
//retorno de ejecutar la función mcd entre el elemento 'i' del arreglo y el valor actual de
//la variable 'resultado'. Recuerde que su ciclo debe ir desde la segunda posición del arreglo
//hasta el último elemento del arreglo.
//Finalmente retorne la variable 'resultado'
}
// Ejecución de la aplicación (No modifique esta función!)
int main()
{
int arr[] = { 2, 4, 6, 8, 16 };
int n = sizeof(arr) / sizeof(arr[0]); //Calcula el tamaño del arreglo (número de elementos)
cout << mcdArreglo(arr, n) << endl;
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Conversión entre distintos tipos de datos

La función NumSringToInt es una función que debe convertir un número escrito en letras (cadena de caracteres) en un número de tipo entero (int), usted debe agregar las líneas de código necesarias para implementar dicha funcionalidad.

Se debe garantizar que se convierten números enteros positivos y negativos.

Se debe garantizar que la función no intente convertir un número que sobrepasa la capacidad del tipo de dato int.

Utilice el tipo de dato "string" en caso de necesitar alguna variable para almacenar cadenas de caracteres.

Dato1: La representación en caracter (ASCII) de un número natural (0 al 9) es igual al número + 48 (o bien 0x30 en hexa)

Ejemplo: '9' = 9 + 48 = 0x09 + 0x30

Dato2: Para verificar la longitud de la cadena de caracteres que representa un número puede usar el operador size()

Ejemplo: string numero = "123456" -> numero.size() da como resultado 6

Dato3: Solo puede utilizar declaración de variables, operadores de C++ y estructuras de control para codificar la solución.

Dato4: Recuerde que las cadenas de caracteres (strings) se comportan como arrays de tipo char, se puede utilizar el operador corchetes [] para acceder individualmente a las letras -> Ejemplo: string hh = "Hola"; hh[1] es la letra 'o'

Dato 5: Recuerde que un número está escrito en el sistema decimal donde cada cifra a la izquierda es 10 veces mayor que la siguiente cifra a la derecha.

Ejemplo: '111' el primer '1' es 10 veces mayor que el segundo '1' y este es a su vez 10 veces mayor que el último 1. Es decir el número en string '111' se puede convertir a un entero como la suma de 1 + 1x10 + 1x100

#include<iostream>
#include<string>
using namespace std;
int NumStringToInt(string numero)
{
// Complete esta función siguiendo las recomendaciones anteriores
}
int main()
{
string number1 = "45678945";
cout<<NumStringToInt(number1)<<endl;
string number2 = "-375907";
cout<<NumStringToInt(number2)<<endl;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Aplicaciones de la programación

Desarrolle una aplicacion de cifrado sencillo para una trama de datos de tipo entero. La trama de datos es simplemente un arreglo de enteros de 20 posiciones. Una vez incializada la trama, esta debe pasarse a una funcion que la debe cifrar siguiendo el procedimiento que se describe a continuacion:

  1. La funcion de cifrado ademas de la trama recibe otro parametro que indica cuantas veces se debe ejecutar el proceso de cifrado en la trama (rondas de actualización).

  2. El proceso de cifrado consiste simplemente en actualizar cada posicion de la trama de la siguiente manera: a. Cada posicion par se actualiza con el valor obtenido de la resta de los valores de las 2 posiciones vecinas (izquierda - derecha). b. Cada posicion impar se actualiza con el valor obtenido de la suma de los valores de las 2 posiciones vecinas (izquierda + derecha).

  3. Es importante mencionar que las posiciones se actualizan con los ultimos valores de la trama, es decir, una posicion no debe actualizarse con los valores recien actualizados de sus vecinos sino con los valores previos de la ultima ronda de actualizacion.

  4. Al final de las n rondas de cifrado la trama queda completamente cifrada.

  5. Las posiciones de los extremos (0 y 19) se actualizan asumiendo que el vecino faltante es: Para el caso de la posicion 0 el vecino a izquierda sera la posicion 19. Para el caso de la posicion 19 el vecino a derecha sera la posicion 0.

  6. La funcion de cifrado debe nombrarse cifraData y puede tener o no valor de retorno, eso depende de la forma en que el estudiante la desarrolle.

  7. Un porcentaje de la calificacion corresponde a la interpretacion del ejercicio. Usted como ingeniero debe leer bien los pasos descritos hasta este punto y luego plantear la solucion mas conveniente para el ejercicio.

  8. En la funcion main se debe imprimir en pantalla la trama completa antes del cifrado y luego del proceso de cifrado.

Ejemplo:

Trama: {1,45,92,216,28,63}

Numero de rondas de actualizacion: 3

Trama cifrada que se obtiene:

Ronda 1: {18,93,-171,120,153,29}

Ronda 2: {-64,-153,-27,-18,91,171}

Ronda 3: {324,-91,-135,64,-189,27}  Esta es la trama final cifrada
#include <iostream>
using namespace std;
void cifraData(int arr[], int rondas)
{
// Complete esta función siguiendo las recomendaciones anteriores
}
int main()
{
int trama[6]={1,45,92,216,28,63}; //Trama de ejemplo
cifraData(trama, 3); // Llamado de ejemplo
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Open Source Your Knowledge: become a Contributor and help others learn. Create New Content