Material Lectura Unidad 3
Material Lectura Unidad 3
Material Lectura Unidad 3
Programas y algoritmos
Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse
para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de
programación concreto) uno o más algoritmos. Un algoritmo puede expresarse de distintas
maneras: en forma gráfica, como un diagrama de flujo, en forma de código como
en pseudocódigo o un lenguaje de programación, en forma explicativa, etc.
Compilación
Para propósitos de este curso y dado los límites de tiempo marcados en el mismo, utilizaremos
instrucciones bajo el denominado ANSI C. Los compiladores actuales de C, pueden traducir
programas escritos tanto en C como en C++.
3.2 Estructura básica de un programa.
En forma similar a un diagrama de flujo, en los cuales existe un símbolo grafico para realizar una
acción específica (solicitar un valor a un usuario, mostrar un valor en pantalla, etc.), en Lenguaje C,
existe un comando o palabra especial para denotar una instrucción especifica a la computadora.
De igual manera, existen símbolos especiales para denotar el inicio y fin de un programa ( { y } ).
Enseguida, se muestra una relación que existe entre un símbolo grafico usado en diagrama de
flujo y su equivalente en Lenguaje C.
Cada uno de estos comandos: scanf, if, printf y otros más, se verán en las siguientes secciones.
Cada uno de ellos tiene un formato para su uso que debe ser cumplido para que la computadora
los pueda interpretar correctamente.
Ejemplo completo de un programa en C y su equivalente en Diagrama de Flujo
Un programa en C, está compuesto por bloques de código (uno o más comandos). Cada uno de
estos bloques, llamados funciones, realiza una tarea de las varias tareas que se requieren para
resolver un problema en particular.
A cada uno de las funciones se les asocia un nombre. Cuando se desea ejecutar la tarea en
particular que realiza una función, se coloca el nombre de la función en el punto de nuestro código
en donde se requiere.
Es requisito que al menos exista una función: la función main. La función main es donde arranca la
ejecución de comandos y funciones. Problemas pequeños pueden ser resueltos con una sola
función (main). Problemas grandes requieren múltiples funciones. Más adelante, se verá el tema
de funciones con más detalle.
Programa ejemplo que muestra la Estructura General de un programa en C
/* Comentarios */
// Variables locales
Int x,y,c;
} // Fin de programa
Observaciones:
- En C, un comentario se utiliza para explicar una sección de nuestro programa. Un
comentario no afecta la ejecución de tareas. El compilador ignora estos textos. Un
comentario es solo útil para el programador, como una pequeña documentación de
partes del programa. Hay dos formas de colocar comentarios :
a) Colocándolo entre los símbolos /* y */
b) Colocándolo después de los caracteres //
El caso a) es útil para comentarios de más de una línea. El caso b) para comentarios
de una línea.
- En este ejemplo, se muestra dos funciones: main y Area_Rec. Recordar. Main es donde
comienza la ejecución de main. Desde main se controla el flujo y la ejecución de otras
partes (funciones) de nuestro programa. Recordar que funciones se verá más a detalle
más adelante. En los primeros programas usaremos solo la función main.
/* Variables locales */
Int x,y,c;
Bajo la idea de que las habilidades se logran mejor con la práctica y , dado que la programación es
una habilidad, una buena recomendación o practica de programación es : comenzar con ejemplos
que contengan pocas cosas. Por ejemplo, que declare una variable y la imprima. Que contenga un
ciclo que imprima del 1 al 10, y cosas así. Es decir, poco a poco ir aprendiendo las diversas formas
y situaciones que se pueden presentar en un programa. Estas pequeñas bases le irán fortaleciendo
poco a poco, hasta permitirle resolver problemas más complejos.
En este contexto, en algunos casos, aunque un comando tenga varias formas, trataremos de
fortalecer la más común o útil para la mayoría de los casos. En las siguientes secciones,
mencionaremos comando, instrucción o sentencia como sinónimo.
Centraremos la mayoría de los primeros ejercicios en el uso de los siguientes elementos y/o
sentencias:
http://www.carlospes.com/curso_de_lenguaje_c/01_03_01_tipos_de_instrucciones_lenguaje_c.p
hp
3.3 Identificadores.
Un programa en C está compuesto por varios elementos: variables, funciones, tipos de datos,
comandos o instrucciones, etc. A muchos de estos elementos, se le asocia un nombre llamado
identificador para distinguir uno de otro. Por ejemplo, en el caso de las variables, puedo llamar a
una A y a otra B, para distinguir una de otra al momento de estar usando a las mismas en los
cálculos. Una variable es quizá el tipo de identificador más usado en un programa en C.
Algunos identificadores son particularmente especiales debido a que son usados para identificar
tipos de datos que tendrán las variables o el nombre de comandos (acciones) que se realizaran en
nuestro programa. Estos identificadores que NO PUEDEN SER USADOS PARA NOMBRAR AUN
IDENTIFICADOR DEFINIDO POR EL USUARIO, SE LES LLAMA PALABRAS RESERVADAS.
Ejemplo 1: Algunos identificadores válidos que pueden ser definidos por el programador
son:
numero
dia_del_mes
PINGUINO1
_ciudad
Z
Ejemplo 2: Los siguientes identificadores no son válidos por incumplir la segunda regla:
123
_DÍA
numero*
lugar de nacimiento año
int
char
int y char son identificadores predefinidos (ya existen en lenguaje C), por tanto, no pueden
ser definidos por el programador, en cumplimiento de la tercera regla.
Por último, hay que decir que, es aconsejable que los identificadores tengan un significado
Un tipo de datos especifica que tipo de valores va a estar asociado a un identificador. Desde el
punto de vista de una variable, su tipo de datos especifica si va a tener valores numéricos (reales o
enteros) o si va a retener valores alfanuméricos (como nombres de persona, domicilios, teléfonos,
etc.).
En seguida, describiremos un poco más amplio, cada uno de los tipos básicos de datos en C.
Un dato de tipo entero (int en lenguaje C) es aquel que puede tomar por valor un número
perteneciente al conjunto de los números enteros (Z), el cual está formado por los números
naturales, sus opuestos (números negativos) y el cero.
Ejemplo: La edad de una persona y el año en que nació, son dos datos de tipo entero:
Edad...: 29
Año....: 1976
Z es un conjunto infinito de números enteros, y como el ordenador no puede representarlos todos,
un dato de tipo entero sólo puede tomar por valor un número perteneciente a un subconjunto
de Z. Los valores máximo y mínimo de dicho subconjunto varían según las características de cada
ordenador y del compilador que se utilice.
Un dato de tipo real (float o double en lenguaje C) es aquel que puede tomar por valor un número
perteneciente al conjunto de los números reales (R), el cual está formado por los números
racionales e irracionales.
Ejemplo: El peso de una persona (en kilogramos) y su altura (en centímetros), son datos que
pueden considerarse de tipo real.
Peso.....: 75,3
Altura...: 172,7
R es un conjunto infinito de números reales, y como el ordenador no puede representarlos todos,
un dato de tipo real sólo puede tomar por valor un número perteneciente a un subconjunto de R.
Los valores de dicho subconjunto varían según las características de cada ordenador y del
compilador que se utilice.
Un dato de tipo carácter (char en lenguaje C) es aquel que puede tomar por valor un carácter
perteneciente al conjunto de los caracteres que puede representar el ordenador.
En lenguaje C, el valor de un dato de tipo carácter se debe representar entre comillas simples (').
Ejemplo: En un examen con preguntas en las que hay que seleccionar la respuesta correcta entre
varias opciones dadas (a, b, c, d, e), la respuesta correcta de cada una de las preguntas es un dato
de tipo carácter.
En lenguaje C, el valor de un dato de tipo cadena se debe representar entre comillas dobles (").
altura = 1.69;
d = 4.2;
printf(“%f”,cv);
scanf(“%c”,&c);
} // Fin de programa
Entrada /salida de Datos en un programa en C (Printf y scanf)
Recordemos que la mayoría de las tareas que realiza una computadora, son cálculos y
decisiones que no son visibles para el usuario de un programa. Si un programador desea que el
usuario vea un dato deberá indicárselo a la computadora mediante el comando printf.
Asi mismo, si se necesita que el usuario proporcione , mediante teclado un dato que se
requiere para los cálculos a realizar, también se deberá indicar esto a la computadora
mediante el comando scanf.
Printf
Para indicar que se debe mostrar un valor en la pantalla, dos cosas son requeridas :
printf(“formato”,valores);
a = 2;
b = a;
x = 23.34;
t = ‘g’;
printf(“%d”,a);
printf(“%d , %d ”,a,b);
printf(“%f”,x);
printf(“%c”,t);
scanf
Para solicitar valores de teclado por parte del usuario, en forma similar al printf, dos cosas son
requeridas :
Se destaca que, como parte de la sintaxis del scanf, antes de la variable deberá colocarse el
símbolo &.
printf(“formato”,&variable);
Ejemplos de scanf
int a;
float x;
char t;
scanf(“%d”,&a);
scanf(“%f”,&x);
scanf(“%c”,&c);
Programa Ejemplo: En el siguiente código, ingresamos un número y lo mostramos por
pantalla.
#include "stdio.h"
#include "conio.h"
void main()
{
float Numero; // Declaramos un flotante denominado Numero
printf("Ingrese un numero:");
scanf("%f",&Numero);
printf("\nEl numero ingresado es %f",Numero);
getch(); // Es para que el programa se detenga.
/*
En pantalla va a mostrar, en caso de haber tipeado 10
El numero ingresado es 10.000000
Es con dígitos por que es un tipo de dato float
En caso de querer mostrar menos dígitos decimales
se debería agregar al especificador de formato %f
por ejemplo para que muestre 2 decimales %.2f
quedando printf("El numero ingresado es %.2f",Numero);
*/
}
Secuencias de Escape
Las secuencias de escape se utilizan para que el compilador interprete de diferente forma la
salida de la información a mostrar, por ejemplo:
Existen en C, varios tipos de datos entero y de varios tipos de datos reales. En un inicio uno
puede preguntarse ¿Por qué varios tipos enteros? ¿Por qué no usar un solo tipo entero?
La razón de lo anterior es que, entre más grande es el número entero, puede requerir más
espacio de almacenamiento en la Memoria RAM de la Computadora. En ese contexto, si uno
conoce el rango de valores que va a retener una variable, es deseable especificar el tipo de
datos justo, para evitar espacio de memoria mal utilizado. Esto es particularmente útil en
programas grandes en donde el recurso de la Memoria es crítico.
http://users.dcc.uchile.cl/~lmateu/CC10A/Apuntes/rep/
3.6 Proposición de asignación.
Una sentencia de asignación permite, como su nombre lo indica, asignar el resultado de una
expresión a la variable que se indica.
Variable_destino = expresión ;
1) A = 2;
2) B = a + 2 ;
3) C = (x*2) /2;
4) X = Area_cuadrado(2,3)
5) X = Area_cuadrado(2,3) + 3;
Las primeras tres formas, utilizan en la expresión, solo variables, constantes y operadores. El
cuarto y quinto ejemplo utilizan funciones. Una función, es un bloque de código en nuestro
programa que hace una tarea (cálculo del área de un rectángulo en este caso) y regresa un
valor. El tema de funciones será visto con más detalle más adelante.
¿Cuáles son los operadores aritméticos más comunes que puedo utilizar en una asignación?
19 - 72 (operación resta)
24 * 3 (operación multiplicación)
Todas las operaciones del ejemplo constan de dos operadnos (constantes enteras) y un operador.
La mayoría de las veces es así, pero, también es posible realizar operaciones con distinto número
de operadores y/u operadnos.
En las operaciones del ejemplo se puede observar que los caracteres más (+) y menos (-) tienen
dos usos:
Los operadores de signo más (+) y menos (-) son operadores monarios, también llamados unarios,
ya que, actúan, solamente, sobre un operando.
Los caracteres abrir paréntesis "(" y cerrar paréntesis ")" se utilizan para establecer la prioridad de
los operadores, es decir, para establecer el orden en el que los operadores actúan sobre los
operandos.
Un operador indica el tipo de operación a realizar sobre los operandos (datos) que actúa. Los
operandos pueden ser:
Llamadas a funciones.
En este apartado se van a tratar operaciones en donde sólo aparecen constantes y variables.
Cuando se combinan uno o más operadores con uno o más operandos se obtiene una expresión.
De modo que, una expresión es una secuencia de operandos y operadores escrita bajo unas reglas
de sintaxis.
#define PI 3.141592
int numero = 2;
float radio_circulo = 3.2;
( PI * PI )
numero * 5
Un operador siempre forma parte de una expresión, en la cual, el operador siempre actúa sobre al
menos un operando. Por el contrario, un operando sí puede aparecer solo en una expresión.
En programación, de la evaluación de una expresión siempre se obtiene un valor. Dicho valor
puede ser de tipo: entero, real, lógico, carácter o cadena. Por consiguiente, una expresión puede
ser:
Aritmética (devuelve un número entero o real).
Lógica (devuelve un valor lógico: verdadero o falso)
- Para evitar dudas y problemas, cuando manejemos expresiones con varios operadores, lo mejor
es poner siempre paréntesis y forzar así la precedencia que nosotros deseemos.
Una instrucción alternativa simple (if) es una variante (más sencilla) de una instrucción alternativa
doble (if else). En lenguaje C, para escribir una instrucción if se utiliza la sintaxis:
if ( <expresión_lógica> )
{
<bloque_de_instrucciones>
}
APROBADO
Al igual que ocurre con una instrucción alternativa doble, cuando el <bloque_de_instrucciones> de
una alternativa simple sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar llave (})
también son opcionales. De modo que, para resolver el problema del ejemplo se puede escribir:
#include <stdio.h>
int main()
{
float nota;
if ( nota >= 5 )
printf( "\n APROBADO" );
return 0;
}
4.2 Selectiva doble.
En lenguaje C, para escribir una instrucción alternativa doble (if else) se utiliza la sintaxis:
if ( <expresión_lógica> )
{
<bloque_de_instrucciones_1>
}
else
{
<bloque_de_instrucciones_2>
}
Para que se ejecute el <bloque_de_instrucciones_1>, la condición tiene que ser verdadera. Por el
contrario, si la condición es falsa, se ejecutará el <bloque_de_instrucciones_2>.
En resumen, en C una instrucción if else (alternativa doble) permite seleccionar, por medio de una
condición, el siguiente bloque de instrucciones a ejecutar, de entre dos posibles.
SUSPENDIDO
Cuando un bloque de instrucciones sólo contiene una instrucción, los caracteres abrir llave ({) y
cerrar llave (}) son opcionales. Por tanto, en lenguaje C, para resolver el problema del ejemplo se
puede escribir:
#include <stdio.h>
int main()
{
float nota;
if ( nota >= 5 )
printf( "\n APROBADO" );
else
printf( "\n SUSPENDIDO" );
return 0;
}
Cuando en el código fuente de un programa existe una condición de la cual depende que a
continuación se ejecuten unas instrucciones u otras, se dice que existe una bifurcación.
4.4 Selectiva múltiple.
switch ( <expresión> )
{
case <expresión_1> : [ <bloque_de_instrucciones_1> ]
[ break; ]
case <expresión_2> : [ <bloque_de_instrucciones_2> ]
[ break; ]
...
case <expresión_n> : [ <bloque_de_instrucciones_n> ]
[ break; ]
[ default : <bloque_de_instrucciones_n+1> ]
}
El resultado de evaluar la <expresión> debe ser un valor perteneciente a un tipo de dato finito y
ordenado, es decir, entero, lógico, carácter, enumerado o subrango.
Nota: Si el número de día introducido es menor que 1 ó mayor que 7, se mostrará el mensaje:
"ERROR: Día incorrecto.".
O también:
Solución propuesta:
#include <stdio.h>
int main()
{
int dia;
return 0;
}
En la sintaxis de una instrucción alternativa múltiple, obsérvese que, después de cada bloque de
instrucciones se puede escribir, opcionalmente, la instrucción break. Dicha instrucción no se va a
estudiar con detenimiento en este apartado, ya que, de momento, basta con saber que en una
instrucción switch, la escribiremos, casi siempre, después de cada bloque de instrucciones, a
excepción del último. Para comprender su funcionamiento, pruebe a ver que ocurre si omite
algúnbreak en el código del programa del ejemplo 1.
Ejemplo 2: En la siguiente tabla se muestran las categorías a las que pertenecen los signos del
zodíaco:
Se quiere escribir un programa que:
1º) Muestre el listado de los signos del zodíaco, con sus números asociados.
2º) Pida por teclado un número (dato entero) asociado a un signo del zodíaco.
3º) Muestre la categoría a la que pertenece el signo del zodíaco seleccionado.
Nota: Si el número introducido por el usuario, no está asociado a ningún signo del zodíaco, se
mostrará el mensaje: "ERROR: <número> no está asociado a ningún signo.".
En pantalla veremos:
1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis
Es un signo de Aire.
O también:
1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis
#include <stdio.h>
int main()
{
int numero;
switch ( numero )
{
case 1 :
case 5 :
case 9 : printf( "\n Es un signo de Fuego." );
break;
case 2 :
case 6 :
case 10 : printf( "\n Es un signo de Tierra." );
break;
case 3 :
case 7 :
case 11 : printf( "\n Es un signo de Aire." );
break;
case 4 :
case 8 :
case 12 : printf( "\n Es un signo de Agua." );
break;
default : printf( "\n ERROR: %d no esta asociado a ningún signo.", numero );
}
return 0;
}
int main()
{
int numero;
char categoria[7];
switch ( numero % 4 )
{
case 1 : strcpy( categoria, "Fuego" );
break;
case 2 : strcpy( categoria, "Tierra" );
break;
case 3 : strcpy( categoria, "Aire" );
break;
case 0 : strcpy( categoria, "Agua" );
}
return 0;
}
En esta segunda solución existen las siguientes diferencias importantes con respecto a la solución
anterior:
En el código se utiliza una alternativa doble (if else), además de una alternativa múltiple
(switch).
En la alternativa múltiple no se escribe el <bloque_de_instrucciones_n+1>.
En programación, las instrucciones alternativas y repetitivas pueden escribirse una dentro de otra.
A este hecho se le conoce como anidamiento
En lenguaje C, para anidar una instrucción if else en otra (también if else), se utiliza la sintaxis:
if ( <expresión_lógica_1> )
{
/* Inicio del anidamiento */
if ( <expresión_lógica_2> )
{
<bloque_de_instrucciones_1>
}
else
{
<bloque_de_instrucciones_2>
}
/* Fin del anidamiento */
}
else
{
<bloque_de_instrucciones_3>
}
O también:
if ( <expresión_lógica_1> )
{
<bloque_de_instrucciones_1>
{
else
{
"APTO", en el caso de que la nota sea mayor o igual que 5 y menor o igual que 10.
"NO APTO", en el caso de que la nota sea mayor o igual que 0 y menor que 5.
"ERROR: Nota incorrecta.", en el caso de que la nota sea menor que 0 o mayor que 10.
APTO
O por ejemplo:
#include <stdio.h>
int main()
{
float nota;
return 0;
}
Fíjese que, en este caso, se puede prescindir de los caracteres abrir llave ({) y cerrar llave (}) de la
sintaxis, ya que, los bloques de instrucciones sólo contienen una instrucción.
if ( <expresión_lógica> )
{
}
else
{
<bloque_de_instrucciones_n+2>
}
Ejemplo: Así por ejemplo, el primer ejemplo del apartado Instrucción switch en C, también se
puede resolver anidando una instrucción switch (alternativa múltiple) en una instrucción if
else(alternativa doble), como se muestra a continuación:
#include <stdio.h>
int main()
{
int dia;
return 0;
}
4.5 Repetir Mientras.
4.6 Repetir hasta.
4.7 Repetir desde.
¿Qué tipos de instrucciones de control repetitivas existen en C?
Para realizar varoas veces una serie de tareas. Implementa lo que en diagrama de flujo llamamos
ciclo.
while ( <expresión_lógica> )
{
<bloque_de_instrucciones>
}
Por otra parte, al igual que en las instrucciones alternativas doble y simple, a la <expresión_lógica>
de una instrucción repetitiva while, también se le llama condición.
Para que se ejecute el <bloque_de_instrucciones>, la condición tiene que ser verdadera. Por el
contrario, si la condición es falsa, el <bloque_de_instrucciones> no se ejecuta.
Por tanto, cuando el flujo de un programa llega a un bucle while, existen dos posibilidades:
Para que un bucle while no sea infinito, en el bloque de instrucciones debe ocurrir algo para que la
condición deje de ser verdadera. En la mayoría de los casos, la condición se hace falsa al cambiar el
valor de una variable.
Ejemplo 1: Se quiere escribir un programa que muestre por pantalla los primeros diez números
naturales:
1 2 3 4 5 6 7 8 9 10
#include <stdio.h>
int main()
{
int contador;
return 0;
}
Ejemplo 2: Se quiere escribir un programa que:
2º) En el caso de que la nota sea incorrecta, muestre por pantalla el mensaje:
3º) Repita los pasos 1º y 2º, mientras que, la nota introducida sea incorrecta.
En pantalla:
APROBADO
El código propuesto es:
#include <stdio.h>
int main()
{
float nota;
if ( nota >= 5 )
printf( "\n APROBADO" );
else
printf( "\n SUSPENDIDO" );
return 0;
}
do
{
<bloque_de_instrucciones>
} while ( <expresión_lógica> );
Además, como se puede apreciar, la instrucción repetitiva do while, también hace uso de una
condición.
Por consiguiente, cuando el flujo de un programa llega a un bucle do while, existen dos
posibilidades:
En resumen, una instrucción repetitiva do while permite ejecutar repetidamente (una o más veces)
un bloque de instrucciones, mientras que, una determinada condición sea verdadera.
Ejemplo 1: De modo que, utilizando un bucle do while, el problema del ejemplo 1 del apartado
anterior, Instrucción while en C, se puede resolver con el código:
#include <stdio.h>
int main()
{
int contador;
return 0;
}
Como ya se ha dicho, el bucle do while puede iterar una o más veces, por tanto, cuando un bloque
de instrucciones debe iterar al menos una vez, generalmente, es mejor utilizar un bucle do while
que un bucle while, como por ejemplo, en el siguiente problema.
3º) Repita los pasos 1º y 2º, mientras que, el usuario no responda 'n' de (no).
4º) Muestre por pantalla la suma de los números introducidos por el usuario.
En pantalla:
#include <stdio.h>
int main()
{
char seguir;
int acumulador, numero;
/* En acumulador se va a guardar la suma de
los números introducidos por el usuario. */
acumulador = 0;
do
{
printf( "\n Introduzca un numero entero: " );
scanf( "%d", &numero);
return 0;
}
Instrucción for en Lenguaje C
Por otro lado, el bucle for es ideal usarlo cuando, de antemano, ya se sabe el número de veces
(iteraciones) que tiene que ejecutarse un determinado bloque de instrucciones.
El bucle for es una variante del bucle while y, al igual que éste, puede iterar cero o más veces. Sin
embargo, el bucle for sólo se suele usar cuando se conoce el número exacto de veces que tiene
que iterar el bucle. Éste es el caso del problema planteado en el ejemplo 1 del
apartado Instrucción while en C, en el cual, se sabe de antemano que el bucle tiene que iterar,
exactamente, diez veces.
Ejemplo: Por tanto, dicho problema, se puede resolver con una instrucción repetitiva for de la
siguiente forma:
#include <stdio.h>
int main()
{
int contador;
printf( "\n " );
return 0;
}