TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: thecrow_94 en 07 de Febrero de 2005, 05:36:00

Título: Ayuda por favor
Publicado por: thecrow_94 en 07 de Febrero de 2005, 05:36:00
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>
", 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>
Título: RE: Ayuda por favor
Publicado por: Modulay en 07 de Febrero de 2005, 06:48:00
Lo que hace ese programilla es una cosa así

Codigo:

main ()
  {  
  int fa[N], *fp1, *fp2; // Array de 11 enteros y dos punteros a entero.
  int i;
  fp1 = fp2 = fa;  // fp1 y fp2 apuntan al array (a la dirección de memoria de su primer elemento).
  *fa = 1;  // Asignamos el valor 1 al primer elemento del array.
  for ( i = 1; i < N; i++ )  // Desde i=1 hasta i=11...
    *(fa+i) = *(fa+i-1) + fa[i-1]; // ...asignamos al elemento cuya posición en memoria es la de *fa + i
                                   // lo que vale el elemento anterior + lo que vale el elemento anterior (multiplica por 2).
  while ( fp2 != &fa[N] ){  // Mientras fp2 no apunte a la posición de memoria siguiente al último elemento del aray...
    printf ( "<%d, %d>
", fp2-fp1, *fp2); // ...mostramos dirección a la que apunta fp2 - dirección a la que apunta fp1(ésta no cambia).
                                           // ...mostramos el contenido de la posición apuntada por fp2.
                                           // ...es decir,mostramos el índice del array y su contenido
    fp2++; // Incrementamos fp2 para recorrer todas las direcciones de memoria del array.
    }  
  }


Título: RE: Ayuda por favor
Publicado por: kruskal en 07 de Febrero de 2005, 07:35:00
La operacion  fp2-fp1 es una resta de punteros y muestra la distancia entre ambos, maestro creo que en la explicacion te falto este matiz porque no corresponde propiamente tal al indice del array. El puntero fp1 permanece fijo apuntando al primer elemento y el fp2 se desplaza.

De la misma forma la linea *(fa+i) = *(fa+i-1) + fa[i-1]; igual considero tiene sus enredos que vale la pena tener claro. *(fa+1) es equivalente a fa[i+1]. de la misma manera que *(fa+i-1) es fa[i-1] para mirarlo en forma mas sencilla y en notacion de array queda  fa[i+1]=fa[i-1]+fa[i-1] el array se llena sumando dos veces el valor anterior. En esta linea se ve claramente la equivalencia total entre array y punteros que en tantos lados se dice.

Eso, Salud2
Título: RE: Ayuda por favor
Publicado por: thecrow_94 en 07 de Febrero de 2005, 08:30:00
pos muchas gracias gente, me habesi sido de gran ayuda
Título: RE: Ayuda por favor
Publicado por: thecrow_94 en 07 de Febrero de 2005, 08:31:00
pos muchas gracias gente, me habesi sido de gran ayuda
Título: RE: Ayuda por favor
Publicado por: Modulay en 07 de Febrero de 2005, 08:37:00
Bien matizado Kruskal
Suerte con tu examen mmmmm....usuario sin nombre Giño
Saludos
Título: RE: Ayuda por favor
Publicado por: Lager. en 07 de Febrero de 2005, 10:45:00
Disculpen panas, pero :
for ( i = 1; i < N; i++ )  // Desde i=1 hasta i=11... solo cuenta hasta 10  no?

Salu2 panas! Sonrisa
Título: RE: Ayuda por favor
Publicado por: Modulay en 07 de Febrero de 2005, 11:06:00
Sip.
El primer elemento del array se modifica antes del for :

*fa = 1;

Los 10 restantes se modifican dentro del for

Saludos
Título: RE: Ayuda por favor
Publicado por: Nocturno en 07 de Febrero de 2005, 11:10:00
Pues sí pana, tienes razón, sólo cuenta hasta 10.
Título: RE: Ayuda por favor
Publicado por: Lager. en 07 de Febrero de 2005, 11:18:00
Gracias pana Modulay y Nocturno66 Sonrisa

Un abrazo panas