temarioanacleto2
- Home
- Contacto
- Introduccion
- Apagado de la PC
- Encendido de la PC
- Conceptos Basicos
- Vocabulario
- Construccion
- Posicionpc
- Usoteclado
- Usoraton
- Sistema Operativo
- Internet
- Presentaciones
- Procesador de Textos
- Ambiente Windows
- Cuidados del PC
- Movie Maker
- Canal de YOUTUBE
- Virus-Antivirus-Vacunas
- Respaldo de Informacion
- Disenio Grafico
- Grabadora-Audacity-Avidemux
- Codigo HTML
- Hoja de Calculo
- Base de Datos
- LenguajeDEVC
- Programacion desde CERO
- FundaPrograma
- DFD
- PSeint
- VisualBasic
- Gambas
- Lineamiento Conceptos Basicos
- Lineamientos Internet
- Lineamientos Excel
- Lineamiento Audacity
- Lineamiento Movie Maker
- Lineamientos Scratch
- Paginas S-N Visibles
LenguajeDEVC
DEV C ++Los lenguajes de programación utilizan juegos de caracteres “alfabeto” para comunicarse con las computadoras. Las primeras computadoras solo utilizaban informaciones numéricas digitales mediante el código o alfabeto digital, y los primeros programas se escribieron en este tipo de código, denominado código maquina basado en los dígitos 0 y 1, por ser entendible por la maquina (computadora). La enojosa tarea de programar en código maquina hizo que el alfabeto evolucionase y los lenguajes de programación comenzaran a utilizar códigos o juegos de caracteres similares al utilizado en los lenguajes humanos. Así, Hoy día la mayoría de las computadoras trabajan con diferentes tipos de juegos de caracteres de los que destacan el código ASCII y el EBCDIC.
De este modo, una computadora a través de los diferentes lenguajes de programación utiliza un juego o código de caracteres que serán fácilmente interpretados por la computadora y que puedan ser programados por el usuario.
Al igual que los lenguajes humanos, tales como el inglés o el español, los lenguajes de programación poseen una estructura (gramática o sintaxis) y un significado (semántica). La gramática española trata de los diferentes, modos (reglas) en que pueden ser combinados los diferentes tipos de palabras para formar sentencias o frases aceptables en español. Los lenguajes de computadoras tienen menos combinaciones aceptables que los lenguajes naturales, sin embargo, estas combinaciones deben de ser utilizadas correctamente; ello contrasta con los lenguajes naturales que se pueden utilizar aunque no sigan reglas gramaticales e incluso aunque no sean comprendidos.
Finalmente, un lenguaje de programación lo definiremos, como un conjunto de reglas, símbolos y palabras espaciales que permiten construir un programa.
Los lenguajes de programación ocupan una posición intermedia entre los lenguajes naturales humanos y los precisos lenguajes de máquina.
Gracias a la progresiva complejidad de los lenguajes traductores que permiten convertir las instrucciones de un lenguaje de programación al lenguaje de máquina, la programación puede usar lenguajes de computación que se parecen cada vez más a los lenguajes naturales.
LENGUAJES DE PROGRAMACION
Un lenguaje de programación consiste en un conjunto de órdenes o comandos que describen el proceso deseado. Cada lenguaje tiene sus instrucciones y enunciados verbales propios, que se combinan para formar los programas de cómputo.
Los lenguajes de programación no son aplicaciones, sino herramientas que permiten construir y adecuar aplicaciones.
Existen muchos tipos de lenguajes de programación con características y aptitudes muy diferenciadas. Todo ello se encuentra en dos grandes grupos:
1 lenguajes maquina
2 lenguajes simbólicos
Entre los primeros se encuentran los denominados lenguajes en código máquina. En estos lenguajes, la codificación de estos lenguajes se hace utilizando un lenguaje binario de ceros y unos, que son los únicos símbolos que puede entender cualquier computador. Cada sistema físico tiene su código maquina distinta por lo que un programa escrito en un determinado código maquina solo vale para un sistema físico.
A los lenguajes maquina les sucedieron, los lenguajes simbólicos los cuales utilizan caracteres naturales para escribir las instrucciones de los programas. Los lenguajes simbólicos se dividen en:
* Lenguajes simbólicos de bajo nivel (ensambladores).
** Lenguajes simbólicos de alto nivel
Dentro de los segundos se distinguen a su vez los lenguajes procedurales y los relacionales.
Lenguaje procedural: es aquel lenguaje de programación en el que hay que señalar tanto lo que se quiere hacer como el modo de hacerlo. Los lenguajes de tercera generación son de tipo procedural.
Lenguaje relacional: es aquel lenguaje programación en el que solo hay que especificar lo que se quiere obtener, sin necesidad de especificar a su vez el camino a seguir para obtener los resultados deseados. Estos lenguajes son de muy alta productividad en desarrollo pero muy ineficientes en ejecución.
La diferencia entre uno y otro es que los primeros exige que se diga tanto lo que se quiere hacer como la forma en la que hay que hacerlo mientras que los relacionales solo exigen que se diga lo que se quiere hacer, pero no es necesario que se exprese el camino para realizarlo.
A medida que se va subiendo de nivel los lenguajes son más sencillos y más productivos en desarrollo, pero en contra partida son menos eficientes a la hora de su ejecución.
Los programas escritos en lenguajes simbólicos se denominan programas fuentes y los programas no son directamente ejecutables, su ejecución implica su previa traducción a código máquina para obtener los denominados programas objeto o absolutos. Esta traducción se hace a través de los ensambladores, compiladores o intérpretes, a los lenguajes que de forma genérica se les denomina procesadores de lenguajes.
A los lenguajes maquina se les conoce como primera generación.
A los ensambladores se les conoce como de segunda generación.
A los simbólicos de alto nivel de tipo procedural se denomina tercera generación.
A los relacionales se les denomina de cuarta generación.
A la tercera generación pertenecen los lenguajes conocidos como: FOLTRAN, COBOL, RPG, BASIC, PL1, SIMULA, ALGOL, PASCAL, ADA, C, LISP, PROGOL, etc. Estos lenguajes de tercera generación son de tipo universal.
Lenguaje C++
C++ es un lenguaje de programación, creado a mediados de 1980 por Bjarne Strousstrup,
Como extensión del lenguaje C. Este lenguaje abarca tres paradigmas de la programación:
1. Programación Estructurada
2. Programación Genérica
3. Programación Orientada a Objetos
En la actualidad, C++ es un lenguaje versátil, potente y general. Su ´éxito entre los
Programadores le ha llevado a ocupar el primer puesto como herramienta de desarrollo de
Aplicaciones, ya sea en Windows o GNU Linux, que es el sistema operativo en el cual basaremos
Este tutorial.
C++ en un entorno Linux
Comenzaremos diciendo que los programas se pueden escribir en cualquier editor de textos
De GNU, entre ellos se encuentran emacs, vim, kate, gedit, nan, guardando dichos archivos
Con extensión .cpp, los cuales serán compilados en GNU/Linux utilizando el compilador GNU
De C++, llamado gcc que puede compilar C, C++, y que además se apega al estándar ANSI,
Permitiendo la portabilidad de estos códigos. Dicho compilador se invoca con el comando
gcc.
INTERPRETACION
En cualquier lenguaje de programación que se escriba un programa, este debe ser traducido a lenguaje maquina antes de que pueda ser ejecutado. Esta conversión de instrucciones de alto-nivel a, instrucciones a nivel maquina se hace por programas de software del sistema, denominados compiladores e intérpretes. Estos programas especiales se denominan en general traductores.
El proceso de traducción y conversión en programa objeto difiere según que el programa sea compilador o interprete.
COMPILADORES
Es un programa que traduce el programa fuente (conjunto de instrucciones de un lenguaje de alto nivel por ejemplo lenguaje C) a programa objeto (instrucciones en lenguaje máquina que la computadora puede interpretar y ejecutar). El compilador efectúa solo la traducción, no ejecuta el programa. Una vez compilado el programa, el resultado en forma de programa objeto será directamente ejecutable.
INTERPRETES
Los lenguajes de programación además de ser compilados pueden ser interpretados. Un intérprete es un programa que procesa los programas escritos en un lenguaje de alto nivel, sin embargo, está diseñado de modo que no exista independencia entre la etapa de traducción y la etapa de ejecución. Un intérprete traduce cada instrucción o sentencia del programa escrito en un lenguaje “X” a código maquina e inmediatamente se ejecuta, y a continuación se ejecuta la siguiente sentencia. Ejemplo de intérprete son las versiones de BASIC.
El intérprete está diseñado para trabajar con la computadora en modo convencional o interactivo, en realidad se le dan órdenes al procesador a través del intérprete con ayuda, por ejemplo de un teclado y un programa denominado editor. El procesador ejecuta la orden una vez que esta es traducida, si no existe ningún error de sintaxis y se devuelve el control al programador con indicación de mensajes (error de sintaxis o error de ejecución)).
El intérprete no traduce todo el programa fuente en un solo paso, sino que ejecuta cada instrucción de programa fuente antes de traducir y ejecutar la siguiente sentencia u orden.
ELEMENTOS DEL LENGUAJE
Un programa en C++ es una secuencia de caracteres que se agrupan en componentes léxicos (tokens) que comprenden el vocabulario básico del lenguaje. Estos componentes de léxico son:
** Palabras reservadas
** Identificadores
** Constantes
** Constantes de cadena
** Operadores y signos de puntuación.
CARACTERES
Los caracteres que se pueden utilizar para construir elementos del lenguaje (componentes léxicos o tokens) son:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
+ - * / = ( ) { } [ ] < > ´ ” ! @ =/ $ ^ & % - : . , ; ? \
caracteres espacio (blancos y tabulaciones).
Los identificadores (nombres de variables, constantes, etc.) deben comenzar con una letra del alfabeto (mayúscula o minúscula) o con un carácter subrayado y pueden tener uno o más caracteres. Los caracteres segundo y posteriores pueden ser letras, dígitos o un subrayado, no permitiéndose caracteres no alfanuméricos ni espacios.
test_prueba //legal
X123 //legal
multi_palabra //legal
var25 //legal
15var //no legal
C++ es sensible a las mayúsculas. Las letras mayúsculas y minúsculas se consideran diferentes
Paga_mes es un identificador distinto a paga_mes
Buena práctica de programación aconseja utilizar identificadores significativos que ayudan a documentar un programa.
nombre apellidos salario precio_neto
Edad Longitud Altura Salario_Mes
PALABRAS RESERVADAS EN C++
Las palabras reservadas o claves no se pueden utilizar como identificadores, debido a su significado estricto en C++; tampoco se pueden redefinir.
Palabras reservadas de ANSI/ISO C++
asm* default for new* sizeof typedef
auto delete* friend* operator* static typename
bool* do goto private* struct unión
break double if protected* switch unsigned
case else inline* public* template* using
catch* enum int register this* virtual*
char explicit* long return throw* void
class* extern mutable* short true* volatile*
const false* namespace* signed try* while
continue float
* Estas palabras no existen en C ANSI
Los diferentes compiladores comerciales de C++ pueden incluirademás, nuevas palabras reservadas. Estos son los casos de Borland, Microsoft y Symantec.
CONSTANTES C++
contiene constantes para cada tipo de dato simple (integer, char, etcétera). Las constantes pueden tener tres sufijos, u, l y f, que indican tipos unsigned, long y float, respectivamente. Asimismo, se pueden añadir los prefijos o y ox que representan constantes octales y hexadecimales.
456 0456 Ox456 //constantes enteras: decimal, octal,hexadecimal
1231 123ul //constantes enteras: long, unsigned,long
'B' 'b' '4' //constantes tipo char
3.1415f 3.14159L //constantes reales de diferente posición
“cadena de caracteres” //constante de cadena
Las cadenas de caracteres se encierran entre comillas, y las constantes de un solo carácter se encierran entre comillas simples.
“ ” //cadena vacía, '\0'
Una constante literal es un valor escrito directamente en el programa siempre que se necesite. Por ejemplo,
int miEdad = 25;
miEdad es una variable de tipo int; 25 es una constante literal.
CONSTANTES DE PROGRAMACION.
|
#define const;
|
|
const tipo_de_dato nombre_de_la_constante = valor_de_la_constante;
|
Al igual que las variables las constantes solo pueden declararse con números, letras y guión bajo, con la restricción de que esta no puede comenzar con un número.
|
#include<iostream> |
¿Que es una variable?
una variable es un espacio en la memoria, en el cual el programador asigna un valor determinado por el tipo de dato que el lenguaje de programación va soportar, para declararla es necesario saber que tipo de dato la contiene.
es representada por un nombre que es asignado por el programador, y se nombra justo después de su tipo de dato, los siguientes son los tipos de datos esenciales:
int; es numérico sirve para números enteros sin punto decimal (1,2,3,4.. )
float; es numérico y sirve para números con parte fraccionaria, es decir con punto decimal ( 1.2, 1.3, 1.4, ….)
char; es de tipo carácter y cadena de caracteres, es decir que puedes asignar desde una letra, símbolo o numero hasta una palabra o serie de caracteres ( a, 2, !, &, hola, etc.)
bool; es de tipo verdadero o falso, este tipo de dato mostrara en pantalla un “1” en caso de ser true o “0” en caso de ser false.
Como declarar una variable en lenguaje de programación C++
primero como ya dijimos antes se especifica el tipo de dato, después se nombra, y si se asigna un valor debe ir después de un signo de igualdad (” = “) , si se van a declarar varias variables solo se separan con comas (” , “) dentro de la misma linea del tipo de dato especificado y al finalizar escribir punto y coma (” ; “). ejemplos:
Ejemplos de asignación de contenidos son estos:
Declaración
|
Ejemplo asignación contenidos
|
int A;
|
A = 123;
|
float A;
|
A = - 3323.57;
|
char A;
|
A = 'p';
|
char A;
|
A = '1';
|
int salario;
|
salario = 30500;
|
float salario;
|
salario = 30500;
|
int A, B, suma;
|
A = 5 + 2;
B = 32;
suma = A + B; [suma valdrá 39]
|
int A, B, C, D, E;
|
A = 5;
B = 32;
C = A * B; [C toma el valor 160]
D = A + C; [D toma el valor 165]
E = D; [E toma el valor 165]
|
int agotamiento;
|
agotamiento = 0; [Usamos un entero para simular un booleano]
|
¿Qué es un OPERADOR?
“Un operador es un elemento de programa que se aplica a uno o varios operandos en una expresión o instrucción. Los operadores que requieren un operando, como el operador de incremento se conocen como operadores unarios.
Los operadores que requieren dos operandos, como los operadores aritméticos (+,-,*,/) se conocen como operadores binarios. Un operador, el operador condicional (?:), utiliza tres operandos y es el único operador ternario de C++” .
Existen 6 tipos de operadores según sufunción, que son aritméticos, relacionales, deasignación, lógicos, de dirección y demanejo de Bits.
OPERADORES DE ASIGNACIÓN
“Tal y como su nombre lo indica, este tipo de operadores permiten la asignación de un valor especifico a una variable. En C++se encuentran disponibles los siguientes operadores:
Operador
|
Acción
|
Ejemplo
|
Resultado
|
||
=
|
Asignación Básica
|
X = 6
|
X vale6
|
||
*=
|
Asigna Producto
|
X
|
*=
|
5
|
X vale 30
|
/=
|
Asigna División
|
X
|
/=
|
2
|
X vale3
|
+=
|
Asigna Suma
|
X
|
+=
|
4
|
X vale 10
|
-=
|
Asigna Resta
|
X
|
-=
|
1
|
X vale5
|
%=
|
Asigna Modulo
|
X
|
%=
|
5
|
X vale1
|
<<=
|
Asigna Desplazamiento Izquierda
|
X
|
<<=
|
1
|
X vale 12
|
>>=
|
Asigna Desplazamiento Derecha
|
X
|
>>=
|
1
|
X vale3
|
&=
|
Asigna AND entre Bits
|
X
|
&=
|
1
|
X vale0
|
^=
|
Asigna XOR entre Bits
|
X
|
^=
|
1
|
X vale7
|
|=
|
Asigna ORentre Bits
|
X
|
|=
|
1
|
X vale7
|
Todos ellos son operadores binarios, de los cuales, “=” es el único de asignación simple, los demás son operadores de asignación compuestos, puesto que están conformados por más de un símbolo, por ejemplo “+=” se compone del operador “+“ y el operador “=“.
Los seis primeros aceptan operandos de distinto tipo, mientras que los cinco últimos: <<=, >>=, &=, ^= y |=, implican manejo de bits, por lo que sus operandos deben ser numero int en sus distintas variantes. El funcionamiento de estos operadores se encuentra descrito en la sección de operadores de bits.
La parte izquierda (que tiene que ser una variable no constante) adquiere el valor señalado en la expresión de la derecha, pero se mantiene el tipo original de la variable de la parte izquierda. En caso necesario se realiza una conversión de tipo (con pérdida de precisión en su caso) del izquierdo al derecho.
Es necesario resaltar que el operador C++ de asignación simple (=) se distingue de otros lenguajes como Pascal que utilizan el símbolo := para este operador. Observe también que la asignación simple (=) utiliza un símbolo distinto del operador relacional de igualdad (==)”. Además, en los operadores compuesto no debe haber espacios de la forma “+=” y que el igual siempre va a la derecha del resto de operandos.
OPERADORES ARITMÉTICOS
Operador Acción Ejemplo Resultado
|
|
-
|
Resta X = 5 - 3 X vale2
|
+
|
Suma X = 5 + 3 X vale8
|
*
|
Multiplicación X = 2 * 3 X vale6
|
/
|
División X = 6 / 3 X vale2
|
%
|
Módulo X = 5 % 2 X vale1
|
--
|
Decremento X = 1; X-- X vale0
|
++
|
Incremento X = 1; X++ X vale2
|
La operación modulo corresponde a obtener el residuo de la división, de modo que al dividir 5 entre 2 tendremos como resultado 2 y como residuo 1, por tanto 5 % 2 corresponde al 1 que sobra de la división exacta.
Es necesario hacer una observación acerca de los operadores de incremento y decremento, ya que dependiendo de su ubicación con respecto a la variable, se tienen acciones diferentes. Si el operador precede a la variable, se conoce como pre-incremento o pre-decremento y se dice que el operador está en su forma prefija. Por el contrario, si el operador esposterior a la variable se encuentra en la forma posfija y se lel lama pos-incremento o pos-decremento según el caso.
“Cuando un operador de incremento o decremento precede a su variable, se llevará a cabo la operación de incremento o de decremento antes de utilizar el valor del operando”, tal y como se muestra en el siguiente ejemplo:
En el caso de los post-incrementos y post-decrementos pasa lo contrario: se utilizará el valor actual del operando y luego se efectuará la operación de incremento o decremento”.
Tal y como se presentó anteriormente, también existen o peradores para los punteros, sin embargo estos solo aplican para aquellos apuntadores a matrices, arreglos o listas de elementos, y aunque se muestran a continuación, se explicaran de una mejor forma en el material de apuntadores opunteros en c++.
Operador Acción Ejemplo
|
|
-
|
Desplazamiento descendente pt1 - n
|
+
|
Desplazamiento ascendente pt1 + n
|
-
|
Distancia entre elementos pt1 - pt2
|
--
|
Desplazamientodescendente de1 elemento pt1--
|
++
|
Desplazamiento ascendente de1 elemento pt1++
|
OPERADORES RELACIONALES
“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 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.
Si la propuesta es cierta, el resultado es true (un valor distinto de cero), si es falsa será false (cero). C++ dispone de los siguientes operadores relacionales:
Operador Relación Ejemplo Resultado
|
||
<
|
Menor
|
X = 5; Y = 3; X vale 5 if(x< y)x+1; Y vale 3
|
>
|
Mayor
|
X = 5; Y = 3; X vale 6 if(x> y)x+1; Y vale 3
|
<=
|
Menor o igual
|
X = 2; Y = 3; X vale 3 if(x<= y) x+1; Y vale 3
|
>=
|
Mayor o igual
|
X = 5; Y = 3; X vale 6 if(x>= y) x+1; Y vale 3
|
==
|
Igual
|
X = 5; Y = 5; X vale 6 if(x== y) x+1; Y vale 5
|
¡=
|
Diferente
|
X = 5; Y = 3; X vale 5 if(x¡= y) y+1; Y vale 4
|
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.
Cualquiera que sea el tipo de los operandos, por definición, un operador relacional, produce un bool (true o false) como resultado, aunque en determinadas circunstancias puede producirse una conversión automática de tipo a valores int (1 si la expresiónes cierta y 0 si es falsa).
En las expresiones relacionales E1 <operador> E2, los operandos deben cumplir alguna de las condiciones siguientes:
· E1 y E2 son tipos aritméticos.
· E1 y E2 son punteros a versiones cualificadas o no cualificadas de tipos compatibles.
· 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.
· Uno de los dos es un puntero, mientras que el otro es un puntero nulo constante.
OPERADORES LÓGICOS
“Los operadores lógicos producen un resultado booleano, y sus operandos son también valores lógicos o asimilables a ellos (los valores numéricos son asimilados acierto o falso según su valor sea cero o distinto de cero). Por el contrario, las operaciones entre bits producen valores arbitrarios.
Los operadores lógicos son tres, dos de ellos son binarios y el último (negación) es unario:
Operador Acción Ejemplo Resultado
|
||
&&
|
AND Lógico A &&B
|
Si ambos son verdaderos se obtiene verdadero(true)
|
||
|
OR Lógico A ||B Verdaderosi algunoes verdader
|
|
!
|
Negación Lógica !A Negación de a
|
AND lógico
Devuelve un valor lógico true si ambos operandos son ciertos. En caso contrario el resultado es false. La operatoria es como sigue: El primer operando (de la izquierda) es convertido a bool. Para ello, si es una expresión, se evalúa para obtener el resultado (esta computación puede tener ciertos efectos laterales). A continuación, el valor obtenido es convertido a bool cierto/falso siguiendo las reglas de conversión estándar.Si el resultado es false, el proceso se detiene y este es el resultado,sin que en este caso sea necesario evaluar la expresión de la derecha (recuérdese que en el diseño de C++ prima la velocidad).
Si el resultado del operando izquierdo es cierto, se continúa con la evaluación de la expresión de la derecha, que también es convertida a bool. Si el nuevo resultado es true,entonces el resultado del operador es true. En caso contrario el resultado es false.
El valor m,que es interpretado como un puntero al primer elemento de la matriz, es transformado a un bool. Como es distinto de cero (no es un puntero nulo) el resultado es cierto. A continuación, el valor x es convertido también a bool. En este caso la conversión produce falso, con lo que este es el resultado del paréntesis de la sentencia if”.
OR Lógico
Este operador binario devuelve true si alguno de los operandos es cierto. En caso contrario devuelve false. Este operador sigue un funcionamiento análogo al anterior. El primer operando (izquierdo) es convertido a bool. Para ello, si es una expresión, se evalúa para obtener el resultado (esta computación puede tener ciertos efectos laterales). Acontinuación el valor obtenido es convertido a bool cierto/falso siguiendo las reglas de conversión estándar. Si el resultado es true, el proceso se detiene y este es el resultado, sin que en este caso sea necesario evaluar la expresión de la derecha (recuérdese que en el diseño de C++ prima la velocidad).
Si el resultado del operando izquierdo es false, se continúa con la evaluación de la expresión de la derecha, que también es convertida a bool. Si el nuevo resultado es true, entonces el resultado del operador es true. En caso contrario el resultado es false.
Negación Lógica
Este operador es denominado también No lógico y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el código). El operando (que puede ser una expresión que se evalúa a un resultado) es convertido a tipo bool, con lo que solo puede ser uno de los valores cierto/falso. Acontinuación el operador cambia su valor; Si es cierto es convertido a falso y viceversa.
Resulta por tanto, que el resultado de este operador es siempre un tipo bool, aunque al existir una conversión estándar por la que un cero es convertido a false, y cualquier valor distinto de cero a true, coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0. En otras palabras: este operador devuelve cierto (true) sila expresión se evalúa a distinto de cero,en caso contrario devuelve falso (false).
Si “E” es una expresión, “!E” es equivalente a “(0==E)”. Como consecuencia, las expresiones que siguen son equivalentes dos a dos:
STDIO.H
Que significa "estándar entrada / salida " encabezado, es la encabezamiento en el C biblioteca estándar que contiene macro definiciones, constantes, y las declaraciones de funciones y tipos usados para la entrada de varios estándar y operaciones de salida. La funcionalidad que desciende de un "portátil / paquete de O ", escrita por Mike Leks en los Laboratorios Bell en la década de 1970. C + +, por razones de compatibilidad, incluye stdio.h así como un encabezado equivalentes en lo esencial, stdio, Que declara la stdio.h funciones y tipos dentro de la std espacio de nombres.
Las funciones declaradas en stdio.h son muy populares, ya que como parte de la biblioteca estándar de C, Se garantiza que funcione en cualquier plataforma que soporte aplicaciones de C. sobre una plataforma en particular puede , sin embargo, tienen razones para usar la plataforma de I / O rutinas , en lugar de la stdio.h rutinas.
Los programadores tienen que incluir la stdio.h cabecera en el código fuente para poder usar las funciones declaradas en el mismo:
Ejemplo:
# Include <stdio.h>
Int principal (vacío)
{
Int ch;
Mientras que ((ch = getchar ())! = FEO)
putchar (ch);
putchar ('\ n');
Volver 0;
}
conio.h
Es una C archivo de cabecera utilizado en la antigua MS- DOS compiladores para crear interfaces de usuario de texto. No se describe enEl lenguaje de programación C libro, y no es parte de la librería estándar de C, ISO C ni es requerido por POSIX.
Este encabezado declara varias funciones útiles para realizar la colección de " consola de entrada y salida "de un programa. La mayoría de los compiladores de C que se dirigen a DOS, Windows 3.x, Phar Lap, Dosx, OS / 2O Win3 tienen esta cabecera y el suministro de las funciones de librería asociada en la librería de C por defecto. La mayoría de los compiladores de C que se dirigen a UNIX y Linux No cuentan con el encabezado y no proporcionan las funciones de librería.
Funciones miembro
kbhit int (void ): |
Determina si una tecla del teclado fue presionado. |
int getch (void ): |
Lee un carácter directamente desde la consola sin tampón, y sin eco. |
getche int (void ): |
Lee un carácter directamente desde la consola sin tampón, pero con eco. |
ungetch int (int c ): |
Pone el carácter c de nuevo en el buffer del teclado. |
cgets char * ( char * buffer ): |
Lee una cadena directamente desde la consola. |
cscanf int ( char * formato , arg0 , argn ... ): |
Lee formato valores directamente desde la consola. |
Putch int (int c ): |
Escribe un carácter directamente a la consola. |
cputs int (string const char *): |
Escribe una cadena directamente a la consola. |
La iostream
Cómo usar #include en C y C++
La directiva de preprocesador #include se usa en los lenguajes C y C++para “incluir” las declaraciones de otro fichero en la compilación. Esta directiva no tiene más misterio para proyectos pequeños. En cambio, puede ayudar aprovechar bien esta directiva en proyectos con un gran número de subdirectorios.
El efecto de #include
Cuando el preprocesador encuentra una línea #include "fichero", entonces reemplaza esta línea por el fichero incluido. Así procede con todas las directivas de inclusión – también en aquellas anidadas en los fichero ya a su vez incluidos. Es decir, existe un sólo fichero grande tras la precompilación.
No obstante, esta unión de varios ficheros no tiene lugar físicamente. Lo que sucede es que se interrumpe la compilación del fichero actual, se compila el fichero incluido y, tras compilarlo, se continúa con el primero. Por eso, el compilador puede decirnos, en qué fichero tuvo lugar un error de compilación.
En cambio, conviene tener esta idea del fichero único en mente, porque a veces ayuda a encontrar errores. Uno muy típico es olvidarse el punto y coma tras la declaración de una clase.
En este caso hay una declaración de clase en el fichero incluido:
class MiClase {}
|
1
2
|
#include "mi_clase.h"
MiClase miInstancia;
|
En este ejemplo, el compilador se quejará de que aquí no se puede definir un nuevo tipo en la línea de MiClase miInstancia aunque esta línea es correcta. El error verdadero es la falta del ; en el fichero incluido. Lo que el compilador realmente ve es
class MiClase {} MiClase miInstancia;
|
|
{
int
|
|
void main(void)
#include "fichero_incluido"
a;
}
|
|
void main(void)
{
int
a;
}
|
Lo habitual es posicionar las inclusiones al inicio de cada fichero. Esto tiene sentido, porque se suele requerir declaraciones básices antes de declarar clases más complejas. Mi lugar preferido en los ficheros de cabecera es tras el guardián de inclusión múltiple.
1
2
3
4
5
6
7
|
// Guardian de inclusión múltiple
#ifndef FICHERO_YA_INCLUIDO
#define FICHERO_YA_INCLUIDO
#include "declaraciones_basicas.h"
#endif
|
Así se evita que un compilador poco sofisticado abre otra vez el mismo conjunto de ficheros cuando se inluye un fichero de cabecera dos o más veces.
En los ficheros de definición (los .c o .cpp), los guardianes de inclusión múltiple no hacen falta. No obstante, puede haber una restricción importante cuando se usan cabeceras precompiladas. En este caso, todos los ficheros fuente deben incluir primero el mismo fichero de cabecera – que es aquello que define la cabecera precompilada. El compilador de C++ de Borland permite varios ficheros de cabecera para la definición de una cabecera precompilada. Estas inclusiones deben ser lor primeros ficheros incluidos y se deben incluir en el mismo orden.
Puede darse el caso de no poner las inclusiones en el inicio de un fichero. Esto es frecuente en los fichero que se podrían denominar “programados en directivas de precompilación”. Normalmente se trata de ficheros de cabeceras con definiciones muy básicas como ajustes a la plataforma empleada. Por ejemplo, en medio de un fichero “definiciones_basicas.h” puede haber unas líneas
1
2
3
4
5
6
7
8
9
|
#if PLATAFORMA_ES_LINUX
#include "funcionalidad_gratis.h"
#elif PLATAFORMA_ES_MICROSOFT_WINDOWS
#include "funcionalidad_cara.h"
#elif PLATAFORMA_ES_APPLE
#include "funcionalidad_muy_cara.h"
#else
#error Esta plataforma no está soportada
#endif
|
La directiva #include existe en dos versiones. En una se pone el nombre de fichero entre comillas, en la otra entre paréntesis angulares (el signo menor y mayor como “comillas”).
1 2 |
#include "fichero_con_comillas.h" #include <fichero_entre_menor_y_mayor.h> |
La versión con los paréntesis angulares busca los ficheros en todos los directorios que se han especificado en la llamada al compilador – normalmente con la opción “-I”. Estos directorios se suelen rastrear por el fichero incluido en el orden en que aparecen en la línea de comando.
Cuando se incluye un fichero entre comillas, entonces el compilador busca este fichero primero en el mismo directorio que el fichero actualemente compilado y después en los demás directorios. Es decir, la versión con comillas se diferencia de la versión con paréntesis angulares únicamente por buscar primero en el directorio del fichero compilado. Tras no encontrarlo ahí actúa igual.
Esto muchas veces no es ninguna diferencia, ya que se suelen especificar todos los directorios en la línea de comando del compilador. Así no se suele dar el caso que se puede incluir un fichero con comillas pero no con paréntesis angulares.
Más significativo es el comportamiento ante ficheros con el mismo nombre en distintos directorios. En este caso la versión con comillas da preferencia sobre el fichero en el mismo directorio y esto suele ser el mejor acertado. Aunque sea preferible nombrar ficheros de forma única en un proyecto, es posible que no se pueda evitar tener dos ficheros con el mismo nombre cuando se incluyen varias bibliotecas de terceros.
De ahí se puede deducir que es imperativo incluir cabeceras de la misma biblioteca con comillas. De esta forma se puede asegurar que las cabeceras de una biblioteca se incluyan entre si aunque haya otros con el mismo nombre en uno de los directorios especificados en la línea de comandos.
Además, incluir con comillas puede dar al programador un significado adicional: que este fichero está bajo la custodia de mi equipo de desarrollo. Las cabeceras incluidas con paréntesis angulares son de bibliotecas de terceros. Los primeros ficheros puedo modificar si hace falta, los segundos no.
El orden de las inclusiones
El orden de las directivas #include no importa cuando todos los identificadores del programa son únicos. No obstante, a veces no lo son yconviene generar el error “este identificador ya existe” en nuestro código y no en el código de una biblioteca estándar.
Esto se consigue incluyendo primero las caberas de terceros. Si aparece un error de identificador doble, entonces aparece en la segunda definición – que es la nuestra – y ahí podemos cambiar el nombre del objeto sin problema.
En proyectos realmente grandes puede haber varias bibliotecas de distintas dependencias. Por la misma razón de generar los errores de identificadores dobles en el código más fácilmente modificable, conviene incluir las bibliotecas más básicas primero. Dentro del mismo nivel podemos ordenar los ficheros incluidos de forma alfabética. Esto ayuda a encontrar inclusiones que faltan o sobran.
El siguiente código muestra una secuencia de inclusiones para un fichero “definicion_de_mi_clase.cpp”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// Primero se debe incluir la cabecera de precompilación
#include "cabecera_de_precompilacion.h"
// Segundo, incluir la cabecera correspondiente
// a este fichero de implementación.
// Esto deja más claro, que es la
// clase que se implementa aquí.
#include "definicion_de_mi_clase.h"
// A continuación inclusiones de la biblioteca estándar.
// Se usan paréntesis angulares.
#include <vector>
// Inclusiones de otras bibliotecas de terceros
#include <wx.h>
#include <gl.h>
// Inclusiones de subbibliotecas básicas de
// mi proyecto con comillas
#include "mis_definiciones_basicas.h"
// Luego las demás inclusiones de mi proyecto
#include "clases_auxiliares.h"
#include "más_definiciones_para_mi_clase.h"
|
1
|
std::cout << "Hola mundo";
|
1
|
using namespace std;
|
1
2
3
4
5
6
7
8
9
|
#include <iostream>
usging namespace std;
int main()
{
cout << "Hola mundo";
return 0;
}
|
[ ] ( ) { } , ; : ... * = # ! % ^ & – + | ~ \ ' " < > ? . /
char ch, str[] = "Cadena de caracteres";
int mat[3][4]; // Matriz de 3 x 4
ch = str[3]; // cuarto elemento
d = c * (a + b); // modifica la precedencia normal
if (d == z) ++x; // imprescindible en la sentencia if
for (x =1; x<10; x++) // imprescindible en la sentencia for
func(); // señala llamada a función
int func(); // declara función
int (*fptr)(); // declara puntero a función
fptr = func; // asigna valor al puntero.
Observe que en el último caso, la ausencia de paréntesis equivale a &func
Se recomienda el uso de paréntesis en las macro-definiciones para evitar problemas potenciales en la expansión. Por ejemplo:
#define CUBO(x) ((x) * (x) * (x))
Un bloque es una sentencia compuesta, se trata de una sucesión (que puede estar vacía) de sentencias delimitadas por un par de corchetes { }.
Dentro de las posibilidades de memoria, los bloques pueden ser anidados a cualquier nivel (profundidad).
Después del corchete de cierre} no se necesita el punto y coma; de fin de sentencia
if (statement)
{...}; // punto y coma ilegal !!
else
Nota: las llaves sirven también en C++ para otros usos distintos de la pura delimitación de bloques de código. Por ejemplo, en la definición de estructuras, uniones y clases, en cuyo caso si puede ser necesaria la inclusión del punto y coma después de la llave de cierre}.
void func(int n, float f, char ch);
La coma se usa también como un operador en las expresiones con coma. Es posible mezclar los dos usos (separador en lista de parámetros y operador), pero deben usarse paréntesis para distinguirlos.
a + b; // evalúa a + b, descarta el resultado
++a; // efecto lateral en 'a', se descarta el valor ++a
; // expresión vacía = sentencia nula
El punto y coma se usa a veces para crear sentencias nulas:
for (i = 0; i < n; i++)
{
; // sentencia nula (hacer nada)
}
comienzo: x=0; // comienzo es la etiqueta
goto comienzo;
Se utilizan en las relaciones de argumentos formales de las funciones, cuando estas pueden aceptar un número variable de argumentos o pueden ser de tipo variable. Por ejemplo:
void func(int n, char ch,...);
Este prototipo de función declara que func está definida de modo que debe ser llamada con, al menos, dos argumentos: un int y un char. Además puede tener un cierto número de argumentos adicionales (puede omitirse la coma antes de la elipsis).
Se utiliza también para indicar que un manejador de excepciones ("handler") puede capturar una excepción de cualquier tipo.
Ejemplos:
char* char_ptr; // declara puntero a carácter
x = *int_ptr; // operador de indirección
l = 2 * 3.14 * r; // operador multiplicación
char array[5] = { 1, 2, 3, 4, 5 };
Recordemos que, al contrario que en C, donde las declaraciones no pueden estar precedidas por ningún código, deben ir al principio, en C++, las declaraciones de cualquier tipo pueden aparecer en cualquier punto del código (con algunas restricciones).
En la lista de argumentos de una función, el signo igual indica el valor por defecto para un parámetro:
int f(int i = 0) { ... } // el valor por defecto de k es cero
El signo igual es también utilizado como operador de asignación
Ejemplo:
x = y;
z += 5;
Ejemplos de directivas de preproceso:
# (null directive)
#define NULO \0
#include <stdio.h>
Una de las cosas importantes de C que debes recordar es que es Case Sensitive (sensible a las mayúsculas). Es decir que para C no es lo mismo escribir Printf que printf.
Conviene indicar también que las instrucciones se separan por ";".
VARIABLES Y TIPOS DE DATOS.
Una variable es un espacio de memor´ıa reservado en el ordenador para contener valores que pueden cambiar durante la ejecucio´n de un programa. Los tipos que se le asignen a estas determinan co´mo se manipular´a la informaci´on contenida en ellas.
Cada variable necesita un identificador que la distingue de las dema´s. Un identificador v´alido es una secuencia de una o m´as letras, d´ıgitos o guiones bajos, recordando que no deben coincidir con palabras reservadas del lenguaje, deben comenzar por una letra y adem´as tomar en cuenta que C++ hace diferencia entre mayu´sculas y minu´sculas.
Las variables que se pueden presentar en un programa son de los siguientes tipos:
1.Variables Locales. Se definen solo en bloque en el que se vayan a ocupar, de esta manera evitamos tener variables definidas que luego no se utilizan.
2.Variables Globales. No son lo m´as recomendable, pues su existencia atenta contra la comprensio´n del coodigo y su encapsulamiento.
3. Variables Est´aticas. Se tienen que inicializar en el momento en que se declaran, de manera obligatoria.
Ahora hablemos de los tipos de datos que reconoce C++. Estos definen el modo en que se usa el espacio (memoria) en los programas. Al especificar un tipo de datos, estamos indicando al compilador como crear un espacio de almacenamiento en particular, y tambi´en como manipular este espacio. Un tipo de dato define el posible rango de valores que una variable puede tomar al momento de ejecucio´n del programa y a lo largo de toda la vida u´til del propio programa.
Los tipos de datos pueden ser predefinidos o abstractos. Un tipo de dato predefinido es intr´ınsecamente comprendido por el compilador. En contraste, un tipo de datos definido por el usuario es aquel que usted o cualquier otro programador crea como una clase, que comu´nmente son llamados tipos de datos abstractos.
Los tipos de datos m´as comunes en C++ son:
Tipo de Dato
unsigned char
|
Espacio en Memoria
8bits
|
Rango
0a255
|
char
|
8bits
|
-128a127
|
shortint
|
16bits
|
-32,768a32,767
|
unsigned int
|
32bits
|
0a4,294,967,295
|
int
|
32bits
|
-2,147,483,648a2,147,483,647
|
unsigned long
|
32bits
|
0a4,294,967,295
|
enum
|
16bits
|
-2,147,483,648a2,147,483,647
|
long
|
32bits
|
-2,147,483,648a2,147,483,647
|
float
|
32bits
|
3.4x10-38a3.4x10+38(6dec)
|
double
|
64bits
|
1.7x10-308a1.7*10+308(15dec
|
longdouble
|
80bits
|
3.4x10-4932a1.1x10+4932
|
void
|
sinvalor
|
|
Ejemplo:
El formato para declarar un array multidimensionales:
|
|
Las funciones printf y scanf proporcionan un marco general para mostrar y pedir datos de distintos tipos. En el caso de datos de tipo cadenas de caracteres (coloquialmente Strings) C dispone de instrucciones específicas que simplifican la codificación: puts() y gets(). La función puts recibe un único argumento: la cadena de caracteres a mostrar por pantalla.
#include <stdio.h>
#include <stdlib.h> // Ejemplo aprenderaprogramar.com int main() { char url [] = "https://www.aprenderaprogramar.com"; printf ("%s\n", url) ; puts (url); return 0; } |
#include <stdio.h>
#include <stdlib.h> // Ejemplo aprenderaprogramar.com int main() { char frase [100]; printf ("Escriba una frase") ; gets (frase); puts ("Frase introducida:"); puts (frase); return 0; } |
gets se diferencia de scanf en que scanf sólo captura una cadena de texto hasta que aparece el primer espacio o fin de línea (desechando todo lo que venga a continuación). De este modo si tratamos de capturar con scanf el texto “Amanece un maravilloso día aquí en Alaska” lo único que capturaremos es “Amanece”, perdiéndose el resto del texto. En cambio con gets se captura todo el texto. Tanto con scanf como con gets se introduce automáticamente un fin de cadena (\0) al final del texto capturado (de ahí que un array de caracteres siempre tenga un carácter adicional además del texto visible, el correspondiente al final de cadena.)
Modifica el programa anterior usando scanf ("%s",frase); en lugar de gets (frase) y comprueba las diferencias cuando introduces frases con espacios intermedios.
Muchas veces no se usan puts y gets porque las funciones printf y scanf son más generales, pero para el tratamiento de cadenas de texto en general resultan ventajosas las instrucciones específicas por la comodidad que aportan.
FUNCIONES
Cuando es necesario escribir programas complicados para resolver problemas complejos, una práctica común entre los programadores es descomponer el algoritmo (el diagrama de flujo) envarias partes. Cada una de éstas partes puede codificarse en forma independiente en la forma de subprogramas. Así, habrá un cierto número de subprogramas que se encargan derealizar sólo parte de las tareas requeridas para resolverel problema; estos subprogramas estarán relacionados de forma que su ejecución conjunta permitirá la solución del programa global.
Funciones como Subprogramas en C++
C++ permite la definición de este tipo de subprogramas. En algunos lenguajes de programación, las subpartes son llamadas procedimientos o subrutinas. En C++ las subpartes de un programase denominan funciones.
Una de las ventajas de dividir los programas en subprogramas es que diferentes programadores pueden realizar diferentes tareas. Este tipo de trabajo de equipo es indispensable para la elaboración de programas complicados en un tiempo razonable.
FUNCIONES PREDEFINIDAS
El lenguaje C++, como la mayoría de los lenguajes de programación, permite el uso de “bibliotecas” con funciones predefinidas que se pueden utilizar en cualquier programa. Se discutirá primero como se utilizan estas funciones predefinidas y, posteriormente, se mostrará como un programador puede construir sus propias funciones.
Uso de Funciones Predefinidas
Se utilizará la función sqrt(squareroot=raízcuadrada) para ejemplificar el uso de funciones predefinidas. La función sqrt toma el valor de un número, por ejemplo 9.0, y calcula el valor de su raíz cuadrada, en este caso 3.0. El valor que la función toma como punto de partida (9.0 en el ejemplo) sele conoce como su argumento. Al valor que calcula sele conoce como valor de regreso o retorno).
Algunas funciones pueden tener más de un argumento, pero todas las funciones tienen un solo valor de retorno. Si se trata de comparar a una función con los programas que se han analizado hasta ahora, los argumentos son análogos a los datos, mientras que los valores de retorno son análogos a los resultados.
Un ejemplo del uso deuna función es el siguiente:
raiz = sqrt(9.0);
A la expresión sqrt(9.0) se le conoce como llamado a la función (o invocación a la función). El argumento de un
a función puede, como en este caso, ser un valor constante, pero también puede ser una variable o una expresión más complicada. La única restricción en este sentido es que la constante, la variable o la expresión deben de proporcionar un valor que sea del tipo requerido por la función.
Las funciones pueden utilizarse como parte de cualquier expresión legal en C++. Por ejemplo, las siguientes son expresiones válidas en C++:
double venta,beneficio,area;
venta = 100.50;
area= 27.5;
beneficio=sqrt(venta);
cout<< “Ellado del cuadradoes “ << sqrt(area) <<”\n”;
LLAMADO A FUNCIONES
Un llamado a una función consiste en el nombre de una función seguida por la lista de sus argumentos en cerrados entre paréntesis. Si hay más de un argumento, los argumentos se separan mediante comas. Un llamado a una función puede ser usado como cualquier otra expresión en C++ siempre y cuando se conserve la consistencia entre los tipos de las variables del programa. La sintaxis es la siguiente.
Si hay un solo argumento:
nombre_de_funcion(argumento)
si haymás de un argumento:
nombre_de_funcion(argumento_1, argumento_2,... , ultimo_argumento)
Bibliotecasde Funciones
Se recordará que, cuando se analizó la instrucción cout, se vió que era necesario incluir en el programa a la biblioteca iostream.h, dado que la definición de cout se encontraba en dicha biblioteca. De la misma forma, para utilizar algunas funciones matemáticas será necesario incluir en nuestros programas otras bibliotecas de C++. Esta bibliotecas son, por ejemplo, math.h y stdlib.h. Esto significa que, en programas en los que se utilicen funciones predefinidas, será necesario utilizarla directiva include para incluir en el programa la definición de dichas funciones. En el caso de la biblioteca math.h, el programa deberá contenerla instrucción:
#include <math.h>
A los archivos que tienen extensión .h seles conoce como archivos de encabezados. Através de la directiva include,los archivos de encabezados proporcionan al compilador la información básica contenida en la biblioteca correspondiente.
Algunas Funciones Predefinidas
Algunas funciones predefinidas se describenenla Tabla siguiente:
Nombre
|
Descripción
|
Tipo de
Argumentos
|
Tipo de
Valorde
Regreso
|
Ejemplo
|
Valor
|
Biblioteca
|
sqrt
|
RaízCuadrada
|
double
|
double
|
sqrt(4.0)
|
2.0
|
math.h
|
pow
|
Potencia
|
double
|
double
|
pow(2.0,3.0)
|
8.0
|
math.h
|
abs
|
Valor absoluto
de un int
|
int
|
int
|
abs(-7)
abs(7)
|
7
|
stdlib.h
|
fabs
|
Valor absoluto
de un double
|
double
|
double
|
fabs(-7.5)
fabs(7.5)
|
7.5
|
math.h
|
ceil
|
Redondeo hacia
el número inmediato superior
|
double
|
double
|
ceil(3.2)
ceil(3.9)
|
4.0
|
math.h
|
floor
|
Redondeo hacia el número
inmediato inferior
|
double
|
double
|
floor(3.2)
floor(3.9)
|
3.0
|
math.h
|
sin
|
Seno
|
double
|
double
|
sin(0.0)
|
0.0
|
math.h
|
cos
|
Coseno
|
double
|
double
|
cos(0.0)
|
1.0
|
math.h
|
tan
|
Tangente
|
double
|
double
|
tan(0.0)
|
0.0
|
math.h
|
La más complicada de las funciones de la tabla es la función pow que sirve para obtener la potencia de un número. Por ejemplo, las siguientes sentencias son un ejemplo de aplicación de la función pow:
Las sentencias anterioresmostraríanen pantalla al número9.0.
Ejemplos
Las siguientes expresiones algebraicas y en C++ son equivalentes:
x+y
sen(angulo) sin(angulo)
FUNCIONES PARA CADENAS EN LENGUAJE C
C no dispone de un tipo de dato String para trabajar con cadenas de texto como en otros lenguajes. En su lugar, una cadena está representada por un array de caracteres (char) habitualmente terminado con el carácter especial de fin de cadena << \0 >>. Este carácter especial no se visualiza por pantalla, podríamos decir que está pero es "transparente" o "no visible" a través de la pantalla.
Comentamos previamente que las funciones para pedir datos al usuario scanf y gets introducen automáticamente un fin de cadena (\0) al final del texto capturado. En estos casos el array de caracteres tiene en C un carácter adicional además del texto visible, el correspondiente al final de cadena. Por ejemplo la longitud en caracteres de la palabra “abc” introducida por el usuario con scanf o gets no es tres, sino cuatro, ya que a los tres caracteres hemos de sumarle el carácter especial de final de cadena representado con \0.
CONOCER LA LONGITUD DE UNA CADENA CON SIZEOF
Podemos declarar cadenas de varias maneras. Por ejemplo:
char pruebaCadena [3]; pruebaCadena [0]= 'a'; pruebaCadena [1]= 'b'; pruebaCadena [2]= 'c';
char pruebaCadena [] = "abc";
En el primer caso el array es de tres caracteres, el de índice cero es a, el de índice 1 es b, el de índice 2 es c. En el segundo caso el array es de cuatro caracteres al introducir C el carácter de fin de cadena \0.
Llamamos tamaño (length) de un array al número de elementos de que consta. En el caso del array de caracteres “abc” con el carácter de fin de cadena decimos que consta de 4 elementos (contando el carácter especial de fin de cadena). Podemos conocer la longitud de un array de caracteres usando la función sizeof, siendo la sintaxis a emplear: sizeof (nombreDelArray).
Escribe este código, que ya debemos ser capaces de comprender con lo estudiado hasta ahora.
#include <stdio.h> #include <stdlib.h> int main() { int i = 0; int j=0; char pruebaCadena [] = "abc"; while (pruebaCadena[i] != '\0') { printf ("%c", pruebaCadena[i]); i=i+1; } printf ("%cUsando \\0: ", '\n'); while (pruebaCadena[j] != '\0') { printf ("Iteracion %d - ", j+1); j=j+1; } printf ("%cUsando sizeof: ", '\n'); j= 0; //Reinicializar j while (j < sizeof(pruebaCadena)) { printf ("Iteracion %d - ", j+1); j=j+1; } printf ("\nsizeof pruebaCadena es %d", sizeof(pruebaCadena)); return 0; // Ejemplo aprenderaprogramar.com } |
Aquí mostramos distintas formas de recorrer un array de caracteres. La primera se basa en buscar el carácter de fin de cadena \0. En este ejemplo el bucle while recorre a – b – c (tres iteraciones). La segunda se basa en usar sizeof. En este ejemplo el bucle while recorre a – b – c - \0 (cuatro iteraciones).
LIBRERÍA STRING.H FUNCIONES STRCPY, STRLEN, STRCAT, STRCMP
A través de la librería string.h podemos usar distintas funciones relacionadas con cadenas. Para usar estas funciones debemos escribir #include <string.h> en cabecera de nuestro programa. A continuación relacionamos algunas de las funciones disponibles.
Función |
Significado y ejemplo aprenderaprogramar.com |
strcpy (arg1, arg2) |
Copia arg2 en arg1. Ejemplo: strcpy (cadena, “control”); |
strlen (arg1) |
Devuelve la longitud del texto representado por arg1. Ejemplo: strlen(cadena1) |
strcat (arg1, arg2) |
Concatena las cadenas representadas por arg1 y arg2. Ejemplo: strcat(cadena1, “ unidades”) |
strcmp (arg1, arg2) |
Devuelve 0 si las cadenas representadas por arg1 y arg2 son iguales, o un valor menor que cero si arg1 precede alfabéticamente a arg2. Ejemplo: resComparacion = strcmp (cadena4, cadena2); |
Escribe el siguiente código y comprueba los resultados de ejecución.
#include <stdio.h> |
FUNCIONES MATEMÁTICAS EN LENGUAJE C
El lenguaje C nos facilita una biblioteca de funciones matemáticas entre las que se incluyen las de uso más habitual como pueden ser: valor absoluto, potencia de un número elevado a otro, raíz cuadrada, funciones trigonométricas (seno, coseno, tangente, etc.), redondeo, exponenciación, logaritmo decimal, logaritmo neperiano y otras.
Para utilizar las funciones matemáticas indicadas a continuación es necesario incluir en la cabecera de nuestros programas la siguiente declaración: #include <math.h>
El resultado de aplicar una función matemática es un valor numérico de tipo double (aunque el resultado puede ser un valor entero, internamente C lo considerará como un valor tipo decimal de doble precisión o tipo double)
Las funciones disponibles de uso más habitual son las siguientes:
Funciones Matemáticas |
Significado |
Funciones Matemáticas |
Significado |
fabs (x) |
Valor absoluto de x |
ceil (x) |
Redondeo entero superior |
pow (x, y) |
Potencia de x elevado a y |
floor (x) |
Redondeo entero inferior |
sqrt (x) |
Raíz cuadrada de x |
exp (x) |
Exponenciación (número e elevado a x, siendo e = 2.71828) |
sin (x) |
Seno de x |
log (x) |
Logaritmo neperiano de x |
cos (x) |
Coseno de x |
log10 (x) |
Logaritmo decimal de x |
tan (x) |
Tangente de x |
atan (x) |
Arcotangente de x |
La biblioteca de funciones matemáticas de C es más amplia de lo que hemos expuesto (por ejemplo se dispone de más funciones trigonométricas y de otros tipos que las aquí indicadas), pero con estas funciones quedan cubiertos los cálculos más habituales.
Las funciones relacionadas con ángulos trabajan en radianes. Por tanto para operar con grados habremos de realizar la conversión oportuna.
Vamos a comentar algunas funciones menos habituales. Respecto a ceil y floor, se trata de funciones que devuelven el redondeo entero de un número. La diferencia entre ambas es que ceil redondea al entero superior más próximo y floor redondea al entero inferior más próximo. Tener en cuenta que el entero superior más próximo a un número negativo como – 5.75 es – 5 mientras que el entero superior más próximo a un número positivo como 5.75 es 6. Recordar que aunque estas funciones devuelven enteros, internamente el tipo de datos devuelto por estas funciones en C es double. Si se aplican estas funciones a un número entero, obtenemos ese mismo número pero con formato double.
C incorpora funciones que permiten generar números aleatorios así como funciones de fecha y hora. Por su importancia y extensión no las trataremos ahora.
Escribe y ejecuta el código mostrado a continuación. Crea también nuevas variables y operaciones para comprobar el uso de las funciones matemáticas en C.
#include <stdio.h> |
Funciones trigonométrica
Función |
Propósito |
sin |
seno |
cos |
coseno |
tan |
tangente |
asin |
arcoseno |
acos |
arcocoseno |
atan |
arcotangente |
atan2 |
arcotangente de dos argumentos, usando el signo para determinar el cuadrante |
Obtención de números aleatorios en C
A veces queremos que nuestro programa obtenga números de forma aleatoria, por ejemplo, para simular una tirada de dados o el reparto de cartas en un juego. En C de linux tenemos varias funciones que nos permiten obtener estos valores aleatorios.
En esta explicación vamos a ver un uso básico de estas funciones. Algunas de las cosas que contamos aquí no son útiles para aplicaciones más serias, en las que se requiere que la secuencia de números aleatorios sea muy aleatoria, impredecible, que no se repita hasta pasado muchos números, etc, etc. Sin embargo, las explicaciones aquí presentadas servirán para la mayoría de nuestros programas.
LA FUNCIÓN rand()
En C, para obtener números aleatorios, tenemos la función rand(). Esta función, cada vez que la llamamos, nos devuelve un número entero aleatorio entre 0 y el RAND_MAX (un número enorme, como de 2 mil millones).
El primer problema que se nos presenta es que no solemos querer un número aleatorio en ese rango, sería un dado muy curioso el que tenga tantas caras. Podemos querer, por ejemplo, un número aleatorio entre 0 y 10. O de forma más general, entre 0 y N. La cuenta que debemos echar para eso es esta
#include <stdlib.h>
...
numero = rand() % 11;
numero = rand() % (N+1);
La operación módulo (%) nos da el resto de dividir rand() entre 11. Este resto puede ir de 0 a 10. De la misma forma, el módulo de rand()entre N+1 va de 0 a N.
¿Y si queremos un rango que no empiece en 0?. Por ejemplo, queremos un rango entre 20 y 30 (de forma más general, entre M y N con Nmayor que M). Pues es fácil, obtenemos un número entre 0 y 10 y le sumamos 20 (un número entre 0 y N-M y le sumamos M)
numero = rand () % 11 + 20; // Este está entreo 20 y 30
numero = rand () % (N-M+1) + M; // Este está entre M y N
LA FUNCIÓN srand()
Se nos presenta un nuevo problema. Si ejecutamos varias veces nuestro programa, la secuencia de números aleatorios se repite. Imaginemos que tenemos un programa que escribe 3 número aleatorios entre 0 y 10. Lo ejecutamos una vez y sale, por ejemplo 4, 7 y 9. Lo ejecutamos por segunda vez y vuelve a salir 4, 7 y 9. La tercera vez sale lo mismo y cuando ya nos hemos hartado de ejecutar, vuelve a salir lo mismo.
El problema es que rand() "calcula" los números aleatorios. Parte de un número inicial (llamado semilla), echa unas cuentas y saca un número aleatorio. Para el segundo número, echa unas cuentas con el resultado anterior y saca un segundo número y así sucesivamente.
Si volvemos a ejecutar el programa desde el principio, el número inicial (la semilla) que usa rand() es el mismo, con lo que la secuencia de números aleatorios es la misma, ya que las cuentas son las mismas.
Para evitar este problema tenemos la función srand(), a la que se le pasa de parámetro un número que se utilizará como número inicial para las cuentas. A esta función sólo debemos llamarla una vez en nuestro programa.
¿Qué número le ponemos a este srand()?. No podemos ponerle un número fijo, porque entonces no hemos hecho nada. No podemos ponerle un número obtenido con rand(), porque la primera vez siempre nos dará el mismo y el resultado será igual que si le ponemos un número fijo. Debemos buscar la forma de obtener un número que sea distinto en la ejecución de cada programa.
Hay dos números que se utilizan habitualmente para ello:
-
La fecha/hora del sistema. Este valor cambia si ejecutamos el programa en distinto instante de tiempo. Tendriamos que arrancar el programa dos veces en el mismo segundo para obtener la misma secuencia de números aleatorios. En C de linux esta fecha/hora se obtiene con la función time()
srand (time(NULL));
-
El número de proceso del programa. El primer programa que se arranca cuando se enciende el ordenador con el sistema operativo linux, tiene el número de proceso 1, el segundo el 2, el tercero el 3 y así sucesivamente. Cuando arrancamos nuestro programa, se le asignará el número que le toque, por ejemplo, el 215. Cuando lo volvamos a arrancar, se le asignará el que le toque (puede ser 216 si no hemos ejecutado nada entre medias o 345, si nos hemos entretenido con otras cosas). Después de ejecutar nuestro programa varios miles de veces, el número de proceso puede que se repita, pero ya no nos acordaremos de la secuencia que se sacó la primera vez. El número de proceso se obtiene con getpid()
srand (getpid());
A esta función sólo hay que llamarla una vez al principio de nuestro programa. Cada vez que la llamemos, estaremos reiniciando los calculos de números aleatoriosd desde el principio, con lo que se repetirá todo