Anda di halaman 1dari 23

EJEMPLO 10.

#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
int Variable= 75; // Declaración de variable
int& Referencia = Variable; //Referencia e inicialización

cout << " Contenido de Variable = " << Variable << endl;
cout << " Direccio &Variable = " << &Variable << endl;
cout << " Contenido de Referencia = " << Referencia << endl;
cout << " Direccio &Referencia = " << &Referencia << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Resultado de ejecución:

EJEMPLO 10.2
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
int var; // define una variable entera var
int *pun; //define un puntero a un entero pun

pun = &var; //asigna la dirección de var a pun


*pun = 60; // asigna al contenido de p 60
cout << " &var. Direccion de var = " << &var << endl;
cout << " pun. Contenido de pun es la misma direccion de var ";
cout << pun << endl;
cout <<" var. Contenido de var = " << var << endl;
cout << " *pun. El contenido de *pun es el mismo que el de var: ";
cout << *pun << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Resultado de ejecución:

EJEMPLO 10.3

#include <cstdlib>

1
#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
char *punteroc; // un puntero a una variable carácter
char caracter;

punteroc = &caracter;
cout << " ASCII caracter" << endl ;
for (caracter = 'A'; caracter <= 'F'; caracter++)
cout << " "<< (int) caracter << " " << *punteroc << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Resultado de ejecución:

EJEMPLO 10.4

int x, *px = &x, &rx = x;


char* c = "Cadena larga";
float *z = NULL;
void *r = px, *s = c, *t = z;

EJEMPLO 10.5.

#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
float V[6];
for (int j = 0; j < 6; j++)
*(V+j) = (j + 1) * 10 + 1;
cout << " Direccion Contenido" << endl;
for (int j= 0; j < 6; j++)
{
cout << " V+" << j << " = " << V+ j ;
cout << " V[" << j<<"] = "<< *(V+j)<< "\n" ;
}
system("PAUSE");
return EXIT_SUCCESS;
}

Resultado de ejecución:

2
EJEMPLO 10.6

#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
float V[6], *P[6];

for (int j = 0; j < 6; j++)


{
*(V+j) = (5-j) * 10 + 1;
*(P+j) = V+j; // inicialización de array de punteros
}
cout << " Direccion Contenido" << endl;
for (int j = 0; j < 6; j++)
{
cout << " V+"<< j << " = "<< *(P+j) << " = *(P+" <<j<< ")";
cout << " V[" << j<<"] = "<< **(P+j)<< "\n" ;
}
system("PAUSE");
return EXIT_SUCCESS;
}

Resultado de ejecución:

EJEMPLO 10.7

#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
char *puntero;
char Cadena[81];

cout << "Introduzca cadena a convertir:\n\n";


cin.getline(Cadena, 80);
puntero = Cadena; // puntero apunta al primer carácter de la cadena

while (*puntero) // mientras puntero no apunte a \0


if ((*puntero >= 'A') && (*puntero <= 'Z'))

3
*puntero++ = *puntero+32; // sumar 32, para convertir en minúscula
else if ((*puntero >= 'a') && (*puntero <= 'z'))
*puntero++ = *puntero-32; // restar 32, para convertir en mayúscula
else
puntero++;

cout << "La cadena convertida es:\n" << endl;


cout << Cadena << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

resultado de una ejecución:

EJEMPLO 10.8.

int x, y;
const int z = 25; // constante entera
const int t = 50; // constante entera
int *const puntero1 = &x; //puntero1 es un puntero constante
const int *puntero2 = &z; // punero2 es un puntero a constante
*puntero1 = y; // sentencia válida puede cambiarse su contenido
p1 = &y; //sentencia ilegal no puede cambiarse el puntero
puntero2 = &t; // sentencia válida puede cambiarse puntero2
*puntero2 = 15; // sentencia ilegal no puede cambiarse su contenido

EJEMPLO 10.9

Puntero a puntero fila Puntero a fila ARRAY BIDIMENSIONAL float A[6][3]


A  A[0]  A[0][0] A[0][1] A[0][2]
A+1  A[1]  A[1][0] A[1][1] A[1][2]
A+2  A[2]  A[2][0] A[2][1] A[2][2]
A+3  A[3]  A[3][0] A[3][1] A[3][2]
A +4  A[5]  A[4][0] A[4][1] A[4][2]

A es un puntero que apunta a un array de 5 punteros A[0], A[1], A[2], A[3], A[4].
A[0] es un puntero que apunta a un array de tres elementos A[0][0], A[0][1], A[0][2].
A[1] es un puntero que apunta a un array de tres elementos A[1][0], A[1][1], A[1][2].
A[2] es un puntero que apunta a un array de tres elementos A[2][0], A[2][1], A[2][2].
A[3] es un puntero que apunta a un array de tres elementos A[3][0], A[3][1], A[3][2].
A[4] es un puntero que apunta a un array de tres elementos A[4][0], A[4][1], A[4][2].

A[i][j] es equivalente a las siguientes expresiones:

 *(A[i]+j) el contenido del puntero a la fila i más el número de columna.


 *((*(A+i))+j) . Si se cambia A[i] por *(A+i) se tiene la siguiente expresión anterior.
 *(&A[0][0]+ 3*i+j).

EJEMPLO 10.10

4
A es una matriz de reales y V es un vector de punteros a reales, por lo que las declaraciones son
esencialmente diferentes.

En cuanto a la primea asignación A = V , ambas variables A y V son punteros que


apuntan a punteros a reales (aunque ligeramente diferente) por lo que en principio podría
ejecutarse la asignación, pero debido a que ambas variables son punteros constantes (al ser
nombres de variables de arrays), no puede realizarse, ya que no puede modificarse su contenido.

En la segunda asignación V[1] = A[1], el compilador interpreta la expresión A[1] como


conteniendo la dirección de la segunda fila de la matriz, que es un puntero a un vector de 10
reales, por lo que es un puntero a reales. Por otro lado para el compilador V[1], es un puntero a
reales y por lo tanto su valor es del mismo tipo que A[1]. Todo lo anteriormente indicado permite
realizar la asignación indicada.

La expresión de la derecha &mt[2][0], de la tercera asignación V[2] = &mt[2][0],


proporciona la dirección del primer elemento de la tercera fila de la matiz, por consiguiente es
también de tipo puntero a real al igual que el lado izquierdo de la asignación V[2], por lo que la
asignación es correcta.

EJEMPLO 10.11

include <cstdlib>
#include <iostream>
using namespace std;
#define N 5
#define M 4
double A[N][M];

int main(int argc, char *argv[])


{
int i,j;
cout <<" direciones de todos lo elementos de la matriz\n\n";
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
cout << " &A[" << I << "][" << j<< "]=" << &A[i][j];
cout << "\n";
}
cout <<" direciones de comienzo de las filas de la matriz\n\n";
for (i = 0; i < N; i++)
cout << " A["<<i<<"] = "<< A[i]
<< " contiene direccion de &A["<<i<<"]["<<0<<"]" <<endl ;
system("PAUSE");
return EXIT_SUCCESS;
}
Resultado de ejecución:

5
EJEMPLO 10.12

#include <cstdlib>
#include <iostream>
#define F 3
#define C 2
using namespace std;

int A[F][C];

void escribir_matriz(int ** A, int f, int c)


{
int i, j;

for (i = 0; i< f; i++)


{
for(j = 0; j < c; j++)
cout << " " << *(*A + c*i+j);
cout << endl;
}
}

void leer_matriz(int** A, int f, int c)


{
int i, j;

for (i = 0; i < f; i++)


for(j = 0; j < c; j++)
cin >> *(*A + c*i+j);
}

int main(int argc, char *argv[])


{
int * a = &A[0][0];
leer_matriz(&a,F,C);
escribir_matriz(&a,F,C);
system("PAUSE");
return EXIT_SUCCESS;
}

Resultados de ejecución del programa anterior:

EJEMPLO 10.13

#include <cstdlib>
#include <iostream>
using namespace std;

struct datos
{
float mayor, menor;
};

6
void leer_registrodatosCmasmas(datos &t) // parámetro por referecia en C++
{
float actual;
cin >> actual;
if (actual > t.mayor)
t.mayor = actual;
else if (actual < t.menor)
t.menor = actual;
}
void leer_registrodatosC(datos *t) // parámetro dirección C, referencia
{
float dat;
cin >> dat;
if (dat > t -> mayor)
t -> mayor = dat;
else if (dat < t -> menor)
t -> menor = dat;
}

int main(int argc, char *argv[])


{ datos dat;
.....
leer_registrodatosCmasmas(dat); // llamada por referemncia en C++
leer_registrodatosC(&dat); // llamada por dirección en C
system("PAUSE");
return EXIT_SUCCESS;
}

EJEMPLO 10.14

#include <cstdlib>
#include <iostream>
#include <math.h>
#define maxf 3
#define minx 0.3
#define maxx 4.1
#define incremento 0.5
using namespace std;

float f1 (float x)
{
return (3 * sin(x)+ 2.5*cos(x));
}

float f2(float x)
{
return (-x * sin (x) + x*x);
}

float f3(float x)
{
return ( x *x - x + 1);
}

int main(int argc, char *argv[])


{
float (*Array_de_Funciones[maxf]) (float);
// array de punteros a funciones que retornan reales

Array_de_Funciones [0] = f1;

7
Array_de_Funciones [1] = f2;
Array_de_Funciones [2] = f3;

for (int i = 0; i < maxf; i++)


{
cout << " funcion " << i +1 << endl;
for ( float x = minx; x < maxx; x += incremento)
cout<<" x = "<<x<<" f = "<<Array_de_Funciones [i](x)<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}

resultado de ejecución:

EJEMPLO 10.15 .

include <cstdlib>
#include <iostream>
using namespace std;

double Sumaterminos(int n, double (*fun) (int ))


{
double acu = 0;

for (int i = 1; i <= n; i++)


acu += fun(i);
return acu;
}

double terminoserie1(int i)
{
return (double)3.0/(i*i);
}

double terminoserie2(int i)

8
{
return (double)1.0/i;
}

int main(int argc, char *argv[])


{
cout << "Suma de cinco elemento de serie1: "
<< Sumaterminos(5, terminoserie1) << endl;
cout << "Suma de cuatro terminos de serie2: "
<< Sumaterminos(3, terminoserie2) << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

resultado de ejecución:

EJEMPLO 10.16

struct fechas
{
int dia, mes, anyo;
float dat;
};

struct datos
{
char* nombre;
fechas * fec;
} est;

La variable est es una variable de tipo estructura, por lo que hay que usa el operador punto
para acceder al miembro fec. Desde el dato miembro fec es necesario usar el operador flecha
-> para acceder al campo dat, día, mes y anyo, al ser un puntero a la estructura fechas a
la que apunta.

est.fec->dat;
est.fec->dia;
est.fec->mes;
est.fec->anyo;

EJEMPLO 10.17.

#include <cstdlib>
#include <iostream>
using namespace std;

struct articulo
{
char nombre[81];
int codigo;
};

void leerarticulo( articulo * particulo)


{

9
cout << "nombre del articulo :";
cin.getline(particulo->nombre, 80);
cout << "Codigo del artículo :";
cin>> particulo->codigo;
}

void mostrararticulo ( articulo articul)


{
cout << "nombre del articulo :" << articul.nombre << endl;
cout << "Codigo asociado al articulo : " << articul.codigo << endl;
}

int main(int argc, char *argv[])


{
articulo a;
leerarticulo(&a);
mostrararticulo(a);
system("PAUSE");
return EXIT_SUCCESS;
}

Resultado de ejecución:

EJERCICIO 10.1

Es incorrecta sintácticamente la declaración int &y, ya que es una referencia y debe ser
inicializada a una variable(Una referencia es un alias de otra variable). No tiene ningún sentido
en C++, debería ser int &y = x por ejemplo. Un carácter que está entre comillas simples es
considerado como una constante de tipo char no como una cadena, para lo cual debería estar
rodeado de dobles comillas: char* c= "C". La declaración void* r = &x; es correcta.

EJERCICIO 10.2

Por medio de un puntero a constante se puede acceder a la constante apuntada, pero no está
permitido cambiar o modificar su valor por medio del puntero. Un puntero declarado como
constante no puede modificar el valor del puntero, es decir la dirección que contiene y a la que
apunta, pero puede modificarse el contenido almacenado en la posición de memoria a la que
apunta.

EJERCICIO 10.3

El tipo del puntero que se utilice para recorrer un array unidimensional tiene que ser del mismo
tipo que el de los elementos que compongan el array, puesto que va a ir apuntando a cada uno de
ellos según los recorra. El acceso y recorrido puede realizarse de la siguiente forma:
int *p, v[5];
p = v;
for (int i = 0; i < 5; i++, p++) // p apunta a v[i]

int v[10][5]; son expresiones equivalentes:

v[i][j];
*(v[i] +j ); // puntero de filas
*((*(v + i)) + j) //puntero de columnas

10
(&v[0][0] + Numero_de_columnas * i + j)

EJERCICIO 10.4

#include <cstdlib>
#include <iostream>
using namespace std;
#define N 2
#define M 3
double mt[N][M];

int main(int argc, char *argv[])


{
int f, c;

for (f = 0; f < N; f++)


for (c = 0; c < M; c++)
cin >> mt[f][c];

cout << " mt[f][c]\n";


for (f = 0; f < N; f++)
{
for (c = 0; c < M; c++)
cout << mt[f][c] << " ";
cout << endl;
}

cout << " * ( ( * (mt + f) ) + c)\n";


for (f = 0; f < N; f++)
{
for (c = 0; c < M; c++)
cout << (* ( ( * (mt + f) ) + c)) << " ";
cout << endl;
}

cout << " * (mt[f]+c)\n";


for (f = 0; f< N; f++)
{
for (c = 0; c < M; c++)
cout << ( * (mt[f] + c)) << " ";
cout << endl;
}

cout << " * (&mt[0][0] + M * f + c)\n";


for (f = 0; f< N; f++)
{
for (c = 0; c < M; c++)
cout << (* (&mt[0][0] + M * f + c)) << " ";
cout << endl;
}
system("PAUSE");
return EXIT_SUCCESS;

Resultados de ejecución del programa anterior:

11
EJERCICIO 10.5

double *minimo_de_Array (double *A, int n)


{
int i;
double minimo = A[0];
double *dirminimo = & A[0];

for (i = 0; i < n; i++)


if (A[i] < minimo)
{
dirminimo = &A[i];
minimo = A[i];
}
return dirminimo;
}

EJERCICIO 10.6

double* gorta(double* v, int m, double k)


{
int j;

for (j = 0; j < m ; j++)


if (*v == k)
return v;
else
v++;
return 0; // si no se encuentra retorna el valor de 0
}
 La primera llamada r = gorta(W,10,12.3); es correcta ya que a un puntero void se le
puede asignar cualquier otro tipo de punteros, y el valor de m es 12 que es menor o igual que
15 que es el tamaño declarado del array.
 La segunda llamada cout << (*gorta(W,15,10.5) es sintácticamente correcta. La tercera
llamada z = gorta(W,15,12.3) es incorrecta ya que a una variable de tipo double no
puede asignársele un puntero a un tipo double.

PROBLEMA 10.1

#include <cstdlib>
#include <iostream>
using namespace std;

struct Persona
{
char NombrePersona[31];

12
int edad, altura, peso;
};

void Mostrar_Persona(Persona *p);


void Leer_Persona(Persona *p);

int main(int argc, char *argv[])


{
Persona Array_de_Personas[] = { {"García Ángel", 48, 175, 85},
{"Jiménez alfonso", 39, 185, 90} };
Persona *p; // puntero a estructura
p = Array_de_Personas;
for (int i = 0; i < 2; i++, p++);
Mostrar_Persona(p);
system("PAUSE");
return EXIT_SUCCESS;

void Mostrar_Persona(Persona *p)


{
cout << " NombrePersona: " << p -> NombrePersona
<< " Edad: " << p -> edad
<< " Altura: " << p -> altura
<< " Peso: " << p -> peso << "\n";
}
void Leer_Persona(Persona *p)
{
cout<<" NombrePersona: " ;cin.getline( p -> NombrePersona,30);
cout << " Edad: " ; cin >> p -> edad;
cout << " Altura: " ; cin >> p -> altura;
cout << " Peso: " ; cin >> p -> peso;
}

PROBLEMA 10.2

#include <cstdlib>
#include <iostream>
#define F 10
#define C 10
#define max 100
#define randomize ( srand (time(NULL) ))
#define random(num) ( rand()%(num))
float A[F][C];

using namespace std;

void escribir_matriz(float ** m, int f, int c);

void crearMatriz ( float ** m, int f, int c)


{
int i,j;

randomize;
for (i = 0; I < f; i++)
for (j = 0; j < c; j++)
*(*m + i*C +j) = random (max) + 1;
}

bool simetrica (float **mat, int f, int c)


{

13
int i,j;

bool sime = true;


for (i = 0; i < f && sime; i++)
for (j = 0; j < c && sime ; j++)
if ( i!= j)
if ( *(*mat + C *i + j) != *(*mat + C *j +i))
sime = false;
return sime;
}

int main(int argc, char *argv[])


{
float * a = &A[0][0], *v = &V[0];

crearMatriz(&a, F, C);
escribir_matriz(&a, F, C);
if(simetrica(&a,F,C))
cout << " es simetrica \n";
else
cout << " no es simetrica \n";
system("PAUSE");
return EXIT_SUCCESS;
}

PROBLEMA 10.3

#include <cstdlib>
#include <iostream>
#define F 4
#define C 5
#define max 100
float A[F][C];
float V[C];
using namespace std;

void escribir_matriz(float ** m, int f, int c);


void crearMatriz ( float ** m, int f, int c)
void multiplicacolumna (float **m, int f, int c, int ncol, float *vp)
{
for (int i = 0; i < f; i++)
*vp++ = (*(*m + i*C)) * (*(*m + i*C + ncol));
//vp[i] = m[i][0] * m[i][ncol];
}

void muestravector( float *v, int f)


{
for (int i = 0; i < f; i++)
cout << " " << *v++;
}

void muestra_suma(float *v, int f)


{
float suma = 0;

for (int i = 0; i < f; i++)


suma += *v++;
cout << suma;
}

int main(int argc, char *argv[])

14
{
float * a = &A[0][0], *v = &V[0];

crearMatriz(&a, F, C);
escribir_matriz(&a, F, C);
multiplicacolumna(&a,F,C,2,v);
muestravector(v,C);
muestra_suma(v,C);
system("PAUSE");
return EXIT_SUCCESS;
}

PROBLEMA 10.4

#define F 3
#define C 3

void Intercambiafilas (float **m, int f, int c, int nf1, int nf2)
{
int j;
float aux;

for (j = 0; j< c; j++)


{
aux = *(*m + nf1*C + j);
*(*m + nf1*C + j)= *(*m + nf2*C + j);
*(*m + nf2*C + j)= aux;
}
}

void Sumafilas (float **m, int f, int c, int nf1, int nf2)
{
int j;
for (j = 0; j< c; j++)
*(*m + nf1*C + j)+= *(*m + nf2*C + j);
}

void Sumacombinacion(float **m, int f, int c, int nf1, float * vf)


{
int i, j;
float aux;

for (j = 0; j< c; j++)


{
aux = 0;
for (i = 0; i < f; i++)
aux += *(*m + i*C + j)* (*vf);
*(*m + nf1*C + j) = aux;
vf++; // Avance en el vector de la combinación
}
}

PROBLEMA 10.5

void multiplicanumero(float **m, int f, int c, float numero)


{
int i, j;

for (j = 0; j< c; j++)


for (i = 0; i < f; i++)

15
*(*m + i*C + j) *= numero;
}

void matrizcero(float **m, int f, int c)


{
int i, j;

for (i = 0; i < f; i++)


for (j = 0; j< c; j++)
*(*m + i*C + j) = 0;
}

PROBLEMA 10.6

#include <cstdlib>
#include <iostream>
#define treinta 30
using namespace std;

int main(int argc, char *argv[])


{
typedef char* linea;
linea *entrada;
char * cad;
int i, j, nvoc, totalnvoc = 0;

entrada = new linea [20];


cad = new char[81];
for (i = 0; i < treinta; i++)
{
cin.getline(cad,80);
entrada[i] = new char[strlen(cad)+1];
strcpy(entrada[i],cad);
// se calculan las vocales que contiene la línea
nvoc = 0;

for (j =0 ; j<strlen(entrada[i]); j++)


{
switch (*(entrada[i]+j))
{
case 'a': case 'A':
case 'e': case 'E':
case 'i': case 'I':
case 'o': case 'O':
case 'u': case 'U': nvoc++;
}
} // bucle for interno

cout << " vocales de la linea: " << nvoc << endl;
totalnvoc += nvoc; // se incrementa el numero total de vocales
} //bucle for externo

cout << " entrada leida\n";

for (i = 0; i < 3; i++)


cout << entrada[i] << endl;
cout << " total de vocales: " << totalnvoc<< endl;
system("PAUSE");
return EXIT_SUCCESS;
}

16
PROBLEMA 10.7

#include <cstdlib>
#include <iostream>
#define max 2
using namespace std;

struct tiempos
{
int min, seg;
};

struct regnadador
{
char *nombre, *prueba;
int edad;
tiempos tiempo;
};

void leerregnadador (regnadador* &reg)


{
char entrada[41];
reg = new regnadador;

cout << " Introduzca el nombre : ";


cin >> entrada;
reg->nombre = new char [strlen(entrada)+1];
strcpy (reg->nombre, entrada);
cout << " Introduzca la edad : ";
cin >> reg->edad;
cout << " Introduzca la prueba en la que participa : ";
cin >> entrada;
reg->prueba = new char [strlen(entrada)+1];
strcpy (reg->prueba, entrada);
cout << " Introduzca el tiempo de la prueba.Minutos y segundos: ";
cin >> reg->tiempo.min >> reg->tiempo.seg;
}

void leerVectorNadadores (regnadador *VectorNadadores[])


{
int i;

for (i = 0; i < max; i++)


leerregnadador(VectorNadadores[i]);
}

void escribirregnadador (regnadador* reg)


{
cout << " nombre : " << reg->nombre << endl ;
cout << " edad : " << reg->edad << endl;
cout << " prueba en la que participa : " << reg->prueba << endl;
cout << " tiempo de la prueba. Minutos y segundos : ";
cout << reg->tiempo.min << " " << reg->tiempo.seg << endl;
}

void EscribirVectorNadadores (regnadador *VectorNadadores[])


{
int i;

for (i = 0; i < max; i++)


escribirregnadador(VectorNadadores[i]);

17
}

float MediaVector( regnadador *VectorNadadores[])


{
float aux= 0;

for(int i = 0; i < max; i++)


aux += VectorNadadores[i]->tiempo.min*60 +
VectorNadadores[i]->tiempo.seg;
return aux / max;
}

float DesviacionMedia (regnadador *VectorNadadores[])


{
float tiemposeg, aux = 0, media = MediaVector(VectorNadadores);

for( int i = 0; i < max; i++)


{
tiemposeg = VectorNadadores[i]->tiempo.min*60 +
VectorNadadores[i]->tiempo.seg;
aux += fabs(tiemposeg- media);
}
return aux / max;
}

int main(int argc, char *argv[])


{
regnadador *VectorNadadores[16];

leerVectorNadadores (VectorNadadores);
EscribirVectorNadadores(VectorNadadores);
cout << DesviacionTipica (VectorNadadores);

system("PAUSE");
return EXIT_SUCCESS;
}

PROBLEMA 10.8

#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;

float TriRect( )
{
float c1, c2;

cout <<" Introduzca las longitudes de catetos del triangulo:\n";


cin >> c1 >> c2;
return c1 * c2 / 2;
}

float TriIsoc( )
{
float l1,l2;

cout<<" Introduzca longitudes de lados desiguales triangulo:\n";


cin >> l1 >> l2;
return l1 * sqrt(l2*l2 -(l1/2)*(l1/2))/2;
}

18
float Cuad( )
{
float l;

cout << " Introduzca la longitud de lado del cuadrado:\n";


cin >> l;
return l * l;
}

float Circ()
{
float r, pi = 3.14159;
cout << " Introduzca el radio del circulo:\n";
cin >> r;
return r * r * pi;
}

int main(int argc, char *argv[])


{
int i;

float (*areafigura[])( ) = {TriRect, TriIsoc, Cuad, Circ};


do
{
cout << " Elija el tipo de figura : \n";
cout << " 1. Triangulo Rectangulo.\n";
cout << " 2. Triangulo Isosceles. \n";
cout << " 3. Cuadrado. \n";
cout << " 4. Circulo. \n";
cout << " 5. Fin \n";
do
cin >> i;
while (i < 1 ||i > 5);
if (i < 5)
cout << "El area de la figura es: " << areafigura[i-1]( )<< endl;
} while( i!=5);
system("PAUSE");
return EXIT_SUCCESS;
}

PROBLEMA 10.9

#include <cstdlib>
#include <iostream>
#define max 20
using namespace std;

struct registro
{
char *nombre;
char *direccion;
char fecha [10];
char sexo; /* V o H */
char diavisita [10];
char *problema;
};

void leer_registro( registro & reg)


{
char linea[81], ch;

19
cout << "Nombre del paciente : ";
cin.getline(linea,80);
reg.nombre = new char [strlen (linea) +1];
strcpy (reg.nombre, linea);
cout << "Direccion del paciente : ";
cin.getline(linea,80);
reg.direccion = new char [strlen (linea) +1];
strcpy (reg.direccion, linea);
cout << "Fecha de nacimiento (dd/mm/aa): ";
cin.getline(reg.fecha,9);
cout << "Dia de visita (dd/mm/aa) : ";
cin.getline(reg.diavisita,9);
cout << "Sexo del paciente : V/H ";
cin.get(reg.sexo);cin.get(ch); // segundo cin para saltar intro
cout << "Problema médico del paciente : ";
cin.getline(linea,80);
reg.problema = new char [strlen (linea) +1];
strcpy (reg.problema, linea);
}

void leervector(registro *vector)


{
int i;
char ch;

cout << " Entrada de datos de los pacientes\n";


for (i = 0; i < max; i++)
{
leer_registro(vector[i]);
cout << "¿Desea continuar? (S/N) \n";
cin.get(ch);
ch = toupper(ch); ///convierte a maayúscula
if (ch != 'S') return;
cin.get(ch); // cin para saltar intro
}
}

void mostrarlasconsultas (char * dia, registro *vector)


{
int i;

cout << " Pacientes con visita el dia:" << dia << endl;
cout << " ========================================\n";
for (i = 0; i < max; i++)
if ( !strcmp (dia, vector[i].diavisita))
cout << vector[i].nombre;
}

int main(int argc, char *argv[])


{
char fecha[10];
registro vector[max];

leervector(vector);
cout << " Introduzca la fecha de la consulta: (dd/mm/aa) ";
cin.getline(fecha,9);
mostrarlasconsultas (fecha, vector);
system("PAUSE");
return EXIT_SUCCESS;
}

20
PROBLEMA 10.10

#include <cstdlib>
#include <iostream>
using namespace std;

float Cadena_A_Numero (char * CadenaReal)


{
char *PunteroCad;
int potencia = 1, SignoNumero;
float NumeroReal = 0;

// saltar espacios en blanco iniciales


for (PunteroCad = CadenaReal; *PunteroCad == ' '; PunteroCad++);
switch (*PunteroCad) //decidir el Signo del número
{
case '-': SignoNumero = -1; PunteroCad++; break;
case '+': PunteroCad++;
default : SignoNumero = +1;
}
// Cálculo de la parte entera del número
NumeroReal = *PunteroCad - '0'; // convierte el dígito en decimal

// mientras el siguiente caracter sea un digito


while (*++PunteroCad >='0' && *PunteroCad <= '9')
NumeroReal = NumeroReal * 10 + *PunteroCad - '0';
//añadir a parte entera la decimal del número
if ( *PunteroCad++ != '.' )
return (SignoNumero * NumeroReal); // sólo parte entera
else // tratamiento de parte decimal
{
while ((*PunteroCad >='0') && (*PunteroCad <= '9'))
{
potencia *= 10;
NumeroReal += (float)(*PunteroCad++ - '0') / potencia;
}
return (SignoNumero * NumeroReal);
}
}

int main(int argc, char *argv[])


{
char cadena[40];

cout << " conversion de cadenas de real a float\n";


do
{ cout << " Introduzca real : ";
cin.getline(cadena,40);
if (strlen(cadena)>0)
cout << " Convertido a numero real--> ";
cout << Cadena_A_Numero(cadena) << endl;
}
while (strlen(cadena)>0);
system("PAUSE");
return EXIT_SUCCESS;
}
Resultado de ejecución:

21
PROBLEMA 10.11

#include <cstdlib>
#include <iostream>
#define maxoperadores 5
using namespace std;

int sumar(int x, int y)


{
return x + y;
}

int restar(int x, int y)


{
return x - y;
}

int multiplicar(int x, int y)


{
return x * y;
}

int dividir(int x, int y)


{
return x / y;
}

int resto ( int x, int y)


{
return x % y;
}

int main(int argc, char *argv[])


{
char operador, operadores[] = {'+', '-', '*', '/', '%'};
int (*arrayfunc[]) (int, int) = {sumar, restar, multiplicar,
dividir, resto};
int i, operando1, operando2;

cout << " Calculador de una expresion entera.\n";


cout << " Introduzca expresion = para fin\n Expresion:";
cin >> operando1 >> operador;
while (operador != '=')
{
cin >> operando2;
for (i = 0; i < maxoperadores; i++)
if (operador == operadores[i])
operando1 = arrayfunc[i](operando1,operando2);
cin>>operador;
}
cout << "valor de la expresion "<< operando1<< endl;

22
system("PAUSE");
return EXIT_SUCCESS;
}

Resultado de ejecución:

23