Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen lógica. Los punteros son útiles para trabajar con estruc-
turas de datos dinámicas, como listas enlazadas o árbo-
En esta practica se volveran a utilizar tres conceptos les, donde es necesario asignar memoria en tiempo de
vistos antes 'Funciones, estructuras y punteros 'estas son ejecución. También son utilizados para mejorar la efi-
herramientas del lenguaje C, las funciones son bloques ciencia de ciertas operaciones, al evitar duplicar datos o
de código que realizan una tarea especı́fica, las estructu- pasar grandes cantidades de información a funciones por
ras son un tipo de dato que permite agrupar varios ele- valor.
mentos relacionados bajo un mismo nombre. Cada ele-
1
mento dentro de una estructura se denomina miembro, y 2 # include < stdio .h >
puede ser de cualquier tipo de dato, incluyendo otros ti- 3
pos de estructuras y los punteros, que como hemos visto 4 // Definicion de una estructura para
representar una persona
hasta ahora son variables que almacenan la dirección de
5 struct Persona {
memoria de otro objeto. Estos conceptos son esenciales 6 char nombre [50];
para comprender y desarrollar programas en lenguajes 7 int edad ;
como C y C++. 8 };
9
10 // Funcion para imprimir los datos de una
persona
1. Introduccion 11 void imprimirPersona ( struct Persona *
persona ) {
Las funciones ayudan a mejorar la legibilidad y el or-12 printf ( " Nombre : %s \ n " , persona - > nombre )
den del código, ya que cada función puede enfocarse en ;
13 printf ( " Edad : %d \ n " , persona - > edad ) ;
una tarea especı́fica; sirven para modularizar el código,14 }
dividirlo en partes más pequeñas y reutilizables, lo que15
facilita el desarrollo y el mantenimiento del software.16 // Funcion para actualizar la edad de una
Las estructuras permiten crear tipos de datos personali- persona
17 void actualizarEdad ( struct Persona * persona
zados que contienen múltiples campos con diferentes ti- , int nuevaEdad ) {
pos de datos. Por ejemplo, si estás creando un programa18 persona - > edad = nuevaEdad ;
para manejar información de empleados, puedes definir19 }
una estructura llamada .Empleado”que contenga campos20
21 int main () {
como nombre, edad, salario, etc. Las estructuras ayudan22 struct Persona persona1 ;
a organizar y manipular datos de manera más eficiente y23 sprintf ( persona1 . nombre , " Juan " ) ;
24 persona1 . edad = 25;
* al2223033745@azc.uam.mx
25
** al2223036595@azc.uam.mx
26 imprimirPersona (& persona1 ) ;
*** al2212006349@azc.uam.mx
27
**** al2172005991@azc.uam.mx 28 actualizarEdad (& persona1 , 30) ;
1
29 17 average = sum / n ;
30 imprimirPersona (& persona1 ) ; 18
31 19 printf ( " El promedio de los %d numeros
32 return 0; ingresados es : %.2 f " , n , average ) ;
33 } 20
21 return 0;
Ejemplo de funciones, estructuras y punteros 22 }
En este ejemplo, se define una estructura llamada
”Persona”que contiene los campos nombre (un arreglo 2.Defina una función que regrese una representación
de caracteres) y edad (un entero). Luego, se definen dos de cadena de un entereo que sea pasado como el argu-
funciones: La función ı̈mprimirPersonarecibe un punte- mento. Por ejemplo, si el argumento es 25, la función
ro a una estructura Persona y muestra por pantalla el regresará ”25”, si el argumento es -98, la función re-
nombre y la edad de la persona utilizando el operador gresará 98”. Demuestre la operación de su función en
-¿para acceder a los campos de la estructura a través un programa tal que sea invocada la función dentro de
del puntero. La función actualizarEdad recibe un pun- main().
tero a una estructura Persona y un entero nuevaEdad, y 1 # include < stdio .h >
actualiza el campo edad de la estructura con el valor pro- 2 int main () {
int num ;
porcionado. En la función main, se declara una variable 3
4 char str [10];
persona1 de tipo Persona. Se inicializa su campo nom- 5
bre utilizando la función sprintf y se asigna un valor a 6 printf ( " ingrese el argumento : " ) ;
su campo edad. Luego, se llama a la función imprimir- 7 scanf ( " %d " , & num ) ;
Persona pasando la dirección de memoria de persona1. 8
9 sprintf ( str , " %d " , num ) ;
Después, se llama a la función actualizarEdad para cam-10
biar la edad de persona1 a 30. Finalmente, se vuelve a11 printf ( " el argumento es \" % s \"\ n " , str ) ;
llamar a imprimirPersona para mostrar los datos actuali-12
zados de la persona. 13 return 0;
14
15 }
2
21 printf ( " %s " , str ) ; a.
22 if ( len < ancho ) {
1 # include < stdio .h >
23 printf ( " %*s " , ancho - len , " " ) ;
2 # include < stdlib .h >
24 }
3 # include < string .h >
25 printf ( " \ n " ) ;
4
26
5 void SegCadena ( char * cad , char ** palab , int
27 return 0;
maxPalab ) {
28 }
6 char * token ;
4.Defina una funcion que regrese el numero de pala- 7 int indice = 0;
bras en una cadena que sea pasada como un argumen- 8
9 token = strtok ( cad , " " ) ;
to. Las palabras son separadas por espacios en blanco10
(blancos: ), o caracteres de puntuacion. Asumiendo que11 while ( token != NULL && indice <
la cadena no contiene comillas simples(’) o dobles (”). maxPalab ) {
a. Defina una segunda funcion que segmente una cade-12 palab [ indice ] = token ;
13 indice ++;
na que le sea pasada como primero argumento a la fun-14 token = strtok ( NULL , " " ) ;
cion en palabras, y regrese las palabras alamacenadas en15 }
arrays que sea pasadas como 2do argumento. b. Defina16 }
una tercer funcion para implementar un programa que17
lea una cadena con texto desde el teclado, y la salida sea18 int main () {
19 char cad [] = " Al que madruga Dios lo
todas las palabras del texto ingresado ordenado de las ayuda " ;
mas cortas a las mas largas. 20 int maxPalab = 4;
1
21 char * palab [ maxPalab ];
22
2 # include < stdio .h >
3 # include < ctype .h > 23 SegCadena ( cad , palab , maxPalab ) ;
24
4 # include < string .h >
5
25 printf ( " Las palabras almacenadas son :\ n
6 int ContPalab ( const char * cadena ) { ");
7 int contador = 0; 26 for ( int i = 0; i < maxPalab ; i ++) {
8 int longitud = strlen ( cadena ) ; 27 if ( palab [ i ] != NULL ) {
9 int i ; 28 printf ( " %s \ n " , palab [ i ]) ;
10
29 }
11 for ( i = 0; i < longitud ; i ++) { 30 }
31
12
13 if ( isspace ( cadena [ i ]) || ispunct ( 32 return 0;
cadena [ i ]) ) { 33 }
14 continue ;
b.
15 }
16 contador ++; 1 # include < stdio .h >
17 2 # include < stdlib .h >
18 while ( i < longitud && ! isspace ( 3 # include < string .h >
cadena [ i ]) && ! ispunct ( cadena [ i ]) ) { 4
19 i ++; 5 void SegCadena ( char * cad , char ** palab , int
20 } maxPalab ) {
21 } 6 char * token ;
22 7 int indice = 0;
23 return contador ; 8
24 } 9 token = strtok ( cad , " " ) ;
25 10
26 int main () { 11 while ( token != NULL && indice <
27 const char * cadena = " Las veces que maxPalab ) {
dijimos frica . " ; 12 palab [ indice ] = token ;
28 13 indice ++;
29 int numPalabras = ContPalab ( cadena ) ; 14 token = strtok ( NULL , " " ) ;
30 printf ( " El total de palabras es : %d \ n " , 15 }
numPalabras ) ; 16 }
31 17
32 return 0; 18 int main () {
33 } 19 char cad [] = " Al que madruga Dios lo
3
ayuda " ; el array para ser operado, el número de elementos del
20 int maxPalab = 4; array, y un puntero a una función, difiniendo la opera-
21 char * palab [ maxPalab ];
ción a ser aplicada entre los elementos sucesivvos. La
22
23 SegCadena ( cad , palab , maxPalab ) ; función array op() debe ser implementada tal que cuan-
24 do la funcón substract() es pasada como 3er argumen-
25 printf ( " Las palabras almacenadas son :\ n to, la fuunción combina los elementos alterando con los
");
signos. Luego por ekemplo, para un array con cuatro ele-
26 for ( int i = 0; i < maxPalab ; i ++) {
27 if ( palab [ i ] != NULL ) { mentos ean x1, x2, x3,x4, calcula el valor de : x1-x2+x3-
28 printf ( " %s \ n " , palab [ i ]) ; x4. Demuestre la operación de estass funciones con un
29 } programa tal que sean involucradas dentro de main().
30 }
31 1 # include < stdio .h >
32 return 0; 2
33 } 3 double add ( double a , double b ) ; /* regresa
a + b */
5. Revise la documentación de los libros de la refren- 4 double subtract ( double a , double b ) ; /*
cia bibliográfica del curso, y en otros que usted ubique, regresa a - b */
del estándar ANSI C las siguientes librerı́as, explicando 5 double multiply ( double a , double b ) ; /*
regresa a * b */
sus funciones: ¡stdio.h¿, ¡stdarg.h¿, ¡math.h¿, ¡stdlib.h¿,
6 double array_op ( double array [] , int size ,
¡string.h¿, ¡stdbool.h¿,¡complex.h¿, ¡ctype.h¿, ¡wcty- double (* pfun ) ( double , double ) ) ;
pe.h¿Presente la información en una tabla y cite las re- 7
ferencias usadas. 8 int main () {
9 double array [] = {1.0 , 3.0 , 4.0 , 5.0};
1 # include < iostream >
// Se define el arreglo de tipo double
2 # include < cmath >
: x1 =1.0 , x2 =3.0 , x3 =4.0 , x4 =5.0
3
10
4 double power ( double base , double exponente )
11 double suma = add (4.0 , 5.0) ; // Se
{
realiza la suma .
5 return pow ( base , exponente ) ;
12 printf ( " Suma : %lf \ n " , suma ) ;
6 }
13
7
14 double resta = subtract (3.0 , 4.0) ; //
8 int main () {
Se realiza la resta .
9 double base , exponente ;
15 printf ( " Resta : %lf \ n " , resta ) ;
10 std :: cout << " Ingresa la base : " ;
16
11 std :: cin >> base ;
17 double producto = multiply (4.0 , 5.0) ;
12 std :: cout << " Ingresa el exponente : " ;
// Se realiza el producto .
13 std :: cin >> exponente ;
18 printf ( " Producto : %lf \ n " , producto ) ;
14 double resultado = power ( base ,
19
exponente ) ;
20 double resultado = array_op ( array , 4 ,
15 std :: cout << " El resultado da : " <<
subtract ) ; // Se calculan los
resultado << std :: endl ;
resultados .
16 return 0;
21 printf ( " Resultado de array_op : %lf \ n " ,
17 }
resultado ) ;
6. Una función con el prototipo: double power(double22
x, int n); deberı́a calcular y devovler el valor de X -1123 return 0;
24 }
tal que la expresión power (5.0, 4) evaluarı́a (5.0 * 5.025
* 5.0 * 5.0), que dará como resultado 625.0 Implemente26 double add ( double a , double b ) {
la función power () como una función recursiva, es decir27 return a + b ;
que se llame a sı́ misma, y demuestre su operación con28 }
29
una versión con un programa dentro de main(). 30 double subtract ( double a , double b ) {
7. Implemente funciones con los prototipos: double31 return a - b ;
add(double a, dobule b); /* regresa a+b*/ double subs-32 }
tract (double a, double b); /* regresa a-b */ double mul-33
34 double multiply ( double a , double b ) {
tiply (double a, double b); /* regresa a*b */ double arrray35 return a * b ;
op (double array [], int size, double (*pfun)(double,36 }
double)); Los parámetros de la función array op() son:37
4
38 double array_op ( double array [] , int size , , bufferSize * sizeof ( char ) ) ;
double (* pfun ) ( double , double ) ) { 27 if ( buffer == NULL ) {
39 double result = array [0]; 28 return NULL ;
40 int i ; 29 }
41 30 }
42 for ( i = 1; i < size ; i ++) { 31
43 if ( i % 2 == 1) { 32 charsWritten += snprintf ( buffer +
44 result = pfun ( result , array [ i ]) charsWritten , bufferSize - charsWritten
; , " , %.2 lf " , value ) ;
45 } else { 33 if ( charsWritten < 0) {
46 result = pfun ( result , - array [ i 34 free ( buffer ) ;
]) ; 35 return NULL ;
47 } 36 }
48 } 37
49 38 args ++;
50 return result ; 39 }
51 } 40
41 return buffer ;
8. Defina una función que acepte un array de punteros42 }
a cadena comom un argumento, y regrese un puntero a43
una cadena que contenga todas las cadenas juntas en una44 int main () {
45 double valor1 = 3.14159;
única cadena, terminada por el caracter de retorno de ca-46 double valor2 = 2.71828;
rro, o de nueva lı́nea. Si en una cadena de origen en el47 double valor3 = 1.41421;
array de entrada tiene el caracter de nueva linea como su48 double valor4 = 1.73205;
último carcater, la función no debe agregar otro carac-49
50 char * resultado = a_cadena (4 , valor1 ,
ter más de ese tipo. Escriba un programa para demostrar valor2 , valor3 , valor4 ) ;
el funcionamineto de esta función, tal que lea un núme-51 if ( resultado != NULL ) {
ro de cadenas desde el teclado y regrese imprimendo en52 printf ( " Valores : %s \ n " , resultado ) ;
pantalla la cadenas resultando combinada. 53 free ( resultado ) ;
54 } else {
1 # include < stdio .h > 55 printf ( " Error : no se pudo generar
2 # include < stdlib .h > la cadena .\ n " ) ;
3 # include < string .h > 56 }
4 57
5 char * a_cadena ( int count , double primero , 58 return 0;
...) { 59 }
6 int bufferSize = 100;
7 char * buffer = ( char *) malloc ( 9. Una función con el prototipo: char *to string(int
bufferSize * sizeof ( char ) ) ; count, double first, ...); Esta función debe regresar una
8 if ( buffer == NULL ) { cadena que contenga las representaciones en cadena del
9 return NULL ;
10 }
segundo y subsecuente argumentos, cada uno con dos
11 decimales y separados por comas. El pimero argumento
12 int charsWritten = snprintf ( buffer , es un contador del número de argumentos que seiguen.
bufferSize , " %.2 lf " , primero ) ; Escriban un programa que usa esta función desde main()
13 if ( charsWritten < 0) {
para demostrar su operación.
14 free ( buffer ) ;
15 return NULL ; 1 # include < stdio .h >
16 } 2 # include < stdlib .h >
17 3 # include < string .h >
18 double * args = ( double *) & primero ; 4
19 args ++; 5 char * a_cadena ( int count , double primero ,
20 ...) {
21 for ( int i = 1; i < count ; i ++) { 6 int bufferSize = 100;
22 double value = * args ; 7 char * buffer = ( char *) malloc (
23 bufferSize * sizeof ( char ) ) ;
24 if ( charsWritten >= bufferSize - 1) 8 if ( buffer == NULL ) {
{ 9 return NULL ;
25 bufferSize *= 2; 10 }
26 buffer = ( char *) realloc ( buffer 11
5
12 int charsWritten = snprintf ( buffer , 3. Experimentos
bufferSize , " %.2 lf " , primero ) ;
13 if ( charsWritten < 0) {
14 free ( buffer ) ;
15 return NULL ;
16 }
17
18 double * args = ( double *) & primero ;
19 args ++;
20
21 for ( int i = 1; i < count ; i ++) {
22 double value = * args ;
23
24 if ( charsWritten >= bufferSize - 1)
{
25 bufferSize *= 2;
26 buffer = ( char *) realloc ( buffer
, bufferSize * sizeof ( char ) ) ;
27 if ( buffer == NULL ) {
28 return NULL ;
29 } Figura 1: Imagen que muestra los resultados de ejecu-
30 }
31
cion del codigo.
32 charsWritten += snprintf ( buffer +
charsWritten , bufferSize - charsWritten
, " , %.2 lf " , value ) ;
33 if ( charsWritten < 0) {
34 free ( buffer ) ;
35 return NULL ;
36 }
37
38 args ++;
39 }
40
41 return buffer ;
42 }
43
44 int main () {
45 double valor1 = 3.14159;
46 double valor2 = 2.71828;
47 double valor3 = 1.41421;
48 double valor4 = 1.73205;
49
Figura 2: Imagen que muestra los resultados de ejecu-
50 char * resultado = a_cadena (4 , valor1 ,
valor2 , valor3 , valor4 ) ; cion del codigo 2.
51 if ( resultado != NULL ) {
52 printf ( " Valores : %s \ n " , resultado ) ;
53 free ( resultado ) ;
54 } else {
55 printf ( " Error : no se pudo generar
la cadena .\ n " ) ;
56 }
57
58 return 0;
59 }
6
Figura 4: Imagen que muestra los resultados de ejecu-
ción de lcódigo 4.
Figura 5: Ejercicio 4
7
tructuras de datos complejas o asignar memoria dinámi-
camente. El uso correcto de estas herramientas es esen-
cial para escribir programas eficientes y bien estructu-
rados. Sin embargo, el manejo incorrecto de los punte-
ros puede llevar a errores y comportamientos inespera-
dos, como acceder a áreas de memoria no autorizadas
o causar fugas de memoria. En resumen, las funciones,
estructuras y punteros son conceptos fundamentales en
programación que permiten organizar y manipular da-
Figura 10: Imagen que muestra los resultados de ejecu- tos de manera eficiente. Su comprensión y uso adecuado
cion del codigo 7. son importantes para desarrollar programas robustos y
eficaces.
Referencias
[1] Punteros (C++). (s.f.). Microsoft Learn:
Build skills that open doors in your career.
https://learn.microsoft.com/es-es/cpp/cpp/pointers-
cpp?view=msvc-170
4. Conclusiones
Las funciones son bloques de código que realizan ta-
reas especı́ficas y permiten organizar y reutilizar el códi-
go. Son fundamentales para dividir un programa en ta-
reas más pequeñas y manejables. Las estructuras son
tipos de datos compuestos que permiten agrupar varia-
bles relacionadas bajo un único nombre. Se utilizan para
representar entidades más complejas y facilitan la or-
ganización y manipulación de datos en un programa.
Los punteros son variables que almacenan direcciones
de memoria en lugar de valores. Permiten acceder y ma-
nipular datos de manera eficiente y son útiles en situacio-
nes como pasar argumentos por referencia, acceder a es-