Академический Документы
Профессиональный Документы
Культура Документы
1) Operadores de asignacin:
n += 2; // equivalente a: n = n + 2; Analogamente puede utilizar los operadores -=. *=, /=. %=
2) Preoperadores y Postperadores:
++n; // Preoperador equivalentes a: n = n + 1;
n++; // postperador equivalentes a: n = n + 1;
Analogamente n--; --n; son equivalentes a n = n -1;
Pero hay una diferencia enpre pre y post operador: El pre ejecuta antes de una operacin y el post despus; ejemplo:
int n = 2, m = 2;
printf(%d %d\n, ++n, m++); // n y m aumentan en 1
printf(%d %d\n, n, m );
Salida: 3 2 // n (pre operador) aumenta antes del printf(), y m (post operador) aumenta despus
33 // al final n y m valen 3.
Diagrama ejemplo:
condicin de repeticin:
expresin lgica que Bloque o instruccin utilizando var1, var2, ..
utiliza var1, var2, ...
Variaciones de var1, var2, ..
fin de var1, var2, ...
Al describir una estructura de control, se suele enfatizar (hacer visibles) las componentes 2 y 4 y sobre entender la 1 y la 3; pero el
programador debe sincronizar las 4. Las componentes pueden cambiar de posicin, lo cual genera 3 tipos de estructuras.
1) Repeticin Do While
Ejecuta un bloqueInstruccion y verifica un condicin de repeticin de ejecucin
Diagrama de flujo
Sintaxis:
do bloqueInstruccion while(condicion);
PGINA: 1
Lenguaje C
// 03_01.c : Escribir un programa que lea un nmero n y valide (verifique) que su valor est entre 1 y 4
#include<stdio.h>
void main(void){
int n; // inicio de n
do {
printf("Escriba un nmero entero entre 0 y 4: ");
scanf("%d", &n); // ingrese 6 y 3 variacin de n
} while (n < 0 || n > 4); // condicin de repeticin
printf("Nmero: %d\n", n);
}
Salida:
Escriba un nmero entero entre 0 y 4: 6 // Repite porque no cumple con la restriccin
Escriba un nmero entero entre 0 y 4: 3
Nmero: 3
2) Repeticin While
Verifica un condicin, si es verdad ejecuta una bloqueInstruccion y vuelve a verificar la condicin.
Sintaxis
while (condicin) bloqueInstruccion
Diagrama de flujo
Salida:
Ingrese un entero > 0: 5
La suma de los 5 primeros nmeros es: 15
3) Repeticin For
Esta instruccin es ms elaborada e integra explcitamente todos los componentes de una repeticin: inicio, condicin de repeticin,
variaciones para repetir y bloque de ejecucin.
Sintaxis:
for([inicios]; [instrucciones, condicin]; [variaciones]) bloqueInstruccion
Note:
1) Los corchetes [ ] significan opcional
2) Los plurales, ejemplo: inicios; sinfica que pueden haber varios inicios separados por coma: ejemplo: i = 1, suma = 0
PGINA: 2
Lenguaje C
Diagrama de flujo
(2)
.
sigue a (4)
}
(3b) // viene, si condicin es falsa
Ejemplo:
for(i=0; i < 3; i++) printf("%d: %d\n", i, i*i);
Salida:
0: 0
1: 1
2: 4
Ejemplo:
int i, j, k = 0;
for(i=0, j =2; k++, i < 3; i++, j--) printf("i: %d, j: %d, k: %d\n", i, j, k);
Salida:
i: 0, j: 2, k: 1
i: 1, j: 1, k: 2
i: 2, j: 0, k: 3
Descripcin:
Parmetro Descripcin Ejemplo
Inicios 0 ms instrucciones de inicio, separadas por comas. i = 0, j = 2
Si no hay instrucciones, no se ejecuta nada.
Instrucciones 0 ms instrucciones, separadas por comas. K++,
Si no hay instrucciones, no se ejecuta nada
Condicin 0 1 condicin i<3
Si no hay condicin, se evala a Verdad
Variaciones 0 ms instrucciones de variacin, separadas por I++, j--
comas
Si no hay instrucciones, no se ejecuta nada.
bloqueInstrccion 1 ms instrucciones printf("i: %d, j: %d, k: %d\n", i, j, k)
Si no hay instrucciones, no se ejecuta nada.
PGINA: 3
Lenguaje C
Ejemplo:
#include<stdio.h>
void main(void){
for( ; ; ) ;
}
Salida: No hace nada y no acaba nunca (se queda colgado); para matarlo: ctrl+c.
Este ejemplo que solo hace perder el tiempo, sirve para recordarnos que:
1) Si no hay inicios : No se hace nada.
2) Si no hay condicin : Se evalua a verdad.
3) Si no hay variaciones: No se hace nada.
4) La instruccin ; : No hace nada.
Salir del loop: Normalmente se acaba la iteracin cuando la condicin es falsa; pero se puede salir antes, utilizando la instruccin
break; // que salta al final del bloque
Ejemplo:
#include<stdio.h>
void main(void){
for( ; ; ) break;
}
salida: No hace nada , pero no se queda colgado, termina de inmediato.
Anidamiento: Se pueden anidar varias estructuras: de repeticin, de decisin, combinadas, en uno o ms niveles.
Ejemplo: Este ejemplo ya fue presentado en los dos captulos anteriores, ahora lo modificaremos para presentar ms opciones.
Escriba un programa que lea dos enteros m y n , luego presente el men:
Operacin que requiere:
1) Sumar: m + n
2) Restar: m n
3) Multiplicar: m * n
4) Dividir: m/n // Atento a la divisin entre 0
5) Salir:
Elija la operacin: _
Indicaciones:
Valide que la operacin est entre 1 y 5. // Sugerencia: Use do.
Ejecute la operacin seleccionada. // Sugerencia: Use switch.
Presente nuevamente el men hasta que operacin = 5, lo cual termina el programa. // Sugerencia: Use do.
PGINA: 4
Lenguaje C
// 03_04.c : Leer dos nmeros, presentar un men de operaciones, ejecutarlas repetidamente y salir finalmente.
#include<stdio.h>
void main(void){
int m, n, op;
printf("Ingrese un entero m = "); scanf("%d",&m);
printf("Ingrese un entero n = "); scanf("%d",&n);
do { // presentar el men si n !=5
printf("\nOperacin que requiere:\n");
printf("1) Sumar: m + n\n");
printf("2) Restar: m n\n");
printf("3) Multiplicar: m * n\n");
printf("4) Dividir: m/n\n");
printf("5) Salir:\n");
do {
printf("Elija su opcin: "); scanf("%d",&op);
} while (op<1 || op > 5); // Valida la opcin entre 1 y 5
switch(op){ // Ejecuta la operacin seleccionada
case 1: printf("suma = %d\n", m+n); break;
case 2: printf("Resta = %d\n", m-n); break;
case 3: printf("Multiplicacin = %d\n", m*n); break;
case 4: if(n!=0) printf("Divisin = %.2f\n", (float)m/n);
else printf("Divisor es 0\n"); break;
default: printf("Gracias por su visita\n");
}
} while(op!=5);
}
Salida:
Matriz de prueba:
Caso Entradas Salida Chequeo
m n opcin
1 3 2 1 5
2 3 2 2 1
3 3 2 3 6
4 3 2 4 1.50
5 3 0 4 Divisor 0
6 7 Solicita opcin
7 5 Sale del programa
Un nuevo algoritmo: Para resolver ciertos problemas difciles, conocemos algoritmos fciles de calcular, por ejemplo para hallar el
mximo comn divisor de dos nmeros m y n = MCD(m, n), conocemos tres algoritmos clsicos:
a) El mtodo de Euclides
b) El que nos ensearon en la escuela: Producto de (factores primos de m y n comunes de menor potencia):
c) Aplicar la frmula m*n = MCD(m, n) * MCM(m, n); si conocemos el MCM(m, n)
d) Podemos disponer de un nuevo algoritmo que utiliza el poder de clculo del computador; por ejemplo para hallar el MCD(m, n)
PGINA: 5
Lenguaje C
podemos aplicar la definicin literalmente, cosa que no hacamos antes porqu era muy pesado calcular. El algoritmo aplica la
definicin en modo literal y es muy fcil ya que aplica la definicin literal:
a. mn = mnimo(m,n);
b. MCD = 1;
c. for(i = 2; i <= mn; i++) MCD = (m%i==0 && n%i==0)? i:MCD;
// (m%i==0 && n%i==0) quiere decir que i es comn divisor de m y n
Este mismo caso se presenta si queremos saber si un nmero es, o no, primo; aplicamos la definicin literal y la calculamos
con el computador. No siempre es posible aplicar este mtodo: ya sea porqu los algoritmos requieren mucho calculo, an
para una computadora o no tienen solucin.
Resumen de las iteraciones: Hemos estudiado tres tipos de iteracin, cul elegir?, Vamos a compararlos (hacer un
benchmark):
Sintaxis
for([inicios]; [instrucciones, condicin]; do bloqueInstruccion while(condicin); while (condicin) bloqueInstruccion
[variaciones]) bloqueInstruccion
Si fuera necesario abandonar un bloque, puede usar break; y saltar al final de la estructura.
Esquema de programacin
do {...} while(...); y while() {.}
No tienen inicios (se colocan antes de la estructura)
No tienen variaciones (se colocan dentro de la estructura).
Inicios; Inicios;
for([inicios]; [condicin]; [variaciones]) { do { while(condicin) {
ejecutarTarea; ejecutarTarea; ejecutarTarea;
variaciones; variaciones;
} } while(condicin); };
// 03_05a.c : Leer un nmero entero > 0 y determine si es primo o no. Desarrollar las 3 alternativas usando bucles.
#include<stdio.h>
void main(void){
int n, i=2, primo=1;
printf("Ingrese un entero > 0: ");
scanf("%d", &n);
if(n==1) primo = 0; if(n==1) primo = 0; if(n==1) primo = 0;
else for(; i*i <= n && primo ; i++) else if(n>2) do if(n%i++==0) primo=0; else while(i*i <= n && primo)
if(n%i==0) primo=0; while(i*i <= n && primo); if(n%i++==0) primo=0;
if(primo) printf("%d es primo\n", n);
else printf("%d no es primo\n", n);
}
Para este caso especfico, Qu alternativa le parece ms rpida, y por qu?
// 03_05b.c : Dados dos enteros > 0 hallar el MCD. Desarrollar las 3 alternativas usando bucles.
#include<stdio.h>
void main(void){
int m = 16, n = 38, r;
if(m<n) {r = n; n = m; m = r;}
for(;r = m%n; m = n, n = r); do{ while(r = m%n){
if(r = m%n) { m = n;
m = n; n = r;
n = r; }
}
} while(r);
printf("MCD = %d\n", n);
}
Para este caso especfico, Qu alternativa le parece ms rpida, y por qu?
PGINA: 6
Lenguaje C
No solo es cuestin de forma y gusto, el problema especfico determina cul de las estructuras es la ms adecuada para su programa-
cin. Las 3 estructuras requieren los mismos componentes: inicio, variaciones, condicin y bloque de repeticin; la diferencia est en el
orden en que se dan, un criterio puede ser:
Elija for() si tiene claramente definidos el inicio y el fin.
Caso contrario:
Elija do {...} while(...) si el condicin va mejor al final
Caso contrario: Elija while (condicin) { }.
Ejemplo: Una estudiante de C tiene insomnio, un colega decide ayudarla y le escribe un programa bien cuchi (as se dice en mi tierra)
escrito en C: zz.c, el cual muestra en el monitor:
3 ovejitas
6 conejitos
9 ovejitas
96 conejitos
99 ovejitas
96 conejitos
.
3 ovejitas
zzz zzz .C que te quito el sueo, C que te hago soar despierta y, C hacerte dormir: Linda noche para la ms linda.
Sugerencias:
1) Use do{ .. } while( );
2) Fjese que se escriben conejitos para los nmeros pares, y ovejitas para los impares
Nota: El programa ser corto, robusto (correcto, flexible), ingenioso, a esto se le llama sexi en el argot de computacin.
// Conejitos - ovejitas
// 03_07a.c : Usa do{ } while(condicion); // 03_07b.c : Usa for
#include<stdio.h>
void main(void){
int n = 3, salto = 3; // Inicios int n, salto;
do{ for(n = 3, salto = 3; n>0; n += salto, salto = (n==99)? -3:salto) {
if(n%2==0) printf("\n%d conejitos", n); // ejecucin
else printf("\n%d ovejitas", n);
n += salto; // Variaciones
if(n==99) salto = -3; // variaciones
} while(n>0); // condicin }
printf("\nzzz zzz .C que te quito el sueo, C que te hago soar despierta y, C hacerte dormir: Linda noche para la ms linda.\n");
}
1) Solicitud del usuario: Definicin del entregable incluyendo la matriz de pruebas, la cual es parte de las condiciones de aceptacin.
Entregable: programa en C: Dado un entero n >=0, grafique un rombo relleno, con diagonales 2n+1.
Matriz de Prueba:
Caso Entrada: n Salida Chequeo
1 0 *
2 1 *
* * *
*
3 2 *
* * *
* * * * *
* * *
*
Alternativa
Algoritmo Poner el eje de coordenadas en el centro del rombo, Poner el eje de coordenadas a la izquierda, graficar la
matemtico graficar en el primer cuadrante: parte superior:
La linea de borde del rombo cumple la ecuacin: Para cada fila i:
i = -j +n Calcular el nmero de blancos nb e imprimirlos.
Todos los * del primer cuadrante cumplen: Calcular el nmero de * na e imprimirlos.
i + j <= n nb = i
na = 2(n-i) -1
Otros cuadrantes: Aplicar simetras con los dos ejes Parte inferior: Aplicar simetra con el eje horizontal
PGINA: 8
Lenguaje C
printf("Ingrese un entero >= 0: "); printf("Ingrese un entero >= 0: ");
scanf("%d", &n); scanf("%d", &n);
for(i=n; i>=0; i--){ for(i=n; i>=0; i--){
for(j=0; j<=n; j++) nb = i;
if(i+j<=n) printf (" *"); for(j=0; j<= nb; j++) printf (" ");
else printf (" "); na = 2*(n-i);
printf("\n"); for(j=0; j<= na; j++) printf (" *");
} printf("\n");
} }
}
// solucin completa: simetra en los dos ejes // solucin completa: simetra con eje horizontal
#include<stdio.h> #include<stdio.h>
#include<math.h> // compile con: -lm #include<math.h> // compile con: -lm
void main(void){ void main(void){
int n, i, j, ai, aj; int n, i, j, nb, na;
printf("Ingrese un entero >= 0: "); printf("Ingrese un entero >= 0: ");
scanf("%d", &n); scanf("%d", &n);
for(i=n; i>=-n; i--){ for(i=n; i>=-n; i--){
ai = fabs(i); nb = fabs(i);
for(j=-n; j<=n; j++){ for(j=0; j<= nb; j++) printf (" ");
aj = fabs(j); na = 2*(n-nb);
if(ai+aj<=n) printf (" *"); for(j=0; j<= na; j++) printf (" *");
else printf (" "); printf("\n");
} }
printf("\n"); }
}
}
Salida: Se grafica el rombo
4) Prueba y entrega al usuario: Chequear la matriz de pruebas, repetir el chequeo de la matriz de prueba con el usuario y entregar.
Ejemplo: Pida ingresar un entero impar n > 3, ejemplo: n = 7 y dibuje la siguiente figura con "*":
* * * * * * *
* * * *
* * * *
* * *
* * * *
* * * *
* * * * * * *
Anlisis: Hay * en las diagonales y en los extremos: dnde conviene poner el eje de coordenadas? Hay varias alternativas:
// 03_09a.c: Ejes en el centro del rombo // 03_09b.c: Ejes arriba a la izquierda
// Variaciones: n/2 >= i >= - n/2; -n/2 <= j <= n/2 // Variaciones: 1<= i <= n; 1<= j <= n:
#include<stdio.h>
void main(void){
int n, i, j;
printf("Tamao del arreglo: "); scanf("%d", &n); // Ingrese = 7
int ai, aj;
n /=2; for(i=1; i<= n; i++){
for(i=n; i>=-n; i--){
PGINA: 9
Lenguaje C
ai =(i>0)? i:-i; // valor absoluto de i for(j=1; j<= n; j++)
for(j=-n; j<=n; j++){
aj =(j>0)? j:-j; if(i==1 || i==n || j==1 || j==n || i==j || i == n-j+1) printf("* ");
if(ai==n || aj==n || ai == aj) printf("* "); else printf(" ");
else printf(" ");
}
printf("\n");
}
}
Ejercicios:
Escriba, compile y ejecute programas que hagan lo siguiente:
1) Lea un nmero entero n, calcule el factorial de n! = 1*2*3..*n utilizando do while y muestre n y n!
2) Lea un nmero entero n y calcule la suma sn de los n primeros nmeros: sn = 1 + 2 + + n, y muestre n y sn, de dos modos:
a) sn = n*(n+1)/2
b) utilizando while () {.}
4) Lea dos nmeros enteros m y n positivos, encuentre el mximo comn divisor MCD e imprima, utilice el mtodo de aplicar la
definicin literal.
5) Lea dos nmeros enteros m y n positivos, encuentre el mximo comn divisor MCD y el mnimo comn mltiplo MCM e
imprmalos.
PGINA: 10