Manual de Programación c/c++ Ricky Bonilla

61
Manual de Laboratorio de Programación I 2016 Autor: Ricky Deyrin Bonilla Rodríguez Profesor: Ing. Elsner Boanerge González Facultad: Ciencia, Tecnología y Ambiente Carrera: Ingeniería en Sistemas de

Transcript of Manual de Programación c/c++ Ricky Bonilla

Page 1: Manual de Programación c/c++ Ricky Bonilla

Manual de Laboratorio de Programación I

2016

Autor: Ricky Deyrin Bonilla RodríguezProfesor: Ing. Elsner Boanerge GonzálezFacultad: Ciencia, Tecnología y AmbienteCarrera: Ingeniería en Sistemas de Información

Page 2: Manual de Programación c/c++ Ricky Bonilla

Introducción

Creador del lenguaje CDennis MacAlistair Ritchie (9 de septiembre de 1941 - 12 de octubre de 2011) fue un científico de la computación estadounidense.

Colaboró en el diseño y desarrollo de los sistemas operativos Multics y Unix, así como el desarrollo de varios lenguajes de programación como el C, tema sobre el cual escribió un célebre clásico de las ciencias de la computación junto a Brian Wilson Kernighan: El lenguaje de programación C.

¿Qué es el lenguaje C?C es un lenguaje de programación de propósito general que ofrece economía sintáctica, control de flujo y estructuras sencillas y un buen conjunto de operadores. No es un lenguaje de muy alto nivel y más bien un lenguaje pequeño, sencillo y no está especializado en ningún tipo de aplicación. Esto lo hace un lenguaje potente, con un campo de aplicación ilimitado y sobre todo, se aprende rápidamente. En poco tiempo, un programador puede utilizar la totalidad del lenguaje.

Page 3: Manual de Programación c/c++ Ricky Bonilla

Este lenguaje ha sido estrechamente ligado al sistema operativo UNIX, puesto que fueron desarrollados conjuntamente. Sin embargo, este lenguaje no está ligado a ningún sistema operativo ni a ninguna máquina concreta. Se le suele llamar lenguaje de programación de sistemas debido a su utilidad para escribir compiladores y sistemas operativos, aunque de igual forma se puede desarrollar cualquier tipo de aplicación.

Etapas o pasos en la creación de un programaDefinición del problema

Esta fase la proporciona el enunciado del problema, el cual requiere una definición clara y precisa (no debe ser ambiguo). Es importante que se entienda perfectamente lo que pretendemos que haga la computadora para poder continuar con la siguiente etapa.

Análisis del problema

Una vez que se ha comprendido lo que se desea que la computadora haga, la etapa de análisis es muy importante ya que en ésta se identifican tres factores indispensables:

1. Qué información se necesita para obtener el resultado deseado (datos de entrada).2. Qué información se desea producir (datos de salida).3. Los métodos y fórmulas que se necesitan para procesar los datos y producir esa salida.

Diseño y técnicas para la formulación de un algoritmo

La etapa de diseño se centra en desarrollar el algoritmo basándonos en las especificaciones de la etapa del análisis; podemos representar un algoritmo mediante el diagrama de flujo o el pseudocódigo.

Codificación

En la etapa de codificación se transcribe el algoritmo definido en la etapa de diseño en un código reconocido por la computadora; es decir, en un lenguaje de programación; a éste se le conoce como código fuente. Por ejemplo el lenguaje “C” es un lenguaje de programación y es el que utilizaremos en el presente curso.

Page 4: Manual de Programación c/c++ Ricky Bonilla

Prueba y depuración

La prueba consiste en capturar datos hasta que el programa funcione correctamente. A la actividad de localizar errores se le llama depuración. Existen dos tipos de pruebas: de sintaxis y de lógica.

Las pruebas de sintaxis se ejecutan primero, son las más sencillas y las realiza el compilador del programa cada vez que se ejecuta el programa hasta que el código no presente errores, es decir que la sintaxis que requiere el lenguaje sea la correcta, de lo contrario el propio compilador va mostrando los errores encontrados para que se modifiquen y se pueda ejecutar el código; estos errores pueden ser falta de paréntesis, o puntos y comas o palabras reservadas mal escritas.

Las pruebas de lógica son las más complicadas ya que éstas las realiza el programador; consisten en la captura de diferentes valores y revisar que el resultado sea el deseado, es decir el programador tendría que modificar el código hasta que el programa funcione correctamente.

Documentación

Es la guía o comunicación escrita que permite al programador o al usuario conocer la funcionalidad del programa.

La documentación sirve para que el código fuente sea más comprensible para el programador o para otros programadores que tengan que utilizarlo, así como para facilitar futuras modificaciones (mantenimiento).

Hay dos tipos de documentación:

• Interna. Se generan en el mismo código y generalmente es mediante comentarios.• Externa. Son los manuales y es independiente al programa. También puede ser la ayuda en el mismo software.

Mantenimiento

Se dice que un programa no se termina al 100%, ya que es necesario hacer algún cambio, ajuste o complementación para que siga funcionando correctamente; para llevarlo a cabo se requiere que el programa esté bien documentado.

Page 5: Manual de Programación c/c++ Ricky Bonilla

¿Qué es un identificador?

Un identificador es una secuencia de caracteres alfabéticos, numéricos y el guión bajo. Con ellos podemos dar nombre a variables, constantes, tipos de dato, nombres de funciones o procedimientos, etcétera.

Cada lenguaje de programación tiene sus propias características del tamaño del identificador; el estándar de lenguaje C no especifica un límite de tamaño para un identificador, pero para ciertas implementaciones de C11 sólo los primeros 31 caracteres son significativos (ANSI C). El programador tiene libertad para darle cualquier nombre a un identificador, siguiendo estas reglas:

1. Debe comenzar con una letra (A a Z) mayúscula o minúscula y no puede contener espacios en blanco.

En lenguaje C, el carácter “_” (guion bajo) es considerado como letra, por lo que se puede utilizar como primer carácter.

2. El lenguaje C distingue mayúsculas de minúsculas porque tienen diferente código ASCII.

3. Letras, dígitos y el carácter guion bajo están permitidos después del primer carácter.

4. No pueden existir dos identificadores iguales, es decir, dos elementos de un programa no pueden nombrarse de la misma forma. Sin embargo, un identificador puede aparecer más de una vez en un programa.

5. No se puede utilizar una palabra reservada como identificador, sin embargo, los identificadores estándar se pueden redefinir.

6. En lenguaje C existen identificadores que podrían tener uno o varios puntos, tales como: persona.apellidoPaterno.

El punto indica el acceso a un campo de una estructura.

Sugerencias:

1. El identificador debe tener un nombre que sea significativo, es decir, que dé una idea de la información que almacena.

2. No utilizar nombres muy largos, es mejor utilizar abreviaturas estándar para que éstos tengan una longitud razonable.

Page 6: Manual de Programación c/c++ Ricky Bonilla

3. En lenguaje C es usual escribir variables en minúscula, dejando las mayúsculas para las constantes. En los casos de nombres compuestos se suele poner la inicial de la segunda palabra en mayúscula.

Para poder almacenar los datos de cualquier índole, podemos crear un identificador con un nombre relativo a lo que guardaremos en el identificador:

¿Qué son los variables?Una variable, en realidad, no es más que un nombre para identificar una (o varias) posiciones de memoria donde el programa guarda los distintos valores de una misma entidad. Un programa debe DEFINIR a todas las variables que utilizará, antes de comenzar a usarlas, a fin de indicarle al compilador de que tipo serán, y por lo tanto cuanta memoria debe destinar para albergar a cada una de ellas.Para definir una variable debe tener en cuenta:

Darles nombre que tengan un significado que luego permita una fácil lectura del programa.

Page 7: Manual de Programación c/c++ Ricky Bonilla

Los identificadores deben comenzar con una letra ó con el símbolo de subrayado "_" , pudiendo continuar con cualquier otro caractér alfanumérico ó el símbolo "_" .

El lenguaje C es sensible al tipo de letra usado; así tomará como variables distintas a una llamada "variable”, de otra escrita como "VARIABLE". Es una convención entre los programadores de C escribir los nombres de las variables y las funciones con minúsculas, reservando las mayúsculas para las constantes.

Los compiladores reservan determinados términos ó palabras claves (Keywords) para el uso sintáctico del lenguaje, tales como: asm, auto, break, case, char, do, for, etc. Si bien estas palabras están definidas para el ANSI C, los distintos compiladores extienden esta definición a OTROS términos, por lo que es aconsejable leer la tabla completa de palabras reservadas del compilador que se vaya a usar, para no utilizarlas en nombres de variables.

¿Cuáles son los tipos de datos?Los diferentes objetos de información con los que un algoritmo o programa trabaja se conocen colectivamente como datos. Todos los datos tienen un tipo asociado con ellos; el tipo de un dato es el conjunto (rango) de valores que puede tomar durante el programa. Por ejemplo el tipo de un dato determina la naturaleza del conjunto de valores que puede tomar una variable.Tipos básicos predefinidos:

int (entero) float (flotante double (flotante de doble precisión) char (carácter) bool (booleano o lógico)

Las formas de declarar un identificador con los tipos de datos anteriores son los siguientes:

Page 8: Manual de Programación c/c++ Ricky Bonilla

El compilador dará como error de "Definición incorrecta" a la definición de variables con nombres del tipo de:

¿Qué son las constantes?Aquellos valores que una vez compilado el programa no pueden ser cambiados, como por ejemplo los valores literales que hemos usado hasta ahora en las inicializaciones de las variables (100, 3, ‘a’, '\n’), suelen denominarse CONSTANTES.Como dichas constantes son guardadas en memoria de la manera que al compilador le resulta más eficiente suelen aparecer ciertos efectos secundarios, a veces desconcertantes, ya que las mismas son afectadas por las reglas de RECONVERSION AUTOMATICA DE TIPO vista previamente.A fin de tener control sobre el tipo de las constantes, se aplican las siguientes reglas:

Page 9: Manual de Programación c/c++ Ricky Bonilla

Una variable expresada como entera (sin parte decimal) es tomada como tal salvo que se la siga de las letras F ó L (mayúsculas ó minúsculas) ejemplos:1 : tomada como ENTERA1F : tomada como FLOAT 1L : tomada como LONG DOUBLEUna variable con parte decimal es tomada siempre como DOUBLE, salvo que se la siga de la letra F ó L 1.0 : tomada como DOUBLE 1.0F : tomada como FLOAT 1.0L : tomada como LONG FLOATSi en cualquiera de los casos anteriores agregamos la letra U ó u la constante queda calificada como UNSIGNED (consiguiendo mayor alcance) : 1u : tomada como UNSIGNED INT1.0UL : tomada como UNSIGNED LONG DOUBLEUna variable numérica que comienza con "0" es tomado como OCTAL asi : 012 equivale a 10 unidades decimalesUna variable numérica que comienza con "0x" ó "0X" es tomada como hexadecimal: 0x16 equivale a 22 unidades decimales y 0x1A a 26 unidades decimales.

Conversiones de datosLas conversiones automáticas pueden ser controladas a gusto por el programador, imponiendo el tipo de variable al resultado de una operación. Los tipos de datos que si se pueden transformar a otro tipo de dato son las “S” de sí y las “N” de no son las que no se pueden transformar:

Page 10: Manual de Programación c/c++ Ricky Bonilla

Ejemplo 1:En la conversión de Double a Short :

Page 11: Manual de Programación c/c++ Ricky Bonilla

Ejemplo 2:En la conversión de Char a Short:

¿Qué expresiones aritméticas existen en C?

De la evaluación de una expresión aritmética siempre se obtiene un valor de tipo entero o real. En lenguaje C existen algunos operadores que no se utilizan en pseudocódigo, y al revés. A continuación, se van a ver algunas similitudes y diferencias entre ambos lenguajes.

Las expresiones se evalúan de acuerdo con la precedencia de los operadores. Ante una secuencia de operadores de igual precedencia, la evaluación se realiza según el orden de escritura, de izquierda a derecha. El orden de evaluación puede modificarse usando paréntesis.

ComentariosLa primera línea de un programa en C suele ser una línea de comentario, en la cual se escribe el nombre del programa, lo que realiza, los datos del autor, la fecha y la versión. Las líneas de comentario en C estándar se encierran entre los caracteres /* y */. En C11 los comentarios se inician con //.

Page 12: Manual de Programación c/c++ Ricky Bonilla

¿Qué son los arreglos en C?Un arreglo es un tipo de dato estructurado que almacena en una sola variable un conjunto limitado de datoso elementos del mismo tipo. Asimismo, es un conjunto de localidades de memoria contiguas donde la direcciónmás baja corresponde al primer elemento y la dirección más alta al último. Por sí mismo, el nombre del arreglo apunta a la dirección del primer elemento del arreglo. Los datos se llaman elementos del arreglo y su posición se numera consecutivamente: 1, 2, 3…n. Un arreglo en lenguaje C inicia en la posición cero, por lo tanto el i-ésimo elemento está en la posición i-1, es decir si el arreglo llamado a tiene n elementos, sus nombres son a[0], a[1], ..., a[n-1]. El tipo de elementos almacenados en el arreglo puede ser cualquier tipo de dato.Para acceder a un elemento específico de un arreglo se usa un índice o subíndice.

Un arreglo se caracteriza por:1. Ser una lista de un número finito de n elementos del mismo tipo.2. Almacenar los elementos del arreglo en memoria contigua.3. Tener un único nombre de variable que representa a todos los elementos y éstos se diferencian por un índice o subíndice.4. Acceder de manera directa o aleatoria a los elementos individuales del arreglo, por el nombre del arreglo y el índice o subíndice.Los arrays, arreglos o vectores forman parte de la amplia variedad de estructuras de datos que nos ofrece C++, siendo además una de las principales y más útiles estructuras que podremos tener como herramienta de programación. Los arrays, arreglos o vectores (como los quieras llamar), son utilizados para almacenar múltiples valores en una única variable. En un aspecto más profundo, los arrays, permiten almacenar muchos valores en posiciones de memoria continuas, lo cual permite acceder a un valor u otro de manera rápida y sencilla. Estos valores pueden ser números, letras o cualquier tipo de variable que deseemos incluso tipos de datos propios.En múltiples ocasiones es necesario almacenar gran cantidad de información en una variable y a menudo sucede que no conocemos con

Page 13: Manual de Programación c/c++ Ricky Bonilla

exactitud la cantidad de datos que debemos almacenar, pero sabemos que sí sería más de uno, como por ejemplo almacenar las identificaciones de las personas ingresadas al sistema. Los arrays, arreglos o vectores son una estructura que nos permite solucionar este tipo de problemas.

Ejemplos de arreglosImaginemos que queremos crear un programa con el cual podamos de algún modo almacenar los títulos y los autores de diferentes libros. El usuario es el encargado de suministrar la información de cada libro, así entonces, dado que es el usuario quien lo hace, nosotros no tenemos manera alguna de saber cuántos libros va querer él ingresar por medio de nuestro programa. El caso principal es que queremos almacenar en la memoria el título y el autor de TODOS y cada uno de los libros.

¿Cómo declarar un Array o Vector en C++?Para declarar un vector en C++, se deben seguir las mismas normas básicas que se siguen para declarar una variable cualquiera, con un pequeño cambio en la sintaxis. Para declarar un vector, arreglo o como lo quieras llamar, necesitaremos saber el tipo de los datos que irán al interior de este, es decir, serán número enteros, o número decimales o cadenas de texto, etc. necesitamos también, como siempre, un nombre para el vector y un tamaño máximo. La sintaxis para declarar un vector en C++ es la siguiente: tipo_de_dato nombre_del_vector[tamaño];Para declarar un vector en C++, debemos definirle un tipo de los datos, sea entero, float, string, etc., debemos darle un nombre y al interior de los corchetes "[ ]" debemos poner el tamaño máximo que tendrá el vector, es decir la cantidad máxima de datos que podrá contener (recuerda que en C++ esto es necesario hacerlo). A continuación un ejemplo de cómo declarar un arreglo:

Page 14: Manual de Programación c/c++ Ricky Bonilla

Ahora mandaremos a imprimir este arreglo de la siguiente forma:

Al compilar el programa tendremos el siguiente resultado:

Page 15: Manual de Programación c/c++ Ricky Bonilla

Arreglos bidimensionalesSon arreglos con dos dimensiones, es decir tienen filas y columnas, los valores de la variable se llaman elementos, de la misma forma que en los arreglos unidimensionales y sus índices están compuesto por dos caracteres que indican posición. Para acceder a su elemento se debe poner su posición compuesta de los dos índices.Por ejemplo para la matriz A y la posición en la fila 1 y la columna 2. Se debe poner A [1][2], denotándose que el primer índice indica la posición de la fila y el segundo la posición de la columna.

0 1 2 3 4 5 6 70123

Nota: todos los arreglos inician desde 0.

Un arreglo bidimensional se declara de la siguiente manera:

Page 16: Manual de Programación c/c++ Ricky Bonilla

Ahora mandaremos a imprimir este arreglo bidimensional de la siguiente forma:

Al compilar el programa tendremos el siguiente resultado:

Bibliotecas o librerías en C

Junto con los compiladores de C y C++, se incluyen ciertos archivos llamados bibliotecas más comúnmente librerías. Las bibliotecas contienen el código objeto de muchos programas que permiten hacer cosas comunes, como leer el teclado, escribir en la pantalla, manejar números, realizar funciones matemáticas, etc.Las bibliotecas están clasificadas por el tipo de trabajos que hacen, hay bibliotecas de entrada y salida, matemáticas, de manejo de memoria, de manejo de textos y como imaginarás existen muchísimas librerías disponibles y todas con una función específica.Nota: Muchos personas consideran que el nombre adecuado es archivos de biblioteca, y están en lo correcto. Sin embargo, la mayoría llamamos a estos archivos librerías, y también me incluyo entre estos. El error

Page 17: Manual de Programación c/c++ Ricky Bonilla

proviene del nombre en inglés, que es library. Este término se traduce como biblioteca, y no como librería. De este modo a lo largo de esta sección las llamaré de cualquiera de las dos formas, para estar más claros.Hay un conjunto de bibliotecas (o librerías) muy especiales, que se incluyen con todos los compiladores de C y de C++. Son las librerías (o bibliotecas) ANSI o estándar. También hay librerías que no son parte del estándar pero en esta sección sólo usaremos algunas bibliotecas (o librerías) ANSI.

¿Cómo declarar una librería en C++?Veamos a continuación como se haría la declaración de unas cuantas librerías conocidas, recuerda que ese pueden declarar todas las librerías necesarias y siempre debe hacerse al comienzo del código fuente:

#include "iostream"#include "string"#include <math.h>#include <conio.h>

¿Qué es un struct?Estas estructuras controlan cómo se ejecutan los programas, es decir el orden de las instrucciones, ya que tienen un solo punto de entrada y un punto de salida. En la programación estructurada se mezclan las estructuras de control y las podemos clasificar en:

Estructuras de control

Secuencial

Selectiva

Repetitiva o de iteración

Page 18: Manual de Programación c/c++ Ricky Bonilla

Estructura de control secuencialLas instrucciones se ejecutan en orden, una por una desde la primera hasta la última, es decir el programa ejecuta todas las instrucciones del programa en el orden establecido sin saltarse ninguna de ellas.

Estructura de control selectiva o alternativaDe acuerdo con una condición que puede ser verdadera o falsa se elige una opción, la cual realiza una acción (una o varias instrucciones). La condición puede ser simple o compuesta (una o varias).

Estructura de control repetitiva o de iteración condicionadaUna acción se repite una cantidad definida o indefinida de veces mientras una condición sea verdadera.

La lógica de programación se centra sobre todo en el cuerpo del programa, utilizando las estructuras de datos y las de control, además de la programación modular. Para diseñar los programas de computadora, comúnmente se utilizan diferentes estructuras de control a fin de poder llegar a la solución de un problema, cuáles y cuántas dependerán del problema mismo.

Para facilitar la comprensión de la lógica de programación, primero realizaremos el diagrama de flujo, el pseudocódigo y lenguaje C de algunos ejercicios y después solamente el pseudocódigo y lenguaje C.

Una estructura contiene varios datos. La forma de definir una estructura es haciendo uso de la palabra clave struct. Aquí hay ejemplo de la declaración de una estructura:

Page 19: Manual de Programación c/c++ Ricky Bonilla

Estructuras anidadasUna estructura puede estar dentro de otra estructura a esto se le conoce como anidamiento o estructuras anidadas. Ya que se trabajan con datos en estructuras si definimos un tipo de dato en una estructura y necesitamos definir ese dato dentro de otra estructura solamente se llama el dato de la estructura anterior.Definamos una estructura en nuestro programa:

A continuación un programa completo sobre los struct, para una mejor compresión y dar por finalizado este tema:

Page 20: Manual de Programación c/c++ Ricky Bonilla

1. Diseñe un programa en el que se puedan registrar los datos personales de dos atletas en una estructura, tales como: nombre y país, además cree otra estructura en la que pueda guardar datos como: el deporte que practica y el número de medallas obtenidas. Las estructuras deben actuar simultáneamente.

a) Declaramos las librerías que usaremos (una en este caso), además del using namespace ya antes visto.

b) Declaramos la primera estructura llamada struct datos

c) Declaramos la segunda estructura que usaremos llamada struct atleta, además de que anidaremos la estructura anterior, con el fin de declarar una solo estructura en el int main().

Page 21: Manual de Programación c/c++ Ricky Bonilla

d) Entramos en el int main() en el cual declararemos la estructura de atleta que contiene a las estructura datos

e) Mandamos a imprimir en pantalla los requerimientos a pedir, en este caso para el primer atleta

Page 22: Manual de Programación c/c++ Ricky Bonilla

En la imagen anterior, al pedir al usuario que ingrese los datos, podemos ver que primero para poder ingresar un dato en una variable en específico, debemos poner la variable que le dimos a la estructura atleta que en este caso es: ats[2].

f) Ahora vamos a pedir los datos del segundo atleta con el mismo procedimiento:

g) Sin olvidar el return 0

Page 23: Manual de Programación c/c++ Ricky Bonilla

De este modo hemos terminado con los requerimientos del programa, por lo cual proseguiremos a imprimir en pantalla, lo cual dará como resultado lo siguiente:

Una vez que hayamos ingresado los datos el programa finalizará:

Page 24: Manual de Programación c/c++ Ricky Bonilla

FicherosLos ficheros, en contraposición con las estructuras de datos vistas hasta ahora (variables simples, vectores, registros, etc.), son estructuras de datos almacenadas en memoria secundaria. Para utilizar la información en memoria principal se emplea fundamentalmente la instrucción de asignación; sin embargo, para guardar o recuperar información de un fichero es necesario realizar una serie de operaciones que describiremos en este apartado. El formato de declaración de un fichero es el siguiente:

FILE * nom_ var_fich;En otros lenguajes la declaración del fichero determina el tipo de datos que se van a almacenar en él. En C la filosofía es distinta, todos los ficheros almacenan bytes y es cuando se realiza la apertura y la escritura cuando se decide cómo y qué se almacena en el mismo; durante la declaración del fichero no se hace ninguna distinción sobre el tipo del mismo. En la operación de apertura se puede decidir si el fichero va a ser de texto o binario, los primeros sirven para almacenar caracteres, los segundos para almacenar cualquier tipo de dato. Si deseamos leer un fichero como el autoexec.bat utilizaremos un fichero de texto, si queremos leer y escribir registros (struct) usaremos un fichero binario.

Función fopenEsta función sirve para abrir y crear ficheros en disco. El valor de retorno es un puntero a una estructura FILE. Los parámetros de entrada son:

1. Nombre: una cadena que contiene un nombre de fichero válido, esto depende del sistema operativo que estemos usando. El nombre puede incluir el camino completo.

Page 25: Manual de Programación c/c++ Ricky Bonilla

2. Modo: especifica en tipo de fichero que se abrirá o se creará y el tipo de datos que puede contener, de texto o binarios:

r: sólo lectura. El fichero debe existir. w: se abre para escritura, se crea un fichero nuevo o se

sobreescribe si ya existe. a: añadir, se abre para escritura, el cursor se sitúa al final del

fichero. Si el fichero no existe, se crea. r+: lectura y escritura. El fichero debe existir. w+: lectura y escritura, se crea un fichero nuevo o se sobreescribe

si ya existe. a+: añadir, lectura y escritura, el cursor se sitúa al final del

fichero. Si el fichero no existe, se crea. t: tipo texto, si no se especifica "t" ni "b", se asume por defecto

que es "t" b: tipo binario.

Por aquí un ejemplo de cómo se declara un fopen:

Función fcloseEs importante cerrar los ficheros abiertos antes de abandonar la aplicación. Esta función sirve para eso. Cerrar un fichero almacena los datos que aún están en el buffer de memoria, y actualiza algunos datos de la cabecera del fichero que mantiene el sistema operativo. Además permite que otros programas puedan abrir el fichero para su uso. Muy a menudo, los ficheros no pueden ser compartidos por varios programas.

Page 26: Manual de Programación c/c++ Ricky Bonilla

Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algún error, el valor de retorno es la constante EOF. El parámetro es un puntero a la estructura FILE del fichero que queremos cerrar.

A continuación un ejemplo de cómo cerrar el fichero que hemos abierto:

Función fgetcEsta función lee un carácter desde un fichero.

El valor de retorno es el carácter leído como un unsigned char convertido a int. Si no hay ningún carácter disponible, el valor de retorno es EOF. El parámetro es un puntero a una estructura FILE del fichero del que se hará la lectura.

Función fputcEsta función escribe un carácter a un fichero.

El valor de retorno es el carácter escrito, si la operación fue completada con éxito, en caso contrario será EOF. Los parámetros de entrada son el

Page 27: Manual de Programación c/c++ Ricky Bonilla

carácter a escribir, convertido a int y un puntero a una estructura FILE del fichero en el que se hará la escritura.

Función fgetsEsta función está diseñada para leer cadenas de caracteres. Leerá hasta n-1 caracteres o hasta que lea un retorno de línea. En este último caso, el carácter de retorno de línea también es leído.El parámetro n nos permite limitar la lectura para evitar desbordar el espacio disponible en la cadena.El valor de retorno es un puntero a la cadena leída, si se leyó con éxito, y es NULL si se detecta el final del fichero o si hay un error. Los parámetros son: la cadena a leer, el número de caracteres máximo a leer y un puntero a una estructura FILE del fichero del que se leerá.

Función fputsLa función fputs escribe una cadena en un fichero. No se añade el carácter de retorno de línea ni el carácter nulo final.El valor de retorno es un número no negativo o EOF en caso de error. Los parámetros de entrada son la cadena a escribir y un puntero a la estructura FILE del fichero donde se realizará la escritura.

Función fwriteEsta función también está pensada para trabajar con registros de longitud constante y forma pareja con fread. Es capaz de escribir hacia un fichero uno o varios registros de la misma longitud almacenados a partir de una dirección de memoria determinada.

El valor de retorno es el número de registros escritos, no el número de bytes. Los parámetros son: un puntero a la zona de memoria donde se almacenarán los datos leídos, el tamaño de cada registro, el número de registros a leer y un puntero a la estructura FILE del fichero del que se hará la lectura.

Page 28: Manual de Programación c/c++ Ricky Bonilla

En la siguiente imagen mandaremos a pedir los datos requeridos con el fin de guardarlos en el fichero dándole una ubicación de memoria del fichero:

Función freadEsta función está pensada para trabajar con registros de longitud constante. Es capaz de leer desde un fichero uno o varios registros de la misma longitud y a partir de una dirección de memoria determinada. El usuario es responsable de asegurarse de que hay espacio suficiente para contener la información leída.El valor de retorno es el número de registros leídos, no el número de bytes. Los parámetros son: un puntero a la zona de memoria donde se almacenarán los datos leídos, el tamaño de cada registro, el número de registros a leer y un puntero a la estructura FILE del fichero del que se hará la lectura.Con esta función estamos mandando a pedir que primeramente hemos guardado el fichero:

Función feof

Page 29: Manual de Programación c/c++ Ricky Bonilla

Esta función sirve para comprobar si se ha alcanzado el final del fichero. Muy frecuentemente deberemos trabajar con todos los valores almacenados en un archivo de forma secuencial, la forma que suelen tener los bucles para leer todos los datos de un archivo es permanecer leyendo mientras no se detecte el fin de fichero. Esta función suele usarse como prueba para verificar si se ha alcanzado o no ese punto.

El valor de retorno es distinto de cero sólo si no se ha alcanzado el fin de fichero. El parámetro es un puntero a la estructura FILE del fichero que queremos verificar.

En la siguiente imagen presentaremos un poco de la estructura que debe llevar un feof:

En este caso el feof fue usado en conjunto con el ciclo while, dicha acción quiere decir que mientras no se el final del archivo de donde se ingresan los datos, el fichero seguirá recibiendo cualquier cantidad de información que sea registrada.

Función rewindEs una función heredada de los tiempos de las cintas magnéticas. Literalmente significa "rebobinar", y hace referencia a que para volver al principio de un archivo almacenado en cinta, había que rebobinarla. Eso es lo que hace ésta función, sitúa el cursor de lectura/escritura al principio del archivo.El parámetro es un puntero a la estructura FILE del fichero que queremos rebobinar.

Page 30: Manual de Programación c/c++ Ricky Bonilla

Función fprintfLa función fprintf funciona igual que printf en cuanto a parámetros, pero la salida se dirige a un fichero en lugar de a la pantalla.

Función fscanfLa función fscanf funciona igual que scanf en cuanto a parámetros, pero la entrada se toma de un fichero en lugar del teclado.

Función fflushEsta función fuerza la salida de los datos acumulados en el buffer de salida del fichero. Para mejorar las prestaciones del manejo de ficheros se utilizan buffers, almacenes temporales de datos en memoria, las operaciones de salida se hacen a través del buffer, y sólo cuando el buffer se llena se realiza la escritura en el disco y se vacía el buffer. En ocasiones nos hace falta vaciar ese buffer de un modo manual, para eso sirve ésta función.

El valor de retorno es cero si la función se ejecutó con éxito, y EOF si hubo algún error. El parámetro de entrada es un puntero a la estructura FILE del fichero del que se quiere vaciar el buffer. Si es NULL se hará el vaciado de todos los ficheros abiertos.

Existen dos tipos de fflush, son:

fflush(stdin);

Page 31: Manual de Programación c/c++ Ricky Bonilla

Se usa a la hora de ingresar cualquier tipo de dato, sobre todo cuando usamos gets().

fflush(stdout);Se usa a la hora de leer datos, para que no haya combinación de información o el programa de archivos basura.

Función fseekEsta función sirve para situar el cursor del fichero para leer o escribir en el lugar deseado.El valor de retorno es cero si la función tuvo éxito, y un valor distinto de cero si hubo algún error.Los parámetros de entrada son: un puntero a una estructura FILE del fichero en el que queremos cambiar el cursor de lectura/escritura, el valor del desplazamiento y el punto de origen desde el que se calculará el desplazamiento.El parámetro origen puede tener tres posibles valores:

1. SEEK_SET el desplazamiento se cuenta desde el principio del fichero. El primer byte del fichero tiene un desplazamiento cero.

2. SEEK_CUR el desplazamiento se cuenta desde la posición actual del cursor.

3. SEEK_END el desplazamiento se cuenta desde el final del fichero.

Función ftellLa función ftell sirve para averiguar la posición actual del cursor de lectura/escritura de un fichero.

El valor de retorno será esa posición, o -1 si hay algún error.

El parámetro de entrada es un puntero a una estructura FILE del fichero del que queremos leer la posición del cursor de lectura/escritura.

Page 32: Manual de Programación c/c++ Ricky Bonilla

Sentencias de controlEn C, cualquier expresión finalizada en un punto y coma forma una sentencia.De todos los tipos, las estructuras (o sentencias) de control son las que controlan la ejecución de las instrucciones de un programa.

La programación estructurada se basa en la utilización de un reducido número de estructuras que permiten hacer que un programa sea suficientemente legible, reduciendo considerablemente el número de errores, y facilitando enormemente la detección y solución de estos.

La característica fundamental de la programación estructurada consiste en que todas lasestructuras tienen un único punto de entrada y un único punto de salida. Esto permite descomponer fácilmente un problema en subproblemas, reduciendo la complejidad y facilitando la programación.

En C diferenciamos tres tipos de sentencias de control:

-Sentencias condicionales o selectivas.

-Sentencias de iteración o repetitivas (bucles).

-Sentencias de salto.

Se recomienda evitar la utilización de este último tipo de sentencias.

Sentencias condicionales

Hay tres sentencias condicionales en C: if, else y switch.

Page 33: Manual de Programación c/c++ Ricky Bonilla

Sentencia ifLa sentencia if nos permite elegir si se ejecuta o no un bloque de instrucciones. La "expresión" del if es una expresión que debe ser evaluada: falsa si es cero y verdadera si vale distinto de cero.

Tendrá como resultado:

Sentencia else

Una sentencia if cuando incluye un else, permite ejecutar un bloque de

Page 34: Manual de Programación c/c++ Ricky Bonilla

código si se cumple la condición y otro bloque diferente de código si la condición no se cumple.

En caso de ser negativo entrará en el else:

Sentencia switch

Page 35: Manual de Programación c/c++ Ricky Bonilla

La sentencia switch() en Lenguaje C es una sentencia de selección. Esta sentencia permite seleccionar las acciones a realizar de acuerdo al valor que tome una variable.

Comportamiento de la instrucción switch

Page 36: Manual de Programación c/c++ Ricky Bonilla

Estructuras de control repetitivas

Sentencia whileAl ejecutarse la instrucción mientras (while), se evaluará la expresión booleana suministrada en los paréntesis (condición), y si su valor es verdadero (distinto de cero) se realizará el ciclo o bucle (una o varias instrucciones).

Después, la condición es reevaluada y se procede de la misma manera. Cuando la condición se vuelve falsa (es decir, cero), en la siguiente evaluación se dará por terminado el ciclo mientras (while).

Si la condición nunca se vuelve cero, el ciclo nunca terminará y, dependiendo de las instrucciones incluidas en el bucle, se generaría un error de ejecución que detendría el programa, o podría ser que el programa itere indefinidamente hasta ser detenido en forma manual.

En esta estructura no se conoce necesariamente el número de veces que entrará al ciclo, ya que esto dependerá de la condición definida.

Page 37: Manual de Programación c/c++ Ricky Bonilla

Características:

1. La condición (expresión lógica) se evalúa antes del ciclo. Si la condición es verdadera se ejecuta el bucle, y si es falsa se sale y el control pasa a la instrucción siguiente al ciclo.2. Si la condición es falsa cuando se revisa por primera vez el bucle no se ejecuta nunca, es decir no entra ninguna vez.3. Mientras la condición sea verdadera el bloque de instrucciones se ejecutará indefinidamente a menos que exista por lo menos una instrucción que modifique el valor de un elemento de la condición.4. Si existe más de una instrucción se necesitan las palabras reservadas inicio - fin ({2}) para delimitar el bloque de instrucciones.

Page 38: Manual de Programación c/c++ Ricky Bonilla

Sentencia do-while

Esta estructura le permite al programador especificar que se repita una acción en tanto cierta condición sea verdadera; cuando ésta es falsa se sale del ciclo. La condición la revisa después del ciclo o bucle.

Existen algoritmos y programas que requieren que por lo menos se ejecute el ciclo una vez y al final se revise la condición; en este caso utilizamos la estructura hacer_mientras. Es muy semejante al ciclo mientras, con la diferencia de que la condición se evalúa después de ejecutar el cuerpo del bucle. Tanto el ciclo mientras como el hacer_mientras pueden utilizarse cuando no se conoce de antemano el número de veces que se repetirá el ciclo.

A diferencia del while, al final del do_while si lleva punto y coma después de la instrucción while (condición). Donde condición es cualquier expresión numérica, relacional o lógica.

Page 39: Manual de Programación c/c++ Ricky Bonilla

Características:1. Siempre entra por lo menos una vez al ciclo, ya que la condición está después del ciclo.2. Si la condición es verdadera entra de nuevo al ciclo y regresa a revisar la condición, hasta que ésta sea falsa se sale del bucle.3. Debe existir una instrucción dentro del ciclo que modifique la condición, de lo contrario se hace infinita.4. Si tiene más de una instrucción, necesita obligadamente del inicio-fin ({-}).

Sentencia forEl desde (for) es la estructura repetitiva más utilizada y simple de manejar, ya que repite un conjunto de instrucciones un número determinado de veces. Una de sus aplicaciones principales son los arreglos.

Page 40: Manual de Programación c/c++ Ricky Bonilla

Donde:

expr_ini(s): expresión(es) de asignación que se utilizan para iniciar la(s) variable(s) de control del bucle.

cond: es una expresión relacional o lógica (booleana) que determina cuándo finalizará el ciclo o bucle. La condición puede ser simple o compuesta (una o varias).

inc(s): define cómo cambiará(n) la(s) variable(s) de control cada vez que se repite el bucle o ciclo.Las tres componentes pueden tener una o varias instrucciones, las cuales deben ir separadas por comas. La cond nos lleva al valor final.

Omisión de expresiones

Page 41: Manual de Programación c/c++ Ricky Bonilla

Cualquiera de los componentes en los paréntesis se puede omitir, incluso los tres, pero los separadores coma (punto y coma) deben aparecer siempre.Las tres expresiones del bucle desde (for) se pueden omitir, con el siguiente resultado:

Se omite ResultadoExpresión_inicial No se hace nada antes del bucleCondición La condición es siempre ciertaIncremento o expresión_de_paso No se hace nada tras cada

iteración

En la instrucción desde (for), primero se ejecutará la(s) inicialización(es), posteriormente se evaluará la condición y, en caso de ser verdadera (no cero), se ejecutará(n) la(s) instrucción(es) que compone(n) el ciclo.Después, se realizará el incremento(s) y se volverá a verificar la condición. Cuando la condición se vuelve falsa, en la siguiente evaluación se terminará el desde (for). Si la condición nunca se vuelve cero, la estructura nunca terminará y el ciclo se repetirá indefinidamente hasta que se detenga en forma manual.Características:1. Se debe conocer por anticipado el valor de la variable inicial y final antes de entrar al ciclo.2. La condición se evalúa antes del bloque de instrucciones. Si la condición es verdadera se ejecuta el bloque, y si es falsa se sale y pasa el control a la instrucción siguiente al bloque.

Page 42: Manual de Programación c/c++ Ricky Bonilla

3. No se debe cambiar el valor de la(s) variable(s) de control, del valor inicial ni del valor final dentro del ciclo.4. Se puede incrementar o decrementar la variable de control según se requiera.5. El incremento o decremento de la variable de control es automático.6. Sólo si existe más de una instrucción dentro del ciclo desde se necesita el inicio-fin ({-}).7. Puede tener una o varias expresiones de inicialización, de condición y de incremento; estas expresiones se separan mediante comas en pseudocódigo y con puntos y comas en lenguaje C.8. Puede tener alguna o todas las expresiones vacías: desde (,,)-for ( ; ; ).9. Si la condición está vacía, tenemos un bucle infinito.

Declaración de variables globales y constantesLas constantes y variables son elementos que tienen el objetivo de identificar los datos que se utilizan en las operaciones y cálculos que realiza el programa y que se almacenan en la memoria de la computadora. Si las variables globales son declaradas en esta parte, pueden ser utilizadas en todo el programa.

Ciclos anidadosEn un algoritmo puede haber varios bucles. Éstos pueden ser anidados o independientes.

Dentro de las instrucciones que se pueden incluir en un ciclo se encuentran, a su vez, otros ciclos, es decir, instrucciones mientras (while), hacer-mientras (do-while), y desde (for). Este tipo de construcciones, en las que se incluye una instrucción de repetición dentro del cuerpo de otra, se conoce como iteración anidada.

En una iteración anidada, en cada iteración del ciclo exterior se completa un grupo de iteraciones del ciclo interior. Considere, por ejemplo, el siguiente fragmento de código:

for (i51; i,52; i11)

for (j51; j,53; j11)

Page 43: Manual de Programación c/c++ Ricky Bonilla

printf(“%d %d\n”, i, j);

El ciclo exterior se ejecutará dos veces, haciendo variar la variable i por los valores 1, 2. En cada una de estas iteraciones se ejecutará un ciclo de tres iteraciones (el desde (for) interior), en el que se variará la variable j por los valores 1, 2, 3. De esta forma, por cada valor que toma la variable i, la variable j tomará todos sus valores.

Así, la instrucción printf se ejecutará seis veces (233); de la misma manera lo hicimos en el ejemplo 10.

Es posible anidar cualquier cantidad de instrucciones de iteración, prácticamente hasta que la implementación del compilador lo soporte. Sin embargo, demasiados niveles de anidamiento pueden volver el programa difícil de leer.

Funciones

Page 44: Manual de Programación c/c++ Ricky Bonilla

Ejemplo de una funciónPara comenzar, vamos a considerar el caso en el cual se desea crear la función cuadrado(), que deberá devolver el cuadrado de un número real (de punto flotante), es decir, cuadrado() aceptará números de punto flotante y regresará una respuesta como número flotante.

Nota: aunque para la función que veremos el tipo de retorno coincide con el tipo de parámetro pasado, algunas veces las cosas pueden cambiar, es decir, no es obligatorio que una función reciba un parámetro de un tipo y que tenga que regresar una respuesta de dicho tipo.

ParámetrosNormalmente, las funciones operan sobre ciertos valores pasados a las mismas ya sea como constantes literales o como variables, aunque se pueden definir funciones que reciban parámetros. Existen dos formas en C++ de pasar parámetros a una función; por referencia o por valor. El hecho es que si en una declaración de función se declaran parámetros por referencia, a los mismos no se les podrá pasar valores literales ya que las referencias apuntan a objetos (variables o funciones) residentes en la memoria; por otro lado, si un parámetro es declarado para ser pasado por valor, el mismo puede pasarse como una constante literal o como una variable. Los parámetros pasados por referencia pueden ser alterados por la función que los reciba, mientras que los parámetros pasados por valor o copia no pueden ser alterados por la función que los recibe, es decir, la función puede manipular a su antojo al parámetro, pero ningún cambio hecho sobre este se reflejará en el parámetro original.

Parámetros por valor

Page 45: Manual de Programación c/c++ Ricky Bonilla

La función cuadrado() (ver arriba) es un clásico ejemplo que muestra el paso de parámetros por valor, en ese sentido la función cuadrado() recibe una copia del parámetro n. En la misma función se puede observar que se realiza un cálculo ( n*n ), sin embargo el parámetro original no sufrirá cambio alguno, esto seguirá siendo cierto aun cuando dentro de la función hubiera una instrucción parecida a n = n * n; o n*=n;.

Parámetros por referenciaPara mostrar un ejemplo del paso de parámetros por referencia, vamos a retomar el caso de la función cuadrado, salvo que en esta ocasión cambiaremos ligeramente la sintaxis para definir la misma. Veamos:

Funciones voidBajo ciertas circunstancias se deseará escribir funciones que no regresen valor alguno (esto sería algo parecido a escribir procedures en Pascal) y para ello podemos declarar a la función como void. La palabra reservada void es utilizada para declarar funciones sin valor de retorno y también para indicar que una función específica no requiere de parámetros.

Page 46: Manual de Programación c/c++ Ricky Bonilla

A continuación unos ejercicios en los que se aplica todo lo que se ha enseñado a lo largo del manual:

1)Cajero virtual (Paso por paso)

Page 47: Manual de Programación c/c++ Ricky Bonilla
Page 48: Manual de Programación c/c++ Ricky Bonilla
Page 49: Manual de Programación c/c++ Ricky Bonilla

2) Cálculo del IR y recolección de basura

Page 50: Manual de Programación c/c++ Ricky Bonilla
Page 51: Manual de Programación c/c++ Ricky Bonilla
Page 52: Manual de Programación c/c++ Ricky Bonilla

3) Login

Page 53: Manual de Programación c/c++ Ricky Bonilla