Está en la página 1de 8

Práctica 6:

Funciones, estructuras, punteros

Alejandro Roman Lopez*, Alan Mauricio Vazquez Benitez**


, Denilson Adrian Jimenez Sandoval***
and
Paola Olmedo Perez ****

Universidad Autónoma Metropolitana, Unidad Azcapotzalco. México DF.

30 de mayo del 2023

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. Desarrollo 3.Extienda la funcion definida anteriormente para que


acepte un argumento adicional que especifique el ancho
1. Defina una función que calcule el promedio de una para el resultado, y regrese la representacion en cadena
cantidad arbitraria de números de punto flotante, que del valor calculado alineado a la derecha del ancho es 5,
sean pasados a la función de promedio, que usted escri- la cadena que regresara sera -98. Demuestre la operacion
ba, en un array. Demuestre la operación de esta función de esta funcion con un programa que la invoque dentro
implementando un programa que acepte una cantidad ar- de main().
bitraria de valores ingresada desde el teclado, y regrese
1 # include < stdio .h >
el promedio.
2 # include < string .h >
1 # include < stdio .h > 3 int main () {
2 4 int num , ancho ;
3 int main () { 5 char str [10] , symbol = ’_ ’;
4 6
5 int n ; 7 printf ( " Ingrese el argumento : " ) ;
6 float num , sum = 0 , average ; 8 scanf ( " %d " , & num ) ;
7 9
8 printf ( " Ingrese la cantidad de numeros 10 printf ( " Ingrese el ancho del resultado : " ) ;
a promediar : " ) ; 11 scanf ( " %d " , & ancho ) ;
9 scanf ( " %d " , & n ) ; 12
10 13 sprintf ( str , " \" % d \" " , num ) ;
11 for ( int i = 1; i <= n ; i ++) { 14
12 printf ( " Ingrese el numero %d : " , i ) 15 int len = strlen ( str ) ;
; 16 if ( len < ancho ) {
13 scanf ( " %f " , & num ) ; 17 for ( int i = 0; i < ancho - len ; i ++) {
14 sum += num ; 18 printf ( " %c " , symbol ) ;
15 } 19 }
16 20 }

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 }

Figura 3: Imagen que muestra los resultados de ejecu-


cion del codigo 3.

6
Figura 4: Imagen que muestra los resultados de ejecu-
ción de lcódigo 4.

Figura 8: Imagen que muestra los resultados de ejecu-


cion del codigo 5.

Figura 5: Ejercicio 4

Figura 6: Imagen que muestra los resultados de ejecu-


cion del codigo 4 inciso a.

Figura 7: Imagen que muestra los resultados de ejecu-


cion del codigo 4 inciso b. Figura 9: Tabla del Ejercicio 6.

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

[2] Punteros y estructuras. (s.f.). https://ccia.ugr.es/ jf-


v/ed1/c/cdrom/cap8/cap811.htm
Figura 11: Imagen que muestra los resultados de ejecu-
cion del codigo 8.

Figura 12: Imagen que muestra los resultados de ejecu-


cion del codigo 9.

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-

También podría gustarte