+ All Categories
Home > Documents > Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de...

Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de...

Date post: 02-Jun-2020
Category:
Upload: others
View: 8 times
Download: 0 times
Share this document with a friend
37
Punteros CURSO DE PROGRAMACIÓN EN C Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas. Febrero 2016 [Curso de programación en C] - Punteros 1/30
Transcript
Page 1: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros

CURSO DE PROGRAMACIÓN EN C

Centro de Investigación y de Estudios Avanzados del IPN.CINVESTAV - Tamaulipas.

Febrero 2016

[Curso de programación en C] - Punteros 1/30

Page 2: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros

Las celdas de memoria dentro de la computadora están numeradasconsecutivamente. Cada dato almacenado ocupa una o más celdascontiguas de memoria.

El número de celdas de memoria requeridas para almacenar un datodepende de su tipo, e.g. un caracter se almacenará normalmente enun byte; un entero usualmente necesita dos bytes contiguos; etc.

El número asociado con cada celda de memoria es conocido como ladirección de la celda .

38 34 31000 1002 1004

h o l a \01700 1701 1702 1703 1704

[Curso de programación en C] - Punteros 2/30

Page 3: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Asignaciones de Variables Puntero

Las variables puntero pueden apuntar a variables numéricas de carac-ter, arrays, funciones o a otras variables puntero. Los punteros, comocualquier otra variable, deben ser declarados.

tipo * ptvar;

A una variable puntero se le puede asignar la dirección de unavariable ordinariapv = &v;

A una variable puntero se le puede asignar la dirección de otravariable puntero, siempre que ambas sean «apunten» al mismotipo de datospv = px;

A una variable puntero se le puede asignar un valor nulopv = NULL;

[Curso de programación en C] - Punteros 3/30

Page 4: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Operador Dirección &

Si v es una variable que representa un determinado dato, el compiladorasignará celdas de memoria para esta variable. Si se conoce la locali-zación (dirección) de la primera celda de memoria, entonces es posibleaccesar al dato.

int v; 1231974

La dirección de memoria de v se determina mediante la expresión &v,donde & es un operador unario, llamado el operador dirección .

&v → 1974

[Curso de programación en C] - Punteros 4/30

Page 5: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Operador Indirección *

Para asignar el valor de &v a la variable pv , ésta debe ser de tipopuntero, ya que «apunta» a la posición de memoria donde se aloja v .

int v; 123 XXXXX int * pv;1974 pv = &v;

pv → 1974

El dato representado por v puede ser accedido mediante la expresión* pv , donde * es un operador unario, llamado el operadar indirecciónque opera sólo sobre una variable puntero.

* pv → 123

* pv y v representan el mismo dato

[Curso de programación en C] - Punteros 5/30

Page 6: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Ejemplo de los Operadores Dirección e Indirección

Operadores dirección (&) e indirección (*)#include <stdio.h>int main( ){___ int v = 5;___ int * pv; / * puntero a un entero * /___pv = &v; / * asigna dirección de v a pv * /___printf("v = %d \t &v = %p\n",v, &v);___printf(" * pv = %d\t pv = %p \n", * pv, pv);___ return 0;}

* pv = 5 &v = 0xbfcddab8

* pv = 5 pv = 0xbfcddab8

[Curso de programación en C] - Punteros 6/30

Page 7: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Memoria Dinámica

La función malloc sirve para solicitar un bloque de memoria del tamañosuministrado como parámetro. Devuelve un puntero a la zona de memoriaconcedida. Si malloc es incapaz de conceder el bloque (e.g. no hay memoriasuficiente), devuelve un puntero nulo.

void * malloc(unsigned numero_de_bytes);

La función malloc devuelve un puntero inespecífico, en C estos punterossin tipo se declaran como void * . Un puntero void * puede convertirse acualquier otra clase de puntero.

Cuando una zona de memoria reservada con malloc ya no se necesita, puedeser liberada mediante la función free .

[Curso de programación en C] - Punteros 7/30

Page 8: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Array de Enteros con Memoria Dinámica

Si x es un array unidimensional de 10 elementos enteros, es posible definir xcomo una variable puntero en vez de como un array.

int * x;

Debido a que x no tiene asignado automáticamente un bloque de memoriacuando se define como una variable puntero, se puede usar la función debiblioteca malloc para asignar suficiente memoria para x como sigue:

x = (int * ) malloc(10 * sizeof(int));

[Curso de programación en C] - Punteros 8/30

Page 9: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Operador ++ Sobre Variables Puntero

Cuando se utiliza el operador ++ sobre una variable puntero, se puedemodificar el valor del dato o la dirección al cual «apunta».

Operador ++ en una variable puntero#include <stdio.h>int main( ){___ int v = 5;___ int * pv; / * puntero a un entero * /___pv = &v; / * asigna dirección de v a pv * /___printf("v = %d \t &v = %p\n",v, &v);___printf(" * pv = %d\t pv = %p \n", * pv, pv);___++* pv; / * dato al cual apunta * /___++pv; / * dirección de memoria a la cual «apunta» * /___printf(" * pv = %d\t pv = %p \n", * pv, pv);___ return 0;}

* pv = 5 &v = 0xbfcddab8

* pv = 5 pv = 0xbfcddab8

* pv = 6 pv = 0xbfcddabc

[Curso de programación en C] - Punteros 9/30

Page 10: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Precedencia de los operadores ++ * en variables de tipo punte ro

#include <stdio.h>#include <stdlib.h>int main( ){___ int * pv, i;___pv = (int * ) malloc (3 * sizeof(int));___pv[0] = 10; pv[1] = 15; pv[2] = 20;___ imprimir(3,pv);

___printf(“ %d \n”,++ * pv); imprimir(3,pv);___printf(“ %d \n”, * pv++); imprimir(3,pv);___printf(“ %d \n”, * ++pv); imprimir(3,pv);

___ free(pv-=2);___ return 0;}void imprimir(int n, int * p ){___ int i;___printf(“pv = %p \n”,p)___ for(i=0; i<n; ++i) printf(“ %d \t”,p[i]);___printf(“ \n\n”);}

[Curso de programación en C] - Punteros 10/30

Page 11: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Precedencia de los operadores ++ * en variables de tipo punte ro

#include <stdio.h>#include <stdlib.h>int main( ){___ int * pv, i;___pv = (int * ) malloc (3 * sizeof(int));___pv[0] = 10; pv[1] = 15; pv[2] = 20;___ imprimir(3,pv);

___printf(“ %d \n”,++ * pv); imprimir(3,pv);___printf(“ %d \n”, * pv++); imprimir(3,pv);___printf(“ %d \n”, * ++pv); imprimir(3,pv);

___ free(pv-=2);___ return 0;}void imprimir(int n, int * p ){___ int i;___printf(“pv = %p \n”,p)___ for(i=0; i<n; ++i) printf(“ %d \t”,p[i]);___printf(“ \n\n”);}

salida

pv = 0x88f200810 15 20

11pv = 0x88f200811 15 20

11pv = 0x88f200c15 20 135153

20pv = 0x88f201020 135153 0

[Curso de programación en C] - Punteros 10/30

Page 12: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros y Arrays Unidimensionales

El nombre de un array es un puntero al primer elemento, por tanto, si xes un array unidimensional, la dirección del primer elemento se puedeexpresar como &x[0] o simplemente x .

float x[4]; XX 0.4 0.2 0.1 0.32810 2814 2818 2822

&x[0] → 2810x → 2810

[Curso de programación en C] - Punteros 11/30

Page 13: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros y Arrays Unidimensionales

El nombre de un array es un puntero al primer elemento, por tanto, si xes un array unidimensional, la dirección del primer elemento se puedeexpresar como &x[0] o simplemente x .

float x[4]; XX 0.4 0.2 0.1 0.32810 2814 2818 2822

&x[0] → 2810x → 2810

modificarprobabilidades (x);modificarprobabilidades (&x[0]);

void modificarprobabilidades (float x[]){___ instrucciones;}

[Curso de programación en C] - Punteros 11/30

Page 14: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros en Arrays Unidimensionales

La dirección del segundo elemento del array se puede escribir como&x[1] o como (x + 1) . Por tanto, la dirección del elemento i-ésimodel array se puede expresar &x[i] o como (x + i) .

float x[4]; XX 0.4 0.2 0.1 0.32810 2814 2818 2822

&x[2] → 2818x + 2 → 2818

[Curso de programación en C] - Punteros 12/30

Page 15: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros en Arrays Unidimensionales

La dirección del segundo elemento del array se puede escribir como&x[1] o como (x + 1) . Por tanto, la dirección del elemento i-ésimodel array se puede expresar &x[i] o como (x + i) .

float x[4]; XX 0.4 0.2 0.1 0.32810 2814 2818 2822

&x[2] → 2818x + 2 → 2818

¿Cuál es la diferencia?

* x + 2

* (x + 2)

[Curso de programación en C] - Punteros 12/30

Page 16: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Transformar un Puntero a una Posición de Arreglo

strchr es una función de la biblioteca string.h que localiza un ca-rácter en una cadena, buscando desde el principio y retorna un punteroen la primer ocurrencia de ese caracter.

Obtener posición del arreglo a partir de un puntero#include <stdio.h>#include <string.h>int main(){___char cadena[] = “Hola Mundo”;___char * pch;___printf (“Localizando el caracter ’M’ en %s \n”, cadena);___pch = strchr(cadena,’M’);___ if(pch! = NUll)______ printf(“Índice = %d \n”, pch-cadena );___ return 0;}

[Curso de programación en C] - Punteros 13/30

Page 17: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Modificación de Valores con Punteros

Si se desea se puede asignar el valor de un elemento del array a otromediante un puntero

34 56 78 951974 1976 1978 1980

int numero[4] = {34, 56, 78, 95};int * p1;

p1 = &numero[1];numero[2] = * p1;

p1 = numero + 1;

* (numero + 3) = * p1;

[Curso de programación en C] - Punteros 14/30

Page 18: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Operaciones con Punteros

A una variable puntero se le puede sumar o restar un valor entero,pero el resultado debe ser interpretado cuidadpsamente.

Si px es una variable puntero que representa la dirección de x ,se pueden escribir expresiones como ++px , −−px , (px + 3) ,(px + i) y (px - i) , donde i es una variable entera.

Cada expresión representará una dirección localizada a cierta distanciade la posición original. La distancia es el resultado del producto dela cantidad entera por el número de bytes que ocupa cada elementoal cual apunta px .

[Curso de programación en C] - Punteros 15/30

Page 19: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Operaciones con Punteros

Las comparaciones de variables puntero pueden ser de utilidad cuan-do ambas variables «apunten» a elementos de un mismo array. Lascomparaciones posibles son <, >, <=, >=, ! =. Además, una variablepuntero puede ser comparada con cero (NULL).

float x[4]; XX 0.4 0.2 0.1 0.32810 2814 2818 2822

px = &x[1];py = &x[3];

[Curso de programación en C] - Punteros 16/30

Page 20: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Operaciones con Punteros

Las comparaciones de variables puntero pueden ser de utilidad cuan-do ambas variables «apunten» a elementos de un mismo array. Lascomparaciones posibles son <, >, <=, >=, ! =. Además, una variablepuntero puede ser comparada con cero (NULL).

float x[4]; XX 0.4 0.2 0.1 0.32810 2814 2818 2822

px = &x[1];py = &x[3];

Algunas comparaciones válidas:

(px < py) (2814 < 2822)(px != py) (2814 != 2822)(px > py) (2814 > 2822)(px == NULL) (2814 == NULL)

[Curso de programación en C] - Punteros 16/30

Page 21: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Operaciones Permitidas con Punteros - Resumen

Operación EjemploAsignar la dirección de una variable ordinaria pv = &v;Asignar el valor de otra variable puxntero pv = px;Asignar un valor nulo (cero) pv = NULL;Sumar o restar una cantidad entera pv + 3; ++pv; −−pv;Una variable puntero puede ser restada de otra px - pv;Comparar 2 punteros (si «apuntan» al mismo tipo ) (px < py) (px == py)

Una variable puntero no puede ser multiplicada por una constan-te, no se pueden sumar dos punteros y así sucesivamente.

A una variable ordinaria no se le puede asignar una direcciónarbitraria, e.g.

&x = pv;&x = NULL;&x = &y;

[Curso de programación en C] - Punteros 17/30

Page 22: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros de Arrays

Un array bidimensional es una colección de arrays unidimensionales.Por tanto, se puede definir un array bidimensional como un punteroa un grupo de arrays unidimensionales contiguos , de esta forma,se puede escribir una declaración de array bidimensional como:

tipo ( * ptvar)[expresión 2];

en vez de:

tipo array[expresión 1][expresión 2];

[Curso de programación en C] - Punteros 18/30

Page 23: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros a Arrays Bidimensionales de Enteros

Si x es un array bidimensional de enteros con 10 filas y 20 columnas, x sepuede declarar como:

int ( * x)[20]; en vez de int x[10][20];

[Curso de programación en C] - Punteros 19/30

Page 24: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Punteros a Arrays Bidimensionales de Enteros

Si x es un array bidimensional de enteros con 10 filas y 20 columnas, x sepuede declarar como:

int ( * x)[20]; en vez de int x[10][20];

De esta forma x apunta al primero de los arrays, i.e. la primer fila (fila 0 ).Entonces, (x + 1 ) apunta al segundo array que es la segunda fila (fila 1 ) yasí sucesivamente,

[Curso de programación en C] - Punteros 19/30

Page 25: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Arrays de Punteros

Un array multidimensional puede ser expresado como un array de pun-teros. Cada puntero indica el principio de un array de dimensión (n-1 ).En términos generales, un array bidimensional se puede definir comoun array unidimensional de punteros escribiendo:

tipo * ptvar[expresión 1];

El nombre del array precedido por un asterisco no está encerrado en-tre paréntesis en este tipo de declaración. Así la regla de precedenciade derecha a izquierda asocia el primer par de corchetes con array. Elasterisco que lo precede establece que el array contendrá punteros.

[Curso de programación en C] - Punteros 20/30

Page 26: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Acceso a un Elemento de una Matriz Usando Punteros

Suponga que x es un array bidimensional de 10 filas y 20 columnas, xse puede declarar como:

int * x[10];

[Curso de programación en C] - Punteros 21/30

Page 27: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Acceso a un Elemento de una Matriz Usando Punteros

Suponga que x es un array bidimensional de 10 filas y 20 columnas, xse puede declarar como:

int * x[10];

El elemento en la fila 2, columna 5, puede ser accedido escribiendox[2][5] o * (x[2] + 5) .

[Curso de programación en C] - Punteros 21/30

Page 28: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Memoria Dinámica - Arrays de Punteros

Ejemplo 1

#include <stdio.h>#include <stdlib.h>

#define MAXFIL 10

int main(){___ int fila, nc;___ int * a[MAXFIL];___printf(“¿Cuántos elementos? ”);___scanf(“ %d”,&nc);

___ for(fila = 0; fila < MAXFIL; ++fila)______ a[fila] = (int * ) malloc(nc * sizeof(int));

___...

}

[Curso de programación en C] - Punteros 22/30

Page 29: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Memoria Dinámica - Arrays de Punteros

Ejemplo 2int ** MemoryMatrix(int nrows, int ncols){___ int ** matrix, i;___matrix = (int ** ) malloc(nrows * sizeof(int * ));___ if(!matrix){______ fprintf(stderr,“Error in Memory Matrix! \n”);______ exit(-1);___ }___ for(i = 0; i < nrows; i++){______ matrix[i] = (int * ) malloc(ncols * sizeof(int));______ if(!matrix[i]){_________ fprintf(stderr,“Error in Memory Matrix! \n”);_________ exit(-1);______ }___ }___ return matrix;}

[Curso de programación en C] - Punteros 23/30

Page 30: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Paso de Punteros a una Función

El «paso» de punteros a una función se conoce como pasar argu-mentos por referencia . Cuando un argumento se pasa por referencia,la dirección o posición del dato es pasada a la función. Un prototipo defunción por referencia es el siguiente:

tipo nombrefuncion (tipo * arg 1, ..., tipo * arg n);

También se pueden omitir los nombres de los argumentos:

tipo nombrefuncion (tipo * , ..., tipo * );

[Curso de programación en C] - Punteros 24/30

Page 31: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Paso de Parámetros por Referencia

void PasoValor (int n); / * Prototipo de función * /void PasoReferencia (int * n); / * Prototipo de función * /_

int main(){___ int num = 10;___printf(“Antes de funciones num = %d \n”, num);___PasoValor ( num);___printf(“Después de paso por valor num = %d \n”, num);___PasoReferencia ( &num);___printf(“Después de paso por referencia num = %d \n”, num);___ return 0;}_

void PasoValor (int n){___n = 0;___ return;}_

void PasoReferencia (int * n){___* n = 0;___ return;}

[Curso de programación en C] - Punteros 25/30

Page 32: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Paso de Elementos de Arrays a Funciones por Referencia

Cuando se pasa el elemento de un array a una función se pasa una«copia», por lo que si éste se modifica en la función el elemento ori-ginal del array no es alterado, sin embargo, si se pasa por referencia,el valor original del elemento del arreglo puede ser modificado.

Paso por referencia en los elementos de un array#include<stdio.h>void resetearpromedio (float * pf ){___* pf = 0.0;___ return;}int main(){___ int i;___ float promedio[5];

___...

___ resetearpromedio ( &porcentajes[i] );

___...

}

[Curso de programación en C] - Punteros 26/30

Page 33: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Reordenación de una Cadena de Caracteres

#include <stdio.h>#include <stdlib.h>#include <string.h>void reordenar(int n, char * x[]);

int main(){

___ int i, n = 0;___char * x[10];___printf(“Introducir una cadena en una nueva línea: \n”);___printf(“Escribir \”FIN \” para terminar \n\n”);___do{______ x[n] = (char * ) malloc (12 * sizeof(char));______ printf(“cadena%d: ”, n + 1);______ scanf(" %s", x[n]);___ }while(strcmp(x[n++],“FIN”)&&n<11);___ reordenar ( −−n, x);___ imprimir (n, x);}

[Curso de programación en C] - Punteros 27/30

Page 34: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Reordenación de una Cadena de Caracteres

void reordenar (int n, char * x[]){___char * temp;___ int i, elem;___ for(elem = 0; elem < n - 1; ++elem)______ for(i = elem + 1; i < n; ++i)_________ if(strcmp(x[elem], x[i]) > 0){____________ / * intercambiar las dos cadenas * /____________ temp = x[elem];____________ x[e1em] = x[i];____________ x[i] = temp;_________ }___ return;}

void imprimir (int n, char * x[]){___ for(i = 0; i < n; ++i)______ printf(" \ncadena%i: %s", i + 1, x[i]);}

[Curso de programación en C] - Punteros 28/30

Page 35: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Ejercicios para aplicar los temas

Los CAST ORES son una casa club formada por 4 equipos (ei | i = [1 − 4]),donde cada equipo tiene de 2 a 3 miembros, i.e |ei | ∈ {2, 3}. Todos losmiembros de cada equipo realizan la venta de productos, por lo que generan“utilidades” o “deudas” (representadas con el signo negativo).

Cada principio de mes la casa club se reune y seleccionan unrepresentante de cada equipo para realizar las aportaciones, de esta forma,el total de combinaciones diferentes para las aportaciones está dada por laecuación:

4∏

i=1

|ei |

Al club le interesa conocer todas las combinaciones de representantes de equi-po que generan tanto el mínimo como el máximo de utilidades.

[Curso de programación en C] - Punteros 29/30

Page 36: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Ejercicios para aplicar los temas (Punteros)

S7_1 Codificar un programa con las siguientes características:Generar un vector ε donde se especifique la cantidad de miem-bros de cada equipo ei .Generar una matriz A de 4 filas, donde cada fila ai tiene un apun-tador a un arreglo de flotantes tamaño |ei | que contiene las apor-taciones de los miembros de cada equipo.Generar un vector υ el cual irá evaluando TODAS las combina-ciones (índices) de los representantes de cada equipo.Utilizar una función de evaluación que reciba las 4 aportacionesde los representantes de equipo y calcule las utilidades.Imprimir todas las combinaciones de representantes que gene-ren el mínimo y máximo de utilidades, bajo el siguiente patrón:

Utilidad Mínima|Máxima: $

Miembro_ e1($), Miembro_ e2($), Miembro_ e3($),Miembro_ e4($)

[Curso de programación en C] - Punteros 30/30

Page 37: Punteros - CINVESTAVagonzalez/Files/Downloads/OMI2… · Punteros a Arrays Bidimensionales de Enteros Si xes un array bidimensional de enteros con 10filas y 20columnas, xse puede

Ejercicios para aplicar los temas

Ejemplo de entrada:

./Castores -e1 Hugo 300 Paco 200 Luis 100 -e2 Daisy 0Mimi 500 -e3 Aurora -20.5 Ariel 10 -e4 Adam 20 Erick 50

Ejemplo de salida:

Utilidad Mínima: $99.5

Luis($100.0), Daisy($0.0), Aurora($-20.5), Adam($20)

Utilidad Máxima: $860.0

Hugo($300.0), Mimi($500.0), Ariel($10.0), Erick($50.0)

[Curso de programación en C] - Punteros 31/30


Recommended