Beruflich Dokumente
Kultur Dokumente
Juan XXIII
Laboratorio de Computadoras
Electrónicas
Gustavo A. Yarce
1. Introducción 9
1.1. Problemas computacionales . . . . . . . . . . . . . . . . . . . . . . 9
1.2. Etapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.1. Definición del problema . . . . . . . . . . . . . . . . . . . . 9
1.2.2. Análisis del problema . . . . . . . . . . . . . . . . . . . . . . 9
1.2.3. Programación . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.4. Prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.5. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3. PROGRAMACIÓN MODULAR . . . . . . . . . . . . . . . . . . . 11
1.4. Documentación de Programas . . . . . . . . . . . . . . . . . . . . . 12
2. El Lenguaje C 13
2.1. Marco histórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2. Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3. Creación del programa . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4. Compilación de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5. Entorno de programación . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6. Bibliotecas estándares . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.7. Componentes del lenguaje C . . . . . . . . . . . . . . . . . . . . . . 17
2.8. Estructura de un fichero fuente . . . . . . . . . . . . . . . . . . . . 18
2.9. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.10. CONSTANTES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.11. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.11.1. Variables locales y globales . . . . . . . . . . . . . . . . . . . 20
2.12. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.12.1. Calificadores de tipo . . . . . . . . . . . . . . . . . . . . . . 22
2.13. Secuencias de escape . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.14. Inclusión de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.15. Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.16. Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . . . 25
3
4 Gustavo A. Yarce
4. Control de Programas 39
4.1. Instrucción FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2. Instrucción WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.3. Instrucción DO...WHILE . . . . . . . . . . . . . . . . . . . . . . . . 41
Índice de figuras
5
6 Gustavo A. Yarce
Índice de tablas
7
Prologo
Prologo
Este documento no pretende ser un libro completo sobre programación, es una
ayuda para el alumno, para su utilización como guía de aprendizaje.
Se tiene como objetivo presentar los conceptos básicos y las características
generales del lenguaje C que posibiliten la realización de programas para la
representación de soluciones de problemas reales en una computadora.
Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la enseñanza
en entornos educativos técnicos de nivel medio que necesitan conocimientos de
informática como una herramienta para la resolución de problemas.
Se prioriza la enseñanza de una metodología de programación correcta tratando
de conservar la facilidad de uso como herramienta. Siempre se considera que lo
más importante es adquirir una base de conocimientos que permita una posterior
evolución hacia conocimientos relacionados con la Electrónica y la programación.
Capítulo 1
Introducción
1.2. Etapas
1.2.1. Definición del problema
Está dada por la formulación del problema en forma correcta y completa. Esta
enunciación de lo que se desea es primordial para el éxito de la resolución.
Condiciones: una o más relaciones que vinculan los dos conjuntos anteriores
y que permitirán plantear la solución del problema.
9
10 Gustavo A. Yarce
1.2.3. Programación
Esta etapa consiste en obtener la solución del problema dado. Se divide en dos
subetapas:
Programa
Un programa es una sucesión de instrucciones que pueden ser ejecutadas por
la PC. De modo general la PC comprende, sin traducción previa, los llamados
comando en lenguaje máquina, que son específicos del procesador.
Este tipo de lenguaje resulta ser bastante engorroso para realizar operaciones
simples. Con el fin de vencer esta dificultad, se desarrollaron los lenguajes
superiores de programación. El programador no tiene que preocuparse por la
estructura interna de la PC, ya que puede trabajar en un lenguaje relativamente
simple, transformar un determinado algoritmo en un programa adecuado.
Un lenguaje de programación lo único que realiza es la traducción escrita en
lenguaje máquina de las diferentes instrucciones escrita en un lenguaje superior.
Aquí pueden acreditarse dos procedimientos:
1.2.4. Prueba
Esta etapa consiste en la ejecución del código del método elegido, es decir,
suministrar los datos al computador, y obtener los resultados. Luego se analizarán
los mismos determinando si son realmente los esperados. Caso contrario, deberán
analizarse las etapas previas, comenzando por la última hacia atrás, y realizar
las modificaciones necesarias, repitiendo esta proceso hasta obtener los resultados
esperados.
Laboratorio de Computadoras Electrónicas 11
1.2.5. Algoritmo
En relación al algoritmo, deseamos aún entrar con detalle en unos conceptos
que son independientes del procedimiento de notación y de la descripción formal.
En primer lugar tenemos:
los módulos deben ser pequeños para que sean claros y de poca complejidad.
un módulo debe tener una estructura de caja negra, es decir la salida debe
ser exclusivamente función de la entrada.
cada módulo deber tener una única entrada y una única salida.
12 Gustavo A. Yarce
El Lenguaje C
2.2. Características
El lenguaje C tiene muy pocas reglas sintácticas, sencillas de aprender. Su
léxico es muy reducido: tan solo 32 palabras. A menudo se le llama lenguaje
de medio nivel, más próximo al código máquina que muchos lenguajes de más
alto nivel. Y por eso mismo es un lenguaje muy eficiente. Permite el uso del
lenguaje ensamblador en partes del código, trabaja a nivel de bit, y permite
modificar los datos con operadores que manipulan bit a bit la información.
También se puede acceder a las diferentes posiciones de memoria conociendo su
13
14 Gustavo A. Yarce
2.4. Compilación de C
En el siguiente apartado se muestran las distintas etapas que cubre el
compilador para obtener el código ejecutable:
1. Código Fuente
2. Preprocesador
3. Compilador
4. Código Ensamblador
5. Ensamblador
6. Librerías
7. Código Objeto
8. Ligador
9. Código Ejecutable
Laboratorio de Computadoras Electrónicas 15
2.4.1. Descripción
El proceso puede ser el globalmente dividido en varios programas:
- Preprocesador: el proceso de archivo de origen antes de la compilación. Que,
por ejemplo, controlar y sustituir los archivos de macros e incluir en su fuente. -
Compilador: transformar su archivo de origen en el código de ensamble (procesador
de lenguaje humanamente legible) - Ensamblador: toma el código de ensamble
y generar código legible por máquina (código objeto binario) - Linker: reúne y
resuelve objeto códigos juntos para crear un único ejecutable.
Ejemplo de programa en C
#include <stdio.h>
main()
{
/* Escribe un mensaje */
printf (‘‘Hola, mundo\n’’);
}
literales
tipos enumerados
punteros y vectores
Construcciones algorítmicas
construcciones iterativas(while,for,do...while)
subrutinas (funciones)
comentarios
18 Gustavo A. Yarce
inclusión de ficheros
macros
compilación condicional
#include <biblioteca1.h>
#include <biblioteca2.h>
... declaraciones de funciones ...
main()
{
... cuerpo del main ...
}
2.9. Comentarios
En C, tienen la forma /* cualquier texto */
2.10. CONSTANTES
Se define a una constante, como un elemento cuyo valor que no puede alterarse
en el transcurso de la ejecución de un algoritmo. Por ejemplo: 123, ’López’, 3.14459.
2.11. Variables
En un programa existen otros elementos cuyo valor cambia durante la ejecución
del mismo, llamados variables.
Una variable es un elemento o lugar asociado a un valor el que puede variar con-
forme se ejecuta el algoritmo, se representa por un nombre que identifica a una
posición de memoria donde puede asignarse o almacenarse un único valor por vez.
Para proponer el nombre de una variable observaremos tres reglas simples:
1. Utilizar sólo letras y/o dígitos, comenzando siempre con una letra.
Una variable sólo puede pertenecer a un tipo de dato. Para poder utilizar una
variable, primero tiene que ser declarada:
Es posible inicializar y declarar más de una variable del mismo tipo en la misma
sentencia:
#include <stdio.h>
#include <conio2.h>
/* Declaración de variables */
#include <stdio.h>
#include <conio2.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);
getch)();
}
10mm
Laboratorio de Computadoras Electrónicas 23
#include <stdio.h>
#include <conio2.h>
Para indicar al compilador que vamos a incluir ficheros externos podemos ha-
cerlo de dos maneras (siempre antes de las declaraciones).
24 Gustavo A. Yarce
#include "misfunc.h"
#include "c:\includes\misfunc.h"
#include <misfunc.h>
1. binarios:
+ Suma
-Resta
* Multiplicación
/ División
% Módulo (resto)
Su sintaxis es:
<variable1><operador><variable2>
2. unarios:
++ Incremento (suma 1)
- -Decremento (resta 1)
- Cambio de signo
Su sintaxis es:
#include <stdio.h>
#include <conio2.h>
= Asignación simple
+= Suma
-= Resta
*= Multiplicación
/= División
%= Módulo (resto)
Con estos operadores se pueden escribir, de forma más breve, expresiones del
tipo:
Ejemplo 2.5
#include <stdio.h>
#include <conio2.h>
( ) Mayor precedencia
++, - -
*, /, %
+, -Menor precendencia
Las operaciones con mayor precedencia se realizan antes que las de menor pre-
cedencia.
Si en una operación encontramos signos del mismo nivel de precedencia, dicha
operación se realiza de izquierda a derecha. A continuación se muestra un ejemplo
sobre ello:
a*b+c/d-e
1. a*b resultado = x
2. c/d resultado = y
Laboratorio de Computadoras Electrónicas 27
3. x+y resultado = z
4. z-e
Fijarse que la multiplicación se resuelve antes que la división ya que está situada
más a la izquierda en la operación. Lo mismo ocurre con la suma y la resta.
Ejemplo 2.6
/* Jerarquía de los operadores */
#include <stdio.h>
#include <conio2.h>
printf(control,arg1,arg2...);
Ejemplo 2.7
/* Uso de la sentencia printf() 1. */
#include <stdio.h>
#include <conio2.h>
%c Un único caracter
%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
Ejemplo 2.8
#include <stdio.h>
#include <conio2.h>
main() /* Modificadores 1 */
{
Laboratorio de Computadoras Electrónicas 29
Longitud: especifica la longitud máxima del valor que aparece por pantalla.
Si la longitud es menor que el número de dígitos del valor, éste aparecerá
ajustado a la izquierda.
Ejemplo 2.9
/* Uso de la sentencia printf() 3. */
#include <stdio.h>
#include <conio2.h>
main() /* Modificadores 2 */
{
char cad[ ]="El valor de";
int a=25986;
long int b=1976524;
float c=9.57645;
printf("%s a es %9d\n",cad,a);
30 Gustavo A. Yarce
printf("%s b es %ld\n",cad,b);
printf("%s c es %.3f",cad,c);
getch();
}
scanf(control,arg1,arg2...);
Ejemplo 2.10
/* Uso de la sentencia scanf(). */
#include <stdio.h>
#include <conio2.h>
scanf("%d",&edad);
getch();
}
getch - Espera hasta que se pulse una tecla, pero no la muestra en pantalla.
BLACK
BLUE
GREEN
CYAN
RED
MAGENTA
BROWN
LIGHTGRAY
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE
Una última consideración: en MsDos sólo se pueden usar como colores de fondo
los 7 primeros: desde BLACK hasta LIGHTGRAY. Esto se puede evitar con las
pantallas VGA, a cambio de perder la posibilidad de que el texto parpadee, pero
no voy a entrar en esos detalles. El caso es que n̈ormalmentes̈i hacemos algo como
textbackground(LIGHTBLUE);
textbackground(BLUE);
main()
{
textbackground(BLUE); /* Fondo de la pantalla en azul */
clrscr(); /* Borro la pantalla */
for(i=0; i<=1; i++) /* Dos columnas */
for(j=0; j<=15; j++) /* Los 16 colores */
{
gotoxy(10+ 40*i , 3+j); /* Coloco el cursor */
textcolor(j); /* Elijo el color */
if (j == 0) /* Si el color es 0 (negro) */
textbackground(LIGHTGRAY); /* dejo fondo gris */
else /* Si es otro color */
textbackground(BLACK); /* dejo fondo negro */
cprintf(" Este es el color %d ",j); /* Escribo en color */
}
getch(); /* Final: espero a que se pulse una tecla, sin mostrarla */
}
34 Gustavo A. Yarce
Capítulo 3
Este tipo de sentencias permiten variar el flujo del programa en base a unas
determinadas condiciones. Existen varias estructuras diferentes:
>Mayor que
<Menor que
>= Mayor o igual que
<= Menor o igual que
== Igual que
!= Distinto que
35
36 Gustavo A. Yarce
if (condición)
sentencia1;
else
sentencia2;
#include <stdio.h>
if (condición) sentencia1;
else if (condición) sentencia2;
else if (condición) sentencia3;
else sentencia4;
Ejemplo 3.2
/* Uso de la sentencia condicional ELSE...IF. */
#include <stdio.h>
switch (variable){
case contenido_variable1: sentencias;
case contenido_variable1: sentencias;
default:
switch (variable){
case contenido_variable1:
sentencias;
break;
case contenido_variable2:
sentencias;
break;
default:
sentencias;
}
38 Gustavo A. Yarce
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.
Ejemplo 3.3
/* Uso de la sentencia condicional SWITCH. */
#include <stdio.h>
Control de Programas
La mayor parte de los programas incluyen repeticiones o ciclos. Los bucles son
estructuras que permiten ejecutar partes del código de forma repetida mientras se
cumpla una condición.
Esta condición puede ser simple o compuesta de otras condiciones unidas por
operadores lógicos. Según cómo queramos que se controle ese bucle, tenemos tres
for: La orden se repite desde que una variable tiene un valor inicial hasta
que alcanza otro valor final.
while: Repite una sentencia mientras que sea cierta la condición que
indicamos. La condición se comprueba antes de realizar la sentencia.
Las diferencias son: for normalmente se usa para algo que se repite un número
fijo de veces, mientras que "while"se basa en comprobar si una condición es cierta,
se repetirá un número mienstras se cumpla la condición.
for (inicialización;condición;incremento)
{
39
40 Gustavo A. Yarce
sentencia1;
sentencia2;
}
Ejemplo 4.1
/* Uso de la sentencia FOR. */
#include <stdio.h>
#include <conio2.h>
for(Inicialización1,inicialización2;condición1,condición2;incremento1,incremento2)
El programa sigue avanzando,no se sale del bucle for, hasta que se cumplen las
dos condiciones.
Ejemplo 4.2
/* Uso de la sentencia WHILE. */
#include <stdio.h>
#include <conio2.h>
do{
sentencia1;
sentencia2;
}while (condición);
Ejemplo 4.3
/* Uso de la sentencia DO...WHILE. */
42 Gustavo A. Yarce
#include <stdio.h>
#include <conio2.h>
}while(seleccion!=’4’);
}