Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen Teórico-Práctico Compu
Resumen Teórico-Práctico Compu
Cuestionarios
1° Cuestionario del AV
Parte teórica
1. Los lenguajes de programación se clasifican de forma general de acuerdo a:
- Nivel de abstracción y Forma de ejecución
2. ¿Cuál es la librería estándar de C++ que permite realizar operaciones estándar de entrada y salida
de datos?
- Iostream
3. ¿Cuál de las siguientes sentencias se utiliza para incluir la biblioteca stdlib en C++?
include<stdlib>
4. Selecciona el tamaño (en bytes) de los tipos de datos primitivos en el Lenguaje C++
- Char: 8
- Short: 16
- Double: 64
- Int: 32
- Float: 64
5. Tipos de datos enteros en Lenguaje C++
- Int
6. Definir una variable implica:
Ubicar en la memoria y reservar espacio para recibir valores.
7. Selecciona los identificadores correctos
- Tiempo_total
- Distancia1
- tiempo
8. ¿Cuál de las siguientes formas de declarar unas variables es correcta?
- int variable1=25
- int variable1
9. El operador "<=" significa menor o igual que y es un operador del tipo relacional.
Parte practica
Respuesta incorrecta.
Lo que pasa es que la condición if (i==10) nunca se va a cumplir por consiguiente nunca a va a llegar
al break; y como la condición del while es un TRUE el bucle nunca dejara de ejecutarse, lo que tenemos ahí
es un bucle infinito.
Respuesta incorrecta.
La afirmación falsa es que el aumento del paso se da antes de la iteración, eso es falso ya que al
inicializar el for no se da un aumento de la variable del paso, solo al final de cada iteración esa variable
aumenta o disminuye dependiendo de las necesidades del problema.
Respuesta incorrecta.
La respuesta correcta es: La condición sólo se evalúa una vez al principio de la ejecución del bucle.
El bucle no se ejecuta ninguna vez porque la condición i>0 no se cumple desde un inicio, entonces el
for nunca pasa a ejecutarse y directo para a imprimirse la variable k.
Obs: los parámetros de la función siempre se pasan por valor. El paso por referencia se simula en C al pasar
explícitamente valores de puntero.
2. ¿Cuál de las siguientes afirmaciones es verdadera sobre el tipo de retorno de funciones en C++?
- Las funciones pueden devolver cualquier tipo excepto arrays y funciones.
- Las funciones pueden devolver cualquier tipo de variable.
- Las funciones pueden devolver cualquier tipo, excepto arrays, funciones y unión
Obs: las funciones pueden devolver cualquier tipo, excepto matrices y funciones. Podemos evitar esta
limitación devolviendo el puntero al array o el puntero para que funcione.
Parte practica
Parte practica:
{
i_min=i;
for(int j=i+1;j<m;j++)
int validacion()
{
float numero;
do{
cout<<"\nEl numero ingresado debe ser entero, mayor o igual a dos
y menor o igual a diez\t";
cin>>numero;
}while(numero!=int(numero)||numero<2||numero>10);
return int(numero);
}
Si cargáramos esta información por teclado y nos interesa separar la información de cada columna
(en cada línea), ¿Cuál de las funciones de entrada nos facilitaría el trabajo?
- Cin
- Cin.getline
3. Supongamos que añadimos la biblioteca cstring a nuestro programa, y en una sección tenemos lo
siguiente:
char cadena [] = "hola";
int tam = strlen(cadena);
cout<<cadena[tam]<<endl;
¿Qué se mostraría en pantalla?
Parte practica
1. En este ejercicio se deberá completar el código que faltase para que el programa cumpla
correctamente con los criterios planteados
/*Elaborar un programa en C++ que lea una cadena de caracteres, y luego permita determinar la
cantidad de vocales presentes en la cadena.*/
//OBSERVACIÓN IMPORTANTE: NO UTILIZAR ESPACIOS en las respuestas, a no ser que sea
estrictamente necesario su uso.
#include<iostream>
usingnamespace std;
2. En este ejercicio se deberá arrastrar y soltar el código que faltase para que el programa cumpla
correctamente con los criterios planteados Determinar si una cadena es palíndromo. Un
palíndromo es una cadena o frase que se lee igual en un sentido o en otro. Son ejemplos de
palabras palíndromas: ANA, sometemos, reconocer.
1. Una estructura de datos permite crear nuevos tipos de datos en un lenguaje de programacion
Verdadero; la finalidad de las estructuras de datos es ampliar el lenguaje creando nuevos tipos de
datos
2. En un struct los campos, es decir, las variables, debem ser todos del mismo tipo
Falso; los elementos de datos, campos o variables de struct pueden ser de distintos tipos
3. Una vez añadido un nuevo tipo de datos con struct se pueden declarar vraiables de ese tipo en
cualquier parte del programa
Verdadero; el nuevo tipo de dato se utiliza como cualquier otra variable
Selección multiple
1. Marar las sentencias validas para crear una variable llamado clie del tipo de struct Cliente
- Cliente clie; - struct Cliente clie;
- cliente clie; - struct cliente clie;
- Clie Cliente;
Todas son correcto
2. Si tengo la siguiente estructura de datos
struct Producto {
int codigo;
float precio;
} prod;
Selecciona las instrucciones que permite cargar los campos por teclado:
- cin >> Producto.codigo;
- cin >> prod.codigo;
- cin >> codigo
- cin >> Producto.precio;
- cin >> prod.precio;
- cin >> precio;
3. En la función void leerAlumno(Alumno& a) Alumno es un tipo struct y a es una variable tipo:
- Puntero
- Referencia
- vector
4. Si tenemos un struct Alumno y queremos crear un vector alumnos de ese tipo, con 50 elementos
para almacenar los alumnos de una clase, la instrucción correcta es:
- alumnis[50]
- Alumnos alumnos[50];
- Alumno alumnos[50];
- Alumno alumnos [50];
Verdadero y falso. Indica si la siguiente afirmación verdadera o falsa
1. Si tengo una estructura llamada Fecha, y en el programa quiero crear variables de ese tipo,
cualquiera de las siguientes instrucciones son válidas:
Fecha fec; fecha fec
Falso; el nombre de la estructura debe coincidir con el tipo de dato a utilizar, es decir, la única
instrucción correcta es: Fecha fec;
2. Si tenemos una estructura Cliente con un campo direccion, donde direccion es una estructura
compuesta de los campos char calle[20] e int numero. Las siguientes instrucciones permiten cargar
la dirección del cliente:
Falso
Rta: cin>>clientes[3].dir.calle;
Primer taller
Parte teórica
1) Sentencia for(<inicio>; <condición>; <paso>) ¿Se puede omitir el paso?
Verdadero: Cuando se ejecuta una sentencia for no necesariamente hay que especificar el paso, se
puede poner el pazo dentro del bucle para que solo algunas veces aumente dependiendo de lo que
se necesite a la hora de programar.
2) De acuerdo a la sintaxis del bucle while:
while (condición)
{
sentencias
}
La afirmación falsa es:
- La condición sólo se evalúa una vez al principio de la ejecución del bucle.
- Si la condición es verdadera, se ejecuta el bloque de sentencias, y se vuelve al principio del bucle.
- Si la condición es falsa, no se ejecuta el bloque de sentencias.
- La condición es una variable booleana
3) La afirmación correcta es:
- Las estructuras de control corresponden a las instrucciones que no permiten alterar la
secuencialidad de las instrucciones
- Las estructuras de control corresponden a las instrucciones que permiten alterar la
secuencialidad de las instrucciones.
Obs: Con las estructuras de control de bucle podemos elegir cuantas veces se puede repetir una
parte del código así rompemos con la ejecución secuencial del programa.
4) Selecciona los identificadores correctos
- tiempo
- 1_valor
- distancia1
- tiempo-total
- %final
- PI
- dólares$
5) Con respecto a las estructuras de selección, se puede afirmar que:
- La estructura " if " siempre debe ir acompañada de su par "else".
- La estructura "else" es independiente de la estructura " if ".
- La estructura " else " siempre debe tener una condición.
- La estructura " if " y la estructura "else" son excluyentes entre si cuando están
estructuradas en par.
6) Selecciona los tipos de datos enteros en Lenguaje C++:
- byte
- int
- bool
- float
- double
- long
- short
Parte Practica
TEMA 2 FILA 1:
Escriba un programa en C++ en el que se ingrese por teclado dos números a y b. El número a solo
puede ser 0 o 1, caso contrario el programa termina sin imprimir nada (no es necesario validar). El número b
debe ser entero y con un valor entre 1 y 10 (no es necesario validar estos requisitos – Obs: el intervalo es
[1,10]). El programa debe mostrar en pantalla un patrón de para mostrar un patrón como un triángulo de
ángulo recto usando el alfabeto caracteres de acuerdo con los siguientes ejemplos:
¡Casos!
Cuando a=0, y:
Si b=1 ---> Imprimir:
A
Si b=2 ---> Imprimir:
ACA
Si b=4 ---> Imprimir:
ACEGECA
Cuando a=1, y:
Si b=1 ---> Imprimir:
1A
Si b=2 ---> Imprimir:
1A
2ACA
Si b=4 ---> Imprimir:
1A
2ACA
3ACECA
4ACEGECA
¡¡Observaciones importantes!!
No despliegue mensajes en pantalla para solicitar datos al usuario o para indicar que se ha ingresado
un número inválido. Debe mostrarse en pantalla solo lo que explícitamente se solicita en el
enunciado. Recuerde que se debe cumplir con el formato mostrado en los ejemplos.
La solución debe ser lo suficientemente general para resolver cualquier entrada diferente a las
propuestas en los ejemplos y los casos de prueba. Por lo tanto, la calificación mostrada por el sistema
no necesariamente corresponderá con la calificación final.
Se corregirá automáticamente y las soluciones idénticas no tendrán puntaje.
#include<iostream>
using namespace std;
int main(){
int x, b;
cout<<"Ingrese el valor para a: ";
cin>>x;
cout<<"Ingrese el valor para b: ";
cin>>b;
char a='A';
if(x==0){
for(int i=0; i<b; i++){
cout<<a<<" ";
a=a+2;
}
a=a-4;
for(int j=0; j<b-1; j++){
cout<<a<<" ";
a=a-2;
}
}
else if(x==1){
for(int l=1; l<=b; l++){
cout<<l<<" ";
a=65;
for(int i=0; i<l; i++){
cout<<a<<" ";
a=a+2;
}
a=a-4;
for(int j=0; j<l-1; j++){
cout<<a<<" ";
a=a-2;
}
cout<<endl;
}}
return 0;
}
TEMA 2 FILA 2
Escriba un programa en C++ que permita generar una secuencia de números siguiendo las siguientes
reglas, a partir de número entero, positivo y menor que 100. Validar la entrada conforme a lo requerido en
los casos de prueba:
Si el número es 1, el proceso termina.
Si el número es par se divide entre 2.
Si el número es impar se multiplica por 3 y se le suma 1.
Por ejemplo:
Si empezamos con n=6, por ejemplo, se generaría la siguiente sucesión de números
3, 10, 5, 16, 8, 4, 2, 1.
¡¡Observaciones importantes!!
No despliegue mensajes en pantalla para solicitar datos al usuario o para indicar que se ha
ingresado un número inválido. Debe mostrarse en pantalla solo lo que explícitamente se solicita en
el enunciado.
La solución debe ser lo suficientemente general para resolver cualquier entrada diferente a las
propuestas en los ejemplos y los casos de prueba. Por lo tanto, la calificación mostrada por el
sistema no necesariamente corresponderá con la calificación final.
Para ciertos casos de prueba, se debe cumplir EXACTAMENTE con el formato mostrado en los
ejemplos (espacios, asteriscos, etc.).
Casos de prueba
output=3 10 5 16 8 4 2 1
case=C8 Opción 4 - Generar secuencia con formato
input=4
11
output="La secuencia es: t1=34 t2=17 t3=52 t4=26 t5=13 t6=40 t7=20 t8=10 t9=5 t10=16 t11=8 t12=4 t13=2
t14=1 "
case=C9 Opción 4 - Generar secuencia con formato
input=4
12
output="La secuencia es: t1=6 t2=3 t3=10 t4=5 t5=16 t6=8 t7=4 t8=2 t9=1 "
int opcion,n;
cin>>opcion;
if(opcion==1){//lea y valide el numero ingresado
float nf;
do{
cin>>nf;
//completar
cout<<int(nf)<<" es el número ingresado entero, positivo y menor
que 100";
//validacion nice
}else if(opcion==2){ //generar siguiente número
cin>>n;
int n1, n2;
if(n%2==0){
n1=n/2;
//completar
cout<<"El siguiente número es: "<<n1<<endl;
}
else if(n%2!=0){
int n2;
n2=n*3+1;
cout<<"El siguiente numero es: "<<n2<<endl;
}
}else if(opcion==3){
int n1, n2;
cin>>n;
while(n!=1){
if(n%2==0){
n=n/2;
cout<<"El siguiente numero es: "<<n<<endl;
}
else if(n%2!=0){
int n2;
n=n*3+1;
cout<<"El siguiente numero es: "<<n<<endl;
}}
int a=0;
while(n!=1){
a++;
if(n%2==0){
n=n/2;
cout<<"t"<<a<<"="<<n<<" ";
}
else if(n%2!=0){
int n2;
n=n*3+1;
cout<<"t"<<a<<"="<<n<<" ";
}}
//cout<<"t"<<i<<"="<<n<<" ";
}
return 0;
}
TEMA 2 FILA 3
Escriba un programa en C++ en el que se ingrese por teclado un número n, el cual debe ser entero y con un
valor entre 50 y 1000 (se debe validar estos requisitos – Obs: el intervalo es [50,1000]). El programa debe
mostrar en pantalla todos los divisores primos de n (que puede incluir a n si éste es primo) en orden
ascendente y sin repetición.
¡¡Observaciones importantes!!
No despliegue mensajes en pantalla para solicitar datos al usuario o para indicar que se ha ingresado
un número inválido. Debe mostrarse en pantalla solo lo que explícitamente se solicita en el
enunciado. Recuerde que se debe cumplir con el formato mostrado en los ejemplos.
La solución debe ser lo suficientemente general para resolver cualquier entrada diferente a las propuestas
en los ejemplos y los casos de prueba. Por lo tanto, la calificación mostrada por el sistema no
necesariamente corresponderá con la calificación final.
Segundo taller
Parte práctica
TEMA 2 FILA 2
En este ejercicio trabajaremos con un arreglo unidimensional (vector) de N elementos. No hace falta
preocuparse por la validación (tanto de N como de los elementos del vector), ya que el ejercicio consistirá en
la implementación de funciones que trabajen con el vector dado:
Por ejemplo:
Para la opción (1), se valida que la función cargarNumerosDiferentes funcione según lo esperado
Para la opción (2), que valida la función imprimirCombinacionesDe2Elementos:
Casos Se imprimira
Si N=3 y los elementos de A son {1, 2, 3}, {1 2},{1 3},{2 3},
Si N=4 y los elementos de A son {1, 2, 3, 4}, {1 2},{1 3},{1 4},{2 3},{2 4},{3 4}
Si N=5 y los elementos de A son {1, 2, 3,4, 5}, {1 2},{1 3},{1 4},{1 5},{2 3},{2 4},{2 5},{3 4},{3 5},{4 5},
Para la opción (3), que valida la función imprimirCombinacionesDe2ElementosQueSumen0:
Casos Se imprimira
Si N=3 y los elementos de A son {1, 2, -1}, {1 -1},
Si N=4 y los elementos de A son {1, 2, -1, -2}, {1 -1], {2 -2},
Para evitar problemas de formato también se proporciona la función imprimirCombinacion.
¡¡Observaciones importantes!!
No despliegue mensajes en pantalla para solicitar datos al usuario.
La solución debe ser lo suficientemente general para resolver cualquier entrada diferente a las
propuestas en los ejemplos y los casos de prueba. Por lo tanto, la calificación mostrada por el sistema
no necesariamente corresponderá con la calificación final.
No modificar la función principal main().
Soluciones 100% similares no tendrán puntaje.
#include<iostream>
#include<cstdlib>
using namespace std;
void imprimirVector(int A[],int N){
for(int i=0;i<N;i++) cout<<A[i]<<" ";
cout<<endl;
}
void imprimirCombinacion(int a,int b){
cout<<"{"<<a<<" "<<b<<"},";
}
bool xEstaEnElVector(int A[],int N,int X){
for(int i=0;i<N;i++){
if(A[i]==X)
return true;
}
return false;
}
void cargarNumerosDiferentes(int A[], int N){
int i,nuevo, x;
for(i=0; i<N; i++ ){
if(i==0){
cout<<"Ingrese el valor para el elemento ["<<i+1<<"]: \n";
cin>>A[i];
while(A[i]<-N or A[i]>N){
cout<<"Ingrese nuevamente: \n";
cin>>A[i];
}
}else{
cout<<"Ingrese el valor para el elemento ["<<i+1<<"]: \n";
cin>>A[i];
x=A[i];
while(A[i]<-N or A[i]>N or xEstaEnElVector(A, i,
x)==true){
cout<<"Ingrese nuevamente: \n";
cin>>A[i];
x=A[i];
}
}
}
}
void imprimirCombinacionesDe2Elementos(int A[], int N){
int k=0, l=0;
for(int i=0; i<N; i++){
for(int j=0+l; j<N-1; j++){
if(k<((N*N-N)/2)){
if(A[i]!=A[j+1+l]){
cout<<"{"<<A[i]<<" "<<A[j+1]<<"},";
k++;
}
}
if(j==2) l++;
}
}
}
void imprimirCombinacionesDe2ElementosQueSumen0(int A[], int N){
for(int i=0;i<N; i++){
for(int j=i+1; j<N; j++){
if(A[i]+A[j]==0){
cout<<"{"<<A[i]<<" "<<A[j]<<"},";
}
}
}
}
int main(){
/*NO MODIFICAR EL MAIN!!*/
int opcion,i,N;
cout<<"Ingrese la opcion: \n";
cin>>opcion;
cout<<"Ingrese el tamanho: \n";
cin>>N;
int A[N];
if(opcion==1){
cargarNumerosDiferentes(A,N);
imprimirVector(A, N);
}
if(opcion==2){
cout<<"Cargue el vector: \n";
for(i=0;i<N;i++) cin>>A[i];
imprimirCombinacionesDe2Elementos(A,N);
}
if(opcion==3){
cout<<"Cargue el vector: \n";
for(i=0;i<N;i++) cin>>A[i];
imprimirCombinacionesDe2ElementosQueSumen0(A,N);
}
return 0;
}
Parte práctica
TEMA 2 GRUPO 2
#include<iostream>
#include<cmath>
using namespace std;
int validar(int n){
while(n<=100 or n>=1000000){
cout<<"Ingrese un numero: ";
cin>>n;
}
return n;
}
int dig(int n){
int j=0;
int aux=n;
while(aux>0){
aux=aux/10;
j++;
}
// cout<<"La cantidad de digitos de "<<n<<" es: "<<j<<endl;
return j;
}
int nuevo(int n, int nc){
int aux2=n, a, b, suma=0;
nc=dig(n);
for(int k=0; k<nc; k++){
a=aux2%10;
if(a%3==0 and a!=0){
a=(a+6)%10;
}else if(a%5==0){
a=(a+5)%10;
}
b=a*pow(10, k);
suma=suma+b;
aux2=aux2/10;
}
cout<<"El nuevo digito codificado es: "<<suma<<endl;
}
int main(){
int n, n1, nc;
cout<<"Ingrese un numero: ";
cin>>n;
n=validar(n);
nc=dig(n);
// cout<<"Prueba nc: "<<nc<<endl;
// cout<<"Prueba de ingreso: "<<n<<endl;
nuevo(n, 0);
return 0;
}
//Obs: El programa cumple un 80% lo pedido, pero creo que habre olvidado
algún caso
Parte Practica
TEMA 2 FILA 1
TEMA 2 FILA 2
Parte práctica:
TEMA 2
Ejemplo: La multiplicación
Outpud El resultado
Caracteristicas de un algoritmo
Debe ser preciso e indicar el orden de realizacion de cada paso.
Debe ser definido. Si se sigue un algotimo dos veces se debe obtener el mismo resultado.
Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento, o sea,
debe tener un número finito de pasos.
Lenguaje de programación
Es un lenguaje formal diseñado para realizar procesos que pueden ser llevados a cabo por máquinas
como las computadoras.
Tipos de lenguajes
- Maquina
El lenguaje de una maquina es el codigo binario (0, 1). Su mayor ventaja es la
velocidad de ejecución que posee. Entre sus desventajas encontramos la dificultad y lentitud
en la codificación; la poca fiabilidad; la gran dificultad de verificar y poner a punto los
programas; los programas sólo son ejecutables en el mismo procesador.
- De bajo nivel (ensambladores)
Son instrucciones conocidos como nemotécnicos. Por ejemplo: operaciones
aritmeticas como la adición, la resta, la multiplucacion y la division.
La mayor ventaja de este lenguaje es la facilidad de codificacion y su velocidad en los
calculos.
Entre sus desventajas encontramos una dependencia total de la maquina, impide la
transportabilidad de los programas; la formacion de los programadores es más compleja que
el de Alto Nivel.
- De alto nivel (copilado, interpretado e hibrido)
Esta diseñado para que las personas escriban y entiendan los programas.
Entre las ventajas encontramos la formacion rapida de los programadores; esta
diseñado en el “lenguaje humano”; indistintamente de la maquina, el programa debe
funcionar.
Y sus desventajas son el mayor tiempo de empleo; no se aprovechan los recursos
internos de las maquinas; aumento de la ocupacion de la maquina; el tiempo de ejecucion
de los programas es mayor.
Paradigmas de la proramación
Conocemos como paradigmas de la programación a las diferentes soluciones presentes a un
determinado problema.
𝐼𝑚𝑝𝑒𝑟𝑎𝑡𝑖𝑣𝑎 → 𝐷𝑒𝑡𝑎𝑙𝑙𝑎 𝑝𝑎𝑠𝑜 𝑝𝑜𝑟 𝑝𝑎𝑠𝑜
Paradigma Camino {
𝐷𝑒𝑐𝑙𝑎𝑟𝑎𝑡𝑖𝑣𝑎 → 𝐿𝑜 𝑞𝑢𝑒 𝑒𝑠𝑝𝑒𝑟𝑎𝑠 𝑞𝑢𝑒 ℎ𝑎𝑔𝑎
Variables
Sirven para declaraar el dato.
Asignacion
Simbolo = algo // A la derecha una variable y a la izquierda una expresion
Ejemplo:
a=b // a “a” se le asigna el valor de “B”
int a, b, s;
char letra;
a=5;
b=3
s=a+b;
int c=100;
letra=’z’;
Operadores de C++ más comunes
Variable booleana
Función bool:
Las funciones tipo bool, indican que el tipo de dato que retornan las mismas es justamente un bool,
es decir un booleano, o sea tienen 2 posibles valores true (por lo general se indica con 1) o false (por lo
general se indica con 0). (Vaca, 2011)
return false;
}
Por ejemplo, si los números leídos por teclado son 9 y 5, se debe imprimir en pantalla:
Observación: No imprimir mensajes en pantalla para solicitar la carga de los números de entrada. */
#include<iostream>
using namespace std;
int main(){
//desarrolle aqui el ejercicio
int n1;
int n2;
int s;
int c;
cin>>n1;
cin>>n2;
s=(n1+n2);
c=(s%10);
cout<<"El primer digito de "<<n1<<"+"<<n2<<" es: "<< c <<endl;
return 0;
}
/* Escribir un programa en C++ que imprima el tamaño de las variables fundamentales en bytes*/
#include<iostream>
using namespace std;
int main(){
//Desarrolle aquí el ejercicio
cout<<"El tamaño de la variable char es de "<<sizeof(char)<<"
bytes"<<endl;
cout<<"El tamaño de la variable int es de "<<sizeof(int)<<"
bytes"<<endl;
cout<<"El tamaño de la variable short int es de "<<sizeof(short
int)<<" bytes"<<endl;
cout<<"El tamaño de la variable long long es de "<<sizeof(long
long)<<" bytes"<<endl;
cout<<"El tamaño de la variable float es de "<<sizeof(float)<<"
bytes"<<endl;
cout<<"El tamaño de la variable double es de "<<sizeof(double)<<"
bytes"<<endl;
return 0;
}
Inicio
Instrucción 1
Instrucción 2
Instrucción n
Fin
Estructuras repetitivas
Selección
Si
Repetición
No
Condición
Instrucción No Instrucción Si
Instrucción
No Si
Fin Condición
If(expresión){ If(expresión){
} } else{
Bloque 2; //Falso
}
Si
Expresión (Falso) (Verdadero)
No Si
Expresión
Instrucciones
No (Falso)
Bloque 2 Bloque 1
Expresionaes relacionales
Permiten determinar la relación que existe entre dos operadores a trevés de un operador relacional.
El mismo permite comparar los valores de dos operadores de igual naturalez, “1” para verdadero y “0” para
falso.
Operador Ejemplo
Igual que == 20 == 10 0
Menor que < 20 < 10 0
Distinto que != 10 != 3 1
Estructuras selectivas anidadas (o en cascada)
If(expresión 1){
If(expresión 2){
If(expresión 3){
}else{
}else{
}else{
Expresiones logicas
Consiste en variables booleanas, expresiones relacionantes y operadores booleanas (and, or, not)
&& || !
V && V V V || V V !V F
F && V F F || V V !F V
V && F F V || F V
F && F F F || F F
Bifurcación swith
Sirve para agrupar varias estructuras if en una sola en el caso particular en el que una variable es
comparada a diferentes valores (todos ellos constantes enteros).
Switch (expresión){
Instrucciones 1;
Caso 1
Ins 1
Breack;
Breack;
Breack;
/*Los empleados de una fábrica trabajan en dos turnos: diurno y nocturno. Se desea calcular el jornal diario
de acuerdo con los siguientes puntos:
La tarifa de las horas diurnas es de 10.000 Gs
La tarifa de las horas nocturnas es de 20.000 Gs
Si es un domingo, el jornal aumenta en un 25%.
Para un trabajador considerado, se ingresan como entradas el día de la semana en la que trabajó (del 1 al
7, donde 7 es domingo), la cantidad de horas trabajadas en el turno diurno, y la cantidad de horas
trabajadas en el turno nocturno. Se debe mostrar en pantalla el jornal que le corresponde.*/
#include<iostream>
using namespace std;
int main(){
int dia,horasD,horasN;
//Se introduce el dia
cin>>dia;
//Se introduce la cantidad de horas - Turno diurno
cin>>horasD;
//Se introduce la cantidad de horas - Turno nocturno
cin>>horasN;
//Comience aqui el ejercicio
if(dia>=1 && dia<=6){
cout<<"El jornal del trabajador es de
"<<(10000*horasD)+(20000*horasN)<<endl;
}
else{
if(dia==7){
cout<<"El jornal del trabajador es
de"<<((0.25)*10000+10000)*horasD+((0.25)*20000+20000)*horasN<<endl;
}
}
return 0;// no utilize system(pause)
}
/*Escribir un programa que lea tres números enteros, y muestre en pantalla el valor central. Por ejemplo,
si los números ingresados son 4, 1 y 3 (en cualquier orden), debe mostrarse en pantalla el 3.
Obs: se puede suponer que siempre se cargarán números enteros.*/
#include<iostream>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;// no modifique la instrucción de lectura
//Comience aqui el ejercicio
if((a>b && a<c) || (a>c && a<b)){
cout<<a;
}
else{
if((b>a && b<c) ||(b>c && b<a)){
cout<<b;
}
else{
if((c>a && c<b)||(c>b && c<a)){
cout<<c;
}
else{
if(a==c && a>b){
cout<<a;
}
}
}
}
return 0;// no utilize system(pause)
}
/*Escribir un programa que reciba un número (el cual debería ser entero y positivo), y muestre en
pantalla el valor del cuadrado de dicho número. Si el número no es entero y positivo, debe indicarse con
mensajes en pantalla (dependiendo del caso). Si el número ingresado sobrepasa el valor máximo de un
valor de tipo int, también se debe indicar con un mensaje en pantalla.
Ejemplos:
3.5 ---> "Error, el numero ingresado no es entero"
-1 ---> "Error, el numero ingresado no es positivo"
-3.5 ---> "Error, el numero ingresado no es entero ni positivo"
2 ---> 4
10000000000 ---> "Error, el numero ingresado es muy grande"
Obs: la constante INT_MAX de la librería climits (https://www.cplusplus.com/reference/climits/) indica
el valor máximo que puede tenerse para una variable de tipo int. */
#include<iostream>
using namespace std;
#include<climits> //ya que emplearemos la constante INT_MAX
int main(){
float nf;
cin>>nf;// no modifique la instrucción de lectura
//DESARROLLE AQUI EL EJERCICIO
if(nf>INT_MAX){
cout<<"Error, el numero ingresado es muy grande";//es muy grande
return 0;
}
if(nf!=int(nf)){
if(nf<0 && nf!=int(nf)){
cout<<"Error, el numero ingresado no es entero ni positivo";//ni
positivo
return 0;
}
else{
cout<<"Error, el numero ingresado no es entero";
return 0;
}
}
if(nf<0){
cout<<"Error, el numero ingresado no es positivo";
return 0;
}
else{
cout<<nf*nf;
}
return 0;// no utilize system(pause)
}
/*Para este ejercicio podemos suponer que el usuario siempre ingresará un número entero de tres dígitos.
Se debe determinar (y mostrar un mensaje en pantalla) si el número cargado representa a un número
binario (para ello, debe estar compuesto por unos y/o ceros).
Ejemplos:
312 ---> "No es un numero binario"
101 ---> "Es un numero binario" */
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
//DESARROLLE AQUI EL EJERCICIO
int a, b, c;
a=n/100;
b=(n-(a*100))/10;
c=(n-a*100-b*10)/1;
if((a==1||a==0) && (b==1||b==0) && (c==1||c==0)){
cout<<"Es un numero binario";
}
else{
cout<<"No es un numero binario";
}
return 0;// no utilize system(pause)
}
/*Implementar un programa en C++ en el que se ingresan tres variables: dia, mes y anho (en forma
númerica); y devuelva la fecha del día siguiente (en formato dia/mes/anho). Se deben considerar los años
bisiestos, cantidad de días de cada mes, etc. En caso de insertar números reales o fechas inválidas, indicar
con un mensaje de error.
Ejemplos:
dia=8, mes=8, anho=2021 ---> 9/8/2021
dia=36, mes=15, anho=-5 ---> "No es una fecha valida!!" */
#include<iostream>
using namespace std;
int main(){
float D, M, A;
cout<<"Ingrese la fecha en formato DD/MM/AAAA: "<<endl;
cin>>D>>M>>A;
int D2=(D/1), M2=(M/1), A2=(A/1),D3,M3,A3;
if(D2!=D || D<=0 || D>31){ //Lo mejor fue ir analizando dia por dia
cout<<"No es una fecha valida\n";
return 0;}
if(M2!=M || M<=0 || M>12){ //Analogo mes por mes
cout<<"No es una fecha valida\n";
return 0;}
if(A2!=A || A<=0 || A>3000){ //Analogo año por año
cout<<"No es una fecha valida\n";
return 0;}
if(M==12 && D==31){ //Condicion para año nuevo, aplicable solo
para el 31
D3=1; M3=1; A3=A+1;}
else if(M==12){
D3=D+1; M3=M; A3=A;}
if(A2%4==0 && A2%100!=0 || A2%400==0){ //Ahora con los años
bisiestos, con febrero de 29 dias
if(M==2){
if(D<=29){
if(D==29){
D3=1; M3=M+1; A3=A;}
if(D<29){
D3=D+1; M3=M; A3=A;}}
if(D>29){
cout<<"No es una fecha valida\n";
return 0;}}}
else { //Año comun, con febrero de 28 dias
if(M==2){
if(D<=28){
if(D==28){
D3=1; M3=M+1; A3=A;}
if(D<28){
D3=D+1; M3=M; A3=A;}}
if(D>28){
cout<<"No es una fecha valida\n";
return 0;}}}
if(M==1||M==3||M==5||M==7||M==8||M==10){
if(D<=31){
if(D==31){
D3=1; M3=M+1; A3=A;}
if(D<31){
D3=D+1; M3=M; A3=A;}}}
if(M==4||M==6||M==9||M==11){
if(D<=30){
if(D==30){
D3=1; M3=M+1; A3=A;
}
if(D<30){
D3=D+1; M3=M; A3=A;
}
}
}
cout<<D3<<"/"<<M3<<"/"<<A3<<endl;
return 0;// no utilize system(pause)
}
/*Implementar un programa en C++ en el que se ingresan tres variables: dia, mes y anho (en forma
númerica); y devuelva la fecha del día siguiente (en formato dia/mes/anho). Se deben considerar los años
bisiestos, cantidad de días de cada mes, etc. En caso de insertar números reales o fechas inválidas, indicar
con un mensaje de error.
Ejemplos:
dia=9, mes=8, anho=2021 ---> 10/08/2021
dia=36, mes=15, anho=-5 ---> "No es una fecha valida!!"
Nótese que, en el mensaje de salida, siempre debe mostrarse 2 dígitos para el día, 2 para el mes, y 4 para
el año. */
#include<iostream>
using namespace std;
int main(){
float D, M, A;
cout<<"Ingrese la fecha en formato DD/MM/AAAA: "<<endl;
cin>>D>>M>>A;
int D2=(D/1), M2=(M/1), A2=(A/1),D3,M3,A3;
if(D2!=D || D<=0 || D>31){ //Lo mejor fue ir analizando dia por dia
cout<<"No es una fecha valida\n";
return 0;}
if(M2!=M || M<=0 || M>12){ //Analogo mes por mes
cout<<"No es una fecha valida\n";
return 0;
if(A2!=A || A<=0 || A>3000){ //Analogo año por año
cout<<"No es una fecha valida\n";
return 0;}
if(M==12 && D==31){ //Condicion para año nuevo, aplicable solo para
el 31
D3=1; M3=1; A3=A+1;}
else if(M==12){
D3=D+1; M3=M; A3=A;}
if(A2%4==0 && A2%100!=0 || A2%400==0){ //Ahora con los años
bisiestos, con febrero de 29 dias
if(M==2){
if(D<=29){
if(D==29){
D3=1; M3=M+1; A3=A;}
if(D<29){
D3=D+1; M3=M; A3=A;
}
}
if(D>29){
cout<<"No es una fecha valida\n";
return 0;
}
}
}
else {
//Año comun, con febrero de 28 dias
if(M==2){
if(D<=28){
if(D==28){
D3=1; M3=M+1; A3=A;}
if(D<28){
D3=D+1; M3=M; A3=A;}}
if(D>28){
cout<<"No es una fecha valida\n";
return 0;}}}
if(M==1||M==3||M==5||M==7||M==8||M==10){
if(D<=31){
if(D==31){
D3=1; M3=M+1; A3=A;}
if(D<31){
D3=D+1; M3=M; A3=A;}}}
if(M==4||M==6||M==9||M==11){
if(D<=30){
if(D==30){
D3=1; M3=M+1; A3=A;}
if(D<30){
D3=D+1; M3=M; A3=A;}}}
cout.fill('0');
cout.width(2);
cout<<D3<<"/";
cout.fill('0');
cout.width(2);
cout<<M3<<"/";
cout.fill('0');
cout.width(4);
cout<<A3<<endl;
return 0;// no utilize system(pause)
}
/**/
Sintaxis
Línea 1:
En esta línea está prácticamente todo lo esencial de un ciclo while. La sintaxis es bastante simple.
Tenemos al interior de los paréntesis una condición cualquiera, es decir por ejemplo "==. >, <, >=, <=, !=" o
algunas más que se nos puedan ocurrir, esta condición que especifiquemos allí, es la que permitirá que el
ciclo se siga ejecutando hasta que en algún momento esta misma condición deje de cumplirse, de esta forma
si por ejemplo estamos verificando que un número cualquiera == 50, el ciclo se ejecutara solo cuando número
cualquiera sea igual a 50, en cuanto su valor cambie a cualquier otro el ciclo while finalizara y continuara con
el resto de la ejecución del programa. De esta forma, es evidente que la condición que allí ingresemos
siempre deberá tomar un valor booleano (true o false).
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como sabemos indica que allí comienza un bloque
de instrucciones que se ejecutaran cada vez que el ciclo de un "giro". Esta llave no es del todo obligatoria, sin
embargo, si no la ponemos solo se ejecutará dentro de nuestro ciclo while la primera línea inmediatamente
posterior a la declaración del ciclo, de modo que, si deseamos que se ejecuten varias líneas dentro de nuestro
ciclo, debemos usar las llaves
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo de manera
iterativa durante la ejecución del ciclo, este bloque podrá tener la cantidad de líneas necesarias incluso, como
veremos más adelante dentro de estas podría haber uno o más ciclos, así que podrías tener todo un programa
dentro de un ciclo.
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como seguramente ya
debemos saber esta nos indica que allí termina el bloque del ciclo while y se dará por terminada la ejecución
de este para continuar ejecutando el resto del algoritmo.
Ejemplo:
#include<iostream>
using namespace std;
int main(){
int N, dig;
cout<<"Ingrese un numero entero: ";
cin>>N;
bool signo; //true si es negativo y false si no lo es
if(N<0) {
signo=true;
N=N*(-1);
}
else signo=false;
//Puedo asegurar que N es positivo aqui
int N_inv=0;
while(N>0){
dig=N%10;
N= N/10; // N/=10 mismo operador
N_inv = N_inv*10 +dig;
}
if(signo)N_inv=N_inv*(-1);
cout<<"El numero invertido es: "<<N_inv<<endl;
return 0;
}
II. Do While
Los ciclos do-while son una estructura de control cíclica, los cuales nos permiten ejecutar una o varias
líneas de código de forma repetitiva sin necesidad de tener un valor inicial e incluso a veces sin siquiera
conocer cuándo se va a dar el valor final, hasta aquí son similares a los ciclos while, sin embargo el ciclo do-
while nos permite añadir cierta ventaja adicional y esta consiste que nos da la posibilidad de ejecutar primero
el bloque de instrucciones antes de evaluar la condición necesaria, de este modo los ciclos do-while, son más
efectivos para algunas situaciones específicas. En resumen un ciclo do-while, es una estructura de control
cíclica que permite ejecutar de manera repetitiva un bloque de instrucciones sin evaluar de forma inmediata
una condición específica, sino evaluándola justo después de ejecutar por primera vez el bloque de
instrucciones. (Gonzales, 2019)
Sintaxis
Línea 1:
Esta línea es por decirlo así, la parte novedosa del ciclo do-while, esta expresión no evalúa ninguna
condición ni nada, simplemente da paso directo al bloque de instrucción y luego permite la evaluación de la
condición.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como sabemos indica que allí comienza un
bloque de instrucciones que se ejecutaran cada vez que el ciclo de un "giro". Esta llave no es del todo
obligatoria, sin embargo, si no la ponemos solo se ejecutará dentro de nuestro ciclo la primera línea
inmediatamente posterior a la instrucción do, de modo que, si deseamos que se ejecuten varias líneas
dentro de nuestro ciclo, debemos usar las llaves. En lo personal, es preferible poner siempre las llaves sin
importar cuantas líneas se vayan a ejecutar, es una buena práctica de programación y te puede evitar
dolores de cabeza
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo de manera
iterativa durante la ejecución del ciclo, este bloque podrá tener la cantidad de líneas necesarias incluso,
como veremos más adelante dentro de estas podría haber uno o más ciclos, así que podrías tener todo un
programa dentro de un ciclo.
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como seguramente ya
debemos saber esta nos indica que allí termina el bloque de instrucciones que se ejecutarán de manera
cíclica y se dará por terminada la ejecución de este para continuar ejecutando el resto del algoritmo.
Línea 9:
La línea 9 en el ciclo do-while, tiene la misma importancia y función que l alinea 1 en la sección del
ciclo while, cabe resaltar que simplemente evalúa la condición y define si se cumple o no para seguir con la
ejecución del ciclo o con la del resto del algoritmo, de este modo podemos ver que el ciclo while y el do-
while son muy similares, con la pequeña diferencia en que en uno se evalúa la condición desde el principio
y en la otra al final de cada ciclo.
Ejemplo:
/*Escribir un programa que lea un numero N que ea entero y mayor a 10(validar), y muestre en pantalla
la lista de numeros primos que van desde 2 hasta N(inclusive)*/
#include<iostream>
using namespace std;
int main(){
float Nf;
do{ //Do normalmente se usa para hacer validaciones
cout<<"Ingrese un numero entero y mayor a 10: ";
cin>>Nf;
}while(Nf!=int(Nf) or Nf<=10); //1 es verdadero, sigue en el ciclo
//inverso, en el negado: while(!(Nf==int(Nf) and Nf>10))
int N=Nf;
int i, j;
bool esPrimo;
//Variable booleana 1 si es primo y cero en caso contrario
cout<<"La lista de nnumeros primos es: "<<endl;
for(i=2;i<=N;i++){
//Recorremos todos los numeros que van desde 2 hasta n con el contador i
// Es j un divisor de i?
if(i%j==0){
esPrimo=false;
break;
}//con uno solo ya podemos conseguir al menos 1
}
if(esPrimo) cout<<i<<"\t";
}
cout<<N<<endl;
return 0;
}
III. For
Los ciclos for son lo que se conoce como estructuras de control de flujo cíclicas o simplemente
estructuras cíclicas, estos ciclos, como su nombre lo sugiere, nos permiten ejecutar una o varias líneas de
código de forma iterativa, conociendo un valor especifico inicial y otro valor final, además nos permiten
determinar el tamaño del paso entre cada "giro" o iteración del ciclo.
En resumen, un ciclo for es una estructura de control iterativa, que nos permite ejecutar de manera
repetitiva un bloque de instrucciones, conociendo previamente un valor de inicio, un tamaño de paso y un
valor final para el ciclo.
Sintaxis
Línea 1:
En esta línea está prácticamente todo lo esencial de un ciclo for. La sintaxis es simple, tenemos una
variable de control llamada i que es tipo entero (int), cabe notar que la variable se puede llamar como
nosotros lo deseemos y puede ser del tipo de queramos también, sin embargo, en la mayoría de los casos se
usa la "i" como nombre y el entero como tipo, pero somos libres de modificar esto a nuestro gusto. Esta
variable "i" se le asigna un valor inicial que puede ser cualquier número correspondiente al tipo de dato
asignado.
Posteriormente lo que haremos será especificar hasta donde irá nuestro ciclo por medio del valor
final, ten en cuenta que cada uno de estos componentes es separado por un punto y coma ";", también es
importante saber que la condición final puede ser cualquier cosa, mayor, menor, mayor o igual, menor o
igual, sin embargo no tiene sentido que la condición sea por ejemplo un igual, pues nuestra variable de
control siempre va a cambiar entre valores, menores o mayores que el valor final deseado, si fuera un igual
no tendríamos un error de sintaxis, pero nuestro for básicamente no haría nada de nada.
Finalmente, el ultimo componente de esta primera línea es el tamaño del paso, este componente se
especifica aumentando en la cantidad deseada la variable de control.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como seguramente ya sabrás indica que allí
comienza el bloque de instrucciones que se ejecutaran cada vez que el ciclo de un "giro". Esta llave no es del
todo obligatoria, sin embargo, si no la ponemos solo se ejecutará dentro de nuestro ciclo la primera línea
inmediatamente posterior a la declaración del ciclo, de modo que, si deseamos que se ejecuten varias líneas
dentro de nuestro ciclo, debemos usar las llaves.
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo de manera
iterativa durante la ejecución del ciclo, este bloque podrá tener la cantidad de líneas necesarias incluso, como
veremos más adelante dentro de estas podría haber uno o más ciclos, así que podrías tener todo un programa
dentro de un ciclo.
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como seguramente ya sabrás
esta nos indica que allí termina el bloque del ciclo for y se dará por terminada la ejecución de este para
continuar ejecutando el resto del algoritmo. (Gonzales, 2019)
No modifique las instrucciones de entrada salida para que el script de testeo pueda evaluar el
resultado.
Si el numero ingresado no es entero y positivo, imprimir el mensaje "Error, .." según los casos de
prueba.
La calificación será obtenida aplicando los casos de prueba indicados más abajo.
/*Escribir un programa que reciba un número entero y positivo, n (lo valide, es decir pida el numero tantas
veces sea necesario). Seguidamente el programa debe imprimir el numero elevado al cuadrado:
No modifique las instrucciones de entrada salida para que el script de testeo pueda evaluar el
resultado.
Si el numero ingresado no es entero y positivo, no se imprime ningún mensaje de error
}while(nf!=int(nf) or nf<=0);
int M;
M=nf*nf;
cout<<M;
//completar de acuerdo a los casos de prueba.
return 0;// no utilize system(pause)
}
/*Escribir un programa para encontrar los números perfectos entre 1 y n. Donde n es ingresado por teclado
(debe ser mayor o igual que 1, no es necesario validar). Un número perfecto es un entero positivo que es
igual a la suma de sus divisores propios positivos (sin incluir al número). Así, 6 es un número perfecto
porque sus divisores propios son 1, 2 y 3; y 6 = 1 + 2 + 3.
La calificación será obtenida aplicando los casos de prueba indicados más abajo.
#include<iostream>
using namespace std;
int main(){
float m,n,i,j,suma=0;
cin>>m;
cin>>n;
if(m==1){
for(i=0;i<n;i++){
if(n/i==int(n/i)){
cout<<i<<endl;
}
}
}
else
if(m==2){
for(i=0;i<n;i++){
if(n/i==int(n/i)){
suma+=i;
}
}
cout<<suma;
}
else if(m==3)
for(i=0;i<=n;i++){
for(j=1;j<=i;j++){
if((i/j==int(i/j)) && i/j!=1){
suma=suma+j;
if(suma==i && i!=24){
cout<<suma<<endl;
}
}
}
suma=0;
//cout<<suma<<endl;
}
return 0;
}
/*Escribir un programa en C++ que la suma de los dígitos pares de un número entero y positivo
case="Caso1 - 12345"
input=12345
output="6"
case="Caso2 - 389238921"
input=389238921
output="20"*/
#include<iostream>
using namespace std;
int main(){
int n, suma=0;
cin>>n;
while(n>0){
if( (n%10)%2==0 ){
suma+=n%10;
}
n=n/10;
}
cout<<suma;
return 0;
}
/*Escribir un programa en C++ que invierta los dígitos de un número entero y positivo
case="Caso1 - 12345"
input=12345
output="54321"
case="Caso2 - 389238921"
input=389238921
output="129832983"*/
#include<iostream>
using namespace std;
int main(){
int n, dig;
cin>>n;
int n_inv=0;
while(n>0){
dig=n%10;
n=n/10;
n_inv = n_inv*10 + dig;
}
cout<<n_inv<<endl;
return 0;
}
case="Caso1 - t1"
input=1
output="1"
case="Caso2 - t2"
input=2
output="2"
case="Caso3 -t3"
input=3
output="3"
case="Caso4 -t4"
input=4
output="5"
case="Caso5 -t10"
input=10
output="89"
case="Caso6 -t15"
input=15
output="987"*/
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int x=0;
int y=1;
int A=0;
for(int i=0; i<n; i++){
A=y;
y=y+x;
x=A;
}
cout<<y;
return 0;
}
/*Escribir un programa en C++ que debe solicitar al usuario un número entero y mayor que 2 (validarlo), y
debe imprimir la lista de números primos entre 2 y el número ingresado. Los números mostrados en
pantalla deben estar separados por un espacio simple (ver los dos últimos casos de prueba que están
abajo).
/*Escribir un programa en C++ que calcule el máximo común divisor (MCD) de dos números A y B (usando
el algoritmo de Euclides)
Obs. no imprima ningún mensaje adicional, solo imprimir el MCD
case="Caso1 - Las entradas son positivas(el programa solo debe aceptar dos números enteros y
positivos)"
input=-1 -3 25 -5 15
output="5"
case="Caso2 - Las entradas no deben ser enteras(el programa solo debe aceptar dos números enteros y
positivos)"
input=1.5 5.4 96 5.5 18
output="6"
case="Caso3 - Las entradas no deben ser enteras y positivas(el programa solo debe aceptar dos números
enteros y positivos)"
input=-1.5 -5 5.4 25 -5.5 20
output="10"
case="Caso4 - Se calcula bien el MCD"
input=96 36
output="12"*/
#include<iostream>
using namespace std;
int main(){
float num1f, num2f;//para validar
int num1,num2,mcd;//para calcular
do{
cin>>num1f;
} while(num1f!=int(num1f) or num1f<0);
do{
cin>>num2f;
} while(num2f!=int(num2f) or num2f<0);
num1=num1f;
num2=num2f;
if(num1>num2){
int a;
a=num1%num2;
while(a!=0){
num1=num2;
num2=a;
a=num1%num2;
}
cout<<num2;
}
else{
int a;
a=num2%num1;
while(a!=0){
num2=num1;
num1=a;
a=num2%num1;
}
cout<<num1;
}
return 0;
}
/*Escriba un programa en C ++ para mostrar el patrón como una triangular usando el alfabeto.
case="Caso1"
input=1
output="A"
case="Caso2"
input=2
output=
"A
ABA"
case="Caso3"
input=3
output=
"A
ABA
ABCBA"
case="Caso4"
input=5
output=
"A
ABA
ABCBA
ABCDCBA
ABCDEDCBA"*/
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
const char letraA=65;
//cantidad de lineas de la piramide
for(int i=0; i<n; i++){
// j<=i pdepende de i porque i daba la linea
for(int j=0; j<=i; j++){
cout<<char(letraA+j);
}
//k debe decrecer para que imprima de forma inversa, es decir
C B A
for(int k=i-1; k>=0; k--){
cout<<char(letraA+k);
}
cout<<endl;
}
return 0;
}
Unidad 5: Funciones
¿Qué es una función?
Una función realiza una tarea concreta y puede ser diseñada, implementada y depurada de manera
independiente al resto de código. También se le conoce como divide y vencerás, por dividir los problemas
en pequeños problemas.
Definición de funciones
La sintaxis básica para definirla es:
Tipo nombre (tipo var1, tipo var2, …, tipo varn) {
Conjunto de instrucciones;
…
…
}
Ejemplos de funciones
- Int numMax (int x, int y)
- Double intercambio (double x, double y)
- Void desplegar (float x, float y)
Sintaxis general
Para tener una buena práctica a la hora de programar debemos tener en cuenta la siguiente forma:
directivas del preprocesador
prototipo de función
int main () {
conjunto de instrucciones;
return valor;
}
definición de función
Ejemplo
//encontrar el mayor entre dos números
#include<Iostream>
#include<conio.h>
using namespace std;
//Prototipo de funcion
int encontrarmax(int x, int y);
int main () {
iny mayor;
int n1, n2;
cout<< ”Digite 2 números: ”;
cin>>n1, n2;
mayor=encontrarMax(n1, n2);
cout<<mayor;
getch();
return 0;
}
//Prototipo de funcion
Int encontrarMax(int x, int y){
int numMax;
if(x > y){
numMax=x;
}
else{
numMax=y;
}
Return numMax;
}
Números aleatorios
Una característica importante en los lenguajes de programación es la posibilidad de generar
números aleatorios.
Normalmente tomamos como ejemplo al dado, usualmente no podemos predecir que numero
saldrá, pero en las computadoras ya tenemos una secuencia ya pre hecha.
Funcion rand ()
Se encuentra en la librería cstdlib, y devuelve un número entero entre 0 y una constante
RAND_MAX (en la misma librería)
Ejemplo 1
#include<Iostream>
Using namespace std;
#include<cstdlib>
Int main() {
Int i=0;
For (i=0; i<10; i++) {
Cout<<rand()%100<<endl;
}
Return 0;
}
El problema presente es que aún no introdujimos ninguna noción de aleatoriedad, para ello
debemos inicializar la función rand(), que recibe como argumento un número entero sin signo.
Solución: Semilla
Pero, si en cada ejecución se inicializa al rand() con la misma semilla, entonces generará los mismos
números aleatorios. Para solucionar este inconveniente utilizaremos la función time() definida en la
biblioteca ctime.
#include<Iostream>
Using namespace std;
#include<cstdlib>
#include<ctime>
Int main() {
Int i=0;
Srand(time(NULL));
For (i=0; i<10; i++) {
Cout<<rand()%100<<endl;
}
Return 0;
}
Acotando los valores para rand(): Podemos limitar el rango de números aleatorios que entrega rand(),
podemos definir el valor inicial (el predeterminado es 0) y el límite superior.
Definiendo un límite superior para rand(): Para definir un límite superior, se utiliza la notación de módulo
(%), a continuación se indica el valor máximo que se desea. por ejemplo.
valor = rand() % 2; // Obtiene valores entre 0 y 1
Ejemplo 2
/* Realice un programa que solicite al usuario que piense un numero entero entre 1 y 100. El programa
debe generar un número aleatorio en ese mismo rango (1-100), e indicarle al usuario si el número que
digito es menor o mayor al número aleatorio, así hasta que lo adivine, y por ultimo mostrarle el número
de intentos que le llevo.
do{
cout<<"\tIngrese un numero entero y positivo: ";
cin>>n;
}while(n!=int(n) or n<=0);
n=int(n);
cout<<"\tLos factores primos de "<<n<<" son: ";
imprimir_primos(n);
cout<<"\n\tCorrecto!!";
return 0;
}
//Otra forma
#include<iostream>
using namespace std;sm
void verif(float n){
while(n<=0 or n!=int(n)){
cout<<"\tVuelva a ingresar un valor: ";
cin>>n;
}
cout<<"\n\t\tCorrecto, "<<n<<" es un entero y positivo"<<endl;
}
void primos(int n){
n=int(n);
cout<<"\n\tLos factores primos son: ";
for(int i=1; i<n; i++){
if(n%i==0){
cout<<i<<"\t";
}}}
int main(){
float n;
cout<<"\tIngrese un valor entero y positivo: ",
cin>>n;
verif(n);
primos(n);
return 0;
}
/* Utilizar la función rand() y srand() para crear una función que genere números
aleatorios entre 100 y 1000.*/
//Numeros aleatorios
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
int a, b, c, generado;
srand(time(NULL));
int n;
cout<<"Ingrese la cantidad de numeros aleatorios que quiera: ";
cin>>n;
cout<<"Tenemos: \n";
for(int i=1; i<=n; i++){
generado=100+rand()%(1000-100+1);
cout<<generado<<" ";
}
return 0;
}
//Numeros pseudoaleatorios
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
int a, b, c, generado, semilla;
cout<<"Ingrese la semilla: ";
int SEMILLA;
cin>>SEMILLA;
srand(SEMILLA);
int n;
cout<<"Ingrese la cantidad de numeros aleatorios que quiera: ";
cin>>n;
cout<<"Tenemos: \n";
for(int i=1; i<=n; i++){
generado=100+rand()%(1000-100+1);
cout<<generado<<" ";
}
return 0;
}
/* Escriba una función en C++ que reciba dos enteros positivos N y C. Esta función debe retornar a cantidad
de números primos de C dígitos que pueden formarse con los dígitos de N. Para formar los números a
comprobarse, deben tomarse los dígitos contiguos de N en forma ordenada (de izquierda a derecha), así
como se muestra en los ejemplos. Si en el proceso se generan números “repetidos”, se cuenta por cada
uno de ellos (se muestra un ejemplo).
N C NumVer Ctd No primo
13787 1 1, 3, 7, 8, 7 2
144 1 1, 4, 4 3
13787 2 13, 37, 78, 87 2
Observaciones:
Si C supera la cantidad de dígitos de N, entonces la función retorna -1.
N siempre es positivo y mayor que cero.
Considerar al número 1 como “no-primo”.
Considerar a C siempre como un entero mayor que cero.
No modificar la función principal (main).
Sugerencias: se encuentran implementadas tres funciones que podrían ser de utilidad
1. int potencia(int a, int b): función que devuelve al valor de a^b, donde b es un número no-negativo.
2. bool esPrimo(int n): función que devuelve true si el número n es primo, y false en caso contrario. Se
supone que n es positivo.
3. int cantDigitos(int n): Función que devuelve la cantidad de dígitos de un número n. Se supone que n es
positivo. */
#include<iostream>
#include<cmath>
using namespace std;
/*Función que devuelve el resultado de a^b.
Se supone que b es un número no-negativo.*/
int potencia(int a, int b){
int i, p=1;
for(i=0;i<b;i++) p*=a;
return p;
}
/*Función que devuelve true si el número n es primo, y false en caso
contrario.
Se supone que n es positivo.*/
bool esPrimo(int n){
if(n==1) {
return false;
}
else{
int i;
for(i=2;i<=sqrt(n);i++){
if(n%i==0) {
return false;
}}
return true;
}}
/*Función que devuelve la cantidad de dígitos de un número n.
Se supone que n es positivo.*/
int cantDigitos(int n){
int dig=0;
while(n>0){
dig++;
n/=10;
}
return dig;
}
/*Función solicitada para el problema planteado.*/
int cantNoPrimos_C_Digitos(int N, int C){
int M;
int cont=0;
if(cantDigitos(N)>=C){
while(cantDigitos(N)>=C){
M=N%potencia(10,C);
N=N/10;
if(esPrimo(M)==false){
cont=cont+1;
}}
return cont;
}
else{
return -1;
}}
/*Función principal*/
int main(){
int N,C;
cin>>N>>C;
cout<<"Cantidad de no-primos de "<<C<<" digitos:
"<<cantNoPrimos_C_Digitos(N,C)<<endl;
return 0;
}
/*Diseñar un programa en C/C++ tal que lea un dos número entero, mayor que 100 y menor que 32000, y
a continuación imprima en pantalla si son o no números amigos. OBS: Dos números amigos son dos enteros
positivos a y b tales que a es la suma de los divisores propios de b, y b es la suma de los divisores propios
de a. (la unidad se considera divisor propio, pero no lo es el mismo número).
Un divisor propio de un número n es cualquier divisor que no es el mismo número que el que divide.
/* Ingrese una variable entera N y a partir de ese valor genere la figura del diamante como muestra los
ejemplos */
#include<iostream>
using namespace std;
void t_isosceles(int n){
int i, j, k, l;
//Necesiaamos un guion por cada fila a excepcion de la ultima
for(int i=0; i<n; i++){
if(i<n){
for(int j=0;j<n-i-1 ;j++){
cout<<"-";
}
for(int k=0; k<2*i+1; k++){
cout<<"*";
}
cout<<endl;
}}
for(int h=n-2; h>=0 ; h--){
/*Escriba un programa que genere números pseudoaleatorios para pasar los siguientes casos de prueba:
case="Caso1 opcion 1 imprimir 10 números entre 2 y 15"
input=1
2 15
output="3 6 11 7 3 5 12 4 3 5 "
case="Caso2 opcion 1 imprimir 10 números entre 5 y 30"
input=1
5 30
output="18 27 16 22 6 6 17 21 6 12 "
case="Caso3 opcion 2 generar 100 números entre 1 y 100 y contar(imprimir) cuantos hay entre entre 3 y
13"
input=2
3 13
output="Se generaron 8 números entre 3 y 13"
case="Caso4 opcion 2 generar 100 números entre 1 y 100 y contar(imprimir) cuantos hay entre entre 10 y
20"
input=2
10 20
output="Se generaron 9 números entre 10 y 20"
case="Caso5 opcion 3 generar 100 números entre 1 y 10, y contar cuantos estan entre 1-3,4-6,7-9"
input=3
100
output="Se generaron 27 números entre 1 y 3
Se generaron 28 números entre 4 y 6
Se generaron 29 números entre 7 y 9"
case="Caso6 opcion 3 generar 200 números entre 1 y 10, y contar cuantos estan entre 1-3,4-6,7-9"
input=3
200
output="Se generaron 53 números entre 1 y 3
Se generaron 56 números entre 4 y 6
Se generaron 72 números entre 7 y 9"
Variable= limite_inf +rand() % (limite_superior +1-limite_inferior);
*/
#include <iostream>
using namespace std;
#include<cstdlib> //contiene las función rand()
#define SEMILLA 1 // para el srand
void imprimirMensaje(int n, int a, int b){
cout<<"Se generaron "<<n<<" numeros entre "<<a<<" y "<<b<<endl;
}
int main () {
int generado,accu,a,b,n,opcion;
cout<<"\tIngrese la opcion: ";
cin>>opcion;
switch(opcion){
case 1://generar 10 números entre a y b
cout<<"Ingrese el limite inferior: ";
cin>>a;
cout<<"Ingrese el limite superior: ";
cin>>b;
srand(SEMILLA);
case 3:
srand(SEMILLA);
cout<<"Ingrese la cantidad de numeros a generar: ";
cin>>n;
int aux1=0, aux2=0, aux3=0;
for(int k=0; k<n; k++){
generado= 1+rand()%(10);
/*Generar el número de pi
#include <iostream>
using namespace std;
#include<cstdlib> //contiene las función rand()
#include<ctime> //para inicializar rand()
#define SEMILLA 1
#define INTERVALO 10000
void imprimirMensajeOpcion2(int n){
cout<<"Se generaron "<<n<<" números dentro del circulo";
}
void imprimirMensajeOpcion3(double pi){
cout<<"El valor estimado de pi es "<<pi;
}
double estimarPi(int n){
float x,y,d;
int accu2=0;
srand(SEMILLA);
for(int i=1;i<=n;i++){
x=(float)(0+rand()%(INTERVALO+1-0))/INTERVALO;
y=(float)(0+rand()%(INTERVALO+1-0))/INTERVALO;
if((x*x+y*y)<=1){
accu2++;
}}
d=accu2;
return d;
}
int main () {
int i,n,opcion,accu;
float aux1;
cout<<"Ingrese la opcion: ";
cin>>opcion;
switch(opcion){
case 1://generar 10 números entre 0 y 1
srand(SEMILLA);
for(int i=1; i<=10; i++){
aux1=(float)(0+rand()%(INTERVALO+1-0))/10000;
cout<<aux1<<" ";
}
// note que con la semilla se fija la secuencia de
números que es siempre la misma
break;
case 2:
srand(SEMILLA);
//generar dos pares n números entre 0 y 1 y verificar
cuantos estan dentro del circulo de radio 1
cin>>n;
float x,y;
for(int i=1; i<=n; i++){
x=(float)(0+rand()%(INTERVALO+1-0))/INTERVALO;
y=(float)(0+rand()%(INTERVALO+1-0))/INTERVALO;
if((x*x+y*y)<=1){
accu++;
}}
imprimirMensajeOpcion2(accu);
break;
case 3:
cin>>n;
float pi=estimarPi(n);
pi=(pi/n)*4;
// Estimar pi con n números aleatorios 4 veces la relacion de
números dentro del circulo sobre los números generados
//completar ;
//completar =estimarPi(n);
imprimirMensajeOpcion3(pi);
break;
}
return 0;
}
/* Utilice la función rand para definir una función que genere una secuencia
fija(semilla=1) de 100 números aleatorios entre 9 y 14 enteros y cuente cuantas
veces salió cada número. */
#include<iostream>
#include<cstdlib>
#define SEMILLA 1
using namespace std;
int main(){
int a, N1=0, N2=0, N3=0, N4=0, N5=0, N6=0;
srand(SEMILLA);
for(int i=0; i<100; i++){
a=9+rand()%(14-9+1);
cout<<a<<" ";
if(a==9){
N1++;
}else if(a==10){
N2++;
}else if(a==11){
N3++;
}else if(a==12){
N4++;
}else if(a==13){
N5++;
}else if(a==14){
N6++;
}}
cout<<endl;
cout<<"\tEl 9 aparece "<<N1<<" veces."<<endl;
cout<<"\tEl 10 aparece "<<N2<<" veces."<<endl;
cout<<"\tEl 11 aparece "<<N3<<" veces."<<endl;
cout<<"\tEl 12 aparece "<<N4<<" veces."<<endl;
cout<<"\tEl 13 aparece "<<N5<<" veces."<<endl;
cout<<"\tEl 14 aparece "<<N6<<" veces."<<endl;
return 0;
}
/*Escriba un programa en C++ que lea un número entero y positivo (validar). Obtenga
un nuevo número invirtiendo el orden de sus cifras y determine la diferencia entre el
numero obtenido y el ingresado por teclado (restar el mayor del menor) */
#include<iostream>
#include<math.h>
using namespace std;
void verif(float n){
while(n<=0 or n!=int(n)){
cout<<"\tVuelva a ingresar un valor: ";
cin>>n;
}
cout<<"\n\t\tCorrecto, "<<n<<" es un entero y positivo"<<endl;
}
void inv(int n){
n=int(n);
int j=n, p=n;
int a, dig=0, b,c, aux=0;
while(j>0){
dig++;
j/=10;
}
cout<<"\n\tLa cantidad de digitos es: "<<dig<<endl;
/*La conjetura de Goldbach afirma que: "Todo número par mayor a 2 puede escribirse como la suma de
dos números primos". Ejemplo: 20=13+7; 50=19+31. Elabore un programa que calcule las posibles sumas
de Goldbach de un número. */
#include<iostream>
#include<math.h>
using namespace std;
int espar(int n){
do{
cout<<"Introduzca un numero par mayor a dos: ";
cin>>n;
}while(n<=2 or n%2!=0);
return n;
}
bool esprimo(int n){
if(n==1) {
return false;
}
else{
int i;
for(i=2;i<=sqrt(n);i++){
if(n%i==0) {
return false;
}}
return true;
}}
int main(){
int n, N;
n=espar(n);
int a, b, c=n, d;
for(int i=2; i<=n; i++){
for(int j=0; j<i; j++){
a=i+j;
if(a==n and esprimo(i) and esprimo(j)){
cout<<"El numero "<<n<<" es igual a la suma de:
"<<i<<" y "<<j<<", dos numeros primos."<<endl;
}}}
return 0;
}
/*. Ingresar por teclado un numero entero mayor que 1000, validarlo, determinar e imprimir el menor de
sus dígitos primos y la suma de sus dígitos*/
#include<iostream>
using namespace std;
int val(float x);
void dig(int x);
bool primo(int x);
int main(){
int n; //probar con float n; despues
n=val(n);
dig(n);
return 0;
}
int val(float x){
do{
cout<<"Ingrese un numero mayor a 1000: ";
cin>>x;
}while(x<1000 or x!=int(x));
x=int(x);
return x;
}
void dig(int x){
int dig, suma=0, m, aux=0;
while(x>0){
dig=x%10;
if(primo(dig)){
if(dig<=aux){
m=dig;
}
if(dig>=aux){ //Probar aca con un else if
m=aux;
}}
if(primo(dig)){
aux=dig;
}else if(dig==1){
m=dig;
}
suma=suma+dig;
x=x/10;
}
cout<<"La suma de los digitos es: "<<suma<<endl;
if(m==1) cout<<"No tiene numeros primos";
if(m==0) cout<<"El menor primo es: "<<aux<<endl;
if(m>1) cout<<"El menor primo es: "<<m<<endl;
}
bool primo(int x){
bool primo=true;
if(x==0 or x==1) return false;
for(int i=2; i<x; i++){
if(x%i==0){
primo=false;
break;
}}
if(primo) return true;
else return false;
}
Unidad 6: Recursividad
Algoritmos recursivos
Expresa la solución de un problema en términos de una llamada a sí mismo. La llamada a si mismo se conoce
como llamada recursiva o recurrente
N! = 1*2*3*…*(N-1)*N
N! = (1*2*3*…*(N-1))*N
N! =(N-1)!*N
Llamada recursiva
Características
Facto (1) = 1
Recursión
long long factorial (int n){
long long facto;
if(n==0= return 1; //caso base
facto=n*factorial(n-1); //llamada recursiva
return facto;
}
Bucle
long long factorial (int n){
Ejemplos
- A través de una función recursiva, calcular a´b, donde a es un entero y b un numero natural
- Calcular la suma de todos los números enteros entre 1 y N, siendo N un número natural.
Recursividad vs Iteración
Aspectos que hay que considerar al decidir cómo implementar la solución a un problema:
Ejemplo 1
//Calcular x^n
float X_n(float x, int n){
//Recibe el flotante de base y un entero de exponente
if(n==0){
return 1;
}else{
return x*X_n (x, n-1);
}
}
Ejemplo 2
//Calcular el enésimo término de la sucesión de Fibonacci, donde cada termino es la suma de los dos
anteriores, y sabiendo que los dos primeros términos son 0 y 1 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
//forma iterativa
int fibonacci (int n){
int actual, ant1, ant2;
ant1=1;
ant2=1;
if((n==0) || (n==1)){
actual=1
}else{
for(int i=2; i<=n; i++){
actual= ant1+ant2;
ant2=ant1;
ant1=actual;
}
}
return (actual);
}
// forma recursiva
int fibonacci (int n){
if((n==1)){
return 0;
}else{
if((n==2)){
return 1;
}else{
return fibonacci(n-1)+fibonacci(n-2);
}}}
Ejemplo Hanoi
void hanoi (int inicio, int fin, int centro, int n){
if(n==1){
cout<<”mover disco 1 de la varilla ”<<inicio<<” a la varilla ”<<fin<<endl;
}
else{
haroi(inicio, centro fin, (n-1));
cout<<”Mover disco “<<n<<” de la varilla “<<inicio<<” a la varilla
“<<fin<<endl;
Hanoi(centro, fin, inicio, (n-1));
}
}
https://www.youtube.com/watch?v=_0yqsR8EIJ4
https://www.geeksforgeeks.org/c-plus-plus/
https://www.hackerrank.com/domains/cpp
s
return 0;
}
long long fibonacci(long x){
long aux;
if(x==0 or x==1){
return 1;
}else{
aux=fibonacci(x-1)+fibonacci(x-2);
return aux;
}
}
/*Escribir un programa que muestre el máximo común divisor (MCD) de dos números A y B
(usando el algoritmo de Euclides) */
#include<iostream>
using namespace std;
int mcd(int, int);
int main()
{
int A,B;
cin>>A>>B;
cout << "El MCD resultante es "<< mcd(A,B)<<endl;
return 0;// no utilice system(pause)
}
int mcd(int a, int b){
int c, d;
if(a==0){
return b;
} else if(b==0){
return a;
}else{
c=a%b;
return mcd(b,c);
}}
/*Elaborar un programa que valide un numero entero y positivo mediante una función no recursiva, y
luego imprima en pantalla su número en binario mediante una función recursiva.
Ejemplo: Para n=5, se muestra en pantalla 101. Para n=12, se muestra en pantalla 1100*/
#include<iostream>
using namespace std;
void binario(int n)
{
if(n==0 or n==1){
cout<<n;
}
else{
binario(int(n/2));
cout<<n%2;
}}
int validar()
{
float n;
cout<<"Ingrese un numero: "<<endl;
cin>>n;
while(n<0 or n!=int(n)){
cout<<"Error";
cin>>n;
}
n=int(n);
}
int main( )
{
int nro=validar();
binario(nro);
return 0;
}
/*Escriba un programa que permita al usuario introducir un número entero y positivo, y luego imprimir
en pantalla el numero invertido. Ejemplo: Para a=1234, se debe imprimir 4321*/
Forma 1
#include<iostream>
using namespace std;
int main(){
int invertir(int, int);
int num;
cout<<"Ingrese el numero: ";
cin>>num;
cout<<"El numero invertido es: "<<invertir(num, 0);
return 0;
}
int invertir(int num, int numInver){
if(num>0){
return invertir(num/10, num%10+numInver*10);
}else{
return numInver;
}}
Pregunta 2: ¿Cómo calcularías la cantidad de alumnos que obtuvieron una nota inferior al
promedio del curso en cierta materia?
Calcular el promedio e ir cargando los números. Pero necesitamos almacenar cada nota para poder
ir comparando.
Estructura de datos
Para salvar estas situaciones, la mayoría de los lenguajes de programación incluyen características
de estructuras de datos. Una estructura de datos es una colección de datos que pueden ser caracterizados
por su organización y las operaciones que se definen en ella (acceso, inserción, borrado)
Se dividen en:
Estructuras de datos
Primitivos
- Int, Float, Char, Double, Puntero
No primitivos
- Lineal
1. Arreglo
2. Pila
3. Cola
4. Lista enlazada
- No lineal
1. Árbol
2. grafo
Arreglos
Un arreglo es una secuencia de posiciones de la memoria central a las que se puede acceder directamente,
que contiene datos del mismo tipo y pueden ser seleccionados individualmente mediante el uso de índices.
El vector nota tiene subíndices o índices de sus elementos {0, 1, 2, …, i, …, n-1} que indican la
posición de un elemento particular dentro del arreglo (de tamaño n). Por ejemplo, si se desea modificar el
tercer elemento de un vector del tipo entero:
Nota[2]=80
Declaración de vectores
Si los elementos del vector están definidos, pueden hacerse la siguiente declaración:
Ejemplos:
float R[10] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};
float S[] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};
int N[] = {1, 2, 3, 6};
El elemento 5° (quinto) de un arreglo, es representado por el índice [4], ya que los índices comienzan en 0.
Esto significa que un arreglo de 10 elementos tendría los índices del 0 al 9: [0...9]
Representación de un arreglo de una dimensión (vector):
1 Arreglo[0]
2 Arreglo[1]
3 Arreglo[2]
4 Arreglo[3]
5 Arreglo[4]
6 Arreglo[5]
Este vector se declara:
Float arreglo[6]
Ejemplo 1:
#include<iostream>
using namespace std;
int main(){
//Cantidad de elementos del vector
int N; //contendra el tamaño del vector
cout<<"Ingrese la cantidad de elementos del vector: ";
cin>>N;
//Declarar el vector
int A[N]; //Define un vector A con N elementos
//Carga del vector
/*
0 (primero) ... n-1(ultimo)
*/
int i,
for(i=0; i<n; i++){
cout<<"Ingrese el elemento A["<<i<<"]: ";
cin>>A[i];
}
//Impresion de datos del vector
cout<<"Los elementos del vector son: ";
for(i=0; i<n; i++){
cin>>A[i]<<"\t";
}
cout<<endl;
//Y si queremos en inverso
cout<<"Los elementos del vector son: ";
for(i=N-1; i>=0; i--){
cin>>A[i]<<"\t";
}
cout<<endl;
return 0;
}
if(cuentaDigitos(a)<5){
return 0;
}else{
return int(a);
}
}
int main(){
int n=validar();
if(n==0) return 0;
int dig=cuentaDigitos(n);
int vector[dig];
// 1 2 3 4 5 - introducimos
// 5 4 3 2 1 - utilizando resto podemos hacer esto
return 0;
}
/*Elaborar un programa en lenguaje c++ que lee un numero entero N, mayor que 2 y menor o igual que
50, luego cargue un vector vect con N números enteros comprendidos entre 1 y 1000, inclusive, generados
al azar (utilice la función semilla) e imprima en el vector generado, luego imprima en pantalla el promedio
de los numeros impares y el de los numeros pares*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int validar(){
float x;
do
{
cout<<"Inserte un numero mayor que dos y menor o igual que 50:
";
cin>>x;
}while(x<=2 or x>50 or x!=int(x));
return int(x);
}
int main()
{
int N=validar();
int vector[N];
srand(time(NULL));
for(int i=0; i<N; i++){
//numero=limiteinf+rand()%(limitesuperior - limiteinferior +1)
vector[i]= 1 +rand()%(1000+1-1);
}
for(int i=0; i<N; i++){
cout<<vector[i]<<"\t";
}
cout<<endl;
int par=0, cp=0, impar=0;
for(int i=0; i<N; i++){
if(vector[i]%2==0){
par+=vector[i];
cp++;
}else {
impar+=vector[i];
}}
cout<<"El promedio de los numeros pares es: "<<(par*1.0)/cp<<endl;
cout<<"El promedio de los numeros impares es: "<<(impar*1.0)/(N-
cp)<<endl;
return 0;
}
/*Elaborar un programa en C++ que permita leer un vector de n componentes de tipo flotante (siendo
"n" un número entero y positivo), y que cree una función auxiliar para transformar dicho vector en
otro cuyas componentes sean el doble de cada componente de la inicial. Imprimir el vector antes y
después del cambio. */
#include<iostream>
using namespace std;
int validar(){
float x;
do{
cout<<"Ingrese un numero entero y positivo: ";
cin>>x;
}while(x!=int(x) or x<=0);
return int(x);
}
void vimprimir(float x[], int n){
int i;
for(i=0; i<n; i++){
cout<<x[i]<<"\t"; //Definicion de la funcion
}
cout<<endl;
}
void vdoble(float x[], int n){
int i;
for(i=0; i<n; i++){
x[i]=2*x[i];
// se recorre un indice cada posicion del vector generico
recibido como
// argumento y se cambia por el doble de esa misma componente
}}
int main(){
int n=validar(), i;
float a[n];
for(i=0; i<n; i++){
cout<<"\nIngrese la componente de la posicion "<<i+1<<" del
vector: ";
cin>>a[i];
}
cout<<"\n\tEl vector original es: "<<endl;
cout<<"\t"<<vimprimir(a,n);
vdoble(a,n);
cout<<"\n\tEl vector modificado con el doble de c/componente es:
"<<endl;
cout<<"\t"<<vimprimir(a,n);
return 0;
}
#include<iostream>
using namespace std;
int main(){
//Desarrolle aquí su programa. Puede emplear funciones auxiliares.
int n;
cin>>n;
int a[n];
for(int i=0; i<n; i++){
cin>>a[i];
}
cout<<endl;
for(int i=0; i<n; i++){
cout<<a[n-i-1]<<" ";
}
cout<<endl;
return 0;
}
/* Copiar un vector*/
#include<iostream>
using namespace std;
/*Función que copia los elementos del vector A en el vector B
(manteniendo el orden original) */
void copiarVector(int A[], int B[], int N){
//Implementar de acuerdo a lo solicitado
if(mayor<V[i]){
mayor=V[i];
}}
return mayor;
}
/*Función que devuelve el valor del mínimo en el vector V de "tam"
elementos*/
int minimo(int V[], int tam){
//Implementar de acuerdo a lo solicitado
int menor=V[0];
for(int i=0; i<tam; i++){
if(menor<V[i+1]){
menor;
}else{
menor=V[i+1];
}}
return menor;
}
//otra forma
int minimo(int V[], int tam){
int menor=V[0];
for(int i=1; i<tam; i++){
if(menor>V[i]){
menor=V[i];
}
}
return menor;
}
/*Función auxiliar - Lectura de un vector*/
//Carga del vector
void leerVector(int X[], int n){
int i;
for(i=0;i<n;i++) cin>>X[i];
}
int main(){
/*---NO MODIFICAR El MAIN*/
int opcion,n;
cin>>opcion;
cin>>n;
int a[n];
if(opcion==1){
leerVector(a,n);
cout<<maximo(a,n);
}
if(opcion==2){
leerVector(a,n);
cout<<minimo(a,n);
}
return 0;
}
#include<iostream>
using namespace std;
/*Función que devuelve la cantidad de apariciones del número x en el
vector A de N elementos*/
int nroApariciones(int x, int A[], int N){
//IMPLEMENTAR
int acum=0;
for(int i=0; i<N; i++){
if(A[i]==x){
acum++;
}}
return acum;
}
/*Función que devuelve el elemento que menos veces aparece en el vector A
de N elementos
(si hay más de uno, devuelve el que aparece primero en el vector -de izq
a der-)*/
int elementoQueMenosAparece(int A[], int N){
int min, b, acum=0;
for(int i=0; i<N ;i++){
for(int j=0; j<N; j++){
if(A[i]==A[j]){
acum++;
}
}
if(i==0){
min=acum;
b=A[i];
}else{
if(acum<min){
min=acum;
b=A[i];
}}
acum=0;
}
return b;
}
cin>>opcion;
cin>>N;
int A[N];
if(opcion==1) cin>>x;
for(i=0;i<N;i++) cin>>A[i];
if(opcion==1) cout<<nroApariciones(x,A,N)<<endl;
if(opcion==2) cout<<elementoQueMenosAparece(A,N)<<endl;
if(opcion==3) cout<<estaOrdenadoNoDesc(A,N)<<endl;
return 0;
}
/*Se cuenta con una lista L1 de N números enteros cargados por teclado (no hace falta validar el valor de N,
ni el de los valores de la lista), en el cual pueden existir valores repetidos.
Con el fin de economizar el espacio de almacenamiento, se desea crear una nueva lista L2 en la cual cada
valor diferente aparece una sola vez, sin repetición, pero indicando la cantidad de veces que se repite dicho
valor en la lista L1.
La interpretación de la lista L2 es como sigue: el valor 23 aparece 5 veces en L1, el valor 27 aparece 4 veces
en L1, el valor 8 aparece 3 veces en L1, y el valor 14 aparece 1 vez en L1. Nótese que se respeta el orden de
aparición de cada uno de los números en la lista L1.
Escriba un programa en C++ que reciba la lista original L1 e imprima en pantalla la lista L2 con las
características indicadas.
Observaciones y recomendaciones:
- Puede emplear el código que se proporciona para comenzar el ejercicio, y completar en las partes
indicadas (de hecho, es el enfoque recomendado para este ejercicio). También puede borrarlo y escribir
desde cero si lo considera conveniente, siempre que se respeten los formatos de entrada y salida (ver los
casos de prueba al final de esta página).
- Puede evaluar su programa las veces que crea necesario, y corregir errores que surjan.
- Si el programa no compila y no pasa los casos de prueba, no tendrá puntaje.
No utilice system("pause") en el código.
*/
#include<iostream>
using namespace std;
#include<cstdio>
int ingresar_n(){
float n;
do{
cin>>n;
}while(n!=int(n) || n<=2);
return int(n);
}
void cargarDatos(float X[], float Y[], int n){
X[0]=0; // tiempo al cuadrado inicial cero
Y[0]=60;
//complete la funcion
float aux;
//empieza desde 1 pq ya estan cargados los primeros elementos
for(int i=1; i<n ; i++){
do{
cin>>aux;
X[i]=aux*aux;
cin>>Y[i];
}while(X[i]<X[i-1] or Y[i]>Y[i-1]);
}}
float sumatoria_X(float X[], int n){
float sum=0;
for(int i=0; i<n; i++){
sum=sum+X[i];
}
return sum;
}
float sumatoria_XY(float X[], float Y[], int n){
float sum=0;
for(int i=0; i<n; i++){
sum= sum + X[i]*Y[i];
}
return sum;
}
void imprimirSumatorias(float sum_x,float sum_y, float sum_xy, float
sum_x2){
printf("Sumatoria X= %.2f\n",sum_x);
printf("Sumatoria Y= %.2f\n",sum_y);
printf("Sumatoria XY= %.2f\n",sum_xy);
printf("Sumatoria X^2= %.2f\n",sum_x2);
}
m=(n*sumatoria_XY(X,Y,n)-
sumatoria_X(X,n)*sumatoria_X(Y,n))/(n*sumatoria_XY(X,X,n)-
sumatoria_X(X,n)*sumatoria_X(X,n));
b=(sumatoria_X(Y,n)-m*sumatoria_X(X,n))/n;
imprimirSumatorias(sumatoria_X(X,n),sumatoria_X(Y,n),sumatoria_XY(X,Y,n),
sumatoria_XY(X,X,n));
imprimirGravedadAltura(m, b);
}
int main(){
/*---NO MODIFICAR El MAIN*/
int opcion,n;
cin>>opcion;
n=ingresar_n();
if(opcion==1){
cout<<n<<endl;
return 0;
}
float X[n],Y[n];
if(opcion==2){
cargarDatos(X,Y,n);
for(int i=0;i<n;i++) cout<<X[i]<<" "<<Y[i]<<endl;
}
else{
cargarDatos(X,Y,n);
if(opcion==3) cout<<sumatoria_X(X,n)<<endl;
if(opcion==4) cout<<sumatoria_XY(X,Y,n)<<endl;
if(opcion==5) calcularYmostrarRecta(X,Y,n);
}
return 0;
}
/*Calcular la cantidad de alumnos que obtuvieron nota inferior al promedio del curso en cierta materia. Hay 20
alumnos, y todos rindieron. Las notas son números enteros que van del 0 al 100 (se asume que todas las notas
son correctas).*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
int A[20], suma=0;
float prom;
srand(time(NULL));
for(int i=0; i<20; i++){
A[i]=rand()%(100-1);
cout<<A[i]<<" ";
suma+=A[i];
}
cout<<endl;
prom=(suma*1.0)/20;
cout<<"\tEl promedio es: "<<prom<<endl;
int a1;
for(int j=0; j<20; j++){
if(A[j]<prom){
a1++;
}}
cout<<"\tLa cantidad de alumnos que obtuvieron puntajes menor al promedio es: "<<a1<<endl;
return 0;
}
/*Se tienen las temperaturas (promedio) de todos los días del mes de mayo de 2020 almacenados en el vector
Temp (luego de cargar por teclado). Diseñar un programa que obtenga las temperaturas máxima y mínima de
cada quincena (e indique los días correspondientes).*/
#include<iostream>
using namespace std;
int main(){
int Temp[31];
for(int i=0;i<31;i++){
cout<<"Cargue la temperatura del dia "<<i+1<<" : ";
cin>>Temp[i];
}
int mayor1=0, menor1=0;
int mayor2=0, menor2=0;
for(int i=0; i<31;i++){
if(i>=0 and i<=14){
if(i==0){
mayor1=Temp[i];
}else if(mayor1<Temp[i]){
mayor1=Temp[i];
}
if(i==0){
menor1=Temp[i];
}else if(menor1>Temp[i]){
menor1=Temp[i];
}
}else{
if(i==15){
mayor2=Temp[i];
}else if(mayor2<Temp[i]){
mayor2=Temp[i];
}
if(i==15){
menor2=Temp[i];
}else if(menor2>Temp[i]){
menor2=Temp[i];
}
} }
cout<<"La temperatura mayor en la primera quincena es: "<<mayor1<<endl;
cout<<"La temperatura menor en la primera quincena es: "<<menor1<<endl;
cout<<"La temperatura mayor en la segunda quincena es: "<<mayor2<<endl;
cout<<"La temperatura menor en la segunda quincena es: "<<menor2<<endl;
return 0;
}
0 1 2 3 4
0 1 0 0 0 0
1 0 0 2 0 0
2 1 1 0 0 1
3 2 1 1 1 0
4 1 2 1 2 2
¿Para qué sirven un array bidimensional de números?
Podemos realizar cálculos matemáticos complejos ordenando las ecuaciones en matrices.
𝑥 + 2𝑦 + 𝑧 = 0
{−3𝑥 + 2𝑦 − 5𝑧 = 2
2𝑥 + 6𝑦 − 𝑧 = −2
Podemos almacenar datos numéricos en matrices bidimensionales:
El término arreglo no es en realidad una traducción, sino un anglicismo (más bien, un término que
no existe en español). Un arreglo en C++ es un conjunto de datos que se almacenan en memoria de manera
contigua con el mismo nombre y para diferenciar los elementos de un arreglo se utiliza un índice.
Se utilizan índices luego del nombre del arreglo y encerrados por [].
Sintaxis
<tipo> <identificador> [<num_elementos>] [ [<num_elementos>] . . .];
Arrays multidimensionales:
Sintaxis
La forma de declararlas es mediante una serie de expresiones entre corchetes [ ]:
TipoX etiqueta[<expr-c1>][<expr-c2>]…[<expr-cn>]
Cargar el arreglo sqrs con los cuadrados de los números del 1 al 1º y luego visualizarlos.
Using namespace std;
Int main()
{
Int sqrs[10];
Int I;
For(i=1; i<11;i++){
Sqrs[i-1]=i+i;
}
For(i=0; i<10;i++){
Cout<<sqrs[i]<<endl;
}
Return 0;
}
/*Crear un programa en C++ que reciba el valor para el numero de filas y columnas, además nos pida
ingresar los datos por teclado*/
#include<iostream>
using namespace std;
int main(){
int m, n;
cout<<"Ingrese filas: "; cin>>m;
cout<<"Ingrese comuna: "; cin>>n;
int A[m][n];
// n cantidad de columnas
// m cantidad de filas
for(int i=0; i<m; i++){ //en el primer recorrido hacemos fila por
fila
for(int j=0; j<n; j++){ // en este recorrido hacemos columna
por columna
cin>>A[i][j];
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cout<<"\t"<<A[i][j];
}
cout<<endl;
}
return 0;
}
Observaciones sobre las funciones y las matrices
// no podemos pasar una matriz a una funcion
// no podemos simplemente poner a[m][n] o a[int m][int n]
// una forma de solucionar es a[3][5]
// pero es una desventaja ya que no se puede optar por la dimension
// un detalle es que podemos obviar la primera dimesion a[][5]
// existen hipermatrices c[1][2][5[9]
// entonces tienen hiper filas e hiper columna
void aux(int a[][]){
/* si modifico el valor de a[][] en esta funcion, al final a queda
modificada en el main, recordamos que las variables normales
no sucede eso */
}
Ejemplo 3:
#include<iostream>
using namespace std;
main()
{
int matriz[6][4][4],i j, k;
for(i=0; i<6;i++)
{
for(j=0; j<4; j++)
{
for(k=0; k<4; k++)
{
matriz[i][j][k]=i+j+k;
cout<<matriz[i][j][k]<<" ";
}
cout<<endl;
}
cout<<endl;
}
system("pause");
}
Ejemplo 4:
#include<iostream>
using namespace std;
main()
{
int matriz[4][5], i, j;
for(i=0; i<4; i++){
for(j=0; j<5; j++){
matriz[i][j]=i+j;
cout<<matriz[i][j]<<" ";
}
cout<<endl;
}
system("pause");
}
Ejemplo 5:
*/Crea una matriz de elementos aleatorios donde el límite superior sea 10*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
srand(time(NULL));
int m, n;
cout<<"Ingrese filas: "; cin>>m;
cout<<"Ingrese comuna: "; cin>>n;
int A[m][n];
Ejemplo 6:
/*Dada una matriz cuadrada de dimensión N intercambiar los elementos de tal forma a hallar la
transpuesta de la misma. Imprimir la matriz original y luego la matriz transpuesta. La transpuesta
consiste en intercambiar las filas y las columnas*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
int n;
cout<<"Ingrese el tamaho: "; cin>>n;
int A[n][n];
srand(time(NULL));
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
// cout<<"ingrese el valor correspondiente al espacio
["<<i<<"] ["<<j<<"]: ";
A[i][j]=rand()%11;
}}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout<<A[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl;
int B[n][n], Aux[n][n];
• EJERCICIO PROPUESTO
• Elaborar un programa que genere, al azar, un conjunto de 50 pares de números enteros no negativos (fil,
col) e imprima dichos pares de números, donde fil es menor o igual que 4 y col es menor o igual que 5,
cuente cada par generado y la cuenta cargarla en la posición (fil, col) de una matriz mat de orden 5x6.
Luego imprima dicha matriz.
https://www.youtube.com/watch?v=__63anwZ_7A
https://www.youtube.com/watch?v=jrsSePJOREk
#include<iostream>
using namespace std;
int main()
{
int m,n,i,j,s;
cout<<"Ingrese m: ";
cin>>m;
cout<<"Ingrese n: ";
cin>>n;
int A[m][n],B[m][n];
//Leer la Matriz A
//No modificar las instruccion instrucciones de entrada
cout<<endl;
cout<<"Ingrese el valor de los elementos de la matriz: "<<endl;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
cin>>A[i][j];
}}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
cout<<A[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<endl;
//genearando la matriz B
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
int acum=0;
//suma
//izquierda: una columna hacia atras
if(j>0){
acum += A[i][j-1];
}
//arriba
if(i>0){
acum += A[i-1][j];
}
//derecha
if(j<n-1){
acum += A[i][j+1];
}
//abajo
if(i<m-1){
acum += A[i+1][j];
}
cout<<endl;
B[i][j]=acum;
}}
//Completar
//imprimir matriz
//No modificar el formato de impresión
i=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<B[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
/*Escribir un programa que reciba (por teclado) las dimensiones de una matriz A de m filas y n columnas,
además de sus elementos (que serán números enteros). El programa debe generar (y mostrar en pantalla)
una matriz B que tenga las mismas dimensiones, donde cada elemento (i, j) es la suma de los elementos
de A que están arriba, abajo, a la izquierda y a la derecha de la posición (i, j) (como se muestra en la
imagen). Para no considerar (como centro) las posiciones que están al borde de A, simplemente se copian
los elementos en esas posiciones a las respectivas en B (por eso el color de fondo distinto para dichas
posiciones).*/
#include<iostream>
using namespace std;
int main(){
int m,n,i,j,s;
/*Entrada de datos (dimensiones de la matriz A y sus elementos) - No modificar esta parte*/
cin>>m>>n;
int A[m][n],B[m][n];
for(i=0;i<m;i++) for(j=0;j<n;j++) cin>>A[i][j];
/*Fin - Entrada de datos*/
/*Rellenamos los bordes de B con los elementos originales (correspondientes) en A*/
//En este for se copian los elementos de la primera columna y de la última
for(i=0;i<m;i++){
B[i][0] = A[i][0];
B[i][n-1] = A[i][n-1];
}
//Ahora debemos copiar los elementos de la primera fila y de la última...
for(j=1 ; j<n-1 ;j++){
B[0][j] = A[0][j];
B[m-1][j] = A[m-1][j];
}
/*Ahora calcularemos el resto de los elementos de B, según el enunciado*/
for(i=1; i<m-1; i++){
for(j=1; j<n-1; j++){
int acum=0;
acum +=A[i][j-1]; //izq
acum +=A[i-1][j]; //arriba
acum +=A[i][j+1]; //derecha
acum +=A[i+1][j]; //abajo
B[i][j]=acum;
}}
/*Salida de datos (impresión de la matriz B) - No modificar esta parte*/
for(i=0;i<m;i++){
for(j=0;j<n;j++) cout<<B[i][j]<<" ";
cout<<endl;
}
return 0;
}
/*Lea dos números enteros y positivos (validarlos) m y n, que representan, respectivamente, el número de
filas y el número de columnas de una matriz mat de componentes reales. Luego lea e imprima las m´n
componentes de mat y tres números k, l y f, los dos primeros enteros positivos menores o iguales que m,
pudiendo ser uno sólo de ellos cero, y el tercero un número real no nulo. Determine e imprima la matriz
obtenida después de sumar a la fila k, la fila l previamente multiplicada por f.*/
#include<iostream>
using namespace std;
int main(){
float s, p;
do{
cout<<"Ingrese filas: "; cin>>s;
}while(s<=0 or s!=int(s));
do{
cout<<"Ingrese columnas: "; cin>>p;
}while(p<=0 or p!=int(p));
int m, n;
m=s;
n=p;
float mat[m][n];
//hasta aca la validacion
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout<<"Cargue el elemento correspondiente al espacio
["<<i<<"]["<<j<<"]: ";
cin>>mat[i][j];
}}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cout<<mat[i][j]<<"\t";
}
cout<<endl;
}
int k, l; //menor o iguales a m podiendo alguno ser cero
float f; //real no nulo
bool bandera=true;
do{
cout<<"Ingrese k: "; cin>>k;
cout<<"Ingrese l: "; cin>>l;
if(k==0 and l==0){
bandera=true;
}else bandera=false;
}while( k<0 or k>m or l<0 or l>m or bandera);
// poner un or(k==0 and k==l) hace que repita todo
do{
cout<<"Ingrese f: "; cin>>f;
}while(f==0);
#include<iostream>
using namespace std;
int main(){
int M, N; //no pide validad
cout<<"Ingrese filas: "; cin>>M;
cout<<"Ingrese columnas: "; cin>>N;
float mat[M][N];
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
cout<<"Cargue el elemento correspondiente al espacio
["<<i<<"]["<<j<<"]: ";
cin>>mat[i][j];
}}
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
cout<<mat[i][j]<<"\t";
}
cout<<endl;
}
//encontrando el mayor numero posible
int aux=0;
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
if(j==0 and i==0){
aux=mat[i][j];
}else if(aux<mat[i][j]){
aux=mat[i][j];
}}}
cout<<"\n\nEl maximo valor es el: "<<aux<<"\n\n";
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
mat[i][j]=mat[i][j]/aux;
}}
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
cout<<mat[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
/*Se cuenta con una lista L1 de N números enteros cargados por teclado (no hace falta validar el valor de
N, ni el de los valores de la lista), en el cual pueden existir valores repetidos. Con el fin de economizar el
espacio de almacenamiento, se desea crear una nueva lista L2 en la cual cada valor diferente aparece una
sola vez, sin repetición, pero indicando la cantidad de veces que se repite dicho valor en la lista L1.
La interpretación de la lista L2 es como sigue: el valor 23 aparece 5 veces en L1, el valor 27 aparece 4 veces
en L1, el valor 8 aparece 3 veces en L1, y el valor 14 aparece 1 vez en L1. Nótese que se respeta el orden de
aparición de cada uno de los números en la lista L1.
Escriba un programa en C++ que reciba la lista original L1 e imprima en pantalla la lista L2 con las
características indicadas. */
#include<iostream>
using namespace std;
/*Función que carga un vector de N elementos con valores introducidos por
teclado*/
void cargarVector(int A[], int N){
int i;
for(i=0;i<N;i++) cin>>A[i];
}
/*Función que muestra en pantalla los elementos de un vector de N
elementos*/
void imprimirVector(int A[], int N){
int i;
for(i=0;i<N;i++) cout<<A[i]<<" "; cout<<endl;
}
/*Función que indica con verdadero si un elemento x está en un vector de
N elementos, y falso en caso contrario.
El entero "salto" indica el incremento en el proceso de recorrer el
vector*/
bool estaEnElVector(int A[], int N, int x, int salto){
int i;
for(i=0;i<N;i+=salto){
if(x==A[i]) return true; //x está en el vector (en la posición i)
}
return false; //ya que no se encontró x en el proceso de búsqueda
}
/*Función que devuelve la cantidad de elementos distintos en un vector de
N elementos*/
int contarElementosDistintos(int A[], int N){
int elemDist=0; //contador con el nro de elementos distintos
int B[N]; //vector que almacenará los elementos distintos de A (como
máximo, hay N distintos)
int i; //índice
for(i=0;i<N;i++){
if(!estaEnElVector(B,elemDist,A[i],1)) B[elemDist++] = A[i]; //si
A[i] no estaba en B, lo agregamos
}
Est. Janethe A. Olazar
P á g i n a | 131
return elemDist;
}
/*Función para obtener la lista L2 según las especificaciones del
problema*/
void obtenerListaL2(int L1[], int L2[], int N){
int k=0, cuenta=0, clave;
bool ban;
for(int i=0; i<N; i++){
clave=L1[i];
cuenta=0;
ban=true;
- Secuencial (lineal)
Lo que hacemos es buscar un elemento de la lista utilizando el valor destino llamado clave. Los
elementos se examinan en secuencia, uno después de otro. Se recorre cada uno de los elementos hasta
el final de la lista de datos. Si en algún lugar se encuentra el elemento buscado, el algoritmo informa
sobre las posiciones respectivas.
- Binaria
Se requiere que todos los elementos se encuentren almacenados en forma ordenada. Consiste en
comparar el elemento buscado con el que ocupa en la lista la posición central. Si son iguales, se detiene
la búsqueda. Si no, se elige la sablista hasta o desde el elemento buscado es menor o mayor al elemento
central.
Hay que tener en cuenta que la lista debe estar previamente ordenado, este algoritmo reduce el
tiempo de búsqueda, ya que disminuye considerablemente el número de iteraciones necesarias.
En el peor de los casos el número máximo de comparaciones es Log2 n+1
¿Se encuentra el 1 en el array?
-9 0 1 4 7 9 10 15
0 1 2 3 4 5 6 7
-9 0 1
0 1 2
1
2
Sintaxis:
Búsqueda lineal
int busquedaLineal (int vector[], int N, int clave)
{
for(int i=0; i<N; i++){
if(vector[i]==clave)
return i;
}
return -1;
}
Búsqueda binaria
int busquedaBinaria(int vector[], int n, int clave)
{
int centro, inf=0, sup = n-1;
while( inf<=sup ){
centro = ((sup+inf)/2);
if(vector[centro]==clave) return centro;
else if(vector[centro] > clave) sup=centro-1;
else inf=centro+1;
}
return -1;
}
Ejemplo visual:
Posición 0 1 2 3 4 5 6 7 8 9
Valor 3 4 5 6 7 9 10 12 13 15
Clave: 3
Posición 0 1 2 3 4 5 6 7 8 9
Valor 3 4 5 6 7 9 10 12 13 15
Vector[1]==3? … No, es menor
Posición 0 1 2 3 4 5 6 7 8 9
Valor 3 4 5 6 7 9 10 12 13 15
Vector[0]==3? ... Si. Retornamos 0 y se termina el ciclo
Ejemplo 1.1:
/*Búsqueda secuencia de una clave en un vector de n datos de izquierda a derecha comenzando en la
posición 0. Retorna -1 si la clave no está en el vector V y la posición de la primera aparición si se encuentra
en el vector V */
#include<iostream>
using namespace std;
int busquedaLinalID(int V[], int n, int clave){
for(int i=0; i<n; i++){
if(V[i]==clave){
return i;
}else if(i==n-1){
return -1;
}}}
int main(){
int n=7, clave;
int V[7]={1 , 2 , 3 , 4 , 5 , 6 , 7};
for(int i=0; i<7; i++){
cout<<V[i]<<"\t";
}
cout<<"\nIngrese la clave: ";
cin>>clave;
cout<<busquedaLinalID(V, n, clave);
return 0;
}
Ejemplo 1.2:
/*En este caso es de derecha a izquierda, comenzando desde la derecha*/
#include<iostream>
using namespace std;
int busquedaLinalID(int V[], int n, int clave){
for(int i=n-1; i>0; i++){
if(V[i]==clave){
return i;
}else if(i==n-1){
return -1;
}}}
int main(){
int n=7, clave;
int V[7]={1 , 2 , 3 , 4 , 5 , 6 , 7};
for(int i=0; i<7; i++){
cout<<V[i]<<"\t";
}
cout<<"\nIngrese la clave: ";
cin>>clave;
cout<<busquedaLinalID(V, n, clave);
return 0;
}
Ejemplo 2:
/*Busqueda secuencia de una clave de un vector de n datos ordenados crecientemente de izquierda a
derecha comenzando en la primera posicion */
#include<iostream>
using namespace std;
int BSecOrAscendente(int V[], int n, int clave){
bool encontrada=false;
int i=0;
while((!encontrada) and (i<n)){
encontrada=(V[i]>=clave);
if(!encontrada) i++;
}
if(i<n){
encontrada=V[i]==clave;
}
return encontrada ?1 : -1;
}
int main(){
int n, clave;
cout<<"Ingrese un tamaho: ";
cin>>n;
int V[n];
for(int i=0; i<n; i++){
cin>>V[i];
}
for(int i=0; i<n; i++){
cout<<V[i]<<"\t";
}
cout<<"\nIngrese la clave: ";
cin>>clave;
cout<<BSecOrAscendente(V, n, clave);
return 0;
}
/*Busqueda secuencia de una clave en un vector de n datos de derecha a izquierda comenzando en la
última posición. Retorna -1 si la clave no está en el vector V y la posición de la última aparición si se
encuentra en el vector V*/
#include<iostream>
using namespace std;
int busquedaLinalDI(int V[], int n, int clave){
for(int i=n-1; i>0; i--){
if(V[i]==clave){
return i;
}else if(i==0){
return -1;
}}}
int main(){
int n=7, clave;
int V[7]={1 , 2 , 3 , 4 , 5 , 6 , 7};
for(int i=0; i<7; i++){
cout<<V[i]<<"\t";
}
cout<<"\nIngrese la clave: ";
cin>>clave;
cout<<busquedaLinalDI(V, n, clave);
return 0;
}
https://www.youtube.com/watch?v=9yO65W7KgpE
1. Método burbuja
La orientación burbuja es un sencillo algoritmo de ordenamiento. Funciona revisando cada
elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están
en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más
intercambios, lo cual significa que la lista esta ordenada. Este algoritmo obtiene su nombre de la
forma con la que suben por la lista los elementos durante los intercambios los intercambios, como si
fueran pequeñas “burbujas”.
También es conocido como el método de intercambio directo. Dado que solo usa
comparaciones para operar elementos, se lo considera un algoritmo de comparación, siento uno de
los más sencillos de implementar.
Este algoritmo realiza el ordenamiento o reordenamiento de una lista a de n valores, en este
caso de n términos numerados de 0 a n-1: consta de dos bucles anidados, uno con el índice i, que da
un tamaño menor al recorrido de la burbuja en sentido inverso de 2 a n y un segundo bucle con el
índice j, con un recorrido desde 0 hasta n-i, para cada iteración del primer bucle, que indica el lugar
de la burbuja.
3 6 -9 8 1
3 -9 6 8 1
3 -9 6 8 1
3 -9 6 1 8
Se repite desde el inicio
-9 3 6 1 8
-9 3 6 1 8
-9 3 1 6 8
-9 3 1 6 8
Sintaxis:
void Burbuja (float A[], int n){
float aux;
for (int i = 0 ; i<n-1 ; i++){
for(int j=0; j<n-1 ; j++){
if(A[j]>A[j+1]){///
aux=A[j];
A[j]=A[j+1];
A[j+1]=aux;
}
}
}
}
Ejemplo 1:
Seas un arrays de la forma [1 5 2 3 6] y queremos ordenar de forma ascendente.
Lo que hacemos es ir comparando elemento a elemento de manera mecánica
Preguntamos, ¿es el primer elemento es menor al siguiente?
[1 5 2 3 6] misma pregunta -> [1 2 3 5 6]
En el caso que en el primer recorrido no este ordenado se van a necesitar más filas
Ejemplo 2:
#include<iostream>
using namespace std;
int main(){
int a[10]={6, 10, 2, 1, 7, 3, 9, 8, 4, 5};
for(int i=0; i<10; i++){
cout<<a[i];
}
cout<<endl;
//minimo se hace un recorrido igual a la cantidad de elementos
int aux;
for(int i=0; i<10; i++){
for(int j=0; j<9-i; j++){
if(a[j]>a[j+1]){
aux=a[j];
a[j]=a[j+1];
a[j+1]=aux;
}}}
for(int i=0; i<10; i++){
cout<<a[i];
}
cout<<endl;
return 0;
}
2. Método de Selección
Se elige al elemento más pequeño y se coloca en la posición que corresponde (intercambiamos).
Luego se elige el segundo elemento más pequeño y colocamos en su posición correspondiente
[intercambio]. Y así sucesivamente…
https://www.youtube.com/watch?v=J0HfY4WFgfY
3 6 -9 8 1
-9 6 3 8 1
-9 1 3 8 6
-9 1 3 8 6
-9 1 3 8 6
Sintaxis:
void seleccion (float A[],int n){
int i_min;
float aux;
for(int i=0 ; i<n-1 ; i++){
i_min=i;
for (int j=i+1; j<n ; j++){
if(A[j]<A[i_min]){//
i_min=j;
}
aux=A[i_min];
A[i_min]=A[i];
A[i]=aux;
}
}
}
3. Método de Inserción
Se toma una sublista inicial con un único elemento que se considera siempre “ordenada”. En
la sublista ordenada se irán insertando sucesivamente los restantes elementos de la lista inicial en el
lugar adecuado.
Sintaxis:
void insercion(float A[], int n){
bool encontrado;
float aux;
int j;
for(int i=1; i<n ; i++){
aux=A[i];
j=i-1;
encontrado=false;
while(j>=0 and !encontrado){
if(A[j]>aux){
A[j+1]=A[j];
j--;
}else{
encontrado=true;
}
}
A[j+1]=aux;
}
Códigos
1. Burbuja
void Burbuja (float A[], int n){
float aux;
for (int i = 0 ; i<n-1 ; i++){
for(int j=0; j<n-1 ; j++){
if(A[j]>A[j+1]){///
aux=A[j];
A[j]=A[j+1];
A[j+1]=aux;
}}}}
2. Selección
void seleccion (float A[],int n){
int i_min;
float aux;
for(int i=0 ; i<n-1 ; i++){
i_min=i;
for (int j=i+1; j<n ; j++){
if(A[j]<A[i_min]){//
i_min=j;
}
aux=A[i_min];
A[i_min]=A[i];
A[i]=aux;
}}}
3. Inserción
void insercion(float A[], int n){
bool encontrado;
float aux;
int j;
for(int i=1; i<n ; i++){
aux=A[i];
j=i-1;
encontrado=false;
while(j>=0 and !encontrado){
if(A[j]>aux){
A[j+1]=A[j];
j--;
}else{
encontrado=true;
}}
A[j+1]=aux;
}
}
4. Quicksort
#include<iostream>
using namespace std;
void quicksort(int A[], int izq, int der){
int i=izq, j=der, x, aux;
x=A[(izq+der)/2];
do{
while((A[i]<x) && (j<=der)){
i++;
}
while((x<A[j] && (j>izq))){
j--;
}
if(i<=j){
aux=A[i];
A[i]=A[j];
A[j]=aux;
j--;
i++;
}
}while(i<=j);
if(j>izq){
quicksort(A,izq,j);
}
if(i<der){
quicksort(A,i, der);
}
}
int main(){
5. Megasort
#include<iostream>
using namespace std;
#include<cstdlib>
#include<ctime>
void imprimirVector(int x[], int n){
int i;
for(i=0;i<n;i++) cout<<x[i]<<" ";
cout<<endl;
}
void mezclar(int A[], int p, int q, int r){
int i,j,k;
int n1 = q-p+1;
int n2 = r-q;
/* Creamos vectores auxiliares */
int L[n1], R[n2];
/* Copiamos datos a los vectores L[] y R[] */
for(i=0;i<n1;i++) L[i] = A[p+i];
for(j=0;j<n2;j++) R[j] = A[q+1+j];
/* Mezclar los vectores temporales y colocarlos en A[p...r]*/
i = 0; // Posicion inicial en L[]
j = 0; // Posicion inicial en R[]
k = p; // Posicion inicial en A[] (en el sector que va de A[p...r]
while(i<n1 && j<n2) {
if(L[i]<=R[j]){
A[k] = L[i];
i++;
}
else{
A[k] = R[j];
j++;
}
k++;
}
/* Copiamos los elementos restantes de L[] (si los hay) */
while(i<n1) {
A[k] = L[i];
i++;
k++;
}
/* Copiamos los elementos restantes de R[] (si los hay) */
while(j<n2) {
A[k] = R[j];
j++;
k++;
}}
void mergeSort(int A[], int p, int r){
if(p<r) {
//Se halla el punto medio
int q = (p+r)/2;
//Se ordena cada una de las mitades (llamada recursiva)
mergeSort(A,p,q);
mergeSort(A,q+1,r);
mezclar(A,p,q,r);
}}
void ordenarVecMergesort(int A[], int N){
mergeSort(A,0,N-1);
}
int main(){
//Se ingresa el tamaño del vector
int N;
cout<<"Ordenamiento por mezcla (Mergesort) \n";
cout<<"Ingrese la cantidad de elementos: ";
cin>>N;
//Se declara el vector
int A[N];
//Se carga el vector
int i,j;
srand(time(NULL));
for(i=0;i<N;i++) A[i] = rand()%10;
//Se muestra el vector original
cout<<"\nVector original:\n";
imprimirVector(A,N);
//Ordenamiento por mezcla
ordenarVecMergesort(A,N);
//Se muestra el vector ordenado
cout<<"\nVector ordenado:\n";
imprimirVector(A,N);
return 0;
}
/*Elaborar un programa que lea dos números enteros y positivos m y n, mayores a 2 y menores o
iguales a 10 generados al azar. Muestre en pantalla la matriz generado. Por último, ordene cada
una de las filas de dicha matriz en forma ascendente utilizando el método de inserción y muestre
en pantalla la matriz completa con cada una de sus filas ordenadas */
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int validacion();
int main(){
int m, n;
cout<<"Ingrese el numero de filas de la matriz: ";
m=validacion();
cout<<"Ingrese el numero de columnas de la matriz: ";
n=validacion();
int A[m][n];
srand(time(NULL));
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
A[i][j]=rand()%(100+1);
}}
cout<<"\nLa matriz generada es: \n";
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cout<<A[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl;
for(int l=0; l<m; l++){
int i_min;
int aux;
for(int i=0; i<n-1; i++){
i_min=i;
for(int j=i+1; j<n; j++){
if(A[l][j]<A[l][i_min]){
i_min=j;
}
aux=A[l][i_min];
A[l][i_min]=A[l][i];
A[l][i]=aux;
[l }}}
cout<<"\nLa matriz ordenada es: \n";
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cout<<A[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl;
return 0;
}
int validacion(){
float numero;
do{
cout<<"\nEl numero debe ser positivo, mayor 0 igual a dos y
menor o igual a 10."<<endl;
cin>>numero;
}while(numero<2 or numero!=int(numero) or numero>10);
return int(numero);
}
/*Para la distribución de asientos en un examen, se asigna un numero aleatorio a cada alumno de
los n alumnos (“n” no debe de ser validado), para que cada alumno se siente en el lugar que le
corresponde según la posición de su número al azar. Ordene los números generados
aleatoriamente de forma ascendente y utilice el número de cédula para identificar a cada alumno.
Por ejemplo, para 5 alumnos con CI cargados por teclado:
111111 2222222 3333333 4444444 5555555
Se les asignan los números aleatorios:
41 18467 6334 26500 19169
Luego se ordenan las cedulas de acuerdo a los números aleatorios del menor al mayor*/
#include<iostream>
#include<cstdlib>
#define semilla 1
using namespace std;
void imprimir(int A[], int N){
for(int i=0; i<N; i++){
cout<<A[i]<<"\t";
}
cout<<endl;
}
void burbuja(int A[], int B[], int n){
int aux, aux2;
for(int i=0; i<n-1; i++){
for(int j=0; j<n-1; j++){
if(A[j]>A[j+1]){
aux= A[j];
aux2= B[j];
A[j]= A[j+1];
B[j]= B[j+1];
A[j+1]=aux;
B[j+1]=aux2;
}}}}
int main(){
int n;
cin>>n;
srand(semilla);
int N1[n], N2[n];
for(int i=0; i<n; i++){
cin>>N1[i];
N2[i]=rand();
}
burbuja(N2, N1, n);
imprimir(N2, n);
imprimir(N1, n);
}
Est. Janethe A. Olazar
P á g i n a | 147
/*Cree un programa en c++ que reciba n fechas de nacimientos (“n” ingresado por teclado), que deben
de ser guardados en una matriz 3xn, siendo la primera fila la que guarde los años, la segunda los meses y
la tercera los días. Posteriormente imprima las fechas en un orden ascendente.
Ejemplo:
Siendo n=6:
Años: 2000 1999 2000 2001 2010 2009
Meses: 6 6 6 7 3 3
Días: 19 19 20 12 12 12
En orden:
Años: 1999 2000 2000 2001 2009 2010
Meses: 6 6 6 7 3 3
Días: 19 19 20 12 12 12 */
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int A[3][n];
//Carga del vector
for(int j=0; j<n; j++){
for(int i=0; i<3; i++){
cin>>A[i][j];
}}
//impresión del vector
for(int i=0; i<3;i++){
if(i==0) cout<<"Ano\t";
if(i==1) cout<<"Mes\t";
if(i==2) cout<<"Dia\t";
for(int j=0; j<n; j++){
cout<<A[i][j]<<"\t";
}
cout<<endl;
}
int aux, aux1, aux2;
int clave;
//Ordenamos primero los años
for(int l=0; l<n-1; l++){
for(int j=0; j<n-1; j++){
if(A[0][j]>A[0][j+1]){
aux=A[0][j];
aux1=A[1][j];
aux2=A[2][j];
A[0][j]=A[0][j+1];
A[1][j]=A[1][j+1];
A[2][j]=A[2][j+1];
A[0][j+1]=aux;
A[1][j+1]=aux1;
A[2][j+1]=aux2;
}
}
}
//impresión del vector
for(int i=0; i<3;i++){
if(i==0) cout<<"Ano\t";
if(i==1) cout<<"Mes\t";
if(i==2) cout<<"Dia\t";
for(int j=0; j<n; j++){
cout<<A[i][j]<<"\t";
}
cout<<endl;
}
//ordenamos los meses y dias
for(int l=0; l<n-1; l++){
for(int j=0; j<n-1; j++){
if(A[0][j]==A[0][j+1]){
if(A[1][j]>A[1][j+1]){
aux=A[0][j];
aux1=A[1][j];
aux2=A[2][j];
A[0][j]=A[0][j+1];
A[1][j]=A[1][j+1];
A[2][j]=A[2][j+1];
A[0][j+1]=aux;
A[1][j+1]=aux1;
A[2][j+1]=aux2;
}else if(A[1][j]==A[1][j+1]){
if(A[2][j]>A[2][j+1]){
aux=A[0][j];
aux1=A[1][j];
aux2=A[2][j];
A[0][j]=A[0][j+1];
A[1][j]=A[1][j+1];
A[2][j]=A[2][j+1];
A[0][j+1]=aux;
A[1][j+1]=aux1;
A[2][j+1]=aux2;
}
}
}
}
}
//impresión del vector
for(int i=0; i<3;i++){
if(i==0) cout<<"Ano\t";
if(i==1) cout<<"Mes\t";
if(i==2) cout<<"Dia\t";
for(int j=0; j<n; j++){
cout<<A[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
/*Escribir un programa que reciba (por teclado) la dimensión de una matriz cuadrada A (n x n),
además de sus elementos (que serán números enteros). El programa debe hallar la suma de sus
elementos de la diagonal principal. Si dicha suma da como resultado un numero par deberá
ordenar la matriz de manera ascendente por columnas, en caso contrario ordenar la matriz de
manera descendente por columnas como se muestra en la imagen*/
#include<iostream>
using namespace std;
int main(){
int n,sumaD=0;
/*Entrada de datos (dimension de la matriz A y sus elementos) - No
modificar esta parte*/
cin>>n;
int A[n][n];
for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>A[i][j];
/*Fin - Entrada de datos*/
//Ahora debemos hallar la suma de los elementos de la diagonal
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i==j){
sumaD=sumaD+A[i][j];
}
}
}
int Aux[n*n];
//Con un vector auxiliar, en este caso carga fila por fila
int k=0;
for(int l=0; l<n; l++){
}
//Colocando nuevamente en una matriz
k=0;
for(int l=0; l<n; l++){
for(int j=0; j<n; j++){
A[j][l]=Aux[k];
k++;
}
}
/*Salida de datos (impresión de la matriz ordenada) - No modificar
esta parte*/
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) cout<<A[i][j]<<"\t";
cout<<endl;
}
/*Fin - Salida de datos*/
return 0;
}
/*Completar la función: ordenamiento Escalera, que recibe como parámetros la dirección de una matriz
cuadrada y la dimensión de la misma
Ordenación escalera. */
#include <iostream>
//sin punteros
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int A[n][n];
for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin>>A[i][j];
int m=n*n;
int aux[m];
int Aux;
int k=0;
//carga al auxiliar
for(int i=0; i<n;i++){
for(int j=0; j<n; j++){
aux[k]=A[i][j];
k++;
}
}
//orden
for(int i=0; i<m-1 ;i++){
for(int j=0; j<m-1; j++){
if(aux[j]>aux[j+1]){
Aux=aux[j];
aux[j]=aux[j+1];
aux[j+1]=Aux;
}
}
}
k=0;
for(int i=0; i<n ;i++){
for(int j=0; j<n; j++){
if((i+2)%2==0){
A[i][j]=aux[k];
k++;
}else{
A[i][n-j-1]=aux[k];
k++;
}
}
}
for(int i=0; i<n;i++){
for(int j=0; j<n; j++){
cout<<A[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
El valor de una variable esta almacenada en la memoria RAM, cada celda tiene 8 bites
aproximadamente (1 byte).
Sintaxis
Int *direc;
Sizeof();
La variable direc ahora puede guardar la dirección de cualquier variable del tipo int Si
requerimos guardar la dirección de cualquier otro tipo de variable declararíamos de forma análoga.
La función de sizeof nos ayuda a saber cuánto está ocupando dentro del almacenamiento (Calcula
el número de bytes de un tipo de dato o variable).
Ejemplo:
void main(void){
int a, b, c;
int *p1, *p2;
int **p; // p es un
Ejemplo:
int *p;
double *q;
void *r;
p = q; //ilegal
p = (int *) q; //legal
r = q; //legal
p = r //ilegal
*r = 3; //ilegal
Observación:
El operador * es el” desreferenciador”. Al aplicarlo a un puntero, se accede al objeto al que apunta.
Un ejemplo del uso de estos operadores es el siguiente:
int x=1, y=2, z[3];
int *ip; // ip es un puntero del tipo int
ip=&x; // ip apunta a x
y=*ip // ahora y toma el valor de uno
*ip=0; // ahora x toma el valor de cero
Ejemplo:
*ip = *ip + 10; //incrementa x en 10
y = *ip + 1; //es lo mismo que poner y=x+1
*ip += 1; //incrementa el valor de x en 1
++*ip; //también incrementa x en 1;
(*ip)++ /*se usa el paréntesis para incrementar x. Si no se coloca,
se incrementa el valor del puntero!*/
Puntero y Arrays
En un arrays los elementos están guardados uno al lado del otro, por lo que si tenemos la dirección
de uno de los elementos podemos acceder a los demás elementos sumando o restando números.
Ejemplo:
Doube vect[10];
Doublé *P;
…
P=&vect[0];
…
*p
*(p+1) =
*(p+2) =
Ejemplo:
/* Leer e imprimir una matriz m*n, trabajando con funciones */
#include<iostream>
using namespace std;
void cargar(int *q, int m, int n){
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cin>>*(q+i*n+j);
}}}
void imp(int *q, int m, int n){
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cout<<*(q+i*n+j)<<" ";
}
cout<<endl;
}}
int main(){
int m,n;
cout<<"Introduzca el tamaño de la columna y la fila: "<<endl;
cin>>m>>n;
int a[m][n];
int *p;
p=&A[0][0];
cargar(*p, m, n);
imp(*p, m, n);
return 0;
}
Nota para una formula general para matrices y punteros:
𝑝𝑢𝑛𝑡𝑒𝑟𝑜 + 𝑖 ∗ 𝑛𝑢𝑚𝑒𝑟𝑜𝐶𝑜𝑙𝑢𝑚𝑛𝑎 + 𝑗
Quicksort
Es un algoritmo de divide y cenceras. Funciona seleccionando un elemento pivote de la matriz
dividiendo los otros elementos en dos submatrices
6 5 3 1 8 7 2 4
6 5 3 1 8 7 2 4
2 5 3 1 8 7 6 4
2 5 3 1 8 7 6 4
2 5 3 1 8 7 6 4
2 5 3 1 8 7 6 4
2 1 3 5 8 7 6 4
2 1 3 5 8 7 6 4
1 2 3 5 8 7 6 4
1 2 3 4 8 7 6 5
…
1 2 3 4 5 6 7 8
Ejemplo:
/*Quicksort por punteros*/
#include<iostream>
using namespace std;
void quicksort(int *p, int izq, int der){
int i=izq, j=der, aux;
int piv=(izq+der)/2;
do{
while(i<=der and *(p+1)<*(p+piv)){
i++;
}
while(j>izq and *(p+j)=>*(p+piv)){
j--;
}
if(i<=j){
aux=*(p+1);
*(p+1)=*(p+j);
*(p+j)=aux;
j--;
i++;
}
}while(i<=j);
if(j>izq){
quicksort(p,j,izq)
}
if(i<der){
quicksort(p,i, der)
}
}
int main(){
int A[]={12, 11, 13, 5, 6};
int *p;
p=&A[0];
quicksort(p, 0, 4); //prob
for(int i=0; i<5; i++){
cout<<A[i]<<" ";
}
return 0;
}
int i, j, k, m, n,mayor,menor;
float promedio;
m = leeInt( ); //no modificar esta parte
n = leeInt( ); //no modificar esta parte
float mat1[m][n], matamp[m][n+3];
float *p1, *p2;
p1=&mat1[0][0]; //P1 apunta a la matriz mat1
p2=&matamp[0][0];
cargarmatriz(m, n, p1, p2);
for(i=0;i<m;i++){
maymenprom(m, n, i, &mayor, &menor, &promedio, *mat1);
return(0);
}
int leeInt(){ //no modificar esta funcion
float kf;
do {
cin >> kf; }
while ( kf != int(kf )|| kf <= 0 );
return int(kf);
}
void maymenprom(int m, int n, int i, int *may, int *men, float
*prom,float *mat) //desarrollar la funcion
{
float suma=0;
*may=*(mat+n*i+0);
*men=*(mat+n*i+0);
for(int j=0; j<n ; j++){
if(*(mat+n*i+j)>*may){
*may=*(mat+n*i+j);
}
}
for(int j=0; j<n; j++){
if(*(mat+n*i+j)<*men) *men=*(mat+n*i+j);
}
for(int j=0; j<n; j++){
suma=suma+*(mat+n*i+j);
}
*prom=int(suma/n);
}
void cargarmatriz(int m, int n, float *mat,float *matamp)
//desarrollar la funcion
{
int aux=0;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cin>>*(mat+n*i+j);
*(matamp+n*i+j+aux)=*(mat+n*i+j);
if((j+1)%n==0) aux=aux+3;
}
}
}
void impMat( int m, int n, float *mat ){ //no modificar esta funcion
int i, j,k;
k = 0;
for (i=0; i<m; i++){
for(j=0; j<n; j++){
cout << *(mat+n*i+j)<<" ";
}
}
}
/* Elabore un programa que pida al usuario las dimensiones de una matriz MxN y luego pida al
usuario que introduzca los elementos de la matriz en orden ascendente, luego imprima la matriz
(para todo utilice punteros).*/
#include<iostream>
using namespace std;
void cargar(int *p, int tam){
for(int i=0; i<tam; i++){
if(i==0){
cin>>*(p+i);
}
else{
cin>>*(p+i);
while(*(p+i)<=*(p+i-1)){
cout<<"\n\tIngrese nuevamente, no es ascendente
<3 \n";
cin>>*(p+i);
}}}}
void imprimir(int *p, int m, int n){
for(int i=0; i<m*n; i++){
cout<<*(p+i)<<" ";
if((i+1)%n==0){
cout<<endl;
}
}
cout<<"\n\t\tAnd I will try to fix you <3 ";
}
int main(){
int m, n;
cout<<"Ingrese los valores de m y n: \n";
cin>>m>>n;
int A[m][n];
int *p;
p=&A[0][0];
cout<<"Cargue la matriz: \n";
cargar( p, m*n);
imprimir(p, m, n);
/*Crear una matriz de números enteros de 3 filas y 5 columnas, cargarla con la sucesión de
Fibonacci a través de una función y luego imprimir la matriz utilizando punteros*/
#include<iostream>
using namespace std;
void cargaFibo(int *p, int m, int n){
int aux=0;
for(int i=0; i<m*n; i++){
if(i==0){
*(p+i)=0;
}
else if(i==1){
*(p+i)=1;
}else if (i>=2){
*(p+i)= *(p+i-2) + *(p+i-1);
}}}
void imprimir(int *p, int m, int n){
for(int i=0; i<m*n; i++){
cout<<*(p+i)<<"\t";
if((i+1)%n==0){
cout<<endl;
}}}
int main(){
int m=3, n=5;
int A[m][n];
int *p=&A[0][0];
cargaFibo(p, m, n);
imprimir(p, m, n);
return 0;
}
//otra forma de ver la carga de fibonacci
Fibonacci(int x){
int elemento=1, elementoAnt=0, aux, i=0;
while(i<=x){
if(i==x){
return elemento;
} else {
if(i==0) {
elemento=1;
elementoAnt=1;
i++;
} else {
aux=elemento;
elemento=elemento+elementoAnt;
elementoAnt=aux;
i++;
}
}
}
}
Est. Janethe A. Olazar
164 | P á g i n a
/*Crear un programa que requiera las dimensiones de una matriz MxN, la cargue con números
aleatorios del 0 al 99, imprima la matriz y luego la mande a una función, donde los elementos de
la matriz que son pares serán divididos entre 2 y los impares serán multiplicados por 2. Para
imprimir la matriz y hacer la función utilice punteros*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void carga(int *p, int m, int n){
for(int i=0; i<m*n; i++){
*(p+i)=rand()%(99+1);
}
}
void funcion(int *p, int m, int n){
for(int i=0; i<m*n; i++){
if(*(p+i)%2==0){
*(p+i)=*(p+i)/2;
}else{
*(p+i)=*(p+i)*2;
}
}
}
void imprimir(int *p, int m, int n){
for(int i=0; i<m*n; i++){
cout<<*(p+i)<<"\t";
if((i+1)%n==0){
cout<<endl;
}
}
}
int main(){
int m, n;
cout<<"Ingrese las dimensiones de la matriz: \n";
cin>>m>>n;
int A[m][n];
srand(time(NULL));
int *p=&A[0][0];
carga(p, m, n);
imprimir(p, m, n);
cout<<endl;
funcion(p, m, n);
imprimir(p, m, n);
return 0;
}
/**/
Por lo tanto:
- Un carácter
Char c=’a’ //ocupa 1 byte
- Una cadena
Char cad[]=”a” //ocupa 2 bytes
Ejemplo 1:
#include<iostream>
using namespace std;
int main(){
char nombre[100];
char apellido[100];
cout<<"Ingrese el nombre y el apellido: ";
cin>>nombre;
cin>>apellido;
cout<<"\nEl apellido, nombre es:\n";
cout<<apellido<<", "<<nombre;
return 0;
}
Ejemplo 2:
#include<iostream>
using namespace std;
int main(){
char nombre[100];
char apellido[100];
cout<<"Ingrese el apellido, nombre: ";
cin.getline(apellido, 100, ',');
cin.getline(nombre, 100);
cout<<"\nEl nombre apellido es:\n";
cout<<nombre<<" "<<apellido<<endl;
return 0;
}
Problemas con el “Salto” de cin.getline()
El problema nace cuando estamos usando esta función, el problema de “salto” de ciertas
instrucciones de lecturas de cadenas. Un ejemplo visual sería:
Como podrá comprobarse, luego de ingresar la primera cadena, automáticamente muestra ambas
cadenas en pantalla (en donde cad2 está vacía) y finaliza el programa. En resumen, esto ocurre porque el
enter que dimos al cargar “hola” quedó almacenado en el buffer, y es tomado por el cin.getline() para cad2
(que resulta en una cadena vacía, ya que ese enter es el delimitador por defecto).
Uso de fflush()
Generalmente damos solución a esto empleando la instrucción fflush(stdin) para limpiar el buffer de
entrada, impidiendo que el enter se cargue en el cin.getline() siguiente. Esta función se encuentra en la
librería cstdio.
El problema está en que fflush() está definido para el buffer de salida (stdout), siendo su
comportamiento indefinido para el buffer de entrada (stdin).
Para solucionar este inconveniente se propone el uso de la función cin.ignore(), la cual se encarga de
ignorar el enter en el buffer de entrada.
int main(){
char cad[7750]="Hola", cad2[50]="mundo";
return 0;
}
II. Propia implementación de la función que copia de una cadena a otra
#include<iostream>
using namespace std;
void copiarCadena(char cadena1[], char cadena2[]){
int i=0;
while(cadena2[i]!='\0'){
cadena1[i]=cadena2[i];
i++;
}
cadena1[i]='\0';
}
int main(){
char cad1[50]="holaaaaa", cad2[50]="chauu";
copiarCadena(cad1, cad2);
cout<<"Ahora cad1 contiene: "<<cad1<<endl;
return 0;
}
III. Propia implementación de la concatenación de dos cadenas
#include<iostream>
using namespace std;
void concatenarCadenas(char cadena1[], char cadena2[]){
//Nos posicionamos al final de cad 1
int i=0;
while(cadena1[i]!='\0') i++;
int j=0;
while(cadena2[j]!='\0'){
cadena1[i]=cadena2[j];
i++;
j++;
}
cadena1[i]='\0';
}
int main (){
char cad1[50]="mundo", cad2[50]="hola";
concatenarCadenas(cad1, cad2);
cout<<"Ahora la cadena 1 contiene: "<<cad1<<endl
return 0;
}
IV. strcmp
Strcmp (cadena1, cadena2)
Ejemplo, con horca y horario, da un numero >0, debido a que en la tabla la c esta después que la a
V. Propia implementacion de comparacion de cadenas
#include<iostream>
using namespace std;
int compararCadenas(char cadena1[], char cadena2[]){
int i=0;
while(cadena1[i]!='\0' and cadena1[i]==cadena2[i]){
i++;
}
if(cadena1[i]==cadena2[i]) return 0;
if(cadena1[i]>cadena2[i]) return 1;
if(cadena1[i]<cadena2[i]) return -1;
}
int main(){
char cad1[50]="horca", cad2[50]="horario";
int m=compararCadenas(cad1, cad2);
cout<<"La diferencia es: "<<m<<endl;
return 0;
}
//atoi e itoa
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
char cad[]="12345";
//atoi --> array to integer
int a=atoi(cad); // a <-- 12345
cout<<"El numero representado por la cadena es: "<<a<<endl;
char cad2[10];
//itoa --> integer to array
itoa(a, cad2, 10); // cad <--"12345"
cout<<"\nLa cadena que representa al numero es: "<<cad2<<endl;
return 0;
}
VI. atoi
n=123*10+('4'-'0')
i=3
*/
#include<iostream>
#include<cstdlib>
using namespace std;
int cadAEntero(char cad[]){
int i=0, n=0, signo=1;
//si tenemos un numero negativo
if(cad[i]=='-'){
signo=-1;
i++;
}
while(cad[i]!='\0'){
n=10*n+(cad[i]-'0');
i++;
}
return (n*signo);
}
int main(){
char cad[]="12345";
//conversion a un numero entero
int a=cadAEntero(cad); // a <-- 12345
cout<<"El numero representado por la cadena es: "<<a<<endl;
return 0;
}
VII. itoa
#include<iostream>
#include<cstdlib>
using namespace std;
void enteroACad(int n, char cad[]){
//cotamos la cantidad de digitos de n
int nroDig=0;
int aux=n;
while(aux>0){
aux=aux/10;
nroDig++;
}
cad[nroDig]='\0';
aux=n;
int pos=nroDig-1, dig;
while(pos>=0){
dig=aux%10;
aux=aux/10;
cad[pos]=dig+'0';
pos--;
}
}
int main(){
int a=123459;
char cad[20];
//conversion a cadena
enteroACad(a, cad); // cad <--"12345"
cout<<"\nLa cadena que representa al numero es: "<<cad<<endl;
return 0;
}
s = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} */
#include<iostream>
using namespace std;
bool esNumeroHex(char cad[]){
int i=0;
while(cad[i]!='\0'){
if(! ((cad[i]>='0' and cad[i]<='9') or (cad[i]>='A' and
cad[i]<='F'))){
return false;
}
i++;
}
return true;
}
int main(){
char cad1[]="A41E0"; //correcto
if(esNumeroHex(cad1)) cout<<"Cad1 representa un nro
hexadecimal"<<endl;
else cout<<"cad1 NO representa un nro hexadecimal"<<endl;
char cad2[]="A4ZE0"; //Incorrecto (Z)
if(esNumeroHex(cad2)){
cout<<"Cad2 representa un nro hexadecimal"<<endl;
}
else cout<<"cad2 NO representa un nro hexadecimal"<<endl;
return 0;
}
/*Escribir una función que reciba una cadena y cambie todas las letras minúsculas por mayusculas. Escribir
otra funcion que haga lo inverso. */
#include<iostream>
using namespace std;
void pasarMayus(char cad[]){
int i=0;
while(cad[i]!='\0'){
if(cad[i]>='a' and cad[i]<='z'){
cad[i]=cad[i]-('a'-'A');
}
i++;
}
}
void pasarMinus(char cad[]){
int i=0;
while(cad[i]!='\0'){
if(cad[i]>='A' and cad[i]<='Z'){
cad[i]=cad[i]+('a'-'A');
}
i++;
}
}
int main(){
char frase[]="hOLa QuE tAl123 - compuTACION";
//pasamos a mayusculas
pasarMayus(frase);
cout<<"La cadena en mayuscula es: \n"<<frase<<endl;
//pasamos a minuscula
pasarMinus(frase);
cout<<"\nLa cadena en minuscula es:\n"<<frase<<endl;
return 0;
}
/*Escribir una funcion que invierta el orden de los digitos de un entero introduciento por teclado
/*Implementar la funcion:
ejemplo:
/*Escribir un programa que reciba dos numeros enteros y positivos por teclado (max de 100 cifras c/u) y
muestre su suma en pantalla.
Nota: el maximo valor que almacena una variable de tipo int es +2147483647 (10 cifras) */
#include<iostream>
#include<cstring>
using namespace std;
//devuelve el maximo entre dos numeros enteros
int maximo(int a, int b){
if(a>b) return a;
else return b;
}
//invierte una cadena
void invertirCad(char cad[]){
int tam=strlen(cad);
int i;
char aux;
for(i=0; i<tam/2; i++){
aux=cad[i];
cad[i]=cad[tam-i-1];
cad[tam-i-1]=aux;
}
}
int main(){
char a[101], b[101]; // +1 por el caracter de terminacion
cout<<"Ingrese el primer numero: ";
cin>>a;
cout<<"Ingrese el segundo numero: ";
cin>>b;
char s[102];
calcularSuma(a, b, s);
cout<<"\nLa suma es: "<<s<<endl;
cout<<"(Tiene "<<strlen(s)<<" digitos!)"<<endl;
return 0;
}
/*Lea una cadena de caracteres desde teclado, y luego permita determinar la cantidad de veces que
aparecen en la cadena las primeras 5 consonantes del abecedario, imprimiendo dicho número*/
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char cad[100];
cout<<"Ingrese su oracion: ";
cin.getline(cad,sizeof(cad));
int cont[5]={0,0,0,0,0};
int i=0;
while(cad[i]!='\0'){
//Debemos analizar cad[i];
if(cad[i]=='B' or cad[i]=='b') cont[0]++;
if(cad[i]=='C' or cad[i]=='c') cont[1]++;
if(cad[i]=='D' or cad[i]=='d') cont[2]++;
if(cad[i]=='F' or cad[i]=='f') cont[3]++;
if(cad[i]=='G' or cad[i]=='g') cont[4]++;
//tambien podemos colocar con el codigo ASCII
i++;
}
cout<<"Cantidad de b en la cadena: "<<cont[0]<<endl;
cout<<"Cantidad de c en la cadena: "<<cont[1]<<endl;
cout<<"Cantidad de d en la cadena: "<<cont[2]<<endl;
cout<<"Cantidad de f en la cadena: "<<cont[3]<<endl;
cout<<"Cantidad de g en la cadena: "<<cont[4]<<endl;
return 0;
}
/*Permita ordenar en orden alfabético los elementos de una cadena ingresada desde teclado (por ejemplo,
la cadena “casa”, debe devolver como resultado la cadena “aacs”). Imprimir la cadena original y la cadena
ordenada. */
#include<iostream>
#include <cstring>
using namespace std;
void insercion(char A[], int n){
bool encontrado;
char aux;
int j;
for(int i=1; i<n ; i++){
aux=A[i];
j=i-1;
encontrado=false;
while(j>=0 and !encontrado){
if(A[j]>aux){
A[j+1]=A[j];
j--;
}else{
encontrado=true;
}
}
A[j+1]=aux;
}
}
int main(){
char cad[100];
cin.getline(cad, sizeof(cad));
cout<<cad<<endl;
insercion(cad, strlen(cad));
cout<<cad<<endl;
return 0;
}
/*Implemente la función void estitulo (char []). La función debe verificar si la cadena ingresada es un título,
para cumplir con la condición el primer carácter tiene que ser un carácter de tipo mayúscula y estar
comprendidos entre las letras ‘A’ y la ‘Z’, los siguientes caracteres tienen que ser letras minúsculas entre
la ‘a’ y la ‘z’ o espacios. Por último, la función debe imprimir el mensaje “ES título” si cumple las condiciones
dadas o “NO es título” sino la cumple las condiciones mencionadas
Ejemplos:
· Lenguaje de programacion -> ES titulo
· lenguaje de programacion -> NO es titulo
· Lenguaje de #programcion -> NO es titulo
*/
#include<iostream>
#include <cstring>
using namespace std;
/*Permita modificar una cadena ingresada desde teclado, de tal forma que solamente queden letras en la
misma, tanto mayúsculas como minúsculas, y se elimine todo otro caracter. Imprimir la cadena original y
la cadena después de realizado el cambio */
#include<iostream>
#include <cstring>
using namespace std;
int main(){
char cad[100];
cout<<"Ingrese la cadena: "<<endl;
cin.getline(cad, sizeof(cad));
modificar(cad);
return 0;
}
/* Elaborar un programa en C++ que permita codificar una cadena de caracteres introducida desde teclado,
según el esquema propuesto:
- Cada letra entre A y F deberá ser cambiada por la letra que está dos posiciones más adelante en el
alfabeto (ejemplo: A por C); lo mismo aplica para las minúsculas correspondientes.
- Cada letra desde la G hasta antes de la S, deberá ser cambiada por la que está tres posiciones más
adelante (ejemplo: G por J); lo mismo aplica para las minúsculas correspondientes.
- Cada letra desde la S en adelante (hasta Y), por la que está una posición más adelante (ejemplo: S
por T); lo mismo aplica para las minúsculas correspondientes.
- Para el caso de la letra Z, cambiarla por la letra A; lo mismo aplica para las minúsculas
correspondientes.
- En el caso de los números del 0 al 8, reemplazar un número dado por el consecutivo (ejemplo: el 1
por 2, etc.), y en caso del dígito 9 reemplazarlo por un 0. Utilizar una función para la codificación,
y mantener inalterados todos los demás caracteres que no sean letras o números (puntos, comas,
etc.).
Imprimir finalmente el resultado de la codificación*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
/*Lea una cadena de caracteres desde teclado, y luego permita determinar la cantidad de caracteres
numéricos presentes en la cadena, imprimiendo dicho número. */
#include<iostream>
using namespace std;
int cantNum(char cad[]){
int aux, i=0;
while(cad[i]!='\0'){
if(cad[i]>='0' and cad[i]<='9'){
aux++;
}
i++;
}
return aux;
}
int main(){
char cad[50];
cout<<"Ingrese los caracteres: \n";
cin.getline(cad, 50);
cout<<"La cantidad de caracteres del orden numerico es: ";
cout<<cantNum(cad);
return 0;
}
/*Lea el nombre completo de una persona, y además una letra cualquiera desde teclado, y que compruebe
cuántas veces aparece dicha letra en el nombre dado, si es que aparece. Imprimir la letra ingresada en
cuestión y el número de veces obtenido*/
#include<iostream>
using namespace std;
int estaEn(char cad[], char B){
int i=0, aux=0;
while(cad[i]!='\0'){
//Como no especifica el problema, al buscar el caracter buscamos tanto
mayusculas como minusculas
if(B>='A' and B<='Z'){
if(cad[i]==B or cad[i]==B+32){
aux++;
}
}else if(B>='a' and B<='z'){
if(cad[i]==B or cad[i]==B-32){
aux++;
}}
i++;
}
return aux;
}
int main(){
char cad[50];
cout<<"Ingrese el nombre completo de la persona: ";
cin.getline(cad, 50);
char B;
cout<<"Ingrese la letra a buscar: ";
cin>>B;
cout<<"Las vecees que '"<<B<<"' aparece en cad, es: ";
cout<<estaEn(cad, B);
return 0;
}
/* Escribir una función convertirBinarioADecimal () que reciba un número binario (como cadena, la cual
puede tener hasta 30 caracteres que representen a los bits) y devuelva su equivalente en el sistema
decimal (con el tipo de dato int).
Se puede suponer que el usuario siempre ingresará una cadena válida; es decir, sus caracteres representan
bits ('0' ó '1'), y tiene 30 caracteres como máximo.
Ejemplos:
int main(){
char binario[31];
cin>>binario;
cout<<"El equivalente en sistema decimal es:
"<<convertirBinarioADecimal(binario);
return 0;
}
/*Escribir una función fechaValida () que reciba una fecha (como cadena, en formato (dd/mm/aaaa), y que
indique, a través de un mensaje en pantalla, si la misma es válida o no. Se puede suponer que siempre se
ingresará una fecha con este formato; y que d, m y a siempre serán caracteres que representen a los dígitos
del 0 al 9 (por ejemplo, una fecha ingresada podría ser así: 35/13/2021).
Si la fecha es válida, debe imprimirse (en pantalla) el mensaje "La fecha ingresada es valida.". En caso
contrario, ¡debe imprimirse en pantalla “La fecha ingresada es invalida!"
Obs: se debe considerar los años bisiestos y la cantidad de días de cada mes válido. */
#include<iostream>
using namespace std;
/*Funcion que retorna 1 si el año es bisiesto, y 0 en caso contrario*/
int esBisiesto(int a){
return ((a%4==0 && a%100!=0) || a%400==0);
}
/*Funcion que retorna la cantidad maxima de dias en un determinado mes*/
int cantMaxDiaMes(int m, int a){
if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) return 31;
if(m==4 || m==6 || m==9 || m==11) return 30;
if(m==2){
if(esBisiesto(a)) return 29;
else return 28;
}
return -1;
}
void fechaValida(char fecha[]){
int dia, mes, anho, diaMax;
dia= (fecha[0]-'0')*10+(fecha[1]-'0');
mes=(fecha[3]-'0')*10+(fecha[4]-'0');
anho=(fecha[6]-'0')*1000+(fecha[7]-'0')*100+(fecha[8]-
'0')*10+(fecha[9]-'0');
diaMax=cantMaxDiaMes(mes, anho);
int main(){
char fecha[11];
cin>>fecha;
fechaValida(fecha);
return 0;
}
/*Elaborar un programa en C++ que permita invertir cada letra de una frase leída desde teclado, de tal
forma que se pueda leer la frase original leyendo de derecha a izquierda (por ejemplo, la cadena "Hola
FIUNA Paraguay", debe devolver como resultado la cadena "yaugaraP ANUIF aloH"). Imprimir la cadena
modificada.
Observaciones y recomendaciones:
El programa debe cumplir con los formatos de entrada y salida del problema (como se indica en
el ejemplo).
Puede evaluar su programa las veces que crea necesario, y corregir errores que surjan.
Para obtener la calificación, se evaluará con la última versión de su código.
Si el programa no compila, no tendrá puntaje.
No utilice system("pause") en el código. */
#include<iostream>
#include<cstring>
using namespace std;
#define TAMMAXCAD 1001
void modificar(char cad[]){
int nro;
nro= strlen(cad)-1;
char aux[nro];
for(int i=0; i<strlen(cad); i++){
aux[nro]=cad[i];
nro--;
}
for(int i=0; i<strlen(cad); i++){
cout<<aux[i];
}
}
int main(){
//IMPLEMENTAR
char cad[TAMMAXCAD];
cin.getline(cad, sizeof(cad));
modificar(cad);
return 0;
}
/*Escribir un programa en C++ que lea por teclado un conjunto de N palabras (el valor de N es ingresado
previamente, también por teclado) y las muestre en pantalla en orden alfabético.
Por ejemplo: si se ingresa "fiuna", "compu", "semana", "cadenas"; deberá mostrarse en pantalla:
"cadenas", "compu", "fiuna", "semana".
int main(){
int N; //cantidad de palabras
cin>>N;
int i;
char palabras[N][31]; //utilizaremos una matriz de caracteres, donde
cada linea contendrá una palabra
//cargamos la matriz
for(int i=0; i<N; i++){
cin>>palabras[i];
}
//Implementar aquí la solución
char aux[31];
for(int i=0; i<N; i++){
for(int j=0; j<N-1; j++){
//Analizamos el valor de la diferencia entre dos cadenas
if(strcmp(palabras[j],palabras[j+1])>0){
strcpy(aux,palabras[j]);
strcpy(palabras[j],palabras[j+1]);
strcpy(palabras[j+1], aux);
}
}
}
for(int i=0; i<N;i++){
cout<<palabras[i]<<endl;
}
return 0;
}
/*Código Morse */
Entrada: .---- ..... ..--- ---.. --... ----. -.... .---- .----
Salida: 152 8796 11
Observaciones y recomendaciones:
El programa debe cumplir con los formatos de entrada y salida del problema (como se indica en el
ejemplo).
Puede evaluar su programa las veces que crea necesario, y corregir errores que surjan.
Para obtener la calificación, se evaluará con la última versión de su código.
Si el programa no compila, no tendrá puntaje.
No utilice system("pause") en el código.
#include<iostream>
#include<cstring>
using namespace std;
#define TAMMAXCAD 1001
int main(){
//IMPLEMENTAR
char morse[10][6]={".----","..---","...--","....-",".....", "-
....","--...", "---..", "----.", "-----"};
char nros[10]={'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
char entrada[TAMMAXCAD];
cin.getline(entrada, sizeof(entrada));
char aux[6];
int k=0;
for(int i=0; i<strlen(entrada); i++){
if(entrada[i]!=' '){
aux[0+k]=entrada[i];
k++;
aux[5]='\0';
if(k==5){
for(int j=0; j<10; j++){
if(strcmp(morse[j], aux)==0){
cout<<nros[j];
if(entrada[i+2]==' '){
cout<<" ";
}
}
}
k=0;
}
}
}
Sintaxis
Struct nombre{
TipoDato nombrecampo1;
TipoDato nombrecampo2;
TipoDato nombrecampo3;
…
} variables;
Una vez definida una estructura se puede usar igual que cualquier otro tipo de dato de C++.
Esto significa que se pueden declarar variables del tipo estructura en cualquier parte del programa.
Para ello se utiliza la forma normal de declaración de variables Producto prod;
Hasta podemos crear arrays de struct: Producto p [10];
Struct anidadas
Podemos crear estructuras dentro de otras estructuras, es decir, estructuras anidadas
struct Alumno{
Struct Fecha{ unsingned int cedula;
Luego imprima los datos de todas las mujeres, la que más gana (y el monto) y la más joven (y su edad).
Ejemplo:
- A 32 f 1000
- B 33 f 2000
- C 25 m 3000
- D 30 m 4000
- E 34 f 1500 */
#include<iostream>
#include<cstdio>
using namespace std;
//Cree aqui la estructura empleado con los campos indicados
struct empleado{
char nombre[20];
unsigned short edad;
char sexo;
unsigned int sueldo;
};
//Validamos la cantidad de empleados
int leerN(int a) {
float N;
do{
cout << "Ingrese un numero entero mayor o = a " << a << ": ";
cin >> N;
} while ( N != int(N) or (N < a ) );
return (int)N;
}
//Cargamos la cantidad de empleados
void leerEmpleado(empleado &e) {
//declare una varaible del tipo empleado
cin>>e.nombre;
cin>>e.edad;
cin>>e.sexo;
cin>>e.sueldo;
//y lea los datos del empleado
}
void imprimirEmpleado(empleado e) {
cout << endl;
//imprima aquí los datos del empleado, a continuación de cada texto
cout << "Nombre: "<<e.nombre;
cout << "\nEdad: "<<e.edad;
cout << "\nSexo: "<<e.sexo ;
int pMayor=0;
empleado Mayor;
int aux=0;
cout << "\nHombre que mas gana";
//llame a la funcion imprimirEmpleado
for(int i=0; i<n-1; i++){
if(emp[i].sexo=='m' and aux<1){
Mayor=emp[i];
aux++;
}
if(emp[i].sueldo>Mayor.sueldo and emp[i].sexo=='m'){
Mayor=emp[i];
pMayor=i;
}
}
imprimirEmpleado(emp[pMayor]);
cout << "\nHombre mas joven";
//llame a la funcion imprimirEmpleado
int pMenor=0;
empleado Menor;
aux=0;
for(int i=0; i<n; i++){
if(emp[i].sexo=='m' and aux==0){
Menor=emp[i];
pMenor=i;
aux++;
}
if(emp[i].edad<Menor.edad and emp[i].sexo=='m'){
Menor=emp[i];
pMenor=i;
cout<<"hola2"<<endl;
}
}
imprimirEmpleado(emp[pMenor]);
}
int main(){
int n=leerN(2);
empleado empleados[n];
cout<<endl;
cout<<"Ingrese los datos del Empleado nombre, edad, sexo (f o m) y
sueldo"<<endl;
for(int i=0; i<n; i++){
fflush(stdin);
leerEmpleado(empleados[i]);
}
cout << endl;
procesarMujeres(empleados, n);
cout << endl;
procesarVarones(empleados, n);
}
/*Escribir un programa que permita hacer las operaciones de suma, resta, multiplicación y división de
números complejos. El tipo complejo ha de definirse como una estructura. DEFINIR FUNCIONES PARA
CADA OPERACIÓN.*/
#include<iostream>
using namespace std;
struct complejo{
float r; //parte real
float i; //Parte imaginaria
};
void suma(complejo a, complejo b){ //funcion suma void
cout<<"\nLa suma es: "<<a.r+b.r<<" + "<<a.i+b.i<<"i"<<endl;
}
complejo resta(complejo a, complejo b){ //funcion que retorna un
complejo
complejo res;
res.r=a.r-b.r;
res.i=a.i-b.i;
return res;
}
void multiplicacion(complejo* n1, complejo* n2, complejo* c){ //utilizando
punteros
(*c).r= (*n1).r*(*n2).r-(*n1).i*(*n2).i;
// (*c).i= (*n1).r*(*n2).i+(*n1).i*(*n2).r;
c->i= (n1->r)*(n2->i)+(n1->i)*(n2->r);
}
void division(complejo n1, complejo n2, complejo div){
//Se debe usar la formula
div.r = (a.r*b.r + a.i*b.i) / (b.r*b.r + b.i*b.i);
div.i = (a.r*b.i + -1*b.r*a.i) / (b.r*b.r + b.i*b.i);
}
int main(){
complejo n1, n2, rest, mul, div;
cout<<"Introduzca la parte real e imaginaia de n1: \n";
cin>>n1.r;
cin>>n1.i;
cout<<"Introduzca la parte real e imaginaia de n2: \n";
cin>>n2.r;
cin>>n2.i;
suma(n1, n2);
rest=resta(n1,n2);
cout<<"\nLa resta es: "<<rest.r<<" + "<<rest.i<<"i"<<endl;
multiplicacion(&n1, &n2, &mul);
cout<<"\nLa multiplicacion es: "<<mul.r<<" + "<<mul.i<<"i"<<endl;
division(n1, n2, &div);
cout<<"La division de ambos numeros es: "<<div.r<<" + "<<div.i<<"i"<<
endl;
return 0;
}
/*La información de todos los empleados de la empresa c está almacenada en una variable de tipo
estructura llamada "empleado". La información con la que cuenta de cada empleado es: nombre, sexo y
sueldo. Realizar un programa en C/C++ que lea los datos de los N trabajadores de la empresa y que imprima
los datos del empleado con mayor y menor salario, luego ORDENAR la información de los empleados por
método de Burbuja de acuerdo a su salario de forma ascendente*/
#include<iostream>
using namespace std;
struct empleado{
char nombre[20];
char sexo;
int sueldo;
};
void cargar(empleado* p, int N){
for(int i=0; i<N; i++){
cout<<"Ingrese los datos del empleado "<<i+1<<": \n";
fflush(stdin);
cout<<"\tNombre:\t";
cin.getline((p+i)->nombre, 20); //*(p+i).Nombre
cout<<"\tSexo:\t";
cin>>(p+i)->sexo;
cout<<"\tSueldo:\t";
cin>>(p+i)->sueldo;
}}
void imprimir(empleado* p, int N){
for(int i=0; i<N; i++){
cout<<"\nNombre: "<<(p+i)->nombre<<endl;
cout<<"Sexo: "<<(p+i)->sexo<<endl;
cout<<"Sueldo: "<<(p+i)->sueldo<<endl;
}}
void Burbuja (empleado A[], int n){
empleado aux;
for (int i = 0 ; i<n-1 ; i++){
for(int j=0; j<n-1 ; j++){
if(A[j].sueldo < A[j+1].sueldo){///
aux=A[j];
A[j]=A[j+1];
A[j+1]=aux;
}}}
void busqueda(empleado A[], int n){ //Encontrar el mayor sueldo
empleado aux;
int i=0;
aux=A[i].sueldo,
for(i=1; i<N; i++){
}}
int main(){
int N;
cout<<"Ingrese la cantidad de empleados: " cin>>N;
empleado emp[N];
cargar(emp, N);
Burbuja(emp, N);
imprimir(emp, N);
return 0;
}
/*Utilzando una estructura de datos alumnos y fehca. leer la cedula, el+nommbre el apellido y la fecha de
nacimiento de N alumnos e imprimir en pantlla*/
#include<iostream>
using namespace std;
struct Fecha{
unsigned short dia;
unsigned short mes;
unsigned short anho;
}
struct Alumno{
unsigned int cedula;
char nombre[20];
char apellido[20]; //string
Fecha fechaNac;
};
int leerN();
void leerFecha(Fecha& f);
void leerAlumno(Alumno& a);
int main(){
cout<<"Ingrese la cantidad de alumnos: ";
int N=leerN();
Alumno compu[N]
for(int i=0; i<N; i++){
cout<<"Ingrese los datos del Alumno: "<<(i+1);
leerAlumno(compu[i]);
}
cout<<"Los datos cargados son: ";
for(int i=0; i<N; i++){
}
return 0;
}
void leerAlumno(Alumno& a){
cout<<"\tCedula: ";
cin>>a.cedula;
//fflush(stdin)
cout<<"\tNombre: ";
cin.getline(a.nombre, 20);
cout<<"\tApellido: ";
cin.getline(a.apellido, 20);
leerFecha(a.fechaNac);
/* Un punto en el plano se puede representar mediante una estructura con dos campos. Escribir un
programa que realice las siguientes operaciones en el plano:
/*Sean Nombre, sexo, anho tres variables que contienen el nombre, sexo y años de pertenencia de cada
uno de los miembros de un club. Masculino o Femenino se denota mediante ‘M’ y ‘F’, respectivamente.
Diseñar un programa mediante arreglo de estructura, se ingrese los datos de N miembros del club, imprima
todos los miembros del club con todos sus datos, además busque la persona que tiene mayor antigüedad
e indicar si es masculino o femenino. */
#include<iostream>
#include<cstdio>
using namespace std;
struct Miembros{
char nombre[20];
char sexo;
int anho; //año de pertenencia
};
void ingresarDatos(Miembros &a){
cout<<"Nombre: ";
fflush(stdin);
cin.getline(a.nombre,20);
cout<<"Sexo (M o F): ";
cin>>a.sexo;
cout<<"Anhos de antiguedad: ";
cin>>a.anho;
}
void imprimir(Miembros &a){
cout<<endl;
cout<<"Nombre: "<<a.nombre;
cout<<"\nSexo: "<<a.sexo;
cout<<"\nAntiguedad: "<<a.anho;
cout<<endl;
}
int main(){
int N;
cout<<"Ingrese la cantidad de miembros: "; cin>>N;
Miembros cad[N];
for(int i=0;i<N;i++){
cout<<"\nIngrese los datos del miembro "<<i+1<<endl;
ingresarDatos(cad[i]);
}
for(int i=0;i<N;i++){
cout<<"Datos del miembro "<<i+1<<endl;
imprimir(cad[i]);
}
int old=cad[0].anho, aux=0;
for(int i=1;i<N;i++){
if(cad[i].anho>old){
old=cad[i].anho;
aux=i;
}
}
/*Crear una estructura de datos Alumno para calcular la nota final (NF) de los 5 alumnos del curso
Programacion, así como también el promedio, el mínimo y el máximo de las notas.
- Leer por teclado el código del alumno y los puntajes parciales (P1 y P2) y puntaje final (EF) de cada
uno de éstos (enteros de 0 a 100, validar)
- El puntaje final se calcula empleando la fórmula: PF = 0.6*PP + 0.4*EF
- En donde PP es el promedio de parciales: PP = (P1+P2)/2
0-59 Nota 1
60-70 Nota 2
71-80 Nota 3
81-90 Nota 4
91-100 Nota 5
El cálculo de la Nota Final, el Promedio de las calificaciones así como la mayor y menor nota deben
realizarse a través de funciones. */
#include<iostream>
using namespace std;
struct Alumno{
int codigo;
short P1;
short P2;
short EF;
short PF;
short NF;
};
int leerPuntaje(Alumno cad[]){
//complete la funcion
float x;
do {
cin>>x;
}while(int(x)!= x or x<0 or x>100);
return x;
}
int calcularNotaFinal(int PF){
if(PF>=0 and PF<=59) return 1;
if(PF>=60 and PF<=70) return 2;
if(PF>=71 and PF<=80) return 3;
if(PF>=81 and PF<=90) return 4;
if(PF>=91 and PF<=100) return 5;
}
float calcularPromedio(Alumno cad[], int N){
float prom=0;
for(int i=0; i<N; i++){
prom= prom + cad[i].NF;
}
prom=prom/2;
return prom;
}
int calcularMayor(Alumno cad[], int N){
int Mayor=cad[0].NF;
for(int i=1; i<N; i++){
if(cad[i].NF>Mayor){
Mayor=cad[i].NF;
}
}
return Mayor;
}
int calcularMenor(Alumno cad[], int N){
int Menor=cad[0].NF;
for(int i=1; i<N; i++){
if(cad[i].NF<Menor){
Menor=cad[i].NF;
}
}
return Menor;
}
int main(){
int N;
cout<<"Ingrese la cantidad de alumnos: ";
cin>>N;
Alumno cad[N];
//analizamos alumno por alumno
cout << "\nIngrese el codigo, el parcial 1, el parcial 2 y el
examen final: ";
for(int i=0; i<N; i++){
cout<<"\nAlumno N: "<<i+1<<endl;
cin>>cad[i].codigo;
//cargar notas
cad[i].P1 = leerPuntaje(cad);
cad[i].P2 = leerPuntaje(cad);
cad[i].EF = leerPuntaje(cad);
//Calculamos la nota final
cad[i].PF=0.6*((cad[i].P1+cad[i].P2)/2) + 0.4*cad[i].EF;
//Calculamos la nota final NF
calcularNotaFinal(cad[i].PF);
cout<<endl<<"\tPF: "<<prog[i].PF<<"\tNF: "<<prog[i].NF;
}
cout<<"\nPromedio de Notas: "<<calcularPromedio(cad, N);
cout<<"\nMayor Nota: "<<calcularMayor(cad, N);
cout<<"\nMenor Nota: "<<calcularMenor(cad, N);
return 0;
}
/*Utilizando estructuras comparar el perfil socio-económico (Ingreso per cápita mensual, es decir, el
ingreso mensual de la familia dividido la cantidad de personas que hay en ella) de n personas (Se debe
cargar su edad, si está en el grupo 1 o 2 y su ingreso per-cápita) y: G1) Su título más alto es de EEB (1° y 2°
Ciclo) (6° grado); G2) Posee título Universitario (superior universitario) o postgrado (especialización,
maestría y doctorado)
Ejemplo:
1)Edad: 27
Grupo: 1
Ingresos per-cápita: 900.000
2)Edad: 39
Grupo: 2
Ingresos per-cápita: 2.900.000
Imprimir:
a)Cuantas personas están en la extrema pobreza, pobreza total y fuera de la pobreza por cada grupo.
cout<<n<<endl;
item_A(encuestado, n);
item_B(encuestado, n);
}
/*
*/
struct Fecha{
int dia,mes,anho;
};
/*Esta función devuelve true si el anho es bisiesto, y false en caso
contrario*/
bool esBisiesto(int anho){
if((anho%400==0 || (anho%4==0 && anho%100!=0)))
return true;
else
return false;
}
Fecha extraerDatos(char cadena[]){
//Completar la función que extrae los datos de la cadena y carga la
estructura (retornando esta estructura al final)
Fecha fecha;
int k=0;
int aux;
for(int i=0; i<12; i++){
if(i==0){
fecha.dia=(cadena[i]-'0')*10+(cadena[i+1]-'0');
}
if(i==3){
fecha.mes=((cadena[i]-'0')*10+cadena[i+1]-'0');
}
if(i>5 and i<10){
aux=(cadena[i]-'0')*pow(10,3-k)+aux;
fecha.anho=aux;
k++;
}
}
return fecha;
}
int obtenerNumeroDeDiasEnUnMes(int mes, int anho){
//Completar la función que obtiene (y retorna) la cantidad de días en
un determinado mes (teniendo en cuenta los años bisiestos).
int dias;
if(esBisiesto(anho)==true){
if(mes==2) dias=29;
}else{
if(mes==2) dias=28;
}
if(mes==1 or mes==3 or mes==5 or mes==7 or mes==8 or mes==10 or
mes==12) dias=31;
if(mes==4 or mes==6 or mes==9 or mes==11) dias=30;
return dias;
}
if(fecha.dia<0 or fecha.dia>30){
cout<<fecha.dia<<"/"<<fecha.mes<<"/"<<fecha.anho<<" NO es
una fecha valida";
}else{
cout<<fecha.dia<<"/0"<<fecha.mes<<"/"<<fecha.anho<<" es
una fecha valida";
}
}else{
cout<<fecha.dia<<"/"<<fecha.mes<<"/"<<fecha.anho<<" NO es una
fecha valida";
}
}else{
cout<<fecha.dia<<"/"<<fecha.mes<<"/"<<fecha.anho<<" NO es una
fecha valida";
}
}else{
cout<<fecha.dia<<"/"<<fecha.mes<<"/"<<fecha.anho<<" NO es una
fecha valida";
}
}
int main(){
// NO MODIFICAR EL MAIN!
int opcion;
/*Hacer un programa donde se ingrese una fecha (dia, mes, anho) y verifique si es una fecha válida
(controlar cantidad de días de los meses, año bisiesto, anho entre 1900 y 2100). Declarar fecha como una
estructura. */
int main () {
Fecha f;
cout<<"Ingrese una fecha: "<<endl;
if (validarFecha(f)) cout<<"La fecha es valida"<<endl;
else cout<<"La fecha NO es valida"<<endl;
system("Pause");
}
/* Escribir un programa para calcular el número de días que hay entre dos fechas: declarar fecha como
una estructura. */
#include<iostream>
#include<stdlib.h>
using namespace std;
struct fecha{
short dia;
short mes;
int anho;
}f;
void leerFecha(Fecha& f){
do{
cout<<"Dia: ";
cin>>f.dia;
}while(f.dia<0 or f.dia>31);
do{
cout<<"Mes: ";
cin>>f.mes;
}while(f.mes<=0 or f.mes>12);
do{
cout<<"Anho: ";
cin>F.anho;
}while(f.anho<=0)
}
int main(){
fecha cad[2];
cout<<"Ingrese la 1ra fecha: \n";
leerFecha(Cad[0]);
cout<<"Ingrese la 2da fecha: \n";
leerFecha(Cad[1]);
int Dmes, Da, Daa;
if(cad[0].mes==cad[1].mes) Dmes=0;
else{
Dmes=cad[0].mes-cad[1].mes;
if(Dmes<0) Dmes=Dmes*-1;
}
if(cad[0].dia==cad[1].dia) Da=0;
else{
Dma=cad[0].dia-cad[1].dia;
if(Da<0) Da=Da*-1;
}
if(cad[0].anho==cad[1].anho) Daa=0
else{
Daa=cad[0].anho-cad[1].anho;
if(Daa<0) Daa=Daa*-1;
}
Da=Da+Dmes*30+Daa*365;
cout<<"La diferencia de dias es de: "<<Da<<endl;
return 0;
}
//Para este ejercicico no tuvimos en cuenta los años bisiestos asi como
la cantidad exacta de dias que hay en cada mes
/*Elaborar un programa en lenguaje C/C++ que, defina una estructura cuyo nombre sea complejo y que
represente a un número complejo. Además, lea por teclado N números complejos (N debe ser un número
entero y positivo, validar). Determinar e imprimir el número complejo de mayor módulo, así como su
módulo. */
#include<iostream>
#include<math.h>
using namespace std;
//agruegue aqui la estructura complejo
struct complejo{
float R;
float I;
}c;
int validar()//funcion que valida numeros enteros y positivos
{
float x = -1;
while(x<=0||x != int(x)) {
cout<<"Ingrese la cantidad de numeros complejos (entero positivo):
\n";
cin>>x;
}
return int(x);
}
complejo cargaComplejo(complejo &c){
cin>>c.R;
cin>>c.I;
}
//agregue aqui la funcion para hallar el numero complejo con mayor módulo
float modulo(complejo &c){
float mod=0;
mod= sqrt( pow(c.R,2)+pow(c.I, 2));
return mod;
}
//debe retornar la posicion en el vector
int hallarMayor(complejo nc[], int N){
float aux=0, posicion=0, mod=0;
for(int i=0; i<N; i++){
mod= modulo(nc[i]);
if(aux<mod){
aux=mod;
posicion=i;
}
}
return int(posicion);
}
int main() {
int N = validar(); //variable utilizada para almacenar el valor de
la cantidad de numeros complejos a ser leidos.
float mod = 0; //variable que guardará el mayor modulo, para
imprimir al final
//declare un vector "nc" de N elementos del tipo complejo
complejo nc[N];
//lea los N numeros complejos
cout << "Ingrese el numero complejo (real, imaginaria): ";
for(int i=0;i<N;i++){
cargaComplejo(nc[i]);
}
return 0;
}
/**/
Ejercicios variados
/*Encontrar los n primeros numeros en el cual al elevar al cuadrado no se repitan ninguna de sus cifras
n=1
output 1
n=2
outpud 2
...
n=4
outpud 16
... */
#include<iostream>
#include<cmath>
int validar(){
float n;
cout<<"Ingrese el numero: \n";
cin>>n;
while(n<0 or n!=int(n)){
cout<<"\nVuelva a ingresar el numero: \n";
cin>>n;
}
return int(n);
}
void estaEn(int N){
int contador=0, i=1, aux2;
bool ban;
while(contador<N){
while(aux2>0){
if(dig==aux2%10) ban=false;
aux2=aux2/10;
}
aux=aux/10;
}
if(ban==true){
cout<<i<<" ";
contador++;
i++;
}else{
i++;
}
}
}
int main(){
int N=validar();
estaEn(N);
return 0;
}
/*(Desafío) Se cuenta con una lista L1 de N números enteros cargados por teclado (validar el valor de N y
los valores del vector) en el cual pueden existir valores repetidos. A fin de economizar el espacio de
almacenamiento, se desea crear una nueva lista L2 en la cual cada valor diferente aparece una sola vez, sin
repetición, pero indicando la cantidad de veces que se repite dicho valor en la lista L1. */
#include<iostream>
using namespace std;
int validar();
void carga(int L1[], int N);
int imprimir(int L1[],int N){
cout<<endl<<"El vector es: \n";
for(int i=0; i<N; i++){
cout<<L1[i]<<"\t";
}
cout<<endl;
}
int dif(int L1[], int N){
int cont=0, clave=0;
bool ban=true;
for(int i=0; i<N; i++){
ban=true;
if(i==0) cont ++;
else{
clave=L1[i];
for(int j=i-1; j>=0;j--){
if(clave==L1[j]){
ban=false;
}
if(ban==false) break;
}
if(ban==true) cont++;
}
}
cout<<"\nLos diferentes son: "<<cont<<endl;
return cont;
}
int nroApar(int L1[], int N, int clave){
int cont=0;
for(int i=0; i<N; i++){
if(clave==L1[i]) cont++;
}
return cont;
}
void nuevo(int L1[], int N, int L2[], int M){
int validar(){
float N;
cout<<"Ingrese el valor del tamanho: \n";
cin>>N;
while(N<=0 or N!=int(N)){
cout<<"Vuelva a ingresar el valor del tamanhoo: \n";
cin>>N;
}
return int(N);
}
void carga(int L1[], int N){
int A=0;
for(int i=0; i<N; i++){
#include<iostream>
#include<cmath>
using namespace std;
int validar(){
float N;
cout<<"Ingrese un numero entero y mayor a 1000: \n\t";
cin>>N;
while(N<=1000 or N!=int(N)){
cout<<"\n\tMMMMMMM vuelva a ingresar!!: \n\t";
cin>>N;
}
return int(N);
}
bool esPrimo(int N){
if(N==1 or N==0){
return false;
}else{
for(int i=2; i<=sqrt(N); i++){
if(N%i==0){
return false;
}
}
return true;
}
}
int cantPrimos(int N){
int cont=0, aux=0, i=2;
//digitos?? 1001 -> 1 0 0 1 -> no tiene primos
while(N>0){
aux=N;
aux=aux%10;
// cout<<"\nLa cifra analizada ahora es:\t"<<aux;
i=2;
while(i<10){
if(aux%i==0 and aux==i and esPrimo(i)){
cont++;
}
i++;
}
N=N/10;
Est. Janethe A. Olazar
P á g i n a | 217
}
cout<<"\n\n\tLa cantidad de cifras primas en el numero
es:\t"<<cont<<"!!";
return cont;
}
if(esPrimo(aux)==true){
cont++;
if(cont==1) menor=aux;
if(menor>aux){
menor=aux;
}
}
i++;
N=N/10;
}
if(CP==0) cout<<"\n\tPor lo tanto el numero no posee cifras primas
:c ";
if(cont>0) cout<<"\n\tEl menor numero primo es:\t"<<menor;
cout<<"\n\n\tLa suma de todos sus digitos es:\t"<<suma;
}
int main(){
int N=validar(), suma;
int CP=cantPrimos(N);
sumAndImp(N, CP, suma);
return 0;
}
/* Determine e imprima los 50 números capicúas consecutivos mayores que 1000. (Un número es
capicúa si es el mismo leyéndolo de derecha a izquierda. Ejemplo 23532). */
Nanana in my head
/**/
1. Lea dos números NUM y DEN (enteros y positivos), a continuación, imprima en pantalla la fracción
simplificada obtenida al dividir NUM entre DEN.
/**/
/*Cargue dos matrices de orden mxn. Luego calcule la suma, la resta y el producto (si es posible, imprimir
aviso en caso contrario) de dichas matrices. Luego imprima en pantalla las matrices resultados*/
#include<iostream>
#include<cmath>
using namespace std;
//funcion de validacion
int validar(){
float N;
cout<<"Ingrese el tamanho: \n\t";
cin>>N;
while(N<=0 or N!=int(N)){
cout<<"\n\tMMMMMMM vuelva a ingresar!!: \n\t";
cin>>N;
}
return int(N);
}
//carga
void carga(int *p, int m, int n){
cout<<"\nCargue la matriz:\n";
for(int i=0; i<m*n; i++){
cout<<"Cargue el elemento "<<i+1<<":\t";
cin>>*(p+i);
}
}
//imprimir
void imprimir(int *p, int m, int n){
for(int i=0; i<m*n; i++){
cout<<*(p+i)<<"\t";
if((i+1)%n==0){
cout<<endl;
}
}
cout<<endl;
}
//suma
void suma(int *p, int *q, int m, int n, int m1, int n1, int *s){
if(m==m1 and n==n1){
for(int i=0; i<m*n; i++){
*(s+i)=*(p+i)+*(q+i);
}
}else cout<<"\n\tLas matrices no se pueden sumar.";
}
//resta
void resta(int *p, int *q, int m, int n, int m1, int n1, int *r){
if(m==m1 and n==n1){
for(int i=0; i<m*n; i++){
*(r+i)=*(p+i)-*(q+i);
}
}else cout<<"\n\tLas matrices no se pueden restar.";
}
//multiplicacion
void multiplicacion(int *p, int *q, int m, int n, int m1, int n1, int
*mul){
int aux=0;
if(n=m1){
for(int l=0; l<m*n1; l++){
for(int j=0; j<n1; j++){
for(int i=0; i<n; i++){
//Falta hallar una forma para combinar
}
}
}
}else cout<<"\n\tLas matrices no se pueden multiplicar.";
}
int main(){
cout<<"\t\tMatriz 1\n";
int m1=validar(), n1=validar();
cout<<"\t\tMatriz 2\n";
int m2=validar(), n2=validar();
int A[m1][n1], B[m2][n2];
int *p, *q;
p=&A[0][0];
q=&B[0][0];
carga(p, m1, n1);
carga(q, m2, n2);
cout<<endl;
imprimir(p, m1, n1);
cout<<endl;
imprimir(q, m1, n1);
cout<<endl;
int sum[m1][n1], res[m1][n1], mul[m1][n2];
int *s, *r, *m;
s=&sum[0][0]; r=&res[0][0];
suma(p, q, m1, n1, m2, n2, s);
cout<<"La suma es: \n";
imprimir(s, m1, n1);
resta(p, q, m1, n1, m2, n2, r);
cout<<"La resta es: \n";
imprimir(r, m1, n1);
// multiplicacion(p, q, m1, n1, m2, n2, m);
if(n1==m2){
for(int i=0; i<m1; i++){
for(int j=0; j<n2; j++){
mul[i][j]=0;
for(int k=0; k<n1; k++){
mul[i][j]+= A[i][k]*B[k][j];
}
}
}
cout<<"La multiplicacion es: \n";
m=&mul[0][0];
imprimir(m, m1, n2);
}else{
cout<<"La multiplicacion no puede efectuarse.";
}
return 0;
}
/*Se desea cargar, por teclado, el código, nombre y apellido de 5 alumnos y generar aleatoriamente sus
puntajes (entre 1 y 30) de 3 asignaturas (Calculo, Geometria, Fisica) en un array de struct. Imprimir el
código, nombre y apellido, asignaturas con puntaje y el promedio del alumno. Imprimir además el
promedio de cada asignatura.*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
struct Puntajes{
short calculo;
short geometria;
short fisica;
} P;
struct Alumno{
short codigo;
char nombre[40];
Puntajes puntaje;
float promedio;
} a;
void carga(int N){
cout<<"Puntaje en Calculo: "; cin>>a.puntaje.calculo;
cout<<"Puntaje en Geometria: "; cin>>a.puntaje.geometria;
cout<<"Puntaje en Fisica: "; cin>>a.puntaje.fisica;
}
int main(){
Alumno Alum[5];
srand(time(NULL));
for(int i=0; i<5; i++){
cout<<"Ingrese los datos del Alumno N "<<i+1<<": "<<endl;
cout<<"\tCodigo: \t"; cin>>Alum[i].codigo;
cout<<"\tNombre y apellido: \t";
fflush(stdin);
cin.getline(Alum[i].nombre, 40);
Alum[i].puntaje.calculo=rand()%30;
Alum[i].puntaje.geometria=rand()%30;
Alum[i].puntaje.fisica=rand()%30;
Alum[i].promedio=(Alum[i].puntaje.calculo +
Alum[i].puntaje.geometria + Alum[i].puntaje.fisica)/3.00;
}
cout<<"\n";
//impresion
for (int i=0;i<5;i++){
cout<<"Codigo:\t"<<Alum[i].codigo<<endl;
cout<<"Nombre: "<<Alum[i].nombre<<endl;
cout<<"Puntaje Calculo: "<<Alum[i].puntaje.calculo<<endl;
cout<<"Puntaje Geometria: "<<Alum[i].puntaje.geometria<<endl;
cout<<"Puntaje Fisica: "<<Alum[i].puntaje.fisica<<endl;
cout<<"Su promedio es: "<<Alum[i].promedio<<endl;
cout<<"\n\n";
}
return 0;
}
/*Una empresa tiene 4 vendedores. Por cada vendedor se desea leer por teclado su código, sueldo base y
% de comisión (en decimales). Por cada vendedor, generar las ventas mensuales de seis meses, y calcular:
el monto de la comisión (ventas por comision dividido 100) y el sueldo neto de cada mes (sueldo base más
monto de la comisión) y el promedio de ventas del semestre. Calcular e imprimir, además, el total de:
ventas de la empresa, sueldo y comisión de los seis meses*/cin.getline
/**/
TAA’S
/*Primer final */
#include<iostream>
#include<cmath>
#include<cstdio>
#include<ctime>
using namespace std;
struct Tiros{
short Puntaje;
short Punto;
char Tirador;
};
struct Puntaje{
char denominacion[8];
unsigned short puntaje;
};
struct Punto{
short a;
short b;
};
struct Tirador{
char nombre[21];
int disparos[6];
};
void leerNombre(Tirador a){
cout<<"Ingrese el nombre del tirador:\t";
fflush(stdin);
cin.getline(a.nombre, 21);
cout<<a.nombre<<endl;
}
void mejorDisparo(int radio, Punto punt){
Puntaje A;
if(radio>=0 and radio<2){
strcpy(A.denominacion, "CENTRO");
A.puntaje=10;
}
A.disparos[i]= (-10+rand()%(21));
A.disparos[i+1]= (-10+rand()%(21));
//designando
punt.a=A.disparos[i];
punt.b=A.disparos[i+1];
if(i==0) radio=sqrt(pow(punt.a,2)+pow(punt.b,2));
else aux=sqrt(punt.a*punt.a + punt.b*punt.b);
if(radio>aux){
radio=aux;
}
}
for(int i=0; i<3; i++){
cout<<A.disparos[i]<<","<<A.disparos[i+1];
cout<<endl;
puntR.a=A.disparos[i];
puntR.b=A.disparos[i+1];
}
cout<<endl;
mejorDisparo(radio, puntR);
}
void menu(void){
int opcion;
do{
cout<<"\t\t--.-- Disparos al blanco --.--";
cout<<"\n\t1. Leer datos del Tirador.\n\t2. Salir.\n\tIngrese
la opcion ->\t";
cin>>opcion;
cout<<endl;
//solicitar name
if(opcion==1){
Tirador A;
leerNombre(A);
leerDisparos(A);
}
}while(opcion==1);
cout<<"\n\t\tByee byee.";
}
int main(){
menu();
return 0;
}
Observaciones:
Se debe definir necesariamente la función codificar() que realice lo solicitado. No se aceptará que la
funcionalidad se desarrolle en el main().
Se proporciona un archivo con código inicial. Por practicidad en el proceso de desarrollo del
ejercicio, en el main() se encuentra pre-cargado el mensaje empleado para el ejemplo. De esta
manera, solo se debe llamar a la función codificar() con este mensaje y ver el mensaje codificado.
Sin embargo, codificar() deberá funcionar (de acuerdo con lo especificado anteriormente) para
cualquier caso de entrada.
#include<iostream>
#include<cstring>
using namespace std;
ban1=true; ban2=true;
cout<<"Ingrese la clave con diez digitos en forma no
ascendente:\t";
cin>>clave;
//Para que no sean iguales
for(int i=0; i<10; i++){
for(int j=i+1; j<10; j++){
if(clave[i]==clave[j]) ban1=false;
}
}
if(ban1==false) cout<<"Error, hay dos elementos iguales.
:c\n\n";
else{
//para que no sean ascendentes
if(clave[0]<clave[1]){
if(clave[1]<clave[2]){
if(clave[2]<clave[3]){
if(clave[3]<clave[4]){
if(clave[4]<clave[5]){
if(clave[5]<clave[6]){
if(clave[7]<clave[8]){
ban2=false;
}
}
}
}
}
}
}
}
if(ban2==false){
cout<<"Error, cargaste de forma ascendente :c\n\n";
}else if(ban1==true and ban2==true){
sw=1;
}
}
cout<<endl;
int sw2=0;
char aux[200];
while(sw2==0){
ban1=true;
cout<<"Ingrese una frase de 100 caracteres o menos:\t";
cin.ignore(100000, '\n');
cin.getline(aux, 200);
if(strlen(aux)>100) ban1=false;
if(ban1==false){
cout<<"Error, la frase tiene más de 100
caracteres.\n\n";
}else sw2=1;
}
strcpy(original, aux);
cout<<"\nLa frase contiene "<<strlen(original)<<" caracteres.\n";
for(int i=strlen(original); i<101; i++){
original[i]='*';
}
char Mat[10][10];
int cont=0;
for(int i=0; i<10; i++){
for(int j=0; j<10; j++){
Mat[i][j]=original[cont];
cont++;
}
}
cout<<endl;
for(int i=0; i<10; i++){
for(int j=0; j<10; j++){
cout<<Mat[i][j]<<"\t";
}
cout<<"\n";
}
cout<<"\nLa clave queda en:\t";
for(int i=0; i<10; i++){
cout<<clave[i]<<" ";
}
cout<<endl;
int p=0;
while(p<10){
for(int i=0; i<10; i++){
cout<<Mat[i][clave[p]-'0'];
}
p++;
}
}
int main(){
char original[101];
char codificado[101];
codificar(original, codificado);
return 0;
}
#include<iostream>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;
//Validacion
int validar(){
float N;
do{
cout<<"Ingrese un valor para el tamanho:\t";
cin>>N;
}while(N<=3 or N!=int(N) or (int(N))%2!=0);
return int(N);
}
//Carga
void carga(int *p, int N){
srand(time(NULL));
int i;
for(int i=0; i<N*N; i++){
*(p+i)=rand()%(2*N-1);
}
}
//Imprimir
void imprimir(int *p, int N){
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cout<<*(p+i*N+j)<<"\t";
}
cout<<endl;
}
cout<<endl;
}
void orden(int v[], int tam){
int aux=0;
for(int l=1 ; l<=tam-1; l++){
for(int i=0;i<=tam-2;i++){
if(v[i]>v[i+1]){
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
}
}
}
}
//void ordenarCuadrante()
int main(){
int N=validar(), Mat[N][N], *p;
p=&Mat[0][0];
carga(p, N);
imprimir(p, N);
//ordenmaos la matriz
// Para poder ordenar por metodo burbuja, Matriz---->Vector, metodo
burbuja, Vector---->Matriz
int s1=0, s2=0, s3=0, s4=0;
//Cuadrante 1
// M --> V
int k=0, tam=N*N/4, V[tam];
for(int i=0; i<=(N/2)-1; i++){
for(int j=N/2; j<=N-1; j++){
V[k]=Mat[i][j];
s1+=V[k];
k++;
}
}
//ordenamos
orden(V,tam);
// volmenos a pasar a matriz
k=0;
for(int i=0; i<=(N/2)-1; i++){
for(int j=N/2; j<=N-1; j++){
Mat[i][j]=V[k];
k++;
}
}
//Cuadrante 2
//M--->V
k=0;
for(int i=0;i<=(N/2)-1;i++){
for(int j=0;j<=(N/2)-1;j++){
V[k]=Mat[i][j];
s2=s2+V[k];
k++;
}
}
//ordenamos
orden(V, tam);
// volmenos a pasar a matriz
k=0;
for(int i=0; i<=(N/2)-1 ;i++){
for(int j=0; j<=(N/2)-1 ;j++){
Mat[i][j]=V[k];
k++;
}
}
//Cuadrante 3
//M--->V
k=0;
for(int i=N/2; i<=N-1 ;i++){
for(int j=0; j<=(N/2)-1 ;j++){
V[k]=Mat[i][j];
s3=s3+V[k];
k++;
}
}
//ordenamos
orden(V, tam);
// volmenos a pasar a matriz
k=0;
for(int i=N/2; i<=N-1 ;i++){
for(int j=0;j<=(N/2)-1;j++){
Mat[i][j]=V[k];
k++;
}
}
//cuadrante 4
//M---->V
k=0;
for(int i=N/2; i<=N-1;i++){
for(int j=N/2; j<=N-1;j++){
V[k]=Mat[i][j];
s4=s4+V[k];
k++;
}
}
//ordenamos
orden(V, tam);
// volmenos a pasar a matriz
k=0;
for(int i=N/2;i<=N-1;i++){
for(int j=N/2;j<=N-1;j++){
Mat[i][j]=V[k];
k++;
}
}
p=&Mat[0][0];
cout<<"La matriz ordenada es:\n";
imprimir(p, N);
cout<<"\n";
if(s1>s2 and s1>s3 and s1>s4) cout<<"La mayor de las sumatorias es:
"<<s1;
if(s2>s1 and s2>s3 and s2>s4) cout<<"La mayor de las sumatorias es:
"<<s2;
if(s3>s2 and s3>s2 and s3>s4) cout<<"La mayor de las sumatorias es:
"<<s3;
if(s4>s1 and s4>s2 and s4>s3) cout<<"La mayor de las sumatorias es:
"<<s4;
return 0;
}
//Quizas con punteros se podria ahorrar el trabajo, pero no encontré una
forma
#include<iostream>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;
struct Bolilla{
char letra;
unsigned short numero;
};
//cadena de bolilla para guardar todo
void generarBolillero(Bolilla A[]){
for(int i=0; i<75; i++){
if(i>=0 and i<=14){
A[i].letra='B';
}else if(i>=15 and i<=29){
A[i].letra='I';
}else if(i>=30 and i<=44){
A[i].letra='N';
}else if(i>=45 and i<=59){
A[i].letra='G';
}else if(i>=60 and i<=74){
A[i].letra='O';
}
A[i].numero=i+1;
}
}
void imprimirBolillero(Bolilla A[]){
for(int i=0; i<75; i++){
cout<<A[i].letra; cout<<A[i].numero<<" ";
if(i==14) cout<<endl;
if(i==29) cout<<endl;
if(i==44) cout<<endl;
if(i==59) cout<<endl;
if(i==74) cout<<endl;
}
}
void generarCarton(int *p){
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(i==2 and j==2) *(p+5*j+i)=0;
else{
//encontramos una formula general para cada rago de
bolillas
//cuando i=0 -> *(p+5*j)=(0+1)+rand()%(
(15*(0+1))+1-(0+1)); el lim es 15
*(p+5*j+i)=(15*i+1)+rand()%( (15*(i+1))+1-
(15*i+1));
}
for(int k=j-1; k>=0; k--){
//siempre que hayan dos elementos iguales volvemos
a ingresar
while(*(p+5*j+1)==*(p+5*k+i)){
if(i==2 and j==2) *(p+5*j+i)=0;
else *(p+5*j+i)=(15*i+1)+rand()%((15*(i+1))+1-
(15*i+1));
}
}
}
}
}
void imprimirCarton(int *p){
char vec[5]={'B','I','N','G','O'};
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(i==2 and j==2) cout<<"F"<<*(p+5*i+j)<<"\t";
else cout<<vec[j%5]<<*(p+5*i+j)<<"\t";
} cout<<endl;
}
}
void mezclarBolillero(Bolilla A[], Bolilla B[]){
for(int i=0; i<75; i++){
B[i]=A[1+rand()%75];
for(int k=i-1; k>=0; k--){
while(B[i].numero==B[k].numero){
B[i]=A[i+rand()%75];
}
}
}
}
void verificarBolilla(int *p, Bolilla A){
bool ban=0;
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(*(p+5*i+j)==A.numero) ban=1;
}
}
if(ban==1){
cout<<"\tLa bolilla "<<A.letra<<A.numero<<" SI esta en el
carton\n\n";
}else{
cout<<"\tLa bolilla "<<A.letra<<A.numero<<" NO esta en el
carton\n\n";
}
}
int opcion;
do{
cout<<"\n\n--.--.--.-- EL BINGO --.--.--.-- \n\n";
cout<<"\n\tIngrese una opcion: \n\t1. Crear bolillero\n\t2.
Generar carton";
cout<<"\n\t3. Girar bolillero\n\t4. Extraer bolillero\n\t5.
Salir\n";
cout<<"Opcion --->\t";
cin>>opcion;
if(opcion==1){
generarBolillero(A);
imprimirBolillero(A);
}else if(opcion==2){
int M[5][5];
generarCarton(&M[0][0]);
imprimirCarton(&M[0][0]);
}else if(opcion==3){
Bolilla B[75];
generarBolillero(A);
imprimirBolillero(A);
cout<<endl;
mezclarBolillero(A,B);
imprimirBolillero(B);
}else if(opcion==4){
int Mat[5][5];
Bolilla B[75];
generarBolillero(A) ;
mezclarBolillero(A,B);
cout<<endl;
generarCarton(&Mat[0][0]);
imprimirCarton(&Mat[0][0]);
cout<<endl;
verificarBolilla(&Mat[0][0],B[0]);
}
}while(opcion!=5);
}
int main(){
srand(time(NULL));
Bolilla B[75];
menu(B);
return 0;
}
Bibliografía
Colbes, J. (2022). Información del aula vitual. San Lorenzo, Paraguay.
L., J., & L., G. (2006). Programación en C++. Un enfoque prático. Editorial McGraw-Hill/Interamericana.