1. REPÚBLICA BOLIVARIANA DE VENEZUELA
MINISTERIO DEL PODER POPULAR PARA LA EDUCACIÓN
UNIVERSIDAD FERMIN TORO.
CABUDARE-ESTADO LARA.
EL LENGUAJE C
Estudiante
María Gabriela Castillo
CI: 24162676
Introducción a la computación
Saia A
30/07/2016
2. El lenguaje C es uno de los lenguajes de programación
estructurada más utilizados en nuestros días. El principal componente
estructural de C es la función. En C, las funciones son bloques en los
cuales ocurren las actividades de un programa. Esto nos permite
separar los programas en tareas, lo que nos conduce a la programación
modular.
El lenguaje de programación C fue creado por Dennis
Ritchie entre 1969 y 1973 cuando trabajaba en Bell Laboratorios de
AT&T junto con Ken Thompson en el diseño del sistema operativo UNIX.
C fue creado para poder escribir dicho sistema operativo en un lenguaje
de alto nivel, independiente del hardware donde se ejecutara. Contar
con un lenguaje de alto nivel permitió el avance de los sistemas
operativos, ya que el mismo código podía ser utilizado en las distintas
plataformas, propiciando la reutilización de código y reduciendo los
tiempos de desarrollo. Así es que los sistemas operativos basados en
UNIX, el sistema BSD, el sistema GNU/Linux y muchos otros fueron
desarrollados en C. Este lenguaje ha sido estrechamente ligado al
sistema operativo UNIX, puesto que fueron desarrollados
conjuntamente. Sin embargo, este lenguaje no está ligado a ningún
sistema operativo ni a ninguna máquina concreta. Se le suele llamar
lenguaje de programación de sistemas debido a su utilidad para escribir
compiladores y sistemas operativos, aunque de igual forma se puede
desarrollar cualquier tipo de aplicación. Además, con el paso del tiempo
se han desarrollado cientos de bibliotecas que permiten a los
programadores de C utilizar el código desarrollado por otros para la
realización de tareas comunes. Esto, a su vez, ha propiciado el
desarrollo de aplicaciones en lenguaje C. En 1978 Kernighan y Ritchie
publican su descripción en el libro "The C Programming Language",
versión que es llamada hoy en día 'K&R C'. Este libro se suele llamar
entre los programadores “La biblia del C”, existen varias ediciones, en
las universidades suele ser el libro principal de la bibliografía. A
mediados de los ochenta ya había en el mercado numerosos
compiladores C, y muchas aplicaciones habían sido rescritas a él para
aprovechar sus ventajas. Durante este periodo fabricantes introducen
mejoras en el lenguaje, las cuales son recogidas por un comité de
estandarización ANSI y establecen las especificaciones de lo que se
conoce hoy en día como 'ANSI C'. El C se encuentra en la jerarquía de
lenguajes en un nivel intermedio entre Pascal y el Ensamblador.
Pretende ser un lenguaje de alto nivel con la versatilidad del bajo nivel.
3. En 1980 Bjarne Stroustrup de los laboratorios Bell de Murray Hill, New
Jersey, adiciono 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 aumente las posibilidades de la programación bajo nuevos
conceptos. Con la posibilidad de las microcomputadoras se crearon
muchas implementaciones de C. Sin embargo, como no existía ningún
estándar, aparecieron discrepancias. Para remediar la situación, 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 es imposible contar la cantidad de aplicaciones y
herramientas desarrolladas en C.
Uno de los objetivos de diseño del lenguaje C es que sólo sean
necesarias unas pocas instrucciones en lenguaje máquina para traducir
cada elemento del lenguaje, sin que haga falta un soporte intenso en
tiempo de ejecución. Es muy posible escribir C a bajo nivel de
abstracción; de hecho, C se usó como intermediario entre diferentes
lenguajes. En parte a causa de ser de relativamente bajo nivel y de
tener un modesto conjunto de características, se pueden desarrollar
compiladores de C fácilmente. En consecuencia, el lenguaje C está
disponible en un amplio abanico de plataformas (más que cualquier
otro lenguaje). Además, a pesar de su naturaleza de bajo nivel, el
lenguaje se desarrolló para incentivar la programación independiente de
la máquina. Un programa escrito cumpliendo los estándares e
intentando que sea portátil puede compilarse en muchos computadores.
C se desarrolló originalmente (conjuntamente con el sistema
operativo Unix, con el que ha estado asociado mucho tiempo) por
programadores para programadores. Sin embargo, ha alcanzado una
popularidad enorme, y se ha usado en contextos muy alejados de
la programación de software de sistema, para la que se diseñó
originalmente. Entre sus principales características podemos mencionar
1.-Tiene un conjunto completo de instrucciones de control.
2.-Permite la agrupación de instrucciones.
3.-Incluye el concepto de puntero (variable que contiene la dirección de
otra variable).
4.-Los argumentos de las funciones se transfieren por su valor.
4. 5.- E/S no forma parte del lenguaje, sino que se proporciona a través de
una biblioteca de funciones.
6.-Permite la separación de un programa en módulos que admiten
compilación independiente.
Originalmente el Lenguaje C estuvo muy ligado al sistema
operativo UNIX como se había mencionado antes que, en su mayor
parte, está escrito en C. Más adelante se comenzó a utilizar en otros
sistemas operativos para programar editores, compiladores, etc. Aunque
se le conoce como un lenguaje de programación de sistemas, no se
adapta mal al resto de aplicaciones. De hecho, hoy en día un alto
porcentaje de software para ordenadores personales está escrito en
Lenguaje C. Por ejemplo, el sistema operativo MS-DOS. Algunas de las
características más importantes que definen el lenguaje y que han
permitido que sea tan popular, como lenguaje de programación son:
Tamaño pequeño, Uso extensivo de llamadas a funciones, Comandos
breves (poco tecleo), Lenguaje estructurado, Programación de bajo nivel
(nivel bit), Implementación de apuntadores - uso extensivo de
apuntadores para la memoria, arreglos, estructuras y funciones.
Aunque la lista de las características útiles de las que carece C es larga,
este factor ha sido importante para su aceptación, porque escribir
rápidamente nuevos compiladores para nuevas plataformas, mantiene
lo que realmente hace el programa bajo el control directo del
programador, y permite implementar la solución más natural para cada
plataforma. Ésta es la causa de que a menudo C sea más eficiente que
otros lenguajes. Típicamente, sólo la programación cuidadosa en
lenguaje produce un código más rápido, pues da control total sobre la
máquina, aunque los avances en los compiladores de C y la complejidad
creciente de los microprocesadores modernos han reducido
gradualmente esta diferencia. Todo programa escrito en C consta de
una o más funciones, una de las cuales se llama main. El programa
siempre comenzará por la ejecución de la función main. Cada función
debe contener:
Una cabecera de la función, que consta del nombre de la función,
seguido de una lista opcional de argumentos encerrados con
paréntesis.
Una lista de declaración de argumentos, si se incluyen estos en la
cabecera.
5. Una sentencia compuesta, que contiene el resto de la función.
Para la estructura del lenguaje C los argumentos son símbolos que
representan información que se le pasa a la función desde otra parte
del programa. (También se llaman parámetros a los argumentos). Cada
sentencia compuesta se encierra con un par de llaves, {.....}. Las llaves
pueden contener combinaciones de sentencias elementales
(denominadas sentencias de expresión) y otras sentencias compuestas.
Así las sentencias compuestas pueden estar anidadas, una dentro de
otra. Cada sentencia de expresión debe acabar en punto y coma (;). Los
comentarios pueden aparecer en cualquier parte del programa,
mientras estén situados entre los delimitadores /*................ */ (por
ejemplo: /*esto es un ejemplo*/). Los comentarios son útiles para
identificar los elementos principales de un programa o simplemente
para orientar a un posible usuario de ese código. Todo programa en 'C'
consta de una o más funciones, una de las cuales se llama main. El
programa comienza en la función main, desde la cual es posible llamar
a otras funciones. Cada función estar formada por la cabecera de la
función, compuesta por el nombre de la misma y la lista de argumentos
(si los hubiese), la declaración de las variables a utilizar y la secuencia
de sentencias a ejecutar.
Encabezamiento
main( )
{
variables locales
sentencias
}
f1( )
{
variables locales
sentencias
}
...
...
...
fn( )
{
variables locales
sentencias
}
6. Uno de los procedimientos más comunes y útiles en el
procesamiento de datos, es la ordenación de los mismos. Se considera
ordenar al proceso de reorganizar un conjunto dado de objetos en una
secuencia determinada (patrón de arreglo). El objetivo de este proceso
generalmente es facilitar la búsqueda de uno o más elementos
pertenecientes a un conjunto.
Como ejemplos de conjunto de datos ordenados tenemos:
Meses del año (ordenados de 1 al 12).
Listado de estudiantes (ordenados alfabéticamente).
Guías Telefónicas (ordenadas por País/por región/por sector/por
orden alfabético)
La ordenación, tanto numérica como alfanumérica, sigue las mismas
reglas que empleamos nosotros en la vida normal. Esto es, un dato
numérico es mayor que otro cuando su valor es más grande, y una
cadena de caracteres es mayor que otra cuando esta después por orden
alfabético.
Los métodos de ordenación, pueden agruparse en dos grandes grupos:
Los internos: Es cuando los datos están disponibles en un área de la
memoria principal, como cuando se leen un conjunto de datos desde
el teclado.
Los externos: Los datos están guardados en un medio externo, como
puede ser un fichero, una base de datos, etc. En donde los datos
están alojados en el disco duro u otro medio físico.
En este sección explicaremos solo tres modos de ordenamiento, los mas
usados como son:
Algoritmo de Ordenamiento Burbuja (Buble Sort)
Algoritmo de Ordenamiento Insercion
Algoritmo de Ordenamiento Quick Sort
7. Método de Burbuja (Bubble Sort)
El método de ordenamiento de burbuja, es un algoritmo que se aplica
para poder ordenar una cantidad de datos ya sea de forma ascendente o
descendente.
Es el algoritmo más fácil de implementar, pero a cambio pagamos un
alto precio en procesamiento, ya que este método evalúa una cantidad
los datos muchas veces y en ocasiones innecesariamente (como por
ejemplo cuando son iguales).
A estas alturas posiblemente ya tengas conocimiento de sencillos pasos
para ordenar datos, como por ejemplo, Determinar cual es el mayor o
menor de dos números, pues aplicando este método podremos ordenar
array, estructuras y cualquier tipo de dato NO atómico (es decir que se
pueda dividir)
Este libro trata de programación en C, entonces a continuación nos
aplicamos a esto:
Este metodo necesita de lo siguiente para implementarse:
Un array o estructura que ordenar (>1 elemento).
Dos variables contadoras de ciclos (i,j por ejemplo).
Una variable temporal (para almacenar un dato momentaneamente).
Dos ciclos y un Condicional...
....
//DE MENOR A MAYOR (Ascendente)
#define Nelementos 4
....
int i,j; //Variables contadoras del ciclo.
int lista[Nelementos]={6,9,3,1}; //Declaracion e inicializacion
de un arreglo de 4 elementos.
int temp=0; //Variable temporal.
for (i=1;i<Nelementos;i++)
{
8. for (j=0; j <= Nelementos-1 ;j++) // for(j=0; j <
Nelementos-1; j++) es menor y no menor igual
{
if (lista[j] > lista[j+1])//Condicion mayor-menor
{
temp=lista[j];
lista[j]=lista[j+1];
lista[j+1]=temp;
}
}
}
//Para cambiar el modo de ordenamiento solo debemos
cambiar la condicion < ó >
'''<big>Explicando un poco lo que dice el codigo
tenemos:</big>'''
# Iniciamos i a 1, de esta forma correremos el ciclo
solamente 3 veces. Asi evitamos correr ciclos
innecesariamente.
# El segundo for, se ejecutara 3 veces por cada primer ciclo.
# La condicion nos dice:
* Si, el valor de lista 0 es mayor al valor de lista 1, es decir
* '''Si, 6 > 9''', pero como la condicion no se cumple, pasamos
del ciclo y '''J=1'''.
* Si, el valor de lista 1 es mayor al valor de lista 2, es decir
* '''Si, 9 > 3''', como es '''verdadera''' hacemos:
# Guardamos momentaneamente en la variable temporal el
valor de lista 1, es decir 9.
# En la posicion de lista 1, guardamos el valor de lista 2, es
decir 3.
# En la posicion de lista 2, guardamos el valor de temp, es
decir 9
'''Volvemos''' nuevamente '''al ciclo''', ahora '''J=2'''...
* Si, el valor de lista 2 es mayor al valor de lista 3, es decir
* Si, '''9 > 1''', (recuerda que anteriormente '''movimos''' al 9 a
la posicion de 3), es verdadera =>
# Guardamos momentaneamente en la variable temporal el
valor de lista 2, es decir 9.
# En la posicion de lista 2, guardamos el valor de lista 3, es
decir 1.
9. # En la posicion de lista 3, guardamos el valor de temp, es
decir 9.
De esta forma el ciclo se repite hasta que todos los datos se
hallan movido. Como veras hasta ahora solo hemos estado
moviendo el 9. Tu lista se veria asi:
* ''Original:'' 6 '''9''' 3 1
:* ''1er Mov:'' 6 3 '''9''' 1
:* ''2do Mov:'' 6 3 1 '''9'''
Si bien ya esta mas ordenada que la original, aun falta
bastante, pero recuerda que estábamos en el primer ciclo del
primer for (i).
'''Acá te dejo como serán los demás movimientos:'''
* ''Segundo Ciclo i:''
:* 3 6 1 9
:* 3 1 6 9
* ''Tercer Ciclo i:''
:* 1 3 6 9
:* YA!
En un principio, pensaba no presentarles las variaciones
que hay de este algoritmo, pero revisando en varios libros me
percate de que aunque es el mismo algoritmo y funciona de
la misma forma (con sus ventajas y desventajas), Creo que
es preferible mostrarselos para evitar confusiones y enredos
innecesarios.
== Variantes ==
Buscando en varios libros e Internet me he encontrado
numerosas variantes, y por motivos pedagógicos voy a
mostrarlos, ya que considero que aunque sean el mismo
algoritmo, su diferente implementacion puede llevar a
confusiones.
En lo personal considero que el algoritmo planteado al
principio es el que mejor se expresa (entiende), y es el que
recomiendo implementar, pero hay libros que lo
implementan de otra forma, por lo que los que se guían con
10. el, pueden tener confusiones a la hora de apoyarse con este
libro.
==== Variante: 1 Ciclo. ====
Aunque en realidad usa dos ciclos un while y un for, el
while hace la función de nuestro primer for. Sin embargo la
demás implementaciones son técnicamente las mismas, solo
que en vez de usar una variable ya preparada (j en nuestro
caso), este evalúa con la variable i.
Variante: Restar
Esta es una de las más usuales que he visto en los libros, folletos y
otros. Todo es igual, pero cambian las condiciones, de esta forma se
trabaja a la inversa de nuestro algoritmo.
Ejemplos
El algoritmo burbuja esta preparado para correr con todo tipo de datos
NO atómicos, es por esto que no importa si el arreglo es de tipo char,
int, float, etc. Funcionara con sus respectivas modificaciones. El
siguiente ejemplo ordenara una lista de tamaño 6, que esta ordenada.
Recuerden como buena práctica:
Definir las variables en un solo punto del código.
Definir el tamaño del array como constante.
Usar la indentacion correspondiente (Tabulaciones).
//Realizado por Master crack cocaino
//UNAN-LEON Nicaragua.
#include <stdio.h>
#define TAM 6
11. int main()
{
int lista[TAM]={12,10,5,6,1,3}; //Declaracion e Inicializacion de un
array
int temp=0; //Variable temporal
int i,j; //variables corredoras del ciclo
printf("La lista DESORDENADA es: n");
for (i=0;i<TAM;i++)
printf("%3d",lista[i]); //impresion de la lista con espacio de 3 lineas
(%3d)
for (i=1;i<TAM;i++)
{
for (j=0;j<TAM-1;j++)
{
if (lista[j] > lista[j+1]) //condicion
{
temp = lista[j]; //temp guarda
momentaneamente el valor de lista[j]
lista[j]=lista[j+1]; //Asigno al la posicion lista[j],
lo que hay en lista[j+1]
lista[j+1]=temp;//obtendra un nuevo valor por
parte de temp.
}
}
}
printf("nLos valores ORDENADOS de lista son: n");
for(i=0;i<TAM;i++)
printf("%3d",lista[i]);
return 0;
}
//Revisado por: Gustavo A. Chavarria.
//UNAN-LEON Nicaragua
12. Método de Inserción
Este método se podría decir que es algo superior al método de la
burbuja, ya que logra evaluar menos veces la condición. Sin embargo
aun es un algoritmo muy pobre y que utiliza recursos técnicamente
igual que el algoritmo burbuja.
Concepto
El algoritmo consiste en ordenar los dos primeros elementos de la
matriz, luego se inserta el tercer elemento en la posición correcta con
respecto a los dos primeros, a continuación se inserta el cuarto
elemento en la posición correcta con respecto a los tres primeros
elementos ya ordenados y así sucesivamente hasta llegar al ultimo
elemento de la matriz.
Explicación
Ejemplos
Método QuickSort
Es el ultimo método del que hablaremos en este libro, es el algoritmo
que mas calidad tiene, pudiendo llegar a lo mismo que el método
burbuja e inserción, mas rápido y con uso de menos recursos.
Concepto
El ordenamiento rápido (quicksort en inglés) es un algoritmo basado en
la técnica de divide y vencerás. Esta es probablemente la técnica más
rápida conocida. Fue desarrollada por Tony Hoare en 1960.
La idea del algoritmo es simple, se basa en la división en particiones de
la lista a ordenar, por lo que se puede considerar que aplica la técnica
divide y vencerás. El método es, posiblemente, el más pequeño de
código, más rápido, más elegante, más interesante y eficiente de los
algoritmos de ordenación conocidos.
13. Explicación
El método se basa en dividir los n elementos de la lista a ordenar en dos
partes o particiones separadas por un elemento: una partición
izquierda, un elemento central denominado pivote o elemento de
partición, y una partición derecha. La partición o división se hace de tal
forma que todos los elementos de la primera sublista (partición
izquierda) son menores que todos los elementos de la segunda sublista
(partición derecha). Las dos sublistas se ordenan entonces
independientemente. Para dividir la lista en particiones (sublistas) se
elige uno de los elementos de la lista y se utiliza como pivote o elemento
de partición. Si se elige una lista cualquiera con los elementos en orden
aleatorio, se puede seleccionar cualquier elemento de la lista como
pivote, por ejemplo, el primer elemento de la lista. Si la lista tiene algún
orden parcial conocido, se puede tomar otra decisión para el pivote.
Idealmente, el pivote se debe elegir de modo que se divida la lista
exactamente por la mitad, de acuerdo al tamaño relativo de las claves.
Una vez que el pivote ha sido elegido, se utiliza para ordenar el resto de
la lista en dos sublistas: una tiene todas las claves menores que el
pivote y la otra, todos los elementos (claves) mayores que o iguales que
el pivote (o al revés). Estas dos listas parciales se ordenan
recursivamente utilizando el mismo algoritmo; es decir, se llama
sucesivamente al propio algoritmo quicksort. La lista final ordenada se
consigue concatenando la primera sublista, el pivote y la segunda lista,
en ese orden, en una única lista. La primera etapa de quicksort es la
división o «particionado» recursivo de la lista hasta que todas las
sublistas constan de sólo un elemento. El algoritmo es éste:
Recorres la lista simultáneamente con i y j: por la izquierda con i
(desde el primer elemento), y por la derecha con j (desde el último
elemento).
Cuando lista[i] sea mayor que el elemento de división y lista[j] sea
menor los intercambias.
Repites esto hasta que se crucen los índices.
14. El punto en que se cruzan los índices es la posición adecuada para
colocar el elemento de división, porque sabemos que a un lado los
elementos son todos menores y al otro son todos mayores (o habrían
sido intercambiados). Al finalizar este procedimiento el elemento de
división queda en una posición en que todos los elementos a su
izquierda son menores que él, y los que están a su derecha son
mayores.
El primer objetivo de un programa informático es el manejo de
datos. Un dato es toda aquella información que se puede tratar en un
programa informático. Existen unos datos de entrada y unos datos de
salida. Los datos de entrada se manipulan en el programa produciendo
unos datos de salida.
Un dato dentro de un programa se caracteriza por llevar asociado un
identificador, un tipo y un valor. Hay dos clases de tipos de datos: tipos
fundamentales y tipos derivados. Hablaremos de los tipos de datos
fundamentales.
Tipo entero: representa números enteros con o sin signo, que estarán
compuestos por los dígitos del 0 al 9, pudiendo ser precedidos por los
signos + o -.
Algunos ejemplo de datos enteros son: 0, 23, -176, -1, etc.
Para definir variables en C se antepone la palabra reservada del tipo al
identificador de la variable. El tipo de datos entero se define en el
lenguaje de programación C por la palabra reservada int.
Para definir un tipo de dato en C se escribe lo siguiente:
int nombre_variable = valor;
No es necesario que la variable tenga un valor predeterminado. Se
puede definir sin asignarle ningún valor.
15. Si tenemos varios datos que son del mismo tipo, se pueden definir todas
en la misma línea de código escribiendo un único int, separando el
nombre de las variables por “,”. Una vez que se haya acabado de definir
variables, se cierra la línea de código con “;”,
Por ejemplo: int edad = 24;
int edad;
int edad, num, contador;
Tipo real: Se emplean para representar números reales (con decimales).
Para definir datos reales se antepone la palabra reservada float al
identificador de la variable.
float identificador = valor;
Por ejemplo: float numero1, numero2;
float numero3 = 123.43;
float numero3;
Tipo carácter: Este tipo de datos se emplea para representar un carácter
perteneciente a un determinado código utilizado por el ordenador
(normalmente el código ASCII).
Para representar este tipo de dato se antepone la palabra reservada
char al identificador de la variable.
Char identificador = ‘valor’;
Una constante tipo char se representa como un solo carácter encerrado
entre comillas simples.
Por ejemplo: char letra, letra2;
char letra=’a’;
16. Tipo cadena de caracteres: una cadena de caracteres es un número de
caracteres consecutivos (incluso ninguno) encerrado entre unos
delimitadores determinados, que en el lenguaje C son las comillas
dobles.
Para definir variables de tipo cadena, estas se definen como vectores de
caracteres, esto es, anteponiendo la palabra reservada char al
identificador de la variable, y después entre corchetes la longitud
máxima de cadena.
Char identificador[cantidad] = “ mensaje ”;
Por ejemplo: char cadena[20];
char cadena[20] = “Hola mundo”;
char cadena[] = “HOLA”;
En la siguiente tabla se hace un resumen de los distintos tipos de
datos:
Los operadores relacionales, también denominados operadores binarios
lógicos y de comparación, se utilizan para comprobar la veracidad o
falsedad de determinadas propuestas de relación (en realidad se trata
Tipo de dato Palabra reservada Ejemplo
Entero Int Int numero=0;
Real Float Float numero=12.2;
Carácter Char Char letra = ‘a’;
Cadena de carácter Char Char palabra[10] = “HOLA”;
17. respuestas a preguntas). Las expresiones que los contienen se
denominan expresiones relacionales. Aceptan diversos tipos de
argumentos, y el resultado, que es la respuesta a la pregunta, es
siempre del tipo cierto/falso, es decir, producen un resultado booleano
(3.2.1b)
Si la propuesta es cierta, el resultado es true (un valor distinto de cero),
si es falsa false (cero). C++ dispone de los siguientes:
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
== Igual que (identidad)
!= Desigual que (desigualdad)
Sintaxis
expresión-relacional <>
expresión-relacional > shift-expresion
expresión-relacional <= shift-expresion
expresión-relacional >= shift-expresion
expresión-de-igualdad == expresión-relacional
expresión-de-igualdad != expresión-relacional
Comentario
Como puede verse, todos ellos son operadores binarios (utilizan dos
operandos), de los cuales, dos de ellos son de igualdad: == y !=, y sirven
para verificar la igualdad o desigualdad entre valores aritméticos o
punteros. Estos dos operadores pueden comparar ciertos tipos de
punteros, mientras que el resto de los operadores relacionales no
pueden utilizarse con ellos.
Observe que los operadores == y != tienen una menor precedencia que
el resto de los operadores relacionales < y >, <= y >=.
18. El operador de desigualdad != tiene otra forma estándar de designación
mediante la palabra clave not_eq (4.9.8)
Cualquiera que sea el tipo de los operandos, por definición, un operador
relacional, produce un bool (true ofalse) como resultado, aunque en
determinadas circunstancias puede producirse una conversión
automática de tipo a valores int (1 si la expresión es cierta y 0 si es
falsa).
Ejemplo de comprobación:
#include
int main() {
float f = 12.1, g = 12.2;
cout << "Tipo: " <<>
Salida
Tipo: bool
Condiciones
En las expresiones relacionales E1 E2, los operandos deben cumplir
alguna de las condiciones siguientes:
1. E1 y E2 son tipos aritméticos.
2. E1 y E2 son punteros a versiones cualificadas o no cualificadas
de tipos compatibles.
3. Uno de ellos es un puntero a un objeto, mientras que el otro es
un puntero a una versión cualificada o no cualificada de void.
4. Uno de los dos es un puntero, mientras que el otro es un puntero
nulo constante.
Cuando se trata de tipos definidos por el usuario (que no cumplen las
condiciones anteriores) estos operadores pueden ser sobrecargados de
forma que puedan ser utilizados con dichos tipos (4.9.18b1).
19. Precauciones
Con el operador de igualdad
Las expresiones relacionales de igualdad son frecuentísimas en la
programación. En multitud de ocasiones se comparan dos expresiones y
se toma una decisión en función del resultado cierto / falso obtenido.
Por ejemplo, la condición de la sentencia de iteración while(4.10.3)
puede ser una expresión relacional de igualdad:
int x = 1; y = 2;
...
while (x == y ) {
cout << "Son iguales..." <<>
Es muy frecuente que, tanto el principiante, como el programador
acostumbrado a otros lenguajes, donde el operador de asignación y el
de igualdad son distintos a los utilizados en C++ (por ejemplo := y =),
confundan el operador de igualdad == con el de asignación =. Es este
caso, el código anterior sería escrito erróneamente:
while (x = y ) {
cout << "Son iguales..." <<>
El resultado es que el bucle se ejecuta mientras sea y != 0, ya que la
expresión asigna y a x, y el resultado es cierto mientras que x sea
distinto de cero.
Los operadores Lógicos son muy utilizados en informática, lógica
proposicional y Algebra Booleana , entre otras disciplinas. Los
operadores lógicos nos proporcionan un resultado a partir de que se
cumpla o no una cierta condición. Esto genera una serie de valores que,
en los casos más sencillos, pueden ser parametrizados con los valores
numéricos 0 y 1, como se puede apreciar en los ejemplos de abajo. La
combinación de dos o más operadores lógicos conforma una función
lógicos.
Los más sencillos son (nótese su relación con los operadores
relacionales):
Operador NO-lógico: '¬A' significa todo lo que no es A'
Operador Y-lógico: 'A ∧ B' significa 'A y B a la vez';
resultando FALSO (0) si no se cumple y VERDADERO (1) si
sí lo hace.
20. Operador O-lógico: 'A ∨ B' significa 'O bien A, o bien B, o
bien los dos'; resultando FALSO (0) si no se dan ni A ni B y
VERDADERO (1) si se da alguno de los dos o los dos a la
vez.
Operador =: 'A = B' significa 'A debe ser igual a B';
resultando FALSO (0) si esto no es así y VERDADERO (1) en
caso contrario.
Operador <: 'A <>
Los operadores más complejos se construyen a partir de los
anteriores (podría incluirse alguno más) y ya entran dentro de lo
que sería una función lógica. Un ejemplo muy utilizado sería 'SI
(condición;A;B)' ('IF condición THEN A ELSE B' en la mayoría de
los lenguajes de programación) cuyo resultado sería A si se
satisface la 'condición' o B en caso contrario.
Ejemplo: Habiendo declarado las variables:
En pseudocódigo:
entero r = 2, s = 9, t = 8
En lenguaje C:
int r = 2, s = 9, t = 8;
se puede escribir
En pseudocódigo:
no( r = s o r <= t )
En lenguaje C:
!( r == s || r <= t )
La expresión se evalúa a
En pseudocódigo:
falso (actúan en orden los operadores: (<=), (==), (||) y (!))
En lenguaje C:
0 (C simula el valor lógico falso con el valor entero 0)
21. Los operadores Aritméticos Comprenden las cuatro operaciones
básicas, suma, resta, multiplicación y división, con un agregado, el
operador módulo. Los operadores aritméticos existentes en C son,
ordenados de mayor a menor precedencia:
Los operadores ++, -- y % solo pueden usarse con datos de tipo int o
char. El operador incremento (++), incrementa en una unidad el valor
de la variable sobre la que se aplica, el operador decremento (--),
decrementa en una unidad el valor de la variable, y el operador módulo
(%), calcula el resto de una división de dos variables de tipo entero o
carácter. Un aspecto que conviene explicar es el hecho de que los
operadores incremento y decremento pueden preceder o posceder a su
operando, lo cual permite escribir, si x es una variable de tipo int, las
expresiones ++x o x++. Usado de forma aislada no presenta ninguna
diferencia, sin embargo, cuando se usa en una expresión existe una
diferencia en el orden de ejecución del mismo. Cuando el operador
incremento (o decremento) precede al operando, C primero realiza el
incremento (o decremento), y después usa el valor del operando,
realizándose la operación al contrario si el operador poscede al
operando.
Así, considérense el siguiente código de un programa:
int var1=10,var2;
var2=++var1; /* Pone 11 en var2, pues primero incrementa var1,*/
/* y luego asigna su valor a var2 */
22. Mientras que el siguiente código funciona de forma distinta:
int var1=10,var2;
var2=var1++; /* Pone 10 en var2, pues primero asigna su valor */
/* a var2, y luego incrementa var1 */
Los operadores por Asignación el lenguaje C, a diferencia de otros
lenguajes tales como Pascal, no diferencia la asignación de cualquier
otro operador del lenguaje. Para C, la asignación es un operador, el
llamado operador asignación (=), el cual posee la prioridad más baja de
todos los operadores. Es por ello que en C podemos escribir expresiones
del tipo:
if ((c=a*b)<0) /* if es la comprobación condicional de C, que */
/* se vera con posterioridad */
Esta expresión asigna a la variable c el valor de a*b y devuelve su valor
para compararlo con el valor constante 0. Los paréntesis son necesarios
pues el operador asignación tiene la prioridad mas baja de todos los
operadores.
Para terminar podríamos dar como conclusión donde 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 portable, 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
23. -Ensambladores
-Compiladores
-Administradores de bases de datos.
Actualmente, debido a sus características, puede ser utilizado para todo
tipo de programas.
Para poder leer y escribir datos en el lenguaje de programación C
existen una serie de funciones agrupadas en un conjunto de librerías de
código objeto, que constituyen la llamada biblioteca estándar del
lenguaje. En el caso concreto de las funciones de entrada y salida
(lectura y escritura), su archivo de cabecera es stdio.h.
Existen varias funciones que realizan la entrada y salida de datos en el
lenguaje de programación C, pero nos vamos a centrar solamente en
dos de ellas: printf() y scanf().
Funcion printf()
La función printf() sirve para escribir datos en la pantalla con un
formato determinado.
El prototipo de esta función es la siguiente:
int printf(const char *formato, arg1, arg2, …, argn)
donde:
formato: hace referencia a una cadena de caracteres que contiene
información sobre el formato de salida.
Arg1, arg2, …, argn: argumentos que representan los datos de salida
La cadena de control puede constar de hasta tres tipos de información:
- texto: que será mostrado por pantalla tal cual este escrito
- Secuencias de escape: secuencias reservadas propias del
lenguaje. Van precedidas por '' y las más importantes son 'n' que
introduce un salto de línea, y 't' que introduce un tabulador.
- Especificadores de formato: son ciertos caracteres precedidos del
carácter tanto por ciento '%'.
A continuación se muestra una tabla con estos especificadores de
formato dependiendo del tipo de dato a los que representan:
24. Tipo de dato Especificadores de
formato
Comentario
Int %d Entero con signo
Float %f Real con signo
Char %c carácter
Char [n] %s Cadena de caracteres
Ejemplos:
printf(“n Valores: %d, %f”, entero, real);
Salida por pantalla:
(Retorno de carro)Valores: 2, 2.3
printf(“%st%dn%f”, concepto, num, coste);
Salida por pantalla:
Cremallera 1234
12.345
Función scanf()
La función scanf() se pude considerar de alguna manera como la inversa
de la función printf(), pues sirve para introducir datos desde el teclado
con un formato determinado.
El prototipo de esta función es el siguiente:
int scanf(const char *formato, arg1, arg2, …, argn);
donde:
formato: hace referencia a una cadena de caracteres
(cadena de control) que contiene información sobre el formato
de los datos que se van a introducir mediante el teclado.
arg1, arg2, …, argn: son los argumentos que representan
los datos de entrada.
La cadena de control puede constar de:
Especificadores de formato, que son ciertos caracteres
precedido por el carácter tanto por ciento '%'.
Caracteres de espacio
Otros caracteres no espacios, para entradas con formato
A continuación se muestra una tabla con estos especificadores de
formato dependiendo del tipo de dato a los que representan:
25. Tipo de dato Especificadores de
formato
Comentario
Int %d Entero con signo
Float %f Real con signo
Char %c carácter
Char [n] %s Cadena de caracteres
Ejemplos:
scanf(“%d”, numero);
scanf(“%d %s %f”, numero, &cadena, &real);