ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Programacion funcional con recursividad

nueva25 de Septiembre de 2011

8.449 Palabras (34 Páginas)553 Visitas

Página 1 de 34

ALCANCE DE VARIABLES. LOCALIDAD Y GLOBALIDAD

1.- En el siguiente programa usted debe verificar que las declaraciones de las variables son correctas, luego hacer la corrida del programa con el objeto de visualizar el alcance de las variables.

/* archivo p1 */

int k,x;

void r1(int a, int b)

{

int i;

i=0;

a=2*b;

r3(i);

printf("%d %d,x,y);

}

main()

{

k=1;

x=2;

r1(x,x);

printf("%d",x);

}

/*archivo p2*/

int r2(int i)

{

i=i+3;

if (k <= 2)

printf("%d %d",i,k)

return(i+k+a);

}

void r3(int a)

{

int x,y;

a=i+k;

x=r2(a);

y=r2(2*a);

printf ("%d %d",x,y);

}

2.- A continuación se presentan varios programas ilustrativos de lo que ocurre al combinar las reglas de alcance de variables y pasaje de parámetros en una forma no muy organizada. Su actividad concreta es dar los resultados de la corrida de estos programas atendiendo a dichas reglas. Escriba de nuevo los programas usando reglas de buen estilo de programación

a)

void pr(int x,int y,int *z);

main() {

int a=5,b=8,c=3;

pr(a,b,&c);pr(7,a+b+c,&a); pr(a*b,a /b,&c);

}

void pr(int x,int y,int *z)

{*z=x+y+*z; printf("%d%d%d",x,y,*z);}

b)

void r1(int *a; int b);

int r2(int i,int a,int k);

void r3(int *a, int i, int k);

main()

{

int k=1,x=2;

r1(&x,x,k);

printf(“%d”,x);

}

void r1(int *a, int b,int y)

{

int i=0;

a=2*b;

r3(&i,a,y);

printf(“%d %d”,x,y);

}

c) main() {

int i,j,k;

i=0; j=1; k=2;

p2(0,&k);p2(1,&i); p2(2,&j);

}

void p1(int *i,int j,int k)

{ (*i)++;

printf(“%d %d %d”,*i,j,k);

}

void p2(int h,int *j,int k) {

int i=j;

if (h==0) p1(*j,j,k)

else if (h==1) p1(&i,*j,k);

else p3(&i,*j,k);

printf(“%d %d %d”,i,j,k);

}

void p3(int *i)

{ (*i)++;}

3.- ¿Es este un programa correcto en C?, de no serlo señales los errores e indique posibles correcciones. Si fuera correcto, entonces haga la corrida del programa

main ()

{

int f=2,h=10;

a(f,h,'1'); a(h,f,'2');

}

void int A(int *x,int *y,char s)

{

int b,c;

b=x;

if (G(b) >= 40) c=D(-5);

else c=D(b*2);

}

void D int p

{

f=f+1; p=p+f; printf(f);

}

void G(int *r)

{

int a,f;

a=10; f=a*a;

r=r*a; printf(r);

return(r);

}

APUNTADORES Y ARREGLOS

1.- Conteste cada una de las siguientes preguntas. Cada parte del ejercicio deberá utilizar los resultados de las partes anteriores donde sea apropiado:

a) Declare un arreglo de tipo float, llamado numbers con 10 elementos, e inicialice los elementos a los valores 0.0, 1.1, 2.2,...9.9. Suponga que la constante simbólica SIZE ha sido definida como 10.

b) Declare un apuntador nPtr, que apunte a un objeto de tipo float.

c) Imprima los elementos del arreglo numbers, utilizando notación de subíndice de arreglos. Utilice una estructura for, y suponga que se ha declarado la variable de control entera i.

d) Proporcione dos instrucciones por separado, que asignen la dirección inicial del arreglo numbers a la variable de apuntador nPtr.

e) Imprima los elementos del arreglo numbers, utilizando únicamente la variable nPtr.

f) Imprima los elementos del arreglo numbers, utilizando el nombre del arreglo como un apuntador.

g) Imprima los elementos del arreglo numbers mediante subíndices del apuntador nPtr.

h) Suponiendo que nPtr apunta al principio del arreglo numbers, ¿cuál es la dirección referenciada por nPtr+8 ? ¿ cuál es el valor almacenado en esa posición?

i) Suponiendo que nPtr apunta a numbers[5], ¿qué dirección es referenciada por nPtr=nPtr-4 ? ¿cuál es el valor almacenado en esta posición?

2.- Encuentre el error en cada uno de los segmentos de programas siguientes. Suponga:

int *zPtr;

int *aPtr = NULL;

void *sPtr = NULL;

int number,i;

int z[5] = {1,2,3,4,5};

sPtr=z;

++z;

number = zPtr; /* uso del apuntador para obtener el

primer valor del arreglo */

number = *zPtr[2]; /* asigna el valor 3 a number*/

number = *sPtr;/* asigna el valor apuntado por sPtr a number */

for (i=0;i<=5;i++) /* imprime el arreglo z */

printf(“%d”,zPtr[i]);

3.- Para cada uno de los siguientes enunciados, escriba el trozo de código correspondiente. Suponga que se han declarado las variables num1 y num2 de tipo flotante.

a) Declare la variable fPtr como apuntador a un flotante

b) Asigne la dirección de la variable num1 a la variable fPtr

c) Imprima el valor del objeto señalado por fPtr

d) Asigne el valor del objeto señalado por fPtr a la variable num2

e) Imprima el valor de num2

f) Imprima la dirección de num1. Utilice el especificador de conversión %p

g) Imprima la dirección almacenada en fPtr utilizando %p ¿Es el valor impreso el mismo de la dirección de num1?

4.- Realice la corrida del siguiente programa para observar los cuatro métodos para referenciar los elementos de un arreglo. Diga la diferencia entre los cuatro métodos:

#include <stdio.h>

main()

{

int i, b[]={10,20,30,40,50};

int *bPtr = b;

printf("Arreglo impreso con notación de subíndices");

for (i=0; i<=4; i++)

printf("b[%d] = %d \n",i,b[i]);

printf("\n");

printf("Arreglo como apuntador y desplazamiento");

for (i=0; i<=4; i++)

printf("*(b+%d) = %d \n",i,*(b+i));

printf("\n");

printf("Notación apuntador-subíndices");

for (i=0; i<=4; i++)

printf("bPtr[%d] = %d \n",i,bPtr[i]);

printf("\n");

printf("Notación apuntador y desplazamiento");

for (i=0; i<=4; i++)

printf("*(bPtr+%d) = %d \n",i,*(bPtr+i));

}

5.- Para el siguiente programa, realice la corrida observando lo que ocurre en la pila de invocación. Modifique el programa para que los parámetros de la función sean todos por referencia. Realice la corrida con el programa modificado:

void pr(int x,int y,int z);

main() {

int a=5,b=8,c=3;

pr(a,b,c);

printf("%d%d%d",a,b,c);

pr(b,c,a);

printf("%d%d%d",a,b,c);

pr(c,b,a);

printf("%d%d%d",a,b,c);

}

void pr(int x,int y,int z);

{

z=x+y+z;

}

6.- Codifique en lenguaje C un extracto de código que dado un arreglo de enteros cuente por cada elemento o número del 0 al 9, cuantas veces se repite el elemento dentro del arreglo. Por ejemplo:

Entrada  Arreglo = [2,3,1,9,2,8,9,9,2,1,2]

Salida  1 se repite 2 veces

2 se repite 4 veces

3 se repite 1 vez

9 se repite 3 veces

8 se repite 1 vez

los demás digitos aparecen 0 veces.

7.- El modo de un arreglo de números es el número m en el arreglo que se repite con mayor frecuencia. Si se repite mas de un número con frecuencias iguales, no existe un modo. Escriba un extracto de código en C que dado un arreglo de números, retorne el modo o un mensaje de que el mismo no existe.

Ejemplo: si se toma el ejemplo anterior el modo de arreglo sería 2.

8.- Programe en C un extracto de código que dado dos cadenas de caracteres realice la concatenación de las mismas. Ejemplo: Entrada: (Palabra1 = "mar" Palabra2 = "ysol") Salida: "marysol"

9.- Defina un arreglo de caracteres y utilicelo para almacenar polinomios, de tal manera que cada índice del arreglo represente la potencia de la variable y el valor contenido en ese índice el coeficiente del mismo. Codifique en C un extracto de codigo que dados dos polinomios almacenados en esta forma sea capaz de realizar la suma de polinomios y almacenar en un tercer arreglo el polinomio resultado. Ejemplo:

Entrada:

Polin1 = x5 + 5x3 + 6x2 + 1

Almacenado en forma de arreglo sería = [1,0,6,5,0,1]

Polin2 = 2x5 + 3x4 + x2 + 3x

El arreglo seria = [0,3,1,0,3,2]

Salida:

el polinomio resultado de la suma = 3x5 + 3x4 + 5x3 + 7x2 + 3x + 1

10.- Implemente una función ordenar que reciba cuatro números en las variables a, b, c y d y los retorne ordenados de menor a mayor contenidos en las mismas variables. Ejemplo:

Función ordenar (a,b,c,d)

Valores de entrada: a

...

Descargar como (para miembros actualizados) txt (55 Kb)
Leer 33 páginas más »
Disponible sólo en Clubensayos.com