+ All Categories
Home > Documents > unidad11_codi

unidad11_codi

Date post: 10-Dec-2015
Category:
Upload: marlei-alipio-de-la-cruz
View: 1 times
Download: 0 times
Share this document with a friend
Description:
Programacion
Popular Tags:
19
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++) 1
Transcript

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