Transcript
Page 1: Ejercicios de Funciones en lenguaje C

Programación Páginas interesantes:

Stackoverflow (http://stackoverflow.com/): comunidad donde se puede encontrar mucha información 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 programación de la ACM (Association for Computing Machinery) Tienen “jueces virtuales” para verificar las soluciones a los problemas. Las olimpiadas se centran en el diseño de algoritmos para los problemas planteados en las competencias; pudiéndose 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 programación (o bien entrenamientos), usando los repositorios de problemas antes mencionados (y otros más).

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 instrucción o grupo de instrucciones que se pueden ejecutar o no, en función del valor de una condición. 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(expresión)

sentencia1;

if(expresión)

sentencia1;

else

sentencia2;

Permite tomar decisiones al programa. En su primera forma, la sentencia1 sólo se ejecuta si el resultado de evaluar la expresión es verdadero (distinto de cero). En la segunda forma, tenemos dos posibilidades: si al

evaluar la expresión el resultado es verdadero se ejecuta la sentencia1, pero si el resultado es falso se ejecuta la sentencia2. En cualquier caso sólo 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 expresión if y ejecutarse la sentencia adecuada, el programa continúa con la línea siguiente

a la de la última sentencia del if. Como sentencia vale cualquier tipo de sentencia válida 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”);

Page 2: Ejercicios de Funciones en lenguaje C

Cuando hay dos if anidados y a continuación 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 número es par o impar /*Ejercicio que señala 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 código ignorados por el compilador, sólo sirven para orientar al programador o a otra persona que lee el código. Puede señalarse mediante /* */ y // (este último sólo sirve para una línea) Anidamiento – Ejemplo: Mostrar la calificación 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 selección. Hay una gran variedad de situaciones que requieren que una o varias instrucciones se repitan varias veces, ya sean cálculos u otro tipo de instrucciones. Las estructuras repetitivas abren la posibilidad de realizar una secuencia de instrucciones más de una vez. Estructura genérica Repetir - Formato repetir instrucción 1 instrucción 2 En algún punto debe haber un criterio de parada o finalización instrucción n fin_ repetir

Page 3: Ejercicios de Funciones en lenguaje C

Estructuras repetitivas

Mientras (while)

Repetir (do-while)

Desde (for) Conceptos de bucle (lazo) e iteración Un bucle, es una sección de código que se repite. Es decir cuando se termina de ejecutar la última instrucción del conjunto, el flujo de control retorna a la primera sentencia y comienza una nueva repetición de las sentencias que forman esa sección de código. Se denomina iteración al hecho de repetir la ejecución de una secuencia de acciones, la iteración se asocia a un número entero que indica el número de veces que se repite un trozo de código. El bucle while El bucle while es el tipo de bucle más sencillo. Admite la siguiente sintaxis: while(expresión)

sentencia;

El bucle while comienza por evaluar la expresión. Si es cierta, se ejecuta la sentencia. Entonces se vuelve a evaluar la expresión. De nuevo, si es verdadera, se vuelve a ejecutar la sentencia. Este proceso continúa hasta que el resultado de evaluar la expresión es falso. Por esto se le llama a esta expresión la condición de salida. Normalmente, en las sentencias del bucle while se coloca alguna instrucción que modifique la expresión de control. Lo más 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 número natural , desarrolle un algoritmo que calcule la sumatoria y el promedio de los números menores a y que sean múltiplos 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;

}

Page 4: Ejercicios de Funciones en lenguaje C

Ejemplo 2 Desarrolle un algoritmo que permita determinar a partir de un número de días (ingresado por pantalla), los años, meses, semanas y días que constituyen el número de días 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 números positivos hasta que se ingrese un número negativo. Como resultado, debe mostrarse el promedio de los números 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(expresión);

Su funcionamiento es análogo el del bucle while, salvo que la expresión de control se evalúa 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 sólo la sentencia. Por ejemplo: int variable=10;

do{

printf(“numero actual %d \n”, variable);

variable=variable-1;

}while(variable>1);

Page 5: Ejercicios de Funciones en lenguaje C

Ejemplo 1 – Validación de datos Ingresar un número 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 número . #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 acción un número 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 versión del bucle imprime un mensaje en la pantalla mientras que no se alcance la condición de salida, i<10. El funcionamiento del bucle for es el siguiente:

primero se ejecuta la expresión de inicio. Normalmente esta es una expresión de asignación a una variable, que le da un valor inicial.

Luego se comprueba la expresión de control. Si esta expresión es verdadera se ejecuta la sentencia, o el grupo de sentencias. Si la expresión es falsa el bucle finaliza.

Tras ejecutarse la sentencia (o sentencias) se evalúa la expresión de incremento. Habitualmente lo que hace esta expresión es incrementar la variable de control.

A continuación se vuelve al segundo paso. El bucle finaliza cuando la expresión de control es falsa. En un bucle for podemos omitir la expresión 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);

También podemos omitir la expresión de incremento. Esto es habitual cuando la variable de control ya se modifica dentro del bucle. Por ejemplo:

Page 6: Ejercicios de Funciones en lenguaje C

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: evaluación de control, ejecución de sentencia y evaluación de incremento. Ejemplo 1 - Extraído de http://c2.com/cgi/wiki?FizzBuzzTest Imprimir en pantalla los números comprendidos entre 1 y 100. Pero para los múltiplos de 3, imprimir “Fizz” en lugar del número, mientras que para los múltiplos de 5 se imprime “Buzz” en lugar del número. Si el número es múltiplo de 3 y de 5, mostrar “Fizzbuzz” en lugar del número. #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 número 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;

}

Page 7: Ejercicios de Funciones en lenguaje C

Anidamiento de ciclos repetitivos

Correcto Correcto Incorrecto Incorrecto Ejemplo 1 Calcular el producto de todos los números 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 número 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;

}

Page 8: Ejercicios de Funciones en lenguaje C