UNIVERSIDADPOLITECNICADE VICTORIA
ALUMNO: MARIO ALFREDO AVALOS OLVERA PROFESOR: ARTURO GUADALUPE MASCORRO CIENFUEGOS MATERIA: ESTRUCTURA DE DATOS
1.-Declara una cadena de caracteres de nombre palindromo y asígnale la constante
literal “AEREA” en la misma línea de declaración. Hazlo de dos maneras diferentes. char palíndromo*+=”AEREA”; char *palíndromo=”AEREA”; 1.
Suponiendo que tienes dos cadenas de caracteres, cad1 y cad2 tales que strlen(cad1)==10 y strlen(cad2)==5, indica cómo se declara una tercera cadena cad3 y se le asigna memoria dinámica (en el heap o montón) , teniendo en cuenta que cad3 va a contener la concatenación de cad1 y cad2 sin que sobre ninguna posición de memoria. char *cad1=”abcdefghij”; char *cad2=”opqrs”; char *cad3=new char[strlen(cad1)+strlen(cad2)+1]; strcpy(cad3,””);
strcat(cad3,cad1); strcat(cad3,cad2); delete [] cad3; 3. Si tienes declarada e inicializada una cadena de caracteres cad, indica dos maneras de leer o acceder al carácter de la primera posición. *cad cad[0] 4. Si en un programa que funciona adecuadamente aparece la sentencia delete s; podemos adivinar que s es un puntero a a. Un char, un int, o cualquier otra variable de tipo simple b. Una cadena de elementos char, int, o de cualquier otro tipo simple c. Es imposible que s sea un puntero. 5. ¿Cómo puedes averiguar lo que ocupa un puntero a un char en tu computadora y usando tu compilador de C++? sizeof (char *)
char *v[2]; cout<<”Tamaño del puntero: “<<(int)&v[1] -(int)&v[0]<<” bytes”<
6. Si ptrLetra es un puntero a un char, ¿qué hace la instrucción *ptrLetra++=3;? ¿y la instrucción (*ptrLetra)++=3;? ¿son iguales?
*ptrLetra=3; *ptrLetra++=3 ptrLetra++; Está instrucción le asigna el código ASCII 3 al carácter al que apunta el puntero ptrLetra y a continuación avanzan el puntero una posición a la derecha. (*ptrLetra)++=3 no compila, es semánticamente incorrecta. En C++ no es posible una instrucción del tipo x++=3, siendo x una variable. CONCLUSIÓN: evitar en la medida de lo posible hacer combinaciones de operadores cuyo orden de evaluación sea imprevisible.
7. Si quiero incrementar en una unidad el contenido de la variable a la que apunta un puntero p, indica cuáles de las siguientes instrucciones serían válidas: *p = *p + 1; *p += 1; ++*p; *p++;
8. Utilizando la notación de vectores puedes acceder a la quinta posición (posición 4, ya que los índices empiezan en 0) de un vector v mediante la expresión v[4]. ¿Cómo harías referencia a dicha posición usando notación y aritmética de punteros? *(v+4) 9. Dadas las siguiente declaraciones:
char *p; char c; Indica de dos maneras diferentes cómo expresar en C++ cada una de las siguientes comprobaciones, donde carácter nulo se refiere a la marca de fin de cadena: Si c es el carácter nulo…
if (!c) if (c==’\0’) Si p apunta a un carácter nulo…
if (!*p) if (*p==’\0’) // no es lo mismo que if (*p==’0’) Si p es un puntero nulo…
if (p==NULL) if (!p)
10. Indica los valores de las siguientes expresiones atendiendo a la disposición del vector de enteros lista que se representa en la figura: lista[2] == 64 *(lista+3) == 33 &lista[1] == 1502 Lista == 1500 lista+2 == 1504 lista+1<&lista[1] == 1502<1502 == false
11. Crea una función para intercambiar dos números enteros usando punteros equivalente al paso mediante referencias de C++ que se indica. Para ello debes sustituir los parámetros de entrada por punteros a enteros y cambiar el código para adaptarlo a la lógica de los mismos. Asimismo, indica cómo sería la llamada a la función para dos variables enteras x e y. int x=3, y=4; intercambiar(x,y); void intercambiar(int &a, int &b) { int temp=a; a=b; b=temp; }
intercambiar(&x, &y) void intercambiar(int *ptr_a, int *ptr_b) { int temp=*ptr_a; *ptr_a=*ptr_b; *ptr_b=temp;
} 12. ¿Puedes averiguar qué hace el siguiente código? ¿Qué contendrán letra1 y letra2 tras la ejecución del código? char letra1 = 'A'; char letra2 = 'B';
char* puntero = &letra1; letra1 = 'C'; letra2 = *puntero;
13. Teniendo el código. char letra = 'A'; char* puntero = &letra;
Indicar cuáles de las siguientes asignaciones son incorrectas y podrían producir errores: Letra =&letra; Letra = &punter; Punteo=*punter Punter=*letra &punter=letra;
14. ¿Contenidos de letra1 y letra2 al final del código? ¿A quién apuntan los punteros al fina? char letra1 = 'A'; char letra2 = 'B'; char* puntero1 = &letra1; char* puntero2 = &letra2;
puntero1 = puntero2; letra1 = 'C'; letra2 = 'D'; letra1 = *puntero1;
15. Indica los valores que tendrán al final de la ejecución del siguiente código las variables letra1, letra2 y letra3 en cada caso. a. char* cadena = "Hola"; char letra0 = *cadena; // Asignando „H‟ a letra0 char letra1 = *(cadena+1); // Asignando „o‟ a letra1 char letra2 = *(cadena+2); // Asignando „l‟ a letra2 char letra3 = *(cadena+3); // Asignando „a‟ a letra3
b. char* cadena = "Hola"; char char char char
letra0 = *cadena; // Asignando „H‟ a letra1 = *cadena+1; // Asignando „I‟ letra2 = *cadena+2; // Asignando „J‟ letra3 = *cadena+3; // Asignando „K‟
letra0 („H‟+1) a letra1 („H‟+2) a letra2 („H‟+3) a letra3
16. Reescribe el siguiente programa para calcular la media aritmética de un vector de N valores reales mediante notación y aritmética de punteros: float media (float datos[], int N) { int i; float suma = 0; for (i=0; i
17. Representa mediante instrucciones lo que se representa en las figuras del estado de memoria teniendo en cuenta las siguientes declaraciones de partida que se corresponden con la primera instantánea. Todas los cambios de valor de las var iables y y z deben realizarse mediante punteros, siempre que se pueda. Si para un mismo estado se te ocurren varias posibilidades indícalas como otras alternativas: int y = 5; int z = 3; int *nptr; int *mptr;
nptr=&y; z=*nptr; *nptr=*nptr+2; mptr=&z;
a) z=*nptr; b) *mptr=*nptr; c) *mptr+=2; a) ++*nptr; b) *nptr=*nptr+1; c) *nptr+=1;
18.-Aquí tienes algunos códigos que presentan errores. Trata de identificarlos y explica el motivo del error: int a = 10; int *ptri = NULL; double x = 5.0; double *ptrf = NULL;
ptri = &a; ptrf = &x; ptrf = ptri; char *ptr; *ptr = „a‟; El puntero esta hacienda referencia a un sistio desconocido de la memoria int n; int *ptr = &n; ptr = 9;
int *ptr = NULL; *ptr = 9;
19. ¿Qué valor tendrá la variable a tras la ejecución de este programa? main () { int int p = q = a = a = }
a = 5; // a vale 5 *p; int **q; &a; // p apunta a la variable a &p; // q apunta a p *p*2+**q; 5*2+5=15
20.-pretende desarrollar tres fragmentos de código que sumen los elementos de un vector de enteros v de diferentes maneras. Completa dicho código siguiendo las instrucciones de los comentarios: int i, suma; int *ptr, *ptrfin;
/* Alternati va 1 */ suma = 0; for (i=0 ; i
/* Alternati va 2 */ suma = 0; for (i=0 ; i
suma = 0; ptr=v; ptrfin = ptr + N; //Completa la expression para que //ptrFin apunte al último elemento //del vector for (ptr=v ; ptr