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