Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
“DAVID AUSUBEL”
SEMIPRESENCIAL
TECNOLOGÍA EN INFORMÁTICA
GUÍA DIDÁCTICA
ALGORITMOS
1
QUITO - ECUADOR
ÍNDICE
UNIDAD 4: LENGUAJE C
4.1 Características del lenguaje C.
4.2 Estructura de un programa en C.
4.3 Tipos de datos.
4.4 Operadores aritméticos y de asignación.
4.5 Salida / entrada.
4.6 Operadores relacionales.
4.7 Sentencias condicionales.
4.8 Operadores lógicos.
2
4.9 Bucles.
4.10 Funciones.
4.11 Arrays.
4.12 Ejercicios.
UNIDAD 1
CONCEPTOS BÁSICOS
1.1 VISIÓN HISTÓRICA
La rama del saber que mayor utilización ha hecho del enfoque algorítmico es las
matemáticas. Durante miles de años el ser humano se ha esforzado por abstraer la
estructura de la solución de problemas con el fin de determinar claramente cuál es el
camino seguro, preciso y rápido que lleva a esas soluciones.
Son abundantes los ejemplos: máximo común divisor, teorema de Pitágoras, áreas de
figuras geométricas, división, suma de números fraccionarios, etc. Todos estos algoritmos
matemáticos independizan los datos iniciales del problema de la estructura de su solución,
lo que permite su aplicación con diferentes conjuntos de datos iniciales (variables).
En el ámbito de la computación, los Algoritmos son una herramienta que permite describir
claramente un conjunto finito de instrucciones, ordenadas secuencialmente y libres de
ambigüedad, que debe llevar a cabo un computador para lograr un resultado previsible.
3
Vale la pena recordar que un programa de computador consiste de una serie de
instrucciones muy precisas y escritas en un lenguaje de programación que el computador
entiende (Java, C, C++, etc.).
Ejemplo 1.2: El ejemplo de cambiar una bombilla (foco) fundida es uno de los más
utilizados por su sencillez para mostrar los pasos de un algoritmo:
4
Un aspecto muy importante sobre el cual las personas deben reflexionar es la ambigüedad
del lenguaje natural que se utiliza para comunicarse diariamente con sus semejantes. Los
algoritmos no admiten ningún tipo de ambigüedad ya que los lenguajes de programación
tienen un vocabulario restringido y preciso. Esto exige la utilización de un conjunto
determinado de palabras, mandos o primitivas en cualquiera de los procedimientos que se
elaboren.
Una diferencia notoria entre un algoritmo y un programa es que el algoritmo incorpora las
características estructurales básicas de la computación, independientemente de los detalles
de su implementación; mientras que un programa tiene un conjunto específico de detalles
para resolver un problema. Se puede observar que una técnica de solución (correspondiente
al algoritmo) se puede utilizar en diferentes situaciones problemáticas (correspondiente a
los programas).
Los Algoritmos se pueden expresar de muchas maneras, pero se puede decir que las dos
formas más importantes son: Seudocódigo y Diagrama de Flujo.
En Seudocódigo la secuencia de instrucciones se representa por medio de frases o
proposiciones, mientras que en un Diagrama de Flujo se representa por medio de gráficos.
Ejemplo 1.3: Elaborar un Algoritmo para calcular el área de cualquier triángulo rectángulo
y presentar el resultado en pantalla.
Seudocódigo:
1. Inicio
2. Asignar el número 2 a la constante "Div"
3. Conocer la base del triángulo y guardarla en la variable "Base"
4. Conocer la altura del triángulo y guardarla en la variable "Altura"
1
National Research Council (NRC). “Being Fluent with Information Technology”, 2004.
5
5. Guardar en la variable "Area" el valor de multiplicar "Base" por "Altura"
6. Guardar en la variable "Area" el valor de dividir "Area" entre "Div"
7. Reportar el valor de la variable "Area"
8. Final
Diagrama de flujo
El seudocódigo está compuesto por proposiciones informales (en este caso en español) que
permiten expresar detalladamente las instrucciones que llevan desde un estado inicial
(problema) hasta un resultado deseado (solución). Por lo regular, los algoritmos se escriben
por refinamiento: se escribe una primera versión que luego se descompone en varios
subproblemas (el número depende de la complejidad del problema) independientes entre sí.
Si es necesario se va refinando cada vez las instrucciones hasta que las proposiciones
generales en español como las del ejemplo anterior se puedan codificar en el lenguaje
seleccionado para hacer la programación.
6
Utilizar Diagramas de Flujo para representar un algoritmo tiene claras ventajas. Numerosas
investigaciones han mostrado que el Aprendizaje Visual es uno de los mejores métodos para
enseñar habilidades del pensamiento.
Forzar la identificación de todos los pasos de una solución de forma clara y lógica.
Establecer una visión amplia y objetiva de la solución.
Verificar si se han tenido en cuenta todas las posibilidades.
Comprobar si hay procedimientos duplicados.
Representar gráficamente una solución (es más simple hacerlo con gráficas que
mediante palabras).
Facilitar a otras personas la comprensión de la secuencia lógica de la solución
planteada.
Posibilitar acuerdos con base en la aproximación común a una solución de un
problema, resolver ambigüedades o realizar mejoras.
Establecer posibles modificaciones (resulta más fácil depurar un programa con el
diagrama que con el listado del código).
Agilizar la codificación (traducción) del algoritmo en un lenguaje de programación.
Servir como elemento de documentación de la solución del problema.
Actividad 1.2: Elaborar un algoritmo en seudocódigo para cada uno de los siguientes
problemas.
7
4. Hallar el área y el perímetro de un círculo cuyo radio mide 2 cm.
Inicio/Final
Se utiliza para indicar el inicio y el final de un diagrama; del Inicio sólo
puede salir una línea de flujo y al Final sólo debe llegar una línea.
Decisión
Indica la comparación de dos datos y dependiendo del resultado lógico
(falso o verdadero) se toma la decisión de seguir un camino del diagrama
u otro.
Entrada General
Entrada/Salida de datos en General.
Iteración
Indica que una instrucción o grupo de instrucciones deben ejecutarse
varias veces.
Salida Impresa
Indica la presentación de uno o varios resultados en forma impresa.
Llamada a subrutina
Indica la llamada a una subrutina o procedimiento determinado.
Salida en Pantalla
Instrucción de presentación de mensajes o resultados en pantalla.
Acción/Proceso General
Indica una acción o instrucción general que debe realizar el computador
(cambios de valores de variables, asignaciones, operaciones aritméticas,
etc.).
8
Conector
Indica el enlace de dos partes de un diagrama dentro de la misma página.
Flujo
Indica el seguimiento lógico del diagrama. También indica el sentido de
ejecución de las operaciones.
Conector
Indica el enlace de dos partes de un diagrama en páginas diferentes.
Poner un encabezado que incluya un título que identifique la función del algoritmo;
el nombre del autor; y la fecha de elaboración.
Sólo se pueden utilizar símbolos estándar (ISO 5807).
Los diagramas se deben dibujar de arriba hacia abajo y de izquierda a derecha.
La ejecución del programa siempre empieza en la parte superior del diagrama.
Los símbolos de “Inicio” y “Final” deben aparecer solo una vez.
La dirección del flujo se debe representar por medio de flechas (líneas de flujo).
Todas las líneas de flujo deben llegar a un símbolo o a otra línea.
Una línea de flujo recta nunca debe cruzar a otra.
Cuando dos líneas de flujo se crucen, una de ellas debe incluir una línea arqueada en
el sitio donde cruza a la otra (Figura 1.2).
Se deben inicializar las variables que se utilicen o permitir la asignación de valores
mediante consulta al usuario.
Las bifurcaciones y ciclos se deben dibujar procurando una cierta simetría.
Cada rombo de decisión debe tener al menos dos líneas de salida (una para SI y otra
para NO).
Las acciones y decisiones se deben describir utilizando el menor número de
palabras posible; sin que resulten confusas o poco claras.
Si el Diagrama se vuelve complejo y confuso, es mejor utilizar símbolos conectores
para reducir las líneas de flujo.
Todo el Diagrama debe ser claro, ordenado y fácil de recorrer.
El Diagrama se debe probar recorriéndolo con datos iniciales simples (prueba de
escritorio).
3
Rojas & Ñacato. 1980.
9
Fig. 1.2 Cruce de líneas de flujo4
FUNDAMENTOS DE PROGRAMACIÓN
2.1 COMENTARIOS
Los comentarios no tienen ningún efecto en la ejecución del algoritmo. Se utilizan para
aclarar instrucciones que puedan prestarse a confusión o como ayuda a otras personas que
deben leerlo y entenderlo. La mayoría de los lenguajes de programación ofrecen la
posibilidad de comentar el código de los programas.
2.2 IDENTIFICADORES
Los identificadores son nombres que se dan a los elementos utilizados para resolver un
problema y poder diferenciar unos de otros. Al asignar nombres (identificadores) a
variables, constantes y procedimientos se deben tener en cuenta algunas reglas:
Los nombres pueden estar formados por una combinación de letras y números
(saldoMes, salario, fecha2, baseTriángulo, etc.).
El primer carácter de un nombre debe ser una letra.
La mayoría de los lenguajes de programación diferencian las mayúsculas de las
minúsculas.
Los nombres deben ser nemotécnicos, con solo leerlos se puede entender lo que
contienen. Deben ser muy descriptivos; no utilizar abreviaturas, a menos que se
justifique plenamente.
Es conveniente utilizar una sola palabra para nombrar páginas, controles, variables,
etc.
No utilizar caracteres reservados (%, +, /, >, etc.).
Se debe tener en cuenta que algunos lenguajes de programación no admiten las
tildes.
No utilizar palabras reservadas por los lenguajes de programación.
4
Lopez García, Juan Carlos. Algoritmos y programación, 2009.
10
Para cumplir con convenciones ampliamente utilizadas, los nombres de
procedimientos, variables y constantes deben empezar con minúscula. Ejemplo,
fecha, suma, etc. Si es un nombre compuesto por varias palabras, cada una de las
palabras (con excepción de la primera) deben empezar con mayúscula. Ejemplo:
fechaInicial, baseTriángulo, etc.
2.3 VARIABLES
Para poder utilizar algoritmos con diferentes conjuntos de datos iniciales, se debe establecer
una independencia clara entre los datos iniciales de un problema y la estructura de su
solución. Esto se logra mediante la utilización de Variables (cantidades que se suelen
denotar con letras -identificadores- y que pueden tomar cualquier valor de un intervalo de
valores posibles).
En programación, las Variables son espacios de trabajo (contenedores) reservados para
guardar datos (valores).
El valor de una Variable puede cambiar en algún paso del Algoritmo o permanecer
invariable; por lo tanto, el valor que contiene una variable es el del último dato asignado a
esta. En la mayoría de los lenguajes de programación se utiliza la forma
nombreVariable=Valor.
2.4 CONSTANTES
Las Constantes se crean de la misma forma que las variables y consisten en datos que,
luego de ser asignados, no cambian en ninguna instrucción del Algoritmo. Pueden contener
constantes matemáticas (pi) o generadas para guardar valores fijos (3.8, "Jorge", etc.).
2.5 CONTADORES
2.6 ACUMULADORES
Todos los lenguajes de programación definen unas palabras para nombrar sus comandos,
instrucciones y funciones. Un identificador definido por el usuario no puede tener el
nombre de una palabra reservada.
11
2.8 FUNCIONES MATEMÁTICAS
Actividad 2.1: Investigar cuales son las funciones matemáticas que proporciona el lenguaje
de programación C.
Números: se utilizan como entradas en las operaciones matemáticas. Cuando se utilizan los
signos positivo (+) o negativo (-), estos deben estar pegados al número.
Palabras: Las palabras están formadas por letras y/o números. Una palabra está delimitada
por espacios en blanco; sin embargo, si se quiere tener un texto conformado por dos o más
palabras, algunos lenguajes de programación permiten encerrar el texto entre comillas o
barras.
2.10 OPERADORES
Son símbolos que sirven para manipular datos. Los operadores y las operaciones que se
pueden realizar con ellos se clasifican en:
Aritméticos: Posibilitan las operaciones entre datos de tipo numérico y dan como
resultado otro valor de tipo numérico. Ejemplo: potencia; producto; división; suma;
resta.
Alfanuméricos: Permiten operar con datos de tipo carácter o cadenas. La mayoría
de los lenguajes de programación admiten el operador + para realizar la
concatenación (unión) de caracteres o cadenas.
Relaciónales: Permiten la comparación entre datos del mismo tipo y dan como
resultado dos valores posibles: Verdadero o Falso. Ejemplo: igual a; menor que;
mayor que.
Lógicos: Posibilitan la evaluación lógica de dos expresiones de tipo lógico. Dan
como resultado uno de dos valores posibles: Verdadero o Falso. Ejemplo: negación
(no); conjunción (y); disyunción (o).
12
Los computadores ejecutan los operadores en un orden predeterminado. El siguiente es el
orden (jerarquía) para ejecutar operadores:
2.11 EXPRESIONES
Una Expresión está compuesta por valores, funciones, primitivas, constantes y/o variables,
o por una combinación de los anteriores mediante operadores.
Son Expresiones:
2.12 PROCESOS
13
2.13 INTERACTIVIDAD
2.14 PROCEDIMIENTOS
Ejemplo 2.1: Escribir y diseñar un procedimiento que se llame triangulo para hallar el área
de un triángulo rectángulo cuya Base mide 3 cm, la Altura 4 cm y la Hipotenusa 5 cm.
14
UNIDAD 3
ESTRUCTURAS BÁSICAS
Secuencial.
Iterativa (repetición).
Condicional (decisión, selección).
Una estructura de control se define como “un esquema que permite representar ideas de
manera simplificada y que bajo condiciones normales, es constante”.5
“El uso del diseño descendente en los programas, la ejecución de operaciones secuenciales,
la utilización de ciclos repetitivos y, la toma de decisiones y alternativas de proceso,
ofrecen amplias posibilidades para resolver problemas mediante la construcción de
procedimientos”. 6
Es fundamental que se preste atención especial a las estructuras que se utilizan para
resolver problemas y reconocerlas para lograr mayor control sobre la solución planteada.
De esta manera, la programación de computadores ayuda a planear conscientemente las
5
Trejos. 1999.
6
Castellanos & Ferreyra. 2000.
15
secuencias de acciones que resuelven un problema planteado y las estructuras involucradas
en una solución dada.
Declaración de variables.
Asignación de valores.
Entrada de datos.
Procesamiento de datos (operaciones).
Reporte de resultados.
16
Ejemplo 3.1: Escribir un procedimiento para calcular el área de cualquier triángulo
rectángulo. En él se debe pedir al usuario que ingrese los valores de la Altura y la Base del
triángulo.
17
Actividad 3.1: Diseñar un algoritmo que pida al usuario dos números y calcule la suma, la
resta, la multiplicación y la división del primero por el segundo.
3.2 ESTRUCTURA ITERATIVA (REPETICIÓN)
Ejemplo3.3: Escribir un procedimiento que muestre 100 veces en pantalla la frase “David
Ausubel”.
7
Lopez García, Juan Carlos. Algoritmos y programación, 2009.
18
Resultados esperados: Que aparezca 100 veces en pantalla la frase “David Ausubel”.
Datos disponibles: La frase dada.
Restricciones: Ninguna.
Procesos necesarios: Mostrar la frase mencionada 100 veces.
19
Este algoritmo utiliza una operación muy útil en programación:
sumatoria = sumatoria + contador
Consiste en almacenar en una variable sumatoria el valor de ella misma (sumatoria) más
otro valor variable (contador). Es muy utilizada para acumular valores.
Ejemplo 3.5: Elaborar un procedimiento para calcular las tablas de multiplicar. El usuario
debe ingresar qué tabla de multiplicar desea.
20
3.3 ESTRUCTURA CONDICIONAL
La estructura condicional se utiliza para indicarle al computador que debe evaluar una
condición y, a partir del resultado, ejecutar el bloque de instrucciones correspondiente. La
forma más común está compuesta por una proposición (condición) que se evalúa y dos
bloques de instrucciones que se ejecutan, uno cuando la condición es verdadera (selección
simple y doble) y otro cuando ésta es falsa (únicamente en la selección doble).
Para que una proposición (frase declarativa) sea válida, debe poder afirmarse que es
verdadera o falsa.
En programación, se utilizan operadores relacionales (<, =, >) para establecer la relación
que existe entre dos elementos de la proposición.
Selección simple.
21
Selección doble.
Selección múltiple.
Las estructuras condicionales simple y doble evalúan una proposición (condición) que
devuelve como resultado únicamente dos valores posibles y excluyentes: verdadero o falso.
En cambio, la estructura condicional de selección múltiple permite que la condición
devuelva más de un valor posible y que para cada uno de esos valores se ejecute el bloque
de instrucciones correspondiente.
Selección simple
Selección doble
8
Lopez García, Juan Carlos. Algoritmos y programación, 2009.
9
Lopez García, Juan Carlos. Algoritmos y programación, 2009.
22
Ejemplo 3.6: Un estudiante aprueba un examen cuando obtiene una calificación mayor o
igual a siete. Elaborar un procedimiento que pida al usuario una calificación, aplique el
criterio de aprobación e imprima “Aprobado” o “Reprobado”, según sea el caso.
Ejemplo 3.7: Supongamos que Mónica quiere ir a comer helado y su padre le propone:
“Como hoy entregan tus calificaciones del segundo período, si has obtenido en matemáticas
más de 8.0, vamos a comer helado el próximo sábado, de lo contrario no vamos”. La
situación “comer helado” está sujeta a la condición “obtener más de 8.0 en matemáticas
para el segundo período”.
23
Diseño del algoritmo
Ejemplo 3.8: Una profesora necesita calcular la nota definitiva para cada uno de los 22
alumnos que asisten a su curso de geometría, con el fin de saber quiénes aprobaron y
quiénes reprobaron (para aprobar hay que obtener una nota igual o superior a 6.5), la
profesora realizó a todos sus estudiantes, en el primer periodo del año lectivo, dos
exámenes y asignó un trabajo de investigación. ¿Cómo se le puede ayudar?
24
Ejemplo 3.9: Escribir un procedimiento para leer los valores de dos de los tres ángulos
internos de un triángulo y mostrar en pantalla “Es un Triángulo Rectángulo” si
efectivamente es un triángulo de este tipo o, en caso contrario, mostrar “No es un Triángulo
Rectángulo”.
25
Actividad 3.2: Escribir un procedimiento para leer los valores de dos de los tres ángulos
internos de un triángulo y mostrar en pantalla “Es un Triángulo Rectángulo” si
efectivamente es un triángulo de este tipo o, en caso contrario, mostrar “No es un Triángulo
Rectángulo”. Utilizar operadores lógicos en la solución.
Actividad 3.3: Tomando como base el ejemplo anterior, realizar las modificaciones
necesarias para que adicionalmente, el programa muestre en pantalla “No es un Triángulo”
en caso de que cualquiera de los ángulos sea menor o igual a cero.
Estructuras condicionales anidadas
26
Hay situaciones que requieren el uso de estructuras condicionales anidadas. En estas, el
resultado de la primera proposición implica evaluar a continuación una segunda
proposición y esta a su vez requiere que se evalúe una tercera proposición, y así
sucesivamente, hasta agotar todas las condiciones.
Plantear estructuras algorítmicas anidables (iterativa y condicional) requiere procesos de
pensamiento asociados con el sistema operatorio de clasificación o inclusión.
El siguiente caso ilustra muy bien este punto: "Se requiere elaborar un procedimiento que
permita determinar para un grupo de 10 personas si tienen derecho o no a jubilarse a partir
de los datos género, edad y años de aportes; y las siguientes condiciones: si es hombre debe
tener más de 65 años de edad y más de 60 años si es mujer, pero en todo caso se deben
haber realizado aportes por más de 20 años".
UNIDAD 4
27
LENGUAJE C
Todo programa en C consta de una o más funciones, una de las cuales se llama main
(principal). El programa comienza en la función main, desde la cual es posible llamar a
otras funciones.
Cada función estará formada por la cabecera de la función, compuesta por el nombre de la
misma y la lista de argumentos (si los hubiese), la declaración de las variables a utilizar y la
secuencia de sentencias a ejecutar.
main( ) {
variables locales;
instrucción(es),
}
funcion1( ) {
variables locales;
instrucción(es);
}
COMENTARIOS
28
/* Un comentario también puede
estar escrito en varias líneas */
PALABRAS CLAVE
Existen una serie de indicadores reservados, con una finalidad determinada, que no se
puede utilizar como identificadores.
A continuación se observan algunas de estas palabras clave:
IDENTIFICADORES
El primer caracter de un identificador no puede ser un número, es decir que debe ser una
letra o el símbolo _.
Se diferencian las mayúsculas de las minúsculas, así num, Num y nuM son distintos
identificadores.
A continuación se observan algunos ejemplos de identificadores válidos y no válidos:
Válidos No válidos
_num 1num
var1 número2
fecha_nac año_nac
En 'C' existen básicamente cuatro tipos de datos, aunque también se puede definir tipos de
datos propios a partir de los tipos originales. A continuación se detalla su nombre, el
tamaño que ocupa en memoria y el rango de sus posibles valores.
29
CALIFICADORES DE TIPO
signed
Le indica a la variable que va a llevar signo. Es el utilizado por defecto.
unsigned
Le indica a la variable que no va a llevar signo (valor absoluto).
short
Rango de valores en formato corto (limitado). Es el utilizado por defecto.
long
Rango de valores en formato largo (ampliado).
LAS VARIABLES
Una variable sólo puede pertenecer a un tipo de dato. Para poder utilizar una variable,
primero tiene que ser declarada:
[calificador] <tipo> <nombre>
Es posible inicializar y declarar más de una variable del mismo tipo en la misma sentencia:
Ejemplo:
int num1=4,num2,num3=6;
30
¿Dónde se declaran?
Las variables pueden ser de dos tipos según el lugar en que las declaremos: globales o
locales.
La variable global se declara antes de la función main( ). Puede ser utilizada en cualquier
parte del programa y se destruye al finalizar éste.
La variable local se declara después de la main( ), en la función en que vaya a ser utilizada.
Sólo existe dentro de la función en que se declara y se destruye al finalizar dicha función.
#include <stdio.h>
int a;
main() /* Muestra dos valores */
{
int b=4;
printf("b es local y vale %d",b);
a=5;
printf("\na es global y vale %d",a);
}
CONSTANTES
Para indicar al compilador que se trata de una constante, se utiliza la directiva #define:
Observe que no se indica el punto y coma de final de sentencia ni tampoco el tipo de dato.
#include <stdio.h>
#define pi 3.1416
#define escribe printf
main() /* Calcula el perímetro */
{
int r;
escribe("Introduce el radio: ");
scanf("%d",&r);
escribe("El perímetro es: %f",2*pi*r);
}
SECUENCIAS DE ESCAPE
31
\n salto de línea
\b retroceso
\t tabulación horizontal
\v tabulación vertical
\\ contrabarra
\f salto de página
\' apóstrofe
\" comillas dobles
\0 fin de una cadena de caracteres
#include <stdio.h>
INCLUSIÓN DE FICHEROS
Para indicar al compilador que se va a incluir ficheros externos se tiene dos maneras
(siempre antes de las declaraciones).
#include "misfunc.h"
#include "c:\includes\misfunc.h"
#include <misfunc.h>
Operadores aritméticos
32
Los binarios:
+ Suma
- Resta
* Multiplicación
/ División
% Módulo (resto)
y los unarios:
++ Incremento (suma 1)
-- Decremento (resta 1)
- Cambio de signo
Su sintaxis es:
binarios:
<variable1><operador><variable2>
unarios:
<variable><operador> y al revés, <operador><variable>.
#include <stdio.h>
OPERADORES DE ASIGNACIÓN
= Asignación simple
+= Suma
-= Resta
*= Multiplicación
/= División
%= Módulo (resto)
33
Con estos operadores se pueden escribir, de forma más breve, expresiones del tipo:
#include <stdio.h>
Será importante tener en cuenta la precedencia (de mayor a menor) de los operadores a la
hora de trabajar con ellos:
( )
++, - -
*, /, %
+, -
Las operaciones con mayor precedencia se realizan antes que las de menor precedencia.
Sentencia printf( )
La rutina printf permite la aparición de valores numéricos, caracteres y cadenas de texto por
pantalla.
printf(control,arg1,arg2...);
34
El modificador está compuesto por el caracter % seguido por un caracter de conversión,
que indica de qué tipo de dato se trata.
#include <stdio.h>
%c Un único carácter.
%d Un entero con signo, en base decimal.
%u Un entero sin signo, en base decimal.
%o Un entero en base octal.
%x Un entero en base hexadecimal.
%e Un número real en coma flotante, con exponente.
%f Un número real en coma flotante, sin exponente.
%s Una cadena de caracteres.
%p Un puntero o dirección de memoria.
#include <stdio.h>
main() /* Modificadores 1 */
{
char cad[]="El valor de";
int a=-15;
unsigned int b=3;
float c=932.5;
printf("%s a es %d\n",cad,a);
printf("%s b es %u\n",cad,b);
printf("%s c es %e o %f",cad,c,c);
}
Sentencia scanf( )
La rutina scanf permite entrar datos en la memoria del ordenador a través del teclado.
scanf(control,arg1,arg2...);
35
En la cadena de control se indicará, por regla general, los modificadores que harán
referencia al tipo de dato de los argumentos. Al igual que en la sentencia printf los
modificadores estarán formados por el caracter % seguido de un caracter de conversión.
#include <stdio.h>
El resultado que devuelven estos operadores es 1 para Verdadero y 0 para Falso. Si hay más
de un operador se evalúan de izquierda a derecha. Además los operadores == y != están por
debajo del resto en cuanto al orden de precedencia.
#include <stdio.h>
36
printf("Introduce el valor de B: ");
scanf("%d",&b);
if(a>b)
printf("A es mayor que B");
else if(a<b)
printf("B es mayor que A");
}
Estructura IF...ELSE
#include <stdio.h>
Con este formato el flujo del programa únicamente entra en una de las condiciones. Si una
de ellas se cumple, se ejecuta la sentencia correspondiente y salta hasta el final de la
estructura para continuar con el programa.
Existe la posibilidad de utilizar llaves para ejecutar más de una sentencia dentro de la
misma condición.
37
Ejemplo: /* Uso de la sentencia condicional ELSE...IF. */
#include <stdio.h>
Estructura SWITCH
Esta estructura se suele utilizar en los menús, de manera que según la opción seleccionada
se ejecuten una serie de sentencias.
Cada case puede incluir una o más sentencias sin necesidad de ir entre llaves, ya que se
ejecutan todas hasta que se encuentra la sentencia break. La variable evaluada sólo puede
ser de tipo entero o caracter. default ejecutará las sentencias que incluya, en caso de que
la opción escogida no exista.
#include <stdio.h>
38
case 7: printf("Domingo"); break;
}
}
&& AND
|| OR
! NOT (El valor contrario)
Estos operadores actúan sobre expresiones lógicas. Permiten unir expresiones lógicas
simples formando otras más complejas.
4.9 BUCLES
Sentencia WHILE
Con esta sentencia se controla la condición antes de entrar en el bucle. Si ésta no se cumple,
el programa no entrará en el bucle.
Naturalmente, si en el interior del bucle hay más de una sentencia, éstas deberán ir entre
llaves para que se ejecuten como un bloque.
#include <stdio.h>
39
while(numero<=10)
{
printf("%d\n",numero);
numero++;
}
}
Sentencia DO...WHILE
Con esta sentencia se controla la condición al final del bucle. Si ésta se cumple, el
programa vuelve a ejecutar las sentencias del bucle.
La única diferencia entre las sentencias while y do...while es que con la segunda el cuerpo
del bucle se ejecutará por lo menos una vez.
#include <stdio.h>
}while(seleccion!='4');
}
Sentencia FOR
La inicialización indica una variable (variable de control) que condiciona la repetición del
bucle. Si hay más, van separadas por comas:
40
for (a=1,b=100;a!=b;a++,b- -){
#include <stdio.h>
Sentencia BREAK
Esta sentencia se utiliza para terminar la ejecución de un bucle o salir de una sentencia
switch.
Sentencia CONTINUE
#include <stdio.h>
41
numero++;
}
}
4.10 FUNCIONES
Las funciones son bloques de código utilizados para dividir un programa en partes más
pequeñas, cada una de las cuáles tendrá una tarea determinada.
Su sintaxis es:
tipo_función nombre_función (tipo y nombre de argumentos)
{
bloque de sentencias
}
tipo_función: puede ser de cualquier tipo de dato conocido. El valor devuelto por la función
será de este tipo. Por defecto, es decir, si no se indica el tipo, la función devolverá un valor
de tipo entero (int). Si se desea que no retorne algún valor se debe indicar el tipo vacío
(void).
tipo y nombre de argumentos: son los parámetros que recibe la función. Los argumentos de
una función no son más que variables locales que reciben un valor.
Este valor se lo envía al hacer la llamada a la función. Pueden existir funciones que no
reciban argumentos.
Las funciones pueden ser llamadas desde la función main o desde otras funciones. Nunca
se debe llamar a la función main desde otro lugar del programa.
Al igual que las variables, las funciones también han de ser declaradas. Esto es lo que se
conoce como prototipo de una función.
Los prototipos de las funciones pueden escribirse antes de la función main o bién en otro
fichero. En este último caso se lo debe indicar al compilador mediante la directiva #include.
#include <stdio.h>
42
{
int num=10; /* variable local */
printf("%d\n",num);
funcion(); /* llamada */
}
void funcion(void)
{
printf("%d\n",num);
}
Las funciones pueden retornar un valor. Esto se hace mediante la instrucción return, que
finaliza la ejecución de la función, devolviendo o no un valor.
En una misma función se puede tener más de una instrucción return. La forma de retornar
un valor es la siguiente:
El valor devuelto por la función debe asignarse a una variable. De lo contrario, el valor se
perderá.
#include <stdio.h>
Por valor: cualquier cambio que se realice dentro de la función en el argumento enviado,
NO afectará al valor original de las variables utilizadas en la llamada. Es como si
trabajaramos con una copia, no con el original. No es posible enviar por valor arrays, se
debe hacerlo por referencia.
43
Ejemplo: /* Paso por valor. */
#include <stdio.h>
void intercambio(int,int);
main() /* Intercambio de valores */
{
int a=1,b=2;
printf("a=%d y b=%d",a,b);
intercambio(a,b); /* llamada */
printf("a=%d y b=%d",a,b);
}
Para enviar un valor por referencia se utiliza el símbolo & (ampersand) delante de la
variable enviada. Esto le indica al compilador que la función que se ejecutará tendrá que
obtener la dirección de memoria en que se encuentra la variable.
Las variables con un * son conocidas como punteros, el único dato en 'C' que puede
almacenar una dirección de memoria.
#include <stdio.h>
44
4.11 ARRAYS
Vectores
Un vector es un array unidimensional, es decir, sólo utiliza un índice para referenciar a cada
uno de los elementos. Su declaración será:
El tipo puede ser cualquiera de los ya conocidos y el tamaño indica el número de elementos
del vector (se debe indicar entre corchetes [ ]). En el siguiente ejemplo se puede observar
que la variable i es utilizada como índice, el primer for sirve para rellenar el vector y el
segundo para visualizarlo. Las posiciones van de 0 a 9 (total 10 elementos).
#include <stdio.h>
Una particularidad con los vectores de tipo char (cadena de caracteres), es que se debe
indicar en qué elemento se encuentra el fin de la cadena mediante el caracter nulo (\0). Esto
no lo controla el compilador, y debe ser el programador el que inserte este caracter al final
de la cadena.
45
Ejemplo: /* Vector de tipo char. */
#include <stdio.h>
#include <conio.h>
También se observa una nueva función llamada getche( ), que se encuentra en conio.h.
Esta función permite la entrada de un caracter por teclado. Después se encuentra un if, que
comprueba si se ha rellenado todo el vector. Si es cierto, coloca el caracter nulo en el
elemento nº20 (cadena[19]). En caso contrario se teine el else, que asigna el caracter nulo
al elemento que almacenó el caracter ENTER.
Los arrays únicamente pueden ser enviados a una función por referencia. Para ello
deberemos enviar la dirección de memoria del primer elemento del array. Por tanto, el
argumento de la función deberá ser un puntero.
#include <stdio.h>
46
void visualizar(int array[]) /* desarrollo */
{
int i;
for (i=0;i<25;i++) printf("%d",array[i]);
}
Matrices
Una matriz es un array multidimensional. Se definen igual que los vectores excepto que se
requiere un índice por cada dimensión.
Una matriz bidimensional se podría representar gráficamente como una tabla con filas y
columnas.
En el siguiente ejemplo se puedes ver como se rellena y visualiza una matriz bidimensional.
Se necesitan dos bucles para cada una de las operaciones. Un bucle controla las filas y otro
las columnas.
/* Matriz bidimensional. */
#include <stdio.h>
Si al declarar una matriz también se quiere inicializarla, habrá que tener en cuenta el orden
en el que los valores son asignados a los elementos de la matriz. A continuación se pueden
observar algunos ejemplos:
int numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
47
Char dias[7][10]=
{"lunes","martes","miércoles","jueves","viernes","sábado","domingo"};
4.12 EJERCICIOS
#include <cstdlib>
#include <stdio.h>
#define DIV 2
main()
{
float base, altura,float area;
#include <cstdlib>
#include <stdio.h>
#define DIV 2
#define BASE 3
#define ALTURA 4
main()
{
float AREA;
AREA=BASE*ALTURA/DIV;
printf("El Area del triangulo es: %f\n", AREA);
system("PAUSE");
}
48
Ejercicio 4.3 Traducción al lenguaje C del ejemplo 3.1.
#include <cstdlib>
#include <stdio.h>
main()
{
float div, base, altura, area;
div = 2;
#include <cstdlib>
#include <stdio.h>
main()
{
printf("David Ausubel\n");
printf("David Ausubel\n");
printf("David Ausubel\n");
system("PAUSE");
}
#include <cstdlib>
#include <stdio.h>
main()
{
int contador;
49
system("PAUSE");
}
Ejercicio 4.7 Traducción al lenguaje C del ejemplo 3.4.
#include <cstdlib>
#include <stdio.h>
main()
{
int contador=0;
int sumatoria=0;
printf("%d\t", contador);
printf("%d\n", sumatoria);
}
printf("[El valor de la suma 1+2+3+...+10 es] %d\n", sumatoria);
system("PAUSE");
}
#include <cstdlib>
#include <stdio.h>
main()
{
int tabla, multiplicando, resultado, contador;
system("PAUSE");
}
#include <cstdlib>
#include <stdio.h>
main()
{
float calificacion;
50
scanf("%f", &calificacion);
if(calificacion >= 7)
printf("Aprobado\n");
else
printf("Reprobado\n");
system("PAUSE");
}
#include <cstdlib>
#include <stdio.h>
main()
{
float matematicas;
if(matematicas <= 8)
printf("No come helado\n");
else
printf("Si come helado\n");
system("PAUSE");
}
#include <cstdlib>
#include <stdio.h>
main()
{
int estudiante, aprobar;
float examenUno, examenDos, trabajo, sumatoria, promedio;
51
if(promedio < 6.5)
aprobar=0; //"NO"
else
aprobar=1; //"SI"
printf("Promedio: %f\n", promedio);
printf("Aprueba? ");
if(aprobar == 1)
printf("SI\n");
else
printf("NO\n");
}
}
system("PAUSE");
}
#include <cstdlib>
#include <stdio.h>
main()
{
int ANGULO1, ANGULO2, ANGULO3, esRectangulo;
ANGULO3=180-ANGULO1-ANGULO2;
esRectangulo = 0; //"NO"
if(ANGULO1 == 90)
esRectangulo = 1; //"SI"
else
if(ANGULO2 == 90)
esRectangulo = 1; //"SI"
else if(ANGULO3 == 90)
esRectangulo = 1; //"SI"
else if(esRectangulo == 1)
printf("SI es un triángulo Rectángulo\n");
else
printf("NO es un triángulo Rectángulo\n");
system("PAUSE");
}
52
BIBLIOGRAFÍA
53