P1I2_2011-Punteros.pdf

Anuncio
Facultad de Ciencias Exactas, Ingeniería y Agrimensura
Departamento de Sistemas e Informática
Escuela de Electrónica
Informática II
Practica 1: Punteros & Estructuras
Problema 1: (C++)
Descubriendo punteros: analizar los resultados del ejemplo.
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
int i = 8, *pi=&i;
long long l = 8, *pl=&l;
float f = 102.8f, *pf=&f;
double d=678.44f, *pd=&d;
cout << "variable int : tam.bytes=" << sizeof(i) << "\tdir.&i :" << &i << "\tvalor:" << i <<endl;
cout << "puntero int : tam.bytes=" << sizeof(pi) << "\tdir.&pi :" << &pi << "\tvalor:" << pi <<endl;
cout << "variable long : tam.bytes=" << sizeof(l) << "\tdir.&l :" << &l << "\tvalor:" << l <<endl;
cout << "puntero long : tam.bytes=" << sizeof(pl) << "\tdir.&pl :" << &pl << "\tvalor:" << pl <<endl;
cout << "variable float : tam.bytes=" << sizeof(f) << "\tdir.&f :" << &f << "\tvalor:" << f <<endl;
cout << "puntero float : tam.bytes=" << sizeof(pf) << "\tdir.&pf :" << &pf << "\tvalor:" << pf <<endl;
cout << "variable double: tam.bytes=" << sizeof(d) << "\tdir.&d :" << &d << "\tvalor:" << d <<endl;
cout << "puntero double: tam.bytes=" << sizeof(pd) << "\tdir.&pd :" << &pd << "\tvalor:" << pd <<endl;
int vec[100];
// linea de cambios
vec[0] = 44;
cout << "variable array : tam.bytes=" << sizeof(vec[0]) << "\tdir.&vec[0] :" << &vec[0] << "\tvalor:" << vec[0] <<endl;
cout << "puntero array : tam.bytes=" << sizeof(vec) << "\tdir.&vec:" << &vec << "\tvalor:" << vec <<endl;
cin >> i;
return 0;
}
1. Verifique el tamaño de cada tipo de variable y del puntero asociado.
2. En “// linea de cambios” Hacer los siguientes reemplazos:
a. Cambiar la definición del array : int vec[100]; por un puntero: int *vec = new
int[100];
3. Luego el siguiente cambio:
int *vec;
vec= (int*)malloc(sizeof(int)*100);
Analizar los resultados.
Informática II – Práctica 1
Pág 1 de 7
Problema 2: (C++)
Escriba un programa que defina las siguientes variables:
int i=5, j[]={1,2,3,4,5,6,7,8,9,10};
char x = 'a', pal [] ="texto en c";
int *pi;
char *pc;
1.
2.
3.
4.
Mostrar la dirección de “i” y su valor.
Mostrar los mismos valores a través del puntero “pi”.
Recorrer el vector “j” mostrando para cada elemento, su dirección y su valor.
Recorra el vector accediendo a través del puntero “pi” y usando algebra de
punteros.
5. Repita lo mismo con las variables char, el arreglo y el puntero.
6. Finalmente muestre la dirección donde se almacenan ambos punteros.
7. Genere una salida del tipo:
Por Variable: 'i'
Valor:
5
Dirección:
13FF5C
Por Puntero: 'pi'
Valor:
5
Dirección:
13FF5C
Por Variable: 'j[0]'
Valor:
1
Dirección:
13FF2C
Por Puntero: ' pi(=&j)+0'
Valor:
1
Dirección:
13FF2C
Por Variable: 'j[1]'
Valor:
2
Dirección:
13FF30
Por Puntero: 'pi(=&j)+1'
Valor:
2
Dirección:
13FF30
…
Por Variable: 'x'
Valor:
a
Dirección:
13FF23
Por Puntero: 'pc'
Valor:
a
Dirección:
13FF23
Por Variable: 'pal[0]'
Valor:
t
Dirección:
13FF0C
Por Puntero: 'pc(=&pal)+0'
Valor:
t
Dirección:
13FF0C
Por Variable: 'pal[1]'
Valor:
e
Dirección:
13FF0D
Por Puntero: ' pc(=&pal)+1'
Valor:
e
Dirección:
13FF0D
…
Dirección de *pi: 13FF00
De *pc: 13FEF4
Informática II – Práctica 0 – v. 2011
Pág 2 de 7
Problema 3: (*) (C++)
Crear un programa que defina los siguientes tipos de variables:
short int
intCor = 29813;
// Entero corto 16 bits.
int
intEst = 548524874;
//Entero estandar 32 bits. También es
//equivalente "long int"
long long int
intLar = -84467073709551615; // Entero largo 64 bits
float
decEst = 4.7575f; // Decimal punto flotante estandar 32 bits
double
decLar = -7.348744198498e2f; // Decimal punto flotanto largo 64 bits
unsigned long long int uintLart = 18446744073709551610;
// Entero largo 64
//bits sin signo
Descomponer cada variable en bytes utilizando punteros.
Verificar su valor y mapa de bits.
Analizar el orden de almacenamiento de cada byte.
Reasignar valores usando hexadecimales y verificar como se almacenan.
Problema 4: (C++)
Resolver el problema anterior usando uniones para acceder a un mismo sector de
memoria con tipos de datos distintos.
Problema 5: (C++)
Desarrollar una función que reciba como argumento una estructura tipo fecha y devuelva
un puntero a una cadena donde este desarrollada la fecha en forma textual.
Ejemplo: lunes, 15 de agosto de 2011.
struct fechax { short dia, mes, anio; } miFecha;
char * fecha_Texto(fechax);
Informática II – Práctica 0 – v. 2011
Pág 3 de 7
Problema 7: (C++)
Escribir las funciones que operan sobre cadenas de caracteres.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef enum { MAYUSCULAS, MINUSCULAS } may_min;
bool strVacio(const char *origen); //retorna true = vacio o false si tiene al
//menos un caracter
int
strLargo(const char *origen); //Cantidad de caracteres
void strCopia(char *destino, const char *origen); // Copiador
void strIzq(char *destino, const char *origen); // Saca blancos Izq.
void strDer(char *destino, const char *origen); // Saca blancos Der.
void strAmbos(char *destino, const char *origen); // Saca blancos Izq. y Der.
void strMayMin(char *destino, const char *origen, may_min); // Convierte May.
//Min.
int main(){
char *text1 ="
Sera Cierto ??
";
char *result = new char [strLargo(text1)+1];
if(result == NULL) return false;
printf("Vacio : %s\n", (strVacio(text1) ? "Vacio" : "No Vacio"));
printf("Largo : %d\n", strLargo(text1));
strCopia(result,text1);
printf("Copia : [%s]\n", result);
strIzq(result,text1);
printf("Izq
: [%s]\n", result);
strDer(result,text1);
printf("Der
: [%s]\n", result);
strAmbos(result,text1);
printf("Ambos : [%s]\n", result);
strMayMin(result,text1, MAYUSCULAS);
printf("Mayusculas : [%s]\n", result);
strMayMin(result,text1, MINUSCULAS);
printf("Minusculas : [%s]\n", result);
getch();
}
Salida:
Vacio : No Vacio
Largo : 19
Copia : [ Sera Cierto ??
]
Izq
: [Sera Cierto ??
]
Der
: [ Sera Cierto ??]
Ambos : [Sera Cierto ??]
Mayusculas : [ SERA CIERTO ??
Minusculas : [ sera cierto ??
]
]
Problema 8: (C++)
Se necesita contar las letras de un texto ingresado. El texto puede tener varias
oraciones.
Crear una rutina que almacene las letras y la cantidad de veces que aparecen.
Generar un informe con el detalle, en caso de no sean alfabéticos o números, mostrar
su valor hexadecimal. Debe crear un vector de punteros que almacenen las frases y
luego recorrerlo con un puntero de doble in-dirección.
Problema 9: (C++)
Escribir un programa para calcular el determinante de una matriz:
• Solicite la dimensión por teclado.
Informática II – Práctica 0 – v. 2011
Pág 4 de 7
•
•
•
Solicite memoria para el almacenamiento.
Ingrese por teclado los coeficientes con valores.
Desarrolle una función que realice el cálculo.
int determinante_Matriz(int tam, int **matriz);
•
•
Mostrar por pantalla los rangos de la memoria asignada para la matriz.
Verificar los resultados.
a11
Nota: Recordar que el determinante de una matriz es
a12
a 21 a 22
⇒ A = a11 × a 22 − a12 × a 21
a11 a12 a13
a21 a22 a23 = a11 × a22 ×a33 + a12 × a23 × a31 + a13 × a21 × a32 − a31 × a22 × a13 − a32 × a23 × a11 − a33 ×a21 × a12
a31 a32 a33
Compare las tres formas de resolver: Matriz con subíndice, solo punteros y punteros con
subíndices. (Esto es: en tiempo de escritura del programa, cantidad de memoria ocupada
y cantidad de operaciones para resolver el problema).
Problema 10: (C++)
Producto escalar de Matriz: Genera una nueva matriz al que se le multiplica cada
elemento por un valor (escalar):
•
•
•
•
Solicite el valor escalar y la dimensión de la matriz por teclado.
Solicite memoria para el almacenamiento.
Llene la matriz con valores aleatorios.
Desarrolle una función que realice el cálculo cálculo y devuelva un puntero a la
nueva matriz.
int ** producto_Escalar_Matriz(int fil, int col, int esc, int **matriz);
Informática II – Práctica 0 – v. 2011
Pág 5 de 7
Problema 11: (C++)
Escribir un programa para calcular la transpuesta de una matriz:
• Solicite la dimensión por teclado.
• Solicite memoria para el almacenamiento.
• Llene la matriz con valores aleatorios.
• Desarrolle una función que calcule y devuelva un puntero a la nueva matriz.
• Mostrar por pantalla los rangos de la memoria asignada para la matriz.
• Verificar los resultados.
int ** transp_Matriz(int fil, int col, int **matriz);
Nota: Recordar que la transpuesta de una matriz es
a11 a12 
a11 a21 
T
{
}

⇒ A =
 ∴ aij → a ji
a
a
a
a
 21 22 
 12 22 
Problema 12: (C++)
Escribir un programa para sumar dos matrices:
• Cree una estructura con dos enteros con las dimensiones y un puntero a la matriz.
• Llene con valores enteros en forma aleatoria.
• Desarrolle una función que realice la suma pasando como argumento las
estructuras de matrices y devuelva el puntero al resultado.
• Mostrar por pantalla los rangos de la memoria asignada para cada matriz. Verificar
los tamaños y datos almacenados.
• Resultado de la suma en forma matricial.
• Compare las tres formas de resolver: Vector con subíndice, solo punteros y
punteros con subíndices.
struct matrix { short filas, col; int **matriz; };
Problema 13: (C++)
Sobre la base del problema anterior, extender la funcionalidad a la multiplicación de dos
matrices. Tener en cuenta que la multiplicación solo es posible si las columnas de la
primera matriz son de igual dimensión que las filas de la segunda matriz.
Nota: Recordar que la multiplicación de una matriz
[A]nm ×[B]mk = [C]nk ∴cij = ∑p=1 aip × bpj
k
matrix * producto_Matriz(matrix a, matrix b);
Informática II – Práctica 0 – v. 2011
Pág 6 de 7
Problema 14: (C++)
Se requiere llevar un catálogo de artículos con su inventario, sus datos son ID (numérico),
nombre, costo, cantidad. Almacenarlos, calcular el valor de inventario y generar una salida
con el detalle.
Problema 15: (C++)
Se desea llevar un detalle las mediciones de temperatura y presión, de 5 censores de
termocupla de una caldera. Realizan la medición cada 5 segundos. La transmiten
enviando tres letras del código de censor, y los demás datos. Suponga que entran por
teclado, lleve un registro de las últimas 50 lecturas, el promedio de las últimas 50, de las
últimas 25 y de las últimas 5. Calcule la tendencia. Tenga en cuenta que cada censor esta
en una zona de la caldera distinta, por lo que los promedios son independientes.
Problema 16: (C++)
Desarrollar un archivo control del estado de una serie de móviles al que se los rastrea vía
GPS donde se obtienen los siguientes datos:
1) Posición en coordenadas satelitales, tres valores dobles.
2) Estado del vehículo, velocidad, temperatura, consumo y cantidad de combustible.
3) Estado de cubiertas: presión y temperatura de c/u de acuerdo al vehículo 4, 8, A n
4) Señal del conductor: mensaje de texto.
Estos datos se refieren a un móvil que pertenece a un cliente, con sus datos particulares,
que deben ingresarse por teclado y asignarle el número de identificación del transmisor.
Los datos se almacenan por un tiempo determinado.
Simule la operación del transmisor y del centro de recepción.
Informática II – Práctica 0 – v. 2011
Pág 7 de 7
Descargar