Taller de Programacion
Taller de Programacion
Taller de Programacion
En lenguaje C se dice que todos los datos que utilizan los programas son básicos (simples predefinidos o estándares) o
derivados. Los tipos básicos en lenguaje C se clasifican en:
Un dato de tipo entero (int en lenguaje C ) es aquel que puede tomar por valor un número perteneciente al conjunto de
los números enteros (Z), el cual está formado por los números naturales, su opuestos (números negativos) y el cero.
Ejemplo: La edad de una persona y el año en que nació, son dos datos de tipo entero:
Edad...: 29
Año....: 1976
Z es un conjunto infinito de números enteros, y como el ordenador no puede representarlos todos, un dato de tipo entero
sólo puede tomar por valor un número perteneciente a un subconjunto de Z. Los valores máximo y mínimo de dicho
subconjunto varían según las características de cada ordenador y del compilador que se utilice.
Un dato de tipo real (float o double en lenguaje C) es aquel que puede tomar por valor un número perteneciente al
conjunto de los números reales (R), el cual está formado por los números racionales e irracionales.
Ejemplo: El peso de una persona (en kilogramos) y su altura (en centímetros), son datos que pueden considerarse de tipo
real.
Peso.....: 75,3
Altura...: 172,7
R es un conjunto infinito de números reales, y como el ordenador no puede representarlos todos, un dato de tipo real sólo
puede tomar por valor un número perteneciente a un subconjunto de R. Los valores de dicho subconjunto varían según las
características de cada ordenador y del compilador que se utilice.
La diferencia principal entre float y double está en el hecho de que un dato de tipo double puede tomar por valor un
número perteneciente a un subconjunto de R mayor que un dato de tipo float.
1.4.3 Datos de tipo carácter (char)
Un dato de tipo carácter (char en lenguaje C) es aquel que puede tomar por valor un carácter perteneciente al conjunto
de los caracteres que puede representar el ordenador.
En lenguaje C, el valor de un dato de tipo carácter se debe representar entre comillas simples (').
Ejemplo: En un examen con preguntas en las que hay que seleccionar la respuesta correcta entre varias opciones dadas (a,
b, c, d, e), la respuesta correcta de cada una de las preguntas es un dato de tipo carácter.
Un dato sin valor (void en lenguaje C) es un dato que no puede tomar por valor nigún valor, es decir, es un dato vacío
(nulo). Más adelante estudiaremos su utilidad.
En programación, un dato de tipo lógico es aquel que puede tomar por valor sólo uno de los dos siguientes:
{ verdadero, falso }
Los valores verdadero y falso son contrapuestos, de manera que, un dato de tipo lógico siempre está asociado a que algo
se cumpla o no se cumpla.
Ejemplo: El estado de una barrera de paso de trenes es un dato que puede considerarse de tipo lógico, por ejemplo,
asociando verdadero a que esté subida y falso a que esté bajada.
En lenguaje C no existen datos de tipo lógico (que sí existen en otros lenguajes de programación). Ahora bien, se pueden
simular con datos de tipo entero, considerándose el valor cero (0) como falso, y cualquier otro valor entero como
verdadero (para ello, generalmente, se emplea el valor uno (1)).
De todos los tipos de datos que no son básicos se dice que son derivados, ya que, están basados en alguno que sí lo es. Por
ejemplo, los datos de tipo cadena son aquellos que pueden tomar por valor una secuencia de caracteres.
En lenguaje C, el valor de un dato de tipo cadena se debe representar entre comillas dobles (").
Obsérvese que, en la cadena "La Odisea", el carácter espacio en blanco también se cuenta.
TIPOS
Cuando en C, se dice que un objeto es de un tipo, se quiere decir que ese objeto pertenece a un conjunto específico de
valores con los cuales se pueden realizar un conjunto de operaciones también determinadas.
Existen cinco tipos básicos: carácter, entero, coma flotante, coma flotante de doble precisión y void.
Los demás tipos se basan en alguno de estos tipos básicos. El tamaño y el rango de estos tipos de datos varían con cada
tipo de procesador y con la implementación del compilador de C.
El tipo void, o bien declara explícitamente una función como que no devuelve valor alguno, o bien crea punteros
genéricos.
La siguiente tabla muestra todas las combinaciones que se ajustan al estándar ANSI junto con sus rangos mínimos y
longitudes aproximadas en bits.
OPERADORES
C es un lenguaje muy rico en operadores. Se definen seis tipos de operadores aritméticos, relacionales, de asignación,
lógicos, de dirección y de movimiento.
Existe otro tipo de operador denominado molde que su función es hacer posible que una expresión sea de un tipo
determinado utilizando la sintaxis (tipo) expresión;
Siendo tipo uno de los tipos estándar de C. Por ejemplo, si se quiere asegurar que la expresión x/2 se evalúe de tipo float,
se puede escribir: (float) x/2;.
+ Suma
- Resta
* Producto
/ Cociente de una división
% Resto de una división
EJEMPLO:
El cociente entre dos enteros da como resultado un entero. Por ejemplo, al dividir 20 entre 7 nos da como resultado 2.
El operador módulo da como resultado el resto de la división entera. Por ejemplo 20%7 da como resultado 6 que es el
resto de la división entre 20 y 7.
El operador módulo también se puede emplear con números reales. Por ejemplo, el cociente entre 7.5 y 3.0 es 2.5 y el
resto es cero, es decir, 7.5=3.0 x 2.5+ 0. El operador módulo, funciona de la siguiente forma 7.5=3.0 x 2+1.5, calcula la
diferencia entre el dividendo (7.5) y el producto del divisor (3.0) por la parte entera (2) del cociente, devolviendo 1.5. Así
pues, la operación 7.5%3.0 da como resultado 1.5.
AND y OR trabajan con dos operandos y retornan un valor lógico basadas en las denominadas tablas de verdad. El
operador NOT actúa sobre un operando. Estas tablas de verdad son conocidas y usadas en el contexto de la vida diaria,
por ejemplo: "si hace sol Y tengo tiempo, iré a la playa", "si NO hace sol, me quedaré en casa", "si llueve O hace viento,
iré al cine". Las tablas de verdad de los operadores AND, OR y NOT se muestran en las tablas siguientes
x y resultado
El operador lógico OR
x y resultado
x resultado
true false
false true
Los operadores AND y OR combinan expresiones relacionales cuyo resultado viene dado por la última columna de sus
tablas de verdad. Por ejemplo:
es verdadero (true), si ambas son verdaderas. Si alguna o ambas son falsas el resultado es falso (false). En cambio, la
expresión
(a<b) ||(b<c)
es verdadera si una de las dos comparaciones lo es. Si ambas, son falsas, el resultado es falso.
!(a<b)
es falsa si (a<b) es verdadero, y es verdadera si la comparación es falsa. Por tanto, el operador NOT actuando sobre (a<b)
es equivalente a
(a>=b)
!(a==b)
(a!=b)
Ejemplo:
Para los siguientes ejemplos T significa verdadero y F falso.
Operador Not Operador Not
Operando Resultado
T F
F T
Operador Or Operador Or
Operando1 Operador Operando2 Resultado
T Or T T
T F T
F T T
F F F
1. Not
2. And
3. Or
1. ()
2. ^
3. *, /, Mod, Not
4. +, -, And
5. >, <, > =, < =, < >, =, Or
Ejemplos:
Sea: a = 10 b = 12 c = 13 d =10
6.3 Operadores relacionales
== Igual a
!= No igual a
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
Ejemplos:
Si a = 10, b = 20, c = 30
a + b > c Falso
a - b < c Verdadero
a - b = c Falso
a * b < > c Verdadero
Ejemplos no lógicos:
a<b<c
10 < 20 < 30
T > 5 < 30
(no es lógico porque tiene diferentes operandos)
Los operadores relacionales son símbolos que se usan para comparar dos valores. Si el resultado de la comparación es
correcto la expresión considerada es verdadera, en caso contrario es falsa. Por ejemplo, 8>4 (ocho mayor que cuatro) es
verdadera, se representa por el valor true del tipo básico boolean, en cambio, 8<4 (ocho menor que cuatro) es falsa, false.
En la primera columna de la tabla, se dan los símbolos de los operadores relacionales, el la segunda, el nombre de dichos
operadores, y a continuación su significado mediante un ejemplo.
Se debe tener especial cuidado en no confundir el operador asignación con el operador relacional igual a. Las asignaciones
se realizan con el símbolo =, las comparaciones con ==.
En el programa RelacionApp, se compara la variable i que guarda un 8, con un conjunto de valores, el resultado de la
comparación es verdadero (true), o falso (false).
Operadores de asignacion
===
++ m++ m=m+1
-- m-- m=m-1
+= m+=n m=m+n
-= m-=n m=m-n
*= m*=n m=m*n
/= m/=n m=m/n
%= m%=n m=m%n
Los operadores de asignación ++ y ¿ pueden ir antes o delante de una expresión formando una nueva expresión. Estas
expresiones se denominan post-incrementos o pre-incrementos (decrementos si el operador es --) y son expresiones
compuestas, normalmente son del tipo y=x++; (y=++x;).
Existen una diferencia entre el post-incremento y el pre-incremento. El post-incremento primero suma uno a la variable (x
en el ejemplo) y luego asigna ese valor (y en el ejemplo), mientras con el pre-incremento, la asignación es anterior.
Por ejemplo:
int x=1, y;
y=x++; /* y es 1 y x vale 2 */
int x=1, y;
y=++x; /* x vale 2 e y también vale 2 */
Existe un último tipo de operadores, no comentado hasta el momento, los operadores de movimiento (<<, movimiento a la
izquierda y >>, a la derecha). Su función es desplazar los bits de la palabra de memoria dada tantos espacios como se le
indiquen a derecha o izquierda. La forma general es: expresion1<< expresion2
Los dos operandos deben ser del tipo entero, y mueve los bits de la expresion1 tantas posiciones como se lo indique la
expresion2 (en este caso hacia la izquierda).
Por ejemplo, sea x un entero con representación interna: 00010001110011000101010111111111x<<4; da como resultado:
00011100110001010101111111110000 da como resultado: 00011100110001010101111111110000
() [] De izquierda a derecha
- ++ -- ! ~ * & sizeof(tipo) De derecha a izquierda
* / % De izquierda a derecha
+ - De izquierda a derecha
<< >> De izquierda a derecha
< <= > >= De izquierda a derecha
== != De izquierda a derecha
& De izquierda a derecha
&& De izquierda a derecha
|| De izquierda a derecha
?: De derecha a izquierda
= *= /= %= += -= &= <<= >>= De derecha a izquierda
, De izquierda a derecha
iostream.h
Cout : Muestra los datos que uno desea que se vean en la pantalla.
La biblioteca iostream
C++ proporciona una nueva biblioteca de funciones que realizan operaciones de E/S: la biblioteca iostream. Esta
biblioteca es una implementación orientada a objetos y está basada, al igual que stdio, en el concepto de flujos. Cuando se
introducen caracteres desde el teclado, puede pensarse en caracteres que fluyen desde el teclado a las estructuras de datos
del programa. Cuando se escribe en un archivo, se piensa en un flujo de bytes que van del programa al disco.
Para acceder a la biblioteca iostream se debe incluir el archivo iostream.h. Este archivo contiene información de
diferentes funciones de E/S. Define también los objetos cin y cout.
Manipuladores de salida
La biblioteca iostream define varios operadores particulares, llamados manipuladores, que le permiten controlar
precisamente, el formato de los datos visualizados. Situando un manipulador en la cadena de operadores <<, se puede
modificar el estado del flujo.
Una característica importante de un flujo que debe tratar con valores numéricos es la base de los números. Hay tres
manipuladores (dec, hex y oct) para controlar la situación. La base por omisión es 10 y por tanto sólo será necesario
indicar dec cuando se haya fijado la base a otro valor:
cout <<oct<<x<<endl;
cout <<dec<<x<<endl;
A continuación mostraremos un listado con los manipuladores, su aplicación y la descripción. Cada uno de ellos lo
separaremos mediante --
dec -- cout<<dec<<x; -- Conversión a decimal
dec -- cin>>dec>>x; -- Conversión a decimal
Hex -- out<<hex<<x; -- conversión a hexadecimal
Hex -- cin>>hex>>x; -- conversión a hexadecimal
oct -- cout<<oct<<x; -- Conversión a octal
oct -- cin>>oct>>x; -- conversión a octal
ws -- cin>>ws; Salta espacios en la entrada
ende -- cout<<endl; -- Envía carácter fin de línea
flush -- cout<<flush; -- Limpia el buffer
setfill(int) -- cout<<setfill('*'; -- Fija el carácter de rellenado
setprecision(int) -- cout<<setprecision(6); -- Fija la conversión en coma flotante al nº de dígitos especificado
setw(int) -- cout<<setw(6)<<x; cin>>setw(10)>>x; -- Fija la anchura
MBA en España USA y China 8º del Ranking MBA en España. Becas y prácticas remuneradas en empresas
www.eseune.eduEnlaces patrocinados
Con setw() los valores numéricos se justifican a derechas y los datos carácter a izquierdas.
La información de la justificación de la salida se almacena en un modelo o patrón de bits de una clase llamada ios, que
constituye la base de todas las clases de flujos. Puede establecer o reinicializar bits específicos utilizando los
manipuladores setiosflags() y resetiosflags() respectivamente.
Para utilizar cualquiera de los indicadores de formato hay que insertar el manipulador setiosflags() con el nombre del
indicador como argumento. Hay que utilizar resetiosflags() con el mismo argumento para invertir el estado del formato
antes de utilizar el manipulador setiosflags().
stdio.h
Define los tipos y macros necesitados para el paquete definido de I/O normal en Kernighan y Ritchie, extendido bajo el
Sistema de UNIX V.
Define el estándar de I/O predefinido vierte stdin, stdout, stdprn, y stderr, y declara I/O de datos.
Funciones
gets
Sintaxis:
#include <stdio.h>
Description:
Gets colecciona una cadena de caracteres terminados por una nueva línea desde la cadena estándar de entrada “stdin” y lo
pone en s. La nueva línea es reemplazada por un carácter nulo (\0) en s.
Gets permite las cadenas de la entrada para contener ciertos caracteres del “whitespace o espacio en blanco” (los espacios,
etiquetas). Gets vuelve cuando encuentra una nueva línea; a toda la nueva línea la copia en s.
Note: Para Win32s o Win32 las aplicaciones de GUI, deben remitirse los “stdin”.
El Valor de retorno:
putchar
Sintaxis:
#include <stdio.h>
Descripción:
Note: Para Win32s o Win32 las aplicaciones de GUI, deben remitirse los “stdout”.
El Valor de retorno:
FUNCIONES:
6.3.1.1 printf
Escribe texto formateado por el flujo stdout, según las especificaciones de ``formato'' y la lista de expresiones. Devuelve
el número de caracteres escritos o un valor negativo en caso de error.
6.3.1.2 scanf
Lee texto por el flujo stdin y lo almacena según las especificaciones de ``formato''. Devuelve el número de valores
asignados o EOF si se produce error o se alcanza fin de fichero sin producirse lectura.
6.3.1.3 puts
Escribe los caracteres de la cadena ``s'' por el flujo stdout. Escribe un carácter ``NL'' en lugar del nulo de terminación.
Devuelve un valor no negativo. En caso de error devuelve EOF.
6.3.2.1 fopen
Ejemplo
1libstd/ejemplo_abre_fichero.c
6.3.2.2 fclose
Cierra el fichero asociado con ``flujo''. Devuelve 0 en caso de éxito y EOF (end of file) en caso contrario.
Ejemplo
1libstd/ejemplo_cierra_fichero.c
6.3.2.3 fwrite
La rutina fwrite permite escribir c elementos de longitud n bytes almacenados en el buffer apuntado por ``flujo''.
Ejemplo
1libstd/ejemplo_fwrite.c
6.3.2.4 fread
La rutina fread permite leer c elementos de longitud n bytes del fichero apuntado por ``flujo'' y los almacena en el buffer
especificado.
Ejemplo
1libstd/ejemplo_fread.c
6.3.2.5 fgetc
Lee el siguiente carácter por ``flujo'', avanza el indicador de posición y devuelve int. Devuelve EOF si pone a 1 el
indicador de fin de fichero o el de error.
6.3.2.6 fgets
Lee caracteres por ``flujo'' y los almacena en elementos sucesivos del ``array'' que comienza en ``s'', continuando hasta
que almacene ``n-1'' caracteres, almacene un carácter del nueva línea o ponga a 1 los indicadores de error o de fin de
fichero. Si almacena un carácter, concluye almacenando un carácter nulo en el siguiente elemento del ``array''. Devuelve
``s'' si almacena algún carácter y no ha puesto a 1 el indicador de error; en caso contrario devuelve un puntero nulo.
6.3.2.7 fputc
Escribe el carácter c por ``flujo'', avanza el indicador de posición del fichero y devuelve int c . En caso de error devuelve
EOF.
6.3.2.8 fputs
Escribe los caracteres de la cadena s por ``flujo''. No escribe el carácter nulo de terminación. En caso de éxito, devuelve
un valor no negativo; en caso de error devuelve EOF.
6.3.2.9 fscanf
Lee texto y convierte a la representación interna según el formato especificado en formato. Devuelve el número de
entradas emparejadas y asignadas, o EOF si no se almacenan valores antes de que se active el indicador de error o de fin
de fichero.
6.3.2.10 fprintf
Genera texto formateado, bajo el control de formato formato y escribe los caracteres generados por flujo. Devuelve el
número de caracteres generados o un valor negativo en caso de error.
A modo de resumen estas son las especificaciones de formato más comunes:
Formato Descripción
%d Entero con signo
%u Entero sin signo
%c Caracter
%s Puntero a cadena de caracteres
Ejemplo
1libstd/ejemplo_fprintf.c
6.3.2.11 fseek
La función fseek mueve el puntero de posición del fichero correspondiente al flujo de datos apuntado por ``flujo''. La
nueva posición, medida en bytes, se obtiene añadiendo el número indicado por desplazamiento a la posición especificada
por origen. La variable origen puede tomar tres valores:
Ejemplo
1libstd/ejemplo_fseek.c
math.h
Cos, cosl
Sintaxis:
#include <math.h>
Descripción:
Cos computa el coseno del valor de la entrada. El ángulo se especifica en los radianes.
Cosl es la versión doble larga; toma un argumento doble largo y devuelve un resultado doble largo.
El Valor de retorno:
pow, powl
Sintaxis:
#include <math.h>
Descripción:
Powl es la versión larga doble; toma argumentos dobles y regresa un resultado doble largo.
El Valor de retorno:
A veces los resultados dados son grandes o son incalculables. Cuando el resultado es correcto pero grandes o incalculables
las funciones devuelven HUGE_VAL (pow) or _LHUGE_VAL (powl).
Los resultados de magnitud excesivamente grande pueden causar el errno inconstante global para ser puesto a
Error que maneja para estas funciones puede modificarse a través de las funciones _matherr y _matherrl.
sqrt, sqrtl
Sintaxis:
#include <math.h>
Descripción:
Sqrtl es la versión larga doble; toma argumentos dobles y regresa un resultado doble largo. Error que maneja para estas
funciones puede ser modificadas a través de las funciones _matherr y _matherrl.
Esta función puede usarse con los bcd y tipos del complejo.
El Valor de retorno:
Si el programa esta bien, sqrt y sqrtl devuelven el valor calculado, la raíz cuadrada de x. Si x es real y positivo, el
resultado es positivo. Si x es real y negativo, el retorno será inconstante global se pone a EDOM (Error de Dominio).
6.6 math.h
6.6.0.1 ceil
6.6.0.2 cos
Coseno de x en radianes.
6.6.0.3 exp
Exponencial de x, .
6.6.0.4 fabs
double fabs(double x);
Valor absoluto de x, .
6.6.0.5 floor
6.6.0.6 log
6.6.0.7 log10
6.6.0.8 pow
6.6.0.9 sin
6.6.0.10 sqrt
6.6.0.11 tan
conio.h
Declara varias funciones usadas llamando la consola del sistema operativo las rutinas de I/O.
Clrscr
Sintaxis:
#include <conio.h>
void clrscr(void);
Descripción:
clrscr aclara el texto de la actual y lugares del cursor en la esquina izquierda superior o en la posición (1,1).
El Valor de retorno:
Ninguno.
Clreol
Sintaxis:
#include <conio.h.>
void clreol(void);
Descripción:
clreol aclara todos los caracteres donde el cursor se posicione hasta el fin de la línea dentro de la ventana de texto actual,
sin mover el cursor.
El Valor de retorno:
Ninguno.
Gotoxy
Sintaxis:
#include <conio.h>
void gotoxy(int x
int y);
Descripción:
Posiciona el cursor en la ventana del texto.
Gotoxy mueve el cursor a la posición dada en la ventana del texto actual. Si las coordenadas no son valías entonces la
función gotoxy se ignora. Un ejemplo de esto es si gotoxy(40,30) cuando (35,25) es la correcta posición del fondo de la
ventana. Ningún argumento de gotoxy puede ser el cero.
El Valor de retorno:
Ninguno.
Switch
Sintaxis:
default : <statement>;
Descripción:
Use la declaración switch para pasar el mando a un caso que empareja el <el interruptor inconstante>. A que el punto las
declaraciones que siguen el caso emparejando evalúa.
Si ningún caso satisface la condición que el caso predefinido evalúa. Evitar evaluar cualquier otro caso y abandonar el
mando del interruptor, termine cada caso break.