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); } }