Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos y lenguaje C
Autor: abraham sopla
1. Introduccin
En educacin superior quien lleve un curso de Lenguajes de Programacin, tcnicas de programacin, algoritmos, estructuras de datos, sistemas operativos, etc, se habr dado cuenta lo complicados que resultan estos cursos cuando no entendemos, como es que la computadora maneja internamente las lneas de cdigo escritas en los programas para realizar una actividad. Quien sabe como se ordenan los datos en una hoja de calculo Excel?, de manera que, luego de seleccionar datos, pulsamos el botn ordenar de la barra de herramientas y listo. Quin sabe como calcula el trmino n de una sucesin de nmeros?, etc, sinceramente una serie de problemas. Todos intentamos manejar las computadoras -usarlas- para resolver problemas, sin antes hacer por lo menos un pequeo plan acerca de la solucin o tantear el camino a seguir para llegar a la solucin de una situacin problema dado. Aspectos que nos obligan a llevar largas horas, sentados frente a las computadoras. Hay quienes creen que para ser buenos programadores hay que tener una computadora, talvez no sea tan cierto; pero mas seguro es primero saber resolver los problemas usando algoritmos para luego llevarlos a las computadoras. En estos casos queda claro que el uso de la computadora pasa a segundo plano. En consecuencia para resolver un problema en computadora primero hay que hacer un plan, en otras palabras un algoritmo. Los algoritmos que desarrollaremos sern usando pseudocdigo e implementados en lenguaje C, tratando de no llegar a complicaciones en el uso del lenguaje. En los primeros captulos del libro, encontramos teora suficiente para desarrollar e implementar los algoritmos en lenguaje C. Tenga en cuenta que este documento no tiene prioridad en el estudio del lenguaje C si no ms bien en el uso del mismo en la resolucin de problemas comunes. Segn el avance se trata ejercicios combinados con los diferentes tipos de sentencias y grado de dificultad. Algunos de los ejercicios solucionados se encuentran propuestas por otros autores, sin embargo lo que a nosotros nos interesa es como solucionarlos, para as cumplir con nuestro objetivo. Este trabajo est orientado a estudiantes que se inician en educacin superior en carreras de Ingeniera de Sistemas, computacin e informtica, electrnica, industrial, etc., a quienes se les sugiere estudiar detenidamente los casos que presentamos. Claro est que nos es la idea que se los copien o se los aprendan de memoria las soluciones, si no ms bien tengan en sus manos un material de ayuda.
Algoritmo Inicio Declare area, basemayor, basemenor, altura Area: ((basemayor+basemenor)/2)* altura Imprimir area Fin
EJEMPLO 2: Escriba un programa que calcule la suma de: 1/10+1/11+1/12+1/13+...+1/50 Usemos los pasos para definir el problema. 1. El problema trata de la suma de una serie de fracciones cuyo numerador es 1 y los denominadores estn en sucesin aritmtica empezando del 10 y van
3. Apuntes de Lenguaje C
2.1 LIBRERAS Ces un lenguaje pequeo. La funcionalidad de C se obtiene a travs de un rico conjunto de bibliotecas de funciones, llamados tambin libreras. Por ejemplo la funcin sqrt pertenece a la librera math. #include<math.h> //declaracin de librera {... a=sqrt(25); //uso de la funcin sqrt en el programa principal ... } La funcin sqrt devuelve la raz cuadrada de un nmero, ejm sqrt(25) regresa 5 NOTA: Si usted intenta usar la funcin sqrt sin declarar la librera math, tendr errores justamente en la lnea donde este escrita esta funcin. Otras funciones de la librera math seran sin, cos, tan, etc. Otras libreras son stdio, stdlib, etc. Las libreras y sus funciones estn escritas en la ayuda del lenguaje C. Cada librera contiene sus propias funciones! La librera stdio, es la que mas solemos usar para resolver problemas sencillos como los que veremos mas adelante. 2.2 VARIABLES Y CONSTANTES 2.2.1 VARIABLE: Es un identificador o nombre que sirve para almacenar valores de un tipo de datos, las variables pueden ser de un mximo de 256 caracteres, el carcter inicial de las variables ser una letra (m1, suma2, da2s, etc). Lo incorrecto sera por ejemplo 1num, 25hora, 5p1, etc. 2.2.2 CLASIFICACIN DE VARIABLES Las variables pueden ser locales o globales. Variables Locales: son las que se declaran dentro de un procedimiento o funcin. Variables Globales: son aquellas que se definen fuera de las funciones. Pueden ser utilizadas en cualquier funcin que se declaren despus de ellas, mantienen su valor entre las distintas llamadas.
NOTA Del ejemplo anterior: x y n son variables globales c y s son variables locales. - C requiere un punto y coma al final de cada sentencia. - printf es una funcin estndar de C, que se usa para escribir o imprimir datos. - \n significa salto de lnea. - % Salida formateada. LA FUNCIN main() Representa a la funcin principal; la programacin en C es en base a funciones.
4. Apuntes de Lenguaje C II
2.4 DECLARACIN DE VARIABLES Y TIPOS DE DATOS 2.4.1 DECLARACIN DE VARIABLES Las variables se escriben usando caracteres, inclusive los nmeros con un tamao mximo de 255 letras, siempre empezando con una letra. Ejemplo de variables: nmero1, a, b, c, num6, promedio, suma_nmeros, a12, as12mn, etc. Vea que en todas las variables empezamos con letras. La declaracin de variables se hace de la siguiente manera: Tipo Variable; Ejemplo: Int a; En este caso la variable a de tipo entero, aceptar valores enteros, como 2, -20, 15, 0, -658, etc. 2.4.2 TIPO DE DATOS Los tipos de datos simples son:
CADENA DE CARACTERES: Se derivan de los de tipo caracter, se declaran as: char mensaje[20]; En este caso la variable mensaje aceptar un texto o cadena cuya longitud ser de 20 caracteres como mximo. Luego las variables pueden sufrir algunas modificaciones como las mencionamos a continuacin y los tipos de datos pueden quedar clasificados de la siguiente manera:
Los tipos de datos bsicos tienen varios modificadores que los preceden. Se usa un modificador para alterar el significado de un tipo base para encajar con las necesidades de diversas situaciones. LOS MODIFICADORES: signed, unsigned, long y short. Signed, unsigned, long y short pueden ser usados con los tipos char e int. Aunque permitido, el uso de signed en enteros es redundante porque la declaracin de un entero por defecto asume un nmero con signo. 2.4.3 LECTURA Y ESCRITURA DE VARIABLES
Por ejemplo: printf(" %c %d %f ",ape, i, x); Explicacin: La sentencia(s) de formato se encierra entre comillas " ", y enseguida las variables. Asegurarse que el orden de formateo y los tipos de datos de las variables coincidan -debe existir correspondencia entre las variables y los formatos- en este caso, el valor de ape ser de tipo carcter, i entero decimal, x de coma flotante. scanf() es la funcin para entrar valores a variables. Su formato es similar a printf. Por ejemplo: scanf("%c %d %f %s",&nombre, &i, &x, cad); Observar que se antepone & a los nombres de las variables, excepto a la variable de tipo cadena de caracteres que es de tipo string. 2.4.4 LAS CONSTANTES Una constante es una variable, a la cual se le asigna un valor y este no puede cambiar. Las constantes se declaran usando la palabra clave const, por ejemplo: const a = 6; NOTAS: - Es usual inicializar una constante con un valor, ya que no puede ser cambiada de alguna otra forma. 2.5 OPERADORES 2.5.1 EL PARNTESIS Se usan para agrupar datos. No es lo mismo: 4+8/2 que (4+8)/2, si evaluamos en el primer caso tendremos como resultado 8 y en el otro 6, e ah la importancia del parntesis bien usado. 2.5.2 EL OPERADOR DE ASIGNACIN: Es el =, por ejemplo: m=4; letra='y'; Se lee: El nmero 4 es asignado a la variable m El caracter y es asignado a la variable letra 2.5.3 OPERADORES ARITMTICOS Operadores aritmticos ms usuales: Para: a=5 y b=3
10
2.5.5 OPERADORES LGICOS Los operadores lgicos se usan con sentencias condicionales o relacionales, los operadores bsicos lgicos son: Para: a=5 , b=3, c=5 y d=3.
2.5.6 ORDEN DE PRECEDENCIA DE LOS OPERADORES Es necesario ser cuidadosos con el significado de expresiones tales como a + b * c, dependiendo de lo que se desee hacer. Para a=5 , b=3 y c=5 a + b * c = 20 (a + b) * c = 40 a + (b * c) = 20 Tenga en cuenta los tres resultados anteriores, y vea la importancia del parntesis, dependiendo de la operacin que desea realizar ser utilizado. Sin embargo todos los operadores tienen una prioridad: - Los operadores de mayor prioridad son evaluados antes que los que tienen menor prioridad. - Los operadores que tienen la misma prioridad son evaluados de izquierda a derecha, por lo que: En a + b - c es evaluado como (a + b) - c. En a - b - c es evaluado como (a - b) - c.
11
5. Estructuras
3.1 ESTRUCTURAS SECUNCIALES Las estructuras secuenciales estn basadas en sentencias de asignacin simples. Ejemplo. #include<stdio.h> int x; main() {int a,b,suma; a=5; b=12; suma=a+b; suma=suma+b; printf("%d",suma); } En este caso, la evaluacin se hace lnea por lnea, siguiendo un orden. En el caso anterior valor de suma que se imprime es 29. 3.2 ESTRUCTURAS SELECTIVAS 3.2.1 LA SENTENCIA If Las tres formas como se puede emplear la sentencia if son:
3.2.2 LA SENTENCIA switch Con la estructura if ... else if se pueden realizar comprobaciones mltiples, sin embargo esto puede tornarse en confusiones muy serias para los que leen los programas, inclusive para uno mismo que ojee su cdigo despus de un buen tiempo de vacaciones. La sentencia de bifurcacin mltiple switch tiene la solucin. Sean Constante1, Constante2, Constante3, etc. valores de la variable opcin, los mismos que pueden ser nmeros o caracteres.
12
3.3 ESTRUCTURAS REPETITIVAS La explicacin para las estructuras repetitivas los haremos a travs de un ejemplo de un programa que: 1. Imprima la serie 3456789 2. Imprima la serie 3579 3.3.1 LA SENTENCIA for La sentencia for tiene el siguiente formato: for (expresion1; expresion2; expresion3) {Bloque de sentencias} Expresion1: Define la asignacin del valor inicial a una variable. Expresion2: Define la asignacin del valor final a una variable. Expresion3: Define el incremento del valor de la variable Para la serie 3456789 #include<stdio.h> int a; main() { for(a=3; a<10; a++) { printf("%d",a); } } Mostrar en pantalla: 3456789 Para la serie 3579 #include<stdio.h> int a; main() { for(a=3; a<10; a+=2) { printf("%d",a); } }
13
14
15
6. Funciones y procedimientos
4.1 FUNCIONES
Nuevamente la funcin g(x, y) devuelve un solo valor para dos valores de 2 variables de entrada, x e y respectivamente. Las funciones dentro de los lenguajes de programacin se tratan teniendo en cuenta el criterio anterior. FUNCIN: Una funcin es un grupo de instrucciones cuya ejecucin se lleva a cabo cada vez que se invoca el nombre de la funcin con valores de entrada y luego de realizar un clculo regresa un valor hasta la lnea donde se hizo la llamada a la funcin. Toda funcin regresa un nico valor PROCEDIMIENTO: Cuando una funcin no regresa valor alguno se llama procedimiento, en todo caso el valor que regresa es nulo. Un procedimiento es un grupo de instrucciones, que como su nombre lo dice realiza un procedimiento y nada mas, cuya ejecucin se lleva a cabo cada vez que se invoca el nombre del procedimiento, posiblemente con algunos valores como argumentos. Todo procedimiento no regresa valores, sino que hace algo como por ejemplo ordenar, imprimir, intercambiar valores, etc. 4.1.1 ARGUMENTOS DE LAS FUNCIONES Son los valores de las variables de la funcin f(x,y,z), en este caso los argumentos son x, y, z. - En un procedimiento no interesa el nmero de argumentos de ingreso, lo que mas interesa es el proceso que va ha realizar y sobre ello el valor que devuelve.
16
17
7. Estructuras secuenciales
Como ya lo mencionamos anteriormente, los algoritmos que necesitan de estructuras secuenciales para su solucin son los mas difciles de comprender y mas sencillos de identificar los procesos que realizar el programa que nos llevarn a la solucin del mismo. En algunos algoritmos se omite la declaracin de variables, en casos que el algoritmo no es complicado. Ejercicio 1 Hacer el rastreo manual para: a = 2 a = a + 1 b = a * 2 b = b - 1 c = a + 2 * b Presentar "c". RASTREO: Para el rastreo hay que asignarle a cada lnea un nmero, de la siguiente manera, de antemano ya nos habremos fijado que el valor de salida es el de la variable c, el problema sera saber el valor de esta variable c que se mostrar finalmente. 1) a = 2 2) a = a + 1 3) b = a * 2 4) b = b - 1 5) c = a + 2 * b 6) Presentar "c". Lnea 1: a=2 Lnea 2: a=2+1=3 Lnea 3: b=3*2=6 Lnea 4: b=6-1=5 Lnea 5: c=3+2*5=13 Lnea 6: Se presenta 13 El valor de la variable c ser 13. Ejercicio 2 Hacer el algoritmo para escribir un programa que evale la expresin Solucin: observe que los valores de ingreso sern para las variables x, w. Algoritmo Inicio Declare Resultado, x, w Leer x,w Resultado (x+w)/(2*w) Mostrar Resultado Fin Variables resultado: valor de la expresin luego de ser evaluada.
18
EXPLICACIN: Estas dos lneas de cdigo: printf("ingrese el valor de x , tambin de w \n"); scanf("%f %f",&x,&w); Pueden ser escritas en cuatro lneas de la siguiente manera, con la diferencia de que la forma de capturar de los datos cambia. Quedando de la siguiente manera. printf("ingrese el valor de x \n"); scanf("%f ",&x); printf("ingrese el valor de w \n"); scanf("%f ",&w); Ejercicio 3
19
Algoritmo Inicio Declare x, y, Resultado Leer x,y Resultado raizcuadrada(3*x*x+4*y*y) Mostrar resultado Fin Variables x : guarda un valor numrico ingresado. y : guarda un valor numrico ingresado. resultado : guarda el valor resultado de la expresin. Programa #include<stdio.h> #include<math.h> main(void) {int x,y; float resultado; printf("ingrese el valor de x, tambin y \n"); scanf("%d %d",&x,&y); resultado=sqrt(3*x*x+4*y*y); printf("%f",resultado); } COMENTARIO resultado=sqrt(3*x*x+4*y*y); printf("%f",resultado); Lo anterior puede reemplazarse por una sola lnea de cdigo como: printf("%f", sqrt(3*x*x+4*y*y)); Cuando menos lneas tenga el cdigo, el programa es mejor. Y el programa quedara con una lnea de menos. #include<stdio.h> #include<math.h> main(void) {int x,y; float resultado; printf("ingrese el valor de x, tambin y \n"); scanf("%d %d",&x,&y); printf("%f", sqrt(3*x*x+4*y*y)); } Ejercicio 4 Hacer el algoritmo para escribir un programa que imprima el subtotal y el IGV de una transaccin comercial, siendo el IGV el 19% del total. El dato de ingreso ser el total. Algoritmo
20
21
8. Estructuras selectivas
5.2.1 SELECCIN SIMPLE if Ejercicio 5 Hacer el algoritmo para escribir un programa que indique si un nmero ingresado por el teclado es positivo. Algoritmo Inicio Declare num Leer num Si num>0 entonces Imprimir num es positivo Fin si Fin Variables Nu2m: Nmero que se ingresa por el teclado Programa #include<stdio.h> main(void) {int num; printf("ingrese un nmero.... "); scanf("%d",&num); if(num>0) printf("el nmero es positivo"); } 5.2.2 SELECCIN DOBLE if else Ejercicio 6 Hacer un algoritmo para un programa que calcule el pago que hacen un grupo de personas para ver una pelcula teniendo en cuenta que si el grupo es menor de 8 personas el pago es de 1.5 soles por persona y para grupos de 8 personas o mas el pago es 0.5 soles por persona. Algoritmo Inicio Declare num, pago Leer num Si num>=8 entonces Pago=0.5*num sino Pago=1.5*num Fin si Imprimir pago Fin Variables num: Nmero que se ingresa por el teclado e indica la cantidad de personas pago: El valor del pago que se calcular.
22
");
");
23
24
9. Estructuras selectivas II
Ejercicio 9 De los estudiantes que se matriculan en la UNAT-A, los ex soldados pagan 30 soles por curso en el que se matriculen, mientras que los dems (regulares), pagan 50 soles por curso. Disee el algoritmo para escribir un programa en el que el usuario introduce los datos del estudiante (ex soldado o regular) y el nmero de cursos y las salidas sean la categora del estudiante (ex soldado o regular), nmero de cursos y los costos totales por los cursos a llevar. Algoritmo Inicio Declare categora, nc, pago Leer categora, nc Si categora es exsoldado entonces Pago:nc*30 Imprimir "ex soldado", nc, pago Sino Pago:nc*50 Imprimir "regular", nc, pago Fin si Fin Variables categora : Asume los valores exsoldado o regular. nc : Nmero de cursos. pago : Pago por el total de cursos matriculados Programa #include<stdio.h> main(void) {int x,pago,nc; printf("ingrese la categora: 1. ex soldado 2. regular\n"); scanf("%d",&x); printf("ingrese el nmero de cursos\n"); scanf("%d",&nc); if(x==1) printf("categora: ex soldado, %d cursos, pago: %d soles ",nc,nc*30); else printf("categora: regular, %d cursos, pago: %d soles ",nc,nc*50); } if ANIDADO Ejercicio 10 En la ciudad de Chachapoyas, una agencia de seguros para automviles asigna costos basados en el sexo y la edad del conductor. Los varones menores de 25 aos pagan los precios ms altos, 1000 soles. Los hombres de 25 aos o ms aos pagan 700 soles. Las mujeres de menos de 21 aos pagan 800 soles, mientras que las mujeres de 21 aos o ms pagan 500 soles. Escribir el algoritmo del programa que imprima la edad del conductor, sexo, y el pago correspondiente para los clientes de
25
26
27
28
29
30
31
\n");
32
33
34
35
36
37
38
El pago por hora despus de las 40 horas de trabajo tiene un aumento equivalente al 50% del pago por hora normal. As, un empleado que trabaja 50 horas a S/. 5.00 por hora tendr un pago total de S/. 275.00. Al trabajador se le retiene un impuesto de la siguiente manera: 10 % de los primeros S/. 200.00 y 20 % de la cantidad adicional. La primera parte de la impresin en papel debe ser la informacin relevante de
39
La solucin sera: Empleado menor de 55 aos con mximo sueldo es Sergio con 460 soles. El promedio del sueldo para los empleados mayor de 55 aos es: 342.667 soles Algoritmo Inicio Declare me, mp, promedio, nombre, nme, nht, ph, total, neto, impuesto, i, edad Leer me, mp, promedio, nombre, nme, nht, ph, total, neto, impuesto, i, edad mp:0; promedio:0; Desde i=1 hasta i=10 hacer leer nombre, nht, ph, edad si nht>40 entonces total:40*ph+(nht-40)*(ph+0.5*ph) si no total:nht*ph si total>200 entonces impuesto:200*0.1+(total-200)*0.2 si no impuesto:total*0.1 neto:total-impuesto imprimir nombre, nht, ph, edad imprimir total, impuesto, neto si edad>=55 entonces promedio:promedio+neto/3 si no si mp<neto entonces mp:neto; me:edad; nme:nombre fin si fin si fin Desde imprimir promedio imprimir nme mp me Fin Variables me : la mxima edad. mp : mximo promedio. promedio : promedio que se calcula. nombre : nombre que se ingresa por el teclado. nme : nombre del que tiene la mxima edad. nht : nmero de horas trabajadas. ph : pago por hora normal.
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Si se considera 1 como el trmino 0, x como el primer trmino, como el segundo trmino, como el tercer trmino, etc; entonces el trmino n es igual al trmino n-1 multiplicado por . Haga el algoritmo para un programa basado en esta serie para encontrar una aproximacin a . El programa debe parar cuando el ltimo trmino sumando sea menor de 0.0001. Compruebe el programa para y compare con el valor de la funcin que devuelve este valor ( ) en cualquier lenguaje de programacin. Algoritmo Inicio Declare t, a, n, e, x Leer x n 2 t x e 1+x mientras t>0000.1 hacer t t*(x/n) e e+t n n+1 fin mientras imprimir x, e Fin Variables t : valor del trmino n : posicin del trmino e : acumulador de t x : valor del exponente ingresado Programa #include<stdio.h> main(void) {float n, t,e; float x; printf("ingrese el valor de x.. "); scanf("%f",&x); n=2; t=x; e=1+x; while(t>0000.1) { t=t*(x/n); e=e+t; n=n+1;
55
56
57
58
Programa #include<stdio.h> float num; float res, cubo(int x); main() { printf("ingrese un nmero "); scanf("%f",&num); res=cubo(num); printf("%f al cubo es: %f",num,res); return 0; } float cubo(int x) {return x*x*x;} Ejercicio 41 Hacer un algoritmo para un programa que evale la expresin Algoritmo Inicio Declare b, e Declare potencia(m, n) Leer b, e Imprimir potencia(b, e) Fin Funcin potencia(m, n) Inicio Declare i, y y 1 Desde i=1 hasta i<=abs(n) hacer y y*m
59
60
61
62
Ejercicio 45 Hacer un algoritmo para un programa que calcule el ensimo elemento de la serie FIBONACII. 1, 1, 2, 3, 5, 8,13,... Algoritmo Inicio Declare n Declare fibonacii(x) Leer n Imprimir n, fibonacii(n) } Funcion fibonacii(x) Inicio si x=0 x=1 entonces fibonacii 1 //semilla sino fibonacii fibonacii(x-2)+fibonacii(x-1); //esta llamando nuevamente a la funcin fibonacii(x) hasta que x=0 o x=1. Fin si Fin Variables n : ensimo elemento de la serie fibonacii x : toma valores de n fibonacii : funcin Programa #include<stdio.h> int n; int fibonacii(int x); main(void) {
63
Ejercicio 46 Hacer un algoritmo que calcule el ensimo elemento de la serie: 4, 6, 10, 16, 26, 42,... Algoritmo Inicio Declare n Declare elemento(x) Leer n Imprimir n, elemento(n) Fin Funcin elemento(x) Inicio Si x=0 entonces elemento 4 fin si //semilla Si x=1 entonces elemento 6 //semilla Sino elemento elemento(x-2)+elemento(x-1) //recursividad Fin si Fin Variables n : ensimo elemento de la serie x : toma valores de n elemento : funcin Programa #include<stdio.h>
64
65
66
67
68
69
70
71
void area() { float altura, base; printf("AREA DEL TRINGULO \n"); printf("ingrese la base ........ "); scanf("%f",&base); printf("ingrese la altura ........ "); scanf("%f",&altura); printf("el area del tringulo es %f ",base*altura/2); } void base() { float area,altura; printf("BASE DE UN TRINGULO \n"); printf("ingrese el area ........ "); scanf("%f",&area); printf("ingrese la altura ........ "); scanf("%f",&altura); printf("la base de area del tringulo es %f ",2*area/altura); } void altura() { float area,base; printf("ALTURA DE UN TRINGULO printf("ingrese el area ........ "); scanf("%f",&area); printf("ingrese la base ........ ");
\n");
72
73
19. Apndice
EJERCICIO PROPUESTO EJERCICIO 1: Desarrollar un algoritmo para un programa que imprima 40 nmeros generados aleatoriamente distintos entre 1 y 40. Sugerencia use un arreglo. Ejemplo de resultados: - 29, 26, 17, 33, 25, 18, 37, 23, 13, 3, 24, 1, 11, 22, 7, 21, 10, 31, 6, 2, 4, 15, 27, 19, 38, 40, 14, 34, 32, 36, 8, 30, 35, 28, 5, 9, 20, 39, 16, 12. - 16, 13, 4, 20, 12, 5, 24, 11, 10, 40, 30, 28, 38, 9, 34, 8, 37, 18, 29, 31, 2, 14, 39, 6, 25, 27, 21, 19, 23, 35, 17, 22, 7, 1, 15, 32, 36, 3, 33, 26 Con el mismo procedimiento usted puede generar una cantidad mayor de nmeros para comprobar la verdadera capacidad de microprocesamiento de su computador. CDIGO ASCII Pulse la tecla Alt y escriba el nmero -en el bloque de nmeros del teclado-correspondiente a la columna de los ASCII para obtener el smbolo requerido.
BIBLIOGRAFA
74
75