Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructurada
Página 1
HISTORIA DEL LENGUAJE
El Lenguaje C nació en los Laboratorios Bell de AT&T y ha sido estrechamente asociado con el
sistema operativo UNIX, ya que su desarrollo se realizó en este sistema operativo y debido a que
tanto UNIX como el propio compilador de C y la casi totalidad de los programas y herramientas de
UNIX, fueron escritos en C. Su eficiencia y claridad han hecho que el lenguaje ensamblador apenas
haya sido utilizado en UNIX.
Este leguaje está inspirado en el lenguaje B escrito por Ken Thompson en 1970 con intención de re‐
codificar el sistema operativo UNIX, que en su inicio estaba escrito en ensamblador, en vista a su
transportabilidad a otras maquinas. B era un lenguaje evolucionado e independiente de la máquina,
inspirado en el lenguaje BCPL concebido por Martín Richard en 1967.
En 1972, Dennis Ritchie, toma y modifica el lenguaje B, creando el lenguaje C y rescribiendo el UNIX
en dicho lenguaje. La novedad que proporciono él lenguaje C sobre el B fue el diseño de tipos y
estructuras de datos.
En 1980 Bjarne Stroustrup de los laboratorios Bell de Murray Hill, New Jersey, inspirado en el
lenguaje Simula67 adicionó las características de la programación orientada a objetos (incluyendo
la ventaja de una biblioteca de funciones orientada a objetos) y lo denomino C con clases. Para 1983
dicha denominación cambio a la de C++. Con este nuevo enfoque surge la nueva metodología que
aumenta las posibilidades de la programación bajo nuevos conceptos.
Actualmente muchas empresas se dedican a vender el compilador del lenguaje C, dos de estos
imperios son:
Página 2
ESTRUCTURA DE UN PROGRAMA
//Est_Prog.cpp
//Definición de Archivos de Cabecera
#include <conio.h>
#include <stdio.h>
//Definición de Constantes y Variables Globales
#define PI 3.1416
float Area;
//Definición de Funciones del Usuario
void Area_Cir(int R);
//Definición e implementación del Programa Principal
int main()
{
int Radio;
void clrscr(void);
printf("INTRODUCCION AL LENGUAJE C");
printf("\n\n CALCULO DEL AREA DE UN CIRCULO");
printf("\n Radio: ");
scanf("%i",&Radio);
Area_Cir(Radio);
printf("\n El Area es: %8.2f",Area);
getch();
return 0;
}
//Implementación de Funciones del Usuario
void Area_Cir(int R)
{
Area= 2*PI*R*R;
}
Página 3
stdio.h, ambos son archivos de cabecera definidos por el lenguaje, existen un gran número de ellos
que acompaña al compilador según la versión y fabricante. Por lo regular se encuentran ubicados
en el directorio \Include.
Los archivos de cabecera definidos en esta sección que pertenecen al compilador deberán estar
entre los signos < > y aquellos que el propio programador cree para sus aplicaciones entre comillas
“ “ lo cual le indicará al compilador que busque el archivo en el directorio de trabajo y no en el
directorio por default de archivos de cabecera (esto es el directorio include).
La siguiente lista muestra algunos de los archivos de cabecera que más se usan, así como una breve
descripción de su contenido:
Archivo Uso
<stdio.h>. Funciones de entrada/salida estándar.
<iostream.h> Funciones de entrada/salida por flujos.
<conio.h> Funciones de entrada/salida por teclado o consola.
<alloc.h> Asignación dinámica de memoria.
<graphics> Funciones relacionadas con gráficos.
<io.h> Funciones de entrada/salida de bajo nivel.
<math.h> Funciones matemáticas.
<mem.h> Funciones de manipulación de memoria.
<string.h> Funciones relacionadas con cadenas.
<time.h> Funciones de hora y fecha.
Para definir un archivo de cabecera se usa una directiva de pre‐procesamiento llamada #include
seguido del archivo de cabecera encerrado entre signos < > ó “ ” según el lugar dónde éste se
encuentre, de esta forma el compilador incluirá durante la compilación las variables, constantes y
funciones que se encuentren en el archivo y que sean usados por el programa en desarrollo.
En la sección “Definición de Funciones del Usuario” se requiere definir todas las funciones que se
implementen por el programador, porque sólo de ésta forma el compilador puede conocer de forma
adelantada la existencia de las mismas, es decir antes de llamar a una función primero el compilador
necesita saber de su existencia en caso contrario no podría resolver esta referencia provocando un
error en tiempo de compilación, el lenguaje C es un lenguaje estructurado lo cual significa que un
programa según su tamaño se dividirá en varios módulos conocidos como funciones, de esta forma
se evita que la función principal este saturada de código. En este ejemplo se define solamente una
Página 4
función, Area_Cir() sin tipo de retorno (void) y recibe como parámetro un entero(El radio del
circulo).
La “Función Principal” main() es lo primero que se ejecuta cuando inicia un programa, por lo que es
indispensable que éste exista, en él se establece la lógica o secuencia que seguirá el programa
durante su ejecución.
Como puede observarse el orden de los comandos es el orden o secuencia en que éstos se ejecutan.
Si una función se define y se llama desde alguna parte del programa y no está implementada, se
detectará un error en tiempo de enlace y no en tiempo de compilación tema que se tratará a
continuación.
COMPILACIÓN Y LIGADO
Para crear un archivo ejecutable (código maquina relocalizable) se realiza mediante dos etapas o
tiempos que son: Compilación y Ligado.
Ligado: Durante este proceso se unen todos los programas objeto del que se conforme la
aplicación, así como los archivos de biblioteca (.LIB) para formar un solo programa
independiente, o programa ejecutable (.EXE).
Página 5
Figura 1. Proceso de Compilación y Ligado de un programa en C.
Es frecuente que se confundan los términos archivo de biblioteca con archivo de cabecera, la tabla
y dibujo anterior precisamente tiene la finalidad de hacer notar que son diferentes. Durante la
escritura de un programa es frecuente probar una y otra vez si se está haciendo lo correcto, para
ello se usa la ejecución paso a paso de un programa (Depuración), en ocasiones algunos archivos de
cabecera se cargan en el ambiente de programación y se debe tener la precaución de no
modificarlos para no producir incongruencias entre el archivo de cabecera y el archivo de biblioteca,
al final ambos archivos están directamente relacionados entre sí.
Página 6
Palabras reservadas
Las palabras reservadas del compilador son todas aquellas palabras que se usan para especificar
tipos de variables, estructuras cíclicas, estructuras de decisión, etc., y que no pueden ser usadas por
el usuario como nombre de variables, de funciones o de nuevos tipos .Estas palabras son las
siguientes:
Tipos de Datos
Antes de empezar a describir los tipos disponibles en el lenguaje se definirá lo que es una variable.
Las variables siempre pertenecen a un tipo de dato, este tipo de dato puede ser alguno de los tipos
predefinidos por el lenguaje o definido por el usuario, algunos tipos predefinidos para un sistema
de 16 bits son:
Página 7
Modificadores
Los modificadores son palabras reservadas que se le adicionan a los tipos para modificar su tamaño
y/o su rango, estos son:
Signed.
Unsigned.
Long.
Short.
Como se puede observar cada tipo tiene un tamaño en bits, este tamaño define un rango de
operación que limita los números que se puede almacenar en una variable. Imagínese que se desea
diseñar un programa de nómina que va a manejar los sueldos de los empleados, piense en el tipo
de dato que usaría para la variable sueldo; seguramente pensará en un tipo unsigned int, sí
se observa la tabla anterior el tipo unsigned int almacena valores entre 0 y 65535, ¿Será el tipo
unsigned int el más apropiado? Bueno tal vez contestará que no, ya que los sueldos pueden ser
superiores a 65535, tal vez el tipo más apropiado será unsigned long que almacena valores entre 0
y 4294967295. Bueno, pero que pasaría si escogiera el tipo unsigned int para la variable sueldo, en
el momento que almacene un valor superior a 65535 el contenido quedará truncado.
Para el caso de un Sistema Operativo de 32 bits, el compilador almacenará los datos con tamaños
diferentes, este sería el caso:
Página 8
double float 64 2.2E‐308 a 1.8E3082
Tabla 5. Tipos de datos con modificadores en un sistema de 32 Bits.
Al examinar la tabla anterior se puede observar que int es lo mismo que long int mientras que para
un sistema de 16 bits éstos tienen diferentes longitudes y por lo tanto diferentes intervalos.
Como se deduce en consecuencia que la longitud en bytes de un tipo dato depende del sistema
operativo y del compilador que se use, para conocer con precisión la longitud en bytes de una
variable de un tipo de dato se puede utilizar el operador sizeof. Por ejemplo:
int x;
x=sizeof(int));
Comentarios
Un comentario es una secuencia de caracteres utilizada para explicar el código fuente y no se toma
en cuenta durante la compilación (No se considera como código). Existen dos formas para definir
un comentario:
Variables
Es una posición de memoria de cierta longitud según el tipo de dato cuyo valor puede ser modificado
a lo largo de la ejecución de un programa.
Sintaxis:
[clase] tipo identificador[,identificador];
Donde:
Una variable que se declara al inicio del programa es considerada como variable global y es accesible
desde cualquier parte del programa. Por lo contrario una variable declarada dentro de una función
se considera como variable local y es accesible solamente dentro de ésta.
Cada variable de un programa, debe declararse antes de ser utilizada. La declaración consiste en
enunciar el nombre de la variable y asociarle un tipo. El tipo determina los valores que puede tomar
así como las operaciones que con ella pueden realizarse.
Página 9
Ejemplos:
int Suma, Promedio;
char Car, Nombre[40];
Cuando se trabaja con datos de diferentes tipos es frecuente mezclarlos durante una expresión o
asignación, a diferencia de otros lenguajes, C realiza la conversión de tipos compatibles de manera
automática.
Por ejemplo:
Cuando se presenten casos de conversión de tipos se debe tener en cuenta que es posible la perdida
de datos. Supóngase que x=256 en lugar de 92, en este caso car tomaría el valor de ‘\0’, es decir el
carácter nulo. Esto se debe a que un entero es de 16 bits (en MS‐DOS) mientras que un char es 8
bits, por lo tanto los 8 bits más significativos del entero se perderán.
No todos los compiladores soportan la conversión de tipos durante las asignaciones, algunos
solamente lo soportan durante una expresión este es el caso del C++ Builder, por ejemplo:
int x;
x= Edit1‐>Text; //Error No se puede convertir una cadena a entero
Como Edit1‐>Text es una propiedad de tipo cadena (arreglo de caracteres) no se puede llevar a cabo
la conversión de manera directa, para solucionar este problema la asignación se debe realizar de
manera indirecta:
Operadores
Los operadores se utilizan para manipular datos: ejecutan cálculos, buscan igualdades, realizan
asignaciones, trabajan con variables y se encargan de muchas otras tareas que los programadores
nunca llevan a cabo. En la siguiente tabla se presentan los de uso más común:
Página 10
Operador Descripción Ejemplo
OPERADORES ARITMÉTICOS
+ Adición x = x+z;
‐ Sustracción x = x‐z;
* Multiplicación x = x*z;
/ División x = x/z;
% Modulo o resto x = x%z;
OPERADORES LÓGICOS
&& AND lógico if(x&&0xFF)
|| OR lógico if(x||0xFF)
! NOT lógico if(!Soltero)
OPERADORES RELACIONALES
== Igual que if(x==y)
!= Diferente que
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
OPERADORES DE CLASE Y ESTRUCTURA
:: Resol. de alcance Punto::Dibujar()
‐> Miembro indirecto P‐>Dibujar();
. Miembro directo P.Borrar();
OPERADORES DE ASIGNACIÓN
= Asignación x=10;
+= Asignar y sumar x+=10;
‐= Asignar y restar x‐=10;
*= Asignar y multiplicar x*=10;
/= Asignar y dividir x/=10;
&= Asignar operador AND x&=0x02;
|= Asignar operador OR x|=0x02;
OPERADORES A NIVEL DE BITS
& AND a nivel de bits C=A&B;
| OR a nivel de bits
^ XOR a nivel de bits C=A^B;
<< Desplazamiento a la izquierda C=A<<3;
>> Desplazamiento a la derecha C=A>>2;
~ NOT a nivel de bits C=~D;
OPERADORES DE APUNTADORES
* Indirección int *Ap;
& Dirección x=&Ap;
OTROS
++ Incremento x++;
‐‐ Decremento x‐‐;
Tabla 6. Operadores de C++ más usados.
Página 11
Prioridad y Orden de Precedencia
La prioridad de los operadores define el orden en que se evalúa una expresión cuando tiene distintos
operadores. C y C++ tienen reglas específicas para determinar el orden de evaluación. Lo más
sencillo de recordar es que la multiplicación y división tienen prioridad sobre la suma y la resta. A
partir de esto, si una expresión no le resulta clara, o tampoco lo será para alguien que lea el código,
por lo que deberá utilizar paréntesis para hacer más explicito el orden de evaluación. Por ejemplo:
A= x + y – 2 / 2 + z;
A= x + (y ‐ 2) / (2 + z);
En la siguiente tabla se listan los operadores de C y C++ de mayor a menor prioridad, y describe
como se asocia cada operador (de izquierda a derecha o de derecha a izquierda). Todos los
operadores situados entre líneas tienen el mismo nivel de prioridad.
Ejemplos:
Página 12
‐3+4/2
‐3+2
‐1
De ahí la importancia de proporcionar adecuadamente los valores o datos de aquellas variables del
programa que deba leer la computadora; además de la importancia de incluir mensajes en las
ordenes de salida que indiquen la naturaleza o nombre de los resultados obtenidos.
El sistema operativo MS‐DOS soporta dos métodos de entrada y salida de datos que son:
Para la entrada y salida de datos con formato se utilizan dos funciones halladas en el archivo de
cabecera stdio.h: printf() y scanf().
La cadena de control está formada por dos tipos de elementos. El primer elemento es el carácter
que se mostrará en la pantalla. El segundo elemento contiene especificadores de formato que
definen la forma en que se muestran los argumentos posteriores. El especificador de formato
empieza con un % y va seguido por el código del formato. Debe haber exactamente el mismo
número de argumentos que especificadores de formato y ambos deben coincidir en su orden de
aparición de izquierda a derecha.
Código Formato
%c Carácter
%d Entero en decimales con signo
%i Entero decimales con signo
%e Notación científica
%f Punto flotante
%h Entero corto
%o Octal sin signo
%s Cadena de caracteres
Página 13
%x Hexadecimal sin signo
Tabla 8. Especificadores de formato.
Ejemplo:
printf(“El Lado es: %i El Área del Cuadrado es: %f”, Lado, Area);
También en la cadena de control pueden existir una serie de caracteres que permitan formatear la
salida, conocidos como secuencia de escape:
El lenguaje C emplea apuntadores en lectura de toda cantidad numérica debido a que asigna dichos
valores a través de las direcciones de las variables, por tal motivo los nombres de ellas van
precedidas del símbolo & (con lo que se indica que se usan apuntadores). En el caso de cadenas, los
nombres de las variables son en sí mismos apuntadores y no requieren dicho símbolo.
Ejemplo:
/*
ES-Estan.cpp
Muestra el uso de las funciones printf() y scanf()
*/
#include <conio.h>
#include <stdio.h>
int main(){
char Nom[40];
Página 14
int Edad;
float Peso;
void clrscr(void);
printf("IDENTIFIQUESE POR FAVOR");
printf("\n\n NOMBRE: ");
scanf("%s",Nom); // scanf("%[^\n]",Nom);
printf("\n EDAD: ");
scanf("%i",&Edad);
printf("\n PESO: ");
scanf("%f",&Peso);
printf("\n\n SUS DATOS SON: ");
printf("%s %i %4.2f",Nom,Edad,Peso);
getch();
return 0;
}
NOMBRE: Emilio
EDAD: 3
PESO: 18.4
Observe que al leer las variables Edad y Peso de tipo entero y real respectivamente se utiliza el
operador & que indica dirección, mientras que la variable Nom que es un arreglo de caracteres
(cadena) no lo requiere, la función printf() hace uso frecuentemente de la secuencia de escape \n
para cambiar de línea, por ejemplo el penúltimo printf() hace que se deje una línea en blanco.
C++ proporciona el archivo de cabecera iostream.h que contiene funciones que realizan operaciones
de Entrada/Salida, este archivo tiene la ventaja sobre el stdio.h por ser una implementación
orientada a objetos, dos de estos objetos son: cin y cout. Donde:
El operador de inserción (<<) transmite sus argumentos situados a la derecha hacia el flujo
cout.
El operador de extracción (>>) lee informaciones del flujo cin a la izquierda del operador y
las almacena en las variables indicadas a la derecha.
Página 15
A manera de ejemplo, se ha reescrito el programa ES‐Estan.cpp pero en lugar de usar printf() y
scanf() se usara cout y cin.
/*ES-Flujo.cpp*/
#include <conio.h>
#include <iostream.h> //En lugar de stdio.h
using namespace std;
int main(){
char Nom[40];
int Edad;
float Peso;
clrscr();
cout<<"IDENTIFIQUESE POR FAVOR";
cout<<"\n\n NOMBRE: ";
cin>>Nom; // gets(Nom); ó cin.getline(Nom,40);
cout<<"\n EDAD: ";
cin>>Edad;
cout<<"\n PESO: ";
cin>>Peso;
cout<<"\n\n SUS DATOS SON: ";
cout<<Nom<<" "<<Edad<<" "<<Peso;
getch();
return 0;
}
La Salida del programa después de ejecutarla sería idéntica al a salida del programa ES‐Estan.cpp
Cuando se lee un arreglo de caracteres como la variable Nom puede ocurrir que el usuario escriba
más de una palabra (una línea), en cuyo caso no sería conveniente utilizar cin sola, ya que este
solamente tomaría la primera palabra. Para leer más de una palabra se puede utilizar la función
getline() de la siguiente forma:
cin.getline(Cadena, num);
Donde:
Cadena es cualquier arreglo de caracteres que se haya definido con anterioridad y que contiene la
cadena de entrada.
Ejemplo:
En la penúltima línea se observa que se pueden concatenar varios operadores << en una sola línea.
Otro aspecto importante de los flujos, es que los operadores << y >> efectúan automáticamente las
conversiones necesarias.
Página 16
EJERCICIOS RESUELTOS
1.‐ Usando la entrada y salida estándar escribir un programa que calcule el área de un triangulo a
partir de su base y altura usando la formula: Área = (Base*Altura)/2.
/* Area.cpp */
#include <stdio.h>
#include <conio.h>
int main ()
{
float Altura,Base,Area;
void clrscr(void);
printf ("CALCULA EL AREA DE UN TRIANGULO.");
printf("\n\nTECLEE LA BASE: ");
scanf("%f",&Base);
printf("\nTECLEE LA ALTURA: ");
scanf("%f",&Altura);
Area=(Base*Altura)/2;
printf("\nEl EL AREA ES: %8.2f", Area);
printf("\nPRESIONE <ENTER> PARA TERMINAR");
getch();
return 0;
}
2.‐ Usando la entrada y salida estándar escriba un programa que calcule el sueldo de un empleado,
solicitando su nombre, número de horas trabajadas y el costo por hora.
/* Sueldo.cpp*/
# include <stdio.h>
# include <conio.h>
int main ()
{
char nombre[40];
float chr, hrst, Sueldo;
void clrscr(void);
printf ("\n CALCULA EL SUELDO DE UN EMPLEADO");
printf ("\n\n NOMBRE DEL EMPLEADO: ");
gets(nombre);
printf ("\n HORAS TRABAJADAS: ");
scanf ("%f", &hrst);
printf ("\n COSTO POR HORA: ");
scanf ("%f",&chr);
Sueldo=hrst*chr;
printf("\n EL SUELDO DE %s ES DE: $ %8.2f",nombre,Sueldo);
getch();
return 0;
}
Página 17
3.‐ Programa que calcula el precio de venta de un artículo. El precio de venta se calcula añadiéndole
al costo el 120% como utilidad y el 15% de impuesto.
/*Preventa.cpp*/
# include <stdio.h>
# include <conio.h>
int main ()
{
char descripcion[40];
float CosP, Temp, CVenta;
clrscr();
printf ("\n CALCULA EL PRECIO DE VENTA DE UN ARTICULO.");
printf ("\n\n DESCRIPCION DEL ARTICULO: ");
gets (descripcion);
printf ("\n COSTO DE PRODUCCION: ");
scanf("%f", &CosP);
Temp= (CosP+(CosP*1.2));
CVenta=Temp + Temp*.15;
printf("\n EL COSTO DE VENTA DE %s ES: $ %8.2f", descripcion, CVenta);
getch();
return 0;
}
4. – Usando la entrada y salida por flujos escriba un programa que lea la longitud de los lados A y B
de un triangulo y calcule la hipotenusa (C), aplicando el teorema de Pitágoras, C 2 = A2 + B2.
/* Hipotenu.cpp */
# include <iostream>
# include <conio.h>
# include <math.h> //Por las funciones matemáticas
using namespace std;
int main ()
{
float A, B, C;
void clrscr(void);
cout<<"CALCULO DE LA HIPOTENUSA";
cout<<"\n CATETO A:" ;
cin>>A;
cout<<"\n CATETO B:";
cin>>B;
C= sqrt (pow(A,2)+pow(B,2));
cout<<"\n LA HIPOTENUSA ES: "<<C;
getch();
return 0;
}
Página 18