Está en la página 1de 9

PROGRAMA NACIONAL DE FORMACIN EN

INFORMATICA (PNFI)

ALGORITMICA Y PROGRAMACION

Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

UNIDAD CURRICULAR: ALGORITMICA Y PROGRAMACION


Ejercicios Punteros
1. Ejercicios Resueltos de Punteros
1. Funcin C++ que reciba la direccin de inicio de una cadena de caracteres y
devuelva el nmero de vocales que hay en la cadena.
#include <iostream>
using namespace std;
int cuenta_vocales(char *);
int main()
{
char cadena[80];
cout << "Introduce cadena: ";
cin.getline(cadena, 80);
//en la llamada a la funcin se enva el array de caracteres
cout << "Numero de vocales: " << cuenta_vocales(cadena) << endl;
}
int cuenta_vocales(char *s) //s contiene la direccin de inicio del array de
caracteres
{
int cont=0;
while(*s) //mientras no llegue al nulo
{
switch(toupper(*s)) //toupper pasa el carcter a maysculas para hacer la
comprobacin.
{
//el carcter original no se modifica.
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': cont++;
}
s++;
}
return cont;
}
Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

2. En este ejercicio se va a implementar un programa que permite al usuario


introducir un nmero determinado de palabras y da como resultado la impresin
de las palabras por consola ordenadas de forma descendente. Para ello se va a
utilizar la funcin strcmp(char*, char*) de la librera estndar del C++ que permite
comparar dos cadenas de caracteres. Dicha funcin est declarada en el fichero
string.h. Escribir el siguiente cdigo:
#include <iostream>
#include <string.h>
using namespace std;
void Ordena(char **, int);
void ImprimePalabras(char **, int);
char** ReservayPide(int);
void Libera( char **, int);
void main(void)
{
char **palabras;
int num;
cout << "Numero de palabras:" << endl;
cin >> num;
palabras = ReservayPide(num);
cout << "Palabras Introducidas: " << endl;
ImprimePalabras(palabras,num);
Ordena(palabras,num);
cout << "Palabras Ordenadas: " << endl;
ImprimePalabras(palabras,num);
}
char** ReservayPide(int num)
{
char tmp[120];
char **words;
words = new char*[num];
for (int i=0;i<num;i++){
cout << "Introduce la " << i+1 << " palabra:";
cin >> tmp;
words[i] = new char[ strlen(tmp)+1 ];
strcpy( words[i], tmp);
}
return words; //devuelve matriz
}
Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

void Ordena(char **words, int num)


{
for (int i=0;i<num-1;i++){
Laboratorio de Programacin II. Grupo A
3
for (int j=i+1;j<num;j++){
if ( strcmp( words[i], words[j]) < 0) {
//al cambiar hay que destruir los vectores
int len1 = strlen(words[i]);
int len2 = strlen(words[j]);
char *tmp1 = new char[len1 +1];
char *tmp2 = new char[len2 +1];
strcpy(tmp1,words[i]); //copiar antes de borrar
strcpy(tmp2,words[j]);
delete [ ] words[i]; //eliminar vectores
delete [ ] words[j];
words[i] = new char[len2+1]; //nuevos vectores
words[j] = new char[len1+1];
strcpy(words[i],tmp2); //Permutar las cadenas
strcpy(words[j],tmp1);
delete [ ] tmp1; //eliminar vectores temporales
delete [ ] tmp2;
}
}
}
}
void ImprimePalabras(char ** words, int Num)
{
for (int i=0;i<Num;i++){
cout << "\t" << words[i] << endl;
}
}
void Libera( char **words, int Num)
{
for (int i=0;i<Num;i++) delete [ ] words[i];
delete [ ] words;
}
Como se puede ver en el cdigo del programa, se aprovechan las ventajas
de las funciones para dar mudularidad al ejercicio, con lo cual se logra que la
funcin principal main() tenga poco cdigo, slo incluye las llamadas a las
funciones. Se han creado 4 funciones:
Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

1. Funcin char** ReservayPide(int num): Esta funcin reserva memoria para


almacenar las cadenas y pide al mismo tiempo los datos de cada palabra.
Devuelve el vector de cadenas.
2. Funcin Ordena(char **, int): Esta funcin se encarga de ordenar de forma
descendente las palabras que hay en el vector de cadenas. Para ello utiliza la
funcin strcmp(...). Notar que si hay que cambiar las palabras, se deben copiar las
cadenas primero, luego borrar el espacio que cada cadena ocupa (esto debido a
que la longitud de las cadenas pueden ser diferentes). Finalmente se reserva
nuevamente memoria para almacenar las cadenas cambiadas.
3. Funcin Imprime(char **, int): Se encarga de imprimir a la consola las cadenas
que hay en el vector.
4. Funcin Libera(char **, int): Su funcin es liberar la memoria utilizada.

3. Para reservar memoria dinmica para matrices se siguen los siguientes pasos:
a. Se crea un puntero a punteros del tipo de datos: float **datos;
b. Se reserva memoria para el array de filas: datos = new float*[fil];
c. Se hace un bucle para reservar memoria para col columnas de cada fila:
for (int i=0;i<fil;i++) datos[i] = new float[col];
d. Creada la matriz, se puede trabajar con ella con los ndices y los
corchetes [].
e. Finalmente, se debe hacer otro bucle para liberar la memoria de cada fila
y la asignada al vector de filas.
En el siguiente ejemplo se ve cmo asignar memoria a una matriz de filxcol:
// fichero matriz.cpp
// crear matrices usando memoria dinmica
#include <iostream>
#include <string.h> //para strlen
#include <stdlib.h> //para atoi()
using namespace std;
void main(void)
int fil = 8; //numero de filas
int col = 5; //numero de columnas
float **datos;
Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

datos = new float*[fil]; //vector filas


//reserva memoria para las columnas de cada fila
for (int i=0;i<fil;i++)
datos[i] = new float[col];
//ya puedes usar la matriz
for (int f=0;f<fil;f++)
for (int c=0;c<col;c++) datos[f][c] = (float)rand()/RAND_MAX;
//imprime los valores
for ( f=0;f<fil;f++)
{
for (int c=0;c<col;c++)
{
cout << f << "," << c << ":"<<datos[f][c]<< " ";
}
cout <<endl;
}
//liberar memoria
for (f=0;f<fil;f++) delete datos[f]; //libera filas
delete [ ] datos; //libera vector
}
4. En este ejercicio se va a crear un programa capaz de leer desde el teclado un
conjunto de frases, almacenarlas en un "vector de punteros a caracteres". Cada
letra (char) es "tratado como si fuera un nmero" (una casilla) y por lo tanto
almacenar una frase se asemeja a almacenar una fila de una matriz. Por lo tanto
se necesita un doble puntero (char **pfrases) para poder almacenar un conjunto
de frases o palabras. En esta "matriz de letras" el nmero de columnas puede
variar para cada fila (es strlen(frase)+1). Utilizando una nica llamada a la funcin
strcpy() es posible rellenar una fila completa de dicha matriz de caracteres. Para
utilizar dicha funcin es necesario incluir el fichero string.h.
// fichero frases.cpp
#include <iostream>
#include <string.h>
#include <stdio.h> //para gets()
using namespace std;
void main(void)
{
char frase[120];
char** pfrases;
Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

int NumFrases;
cout << "Cuantas frases desea almacenar:";
cin >> NumFrases;
pfrases = new char*[NumFrases]; //Espacio para NumFrases
//pedir datos
for (int i=0;i<NumFrases;i++)
{
cout << "Escriba la frase " << i+1 << ":" << flush;
gets(frase);
// +1 porque strlen no guarda para el '\0'
pfrases[i] = new char[strlen(frase)+1];
strcpy(pfrases[i], frase);
}
//sacar datos por consola
for (i=0;i<NumFrases;i++)
cout << "Frase " << i+1 << ":" << pfrases[i] << endl;
//liberar memoria
for (i=0;i<NumFrases;i++) delete pfrases[i];
delete [ ] pfrases;
}
2. Ejercicios Propuestos de Punteros
1. Se pide crear un programa que haciendo uso de la reserva dinmica de
memoria almacene un nmero determinado de valores (obtenidos de forma
aleatoria, entre 0 y 100) y los ordene de mayor a menor. El cdigo para obtener
los nmeros y para la reserva dinmica de memoria es dado, y el resto debe ser
implementado.
//fichero ordena.cpp
// ordena usando memoria dinamica
#include <iostream>
#include <stdlib.h> //para rand()
using namespace std;
void main(void)
{
int Num; //Numero de datos
int *datos; //puntero a int
cout << "Cuantos nmeros deseas generar:";
cin >> Num;
//asignacion de memoria
Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

datos = new int[Num];


if (datos == NULL) cout << "Error";
//Llenar el vector
for (int i=0;i<Num;i++)
{
datos[i] = rand() * 100 / RAND_MAX;
}
//ordena los datos -> Hacer aqu el algoritmo
...
...
//imprime los datos ordenados
for (i=0;i<Num;i++) cout << i << ":" << datos[i] <<endl;
//liberar memoria
delete [ ] datos;
}

2. Se pide crear un programa que pida una serie de nmeros al usuario y halle el
mximo, el mnimo y la media aritmtica de ellos. Para ello se debe crear una
variable puntero tipo float, pedir al usuario que introduzca el nmero de datos, y
despus los datos a calcular. Recordar que se debe reservar memoria de forma
dinmica para almacenar el vector de dato. La salida del programa debe ser algo
as:
Numero de datos: 10
Mximo: 25
Minimo: 4
Media Aritmtica: 14.6
3. Este ejercicio consiste en hacer un programa que cuente cuantas veces se
repiten las vocales (se deben contar las maysculas y las minsculas) en un texto
dado por el usuario. La estructura del programa debe ser la siguiente:
#include <iostream>
#include <string.h>
using namespace std;
char *PideTexto();
void ContarVocales(char *, int [ ]);
void Imprime(int [ ]);
Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

void main()
{
char *texto;
int Num[5];
texto = PideTexto();
ContarVocales(texto,Num);
Imprime(Num);
delete [ ] texto; //libera memoria
}
A continuacin se explican cada una de las funciones llamadas desde main:
1. La funcin PideTexto devuelve un puntero a la cadena que el usuario ha
escrito.
2. La funcin ContarVocales recibe el array que contiene el texto y otro array de
enteros, en el cual va a devolver cuantas veces se repite cada una de las vocales,
es decir, en Num[0] vendrn las veces que se repite la vocal a , en Num[1] la vocal
e y as sucesivamente.
3. La funcin Imprime recibe el array de enteros e imprime en la consola lo que ha
encontrado.

Algortmica y Programacin

Unidad 11. Punteros

Ing. Sullin Santaella

También podría gustarte