
Hola Gente! Después de estar inactivo este fin de semana, les traigo la tercera parte

... en esta parte vamos a ver los siguientes temas:
-> Estructuras de Datos
-> Vectores
-> Matrices
-> Punteros
-> Archivos
Dicho de una manera practica, sabíamos que un dato era un "cuadradito" con información de un tipo determinado (char, int, float). Una estructura de datos es un "cuadradito" que tiene mas "cuadraditos" dentro con datos de distintos tipos.

De esta manera podemos en lugar de usar una variable para cada dato, se usa una sola variable que encapsula a las demas y se ingresa a ellas por un comando especial. Las estructuras se las declaran luego de los include y antes de los prototipos de funciones

Existen dos maneras de poner las estructuras:
->Struct Nombre{};
->TypeDef Strcut{}Nombre;
Para el uso que le van a dar no necesitan saber mucho cual es la gran diferencia, solo sepan que a futuro la primera les va a resultar mas sencilla para otras cosas (hasta donde vi yo).

Como se ve en la imagen, dentro de las llaves se ponen las variables, cada una con su tipo de dato y finalizando con un ";" para que el compilador sepa que ahí terminan las declaraciones de ese tipo.

A la hora de utilizarlas dentro del main, hace falta declararlas. La primera manera se la declara utilizando todo "Struct Nombre" mientras que la segunda solo se pone el nombre de la estructura, seguida, en ambos casos, por el nombre interno que se le da en el programa principal. En ambos casos notaran que las estructuras las nombre como "t_xxxx" esto no es obligatorio, yo lo uso para saber que cualquier palabra que tenga un "t_" por delante se esta refiriendo a una estructura, ustedes pueden ponerle el nombre que se les da la gana, hasta el mismo si quieren.

A la hora de mostrar, ingresar datos o hacer cualquier tipo de operación, se hace casi lo mismo que con una variable común, la única diferencia es que ahora tienen que indicar a que dato dentro de la estructura apuntan. Si lo que están haciendo es dentro del Programa Principal se utiliza el punto "." pero si es dentro de una Función se utiliza la flecha "->"
Algo para mencionar que me olvide antes... notaran que use algo llamado gets(); esta función funciona con cadena de caracteres, es recomendable usarla en lugar del printf cuando se trata de cadenas, ademas, no lleva el &.
Cadena de Caracteres: Tal y como su nombre lo indica son un conjunto de caracteres, por eso a la hora de declararla se le agrega un corchete con la cantidad máxima de caracteres que tendrá disponible +1. Ese mas uno se reserva para el carácter que determina cuando termina denominado "/0".

Los vectores se los puede imaginar como las estructuras, un "cuadradito" con datos, pero tienen bastantes diferencias, por ejemplo:

->Un vector tiene una cantidad limitada de datos, es decir se pueden ingresar X cantidad de datos y nada mas, no se puede pasar o modificar esa cantidad.
-> Los vectores se los declaran de la siguiente manera: Vec[cantidad de datos]
-> Un vector puede tener dentro datos de un solo tipo o datos de una estructura.
Algo fundamental de los vectores, a diferencia de las estructuras, es que las primeras almacenan en esas variables los datos, pero no se guardan en ningún lado, en cambio, los vectores almacenan en cada una de sus "casillas" los datos. Estas utilizan una forma distinta de guardado, operación y visualización.
Como ven en la imagen se utiliza la i, por ejemplo Vec (vec sub i), para poder ver un determinado dato del vector, bastara con indicar la posicion en que se encuentra dicho dato, suponiendo que este en la posicion 4, Vec[4]. Si lo que se quiere es recorrer todo el vector, ya sea para mostrarlo o para realizar una busqueda dentro de el se utiliza un ciclo FOR.

El ciclo for comienza en i=0, avanza de 1 en 1 y finaliza con el tamaño maximo del vector (Recordar que es el tamaño - 1, es decir, si queremos un vector que guarde 5 datos, el tamaño maximo es 4, por que se cuenta la posicion cero). Como ven, para recorrer el vector se utiliza la misma "i" que usamos para el ciclo for.
La gran ventaja de los vectores es que se puede acumular muchos datos de forma ordenada, ademas, guardan los datos, no se pierden hasta que no finaliza el programa.
Para poder ingresar datos dentro del vector se utiliza un ciclo for en caso de querer llenarlo todo o un ciclo while en caso de querer poner una determinada cantidad de datos (por ejemplo nota de los parciales de los alumnos presentes de todo el alumnado).

Una matriz es un vector con filas y columnas, simple y conciso.

Una matriz se declara de manera parecida a un vector, la diferencia es que se agregan un par de corchetes mas, indicando la cantidad de columnas, este dato puede estar o no, a diferencia de la cantidad de filas que es obligatorio, se representa de la siguiente manera:

Una manera de verlo visualmente es la siguiente:

La manera de ingresar datos, buscar datos, mostrar datos, es exactamente la misma que la de los vectores, con la diferencia de que se agrega un ciclo for añidado para poder moverse entre filas y columnas.


En este programa lo que se hace es pedir la temperatura de 2 días, una vez cada hora, y luego se la muestra. Es el mismo ejemplo usado anteriormente.

Sobre este tema les voy a ser sincero, no se explicarlo, voy a intentar que lo entiendan lo mejor posible pero posiblemente se mareen un poco
Una variable (edad) cuando le ingresamos un dato (25) al mostrarla nos mostrara el numero 25... pero tienen dos datos en realidad, un dato corresponde al CONTENIDO de la variable y otro a la DIRECCIÓN DE MEMORIA EN DONDE SE ENCUENTRA. Hay algunas funciones que necesitan que se guarden en la dirección de memoria de la variable, sino les tiran errores o funcionan mal. Por ejemplo a la hora de crear un archivo (Tema que se ve mas abajo) la variable en donde se localiza el archivo, es un puntero al archivo. Lamentablemente no les voy a dar ningún ejemplo muy firme, por que ni yo lo entiendo cuando trato de explicarlo jaja, les dejo un pequeño ejemplo. Si alguno de los que leen el post la tienen bien clara, los invito a que lo comenten así lo agrego !!
Los archivos son lo que su nombre lo indica, archivos en donde se pueden guardar datos. Existen de dos tipos, los llamados "de texto" por ejemplo un bloc de notas, y los del tipo "binario" que son archivos con o sin extensión que si uno trata de abrirlos va a leer muchas siglas extrañas si trata de abrirlo con un bloc de notas.
Los archivos son muy muy sencillos, constan de tan solo 4 funciones que deben respetarse siempre para su correcto funcionamiento.
En este caso hoy solo vamos a tratar los archivos del tipo BINARIO
Antes de mostrarles las funciones del programa, les voy a mostrar como declarar la variable que se va a utilizar para poder usar el archivo.

Como ven, se usa ese tipo de dato y a la variable se le da un nombre random, yo generalmente uso pf por que significa "Puntero al File", pero pueden usar la que quieran

.
IMAGEN CON LAS FUNCIONES
Estas son las famosas funciones de archivos, las cuales voy a pasar a explicar a continuación:

Esta función es la utilizada para abrir el archivo, en donde se lo apunta a la variable que declaramos con anterioridad, en esta función, se coloca primero entre comillas el nombre del archivo, el cual puede llevar extensión o no, o ponerle la que quieran, generalmente se pone .dat por costumbre, luego esta seguida por un par de letras que voy a explicar a continuación cuales son y que función cumplen:
->b: para comenzar, notaran que todas tiene una b al final, b de "binary", que significa que el archvio es binario.
->rb: (Read Binary) Su función es, si el archivo mencionado en las comillas anteriores existe, abrirlo para leer los datos, si no existe no lo abre.
->wb: (Write Binary) Su función es crear un archivo binario con el nombre del anterior indicado, lo crea y lo abre para escribirlo, en caso de que el archivo ya exista, lo pisa borrando todos los datos
->ab: (Append Binary) Su función es abrir un archivo que ya exista y poner el cursor al final del archivo para poder agregar datos nuevos, conservando los antiguos.

La función fwrite escribe datos nuevos dentro de un archivo que se encuentre previamente abierto, primero que nada, siempre va al terminar de ingresar todos los datos en las variables, asi no se pierde ningun dato. El primer dato que pide es el puntero a la variable, el segundo dato es el tamaño, que se lo calcula con la función creada predeterminadamente, el tercer dato es de a cuantos datos va a guardar, siempre se pone 1, y lo ultimo en que variable (apuntando al archivo) se va a guardar.

Esta función se coloca antes de mostrar los datos dentro del archivo previamente abierto, lo que hace es tomar un conjunto de datos y mostrarlos, esto se pone en un ciclo while, hasta que la función de fread sea nula (NULL), para saber si es nula se usa la funcion "!feof(pf)" esta función se llama Fin de archivo, se pone que sea distinto, ya que cuando es fin de archivo lo indica con un NULL. En la fread se pide el puntero de la variable con los datos, el tamaño de la misma, de a cuantos datos va a leer y la variable que apunta al archivo. Básicamente lo mismo que en el fwrite.

Esta funcion es muy sencilla, se le indica que cierra el archivo al cual apunta esa variable. Lo recomendable es que si abrís un archivo luego lo cierres. Si prestan atención notaran que hay dos fclose. El primero que aparece cierra el archivo una vez termina de cargar los datos, el segundo corresponde al IF en donde te pregunta si queres ver los datos, entonces lo abre, hace todo lo que tiene que hacer y lo cierra

En este programa lo que se hace es pedir el ingreso de nombres, una cantidad indeterminada y luego preguntar si se los quiere ver o no.
El programa genera un archivo llamado "Archivo.Taringa" que no se puede leer ya que no reconoce la extensión.
También si quieren probar el archivo, puede poner la función de leer archivo en otro programa aparte, y que abra el archivo que creamos antes, sin necesidad de crearlo en el momento. Pruebenlo! si no les sale me avisan y lo subo!

Bueno gente hasta acá llega la pequeña y básica guía que arme!! No va a haber una cuarta parte, a menos que vea en los comentarios que hay muchas dudas sobre temas, puedo llegar a crear una cuarta parte, sino, no hace falta! Gracias a todos por los puntos, los bits, las visitas, los comentarios y por seguirme en las partes anteriores! Se los agradezco

.
Lo próximo que subiré (posiblemente) es toda mi carpeta de Matemática Discreta en modo de foto!


