SUNEDU - Superintendencia Nacional de Educación superior Universitaria
Programación II_modulo1lolololololo9oo.pptx
1. Programación II
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
FACULTAD DE ESTUDIOS SUPERIORES ACATLÁN
LICENCIATURA EN MATEMÁTICAS APLICADAS Y COMPUTACIÓN
Enero 2024
Martín Mendieta
2. 2
Objetivo del curso
El alumno aplicará los elementos avanzados de la
programación utilizando el lenguaje C, para la solución
de diversos problemas computacionales.
3. 3
Temario
Índice temático Teóricas Prácticas
1. Tipos de datos derivados 8 4
2. Apuntadores y memoria dinámica 16 8
3. Manejo de archivos con C 12 6
4. Manipulación de bits 4 2
5. Graficación básica con C 16 8
6. Introducción a la programación orientada 8 4
a objetos
4. 4
Reglas y forma de evaluación
• Las asistencias sí cuentan
• No se puede usar celular
• 30% exámenes de unidad
• 30% proyecto final
• 30% tareas
• 10% participación
5. 5
1. Tipo de datos derivados
Objetivo : El alumno desarrollara programas utilizando tipo de
datos derivados
Temas:
1.1 Estructuras (struct)
1.1.1 Definición
1.1.2 Inicialización de estructuras
1.1.3 Acceso a campos
1.1.4 Funciones y estrudturas
1.1.5 Arreglos de tipo struct
1.2 Typedef
1.3 Union
1.4 Enumeración
6. 6
1.1 Estructuras (struct)
Objetivos:
• Comprender el concepto de estructuras en C.
• Aprender a declarar, definir y manipular estructuras.
• Aplicar estructuras en la creación de programas más complejos.
7. 7
Tipo de datos derivados.- Estructuras (struct)
Los tipos de datos vistos hasta ahora (enteros, reales, caracteres y lógicos) se
denominan simples porque no pueden descomponerse en otros datos más simples
aun.
Los tipos de datos complejos son aquellos que se componen de varios datos simples y,
por lo tanto, pueden dividirse en partes más sencillas. A los tipos de datos complejos se
les llama estructuras de datos.
Las estructuras de datos pueden ser de dos tipos:
Estáticas
Dinámicas
Ocupan un espacio determinado en la memoria del
ordenador. Este espacio es invariable y lo especifica el
progamador durante la escritura del código fuente.
Son aquéllas cuyo espacio ocupado en la memoria
puede modificarse durante la ejecución del programa.
8. 8
Tipo de datos derivados.- Estructuras (struct)
Estáticas
Dinámicas
Fundamentales
Pilas
Listas
Colas
Grafos
Arboles
Estructurados
Entero, Flotante,
Char, Booleano
String, arreglo,
Conjunto,
Archivo, registro
Los tipos estáticos son los que no
cambian al momento de ejecución y
cuyo tamaño ha sido definido
previamente.
Por otro lado los tipos de datos
dinámicos son flexible y cambian al
momento de ejecución.
9. 9
Tipo de datos derivados.- Estructuras (struct)
Además, se pueden mencionar como una clase de estructura de datos diferente
las estructuras externas, entendiendo como tales aquéllas que no se almacenan
en la memoria principal RAM del ordenador, sino en alguna memoria secundaria
(típicamente, un disco duro).
Las estructuras externas, también podemos denominarles archivos o ficheros,
son en realidad estructuras dinámicas almacenadas en memoria secundaria.
10. 10
Tipo de datos derivados.- Estructuras (struct)
Un array unidimensional (vectores ó arreglos) es una agrupación de muchos
datos individuales del mismo tipo bajo el mismo nombre. Cada dato individual
de un array lo podemos accesar mediante un índice.
Declaración:
tipo_de_datos nombre_arreglo[número_de_elementos];
Por ejemplo: Int serie[5];
Se puede acceder a cada uno de los números que forman el arreglo escribiendo
a continuación del nombre un numero entre corchetes, este numero se
denomina índice.
Del ejemplo anterior: Int serie[5];
serie[2] = 20;
Serie[3] = 15;
Serie[4] = serie[2] + serie[3];
Printf(“&i”,serie[4]);
11. 11
Tipo de datos derivados.- Estructuras (struct)
? ? 20 15 35
Valores
Posiciones 0 1 2 3 4
Los arreglos en C deben manipularse elemento a elemento. No se pueden
modificar todos los elementos a la vez.
La inicialización de los valores de un arreglo puede hacerse directamente en el
momento declararlo, ejemplo:
int serie[5] = {5, 3, 7, 9, 14};
o Cada elemento del arreglo es una variable que puede utilizarse de forma
independiente de los demás elementos.
12. 12
Tipo de datos derivados.- Estructuras (struct)
Recorrido de un arreglo:
Esto lo hacemos de forma secuencial a cada elemento del arreglo, uno tras otro. Para
ello utilizamos un bucle con un contador, el cual nos sirve para acceder a cada uno
de los elementos del arreglo.
for (i=0; i <=4; i++)
{
v[i] = 0;
}
Una de las operaciones más típicas que se realizan con arreglos es ordenar sus
elementos mediante algún criterio, en los números de menor a mayor o viseversa.
O cualquier otro criterio que resulte útil para resolver un problema.
Método de la burbuja o de intercambio directo
Método de selección directa
Metodo rápido o quicksort
13. 13
Tipo de datos derivados.- Estructuras (struct)
Definición:
Una estructura es un tipo de dato que permite agrupar diferentes tipos de
variables bajo un mismo nombre. Una estructura es una manera de organizar y
almacenar datos de manera más compleja que los tipos de datos básicos (como
int, float, etc.).
La definición de una estructura se realiza mediante la palabra clave ‘struct’, ,
seguida por un identificador que especifica el nombre de la estructura. Dentro
de las llaves ´{ }´, se enumeran las variables que formarán parte de la estructura,
junto con sus tipos de datos.
Las estructuras en C son útiles para organizar datos relacionados de manera más
clara y para pasar múltiples datos a funciones de manera eficiente.
14. 14
Tipo de datos derivados.- Estructuras (struct)
#include <stdio.h>
#include <string.h>
struct persona {
char nombre [50];
int edad;
float altura;
};
Int main() {
// Declaración de una variable de tipo struct Persona
struct persona persona1;
// Asignación de valores a las variables de la estructura
strcpy (persona1.nombre, "Juan“);
persona1.edad = 25;
persona1.altura = 1.75;
// Acceso a los datos de la estructura
printf("Nombre: %sn", persona1.nombre);
printf("Edad: %dn", persona1.edad);
printf("Altura: %.2fn", persona1.altura);
return 0;
}
Cada dato que forma parte de la estructura
se le denomina miembro.
La variable persona1,
contiene la misma
estructura que
persona
El acceso a los miembros se
realiza con el nombre de la
variable y el del miembro
separado por un punto.
15. 15
Tipo de datos derivados.- Estructuras (struct)
Como al miembro siempre se accede a través de un identificador de variable de
estructura exclusivo, no puede haber confusión entre dos miembros que tengan el
mismo nombre en diferentes estructuras.
struct s1 {
char c;
int i;
};
struct s2 {
char c;
float x;
};
struct s1 a;
struct s2 b;
Es posible a a.c y b.c sin ambiguedad
16. 16
Tipo de datos derivados.- Estructuras (struct)
struct {
char apellido[60];
int id_estudiante;
char grado;
} s1, s2 ,s3;
struct estudiante {
char apellido[60];
int id_estudiante;
char grado;
};
struct estudiante s1, s2, s3;
17. 17
Tipo de datos derivados.- Estructuras (struct)
.
Resumen:
• Se utiliza para definir un tipo de dato personalizado que agrupa diferentes
tipos de datos bajo un solo nombre.
• Una estructura (struct) permite organizar datos relacionados de manera que
se puedan acceder y manipular de manera conjunta.
struct NombreEstructura {
TipoDato1 miembro1;
TipoDato2 miembro2;
// Puedes agregar más miembros según sea necesario
};
struct Persona {
char nombre[50];
int edad;
float altura;
};
18. 18
Tipo de datos derivados.- Estructuras (struct)
.
• Declaración de una variable de estructura:
struct Persona persona1; // Declaración de una variable de tipo Persona
• Acceso a los miembros de la estructura:
strcpy(persona1.nombre, "Juan");
persona1.edad = 25;
persona1.altura = 1.75;
• Acceso a los miembros mediante punteros:
struct Persona *pPersona = &persona1;
printf("Nombre: %s, Edad: %d, Altura: %.2fn", pPersona->nombre,
pPersona->edad, pPersona->altura);
19. 19
Tipo de datos derivados.- Estructuras (struct)
.
Ejercicios:
• Define una estructura Libro que almacene información sobre un libro, como
el título, el autor y el año de publicación.
20. 20
Tipo de datos derivados.- Estructuras (struct)
.
Ejercicios:
Define una estructura Libro que almacene información sobre un libro, como el
título, el autor y el año de publicación.
#include <stdio.h>
struct Libro {
char titulo[100];
char autor[50];
int anioPublicacion;
};
int main() {
struct Libro libro1 = {"Cien años de soledad", "Gabriel Garcia Marquez", 1967};
printf("Libro: %snAutor: %snAño de publicación: %dn", libro1.titulo, libro1.autor,
libro1.anioPublicacion);
return 0;
}
21. 21
Tipo de datos derivados.- Funciones y estructuras
Paso de Estructuras a Funciones.
o Pasar una estructura completa como parámetro a una función
o Pasar un miembro de una estructura como parámetro a una función
En el primer caso, las variables basadas en estructuras se pueden pasar como
parámetros por valor o por referencia, existiendo entre ambos métodos las mismas
diferencias que en los tipos de datos simples.
Ejemplo: De nuestro ejemplo anterior la variable persona1 pasar por valor a una
función llamada escribir_persona1, seria:
escribir_persona1(persona1);
Por referencia seria :
escribir_persona1(&persona1)
22. 22
Tipo de datos derivados.- Funciones y estructuras
Es importante que en la función especifiquemos en la declaración si el argumento se
pasa por valor o por referencia.
void escribir_persona1(struct persona persona1); por valor
void escribir_persona1(struct persona *persona1); por referencia
Dentro de la función, el acceso a los miembros de la estructura es diferente si esta ha
sido pasada por valor o por variable.
printf(“%s”,persona1.nombre);
printf(“%s”,persona1->nombre);
Por valor se hace a la manera habitual
Por variable , se sustituye el punto
por ->
23. 23
Tipo de datos derivados.- Funciones y estructuras
Paso de miembros de estructuras como parámetros.
Los miembros de las estructuras se pueden manipular como cualquier otro dato del
mismo tipo que el miembro. Por ejemplo, como persona1.edad es de tipo entero (int),
puede realizarse con este miembro cualquier operación que también puede realizarse
con un numero entero, incluido el paso como parámetro de una función.
escribir_persona1(persona1.edad);
En la declaración de la función, el parámetro formal debe ser de tipo long int:
void escribir_persona1(long int edad)
Dentro del cuerpo de la función, la variable edad puede usarse como cualquier otra
variable de tipo entero.
Por valor pasamos solo el
miembro edad
24. 24
Tipo de datos derivados.- Funciones y estructuras
Paso de miembros de estructuras como referencia.
Esto lo haremos igual que con cualquier otro tipo de dato entero, agregando el & a la
llamada:
escribir_numero(&persona1.edad);
Y en la declaración de la función el parámetro debe llevar el símbolo “*”
void escribir_numero(long int *edad);
25. 25
.
Ejercicios:
1. Define una estructura llamada Rectangulo que tenga dos campos: base y
altura ambos de tipo float. Luego escribe una función llamada:
areaRectangulo que calcule y devuelva el área de un rectángulo dadas su
base y altura.
2. Crea una estructura llamada Persona que tenga 2 campos nombre (cadena
de caracteres) y edad (entero). Luego escriba una función llamada
imprimirPersona que tome una variable de tipo Persona como parámetro y
la imprima por pantalla.
3. Crea una estructura llamada Libro que tenga tres campos, titulo (cadena de
caracteres), autor (cadena de caracteres) y AnioPublicacion (entero).
Luego, escribe una función llamada mostrarLibro, que tome una variable
de tipo Libro, como parámetro y la imprima por pantalla.
Tipo de datos derivados.- Funciones y estructuras
26. 26
#include <stdio.h>
struct Rectangulo {
float base;
float altura;
};
float areaRectangulo(struct Rectangulo r) {
return r.base * r.altura;
}
int main() {
struct Rectangulo rectangulo1 = {5.0, 3.0};
printf("Área del rectángulo: %.2fn", areaRectangulo(rectangulo1));
return 0;
}
Tipo de datos derivados.- Funciones y estructuras
1.-
27. 27
#include <stdio.h>
struct Persona {
char nombre[50];
int edad;
};
void imprimirPersona(struct Persona p) {
printf("Nombre: %sn", p.nombre);
printf("Edad: %dn", p.edad);
}
int main() {
struct Persona persona1 = {"Juan", 25};
imprimirPersona(persona1);
return 0;
}
Tipo de datos derivados.- Funciones y estructuras
2.-
28. 28
Tipo de datos derivados.- Funciones y estructuras
#include <stdio.h>
struct Libro {
char titulo[100];
char autor[50];
int anioPublicacion;
};
void mostrarLibro(struct Libro l) {
printf("Título: %sn", l.titulo);
printf("Autor: %sn", l.autor);
printf("Año de Publicación: %dn", l.anioPublicacion);
}
int main() {
struct Libro libro1 = {"Cien años de soledad", "Gabriel García Márquez", 1967};
mostrarLibro(libro1);
return 0;
}
3.-
29. 29
Tipo de datos derivados.- Typedef
Tipos de datos definidos por el usuario.
Para eso utilizaremos la palabra reservada typedef.
typedef int entero;
A partir de esta declaración nuestro compilador reconocerá el tipo de dato entero, que
será exactamente igual al tipo predefinido int.
Ejemplo:
typedef struct
{
int dia;
int mes;
int anio;
} t_formato_fecha;
Hemos definido un nuevo tipo de dato,
llamado formato_fecha y ahora podríamos
definir variables de este tipo de dato:
t_formato_fecha fecha_hoy;
t_formato_fecha fecha_nacimiento;
30. 30
Tipo de datos derivados.- Typedef
Los identificadores de los tipos de datos que creemos deben cumplir con las reglas
habituales de C (nada de caracteres especiales, ni espacios).
Como una buena practica es recomendable anteponer un identificador que nos
permita reconocer nuestros tipos de datos creados del resto, en este ejemplo estamos
utilizando la letra “t” para identificarlos.
Tipos de datos Complejos.
Es posible que los datos que componen un tipo complejo sean, a su vez de tipo
complejo.
Es posible tener un arreglo de estructuras, o una estructura cuyos miembros son
arreglos u otras estructuras.
31. 31
Tipo de datos derivados.- Typedef
// Arreglo de estrcturas
struct fecha
{
int dia;
int mes;
int anio;
};
Struct fecha lista_de_fechas[100];
La variable lista_de_fechas es un arreglo de 100 elementos. Cada elemento no es un
dato de tipo simple, sino una estructura fecha. Para acceder al miembro dia del
elemento numero 5 del arreglo y asignarle el valor 20, tendríamos que hacer esto:
lista_de_fechas[5].dia=20;
32. 32
Tipo de datos derivados.- Typedef
Estructuras de estructuras:
struct s_fecha
{
int dia;
int mes;
int anio;
};
struct s_hora
{
int hh; //horas
int mm; //minutos
int ss; //segundos
};
struct calentadio
{
struct s_fecha fecha;
struct s_hora hora;
};
struct calendario fecha_hoy;
La variable fecha_hoy es de tipo struct
calendario, que es un tipo a su vez está
compuesto de otras dos estructuras.
Acceso:
fecha_hoy.fecha.dia=5;
fecha_hoy.fecha.mes=12;
fecha_hoy.hora.hh=23;
33. 33
Tipo de datos derivados.- union
Las uniones son muy similares a las estructuras y se declaran de manera análoga,
sustituyendo la palabra struct por union, y se utlizan exactamente igual.
Union datos_persona
{
long int numero;
char letra;
char nombre[50];
char apellidos[100];
};
Union datos_persona alumno; // declaración de la variable
La diferencia radica en que todos los miembros de la union comparten el mismo
espacio en memoria, de manera que solo se puede tener almacenado uno de los
miembro en cada elemento.
34. 34
El tamaño de la union es igual al del elemento mas largo.
Del ejemplo anterior:
numero 4 bytes (32 bits)
letra 1 byte (8 bits)
nombre 50 bytes
apellidos 100 bytes
Por lo tanto, la union ocupa un espacio en memoria de 100 bytes, mientras que si fuera una
estructura ocuparía 155 bytes, ya que cada miembro se almacena en un espacio de
memoria propio.
alumno.numero=8205769
Estamos asignando el número 8205769 a los primeros 4 bytes de la union, si
posteriormente se hace esta otra asignación:
strcpy(alumno.nombre, “Maria”)
La cadena de “Maria” ocupara los primeros 50 bytes de la union, y por lo tanto, se habrá
perdido el número que habíamos almacenado.
Tipo de datos derivados.- union
35. 35
Tipo de datos derivados.- union
alumno.numero = 8205769;
strcpy(alumno.nombre, “Maria”);
printf(“%d”, alumno.numero);
????????
Las uniones se utilizan exactamente igual que las estructuras, con la ventaja de que
ahorra espacio en memoria. Sin embargo, al compartir todos los miembros las mismas
posiciones de memoria, la utilidad de las uniones queda reducida a determinadas
problemáticas que queramos resolver, en las que esta limitante no represente un
problema.
36. 36
Tipo de datos derivados.- enumeración
Una enumeración es un conjunto de constantes enteras. A la enumeración se le asigna
un nombre que, a todos los efectos, se comporta como un nuevo tipo de datos de
manera que las variables de este tipo son variables enteras que solo pueden contener
los valores especificados en la enumeración.
enum nombre_enumeracion {constante1=valor1, constante2=valor2……….
………………constanteN=valorN};
Ejemplo:
enum dias_semana {LUNES=1, MARTES=2, MIERCOLES=3, JUEVES=4,
VIERNES=5, SABADO=6, DOMINGO=7};
Las variables que declaran del tipo dias_semana serán, variables enteras y solo podrán
recibir los valores del 1 al 7.
días_semana dia;
dia=“LUNES”;
dia=1; Las dos asignaciones son equivalentes
37. 37
Tipo de datos derivados.- enumeración
Si no se especifican los valores en la enumeración, C les asigna automáticamente
números enteros a partir de 0. Por ejemplo en la siguiente definición, la constante
LUNES valdrá 0, MARTES, 1, etc…
enum dias_semana { LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO};
Tenemos que considerar que los identificadores utilizados en una enumeración son
constantes enteras y que, por lo tanto, lo siguiente imprime en la pantalla un 2, y no la
palabra MIERCOLES.
dias_semana dia;
dia = MIERCOLES;
printf(“%i”,dia);