Está en la página 1de 8

Programacin

Pginas interesantes:
Stackoverflow (http://stackoverflow.com/): comunidad donde se puede encontrar mucha informacin
sobre varios algoritmos y lenguajes.
ACM-ICPC Live Archive (https://icpcarchive.ecs.baylor.edu/): Repositorio que contiene una variedad de
problemas que aparecieron en las olimpiadas de programacin de la ACM (Association for Computing
Machinery) Tienen jueces virtuales para verificar las soluciones a los problemas. Las olimpiadas se
centran en el diseo de algoritmos para los problemas planteados en las competencias; pudindose
emplear C, C++ y Java.
SPOJ (http://www.spoj.com/): lo mismo que lo anterior.
Ahmed-Aly (http://ahmed-aly.com/): sitio donde se realizan competencias virtuales de programacin
(o bien entrenamientos), usando los repositorios de problemas antes mencionados (y otros ms).

Estructuras selectivas
En C las sentencias se ejecutan sucesivamente una tras otra. Esto define un camino que va desarrollado el
programa. Sin embargo, habr momentos en que el programa deba ejecutar determinadas partes dependiendo
del estado en el que se halle el programa o de las variables externas. Para ello pueden utilizarse las sentencias
condicionales o incondicionales.
Una sentencia condicional es una instruccin o grupo de instrucciones que se pueden ejecutar o no, en funcin
del valor de una condicin.
Las sentencias que se ejecutan de forma incondicional son: break, continue, goto y return.
Bifurcaciones condicionales (if)
La sentencia if admite dos tipos de sintaxis:
if(expresin)
sentencia1;
if(expresin)
sentencia1;
else
sentencia2;
Permite tomar decisiones al programa. En su primera forma, la sentencia1 slo se ejecuta si el resultado de
evaluar la expresin es verdadero (distinto de cero). En la segunda forma, tenemos dos posibilidades: si al
evaluar la expresin el resultado es verdadero se ejecuta la sentencia1, pero si el resultado es falso se
ejecuta la sentencia2. En cualquier caso slo una de las dos sentencias se ejecuta.
Por ejemplo:
if(numero1==1)
printf(la variable numero1 vale 1);
else
printf(la variable numero1 no vale 1);
Tras evaluarse la expresin if y ejecutarse la sentencia adecuada, el programa contina con la lnea siguiente
a la de la ltima sentencia del if. Como sentencia vale cualquier tipo de sentencia vlida en C, entre ellas la
propia sentencia if.
En este caso hablaremos de sentencias if anidadas. Por ejemplo:
if(num>0)
if(num==1)
printf(num es igual a 1);
else
printf(num es mayor que 1);
else
printf(num es menor que 1);

Cuando hay dos if anidados y a continuacin hay un else, ste pertenece al ltimo if. As en el caso
anterior el primer else corresponde al segundo if. Si queremos que un else pertenezca al primer if de un
if anidado deberemos encerrar al segundo entre llaves. Por ejemplo:
if(num>=0)
{
if(num==1)
printf (num es igual a 1);
}
else
printf(num es menor que 0);

Ejemplo
Determinar si un nmero es par o impar
/*Ejercicio que seala si
un numero ingresado por teclado es par o impar*/
#include<stdio.h>
main(){
int a,b;
printf("Ingrese el nro:\n");
scanf("%d",&a);
if((a%2)==0) //Condicion para que el numero sea par
printf("El numero es par\n");
else
printf("El numero es impar\n");
}
Obs: Los comentarios son partes del cdigo ignorados por el compilador, slo sirven para orientar al
programador o a otra persona que lee el cdigo. Puede sealarse mediante /* */ y // (este ltimo slo sirve
para una lnea)
Anidamiento Ejemplo: Mostrar la calificacin de un alumno a partir del puntaje obtenido en el examen.
#include<stdio.h>
main(){
int nota, cal;
printf("Ingrese la nota:\n");
scanf("%d",&nota);
if(nota>=90) cal=5;
else if(nota>=80) cal=4;
else if(nota>=70) cal=3;
else if(nota>=60) cal=2;
else cal=1;
printf("\nLa calificacion es: %d\n",cal);
}

Estructuras repetitivas
Hasta ahora se ha trabajado con instrucciones de entrada, salida, expresiones y operadores; asignaciones,
instrucciones secuenciales y de seleccin. Hay una gran variedad de situaciones que requieren que una o varias
instrucciones se repitan varias veces, ya sean clculos u otro tipo de instrucciones. Las estructuras repetitivas
abren la posibilidad de realizar una secuencia de instrucciones ms de una vez.
Estructura genrica Repetir - Formato
repetir
instruccin 1
instruccin 2
En algn punto debe haber un criterio de parada o finalizacin
instruccin n
fin_ repetir

Estructuras repetitivas
Mientras (while)
Repetir (do-while)
Desde (for)
Conceptos de bucle (lazo) e iteracin
Un bucle, es una seccin de cdigo que se repite. Es decir cuando se termina de ejecutar la ltima instruccin
del conjunto, el flujo de control retorna a la primera sentencia y comienza una nueva repeticin de las
sentencias que forman esa seccin de cdigo. Se denomina iteracin al hecho de repetir la ejecucin de una
secuencia de acciones, la iteracin se asocia a un nmero entero que indica el nmero de veces que se repite
un trozo de cdigo.
El bucle while
El bucle while es el tipo de bucle ms sencillo. Admite la siguiente sintaxis:
while(expresin)
sentencia;
El bucle while comienza por evaluar la expresin. Si es cierta, se ejecuta la sentencia. Entonces se vuelve a
evaluar la expresin. De nuevo, si es verdadera, se vuelve a ejecutar la sentencia. Este proceso contina hasta
que el resultado de evaluar la expresin es falso. Por esto se le llama a esta expresin la condicin de salida.
Normalmente, en las sentencias del bucle while se coloca alguna instruccin que modifique la expresin de
control. Lo ms habitual es utilizar un bloque de sentencias en vez de una sentencia nica. Por ejemplo:
int variable=10;
while(variable>1){
printf(la variable vale %d \n, variable);
variable=variable-1;
printf(valor tras decrementar la variable %d\n, variable);
}
Ejemplo 1
Dado un nmero natural , desarrolle un algoritmo que calcule la sumatoria y el promedio de los nmeros
menores a y que sean mltiplos de 3.
#include<stdio.h>
int main(){
int n,i=1,sum=0,cont=0;
float prom;
printf("\nIngrese el numero: ");
scanf("%d",&n);
while(i<n){
if((i%3)==0){sum+=i;cont++;}
i++;
}
if(cont){
prom=1.0*sum/cont;
printf("\nLa suma es: %d",sum);
printf("\nEl promedio es: %.3f",prom);
}
else{
printf("\nEl nro ingresado es menor que 4");
}
return 0;
}

Ejemplo 2
Desarrolle un algoritmo que permita determinar a partir de un nmero de das (ingresado por pantalla), los
aos, meses, semanas y das que constituyen el nmero de das proporcionado.
#include<stdio.h>
int main(){
int dias,meses=0,anhos=0,semanas=0;
printf("Ingrese el numero de dias: ");
scanf("%d",&dias);
while(dias>=365){
dias-=365;
anhos++;
}
while(dias>=30){
dias-=30;
meses++;
}
while(dias>=7){
dias-=7;
semanas++;
}
printf("\nLa cantidad de anhos es: %d",anhos);
printf("\nLa cantidad de meses es: %d",meses);
printf("\nLa cantidad de semanas es: %d",semanas);
printf("\nLa cantidad de dias es: %d",dias);
return 0;
}

Ejemplo 3
Escribir un programa que permite leer nmeros positivos hasta que se ingrese un nmero negativo. Como
resultado, debe mostrarse el promedio de los nmeros positivos.
#include<stdio.h>
int main(){
int sum=0,cont=0,a;
printf("Ingrese un numero entero y positivo: ");
scanf("%d",&a);
while(a>=0){
sum+=a;cont++;
printf("Ingrese un numero entero y positivo: ");
scanf("%d",&a);
}
if(cont>0){
printf("\nEl promedio de los numeros positivos es: %.3f",(1.0*sum/cont));
}
else printf("\nEl primer numero introducido ya fue negativo.");
return 0;
}

El bucle do-while
La sintaxis de este bucle es:
do
sentencia;
while(expresin);
Su funcionamiento es anlogo el del bucle while, salvo que la expresin de control se evala al final del bucle.
Esto nos garantiza que el bucle do-while se ejecuta al menos una vez. Es menos habitual que el bucle
while.
Podemos incluir dentro del bucle un grupo de sentencias, en vez de slo la sentencia. Por ejemplo:
int variable=10;
do{
printf(numero actual %d \n, variable);
variable=variable-1;
}while(variable>1);

Ejemplo 1 Validacin de datos


Ingresar un nmero positivo
#include<stdio.h>
int main(){
int n;
do{
printf("\nIngrese un numero positivo: ");
scanf("%d",&n);
}while(n<=0);
return 0;
}

Ejemplo 2
Calcular el factorial de un nmero .
#include<stdio.h>
int main(){
int n,fact=1,i=1;
printf("\nIngrese el nro n: ");
scanf("%d",&n);
do{
fact*=i;
i++;
}while(i<=n);
printf("\nEl factorial de %d es: %d",n,fact);
return 0;
}

El bucle for
La sintaxis del bucle for es:
for (inicio; control; incremento)
sentencia;
Este bucle se utiliza para realizar una accin un nmero determinado de veces. Est compuesto de tres
expresiones: la de inicio, la de control y la de incremento, y de una sentencia.
Un ejemplo sencillo de uso es:
for (i=0; i<10; i++)
printf( i vale %d \n, i);
Esta versin del bucle imprime un mensaje en la pantalla mientras que no se alcance la condicin de salida,
i<10.
El funcionamiento del bucle for es el siguiente:
primero se ejecuta la expresin de inicio. Normalmente esta es una expresin de asignacin a una
variable, que le da un valor inicial.
Luego se comprueba la expresin de control. Si esta expresin es verdadera se ejecuta la sentencia,
o el grupo de sentencias. Si la expresin es falsa el bucle finaliza.
Tras ejecutarse la sentencia (o sentencias) se evala la expresin de incremento. Habitualmente lo
que hace esta expresin es incrementar la variable de control.
A continuacin se vuelve al segundo paso. El bucle finaliza cuando la expresin de control es falsa.
En un bucle for podemos omitir la expresin de inicio; por ejemplo, si sabemos que la variable ya est
inicializada:
int i=0;
for ( ; i<10; i++)
printf(i vale %d\n, i);
Tambin podemos omitir la expresin de incremento. Esto es habitual cuando la variable de control ya se
modifica dentro del bucle. Por ejemplo:

int i=0;
for( ; i<10; )
printf(i vale %d\n,i);i++;
El bucle for es equivalente a un bucle while escrito del siguiente modo:
inicio;
while(control)
sentencia;
incremento;
El bucle for se sigue el orden: evaluacin de control, ejecucin de sentencia y evaluacin de incremento.

Ejemplo 1 - Extrado de http://c2.com/cgi/wiki?FizzBuzzTest


Imprimir en pantalla los nmeros comprendidos entre 1 y 100. Pero para los mltiplos de 3, imprimir Fizz en
lugar del nmero, mientras que para los mltiplos de 5 se imprime Buzz en lugar del nmero. Si el nmero es
mltiplo de 3 y de 5, mostrar Fizzbuzz en lugar del nmero.
#include<stdio.h>
int main(){
int i;
printf("\nNumeros del 1 al 100");
for(i=1;i<101;i++){
if((i%3==0)&&(i%5==0)) printf("\nFizzBuzz");
else if(i%3==0) printf("\nFizz");
else if(i%5==0) printf("\nBuzz");
else printf("\n%d",i);
}
return 0;
}

Ejemplo 2
Dado un nmero natural , obtener el valor de:

#include<stdio.h>
int factorial(int x){
int i=1,f=1;
for(;i<=x;i++) f*=i;
return f;
}
int main(){
int n,i;
float S=0.0;
printf("Ingrese un numero natural: ");
scanf("%d",&n);
for(i=0;i<=n;i++){
S=S+1.0/factorial(i);
}
printf("\nEl resultado es: %f",S);
return 0;
}

Anidamiento de ciclos repetitivos

Correcto

Correcto

Incorrecto

Incorrecto

Ejemplo 1
Calcular el producto de todos los nmeros primos comprendidos entre 1 y .
#include<stdio.h>
int main(){
int i,k,n,primo,prod=1;
printf("\nIngrese el valor de n: ");
scanf("%d",&n);
for(i=1;i<=n;i++){
primo=1;
for(k=2;k<i;k++){
if(i%k==0){
primo=0;
k=i;
}
}
if(primo) prod*=i;
}
printf("\nEl producto de los numeros primos es: %d",prod);
return 0;
}

Ejemplo 2
Imprimir una tabla de multiplicar de 1 hasta un nmero

ingresado por teclado

#include<stdio.h>
int main(){
int n,i,j;
printf("Ingrese un numero entero mayor que 0: ");
scanf("%d",&n);
printf("\nLa tabla es:\n\t");
for(j=1;j<=n;j++) printf("%d\t",j);printf("\n");
for(i=1;i<=n;i++){
printf("%d\t",i);
for(j=1;j<=n;j++){
printf("%d\t",(i*j));
}
printf("\n");
}
return 0;
}

También podría gustarte