INTRODUCCIÓN AL LENGUAJE C
EL lenguaje C es el resultado de un proceso de desarrollo que
inició con un lenguaje denominado BCPL. Este influenció a otro llamado B (inventado
por Ken Thompson). En los años 70; éste lenguaje llevó a la aparición del C.
Con la popularidad de las
microcomputadoras muchas compañías comenzaron a implementar su propio C por lo
cual surgieron discrepancias entre sí.
Por esta razón ANSI (American
National Standars Institute, por sus siglas en inglés), estableció un comité en
1983 para crear una definición no ambigua del lenguaje C e independiente de la
máquina que pudiera utilizarse en todos los tipos de C.
Algunos de las C existentes
son:
-Quick C
-C++
-Turbo C
-Turbo C ++
-Borland C
-Borland C++
-Microsoft C
-etc.
Este manual se basa en el C
estándar el cual puede utilizarse en todos los tipos de C.
C es un lenguaje de
programación de nivel medio ya que combina los elementos del lenguaje de alto
nivel con la funcionalidad del ensamblador.
Su característica principal
es ser pórtale, es decir, es posible adaptar los programas escritos para un
tipo de computadora en otra.
Otra de sus características
principales es el ser estructurado, es decir, el programa se divide en módulos
(funciones) independientes entre sí.
El lenguaje C inicialmente
fue creado para la programación de
-Sistemas operativos
-Intérpretes
-Editores
-Ensambladores
-Compiladores
-Administradores de bases de
datos.
Actualmente, debido a sus
características, puede ser utilizado para todo tipo de programas.
Aunque cada uno de los
programas son distintos, todos tienen características comunes. Los elementos de
un programa en C son los siguientes:
Comentarios
Inclusión de archivos
main()
{
variables locales
flujo de sentencias
}
Definición de funciones creadas por el programador utilizadas en main()
Veamos en que consiste cada
uno:
Comentarios: se identifican porque van entre diagonales y
asterisco. Nos sirve para escribir información que nos referencia al programa
pero que no forme parte de él. Por ejemplo especificar que hace el programa,
quien lo elaboró, en que fecha, que versión es, etc.
Inclusión de archivos: Consiste en mandar llamar a la o las
bibliotecas donde se encuentran definidas las funciones de C (instrucciones)
que estamos utilizando en el programa.
En realidad, la inclusión de
archivos no forma parte de la estructura propia de un programa sino que
pertenece al desarrollo integrado de C. Se incluye aquí para que el alumno no
olvide que debe mandar llamar a los archivos donde se encuentran definidas las
funciones estandar que va a utilizar.
main(): En C, todo está constituido a base de
funciones. El programa principal no es la excepción. main() indica el comienzo
de la función principal del programa la cual se delimita con llaves.
Variables locales: Antes de
realizar alguna operación en el programa, se deben declarar la(s) variable(s)
que se utilizarán en el programa.
Flujo de sentencias: Es la declaración de todas las instrucciones
que conforman el programa.
Definición de funciones
creadas por el programador utilizadas enmain(): Finalmente,se procede a definir
el contenido de las funciones utilizadas dentro de main(). Estas contienen los
mismos elementos que la función principal.
Para ejecutarlo, realice los
siguientes pasos:
* Oprima la tecla F10 y
seleccione la opción File.Posicionese en Open y pulse enter.
* Escriba el nombre del archivo
donde va a guardar su programa,que no exceda de ocho letras. Automáticamente se
le agregará la terminación .c .Digite<ENTER>.
*Transcriba el programa.
Importante:
Después de cada asignación o
función es imprescindible colocar un punto y coma (;) ya que éste es un
terminador de proposiciones. En caso de que no se escriba, se marcará un error
a la hora de compilar el programa.
En C, los comandos deben ser
escritos con letras minúsculas, tal como se ha hecho en este programa ejemplo.
En el caso de las variables o la funciones definidas por el usuario la
situación es similar:
no es lo mismo
Apellido que
apellido que
APELLIDO
Aunque para nosotros es lo
mismo, el compilador de C, los toma como tres nombres distintos. Por tanto,
asegúrese de mandar llamar las variables o funciones exactamente de la misma
forma en que las declaró.
Después de que el programa
se encuentra en la ventana activa de edición, procedamos a compilarlo:
*Presione la tecla F10,
escoja el submenú Compile. Escoja la opción Compile.
Si su programa presenta
errores, puede presionar la tecla F1
para saber las posibles
causas del error. Corríjalos y vuélvalo a compilar hasta que hasta que la
compilación sea exitosa.
Los warnings (advertencias) indican posibles errores en la estructura
del programa. Si usted está seguro de que su programa está correcto, ignórelos.
No le causarán problemas a la hora de correrlo aunque lo ideal sería que no las
hubiera.
Si no se encontraron
errores, proceda a ejecutarlo:
- Escoja el submenú Run.
-Presione <ENTER> en
la opción RUN
a)
/*Programa que despliega un
mensaje de bienvenida en la pantalla*/
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
gotoxy(20,10);
printf("BIENVENIDO AL
CURSO DE C ESTANDAR");
delay(2500);
}
b)
/*Programa que calcula el número de dias vividos*/
#include<stdio.h>
#include<conio.h>
void main()
{
char nombre[50];
int edad;
clrscr();
printf("¿Cómo te
llamas?\n ");
scanf("%s",nombre);
printf("¿Cuántos años
tienes?\n");
scanf("%i",&edad);
edad=edad*365;
gotoxy(5,10);
printf("%s, has vivido
%i dias",nombre,edad);
gotoxy(40,22);
printf("Pulsa cualquier
tecla para terminar...");
getch();
}
c)
/*Programa que saca el promedio de 3 números*/
#include<stdio.h>
#include<conio.h>
void main()
{
float numero;
float promedio=0;
clrscr();
printf("Dame el primer
número: ");
scanf("%f",&numero);
promedio+=numero;
printf("Dame el segundo
número: ");
scanf("%f",&numero);
promedio+=numero;
printf("Dame el tercer
número: ");
scanf("%f",&numero);
promedio+=numero;
promedio=promedio/3;
printf("El promedio es
%f",promedio);
gotoxy(40,22);
printf("Presione
cualquier tecla para terminar...");
getch();
}
d)
/*Programa que convierte un
número decimal entero a octal*/
#include<stdio.h>
#include<conio.h>
void main()
{
int numero;
clrscr();
printf("Numero entero
en decimal: ");
scanf("%i",
&numero);
printf("\n\nSu
representacion en octal es %o");
gotoxy(40,22);
printf("Presione
cualquier tecla para terminar...");
getch();
}
e)
/*Programa que manda un
mensaje de advertencia*/
#include <dos.h>
#include<conio.h>
int main(void)
{
clrscr();
gotoxy(28,11);
printf("¡ P E L I G R O
! ");
sound(250);
delay(600);
sound(80);
delay(600);
delay(600);
nosound();
return 0;
}
Los tipos de datos son identificadores que usa cada lenguaje para saber
la clase de información que va a tomar una variable. Por ejemplo: si quiero
utilizar la variable "cantidad" para almacenar un número entero,
declararé "cantidad" como una variable de tipo int lo que significa
sólo aceptará valores de tipo entero.
Los tipos de datos básicos
que maneja C son:
char identifica el contenido de la variable que se declare
como caracter. Su longitud es de 1 byte.
int se refiere a valores de tipo entero. Ocupa 2 bytes.
float indica que la variable recibe datos de tipo
real con aproximadamente 6 digitos de precisión. Su longitud en bytes es de 4.
double define variables que aceptan datos de tipo
real con 12dígitos de precisión. Cada variable ocupa 8 bytes de memoria.
void Este tipo de dato sirve para declarar funciones que no
devuelven valores. Su cantidad de bytes es cero.
Además de los anteriores,
podemos crear otros tipos de datos alcombinarlos con modificadores de tipo como
signed, unsigned,long y short.
También existen los
modificadores de acceso que sirven para controlar las formas en que se acceden
o se modifican las variables. Estos modificadores son const y volatile
Una variable de tipo const
trabaja como una constante ya que recibe sus valores por una inicialización
explícita o bien por algún medio dependiente del hardware. Por ejemplo:
const int x;
crea la variable entera x
que no puede ser modificada por el programa pero si inicializada.
El modificador volatile se
usa para indicar al compilador que el valor de una variable se puede cambiar
por medios externos (no especificados) al programa. Por ejemplo la dirección de
una variable global puede ser pasada a la rutina del reloj del sistema operativo
y usada para mantener el tiempo real del sistema. En este caso, el contenido de
la variable es cambiado sin que haya una sentencia que así lo indique.
Es importante que respetemos
estos tipos de modificadores ya que ayudan a la optimización de las funciones
del compilador.
Se pueden usar ambos
modificadores juntos.
Después de conocer los tipos de datos existentes en C, veamos como se
declaran las variables:
Forma general:
Tipo_de_dato Variable:
Donde tipo_de_dato puede ser
cualquiera que esté permitido en C y Variable una palabra que designemos para
recibir datos.
No hay cantidad máxima de
caracteres (letras o palabras) que podamos utilizar para crear variables pero
si hay dos que tengan los primeros 6 caracteres significativos iguales, C las
tomará como si fuesen la misma.
Tampoco podemos utilizar
como variables aquellos términos que ya han sido definidos previamente por el
propio C o por el usuario como variables de otro tipo.
Las variables de tipo cadena
se declaran como un conjunto de caracteres. Por ejemplo:
char nombre[30];
Donde 30 es el número de
caracteres máximo que puede tener la cadena.
De acuerdo al lugar donde se
declaran, las variables pueden ser globales, formales o locales.
Variables locales:
Son aquellas que se declaran
dentro de un conjunto de código relacionado lógicamente entre si (sentencias de
control o funciones) Por ejemplo:
funcion_A()
{
int x;
.
.
.
}
funcion_b()
{
int x;
.
.
.
}
En las funciones anteriores, declaramos dos variables llamadas
"x" con el mismo tipo. Si tratas de utilizar alguna de las variables
fuera de las funciones a las que pertenecen, se marcará un error porque el tipo
sólo ha sido definido para utilizarse dentro de las llaves donde fue declarada.
El que ambas variables se
llamen "x" no quiere decir que sean la misma o que ocupen el mismo
lugar en la memoria dado que las variables locales se crean y se destruyen cada
vez que se sale del bloque en el que son declaradas por tanto, también su
contenido se pierde al salir del él.
Parámetros formales:
Muchas de las funciones
necesitan argumentos. Los argumentos son datos que recibe la función desde el
exterior. A las variables en que sirven para transmitir estos datos se les
llama parámetros formales dela función. Su comportamiento es el mismo al de
cualquier otra variable local.
Veamos el siguiente ejemplo:
/*Devuelve la suma de dos números dados */
suma(int a,int b)
{
a+=b; /*A a toma el valor de a+b*/
return(a);
}
Esta función realiza la suma de dos números. Utiliza dos parámetros
formales: a y b los cuales deben ser declarados en la llamada a suma() para
luego poder utilizarlas dentro de la función como variables locales. También se
destruyen al salir de la función.
Se debe tener mucho cuidado
de que los parámetros formales que se declaran sean del mismo tipo que los
valores que se introducen cuando se manda llamar la función porque podría
obtener resultados inesperados.
Variables globales:
Este tipo de variables se conocen a través de todo el programa por lo
cual se pueden usar en cualquier parte de la ejecución de éste. Se declararan
antes de utilizar la variable por primera vez. Se recomienda que sea al
principio del programa para mantener un orden.
Consideremos el ejemplo que
se presenta a continuación, donde utilizamos los diferentes tipos de variables:
/* Programa que eleva al cuadrado un número real */
#include<math.h>
main()
{
float x;
printf("Dame el número que quieres elevar al cuadrado: ");
scanf("%f",&x);
x=cuadrado(x);
printf("El cuadrado es%f",x);
}
cuadrado(float n)
{
n=n*n;
return(n);
}
Si analizamos las
sentencias, vemos que x es una variable global mientras que n es un parámetro
formal que nos sirve como variable local para efectuar la función.
Las estructura es un tipo de
datos compuesto que permite el C. Se define como un conjunto de variables
relacionadas lógicamente entre sí que se referencia bajo un mismo nombre.
Su forma general de
definición es
struct
nombre_de_la_estructura{
tipo nombre_variable;
tipo nombre_variable;
tipo nombre_variable;
.
.
.
}variables_tipo_nombre_de_la_estructura;
donde
nombre_de_la_estructura o bien variables_tipo_nombre_de_la_variables_estructura
pueden omitirse pero no ambos.
Veamos un ejemplo:
struct agenda{
char nombre[30];
char direccion[20];
char ciudad[15];
int edad;
} actor;
agenda es el nombre de la
estructura; nombre, dirección, ciudad y edad son los campos o elementos de la
estructura y actor es la variable declarada de ese tipo.
Los elementos individuales
de la estructura se referencia utilizando el operador punto. Por ejemplo:
actor.nombre="Harrison
Ford";
Aquí se está asignando la
cadena "Harrison Ford" al campo nombre de la variable actor.
El nombre de la variable
tipo estructura seguido del punto y del nombre del campo, referencia ese campo
individual de la estructura. a todos los elementos de la estructura se accede
del mismo modo. La forma general es:
variable_estructura.nombre_elemento
Así, para imprimir en
pantalla el campo edad de la variable actor, escribimos:
printf("%d",actor.edad);
De la misma forma podemos
utilizar gets (función que lee una cadena desde el teclado) para obtener un
valor para actor, domicilio como se muestra aquí.
gets(actor.domicilio);
Las variables tipo
estructura son útiles para crear unidades de información de diferentes tipos
lógicamente relacionada entre sí. Tal es el ejemplo de los datos de una agenda(
en una variable guardas su nombre, dirección, número telefónico, etc) o de los
datos de un elemento de la tabla periódica (en cada variable guardas su nombre,
símbolo, número atómico, etc).
La forma general de asignar
valores a una variable es:
nombre_variable=expresión
Expresión puede ser desde una
constante hasta una combinación de variables, operadores y constantes.
Si se mezclaran variables de
un tipo con las de otro, se aplica la regla de conversión de tipos que consiste
en que el valor del lado derecho de la asignación se convierte al tipo de dato
de la variable del lado izquierdo (que es la que recibirá el dato) siempre y
cuando ésta última tenga mayor longitud en bytes. Por ejemplo, una variable int
podemos asignarla a otra variable de tipo float pero no viceversa.
Inicializar una variable es
el darle un valor después que se ha declarado pero antes de que se ejecuten las
sentencias en las que se emplea.
En C, se les puede dar un
valor a la vez que se declaran. Únicamente se coloca el signo igual y una constante
después del nombre de la variable. La forma general de inicialización es:
tipo nombre_variable =
constante;
int uno=1;
float pi=3.1416;
char respuesta='s';
Regularmente, las variables
locales se inicializan cada vez que se entra en el bloque en el que están
definidas mientras que las globales son inicializadas al principio del
programa.
Constantes son los valores que no pueden ser modificados. En C, pueden
ser de cualquier tipo de datos.
Además de los ejemplificados
anteriormente, Podemos crear constantes de caracteres con barra invertida.
Estos corresponden a los caracteres que son imposibles introducir desde el
teclado.
Se usan de la misma forma
que los caracteres normales
por ejemplo:
printf('Esta es una prueba\n");
ch='\0';
Un operador es un símbolo que indica al compilador que realice
manipulaciones lógicas o matemáticas específicas.
Operadores Aritméticos
Cuando se aplica el símbolo
/ a un entero o a un carácter, cualquier residuo se trunca. Por ejemplo 5/3
será 1 en división entera.
El menos monario hace el
efecto de multiplicar su único operando por-1 es decir, cualquier número
precedido por un signo menos cambia de signo.
Incremento y decremento
Dos operadores
característicos de C son el incremento y el decremento.++ aumenta en uno a su
operando y -- le resta 1. Es decir,
x=x+1 es equivalente a ++x;
x=x-1 equivale a --x
Los operandos de incremento
y decremento pueden ir antes o después del operador sin embargo existe una
diferencia. Veamos el siguiente ejemplo:
x=10;
y=x++; Aquí y tomará el valor de 10.
y=++x; En este caso, y tomará el valor de 11.
Los operadores del mismo
nivel de precedencia son evaluados por el compilador de izquierda a derecha.
Por supuesto, se puede utilizar paréntesis para ordenar la evaluación.
Los paréntesis en C son
tratados igualmente que en otro tipo de lenguajes de computadora; se forza a
que una operación o un conjunto de operaciones tengan un nivel de precedencia
mayor.
El lenguaje C admite
abreviaturas que simplifican la escritura de ciertos tipos de sentencias de
asignación. Por ejemplo:
x=x+10; es igual a x+=10;
También, conviene utilizar
paréntesis para hacer más claro el orden en que se producen las evaluaciones,
tanto para la persona que lo elabora o para los que después tengan que seguir
el programa.
Operadores relacionales y
lógicos
Los operadores relacionales
son los que determinan la forma de vinculación entre dos valores. A su vez, los
lógicos evalúan la forma de relacionarse dos valores.
Ciclo de vida de un programa
Al igual que en la resolución de problemas, existen ciertos pasos que debemos seguir para la creación de programas. Estos son:
1. Análisis del programa:
Consiste en estudiar minuciosamente el programa que
queremos elaborar, que características debe de tener, con que elementos
contamos para realizarlo, etc.
2. Elaborar el pseudo
código:
El pseudo código es cualquier lenguaje que nosotros
entendamos y que nos sirva para elaborar algoritmos.
Un algoritmo es el conjunto
de manipulaciones matemáticas y de estructuras funcionales que nos permitan
realizar un programa que ejecute una o varias actividades específicas. Para
elaborarlo, debe pensarse detallada y ordenadamente todos los pasos que
realizará el programa.
En caso de que el programa
sea muy extenso, podemos determinar un pseudocódigo donde se determinen las
funciones principales del programa y acto seguido elaborar el pseudocódigo de
esas funciones.
3.Codificar el pseudocódigo:
Después de tener el pseudocódigo del programa, el
siguiente paso es codificarlo en el lenguaje que escojamos.En este caso, C.
La ventaja de tener el
pseudocódigo del programa es que podemos codificarlo en él o los lenguajes que
deseemos.
4.Depuración:
Después de codificar el programa, generalmente
quedan pequeños detalles a corregir por tanto, el siguiente paso es la
depuración del programa.
Depurar es pulir el programa
para que todo funcione como nosotros deseamos. Para esto, es necesario probar
el programa cuantas veces sea necesario para asegurarnos de que funcione
correctamente.
5.Mantenimiento del
programa:
Este es el último paso del ciclo de vida de un
programa. Se realiza después de que el programa ya ha tenido vida útil y,
debido a las nuevas necesidades de los usuarios, es necesario hacer
modificaciones al programa.
Cuando estos cambios se
hacen muy grandes, se debe elaborar un nuevo programa.
A partir de estos pasos,
elaboremos un programa que encuentre las raíces de un polinomio de segundo
grado.
1. Este programa encontrará
las raíces de un polinomio de segundo grado. Necesitamos:
-El polinomio al cual se le
va a encontrar la raíz. Como todos los polinomios tendrán la misma forma, sólo
se pedirán los coeficientes los cuales serán de tipo real. Por lo cual,
necesitaremos dos variables de este tipo.
-El resultado se almacenará
en dos variables de tipo real y se desplegará en pantalla.
-Especificar en pantalla lo
que hace el programa.
2.
comienza
variables: a,b,c:real;
escribe('Este programa encuentra las raíces reales de un polinomio de
segundo grado de la forma
axÆ+bx+c
donde a,by c pueden ser cualquier valor real.
Acontinuación, escribe los coeficientes de la ecuación: ');
escribe('a= ');
lee(a);
escribe('b= ');
lee(b);
escribe('c= ');
lee(c);
x1=(-b-Ö(bÆ-4ac))/2a;
x2=(-b+Ö(bÆ-4ac))/2a;
escribe(' Las raíces de la ecuacion : ');
primera=x1
segunda=x2 ');
3.Ahora veamos como se
codifica en C:
/*Programa que encuentra las raíces de una ecuación cuadrada, de acuerdo
a las fórmulas: (-b±Ö(bÆ-4ac))/2a */
#include<math.h>
main()
{
float a,b,c,x1,x2;
printf("Este programa encuentra las raíces reales\n");
printf("de la ecuación de la forma\n");
printf(" axÆ+bx+c=0 \n");
printf("A continuación, escriba los coeficientes\n");
printf("de la ecuación:\n");
printf("a= ");
scanf("%f",&a);
printf("b= ");
scanf("%f",&b);
printf("c= ");
scanf("%f",&c);
x1=pow(b,2);
x1=x1-(4*a*c);
x1=-b+sqrt(fabs(x1));
x1=x1/(2*a);
x2=pow(b,2);
x2=x2-(4*a*c);
x2=-b-sqrt(fabs(x2));
x2=x2/(2*a);
printf("x1= %f\n");
printf("x2= %f\n);
getch();
}
En el programa anterior,
utilizamos \n para indicar que el cursor se posicione en el siguiente renglón
de la pantalla.
scanf() nos permite leer
información desde el teclado.
La fórmula la ejecutamos por
pasos, para que pueda ser más legible.
Si observas, aunque la fórmula es la misma, alteramos su orden.¿Qué pasaría si lo hubiéramos seguido?
Continuación de Programación en C
Regresar a la Pagina Principal