Programacion C - Primeros Pasos
Programacion C - Primeros Pasos
Programacion C - Primeros Pasos
Mirábile Marcelo
Asignatura: Módulo Introductorio
Introducción General
Se pueden usar muchos lenguajes de programación para poder programar una
computadora, el mas básico es el lenguaje de maquina (una combinación de 0 y 1 que
conforman el dialecto que entiende la maquina). Pero lo cierto es que muy pocas veces
se escriben programas en este lenguaje, básicamente por 2 razones: primero porque es
muy incomodo para trabajar y segundo porque cada maquina tiene su propio repertorio
de instrucciones, con lo cual un programa para una maquina debería ser reformado en
gran parte para ser usado en otra maquina.
Lo mas frecuente es utilizar lenguajes de alto nivel donde las instrucciones son
compatibles con el lenguaje humano. La mayoría de este tipo de lenguajes son de
propósito general como C, PHP, ASP, .NET, JAVA, PASCAL, COBOL, VISUAL
BASIC, etc., es decir, que este tipo de lenguajes se utilizan para desarrollar aplicaciones
de diversos tipos que van desde un juego para PC hasta un controlador de vuelo espacial
pasando por un sistema de facturación. Existen también lenguajes de propósito especial
como LISP, un lenguaje orientado al tratamiento de listas, el cual es usado en
aplicaciones de inteligencia artificial, por ejemplo.
Por norma general cada instrucción de un lenguaje de alto nivel será equivalente a
varias en lenguaje maquina, con lo cual una aplicación que se desarrolla en un lenguaje
de alto nivel puede ser ejecutado en varias maquinas sin mayores problemas ni
modificaciones. Llegando a la conclusión de que el uso de lenguajes de alto nivel tiene
3 ventajas “sumamente” importantes respecto al de maquina: sencillez, uniformidad y
portabilidad (independencia de la maquina).
Sin embargo no todo termina aquí, para que un programa escrito en algún lenguaje de
alto nivel pueda ser “reconocido” (ejecutado) por una maquina debe traducirlo al
lenguaje que ella conoce: lenguaje de maquina. He aquí donde se introduce un nuevo
concepto y proceso: compilación o interpretación. Los compiladores traducen el
programa completo a lenguaje maquina antes de ejecutar cualquiera de las
instrucciones, mientras que los interpretes recorren el programa tomando cada
instrucción (o bloques de ellas) la traducen y la ejecutan. Este proceso se realiza
automáticamente y generalmente pasa desapercibido ante los ojos del programador.
El programa original escrito en el lenguaje de alto nivel se denomina fuente mientras
que el compilado (o interpretado) se denomina objeto (en lenguaje maquina).
La mayoría de las implementaciones de C operan como compiladores aunque también
existen intérpretes.
Desde mi punto de vista el programador no debería preocuparse demasiado si un
lenguaje es compilado o interpretado, solo debe concentrarse en solucionar el problema
que tanto lo aqueja; pero sí debe saber que para que la maquina “entienda” lo que él
quiere hacer y/o decir, existe un proceso que traduce a un lenguaje que la maquina
entiende.
1
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Introducción al Lenguaje C
C es un lenguaje de programación estructurada de propósito general, cuando se dice
“estructurado” se quiere decir que el código esta ordenado (estructurado) y sigue una
secuencia lógica. C tiene economía sintáctica, control de flujo, estructuras sencillas y un
buen conjunto de operadores. No es un lenguaje de muy alto nivel, es más bien un
lenguaje de “medio nivel” pero como su potencia es extrema se lo asocia a un nivel alto.
Es sencillo y no está especializado en ningún tipo de aplicación. Esto lo hace un
lenguaje potente, con un campo de aplicación sumamente amplio y sobre todo, se
aprende rápidamente. Una particularidad mas de este lenguaje es que es sensible al tipo
de escritura, es decir, que no es lo mismo escribir en mayúscula que en minúscula con
lo cual no es lo mismo “valor” que “Valor”. Preferentemente y como norma general
todo el programa se debe escribir en minúscula.
Este lenguaje fue desarrollado originalmente en los Laboratorios BELL en los años
setenta por Dennis Ritchie y Brian Kernighan.
Características particulares de C
2
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Los siguientes son algunos de los sistemas que son utilizados por millones de personas
y están programados en el lenguaje C.
3
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Estructura de un programa en C
#include <stdio.h>
int main()
{
/* Aquí va el cuerpo del programa */
printf( "Hola mundo\n" ); /* Esto imprime hola mundo en pantalla */
return 0;
}
Este programa lo único que hace es sacar por pantalla el mensaje:
Hola mundo
Vamos ahora a comentar el programa línea por línea (Esto no va a ser más que una
primera aproximación).
#include <stdio.h>
#include es lo que se llama una directiva. Sirve para indicar al compilador que incluya
otro archivo. Cuando el compilador se encuentra con esta directiva la sustituye por el
archivo indicado. En este caso es el archivo stdio.h que es donde está definida la
función printf, que veremos luego.
int main()
4
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
return 0;
Como he indicado antes el programa al finalizar devuelve un valor entero. Como en este
programa no se pueden producir errores (nunca digas nunca jamás) la salida siempre
será 0. La forma de hacer que el programa devuelva un 0 es usando return. Esta línea
significa 'finaliza la función main haz que devuelva un 0.
}
...y cerramos llaves, con lo que termina el programa. Todos los programas finalizan
cuando se llega al final de la función main.
Librerias en C
Una librería (también conocida como biblioteca) es un conjunto de funciones donde
cada una de ellas tiene un objetivo en particular, como consecuencia de una necesidad
que desde hace un tiempo seguramente un grupo de desarrolladores tenia. Es decir que
para cubrir esa necesidad alguien desarrollo una función para agilizar el desarrollo. Por
ejemplo, en algún momento se tuvo la necesidad de capturar datos por teclado y un
alguien desarrollo esa función y la puso a disposición del resto de los desarrolladores.
Cuando la cantidad de esas funciones es numerosa se las agrupa en un archivo y a ese se
lo llama “librería”, por ejemplo C tiene una librería que se llama “stdio” la cual contiene
funciones básicas de ingreso y salida de datos.
En C, es necesario que el programador invoque todos aquellos archivos de librerías o
bibliotecas, que necesite, al comienzo del programa. La extensión de un archivo de
librería es .h (en algunas distribuciones de C puede que sean .cpp), es decir
nombre_librería.h El modo de incluir una librería es de la siguiente forma:
5
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
math.h: Contiene los prototipos de las funciones y otras definiciones para el uso
y manipulación de funciones matemáticas.
time.h: Contiene los prototipos de las funciones, macros, y tipos para manipular
la hora y la fecha del sistema.
iostream.h: Está especializada en la lectura y escritura de archivos. Es exclusiva
de C++.Algunas funciones que contiene son cout(), cin(), min(), max().
cstring.h: Declara un conjunto de funciones principalmente para manipulación
de elementos tipo string. Algunas funciones que incluye son strcat() memcmp()
strpbrk() strlen() memset(). Se puede usar en C/C++.
Variables
Una variable es un identificador que se utiliza para representar cierto tipo de
información. Una variable contendrá un dato simple (una cantidad numérica o un
carácter), en algún lugar del programa se le asignara ese valor (ya sea por teclado o
predefinido) y en otra parte se deseara usar ese valor para realizar algún trabajo
necesario. Se aclara también que durante el desarrollo del programa se le puede ir
asignando distintos valores a una misma variable, sin embargo el tipo de dato de esa
variable no puede cambiar.
A continuación se presenta la forma de declarar una variable y la forma de usarla:
int a, b, c;
char d;
..
a=2;
b=3;
c=a+b;
d=’f’;
..
a=5;
b=9;
c=a-b;
d=’W’;
Las 2 primeras líneas son declaraciones de tipo. El resto es una forma ejemplificada de
cómo se pueden usar esas variables.
Declaración de una variable
6
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Una declaración asocia un tipo de datos determinado a una variable o grupo de ellas. Se
deben declarar todas las variables antes de que aparezcan sentencias ejecutables. Una
declaración consiste en un tipo de datos, seguido de una o mas variables, finalizando
con un punto y coma.
int x,y;
int main()
{
float x,z;
/* Aquí x y z son reales*/
}
/* Aquí x e y son variables enteras */
/* La variable z no existe fuera de la función */
Tipos de Datos
VARIABLES DEL TIPO ENTERO
7
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Las variables de punto flotante son SIEMPRE con signo, y en el caso que el exponente
sea positivo puede obviarse el signo del mismo.
char c ;
int c ;
Esta última opción desperdicia un poco más de memoria que la anterior, pero en
algunos casos particulares presenta ciertas ventajas.
Las variables del tipo carácter también pueden ser inicializadas en su definición, por
ejemplo es válido escribir:
char c = 97 ;
para que c contenga el valor ASCII de la letra "a", sin embargo esto resulta algo
engorroso , ya que obliga a recordar dichos códigos . Existe una manera más directa de
asignar un carácter a una variable; la siguiente inicialización es idéntica a la anterior:
char c = 'a' ;
CONSTANTES
Aquellos valores que, una vez compilado el programa no pueden ser cambiados suelen
denominarse CONSTANTES. Un ejemplo de declaración.
#define PI 3.1416;
Aquí lo que se hace es definir la variable PI con el valor 3.1416.
OPERADORES
8
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
OPERADORES ARITMETICOS
Comprenden las cuatro operaciones básicas, suma, resta, multiplicación y división, con
un agregado, el operador módulo.
El operador módulo ( % ) se utiliza para calcular el resto del cociente entre dos
ENTEROS , y NO puede ser aplicado a variables del tipo float ó double.
Si bien la precedencia (orden en el que son ejecutados los operadores) se analizará más
adelante, en este capítulo, podemos adelantar algo sobre el orden que se realizan las
operaciones aritméticas.
En la anterior, la última columna, da el orden de evaluación de un operador dado.
Cuanto más bajo sea dicho número mayor será su prioridad de ejecución. Si en una
operación existen varios operadores, primero se evaluarán los de multiplicación,
división y módulo y luego los de suma y resta.
Se puede observar que no existen operadores de potenciación, radicación,
logaritmación, etc, ya que en el lenguaje C todas estas operaciones ( y muchas otras ) se
realizan por medio de llamadas a Funciones.
El último de los operadores aritméticos es el de SIGNO. No debe confundírselo con el
de resta, ya que este es un operador unitario que opera sobre una única variable
cambiando el signo de su contenido numérico. Obviamente no existe el operador +
unitario, ya que su operación sería DEJAR el signo de la variable, lo que se consigue
simplemente por omisión del signo.
OPERADORES RELACIONALES
Todas las operaciones relacionales dan sólo dos posibles resultados: VERDADERO ó
FALSO. En el lenguaje C, Falso queda representado por un valor entero nulo (cero) y
Verdadero por cualquier número distinto de cero En la siguiente tabla se encuentra la
descripción de los mismos.
9
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Uno de los errores más comunes es confundir el operador relacional IGUAL QUE (= =)
con el de asignación IGUAL A (=). La expresión a=b copia el valor de b en a, mientras
que a = = b retorna un cero, si a es distinto de b ó un número distinto de cero si son
iguales.
OPERADORES LOGICOS
Hay tres operadores que realizan las conectividades lógicas Y (AND), O (OR) y
NEGACION (NOT) y están descriptos en la siguiente tabla.
En algunas operaciones suele usárselo de una manera que se presta a confusión, por
ejemplo: ( !i ) donde i es un entero. Esto dará un resultado CIERTO si i tiene un valor 0
y un resultado FALSO si i es distinto de cero.
Los operadores de incremento y decremento son sólo dos y están descriptos en la tabla
siguiente.
Para visualizar rapidamente la función de los operadores antedichos, digamos que las
sentencias:
10
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
a = a + 1;
a++ ;
OPERADORES DE ASIGNACIÓN
En principio puede resultar algo inútil gastar papel en describir al operador IGUAL A (
= ), sin embargo es necesario remarcar ciertas características del mismo.
Por ejemplo:
a = 17 ;
pero no es aceptado , en cambio
17 = a ; /* incorrecto */
ya que la constante numérica 17 no posee una ubicación de memoria donde alojar al
valor de a.
Aunque parezca un poco extraño al principio las asignaciones, al igual que las otras
operaciones, dan un resultado que puede asignarse a su vez a otra expresión.
De la misma forma que (a + b) es evaluada y su resultado puedo copiarlo en otra
variable : c = (a + b) ; una asignación (a = b) da como resultado el valor de b , por lo
que es lícito escribir
c = ( a = b );
Debido a que las asignaciones se evalúan de derecha a izquierda, los paréntesis son
superfluos , y podrá escribirse entonces :
c = a = b = 17;
11
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Por ejemplo
a += b ; /* equivale : a = a + b */
a -= b ; /* equivale : a = a - b */
a *= b ; /* equivale : a = a * b */
a /= b ; /* equivale : a = a / b */
a %= b ; /* equivale : a = a % b */
Nótese que el pseudooperador debe escribirse con los dos símbolos seguidos, por
ejemplo += , y no será aceptado +(espacio) =.
Los operadores de asignación están resumidos en la tabla siguiente.
Como habrán notado a esta altura de la materia hemos hablado de 2 funciones muy
importantes para nuestra programación en C, scanf y printf. A continuación se trata de
explicar la funcionalidad de cada una de ellas.
Imprimir en pantalla
Printf:
Siempre he creído que cuando empiezas con un nuevo lenguaje suele gustar el ver los
resultados, ver que nuestro programa hace 'algo'. Por eso creo que el curso debe
comenzar con la función printf, que sirve para sacar información por pantalla. Para
utilizar la función printf en nuestros programas debemos incluir la directiva:
#include <stdio.h>
al principio de programa.
Si sólo queremos imprimir una cadena basta con hacer (no olvides el ";" al final):
printf( "Cadena" );
12
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Cadena
Lo que pongamos entre las comillas es lo que vamos a sacar por pantalla.
Si volvemos a usar otro printf, por ejemplo:
#include <stdio.h>
int main()
{
printf( "Cadena" );
printf( "Segunda" );
}
Obtendremos:
CadenaSegunda
Este ejemplo nos muestra cómo funciona printf. Para escribir en la pantalla se usa un
cursor que no vemos. Cuando escribimos algo el cursor va al final del texto. Cuando el
texto llega al final de la fila, lo siguiente que pongamos irá a la fila siguiente. Si lo que
queremos es sacar cada una en una línea deberemos usar "\n". Es el indicador de retorno
de carro. Lo que hace es saltar el cursor de escritura a la línea siguiente:
#include <stdio.h>
int main()
{
printf( "Cadena\n" );
printf( "Segunda" );
}
y tendremos:
Cadena
Segunda
Algo muy usual en un programa es esperar que el usuario introduzca datos por el
teclado. A continuación veremos algunas que usaremos a lo largo del curso.
Cout:
Otra alternativa para poder mostrar información por la salida estándar de una PC es usar
la instrucción “cout”. Esta es una instrucción que viene incorporada en la librería
“iostream” de C++ (note que se puede utilizar libremente aun cuando estamos
programando en C), es por ello que para poder hacer uso de dicha instrucción debemos
incorporar dicha librería.
Veamos algunos ejemplos de uso:
#include <iostream>
using namespace std;
int main() {
cout << “Hola MUNDO “ << endl;
cout << “Hola C++ “ << endl;
}
Es importante tener en cuenta que la instrucción cout siempre va acompañada
13
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
de << para controlar el flujo de datos que sale. La instrucción << endl hace que luego
de imprimir el texto por pantalla se imprima un salto de línea.
Veamos el mismo ejemplo pero “concatenando” texto dentro de la instrucción:
#include <iostream>
using namespace std;
int main() {
cout << “Hola MUNDO, “ << “ Hola C++ “ << endl;
}
Note como puedo ir concatenando texto (o información alojada en una variable) en una
instrucción cout.
Scanf:
El uso de scanf es muy similar al de printf con una diferencia, nos da la posibilidad de
que el usuario introduzca datos en vez de mostrarlos. No nos permite mostrar texto en la
pantalla, por eso si queremos mostrar un mensaje usamos un printf delante. Un ejemplo:
#include <stdio.h>
int main()
{
int num;
printf( "Introduce un número " );
scanf( "%i", &num );
printf( "Ingresamos el número %i\n", num );
}
Cin
Asi como la instrucción “cout” es una alternativa a la función “printf”, cin lo es para
scanf.
En definitiva, cin es el flujo de entrada estándar que normalmente es el teclado.
14
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
Veamos un ejemplo:
#include <iostream>
using namespace std;
int main()
{
int numero;
cout << "Ingrese el 1er numero entero: ";
cin >> numero;
cout << "El numero ingresado es: " << numero;
return 0;
}
A diferencia de la instrucción cout, la instrucción cin usa los símbolos >> para poder
cumplir con su objetivo. En definitiva, la instrucción cin >> numero lo que permite es
que el dato que se ingrese por teclado se le asignara a la variable numero.
Otro ejemplo mas completo:
#include <iostream>
using namespace std;
int main()
{
cout << "Hola! Aqui podras realizar sumas" << "\n";
return 0;
}
En el ejemplo anterior se están solicitando números y luego realizando operaciones
matemáticas con ellos.
Getch y getche
Si lo que queremos es que el usuario introduzca un caracter por el teclado usamos las
funciones getch y getche. Estas esperan a que el usuario introduzca un carácter por el
teclado. La diferencia entre getche y getch es que la primera saca por pantalla la tecla
que hemos pulsado y la segunda no (la e del final se refiere a echo=eco). Ejemplos:
#include <stdio.h>
int main()
{
char letra;
printf( "Introduce una letra: " );
15
Carrera: Tecnicatura en Desarrollo de Software Profesor: Ing. Mirábile Marcelo
Asignatura: Módulo Introductorio
fflush( stdout );
letra = getche();
printf( "\nHas introducido la letra: %c", letra );
}
Resultado:
Quizás te estés preguntando qué es eso de fflush( stdout ). Pues bien, cuando usamos la
función printf, no escribimos directamente en la pantalla, sino en una memoria
intermedia (lo que llaman un buffer). Cuando este buffer se llena o cuando metemos un
carácter '\n' es cuando se envia el texto a la pantalla. En este ejemplo yo quería que
apareciera el mensaje Introduce una letra: y el cursor se quedara justo después, es decir,
sin usar '\n'. Si se hace esto, en algunos compiladores el mensaje no se muestra en
pantalla hasta que se pulsa una tecla (pruébalo en el tuyo). Y la función fflush( stdout )
lo que hace es enviar a la pantalla lo que hay en ese bufer.
Y ahora un ejemplo con getch:
#include <stdio.h>
int main()
{
char letra;
printf( "Introduce una letra: " );
fflush( stdout );
letra = getch();
printf("\n has introducido la letra :%c", letra );
}
Resultado:
16