PROGRAMA NACIONAL DE FORMACIÓN EN INFORMATICA (PNFI)
ALGORITMICA Y PROGRAMACION
Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
UNIDAD CURRICULAR: ALGORITMICA Y PROGRAMACION E j er er c i c i o s P u n t e r o s
1. Ejercicios Resueltos de Punteros
1. Función C++ que reciba la dirección de inicio de una cadena de caracteres y devuelva el número de vocales que hay en la cadena. #include using namespace std; int cuenta_vocales(char *); int main() { char cadena[80]; cout << "Introduce cadena: "; cin.getline(cadena, 80); //en la llamada a la función se envía el array de caracteres cout << "Numero de vocales: " << cuenta_vocales(cadena) << endl; } int cuenta_vocales(char *s) //s contiene la dirección de inicio del array de caracteres { int cont=0; while(*s) //mientras no llegue al nulo { switch(toupper(*s)) //toupper pasa el carácter a mayúsculas para hacer la comprobación. { //el carácter original no se modifica. case 'A': case 'E': case 'I': case 'O': case 'U': cont++; } s++; } return cont; } Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
2. En este ejercicio se va a implementar un programa que permite al usuario introducir un número determinado de palabras y da como resultado la impresión de las palabras por consola ordenadas de forma descendente. Para ello se va a utilizar la función strcm p(char*, char*) de la librería estándar del C++ que permite comparar dos cadenas de caracteres. Dicha función está declarada en el fichero . Escribir el siguiente código: string.h #include #include using namespace std; void Ordena(char Ordena( char **, int int); ); void ImprimePalabras( char **, int int); ); char ** ** ReservayPide(int ReservayPide( int); ); void Libera( char **, int int); ); void main(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 ReservayPide( int num) { char tmp[120]; char **words; words = new char *[num]; *[num]; for (int i=0;i> tmp; words[i] = new char [ strlen(tmp)+1 ]; strcpy( words[i], tmp); } return words; //devuelve matriz } Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
void Ordena(char Ordena( char **words, int num) { for (int i=0;i
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
1. Función char** ReservayPide(int num ) : Esta función reserva memoria para almacenar las cadenas y pide al mismo tiempo los datos de cada palabra. Devuelve el vector de cadenas. 2. Función Ordena(char **, int) : Esta función se encarga de ordenar de forma descendente las palabras que hay en el vector de cadenas. Para ello utiliza la función 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. Función Imp rime(char **, int) : Se encarga de imprimir a la consola las cadenas que hay en el vector. 4. Función Libera(char **, int) : Su función es liberar la memoria utilizada.
3. Para reservar memoria dinámica para matrices se siguen los siguientes pasos: a. Se crea un puntero a punteros del tipo de datos: float **datos **datos ; b. Se reserva memoria para el array de filas: datos = new flo at*[fil]; at*[fil]; c. Se hace un bucle para reservar memoria para c o l columnas de cada fila: for (int i=0;i
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 cómo asignar memoria a una matriz de f i l x c o l : // fichero matriz.cpp // crear matrices usando memoria dinámica #include #include //para strlen #include //para atoi() using namespace std; void main(void main(void)) int fil = 8; //numero de filas int col = 5; //numero de columnas float **datos; Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
datos = new float*[fil]; float *[fil]; //vector filas //reserva memoria para las columnas de cada fila for (int i=0;i #include #include //para gets() using namespace std; void main(void main(void)) { char frase[120]; char ** ** pfrases; Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
int NumFrases; cout << "Cuantas frases desea almacenar:" ; cin >> NumFrases; pfrases = new char *[NumFrases]; *[NumFrases]; //Espacio para NumFrases //pedir datos for (int i=0;i
2. Ejercicios Propuestos de Punteros
1. Se pide crear un programa que haciendo uso de la reserva dinámica de memoria almacene un número determinado de valores (obtenidos de forma aleatoria, entre 0 y 100) y los ordene de mayor a menor. El código para obtener los números y para la reserva dinámica de memoria es dado, y el resto debe ser implementado. //fichero ordena.cpp // ordena usando memoria dinamica #include #include //para rand() using namespace std; void main(void main(void)) { int Num; //Numero de datos int *datos; //puntero a int cout << "Cuantos números deseas generar:" ; cin >> Num; //asignacion //asignac ion de memo memoria ria Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
datos = new int[Num]; int[Num]; if (datos == NULL) cout << "Error" "Error";; //Llenar el vector for (int i=0;i Hacer aquí el algoritmo ... ... //imprime los datos ordenados for (i=0;i
2. Se pide crear un programa que pida una serie de números al usuario y halle el máximo, el mínimo y la media aritmética de ellos. Para ello se debe crear una variable puntero tipo float , pedir al usuario que introduzca el número de datos, y después los datos a calcular. Recordar que se debe reservar memoria de forma dinámica para almacenar el vector de dato. La salida del programa debe ser algo así: Numero de datos: 10 Máximo: 25 Minimo: 4 Media Aritmética: 14.6 3. Este ejercicio consiste en hacer un programa que cuente cuantas veces se repiten las vocales (se deben contar las mayúsculas y las minúsculas) en un texto dado por el usuario. La estructura del programa debe ser la siguiente: #include #include using namespace std; char *PideTexto(); void ContarVocales(char ContarVocales( char *, int [ ]); void Imprime(int Imprime(int [ ]); Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella
void main() { char *texto; int Num[5]; texto = PideTexto(); ContarVocales(texto,Num); Imprime(Num); delete [ ] texto; //libera memoria } A continuación continuación se explican cada cada una de las funciones funciones llamadas desde main: 1. La función PideTexto devuelve un puntero a la cadena que el usuario ha escrito. 2. La función C o n t a r V o c a l e s 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] vendrán las veces que se repite la vocal a , en Num[1] la vocal e y así sucesivamente.
3. La función Imprime recibe el
array
de enteros e imprime en la consola lo que ha
encontrado.
Algorítmica y Programación
Unidad 11. Punteros
I ng. Sull Sull in Santaella Santaella