Unidad 2

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 41

Unidad 2 – Fundamentos de la Programación (C/C++)

UNIDAD 2 (contenido)

❖ Estructura general de un programa.


• Herramientas generales de edición.
• Compilar y ejecutar.
• La sintaxis de programación en C/C++.
• Errores de sintaxis y errores lógicos.
❖ Tipos de datos y operadores.
• Tamaños, declaración y modificadores.
• Operadores lógicos, aritméticos y de asignación.
❖ Funciones de Biblioteca.
• Funciones de E/S (stdio.h/iostream).
• Funciones matemáticas (math.h).
❖ Funciones generadas por el usuario (creación y manejo).

Estructura general de un programa:


Los principios del paradigma de programación estructurada propuestos por Böhm y Jacopini
(1966) son los siguientes:

• Cualquier programa puede ser escrito utilizando solo 3 instrucciones de control:

• Secuencia (concepto de sentencia o el lenguaje imperativo).

• Decisión (if, if/else, switch/case).

• Repetición o bucle(while, do/while, for).

• Eliminación del uso de la sentencia goto, o de saltos a etiquetas. (Edsger Dijksta - 1968).

• El programa se divide en bloques de código llamados funciones (modularidad).

• El algoritmo utilizado para resolver el problema debe tener una estructura secuencial
descendente.

SEPTIEMBRE 2022 1
Unidad 2 – Fundamentos de la Programación (C/C++)

Algoritmo.- Lista de instrucciones para resolver un cálculo o un problema abstracto. Número finito
de pasos convierten los datos de un problema (entrada) en una solución (salida).

Algunos algoritmos no proporcionan la solución final a un problema (problemas infinitos), sino una
respuesta parcial al problema hasta cierta iteración. Tal es el caso de las series numéricas infinitas,
el cálculo de los números primos, la aproximación de 𝜋, etc.

En informática, el problema debe ser analizado en función de sus datos de entrada y salida, a
manera de que el algoritmo represente la función o sistema que nos permita resolverlo.

Función o Datos de salida


Datos de entrada Sistema
(resultado)

El análisis del problema en función de sus datos, incluye el conocer que es lo que realmente pide
el problema (conjunto de datos de salida) identificando previamente el conjunto de datos de
entrada con los que se puede contar.

Se dice que un problema es “computable” (se puede resolver con una maquina), solo si puede ser
resuelto por un algoritmo.

El algoritmo es independiente del lenguaje o la maquina en que se ejecuta, de ahí su valor


universal. Se espera que este sea:

• Preciso.- llegar a la solución sin ambigüedad y en e menor tiempo posible.

• Determinista.- Solo puede tener una salida para cierto conjunto de datos de
entrada.

• Finito.- Debe iniciar y terminar en algún punto o paso (el problema debe estar
acotado).

Los dos grandes aspectos a resolver en un algoritmo es que sea correcto, y a la vez eficiente.

Algoritmo para generar un algoritmo:

SEPTIEMBRE 2022 2
Unidad 2 – Fundamentos de la Programación (C/C++)

El paso 5 puede implicar el retorno a uno o mas pasos previos, lo que convierte al proceso de
programación en un ciclo de desarrollo, que añadiendo los pasos de programación, depuración y
mantenimiento, se convierte en el ciclo de vida del programa.

Existen varias herramientas para el proceso de edición, el seudocódigo, el diagrama de flujo y


algunas herramientas estandarizadas como UML.

SEPTIEMBRE 2022 3
Unidad 2 – Fundamentos de la Programación (C/C++)

Herramientas generales de edición: El seudocódigo:


Un pseudocódigo es la representación escrita de un algoritmo, es decir, muestra en forma de texto
los pasos a seguir para solucionar un problema. Cuenta con las siguientes reglas de semántica:

1. Alcance del programa: Todo pseudocódigo está limitado por las etiquetas de INICIO y FIN.
Dentro de estas etiquetas se deben escribir todas las instrucciones del programa.

2. Palabras reservadas con mayúsculas: Todas las palabras propias del pseudocódigo deben
de ser escritas en mayúsculas.

3. Sangría o tabulación: El pseudocódigo debe tener diversas alineaciones para que el código
sea más fácil de entender y depurar.

4. Lectura / escritura: Para indicar lectura de datos se utiliza la etiqueta LEER. Para indicar
escritura de datos se utiliza la etiqueta ESCRIBIR. La lectura de datos se realiza, por
defecto, desde el teclado, que es la entrada estándar del sistema. La escritura de datos se
realiza, por defecto, en la pantalla, que es la salida estándar del sistema.

5. Declaración de variables: Las variables de entrada deben de “declararse” o presentarse,


esto se hace con un nombre y un “tipo de dato” seguido de dos puntos, ya que puede
haber datos de muchos tipos, como entrada de texto, numéricos, datos de imágenes, etc.
(ej. baseRectangulo:real). Por convención se usan letras minúsculas.

Los tipos de datos que regularmente representamos son los mas simples de la informática:

• Dato entero: Valor entero positivo o negativo.

• Dato real: Valor con punto flotante y signo.

• Dato booleano: Valor de dos estados falso/verdadero (indicador de


estado).

• Dato de caracter: Letra o numero

• Dato de texto: Cadena de caracteres que representa un texto.

• Dato de arreglo: Cuando requerimos mas de uno de los anteriores en un


arreglo. Dato compuesto: Cuando requerimos uno que contenga dos o
mas de los tipos anteriores, en un conjunto (llamado comúnmente
estructura o registro).

6. Declaración de constantes: Los mismos tipos de datos de las variables deben ser usados
para declarar las constantes o valores que no cambiarán a lo largo del programa (ejemplo:
π, e). Se utiliza la etiqueta CONST, y para diferenciarlas de las variables generalmente se
escriben con mayúsculas. Por obvias razones su valor debe definirse al momento de
declararse.

7. Operadores: Se tiene la posibilidad de usar operadores aritméticos y lógicos.

SEPTIEMBRE 2022 4
Unidad 2 – Fundamentos de la Programación (C/C++)

8. Notación de camello: Para no agotar los posibles nombres de variables se utiliza la


llamada notación de camello. Esta coloca la descripción de la variable iniciando con
minúsculas y agregando descriptores alternando la primera letra en mayúscula, sin utilizar
ningún carácter de separación, por ejemplo: areaDeLaBase, valorDePi, etc.

9. Estructuras para el control de flujo: Una serie de etiquetas nos permiten el uso de
instrucciones que permiten la ejecución secuencial, la ejecución condicional, y la
repetición de algunas instrucciones en un ciclo (bucle).

• Ejecución secuencial: La da el orden de aparición de las instrucciones de arriba


hacia abajo y de izquierda a derecha (aunque pudiera ser de derecha a izquierda si
se específica lo contrario).

• Ejecución condicional: Permiten evaluar una expresión lógica (condición que


puede ser verdadera o falsa) y, dependiendo del resultado, se realiza uno u otro
flujo de instrucciones. Estas estructuras son mutuamente excluyentes (o se
ejecuta una acción o se ejecuta la otra). Generalmente los lenguajes incluyen tres
condicionales:

• El condicional simple que evalúa una expresión SI-ENTONCES

De no cumplirse la condición, el programa vuelve a su flujo normal

• El condicional que evalúa una expresión SI-ENTONCES/DE LO CONTRARIO


puede ser considerado en algunos lenguajes la versión completa del
anterior. Ejecuta ciertas instrucciones si se cumple y ciertas instrucciones
si no se cumple la condición, en cualquier caso ambos condicionales solo
evalúan una condición (puede ser booleana o de otro tipo).

ejemplo

• El condicional múltiple SELECCIONAR-CASO valida el valor de la variable


que está entre paréntesis y comprueba si es igual al valor que está
definido en cada caso. Si la variable no tiene el valor de ningún caso se va
a la instrucción por defecto (DEFECTO). En algunos lenguajes se limita el
tipo de variable que se puede comparar a un solo tipo de dato.

SEPTIEMBRE 2022 5
Unidad 2 – Fundamentos de la Programación (C/C++)

ejemplo

9. Estructuras de control iterativas o repetitivas: Realizan la repetición de un conjunto de


instrucciones mientras se cumpla una expresión lógica o hasta que se cumpla alguna condición,
puede ser una condición simple, o compuesta.

• La estructura MIENTRAS valida primero una condición y si es verdadera


ejecuta el bloque de las instrucciones de la estructura, de lo contrario
rompe el ciclo y continua el flujo normal del programa.

ejemplo

NOTA: Puede especificarse la salida del seudocódigo con algún carácter especial (>>>)

• La estructura HACER-MIENTRAS primero ejecuta las instrucciones descritas en la

• estructura y al final valida la expresión lógica (condición).

HACER

[Acción] ejemplo

MIENTRAS condición

NOTA: Como puede observarse estas dos instrucciones requieren de inicializar la condición en el
exterior del ciclo, y modificarla en el interior (con un iterador de cierto avance) para que ya no se
cumpla en algún momento y no se produzca un ciclo infinito.

SEPTIEMBRE 2022 6
Unidad 2 – Fundamentos de la Programación (C/C++)

• La estructura DESDE,HASTA,PASO es incluida en algunos lenguajes y proporciona


una inicialización de la condición del ciclo, una condición final y un iterador de
avance con cierto paso al mismo tiempo. No es necesario agregar instrucciones
para inicializar la condición fuera del ciclo, ni modificarla dentro de este como en
los anteriores.

DESDE [condición-inicio], HASTA [condición-fin], PASO [de n elementos]

[Acciones]
FIN DESDE
NOTA: Como puede observarse, esta es utilizada principalmente cuando se conoce de antemano
cuantos ciclos de repetición se requieren para llegar al resultado. Como cuando se recorre un
arreglo desde un valor inicial hasta un valor final. En algunos lenguajes existe un DESDE exclusivo
para recorrer arreglos (DESDE basado en rango).

10. Funciones: En ocasiones podemos facilitar la solución de un problema al dividirlo en procesos


más sencillos, a todas estas divisiones les llamaremos funciones o métodos. Al ser un subproceso
(mini algoritmo) esta requiere de una etiqueta que le de su nombre (identificador), un conjunto de
variables de entrada colocadas regularmente entre paréntesis, y alguna variable de salida RET.

Sin embargo, puede haber funciones simples que no requieran datos de entrada, ni de salida, por
ejemplo, mostrar un simple mensaje de texto. Cuando es así se estila que la lista de parámetros
muestre la etiqueta “vacío”.

11. Comentarios: Se utiliza el símbolo ** para iniciar una línea de texto con aclaraciones del
funcionamiento del programa, que no formara parte del algoritmo.

Diagrama de flujo:

El diagrama de flujo es la representación gráfica de un algoritmo, el cual utiliza como el


pseudocódigo un grupo de diagramas base para representar los diferentes elementos del
programa. Sus reglas de semántica son similares:

SEPTIEMBRE 2022 7
Unidad 2 – Fundamentos de la Programación (C/C++)

Simbolos Básicos:

Inicio/fin Lectura de datos

Procesamiento

(asignación o operación)
Decisión

Conector
Decisión
Múltiple

Impresión de
resultados

Llamada a
Función

Flujos

SEPTIEMBRE 2022 8
Unidad 2 – Fundamentos de la Programación (C/C++)

Diagramas de flujo de algunas de las diferentes estructuras:

SI-ENTONCES/DE LO CONTRARIO
SI-ENTONCES

MIENTRAS

SELECCIONAR-CASO

SEPTIEMBRE 2022 9
Unidad 2 – Fundamentos de la Programación (C/C++)

HACER-MIENTRAS FUNCION

Diagrama de actividad UML:

Para evitar la ambigüedad en los símbolos usados para describir un programa en diagramas de
flujo (trapecio para lectura, ovalo para entrada, etc.). Se creo el lenguaje unificado de modelado
(UML) que es similar al diagrama de flujo, pero con símbolos universales ya definidos y una
semántica con reglas fijas:

• Los gráficos de actividad solo pueden tener un punto de partida, pero pueden tener
múltiples puntos finales.

• Las actividades se describen como frases de verbo-objeto, las actividades se representan


mediante rectángulos redondeados y el flujo de control entre actividades se representa
mediante flechas sólidas.

• Las actividades representan acciones en el proceso, y las actividades pueden ser grandes o
pequeñas, y las actividades pueden continuar descomponiéndose en actividades más
pequeñas.

• La granularidad de las actividades está determinada por el significado del diagrama a


expresar, ya sea que se pretenda representar un proceso amplio o un proceso específico.

La representación de UML es más general, y esto le permite representar entidades o tipos de


datos de varios paradigmas de programación. Como es el caso de los objetos en P.O.O.

SEPTIEMBRE 2022 10
Unidad 2 – Fundamentos de la Programación (C/C++)

Ejemplo de diagrama UML

Compilar y ejecutar un programa


Tiempo de compilación, tiempo de ejecución y archivo ejecutable

Al ser un lenguaje compilado, las instrucciones son traducidas a lenguaje maquina (tiempo de
compilación) generando un archivo objeto (.obj) y posteriormente se ejecuta el programa, que es
la acción de cargarlo en memoria y ejecutarse (tiempo de ejecución). En los entornos de desarrollo
el paso de compilación es la opción build (construir).

Si el compilador tiene problemas en comprender el programa (por errores de semántica o lógicos)


este generará un error y el programa no correrá.

Cada que el programa se ejecute generará un archivo ejecutable (.exe en Windows, a.out en
Linux). De manera que si el programa se modifica en su fase de edición (programa fuente) y no se
compila previamente, el ejecutable correrá el programa de la versión del código objeto anterior.
En los entornos de desarrollo a menudo la ejecución aparece con la opción run (correr).

Los entornos de desarrollo a menudo guardan en una carpeta aparte el programa fuente (.c/.cpp),
el objeto y el ejecutable, creando un proyecto, que puede incluir varios archivos fuente.

SEPTIEMBRE 2022 11
Unidad 2 – Fundamentos de la Programación (C/C++)

La sintaxis de la programación en C/C++


Palabras reservadas: Son palabras de uso exclusivo del lenguaje, no pueden ser usadas por los
programadores (no se puede redefinir su significado).

Pueden ser verificadas en:

https://en.cppreference.com/w/cpp/keyword

El lenguaje C tiene 35 y el lenguaje C++, 90 (contando las 35 anteriores), algunas son de uso
frecuente y otras rara vez son utilizadas.

Lista de palabras reservadas de C++

SEPTIEMBRE 2022 12
Unidad 2 – Fundamentos de la Programación (C/C++)

Identificadores: Muchos programadores a lo largo del desarrollo de C/C++ han dejado archivos de
biblioteca con funciones (y objetos) útiles en la creación cotidiana de programas simples. Los
identificadores son dichos elementos ya definidos. Al programar variables, constantes, funciones,
archivos fuente, entre otros elementos deben manejarse con un nombre o identificador que
definimos con las siguientes reglas generales:

• El nombre debe tener de preferencia menos de 32 caracteres (letras o números), sin


acentos.

• No permite espacios en blanco, ni caracteres especiales.

• El único carácter especial permitido en C es _ (guion bajo) que no se recomienda usar al


inicio de los nombres (aunque si lo permite).

• Iniciar el nombre de una variable o constante con un digito (0-9) no está permitido.

• Las palabras reservadas del lenguaje tampoco pueden usarse como nombres de variables
o constantes.

Operadores: C/C++ aparte de manejar los operadores comunes a operaciones aritméticas (+,-,*,/)
también maneja operadores propios del lenguaje. Estos interactúan con las variables del código,
con funciones (o con objetos), etc. Algunos ejemplos de operadores añadidos al lenguaje son:

• << operador de inserción de flujo a la pantalla, que opera con el objeto cout

• >> operador de extracción de cadenas, que opera con el objeto cin

• :: operador de resolución de ámbito o alcance (opera con los objetos).

Signos de puntuación: Sirven para hacer énfasis en algún elemento del lenguaje:

• “ ” .- Algo entre comillas enfatiza que esto es una cadena de caracteres.

• ‘ ’.- Algo entre comillas simples enfatiza un solo carácter (numero o letra).

• ; .- Enfatiza el fin de una línea de código.

• { - } .- Enfatiza un ámbito del programa, es decir una sección aparte del programa con
ciertas características.

La función

✓ La unidad de construcción es la función, que debe declararse antes de usarse (prototipo


de función), La declaración incluye su nombre, la lista de datos que recibe, y el “tipo” de
dato que regresa.

SEPTIEMBRE 2022 13
Unidad 2 – Fundamentos de la Programación (C/C++)

✓ Cuenta con un área de directivas al preprocesador, declaración de CONSTANTES, el área


de prototipos de función, y un área de comentarios que especifica el funcionamiento del
programa.

✓ Todo programa inicia con la ejecución de la función main(). El área de main() es un bloque
de sentencias del programa. Los bloques de sentencias se separan con corchetes { … } y las
sentencias con el operador ;

✓ Posterior a main() viene el área de definición de funciones. También es válido definir todas
las funciones al principio del código en el área de directivas, y así no hay necesidad de
incluir prototipos de función, sin embargo, estas no deben incluir código que aún no se ha
declarado.

Ejemplo de estructura de un programa en C (aquí C puro)

#include<stdio.h> //área de directivas del preprocesador

#define PI 3.1416 // área de definiciones (constante estilo C)

const float GRAVEDAD = 9.81; // constante estilo C++

void multiplicaDosNum (int x, int y); // área de declaración de funciones

int varGlobal; // área de definición de variables globales

// Este programa multiplica dos números (área de comentarios)

int main()

{ // bloque de sentencias de main

multiplicaDosNum(5,4);

multiplicaDosNum(10,20);

multiplicaDosNum(50,2);

return 0;

void multiplicaDosNum (int x, int y) // área de definición de funciones

int result = x * y;

printf(“El producto de %d por %d es: %d \n”,x,y,result);

Las directivas del preprocesador se ejecutan ANTES que el proceso de compilación (antes que
cualquier sentencia) y enlace, por lo que son lo primero que el compilador identifica y pueden
estar escritas en cualquier parte del código, se identifican con el símbolo # (pawn/hashtag) que

SEPTIEMBRE 2022 14
Unidad 2 – Fundamentos de la Programación (C/C++)

debe ser el primer carácter de la línea, tiene varios comandos como #include, que llama al código
de las librerías estándar de C (headers o archivos .h).

▪ #ifdef, #endif, #else, #define, #ifndef,#pragma, son otras directivas.

▪ Como ejemplo, #define se utiliza para definir CONSTANTES que son cantidades o datos
fijos definidos por el usuario que no cambiaran su valor durante el curso del programa,
esto en el estilo C.

▪ La directiva #include<>, similar a la sentencia import en Java, incluye en el código los


archivos de cabecera (headers o archivos .h). El archivo stdio.h (standard input/output)
contiene funcionalidades de entrada y salida como las funciones printf(), scanf(),
getchar(),etc.

Los comentarios: Son líneas de texto incluidas en el programa solo para hacer más claro el código.
Nada de lo que aparezca en ellos es tomado en cuenta por el compilador, hay de varias líneas
encerrado en los símbolos /* - */o de una sola línea //.
// Comentario de una línea (no termina con ningún signo)

/* inicia área de comentarios

continua área de comentarios

finaliza área de comentarios */

Como buena práctica de programación, se estila un área de comentarios múltiples al inicio del
programa que explican el propósito de este, la fecha y hora de creación y el nombre del
programador responsable, etc., lo que facilita en los códigos el seguimiento de las versiones de un
programa.
/* Alberto Ríos Lara

Grupo: 1AV7

Tarea 4: Este programa calcula áreas o perímetros */

La función main (): La función main () es el punto de partida de las instrucciones de ejecución en
un programa en C/C++ (lo que no sucede en otros lenguajes). Existe una versión que no recibe
valores de inicio y otra que espera valores del S.O. para realizar alguna configuración. Toda función
main debe terminar en la instrucción return 0; (devuelve 0) esto indica la finalización de un código
de manera exitosa y devolverá el control al sistema operativo.

SEPTIEMBRE 2022 15
Unidad 2 – Fundamentos de la Programación (C/C++)

El programa en C/C++ puede constar de cientos de archivos pero alguno tendrá que contener a la
función de arranque main().

Main sin argumentos Main con argumentos


int main(){ int main(int argc, char *argv[]){

// código // código

return 0; return 0;

} }

Produce programa.exe Produce programa.exe y contiene argumento 1 y 2

Estos argumentos son pasados a main antes de su ejecución, podrían ser parámetros que nos pida
la consola antes de ejecutar el programa, como un conteo de ejecuciones (argc), o una contraseña
(argv), etc.

El espacio de nombres: Este es una característica agregada para C++ (no existe en C). A medida
que programamos en C++, el programa se convierte en una combinación de nuestro código, y el
código de las bibliotecas estándar o de terceros (frameworks). Muchas bibliotecas, sin embargo,
no tienen definido un espacio de nombres.

o Tarde o temprano nuestros identificadores de funciones, variables (objetos), etc. ,


podrían entrar en conflicto con algún elemento definido en bibliotecas.

o El espacio de nombres es un contenedor para que el programador agrupe cierto código en


el ámbito de un espacio de nombres especifico, y de esta manera los identificadores no
entren en conflicto.

o El espacio de nombres de la biblioteca estándar es std, así que todo elemento guardado
ahí podremos invocarlo con el operador de resolución de ámbito (::), como ejemplo los
objetos para la entrada y salida de texto, cin y cout del espacio std se invocan con std::cin
y std::cout respectivamente.

o Sin embargo, el espacio de nombres estándar se puede invocar para todo el código en C++
utilizando el encabezado using namespace std, antes del código que se desee agrupar
dentro de el (antes de la función main).

SEPTIEMBRE 2022 16
Unidad 2 – Fundamentos de la Programación (C/C++)

#include<iostream>

int main(){

int num;

std::cout << “¿Cuál es tu numero favorito entre 1 y 100?: ”;

std::cin >> num;

std::cout << “De verdad?, ” << num << “también es mi numero favorito!” << std::endl;

return 0;

Recordando que cin, cout y endl son objetos del espacio de nombres std y requieren ser obtenidos
de este con el operador ::, o usando el comando using namespace std.
#include<iostream>

using namespace std;

int main(){

int num;

cout << “¿Cuál es tu numero favorito entre 1 y 100?: ”; // salida de texto

cin >> num; // entrada de texto

cout << “De verdad?, ” << num << “también es mi numero favorito!” << endl;

return 0;

Sin embargo, el llamar a TODO el espacio de nombres std podría aún crear conflictos, no es lo mejor
en programas largos, así que es posible invocar solo lo que vayamos a usar (función o objeto) en
todo el programa:

Ejemplo:
using std::cin; // estas tres líneas irían antes de main()

using std::cout; // en el lugar de using namespace std

using std::endl;

SEPTIEMBRE 2022 17
Unidad 2 – Fundamentos de la Programación (C/C++)

Estructura del programa “Hola Mundo”

Errores de sintaxis y errores lógicos


Errores de compilación: Los que se generan por las reglas propias del lenguaje

• Error de sintaxis: Algo mal con la estructura del programa:

std::cout << “Bienvenido a C++ << std::endl;


rerturn 0;

• Error de semántica: Algo mal con el significado de una instrucción, la sintaxis es


correcta:

int a, c;

string b;
c = a+b; // no tiene sentido sumarle un entero a una cadena

Hay una infinidad de mensajes de error que dependen del compilador usado y de la versión de
C/C++,

se considera practico tener un programa de prueba para después omitir de forma intencional
algunos elementos y familiarizarnos con el tipo de mensajes de error que nos envía.

SEPTIEMBRE 2022 18
Unidad 2 – Fundamentos de la Programación (C/C++)

Advertencias del compilador (warnings): El compilador reconoce un potencial problema a medida


que avanzas en el código, se recomienda no ignorarlas, aunque te dejará ejecutar el programa, el
compilador generará el código máquina.
int variableA; // la variableA no se ha

printf(“El valor de A es: %d”, variableA); // inicializado !!!

La creación de una variable con cierto valor que no se usa en un programa, el uso de memoria sin
liberarla adecuadamente, entre otros, estarán consideradas entre las posibles advertencias.

Error Lógico: A menudo debido a errores del programador, ya que no se comprendió la salida del
programa deseada o incluso debido al usuario, ya que proporciona información incompleta o
incorrecta.
if (edad > 18){

printf(“El ciudadano ya puede votar!”);

Pero esta condición excluye a los que tienen 18 años exactos.

Error de enlace : El compilador detecta que a tu programa le faltan archivos de biblioteca que son
necesarios para que funcione adecuadamente. Esto a menudo también sucede con bibliotecas de
usuario, o variables definidas como externas (extern) al código principal (main) etc.
extern int X;

int main(){
printf(“El valor de A es: %d”, X); // se puede compilar pero no correrá
return 0;
}

Error en tiempo de ejecución: Errores que ocurren cuando el programa se está ejecutando, son
difíciles de predecir, y a menudo causan que el programa tenga un cierre inesperado. Algunos de
estos pueden ser:

• Una división entre cero


• Un archivo no encontrado al manipular archivos
• Fallo de memoria (falta de memoria para la pila)
• El ingreso de datos no validos por parte del usuario (en ocasiones si genera cierre).

SEPTIEMBRE 2022 19
Unidad 2 – Fundamentos de la Programación (C/C++)

Tipos de datos y operadores


Tipos, tamaños, y modificadores de tipo.

En C solo existen tipos de datos “primitivos” y “estructuras” (struct) formadas a partir de estos,
que son más semejantes a los “objetos” (tipos de datos creados por el usuario).

Int, float, double, char, _Bool (bool) son los tipos básicos. En C las cadenas de caracteres (string)
son arreglos vectoriales del tipo char, que terminan con un carácter especial que no es visible
(EOL - /0 ).

Los valores válidos para un cierto tipo de datos se les conoce como literales validas.

El tipo de dato bool almacena solo 0 o 1, fue creado a partir de C11 (C++) y no existía como tipo
primitivo en C. Para usar un macro en el contexto de C++ en la versión C99, es posible incluir la
librería estándar #include<stdbool.h> que nos dejara usar el dato bool con valores true/false, que
se manejan como datos lógicos pero que se imprimirán como enteros 0/1.

El tipo int acepta enteros positivos y negativos en general, inclusive enteros hexadecimales que se
asignan con el prefijo 0x. El numero 0xFF056D es ejemplo de un literal hexadecimal. Las versiones
de enteros de mayor o menor tamaño son short, long, unsigned, palabras reservadas que van
antes de la palabra int. Algunas plataformas aceptan el long long int, (12 bytes) o es posible incluir
una letra mayúscula con el prefijo long y “L” al asignarle un valor, por ejemplo:
long int variableLong = 34L; // crea un long long int

El tipo float representa valores con punto decimal (conocidos como punto flotante) positivos y
negativos. Puede aceptar valores en notación científica donde el exponencial 𝑥10±𝑛 se expresa
con e, es decir 1.7𝑥104 se escribe como 1.7e4, esta es una literal valida en tipos float.

El tipo double es para datos grandes de punto flotante y también acepta los modificadores de
tamaño long y unsigned, así como el uso de prefijos (L,U) en sus valores al asignarlos, es decir:
double variab = 1.24e7L; // crea una variable long double.

El efecto de usar el modificador unsigned es que la exactitud de la variable se ve extendida, pero


es importante usarlo cuando se trabaja en ausencia de resultados negativos. Las palabras
reservadas para modificar los tamaños se les conocen como modificadores de formato.

Debido a que la arquitectura de las computadoras actuales ya tiene palabras de 64 bits (8 bytes),
se recomienda ya no utilizar los enteros simples o flotantes de menos de 32 bits (4 bytes), que ya
se expresan mejor como long int y double de 64 bits (de por lo menos 8 bytes), sus descriptores
de formato son %li y %lf respectivamente.

En la siguiente tabla se ilustran los tamaños en bytes de los tipos de datos (clásicos) que se tenían
en las computadoras de arquitecturas de 32 bits (el C estándar C99, en máquinas Intel i686).

SEPTIEMBRE 2022 20
Unidad 2 – Fundamentos de la Programación (C/C++)

NOTA: Los tamaños en tipos extendidos pueden variar dependiendo del compilador y la
arquitectura de la computadora. Los tipos básicos como char, int, float, y double mantienen su
tamaño desde los primeros estándares de C.

En cuanto al tipo char, cualquier carácter individual que este entre comillas simples es reconocido
por el compilador como un char, y así se inicializa. Para el sistema este tendrá un numero entero
asociado que es el respectivo de la tabla ASCII.*
char nombre = ‘n’;

// o bien

char nombre = 110; // que es su entero correspondiente en código ASCII

char nombre = ‘\n’; // que imprime una secuencia de escape de nueva línea

Si se omite el uso de comillas el compilador piensa que es una asignación entre dos variables char.
Si se usan comillas dobles el compilador lo asocia a una cadena (string), que en C/C++ no es un
tipo de dato primitivo.

En C++ existen los tipos de datos compuestos, generalmente son objetos de la biblioteca std. El
mas utilizado es string que representa una cadena de caracteres.

SEPTIEMBRE 2022 21
Unidad 2 – Fundamentos de la Programación (C/C++)

Tabla de caracteres ASCII (caracteres estándar de C/C++), se digitan con Alt + código

Las constantes en C se manejan como declaraciones (no llevan ;) son valores que no podrán ser
modificados durante el programa, nótese que el tipo es detectado automáticamente y por buena
práctica se escribían con mayúsculas.

#define PI 3.141592 // literal constante tipo float %f

#define SALUDO "Hola" // literal constante tipo cadena %s

#define CAR_1 'a' // literal constante tipo caracter %c

En el estilo C++ la definición de una constante se hace como una sentencia con la palabra clave
const seguido del tipo, el nombre y la asignación del valor, para el compilador son variables de
solo lectura. La asignación de un valor al declararlas en este caso es obligatoria.
const double PI = 3.141592; // OBLIGATORIA la asignación del valor al inicio

Las variables se declaran como sentencias incluyendo el tipo, el nombre, y es opcional la asignación
de su valor en el momento que se declara. Varias variables del mismo tipo se pueden declarar en
una sola sentencia con el operador de separación, y se sugiere que sus nombres utilicen minúsculas
o la llamada “notacionDeCamello”.

SEPTIEMBRE 2022 22
Unidad 2 – Fundamentos de la Programación (C/C++)

double radio = 5.0;

int base, altura, area;

Estos son nombres con los que C/C++ “bautiza” a una dirección de memoria, que pudiera verse
como 0x0F256, donde 0x indica un dato en notación hexadecimal. C/C++ requieren que constantes
y variables sean declaradas antes de usarse, y en el caso de las variables, no es necesario que sean
inicializadas.

Existe la inicialización de una variable o constante, (OJO NO ES UNA ASIGNACION), las variables y
constantes pueden ser inicializadas al ser creadas poniendo una literal valida de su tipo a
continuación de su declaración entre llaves. Se sugiere siempre inicializar en cero las variables.
int var1 {23} , double var2 {45.3}

Dos operadores muy útiles en cambios de tipos datos en C/C++ son cast y sizeof.

El operador cast es implícito (no hay palabra reservada), y hace conversiones de tipos de forma
instantánea, suponiendo que valor1 sea tipo float y valor2 sea tipo int, y deseando que int resultado
sea un entero:
resultado = (int)valor1 * valor2; // redondeo de valor1 para el producto

El operador sizeof es explicito y sirve para verificar el tamaño en bytes de una variable. Es muy útil
en operaciones con cadenas donde reportara el valor oculto del carácter EOL (/0). Su salida es un
valor entero, se usa como función:

char palabra[] = "Clase"; // el tamaño será de 5+1 (por el carácter EOL)

cout << "El tamaño en bytes de palabra es: " << sizeof(palabra) << endl;

Las conversiones de tipo cast, tendrán reglas de conversión para diferentes tipos, el numero
resultante de una conversión entre tipos se trunca (pasa a menor precisión), o se promueve (pasa
a mayor precisión).

Generalmente se realiza cast de una precisión más alta a una menor. Hay que tener cuidado de que
la variable destino de la operación sea de un tipo compatible (operaciones entre números,
operaciones entre vectores, o operaciones entre cadenas).

Los argumentos que soporta sizeof son: variables, arreglos, tipos de datos básicos, tipos de datos
derivados, o expresiones completas (aquí solo nos da el tamaño de la variable resultado).

SEPTIEMBRE 2022 23
Unidad 2 – Fundamentos de la Programación (C/C++)

El estilo C++ para la conversión de tipos es con el operador static_cast (del estándar C11) de la
siguiente forma (respeta prácticamente las mismas reglas de promoción que C):
resultado = static_cast<int>valor1*valor2;

Aquí se aplica static_cast para la conversión a entero del valor1, si valor1 era un double, su valor es
redondeado.

Operadores lógicos aritméticos y de asignación.

Al introducir los operadores se definen dos conceptos que vienen de la programación estructurada
en C:

Expresión: Conformada por operadores y operandos, cada una da como respuesta, un valor. Es el
procesamiento de los datos, el bloque más básico de construcción.

• 12.5 + 8 (adición), a > b (relacional), c = a (asignación).

Sentencia: Instrucción o paso básico en la programación en C que realiza cierta acción, estas pueden
incluir expresiones. En C++ terminan con el operador (;).

Hay múltiples sentencias en C++, de expresión, sentencias nulas (;), de declaración (int a;), de
asignación (farenheit = centígrados+32;), de llamado a función, de selección, de iteración, de
retorno (return 0;), entre otras.

La sentencia compuesta es un grupo de sentencias agrupadas por corchetes (braces {…}), lo que
constituye un bloque de sentencias.

Algunas clasificaciones de los operadores en C++

• Por la cantidad de operandos que se requieren:

o Unarios, binarios, ternarios

• Por la funcionalidad que tienen:

o De asignación

o Aritméticos

o De incremento/decremento

o Relacionales

o Lógicos

o De acceso

o De operaciones a nivel de bits

o Otros

SEPTIEMBRE 2022 24
Unidad 2 – Fundamentos de la Programación (C/C++)

• Por la posición de los operandos: A los operadores entre operandos se les llama infijos
(a+b), mientras que existen operadores sufijos, que se expresan antes del operando (++a,
cast, sizeof) y postfijos que se expresan después de operando (a++).

Dado que es un poco obvia la sintaxis en ciertos operadores (aritméticos o relacionales) ya que
comparten su uso con todos los lenguajes, nos centraremos en este trabajo en el uso de los
operadores que no son tan comunes, o que son especiales para el lenguaje.

Se comenzará presentando todos y definiendo su prioridad:

SEPTIEMBRE 2022 25
Unidad 2 – Fundamentos de la Programación (C/C++)

NOTAS IMPORTANTES:

• Como se puede observar la coma (,) no solo es un signo de puntuación en C/C++ sino que
es conocido como el operador de asignación secuencial.
int a,b,c;

float arreglo[5] = {1,2,4,7,9};

• Una buena práctica en expresiones aritméticas complicadas es realizar el numerador en una


sentencia, y el denominador en otra.

• Cuando se utilizan operadores “mezclados” (suma de entero con flotante, suma de entero
con carácter). Existen reglas de conversión de tipo para el resultado (ver la referencia en
línea de C++). Como se mencionaba anteriormente por lo regular el resultado se degrada a
una menor precisión dependiendo de cuál es el operando de menor precisión utilizado,
aunque en algunos compiladores, si la variable que recibe y uno de los operandos son de
mayor presión, el resultado se promueve a una mayor precisión.

• Cuando varios operadores con la misma prioridad aparecen en una expresión se evalúa
según la asociatividad del operador (de derecha a izquierda o izquierda a derecha), sin
embargo, si no se especifica el orden con los asociativos () de operaciones que incluyan
múltiples operaciones a nivel de bits, sumas o productos, no se garantiza el orden de las
operaciones y el resultado puede variar dependiendo del compilador, esto no depende del
lenguaje.

• Los llamados “puntos de secuencia” o “operadores de evaluación secuencial” como son: las
llamadas a funciones, la coma (,), el AND/OR lógicos, (&&,||), y la expresión condicional
ternaria ( ? : ), si garantizan un orden de evaluación en concreto para sus los operandos. La
expresión condicional ternaria es la forma abreviada del condicional if-else simple*.

• Como puede observarse la mayoría de las asociaciones en operadores comunes


(aritméticos-lógicos) es de izquierda a derecha, cambiando su precedencia con paréntesis.

• Los operadores de igualdad (==) y desigualdad (!=) en realidad son operadores lógicos,
devuelven un valor booleano (0/1), tener cuidado de no confundirlos con asignaciones.

• Hay que recordar que el operador modulo % en C es un operador entero, que devuelve el
residuo entre dos enteros, de manera que por ejemplo 33%15 nos daría como resultado 3
y no 0 que es el residuo real al llegar al resultado final (2.2). Hay que considerar esto cuando
se guarda el resultado de una operación de modulo (int).

A continuación, la especificación de algunos operadores exclusivos del lenguaje C y C++:

SEPTIEMBRE 2022 26
Unidad 2 – Fundamentos de la Programación (C/C++)

Operadores de incremento ++, --:


Siendo la variable i = 20, el valor de la variable x , i después de las siguientes sentencias será*:

x= i++; // primero asigno el valor de i a x,


// y después incremento i, así: x = 20 , i = 21

x= ++i; // primero incremento i,


// y después asigno el valor de i a x, así: x = 21 , i = 21

x= i--; // primero asigno el valor de i a x,


// y después decremento i, así: x = 20 , i = 19

x= --i; // primero decremento i,


// y después asigno el valor de i a x, así: x = 19 , i = 19

Operadores a nivel de bits

Estos son: &(and), |(or), ^(xor), ~(not), <<(desplazamiento a la izquierda – shift left ), >>( desplazamiento a la
derecha - shift right).

Por ejemplo, si a = 60 (0011 1100), b = 13(0000 1101) entonces:

a&b = 12 (0000 1100)

a|b = 61 (0011 1101)

a^b = 49 (0011 0001)

NOTAS: La operación NOT funciona en complemento a 1, es decir utilizando 4 bytes del unsigned int (32 bits),
si negamos 10 (1010) en complemento a 1 con 32 bits tendremos un 4,294,967,285 (como en la calculadora
de Windows) esto es:

NOT(1010) = (1111 1111 1111 1111 1111 1111 1111 0101) .

(Eso hay que tenerlo en mente en los corrimientos de números de 8 bytes)

OPERADOR TERNARIO CONDICIONAL ( ? :)

Así mismo, para comparar variables, por ejemplo, puede utilizarse la forma abreviada del if-else,
llamada condicional ternario (? :), que toma la forma:

condición ? expresión1 : expresión2 ;

La forma típica de usarlo es para la asignación condicional de un valor a una variable, dependiendo
del valor de otra. El resultado del operador se almacena en la variable en cuestión.

SEPTIEMBRE 2022 27
Unidad 2 – Fundamentos de la Programación (C/C++)

(Forma A) (Forma B)

x = (y > 7) ? 25 : 50 ; if (y>7)

x = 25;

else

x = 50;

aquí, las expresiones de la izquierda (Forma A) y la de la derecha (Forma B), hacen lo mismo.

OPERADOR DE ASIGNACION (=)

Este operador tiene una sintaxis especial al asignarse de DERECHA a IZQUIERDA (el simple y la
asignación compuesta), de manera que tienen que cumplirse los siguientes lineamientos con
respecto a sus operandos opDer y opIzq.

opIzq = opDer

• opDer puede ser un valor o una expresión que se evalúa y que deposita su valor en el opIzq.

• El valor del opDer se deposita en el opIzq.

• El valor del opDer debe ser compatible con el tipo de variable del opIzq

• El opIzq debe ser asignable, no puede ser una constante, por ejemplo.

• Mas de una variable puede ser asignada con una asignación simple

La asignación compuesta opera la asignación y otra operación (aritmética) entre dos números, así
las expresiones entre las var1, y var2:

var1+=var2; // equivale a escribir- var1= var1+var2;

var1*=var2; // equivale a escribir- var1= var1*var2;

Y así con los demás operadores, en general al primer operando se le asigna el resultado de alguna
operación con un segundo operando.

Funciones de biblioteca
Funciones de la entrada y salida estándar (stdio.h/iostream)

El manejo en C se realiza por funciones de biblioteca (<stdio.h>).

El uso de printf() es muy simple, y básicamente convierte tipos de datos en texto que puede ser
leído:

SEPTIEMBRE 2022 28
Unidad 2 – Fundamentos de la Programación (C/C++)

• Su primer argumento debe ser una cadena entre comillas simples “ ”, que despliega
como un texto.

• Puede CONCATENAR cadenas de texto y datos en la salida, usando el respectivo


especificador de tipo, e indicando al final el dato con el operador coma ,

• Usa descriptores de tipo, para indicarle que tipo de dato representa el dato que se
desea desplegar en pantalla (%i-%d - entero, %f - flotante, %c - carácter, %ls - entero
largo, etc).*

Ejemplo:
printf(“La nómina del empleado es de %d a pagarse el día %c”, nominaEmpleado, diaSem);

Ambos lenguajes C/C++ identifican en las cadenas que se ingresan (printf(),cout) caracteres
especiales conocidos como de “caracteres de escape” :

La función scanf(), lee la entrada de acuerdo al tipo de formato que se le indica, es decir, puede
leer algo como entero, cadena de caracteres, valores de punto flotante, un solo carácter, etc. La
función scanf() usa los mismos modificadores de formato que son usados en la función
printf() pero para desplegar un dato en cierto formato en pantalla.
Las reglas de scanf() son:
• Recibe una cadena al inicio, que es el especificador del tipo que va a recibir en
comillas dobles “ ”. Lo leído es considerado una cadena que convierte al tipo
adecuado.
• Puede leer un solo carácter o una cadena de estos, solo los reconoce hasta el espacio
en blanco.
• El segundo argumento es la variable a leer, si es de datos, se precede a su nombre
con un símbolo & (operador de dirección, no confundir con AND lógico &&).
• Si se lee una cadena, no se usa el símbolo &.*

SEPTIEMBRE 2022 29
Unidad 2 – Fundamentos de la Programación (C/C++)

Ejemplo:
scanf("%d",&valEntero); // aquí valEntero no es una cadena

Especificador de tipo o formato para printf() y scanf():


El carácter % del especificador implica un “mapeo” hacia la variable que se coloca como argumento
a continuación de la cadena, después de la coma, y la letra que le sigue es el tipo de dato
especificado. Algunos de los especificadores básicos de tipos de datos son*:

• short int y unsigned short int: %hi - %hx - %ho


• int: %d - %i (12 ,-78, enteros decimales simples), %x (hexadecimal), %o(octal)
• unsigned int: %u - %x - %o (siempre imprime una u o U al final)
• long int: %li - %lx - %lo (decimal, hexadecimal, octal y puede imprimir una L al final)
• unsigned long int: %li - %lx - %lo (los mismos de long int con una u o U al final)
• long long int: %lli - %llx - %llo
• float: %f - %e - %g -%a (%a despliega el numero en hexadecimal en notación científica
pero no utiliza el prefijo e (base 10) sino lo escribe con un prefijo p (base 16), ej.
0x1.5FC78p3).
• double: %f - %e (notación científica) - %g (notación científica sin ceros) - %lf - %le -
%lg
• char: %c
• string: %s (que en C en realidad es un arreglo vectorial del chars)
• _Bool: %i - %u (solo la imprime como valor entero sin signo (1/0))

Los especificadores pueden modificarse para que la salida tenga el formato de despliegue que se
requiere. Se puede modificar la precisión con la que se despliega por ejemplo el número de punto
flotante.

float x =3.9993232322;
printf(“%0.2f”, x); // restringe la salida a 2 decimales
printf(“%0.5f”, x); // a 5 decimales

El manejo en C++ se realiza por objetos de flujo de la biblioteca <iostream>.

Como se mencionó anteriormente el formato de entrada y salida en el estilo C++ hace uso de
objetos. Las clases ostream std/istream std, contenidas en el archivo de biblioteca <iostream> a su
vez incluyen a los objetos cout y cin (los especificadores completos son std::ostream::cout y
std::istream::cin). Estos objetos son abstracciones para el manejo de la entrada y la salida que
operan en conjunto con los operadores de flujo << (inserción) y >> (extracción).

<< , inserción es usado para flujos de salida (cout, salida en modo consola)
>>, extracción es usado en flujos de entrada (cin, entrada desde el teclado)

Existen otros objetos de flujo de salida como cerr (flujo de errores) y clog (flujo del registro
estandar). Se pueden hacer múltiples inserciones en el mismo flujo, como se muestra:

cout << dato; // inserta una variable en la consola, haciendo las conversiones

SEPTIEMBRE 2022 30
Unidad 2 – Fundamentos de la Programación (C/C++)

// necesarias de tipo

cout << “El dato es: ” << dato; // inserta una cadena y un dato
cout << “El dato1 es: ” << dato << endl; // endl es un salto de línea “\n”

Es mas correcto utilizar endl, en lugar de “\n”, ya que al usarla, aparte estamos limpiando el buffer
de la consola de salida.

En el caso del flujo de extracción no es necesario por ejemplo especificar la dirección (como en
scanf), ni el tipo de dato destino, y también puede hacerse en cadena.

cin >> dato; // extrae la info del teclado y la deposita en la variable dato
// cualquier espacio en blanco antes o después será ignorado
// se procesa el ingreso hasta que se da la tecla enter

cout >> dato1 >> dato2; // inserta dato tras dato


// por default los datos deben estar separados por
// un espacio en blanco cuando se ingresan así.

La conversión que realiza cin está basada en el tipo de dato que recibe, si se ingresa un tipo de dato
erróneo el dato podría ser interpretado por cin y almacenar un valor indeterminado.

Lo útil de estas abstracciones es que se usan los mismos operandos y objetos para manejar el flujo
de información a archivos.

Las funciones matemáticas <math.h>

C/C++ proporcionan una vasta gama de bibliotecas con funciones de uso común ya programadas,
para facilitarnos el desarrollo de aplicaciones.

Cabe mencionar que las bibliotecas clásicas de C, son archivos .h, y se invocan con estos nombres
(<stdio.h>, <math.h>, etc.) mientras que las bibliotecas C++ no incluyen esta extensión (<iostream>,
<iomanip>, <vector>). Sin embargo, al ser C un subconjunto de C++ las bibliotecas de C no fueron
desechadas y podemos encontrar estas funciones re-escritas para C++ en bibliotecas que no tienen
la extensión .h, y que usan los mismos nombres, pero que inician con la minúscula c. De manera que
existe la biblioteca reescrita <cstdio>, la <cmath>, entre otras.

El lenguaje C/C++ no proporciona operadores para ciertas tareas básicas, como la potencia o la raíz,
pero accediendo a la biblioteca matemática podemos obtener dichas funciones. Se recomienda
checar la referencia en línea para la sintaxis de dichas funciones (¿cómo debe ser la entrada?, ¿cómo
será la salida?, ¿qué opciones o modificadores existen al usarla?). La biblioteca matemática básica
de C/C++ está contenida en <math.h>, o en <cmath>.

La biblioteca matemática define funciones de uso común, pero aparte define tipos que son
necesarios para ciertas operaciones, generalmente resultado de alguna operación que no tiene una
representación matemática válida.

SEPTIEMBRE 2022 31
Unidad 2 – Fundamentos de la Programación (C/C++)

Por ejemplo, Inf es devuelto por alguna de estas funciones (o inclusive printf) debido a la división
entre cero, o a la tendencia a infinito en la representación de algún resultado (numero muy grande).

En realidad, no es un tipo de dato sino una representación. Otro ejemplo sería el tipo NaN, caso
especial de los números muy grandes o muy pequeños que no se pueden representar en el estándar
de punto flotante IEEE-754. En todo caso <cmath> tiene funciones especiales para lidiar con estos
resultados.

Algunas de las funciones más comunes son: las trigonométricas (sin,cos,tan), las exponenciales y
logarítmicas (exp,log), la potencia o raíz (pow,sqrt), el valor absoluto (abs), y las de redondeo
estadístico (floor, ceil, round), entre muchas más que podemos consultar en:

https://docs.microsoft.com/es-es/cpp/standard-library/cmath?view=msvc-170*

A continuación, un cuadro de las funciones mas usadas en la biblioteca matemática:

SEPTIEMBRE 2022 32
Unidad 2 – Fundamentos de la Programación (C/C++)

Funciones generadas por el usuario (creación y manejo).

La modularidad nos proporciona una mayor “abstracción” en el programa, un código reutilizable y


una mejor depuración de errores.

Ejemplo de un programa creado sin funciones:


int main () {
// lectura de datos de entrada
sentencia 1;
sentencia 2;
sentencia 3;
sentencia 4;
// entradas del proceso
sentencia 5;
sentencia 6;
sentencia 7;
// salidas del proceso
sentencia 8;
sentencia 9;
sentencia 10;
}

Ejemplo de un programa creado con funciones:

int main () {

// lectura de datos de entrada

datos_entrada();

// entradas del proceso

datos_proceso();

// salidas del proceso

salida_proceso();

La analogía de la función principal main() con otras funciones en un programa, es precisamente la


analogía de la organización de una empresa donde main() es el jefe y delega tareas a sus
subordinados dependiendo de su habilidad (funciones).

SEPTIEMBRE 2022 33
Unidad 2 – Fundamentos de la Programación (C/C++)

Aunque no se preocupa de como realiza su labor cada empleado, al final organiza la información
para que pueda ser mostrada. La sintaxis de una función en C/C++ es la siguiente:
Tipo_retorno Nombre_func (argumento); // función de un argumento
Tipo_retorno Nombre_func (arg_1,arg_2,arg_3…,arg_n);

// un ejemplo serían las utilizadas en la biblioteca matemática <cmath>

cout << sqrt(400.00) << endl;


double resultado;
resultado = pow(2.0, 3.0);

La clave al utilizar funciones es saber qué información esperan a la entrada (parámetros o


argumentos) y en que formato devuelven su información a la salida (tipo de retorno).

Claves para el uso de funciones

• Se debe recordar presentar la función previamente a usarse, al compilador, mediante


su “declaración” (también llamado prototipo de función), esta es una copia de su
encabezado. El encabezado contiene toda la información acerca de la función
(entradas y dato de salida). Los argumentos entre paréntesis pueden o no llevar un
nombre (conocido como el parámetro formal), pero deben de llevar forzosamente el
tipo. Esto va generalmente antes de main(). La declaración termina con ;
Ejemplo:

// declaración de Funciones
double areaTriangulo (double base,double altura);
double areaCirculo(float radio);
double areaCuadrado (int lado); // al nombre se le conoce como parámetro formal

// o bien
double areaTriangulo (double, double);
double areaCirculo(float);
double areaCuadrado (int); // inclusive si se usan “referencias”, no será
// forzoso el nombre

• Para definir la función debemos utilizar el mismo encabezado que se uso para
declararla. Aquí si es necesario que los parámetros ya tengan los nombres de variable.
En la definición el encabezado no llevará ; , y el cuerpo de instrucciones de la función
llevara { } (tal como la función main).
Ejemplo:

double areaCirculo(double radio){


const double PI = 3.141592;
double area;
area = PI*pow(radio,2); // o pudiera regresar la expresión double así:
return area; // return (PI*pow(radio,2));
}

SEPTIEMBRE 2022 34
Unidad 2 – Fundamentos de la Programación (C/C++)

• Los parámetros que recibe la función entre paréntesis se insertan en ella, por lo que se
pueden utilizar sin definir en cualquier momento, en el cuerpo de la función (el radio).

• La función que regresa una variable debe finalizar con la instrucción return, seguido de esta
(return area). También pudiera regresar la evaluación de una expresión.

• La instrucción return en una función que regresa un dato, deberá de ser la ultima del cuerpo
de la función.

• El tipo de dato en main() que reciba el valor de la función, debe ser del mismo tipo del valor
de retorno de esta. Si cierta función costo_total regresa un double, se debe disponer de
una variable double (factura), para que se asigne el resultado.

Ejemplo:
factura = costo_total(cantidad, precio);

• El tipo de llamada a función anterior es conocido como “paso por valor”, donde las
variables cantidad y precio se insertan en la función, pero como tal dentro de la función,
son copiadas a nuevas variables de su respectivo tipo de dato. Como en la definición:

Ejemplo:
costo_total(double cant, double prec){ // pueden tener otros nombres
// …acciones del cuerpo de la función;
}

Considerando en el ejemplo anterior que cant y prec son copias de los valores cantidad y precio
originales y que pueden tener otros nombres

Claves para el “paso por valor” en funciones

• Los datos deben ser pasados a la función en el orden en el que se escribieron en su


declaración y definición, con exactamente los mismos tipos de datos descritos.
Cuando los tipos son similares (números, por ejemplo) esto es fuente de múltiples
errores lógicos en un programa.
• Al realizar el paso por valor, las variables originales de la función principal
(cantidad,precio) pueden ser conservadas, mientras que en el ámbito de la función,
los valores copia (cant, prec) pueden ser modificados.
• Si no se inserta una variable sino una literal valida de ese tipo de dato, este valor se
substituye en los valores copia, en todas las operaciones que realice la función.

Ejemplo:

factura = costo_total(200.7, 6.45);

SEPTIEMBRE 2022 35
Unidad 2 – Fundamentos de la Programación (C/C++)

En el ejemplo anterior observamos que cantidad y precio son sustituidos con literales validas tipo
double, valores que se copiarán en cant y prec dentro de la función.

Alcance de las variables - Variables locales a la función

Se dice que las variables que se declaran dentro del cuerpo de una definición de función son locales
respecto a esa función, o que esa función es su alcance (ámbito). Así, las variables que se definen
dentro de la parte main del programa se conocen como locales a la parte main del programa, o que
la parte main del programa es su alcance.

Esto nos permite "repetir" nombres de variables en una función en específico y en main, con toda
confianza ya que se guardarán en direcciones de memoria diferentes, aunque tengan el mismo
nombre (aunque por claridad no es recomendable).

Al declarar una variable fuera de main() y fuera de toda función (por ejemplo al principio del
programa). Estamos creando una variable (o constante) "global" que puede ser usada o es válida
para toda función en el programa. Es especialmente útil definir constantes globales de validez en
todo el programa. p.ej.

const double PI = 3.14159;

const double TASA_IVA = 0.15%;

Debido a que las constantes en C se manejaban como definiciones al principio del programa
(#define) se acostumbra que variables y constantes "globales" se declaren cerca de los encabezados,
fuera de toda función.

El uso de variables globales no se recomienda ya que su contenido es fácilmente modificable por


cualquier función. Pueden utilizarse ocasionalmente en casos muy necesarios.

Algo acerca del espacio de nombres.

Es posible tener un espacio de nombres "activo" únicamente para cierta función si lo colocamos
en su ámbito. De esta forma varias funciones pueden estar utilizando diferentes espacios de
nombres en el mismo programa. Es decir, el significado de la directiva "using namespace" se
vuelve local a la función.

Para funciones con entradas y salidas simples y sin uso de objetos definidos por el usuario, el lugar
correcto para usar el espacio de nombres estándar "using namespace std" es después del
encabezado de main() (es decir hacerlo local a main). Y de hecho despues del encabezado de
cualquier función que haga uso de cin, cout, endl.

SEPTIEMBRE 2022 36
Unidad 2 – Fundamentos de la Programación (C/C++)

Sobrecarga de funciones.

C++ ya cuenta con la propiedad de poder "sobrecargar" funciones, esto es: Asignar a dos funciones
diferentes el mismo nombre y esto se hizo por cuestiones de rendimiento.

El único requisito para realizar la sobrecarga es que las "firmas" de ambas funciones sean diferentes.
Es decir que la lista de argumentos (firma) tenga diferencias entre el orden y los tipos solicitados
por ambas.

P.ej. Suponiendo dos declaraciones de función con el mismo nombre "area", la primera es indicada
para el cálculo de área de un círculo y pide un argumento, la siguiente para el área de un triángulo
y pide dos. Esta sintaxis es permitida por estas diferencias.

double area (double radio);

double area (int base, int altura);

Cuando se llama a la función "area" en main() el compilador sabe a cuál de las dos llamar verificando
el número y los tipos de los argumentos de la llamada de función. Si el usuario ingresa un argumento
utilizara la primera, si ingresa dos, la segunda.

No podemos sobrecargar un nombre de función dando dos definiciones que sólo difieren en el tipo
del valor devuelto. Es decir:

int area (int base, int altura);

double area (int base, int altura); // esto no estaría permitido

Nota con la sobrecarga:

Siempre hemos podido ingresar valores numéricos double a una función definida con entradas int,
y el compilador ha realizado la respectiva conversión (o truncamiento de decimales) y viceversa.
Esta es una función natural del compilador (conversión automática de tipos) que se anula cuando
esta función tiene más de una definición (sobrecarga), por lo que debe usarse solo cuando se
requiere verdaderamente.

Funciones vacías o void.

Se había especificado anteriormente que una función puede recibir un grupo de argumentos o
ninguno, y que puede regresar un argumento o ninguno. El tipo de dato-palabra reservada "void"
hace alusión a esta situación, su significado es "vacio".

SEPTIEMBRE 2022 37
Unidad 2 – Fundamentos de la Programación (C/C++)

Hemos estado usando la función main() sin recibir parámetros solo para indicarle al compilador que
se inicia un proceso, se puede manejar con paréntesis vacíos o con la palabra void entre ellos. Así
mismo main() regresa un entero, pero puede regresar un void. Cuando una función no retorna
valores (void) la instrucción return puede no aparecer en el cuerpo de esta, o puede aparecer solo
para indicar el retorno a la función principal (sin argumento) y se sobreentiende que la función
realizará todo el procesamiento de su resultado (imprimirá su propio resultado) sin regresarlo a
ninguna parte del programa.

Este tipo de funciones es ideal por ejemplo para imprimir alertas de texto, o para que reciban datos
y los desplieguen de una manera ordenada, aunque como tal el procesamiento de los datos no se
hace ahi, entre otros usos.

void mostrar_resultados(double grados_f, double grados_c)

using namespace std;

cout << grados_f << " grados Fahrenheit equivale a\n" << grados_c << "
grados Celsius.\n";

return; // expresión return sin argumento

} // o podría no aparecer

La llamada de esta desde la función principal no requiere que una variable obtenga su resultado.

mostrar_resultados(32.5, 0.3);

Con una salida así:

32.5 grados Fahrenheit equivale a

0.3 grados Celsius.

Esto equivale a que el flujo del programa principal continue dentro de la función de tipo void.
Incluso podríamos tener una función que no reciba ni devuelva argumentos.

SEPTIEMBRE 2022 38
Unidad 2 – Fundamentos de la Programación (C/C++)

void inicializar_pantalla()

system(“cls”); // llamada al sistema que limpia pantalla

// de la biblioteca <cstdlib> - return implícito

La llamada en main será simplemente:

inicializar_pantalla();

Aunque aquí la instrucción return no es necesaria, es una instrucción que puede ser importante
para regresar al flujo principal del programa

Ejemplo:
void reparto_de_helado(int numero, double peso_total)

using namespace std;

double porción;

if (numero == 0)

return;

porcion = peso_total/numero;

cout << "Cada uno recibe "<< porcion << " gramos de helado." << endl;

En el ejemplo anterior, se usó return, dentro de la pregunta si?, (if) con el propósito de que si el
número es cero, se regrese al flujo del programa principal, esto nos ahorra una división entre cero
que se ocasionaría al llegar a calcular la porción.

SEPTIEMBRE 2022 39
Unidad 2 – Fundamentos de la Programación (C/C++)

Paso de parámetros por referencia.

Hasta ahora si pasábamos por valor, una variable a cierta función, el valor de estas variables no se
modificaba en absoluto, pero causábamos la copia e inserción de estas en la función, lo que en
algunas ocasiones (como cuando no importa modificar los valores iniciales de la variable) no es
eficiente para la memoria reservada para las variables “con nombre”.

En el paso por referencia el valor que introducimos en la función debe ser una variable, pero lo que
pasamos en realidad es su dirección en memoria. La función entonces trabajará con las variables
originales de la función principal y no con copias, aunque estas sean “rebautizadas” o tengan otro
nombre. Esto se hace con el operador & que debe anteceder al nombre de la variable (debe ir
después del tipo de dato) tanto en la declaración de la función como en el encabezado de su
definición.

Las siguientes sintaxis son válidas:

obtener_numeros(int& primer_dato, double& segundo_dato);

// con & pegado al tipo de dato

o bien:

obtener_numeros(int &primer_dato, double &segundo_dato); // más legible

Al ser las direcciones de memoria de las variables originales (del flujo de programa principal), hay
que tener en cuenta que el llamado a obtener_numeros podría modificar los valores originales. Esto
sucede no importando si en la definición de la función primer_dato y segundo_dato tienen otros
nombres (entrada1, entrada2), solo deben de coincidir en el tipo.

void obtener_numeros(int &entrada1, double &entrada2){

// líneas del programa;

SEPTIEMBRE 2022 40
Unidad 2 – Fundamentos de la Programación (C/C++)

Dentro de la función primer_dato y segundo_dato son “apodados” como entrada1 y entrada2,


aunque siguen siendo la misma dirección de memoria, cualquier cambio a estos apodos será
también realizado en las variables originales.

Es perfectamente válido mezclar en una llamada a función ambos tipos de paso de parámetros. Esto
regularmente se hace porque hay variables que si es crítico que la función no modifique y se
mantengan intactos, y variables que es necesario que la función modifique (ver ejemplo paso por
referencia). Una llamada a función podría verse así:

double funcion_principal(int &par1, int par2, double &par3);

La diferencia estará en cómo serán tratadas las variables (ver ejemplo*).

Al ver lo anterior se puede decir que el proceso de realizar un programa que requiera paso por
referencia para funcionar correctamente debe realizarse con cuidado, ya que, si olvidamos incluir el
símbolo &, el programa creara una variable local (copia) para esa variable en la función, y el
compilador no nos manejará ningún error (el error será lógico, ver ejemplo*)

SEPTIEMBRE 2022 41

También podría gustarte