FUNCIONES Y ESTRUCTURAS.


Las funciones son la piedra angular en C y C++. Todo lo que se programa en C y C++ esta dentro de una funciòn. Esto se debe a que todos los programas deben incluir la funcion main(), que es en si misma una funciòn. Aunque C++ esta orientada a objetos, las funciones siguen siendo parte de este estilo de programaciòn ya que dentro de las clases se hayan un conjunto de funciones.La ejecuciòn de un programa comienza por la funciòn main(), cuando se llama a una funciòn, el control se pasa a la misma para su ejecuciòn; y cuando finaliza, el control es devuelto de nuevo al mòdulo que llamo, para continuar con la ejecuciòn del mismo a partir de la sentencia que efectuò la llamada.Sintaxis:Tipo_de_retorno Nombre_funciòn (Lista de paràmetros){cuerpo de la funciòn}Donde:Tipo_de_retorno especifica el tipo de valor que devuelve la sentencia return de la funciòn. El valor puede ser cualquier tipo vàlido. Si no se especifica ningùn tipo, el compilador asume que la funciòn devuelve como resultado un entero, la funciones que no devuelven ningùn valor deben tener el tipo void. La lista de paràmetros es la lista de nombres de variables separados por comas con sus tipos asociados que reciben los valores de los argumentos cuando se llama a la funciòn. Una funciòn puede no tener paràmetros en cuando no hay paràmetros se requieren los parèntesis y la lista de paràmetros puede estar sustituido por void.



PASE DE PARAMETROS.
Se pueden pasar argumentos a las funciones de dos formas:-llamada por valor.-llamada por resistencia.El primer mètodo copia el valor de un argumento en el paràmetro de la funciòn. De esta forma los cambios en los paràmetros en la fuciòn no afectan a las variables que se usan en la llamada. La llamada de referencia copia la direccion del argumento en el paràmetro. Dentro de la funciòn se usa la direcciòn para acceder al argumento usado en la llamada. Esto significa que los cambios hechos a los paràmetros afectan a la variable usada en la llamada a la funciòn. Cuando se desee modificar el argumento se recomienda efectuar una llamada por referencia y si no se desea modificar el argumento entonces se harà una llamada por valor.



PASE DE ARREGLOS COMO PARÀMETROS.
Cuando se usa un arreglo como argumento de una funciòn, sòlo se pasa la direcciòn del arreglo, no una copia del arreglo entero. Cuando se llama a una funciòn con un nombre de un arreglo, se pasa a la funciòn un puntero al primer elemento del arreglo, esto significa que la declaraciòn del paràmetro debe de ser un tipo puntero compatible. Existen tres formas de declarar un paràmetro que va a recibir un puntero a un arreglo:- Como un arreglo determinado.- Como un arreglo indeterminado (sin tamaño)- Como un puntero.



ESTRUCTURAS.
Una estructura es un conjunto de datos relacionados entre sì y referenciado bao un ùnico nombre. Cada elemnto de una estructura recibe el nombre de Dato miembro.Sintaxis para la definiciòn de una estructura:


Struct etiqueta{

Tipo variable1;

Tipo variable2;

Tipo variable3;...
};


Etiqueta.- Es un identificador de la estructura que va a representar un nuevo tipo de datos miembros(variables), al finalizar la estructura lleva ; que indica que es el final de la sentencia. Cuando se declara una variable de tipo estructura es cuando el compilador reserva espacio en memoria para almacenar la estructura, la cantidad de memoria requerida serà igual a la suma de la memoria requerida por cada uno de sus datos miembros. Los elementos individuales de la estructura se referencian utilizando el operador . (operador punto).


Sintaxis:


Nombre_var_estructura.Dato_miembro:


ARREGLOS DE ESTRUCTURAS.
Para declarar un arreglo de estructura, se indexa el nombre de la estructura.


Ejemplo:Al[2].Edad=19;

El còdigo anterior asigna la edad 19 a la estructura 3 de su dato miembro Edad.


-Pase de estructuras a funciones.


Exiten de dos tipos lo de valor y de referencia.
Cuando se pasa una estructura como argumento a una funciòn por valor, se pasa una copia de la estructura integra, lo cual significa que todos los cambios realizados en los contenidos de la estructura dentro de la funciòn a la que se pasa no afectan a la estructura utilizada como argumento. Por referencia cuando se dessee modificar el contenido de la estructura que se usa como argumento en la llamada a una funciòn se debe optar por una llamada por refencia. En este caso se pasa la direcciòn de inicio de la estructura a la funcion anteponiendo a la variable el oprador &, dentro la funciòn la estructura debe definirse como un apuntador.

ARREGLOS Y PUNTEROS


Un arreglo es una coleccion de variables del mismo tipo que se referencia por un nombre comùn. A un elemento especifico de un arreglo se accede mediante un ìndice. En C todos los arreglos constan de posiciones de memoria contiguas. La direcciòn màs baja corresponde al primer elemento y la direcciòn màs alta al ùltimo elemento. Los arreglos pueden tener una o màs dimensiones.

ARREGLOS UNIDIMENSIONALES.

A los arreglos unidemensionales tambièn se les conoce como listas.

Tipo nombre[Tamaño];
Tipo nombre[];
donde:
tipo: Indica el tipo de datos de los elementos del arreglo.
nombre: es el identificador del arreglo
tamaño Especifica el nùmero de elementos del arreglo. El tamaño puede omitirse cuando se inicializa el arreglo, cuando se declara como un paràmetro en una funciòn o cuando se hace referencia a un arreglo declarado en otra parte del programa, es recomendable que el tamaño sea definido como una constante para garantizar no rebasar el lìmite del arreglo.
El lenguaje C no checa los lìmites de un arreglo. Ès resppnsabilidad del programador realizar este tipo de operaciones para no escribir o modificar porciones de memoria que no le pertenecen al arreglo. La cantidad de memoria requerida para guardar un arreglo este directamente relacionada con su tipo y su tamaño. Para un arreglo unidimensional, el tamaño total en bytes se calcula:
Total en bytes = sizeof(tipo)*tamaño = sizef(nombre_arreglo).
Cuando se crea un arreglo sòlo se puede utilizar constantes para inicializarlo.
CADENAS.
C no tiene un tipo de dato para cadenas de caracteres. Una cadena de caracteres es un arreglo unidimensional, en el cual todos sus elementos son de tipo char, al final del arreglo contiene el carácter nulo “/o”. C soporta una gran variedad de funciones para el manejo de cadenas definiciones en el archivo de cabecera string.h
Con la función streln() se calcula la longitud de la cadena, para que en el ciclo for se inicie a partir del último índice del arreglo de caracteres, decrementandolo, de no en uno hasta llegar a cero, en cada ciclo se le imprime un carácter a la vez.
ARREGLOS BIDIMENSIONALES.
El termino dimesion representa la cantidad de índices utilizados para referenciar un elemento particular en un arreglo. Los arreglos de màs de una dimensión se conocen como arreglos multidimensionales. La forma màs simple de un arreglo multidimensional es el arreglo bidimensional. Para definir un arreglo Tabla de enteros bidimensional de tamaño 5,4 se escrbirìa:
Int Tabla[5][4]
Un arreglo bidimensional puede verse como una tabla, donde el primer índice denota el número de filas y el segundo el número de columnas, asì la declaración anterior denotara una tabla de 5 filas por 4 columnas.
APUNTADORES.
Un puntero es una variable que contiene una dirección de memoria. Normalmente, esa dirección es la posición de otra variable de memoria. Si una variable contiene la dirección de otra variable, entonces se dice que la primera variable apunta a la segunda.
DECLARACIONES DE UN APUNTADOR.
Una declaración de un puntero consiste en un tipo base, un * y el nombre de la variable. La forma general para declarar una variable puntero es:
Tipo *nombre;
Existen 2 punteros especiales de punteros:& y *. El & es un operador monario (Sòlo necesita un operando) que devuelve la dirección de memoria de su operando; El *, es el complemento de &, devuelve el valor de la variable localizada en la dirección que sigue.
Las variables punteros deben apuntar siempre a otra variable de su mismo tipo, aunque C permite apuntar a una variable de n tipo distinto sin mensajes de error durante la compilación en algunos casos, hacerlo sería incongruente.
-Aritmética de punteros.
Existen solo dos operaciones aritméticas que se pueden realizar con los punteros: la suma (++)y la resta (--). Cada vez que se incrementa un puntero, apunta a la posición de memoria del siguiente elemento de su tipo base. Cada vez que se decremento, apunta a la posición del elemento anterior. Con punteros a carácter, parece una aritmética normal. Sin embargo, el resto de los punteros a caracteres, parece una aritmética normal. Sin embargo, el resto de los puteros aumentan o decrementan en la longitud del tipo de datos a los que apuntan. Suponiendo los enteros de 2 bytes de longitud, cuando se incrementa un puntero a entero, su valor aumenta en 2.

SENTENCIAS DE CONTROL DE PROGRAMA


1.- SENTENCIAS DE SELECCIÒN.



A las sentencias de selecciòn tambièn se les conoce como sentencia condicional, entre las que se incluyen if y switch.

Muchas sentecnias de C se basan en una prueba condicional que determina la acciòn que se ha de llevar acabo. Una expresiòn condicional tiene como resultado un valor cierto o falso. En C cualquier valor distinto de cero es cierto, incluyendo los nùmeros negativos. El 0 es el ùnico valor falso.



-If, If-else

La sintaxos de esta sentencia es:

if(expresiòn es verdadera)

{

sentencia_1;

sentencia_2;

}



Si al evaluar la expresion, esta es verdadera se ejecutara las sentencias del bloque (un bloque comienza con { y termina en } ), en caso contrario se ejecutan las sentencias a continuaciòn del bloque. La clàusula else se puede añadir a la sentencia if cuando la expresiòn es falsa y se desean ejecutar sentencias distintas.



if (expresiòn es verdadera)

{

sentencia_1;

sentencia_2;

else

{

sentencia_11;

sentencia_22;

}



Ejemplo:



/*determine si una persona es mayor o menor de edad usando la intruccion if*/



#include conio.h //los archivos de cabecera se encierran en " < > "
#include iostream.h
void main()
{
int edad;
clrscr();
cout<<"Proporcione su edad:";
cin>>edad;
if (edad<18)
cout<<"\n\n aùn es menor de edad:::>";
else
cout<<"\n\n Es mayor de edad";
getch();
}
La sentencia switch permite evaluar una expresiòn y tomar diversas acciones en funciòn del resultado de la expresiòn.
Switch (expresiòn entera)
{
case constante_1:
sentencia_11;
sentencia_12;
...
break;
case constante_2:
sentencia_21;
sentencia_22;
...
break;
default:
sentencia_11;
sentencia_12;
...
SENTENCIAS DE ITERACIÒN.
Entre las sentencias de iteraciòn se incluyen for, while y do-while. Cualquier sentencia de iteraciòn tiene tres partes importantes que son: inicializaciòn, condiciòn e incremento, aunque cada sentencia de iteraciòn debe usarse preferente segùn la situaciòn en la mayorìa de los casos se puede adaptar cualquiera de las tres a cualquier situaciòn.
FOR: cuando se deben ejecutar una sentencia simple o compuesta, repetivamente un número de veces conocido, la construcción adecuada es la sentencia for.

For(exp_inicializaciòn: condición:expresión_incremento)
Instrucciòn:

Cuando se encuentra la instrucción for se ejecuta primero la expresión de inicialización, no volviendo a ejecutarse màs. Generalmente esta instrucción realiza la inicialización de la variable de control de ciclo. Tras esto se prueba la condición. Siempre que condición se evalúa como verdadero, la instrucción o instrucciones dentro del ciclo son ejecutados. Despuès de entrar en el ciclo y ejecutar todas las instrucciones dentro de èste se ejecuta expresión_incremento. Sin embargo si condición toma el valor Falso, las instrucciones dentro del ciclo son ignorados y la ejecución continùa con la instrucción al final del ciclo.

Cuando se necesitan ejecutar varias instrucciones dentro del ciclo se hacen necesarias definir el bloque con las llaves {}

For anidados.
Un ciclo for puede colocarse de otro, en este caso el ciclo interno se ejecutarà totalmente cada vez que se ejecute el ciclo que lo contiene.

WHILE: La sentencia es un ciclo de verificación preliminar, esto significa que la condición es evaluada antes de entrar a ejecutar las instrucciones dentro del cuerpo del ciclo. Debido a esto se pueden ejecutar de cero a muchas veces.

While(condicion)
{
Instrucción_1;
Instrucción_2;
}



La inicialización de un ciclo while por lo regular se realiza antes de ella y el incremento dentro del bloque.
DO-WHILE: Difiere tanto de for como de while en que es un ciclo de verificación posterior, es decir al ciclo se entra al menos una vez, y la condición del ciclo se prueba al cabo de la primera iteración. Como los ciclos do-while se ejecutan como minimo una vez, es mejor utilizarlos en aquellas aplicaciones en las que se quiere entrar al ciclo.
Do
{
Instrucciòn_1;
Instrucciòn_2;
}
While(condiciòn);

SENTENCIAS DE SALTO.
C tiene cuatro sentencias que llevan a cabo un salto incondicional: return, goto, break y continue. De ellas, se puede usar return y goto en cualquier parte del programa. Las sentencias break y continue se deben usar junto con una sentencia del ciclo.
-return
La sentencia return se usa para volver de una función. Se trata de una sentencia de salto porque hace que la ejecución vuelva (salte atràs) al punto en que se hizo la llamada a la función.
Return (expresiòn)
Donde: el valor de expresión se devuelve como valor a la función.
Se puede usar tantas sentencias return como se quiera en una función. Sin embargo, la funiòn termina tan pronto como encuentra el primer return. Una función termina tan pronto como encuentra el primer return. Una función exit() definido en el archivo de cabecera stdio.h es parecida a return aunque este en lugar de afectar a una función afecta a todo el programa.
-GOTO
La sentencia goto se puede usar para realizar ciclos usando una etiqueta, o para saltar a otra parte de un programa, actualmente no es recomendable su uso porque hace ilegible el código.
Etiqueta:
Sentencia_1;
Sentencia_2;
Goto Etiqueta.
-BREAK.
La sentencia break tiene dos usos. Se puede usar para finalizar un case en una sentencia switch. Tambièn se puede usar para forzar la terminación inmediata de una bucle, saltando la evaluación condicional normal del ciclo.
Cuando se encuentra la sentencia break dentro de un ciclo, el ciclo finaliza inmediatamente.
-CONTINUE
La sentencia continue funciona de una forma algo similar a break. Sin embargo, en vez de forzar la terminación. Continue, forza una nueva iteración del ciclo y saldrá cualquier código que exista abajo en el bloque.






TIPOS DE DATOS Y MODIFICADORES


Palabras reservadas:


asm, delete, goto, public, this, auto, do, huge, register, union, break, double, if, return, unsigned, case, else, int, Short, virtual, carch, enum, interrumpt, signet, void, char, extern, long, sizeof, volatile, class, far, near, static, while, const, float, new, struct, contibue, for, private, switch, default, friend, protected, template.

Nota: Todas las palabras recervadas deben de escribirse con minùsculas.

Acontinuaciòn se presentara
1.-los tipos de datos
2.-el numero de bits,
3.-y sus intervalos.
a)char,8 ,-127 a 127
b)int, 16, -32768 a 32767
c)long, 32, 0 a 4294967295
d) float, 32, Aprox. 6 dìgitos de precision
e)double, 64, Aprox. 12 dìgitos de precision
f)void,0, sin valor




----Modificadores.

1.-tipo
2.-#bits
3.-Intervalo
a) unsigned char, 8, 0 a 255
b) Char, 8, -127 a 127
c) unsigned int, 16, 0 a 65535
d) short int, 16, Lo mismo que int
e) unsigned long int, 32, 0 a 4.294.967.294
f) long int, 32, -2.147.483.648 a 2.147.483.647
g) float, 32, 3.4E-38 a 3.4E38
h)double float, 64, 1.7E-308 a 1.7E308



---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.


[clase] tipo identificador[,identicador];


donde:


clase representa un especificador de clase de almacenamiento.
tipo determina el tipo de variable.
identificador indica el nombre de la variable.


Una variable se declara al inicio del programa es considerada como variable global y es accesible desde cualquier parte del programa.

COMPILADO Y LIGADO.


Compilaciòn.- Durante este proceso se examina el o los programas fuente de la aplicaciòn, los archivos de cabecera para hallar errores de sintaxis, de no existir se genera un archivo objeto (.OBJ) por cada programa fuente.


Ligado.- Durante este proceso se unen todos los programas objetos del que se conforme la aplicaciòn, asì como los archivos de librerìa (.LIB) para formar un solo programa independiente, o programa ejecutable (.EXE).


DIFERENCIAS ENTRE ARCHIVOS DE CABECERA Y LAS LIBRERIAS.


1.- Los archivos de cabecera contiene una extencion de *.h, y los archivos de libreria de *.Lib

2.- El tipo(Los archivos de cabecera son de texto y los de libreria binario)

3.- Cuando se usa( Los archivos de cabecera utilizan el tiempo de compilacion y los de libreria tiempo en ligado).

4.- Su contenido ( El contenido que tiene los archivos de cabecera es de definiciones y el de libreria de implementaciones compiladas)

Estructura de un programa.


Un programa escrito en lenguaje C tiene la siguiente estructura, aunque no necesariamente debe contener todos los puntos:



1.- Deficiòn de archivos de cabeceras.

2.- Deficiòn de constantes y variables globales.

3.- Definiciòn de Funciones del usuario.

4.- Definiciòn e implementaciòn del programa principal ( main() )

5.- Implementaciòn de funciones del usuario.




A manera de ejemplo considèrese el siguiente programa:


//Definiciòn de archivos de cabecera

#include //cuando se maneja c++ se utilizan otras librerias como:iostream.h

#include // y string.h Las librerias dependeran de los valores que se utilizan


//Definiciòn de contantes y variables globales

#define pi 3.1416

float area;


//Definicion de funciones del usuario

void area_cir(int r);


//Definicion e implementacion del Programa Principal

void main()

{int radio;

clrscr();

printf("Bienvenido al lenguaje C");

printf("\n\n Calculo de area de un circulo");

printf("\n radio");

scanf("%i",&radio);

area_cir(radio);

printf("\n\n El àrea es; %8.2f",area);

getch();

}


//implementacion de funciones del Usuario

void area_cir(int R)

{

area=2*Pi*R*R;

}



Ahora les presento a continuacion algunos archivos de cabecera que se utilizaran tanto en c estàndar como en c++.


stdio.h ---para uso de funciones de entrada/salida standard.

iostream.h ---para uso de funciones de entrada/salida de flujos.

conio.h ---para uso de funciones de entrada/salida por teclado o consola.


Estos tres primeros archivos de cabecera son los màs usados en la programacion de c estandar y c++, para guardar los archivos en c++ se guardan con la extencion .cpp y para los archivos de c estandar se maneja .c


alloc.h ---para la asignacion dinamica de memoria.

graphics ---para uso de funciones relacionadas con graficas.

io.h ---para uso de funciones de entrada/salida de bajo nivel.

math.h ---para uso de funciones matematicas.

mem.h ---para uso de funciones de manipulacion de memoria.

string.h ---para uso de funciones de relacionadas con cadenas

time.h ---para uso de funciones de hora y fecha.


Nota: Cada Archivo de cabecera esta encerrado de estos signos "<>". Exiten mas archivos de cabecera pero estos son los que màs se utilizan y los que màs les serviran en su formaciòn.


Para que nosotros podamos definir un archivo de cabecera primero que nada debemos de usar una directiva de preprocesamiento llamado #include seguido del archivo de cabecera encerrandolo con estos signos "< >"o " "segùn el lugar en donde se encuentren, 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 de definiciòn de constantes y variables globales se encuentra otra directiva de preprocesamiento conocido como #define que permite definir la constante.


La funciòn principal ( main () ) es el primero que se ejecuta cuando inicia un programa, por lo que se ejecuta cuando inicia un programa, por lo que es indispensable que èste existia, en èl se establece la lògica o secuencia que seguirà el programa durante su ejecuciòn.

HISTORIA DEL LENGUAJE C


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 realizo en este sistema 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 lenguaje està inspirado en el lenguaje B escrito por ken Thompson en 1970 con intenciòn de recodificar el UNIx, que en la fase de arranque estaba escrito en ensamblador, en vista a su transportabilidad a otras maquinas. B era un lenguaje evolucionado e independientemete de la màquina, inspirado en el lenguaje BCPL concebido por Martìn Richard en 1967.

En 1972, Dennis Ritchie, toma el relevo y modifica el lenguaje B, creando el lenguaje C y rescribiendo el UNIX en dicho lenguaje. La novedad que proporciono el 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 Simulado67 adiciono las caracteristicas de la programacion orientada a objetos(incluyendo la ventaja de una biblioteca de funciones orientada a objetos) y lo denomino C con clases. Para 1983 dicha denominacion cambio a la de c++. Con este nuevo enfoque surge la nueva metodologia que aumente las posibilidades de la programacion bajo nuevos conceptos.

Con la posibilidad de las microcomputadoras se crearon muchas implementaciones de C. En lo que se podria decir que era un milagro, los codigos fuentes aceptados por la mayoria de esas implementaciones eran altamente compatibles. Sin embargo, como no existian ningun estardan, aparecieron discrepancias. Para remediar la situacion, el instituto de Estàndares Americano (ANSI) estableciò un comitè a mediados de 1983 para crear un estàndar que definiera al lenguaje C. Este comitè ANSI termino el proceso de formalizaciòn en 1990.

Actualmente muchas empresas se dedican a vender el compilador del lenguaje C, dos de estos imperios son:

----Microsoft visual c++ ver 6.0

----Borland c++ Builder 5.0


La mayorìa de los compiladores actuales soportan la programacion en C Estàndar, C Orientado a Objetos y La Programaciòn Visual.