Unidad 2
Unidad 2
Unidad 2
UNIDAD 2 (contenido)
• Eliminación del uso de la sentencia goto, o de saltos a etiquetas. (Edsger Dijksta - 1968).
• 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.
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.
• 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.
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.
SEPTIEMBRE 2022 3
Unidad 2 – Fundamentos de la Programación (C/C++)
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.
Los tipos de datos que regularmente representamos son los mas simples de la informática:
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.
SEPTIEMBRE 2022 4
Unidad 2 – Fundamentos de la Programación (C/C++)
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).
ejemplo
SEPTIEMBRE 2022 5
Unidad 2 – Fundamentos de la Programación (C/C++)
ejemplo
ejemplo
NOTA: Puede especificarse la salida del seudocódigo con algún carácter especial (>>>)
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++)
[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).
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:
SEPTIEMBRE 2022 7
Unidad 2 – Fundamentos de la Programación (C/C++)
Simbolos Básicos:
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++)
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
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 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.
SEPTIEMBRE 2022 10
Unidad 2 – Fundamentos de la Programación (C/C++)
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).
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++)
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.
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:
• 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
Signos de puntuación: Sirven para hacer énfasis en algún elemento del lenguaje:
• ‘ ’.- Algo entre comillas simples enfatiza un solo carácter (numero o letra).
• { - } .- Enfatiza un ámbito del programa, es decir una sección aparte del programa con
ciertas características.
La función
SEPTIEMBRE 2022 13
Unidad 2 – Fundamentos de la Programación (C/C++)
✓ 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.
int main()
multiplicaDosNum(5,4);
multiplicaDosNum(10,20);
multiplicaDosNum(50,2);
return 0;
int result = x * y;
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).
▪ 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.
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)
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
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().
// código // código
return 0; return 0;
} }
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 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 << “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>
int main(){
int num;
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::endl;
SEPTIEMBRE 2022 17
Unidad 2 – Fundamentos de la Programación (C/C++)
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++)
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){
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:
SEPTIEMBRE 2022 19
Unidad 2 – Fundamentos de la Programación (C/C++)
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.
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 = ‘\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.
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++)
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:
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.
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.
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.
o De asignación
o Aritméticos
o De incremento/decremento
o Relacionales
o Lógicos
o De acceso
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.
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;
• 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*.
• 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).
SEPTIEMBRE 2022 26
Unidad 2 – Fundamentos de la Programación (C/C++)
Estos son: &(and), |(or), ^(xor), ~(not), <<(desplazamiento a la izquierda – shift left ), >>( desplazamiento a la
derecha - shift right).
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:
Así mismo, para comparar variables, por ejemplo, puede utilizarse la forma abreviada del if-else,
llamada condicional ternario (? :), que toma la forma:
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.
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 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:
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 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.
• 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
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
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
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.
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*
SEPTIEMBRE 2022 32
Unidad 2 – Fundamentos de la Programación (C/C++)
int main () {
datos_entrada();
datos_proceso();
salida_proceso();
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);
// 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:
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
Ejemplo:
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.
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.
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.
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.
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:
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.
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.
cout << grados_f << " grados Fahrenheit equivale a\n" << grados_c << "
grados Celsius.\n";
} // 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);
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()
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)
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++)
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.
o bien:
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.
SEPTIEMBRE 2022 40
Unidad 2 – Fundamentos de la Programación (C/C++)
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í:
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