ayuda por favor
HOla, tengo un examen este viernes de programacion y he estado mirando examenes y hay un ejercicio q suelen poner del mismo tipo y no soy capaz de entenderlo viene con la respuesta pero no entiendo como sale, vamos q no entiendo lo q hace haber si alguien me lo puede explicar paso a paso. Bueno pos aqui dejo el ejercicio, muchas gracias:
Pregunta 5 (1.5 puntos)
Sea el código siguiente:
#include<stdio.h>
#include<stdlib.h>
#define N 11
main(){
int fa[N], *fp1, *fp2;
int i;
fp1 = fp2 = fa;
*fa = 1;
for ( i = 1; i < N; i++ )
*(fa+i) = *(fa+i-1) + fa[i-1];
while ( fp2 != &fa[N] ){
printf ( "<%d, %d>n", fp2-fp1, *fp2);
fp2++;
}
}
Indicar cuál es la salida por pantalla al terminar la ejecución.
Respuesta:
Secuencia de ejecución:
<0, 1>
<1, 2>
<2, 4>
<3, 8>
<4, 16>
<5, 32>
<6, 64>
<7, 128>
<8, 256>
<9, 512>
<10, 1024>
Pregunta 5 (1.5 puntos)
Sea el código siguiente:
#include<stdio.h>
#include<stdlib.h>
#define N 11
main(){
int fa[N], *fp1, *fp2;
int i;
fp1 = fp2 = fa;
*fa = 1;
for ( i = 1; i < N; i++ )
*(fa+i) = *(fa+i-1) + fa[i-1];
while ( fp2 != &fa[N] ){
printf ( "<%d, %d>n", fp2-fp1, *fp2);
fp2++;
}
}
Indicar cuál es la salida por pantalla al terminar la ejecución.
Respuesta:
Secuencia de ejecución:
<0, 1>
<1, 2>
<2, 4>
<3, 8>
<4, 16>
<5, 32>
<6, 64>
<7, 128>
<8, 256>
<9, 512>
<10, 1024>
El programa hace lo sigte:
- crea un array de N elementos (11 elementos)
- crea dos apuntadores a int para apuntar a zonas de memoria.
fa={x,x,x,x,x,x,x,x,x,x,x}
fp1=x
fp2=x
este es el valor de inicio, he puesto x-s pq puede haber cualquier cosa.
Imagina que fa está en la posición de memoria 0x23, así fa[0] está en 0x23, fa[1] está en 0x24, fa[2] en 0x25...
"fp1 = fp2 = fa; "
fp1 valdrá 0x23 igual que fp2 que también valdrá 0x23.
*fa = 1;
fa apunta a 0x23 que es la primera posición del array, por tanto, se guardará un 1 en la primera posición del array:
fa={1,x,x,x,x,x,x,x,x,x,x}
Entramos en el bucle for:
--> i=1
"*(fa+i) = *(fa+i-1) + fa[i-1]; "
En este caso:
*(fa+1) = *(fa+1-1)+fa[1-1]
*(fa+1) apunta a la posición 0x23+1 = 0x24 que es la segunda posición del array, y en esa posición se guarda la suma de lo que hay en *(fa+1-1)=*fa que es la posición 0x23 (un 1) más lo que hay en fa[1-1]=fa[0] que es la misma posición (0x23) y que contiene lo mismo (un 1).
por tanto en la segunda posición se guardará la suma de la posición anterior consigo misma:
el array quedaría así:
fa={1,2,x,x,x,x,x,x,x,x,x}
--> i=2
*(fa+i) = *(fa+i-1) + fa[i-1];
||
*(fa+2)=*(fa+1) + fa[1]
Se guarda en la posición 3 del array (*(fa+2) apunta a la dirección 0x25), el contenido de la posición anterior mas si mismo, 2 + 2
fa={1,2,4,x,x,x,x,x,x,x,x}
En la siguiente iteración se llenaría la sigte posición con el doble de la anterior:
fa={1,2,4,8,x,x,x,x,x,x,x}
Y así hasta llenar el array por completo:
fa={1,2,4,8,16,32,64,128,256,512,1024}
En este punto se sale del bucle for y se printean los resultados de la siguiente manera:
fp2 apuntaba a la dirección 0x23 (inicio del array) al igual que fp1.
Se hace un bucle while y se van printeando los valores del array fa mediante el puntero fp2, cuando fp2 llegue al final del array: fp2=fa[N] se sale.
--> 1ª vuelta
fp2 = 0x23
fp1 = 0x23
printf ( "<%d, %d>n", fp2-fp1, *fp2);
sacaría:
fp2-fp1 = 0x23-0x23 = 0
*fp2 = es lo que hay en la posición 0x23 (1ª posición del array) = 1
<0,1>
fp2++;
fp2 = 0x24
--> 2ª vuelta:
fp2=0x24
fp1=0x23
printf ( "<%d, %d>n", fp2-fp1, *fp2);
fp2-fp1=0x24-0x23=1
*fp2=apunta a la segunda posición=2
<1,2>
fp2++
fp=0x25
Y así hasta terminar.
Espero que después de todo este rollo te hayas enterado de todo.
Un saludo
- crea un array de N elementos (11 elementos)
- crea dos apuntadores a int para apuntar a zonas de memoria.
fa={x,x,x,x,x,x,x,x,x,x,x}
fp1=x
fp2=x
este es el valor de inicio, he puesto x-s pq puede haber cualquier cosa.
Imagina que fa está en la posición de memoria 0x23, así fa[0] está en 0x23, fa[1] está en 0x24, fa[2] en 0x25...
"fp1 = fp2 = fa; "
fp1 valdrá 0x23 igual que fp2 que también valdrá 0x23.
*fa = 1;
fa apunta a 0x23 que es la primera posición del array, por tanto, se guardará un 1 en la primera posición del array:
fa={1,x,x,x,x,x,x,x,x,x,x}
Entramos en el bucle for:
--> i=1
"*(fa+i) = *(fa+i-1) + fa[i-1]; "
En este caso:
*(fa+1) = *(fa+1-1)+fa[1-1]
*(fa+1) apunta a la posición 0x23+1 = 0x24 que es la segunda posición del array, y en esa posición se guarda la suma de lo que hay en *(fa+1-1)=*fa que es la posición 0x23 (un 1) más lo que hay en fa[1-1]=fa[0] que es la misma posición (0x23) y que contiene lo mismo (un 1).
por tanto en la segunda posición se guardará la suma de la posición anterior consigo misma:
el array quedaría así:
fa={1,2,x,x,x,x,x,x,x,x,x}
--> i=2
*(fa+i) = *(fa+i-1) + fa[i-1];
||
*(fa+2)=*(fa+1) + fa[1]
Se guarda en la posición 3 del array (*(fa+2) apunta a la dirección 0x25), el contenido de la posición anterior mas si mismo, 2 + 2
fa={1,2,4,x,x,x,x,x,x,x,x}
En la siguiente iteración se llenaría la sigte posición con el doble de la anterior:
fa={1,2,4,8,x,x,x,x,x,x,x}
Y así hasta llenar el array por completo:
fa={1,2,4,8,16,32,64,128,256,512,1024}
En este punto se sale del bucle for y se printean los resultados de la siguiente manera:
fp2 apuntaba a la dirección 0x23 (inicio del array) al igual que fp1.
Se hace un bucle while y se van printeando los valores del array fa mediante el puntero fp2, cuando fp2 llegue al final del array: fp2=fa[N] se sale.
--> 1ª vuelta
fp2 = 0x23
fp1 = 0x23
printf ( "<%d, %d>n", fp2-fp1, *fp2);
sacaría:
fp2-fp1 = 0x23-0x23 = 0
*fp2 = es lo que hay en la posición 0x23 (1ª posición del array) = 1
<0,1>
fp2++;
fp2 = 0x24
--> 2ª vuelta:
fp2=0x24
fp1=0x23
printf ( "<%d, %d>n", fp2-fp1, *fp2);
fp2-fp1=0x24-0x23=1
*fp2=apunta a la segunda posición=2
<1,2>
fp2++
fp=0x25
Y así hasta terminar.
Espero que después de todo este rollo te hayas enterado de todo.
Un saludo
Otra duda: q significan las dos barras || por ejemplo aqui: if(n == 1 || n == 2)
