Date post: | 10-Dec-2015 |
Category: |
Documents |
Upload: | marlei-alipio-de-la-cruz |
View: | 1 times |
Download: | 0 times |
EJEMPLO 11.1.
#include <cstdlib>#include <iostream>using namespace std; int main(int argc, char *argv[]){ char *Cadena = " Montes de Toledo en Castilla la Mancha"; int * pEntero, lonCadena, Entero = 15, ; char *pCadena;
lonCadena = strlen(Cadena); pCadena=new char[lonCadena+1]; //Memoria con una posición fin cadena strcpy(pCadena, Cadena); //copia Cadena a nueva área de memoria pEntero = new int; //se reserva memoria para un entero *pEntero = Entero; // se alacena en contenido de pEntero 15 cout << " pCadena =" << pCadena << " longitud = "<< lonCadena<<endl; delete pCadena; // libera memoria de pCadena cout << " *pEntero = " << *pEntero << endl ; delete pEntero; // libera memoria de pEntero system("PAUSE"); return EXIT_SUCCESS;}
EJEMPLO 11.2
#include <cstdlib>#include <iostream>using namespace std; int main(int argc, char *argv[]){ int i, *v, n, *pEntero;
pEntero = new int(20); //reserva e incialización de memoria cout << " *pEntero incializado: " << *pEntero << endl; cout << " introduzca dimension de v : "; cin >> n; v = new int[n]; // reserva dinámica no se puede inicializar
for( i = 0; i < n; i++) v[i] = 10* (i+1); // rellenado del vector cout <<" vector :\n";
for( i = 0; i < n; i++) cout << " v["<< i <<"]="<< *v++;//salida de datos con puntero cout << endl; system("PAUSE"); return EXIT_SUCCESS;}Resultado de ejecución:
1
EJEMPLO 11.3
#include <cstdlib>#include <iostream>using namespace std; int main(int argc, char *argv[]){ int i, j, n; typedef int* col; // col es un sinónimo de puntero a entero int **m ; //m es puntero que apuntan a punteros a enteros
cout << " introduzca dimension de m : "; cin >> n; m = new col[n]; // reserva de memoria para n punteros enteros
for( i = 0; i < n; i++) { m[i] = new int[n]; // m[i] puntero a vector de n enteros
//m puntero a puntero de enteros for (j = 0; j < n; j++) m[i][j] = 10 * (i + 1) + j; } cout << "\n visualizacion matriz con indexacion: \n";
for( i = 0; i < n; i++) { for (j = 0; j < n; j++) cout << " "<< m[i][j]; // indexación tipo matriz cout << endl; } cout << "\n visualizacion matriz con punteros: \n" ;
for( i = 0; i < n; i++) { for (j = 0; j < n; j++) cout<<" "<< *(*(m+i)+j); // también válido con *(m[i]+j) cout << endl; } system("PAUSE"); return EXIT_SUCCESS; }
Resultado de ejecución:
2
EJEMPLO 11.4
#include <cstdlib>#include <iostream>using namespace std;typedef int* col;
void leermatriz (int** m, int n){ int i, j;
for( i = 0; i < n; i++) for (j = 0; j < n; j++) cin >> m[i][j] ; }
void escribirmatriz (int** m, int n){ int i, j;
for( i = 0; i < n; i++) { for (j = 0; j < n; j++) cout << " " << m[i][j] ; cout << endl; } } int main(int argc, char *argv[]){ int n; int **m; // válido con col *m; cout << " introduzca dimension de m : "; cin >> n; m = new col[n]; for (int i = 0; i < n; i++) m[i] = new int[n]; leermatriz(m,n); escribirmatriz(m,n); system("PAUSE"); return EXIT_SUCCESS;}
Resultado de ejecución:
3
EJEMPLO 11.5 int main(int argc, char *argv[]){ typedef char * columna; columna * textoentrada; int i, n = 10; char buffer[81]; textoentrada = new columna[n]; // reserva de memoria for (i = 0; i < n; i++) { cout << " Introduzca linea: "; cin.getline(buffer,80); textoentrada[i] = new char [strlen (buffer)+1]; //ajuste strcpy (textoentrada[i], buffer); } cout << "longitud linea\n"; for (i = 0; i < n; i++) // visualización con punteros cout << " " << strlen(*(textoentrada + i)) << " :" << *(textoentrada + i) << endl; system("PAUSE"); return EXIT_SUCCESS;}
EJEMPLO 11.6
#include <cstdlib>#include <iostream>using namespace std; int main(int argc, char *argv[]){ float *DatosI = new float[5]; int i; for (i = 0; i< 5; i++) DatosI[i] = 2*i+1;; cout << " los 5 primeros impares son \n" ;
for (i = 0; i < 5; i++) cout << " " << DatosI[i]; cout << endl; delete [] DatosI; // Libera memoria system("PAUSE"); return EXIT_SUCCESS;}EJEMPLO 11.7
#include <cstdlib>#include <iostream>using namespace std;struct Punto{ float CoordX;
4
float CoordY;};
Punto *Vector;void Leer_Punto( Punto &p){ cout << " coordenada x e y :"; cin >> p.CoordX >> p.CoordY;}
void Escribir_Punto( Punto p){ cout << " "<< p.CoordX <<" "<< p.CoordY << endl;}
void LeerVectorPuntos( Punto *Vector, int n){ for (int i = 0; i < n; i++) Leer_Punto(Vector[i]);}
void EscribirVectorPuntos( Punto *Vector, int n){ for (int i = 0; i < n; i++) Escribir_Punto(Vector[i]);}
int main(int argc, char *argv[]){ int n; cout << " ¿cuantos puntos? : "; do cin >> n; while (n <= 0); Vector = new Punto[n]; LeerVectorPuntos(Vector, n); EscribirVectorPuntos(Vector, n); system("PAUSE"); return EXIT_SUCCESS;}
EJERCICIO 11.1
La primera sentencia p1= new int; reserva memoria para el puntero p1. La segunda sentencia asigna a p2 el valor de p1, por lo que los dos punteros apuntan a la misma dirección de memoria y las dos sentencias de salida, mostrarán el contenido de la dirección de memoria que es 45, asignado por la sentencia *p1 = 45;. Cuando se ejecuta la siguiente sentencia *p2 = 54; Se cambia el contenido de la memoria apuntada por p1 y p2 al valor de 54, por lo que esa será la salida que muestren las dos sentencias siguientes. Si se ejecuta el programa completo se produce exactamente la siguiente salida:
EJERCICIO 11.2
5
Las dos primeras sentencia p1= new int; p2 = new int; reservan memoria para los punteros p1 y p2. Las dos sentencias siguientes asignan valores a lo contenidos de los dos punteros, por lo que la salida de la sentencia cout será los valores asignados que son 20 y 30. La sentencia *p1 = *p2; asigna al contenido del puntero p1 el contenido del puntero p2, por lo que la salida será 20 20 . La siguiente sentencia cambia el contenido del puntero p1 a 30, por lo que la nueva salida será 30 20. La ejecución del programa produce el siguiente resultado:
EJERCICIO 11.3
#include <cstdlib>#include <iostream>using namespace std;int main(int argc, char *argv[]){ int *entrada; for (int i = 0; ; i++) // bucle infinito { entrada = new int[5012]; if (entrada == NULL) { cout << " memoria agotada "; break; } cout<< " asignado " << i* 10 << "K bytes" << endl; } system("PAUSE"); return EXIT_SUCCESS }
EJERCICIO 11.4
#include <cstdlib>#include <iostream>using namespace std;int main(int argc, char *argv[]){ int *entrada; entrada = new int[10]; for (int i = 0; i < 10; i++) cin >> entrada[i]; system("PAUSE"); return EXIT_SUCCESS;}
EJERCICIO 11.5
boton * b; b = new boton;
EJERCICIO 11.6
6
boton * b;b = new boton;cin >> b->codigo;b->rotulo = new char [21]; // por ejemplo cadena de 20 caracterescin.getline(b->rotulo,20);
EJERCICIO 11.7
struct Punto3D {
char *Nombre; float CoordX; float CoordY; float CoordZ;
}; Punto3D *Vector3D; int n;
cout << "introduzca n :"; cin >> n;
if ((Vector3D = new Punto3D[n]) == NULL) { cout <<" Error de asignación de memoria dinámica \n"; exit(1); }
PROBLEMA 11.1
void Leer_Punto3D( Punto3D &p){ char entrada[20]; cout << " nombre figura: "; cin.getline(entrada,19); p.Nombre = new char[strlen(entrada)]; strcpy(p.Nombre, entrada); cout << " coordenada x e y z :"; cin >> p.CoordX >> p.CoordY >> p.CoordZ; cin.getline(entrada, 2); // limpiar buffer de entrada }
void Leer_Vector_Puntos3D (Punto3D *Vector3D, int n){ int i; for (i = 0; i < n; i++) Leer_Punto3D(Vector3D[i]); }
int main(int argc, char *argv[]){ Punto3D *Vector3D; int n; cout << "introduzca n :"; cin >> n; if ((Vector3D = new Punto3D[n]) == NULL) {
7
cout <<" Error de asignación de memoria dinámica \n"; exit(1); }
Leer_Vector_Puntos3D(Vector3D, n); .....
}
PROBLEMA 11.2
void Escribir_Punto3D( Punto3D p){ cout << " " << p.Nombre; cout << " "<< p.CoordX <<" "<< p.CoordY << " " << p.CoordZ<< endl;}
void Escribir_Vector_Puntos3D (Punto3D *Vector3D, int n, float z){ for (int i = 0; i < n; i++) if (Vector3D[i].CoordZ > z) Escribir_Punto3D(Vector3D[i]);}
PROBLEMA 11.3
float distancia_Origen( Punto3D p){ return sqrt(p.CoordX*p.CoordX+p.CoordY*p.CoordY+p.CoordZ* p.CoordZ);}
Punto3D* Mas_Cercano_Origen( Punto3D * V, int n){ float minimo, valor; //minimo es la distancia mínima de V[Imc] int i, Imc; // Imc es el índice del más cercano
Imc = 0; minimo = distancia_Origen(V[0]);
for (i = 1; i < n; i++) { valor = distancia_Origen(V[i]); if(valor < minimo) { minimo = valor; Imc = i; } } return &V[Imc];}
void Escribe_Mas_Cercan_Origen( Punto3D * V, int n){ Punto3D *p = Mas_Cercano_Origen(V,n); Escribir_Punto3D (*p);}
PROBLEMA 11.4
struct triangulo{
8
int IndicePuntos[3]; float perimetro, area;};
float distancia_puntos( Punto3D p1, Punto3D p2){ Punto3D pv;
pv.CoordX = p1.CoordX-p2.CoordX; pv.CoordY = p1.CoordY-p2.CoordY; pv.CoordZ = p1.CoordX-p2.CoordZ; return distancia_Origen(pv);}
void Calcula_perimetro_Area_Triangulo( Punto3D *V,triangulo &t){ float a, b, c, p;
a = distancia_puntos(V[t.IndicePuntos[0]], V[t.IndicePuntos[1]]); b = distancia_puntos(V[t.IndicePuntos[0]], V[t.IndicePuntos[2]]); a = distancia_puntos(V[t.IndicePuntos[1]], V[t.IndicePuntos[2]]); t.perimetro = a+b+c; p = t.perimetro/2; t.area = sqrt(p*(p-a)*(p-b)*(p-c)); }
PROBLEMA 11.5
bool correcto (int v1, int v2, int v3, int n) { bool sw;
sw=(0 <= v1 && v1 < n)&&(0 <= v2 && v2 < n)&&(0 <= v3 && v3 <n); sw = sw && (v1 != v2) && (v1 != v3) && (v2 = v3); return sw; }
void leer_triangulos( Punto3D *Puntos, triangulo *VT, int n, int m) { int v1,v2,v3, i;
for (i = 0; i < m; i++) { cout << " indice de tres puntos entre 0 y : " << n << endl; do cin >> v1 >>v2 >> v3; while (!correcto( v1,v2,v3,n));
VT[i].IndicePuntos[0]= v1; VT[i].IndicePuntos[1]= v2; VT[i].IndicePuntos[2]= v3; Calcula_perimetro_Area_Triangulo(Puntos, VT[i]); } }
PROBLEMA 11.6.
void Escribir_triangulo(Punto3D *Puntos, triangulo t){
9
int i;
for ( i = 0; i < 3; i++) Escribir_Punto3D( Puntos[t.IndicePuntos[i]]); cout <<" perímetro = "<< t.perimetro<< " area = "<< t.area <<endl; }
void Escribir_triangulos( Punto3D *Puntos, triangulo *VT, int m) { int i;
for ( i = 0; i < m; i++) Escribir_triangulo(Puntos,VT[i]); }
PROBLEMA 11.7
include <cstdlib>#include <iostream>using namespace std;#define N 4char *linea[N];
int main(int argc, char *argv[]){ int i; char temp[81];
for (i = 0; i < N; i++) {
cout << " Introduzca la siguiente línea:\n " ; cin.getline(temp,80); linea[i] = new char[strlen (temp)+1]; strcpy (linea[i], temp); }
for (i = 0; i < N; i++) cout << linea[i] << endl; system("PAUSE"); return EXIT_SUCCESS; }
PROBLEMA 11.8
int n1 = N;
i = 0;while (i < n1){ if (strlen (linea[i]) < 20) { free (linea[i]); // se libera memoria for (int j = i + 1; j < n1; j++) linea [j-1]= linea [j];// se copia texto eliminado línea n1--; // hay una línea menos en el texto linea[n1]= NULL; // se pone la línea a vacío } //observación: no se incrementa i porque se decrementa n1 else i++; // línea correcta, hay que avanzar en busca de otra
10
}
for (i = 0; i < n1; i++) // visualización del texto cout << linea[i] << endl;
PROBLEMA 11.9
void copiar( double * v, double * Copia, int n) { int i;
Copia = new double[n]; for ( i = 0; i < n; i++) { *Copia = *v; Copia++; v++; } }PROBLEMA 11.10
#include <cstdlib>#include <iostream>using namespace std;
void leer( float * &v, int &n) { float * p;
cout << " introduzca 0 < n <= 1000\n"; do cin >> n; while ((0 > n)|| (n>1000)); v = new float[n]; // asignación dinámica de memoria p = v; for ( int i = 0; i < n; i++) { cin >> (*p); p++; } }
bool repe (float *v, int i){ // decide si v[i] se encuentra en v[0],....v[i-1] int j; bool repetido = false; // no repetido al comenzar
for (j = 0; (j < i) && (!repetido); j++) repetido = (*(v+j)) == (*(v+i)); // decidir si se reptite. return repetido;}
void escribir( float * v, int n) { int i; float * p;
for (i = 0, p = v; i < n; i++)
11
{ if( !repe(v, i))
cout << " "<< (*p); p++; }} int main(int argc, char *argv[]){ float * v; int n;
leer(v,n); escribir(v,n); system("PAUSE"); return EXIT_SUCCESS;}
PROBLEMA 11.11
#include <cstdlib>#include <iostream>using namespace std;
void Leer_Texto ( char ** texto, int n){ int i; char buffer[81];
for (i = 0; i < n; i++) { cout << " Introduzca linea: " << i<< " "; cin.getline(buffer,80); texto[i] = new char [strlen (buffer)+1]; strcpy (texto[i], buffer); }}
void Transformar_Texto (char **texto, char ** texto1, int n){ int i, j, k, lon; char buffer [81];
for (i = 0; i < n; i++) { lon = strlen (*(texto+i)); strcpy (buffer, *(texto+i)); j = 0; // comienzo en posición 0 while (j < lon) // eliminación de los blancos if ( buffer[j] == ' ') { for (k = j; k < lon; k++) buffer [k] = buffer [k+1]; lon--; // disminuye la longitud de la cadena buffer[lon]='\0'; // se pone fin de cadena }
12
else j++; // avanza en la cadena sin eliminar nada texto1[i] = new char [strlen (buffer)+1]; strcpy (*(texto1 + i), buffer); }}
void Mostrar_Texto (char **texto, int n){ int i, j, lon;
for (i = 0; i < n; i++) { lon = strlen (*(texto+i)); for (j = 0; j < lon; j++) cout << *(*(texto + i ) + j); cout <<"\n"; } }
int main(int argc, char *argv[]){ typedef char * linea; linea * texto, *texto1; int n = 3;
texto = new linea[n]; texto1 = new linea[n]; Leer_Texto (texto, n); Transformar_Texto (texto, texto1, n); Mostrar_Texto (texto, n); cout << " texto sin blancos\n"; Mostrar_Texto (texto1, n); system("PAUSE"); return EXIT_SUCCESS;}
Resultado de ejecución
PROBLEMA 11.12
float suma ( float *p[], int n){ int i; float acu = 0;
for (i = 0 ; i < n; i++) acu += * ( * ( p + i) ); return acu;}
13
PROBLEMA 11.13
#include <cstdlib>#include <iostream>using namespace std;
typedef float* col; //col es un sinónimo de un puntero a float
void generamatriz( float ** &m, int n){ m = new col[n]; for (int i = 0; i < n; i++) m[i] = new float[n];}
int main(int argc, char *argv[]){ int n; float **m; ..... generamatriz(m,n);
.....}PROBLEMA 11.14
#include <cstdlib>#include <iostream>
#define randomize ( srand (time(NULL) ))#define random(num) ( rand()%(num))typedef float* col;
void generamatriz( float ** &m, int n);
void matrizsimetrica( float ** m, int n){ randomize; for( int i = 0; i < n; i++) for (int j = i; j < n; j++) *(*(m+i)+j) = *(*(m+j)+i) = random(10);}
int main(int argc, char *argv[]){ int n; float **m; ..... generamatriz(m,n); matrizsimetrica(m,n);
.....}
PROBLEMA 11.15
void el_mas_repe( float **m , int n, float &masrepe, int &nmasrepe){ float actual; int i,j,k,l, nactual;
nmasrepe =-3;
14
for ( i = 0; i< n; i++) for ( j = 0; j < n; j++) {
actual = *(*(m + i) + j); nactual = 0;
for ( k = 0; k < n; k++) for ( l = 0; l < n; l++) if (actual == *(*(m + k) + j); nactual++; if (nactual>nmasrepe) { nmasrepe = nactual; masrepe = actual; } }}
bool mayoritaria( float **m, int n) { float valor; int nveces;
el_mas_repe(m,n,valor,nveces); return (nveces > n*n);} PROBLEMA 11.16
#include <cstdlib>#include <iostream>#include <math.h>using namespace std;typedef int* col;
void GeneraMatriz( int ** &m, int F, int C){ m = new col[F]; for (int i = 0; i < F; i++) m[i] = new int[C];}
float Valormedio( int ** m, int i, int j, int F, int C){ float aux = 0; int k,l, c = 0;
for (k = i -1; k <= i+1; k++) // cadidatos de filas a vecinos for(l = j - 1; l <= j + 1; l++)//candidatos de columnas a vecinos if (l >=0 && l < F && k >=0 && k < C) { aux += *(*(m + k) + l); //m[k][l] c++; // cuenta los vecinos que tiene } aux -= m[i][j]; // se ha sumado, y hay que quitarlo c--; // el contador también se decrementa return aux/c;} void LeerMatriz (int **m, int F, int C){ int i, j;
15
for (i = 0; i < F; i++) for (j = 0; j < C; j++) { cout << "elemento m[" << i << "][" << j << "]= "; cin >> *(*(m + i) + j); // m[i][j] }}
void EncontrarRuido ( int **m, int F, int C, int ** ruido){ int i, j; for (i = 0; i < F; i++) for (j = 0; j < C; j++) if ( fabs( *(*(m + i) + j) -Valormedio(m,i,j,F,C)) > 2) *(*(ruido + i) + j) = 1; // ruido[i][j] else *(*(ruido + i) + j) = 0;// ruido[i][j] }
void EscribeMatriz (int **m, int F, int C){ int i, j;
for (i = 0; i < F; i++) { for (j = 0; j < C; j++) cout << " "<<*(*(m + i) + j); // m[i][j] cout << endl; }} int main(int argc, char *argv[]){ col *m, *ruido; int F = 3; int C = 3;
GeneraMatriz(m, F, C); LeerMatriz (m, F, C); GeneraMatriz(ruido,F,C); EncontrarRuido (m, F, C, ruido); EscribeMatriz (m, F, C); EscribeMatriz (ruido, F, C); system("PAUSE"); return EXIT_SUCCESS;}
16