CI-2125 Práctica 4: Iteraciones 1. Suponga que inicialmente un

Anuncio
CI-2125
Práctica 4: Iteraciones
1. Suponga que inicialmente un estudiante cambia X barajitas en un día. Cada día siguiente
cambia una barajita más que el día anterior. Proponga un algoritmo iterativo que
determine cuántas barajitas cambiará en N días. Escriba el programa en C.
Algoritmo:
ENTRADAS: X,N (enteros positivos)
SALIDAS: cambia (entero) //POST: cambia dice el total de barajitas
//cambiadas en N dias
INICIO
LEER X,N
cambia ← X
MIENTRAS cambia ≤ N HACER
cambia ← cambia + 1
FINMIENTRAS
IMPRIMIR cambia
FIN
Programa en C:
#include <stdio.h>
main()
{
int X,N; // Entradas
// PRE: X,N son enteros positivos
int cambia; // Salida
// POST: cambia contiene el nro de barajitas que
//
se cambian hasta el día N
int i;
printf(“X=”);
scanf(“%d”,&X);
printf(“N=”);
scanf(“%d”,&N);
if (X>0 && N>0) // Chequeo de la precondición
{
cambia=5;
for (i=1; i<=N; i++)
{
cambia=cambia+1;
}
printf(“El número de barajitas cambiadas es %d”,cambia);
}
else
printf(“%d,%d deben ser enteros positivos”,X,N);
}
2. ¿Qué pasaría en el programa anterior si la condición del for fuese i ≠N y N no fuese un
entero?
SOLUCION: Se generaría un ciclo infinito, porque i siempre sería distinto de N.
3. Escriba un algoritmo iterativo para determinar si un número entero positivo es primo.
Implemente dicho algoritmo en C utilizando las instrucciones while, for y do-while.
Algoritmo:
ENTRADAS: num (entero positivo)
SALIDAS: primo (lógico) // POST: primo indica si num es primo o no
INICIO
LEER num
i ← 2
primo ← TRUE
MIENTRAS primo ∧ (i < num) HACER
SI i divide a num ENTONCES
primo ← FALSE
FINSI
i ← i+1
FINMIENTRAS
IMPRIMIR primo
FIN
Programa en C: El encabezado del programa es el mismo para las tres versiones:
#include <stdio.h>
#define true 1
#define false 0
main()
{
int num; // Entrada
// PRE: num es un entero positivo
int primo; // Salida
// POST: primo es true si num es primo y false en
//
caso contrario
int i;
printf(“num=”);
scanf(“%d”,&num);
if (num > 0) // Chequeo de la precondición
{
i=2;
Utilizando un while:
primo=true;
while (primo && i<num)
{
if (num%i==0)
primo=false;
i=i+1;
}
if (primo)
printf(“%d es primo”,num);
else
printf(“%d no es primo”,num);
}
else
printf(“%d debe ser positivo”,num);
}
Utilizando un for
primo=true;
for(i=2;i<num && primo; i=i+1)
{
if(num%i==0)
primo=false;
}
if (primo)
printf(“%d es primo”,num);
else
printf(“%d no es primo”,num);
Utilizando un do-while:
i=2;
primo=true;
do {
if (num%i==0)
primo=false;
i=i+1;
} while(primo && i<num);
if (primo)
printf(“%d es primo”,num);
else
printf(“%d no es primo”,num);
4. Determine la función f(x) computada por el siguiente algoritmo y realice la corrida en frío
para f(7)
ENTRADA: X (entero positivo)
SALIDA : ?
INICIO
LEER X
sum←0
i←1
MIENTRAS i<X HACER
i←i+1
SI resto(i,2) = 0 ENTONCES // resto de dividir i entre 2
sum←sum+i
FINSI
FINMIENTRAS
IMPRIMIR sum
FIN
SOLUCIÓN: La función computada por el algorimo es la suma de los números pares enteros
positivos, menores o iguales a X.
Corrida en frío para X=7
• i=2; sum=2
• i=3; sum=2
• i=4; sum=6
• i=5; sum=6
• i=6; sum=12
• i=7; sum=12
5. Escriba un algoritmo para determinar el Máximo Común Divisor entre dos números
enteros usando la siguiente definición:
MCD(a,a)=a
MCD(a,b)=MCD(b,a)
MCD(a,b)=MCD((a-b),b) si a>b
Escriba el programa en C equivalente al algoritmo dado.
Algoritmo:
ENTRADAS: a,b (enteros positivos)
SALIDA: mcd (entero) // POST mcd = MCD(a,b)
INICIO
LEER a,b
sum←0
i←1
MIENTRAS a ≠ b HACER
SI a > b ENTONCES
a←a-b
SINO
mcd←b
b←a
a←mcd
FINSI
mcd←a
FINMIENTRAS
IMPRIMIR mcd
FIN
#include <stdio.h>
main()
{
int a,b; // Entradas
// PRE: a,b enteros positivos
int mcd; // Salida
// POST: mcd = MCD(a,b)
printf(“Introduzca dos números :”);
scanf(“%d %d”,&a,&b);
if (a > 0 && b > 0) // Chequeo de la precondición
{
while (a != b)
{
if (a>b)
a=a-b;
else
{
mcd=b;
b=a;
a=mcd;
}
mcd=a;
}
printf(“El máximo común divisor de %d y %d es %d”,a,b,mcd);
}
else
printf(“%d, %d deben ser positivos”,a,b);
}
6. La serie de Fibonacci se define de la siguiente manera an = an-1 + an-2. Con a0=0 y a1=1.
Elabore un programa que determine el término ax de la serie.
Algoritmo:
ENTRADA: x (entero) //PRE: x>=0
SALIDA: ax (entero) //POST: Elemento ax de la serie de Fibonacci
INICIO
LEER x
SI x<2 ENTONCES
ax←x
IMPRIMIR ax
SINO
an-1←0
an←1
i←2
MIENTRAS i≤x HACER
ax ← an-1+ an
an-1← an
an ← ax
i←i+1
FINMIENTRAS
IMPRIMIR ax
FINSI
FIN
#include <stdio.h>
main()
{
int x; // Entrada
// PRE: x >= 0
int ax; // Salida
// POST: ax es el elemento x de la serie de Fibonacci
int i;
printf(“Introduzca un entero positivo:”);
scanf(“%d”,&x);
if(x<0) // Chequeo de la precondición
printf(“%d debe ser mayor o igual a cero”);
else
{
if (x<2)
ax=x;
else {
an_1=0;
an=1;
}
for(i=2;i<x+1;i++)
{
ax=an_1+an;
an_1=an;
an=ax;
}
printf(“El elemento %d de la serie es %d ”,x,ax);
}
}
Descargar