Sei sulla pagina 1di 0

Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

161
Unidad III

Cadena de Caracteres y Estructuras


Sumario
La unidad tiene como propsito que el estudiante identifique y comprenda el
manejo de cadenas de caracteres, punteros y estructuras; diseando con eficiencia
programas que involucran estos conceptos; valorando la importancia de los
conocimientos para su desarrollo acadmico. Contiene:

Cadenas de caracteres
Punteros
Estructuras
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

162
Leccin 6

Cadena de caracteres y punteros

6.1. Cadenas de caracteres
Una cadena de caracteres es una secuencia de caracteres que se indican entre
comillas dobles ( ).
Por ejemplo:
Machu Picchu
Garcilaso
Una cadena de caracteres se considera como un arreglo unidimensional, de
cualquier longitud que termina con el carcter nulo que es representado por el
smbolo \0.
Por ejemplo, Luis Flores es un arreglo de 12 caracteres, considerando el espacio
en blanco y el carcter nulo \0 (Joyanes et al., 2003).

L u i s F l o r e s \0
0 1 2 3 4 5 6 7 8 9 10 11
Cuando se trata de cadenas el compilador de manera automtica coloca el carcter
nulo al final de la cadena.
La principal diferencia entre una cadena y un arreglo de caracteres, es que una
cadena siempre termina con el carcter nulo \0 y los arreglos de caracteres no.
Como conclusin podemos decir:
Todas las cadenas de texto son arreglos de caracteres.
Pero, no todos los arreglos de caracteres almacenan cadenas.








6.1.1. Declaracin de cadena de caracteres
Las cadenas se declaran como los arreglos de caracteres, indicando el tamao
mximo de la cadena +1 (Gottfried, 1991). Sintaxis:

char nombreDeCadena[tamao_mximo_de_caracteres + 1];

6.1.2. Inicializacin de Cadenas de Caracteres
La inicializacin de un arreglo que contenga una cadena de caracteres se realiza
generalmente al momento de declararlo, como en el caso siguiente:

char nombreDeCadena [tamao_mximo_de_caracteres + 1]= cadena;

h o l a \0
0 1 2 3 4
h o l a
0 1 2 3
Arreglos de caracteres de longitud 4
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

163
Por ejemplo:

char nombre[20]= Luis Flores;

La cadena nombre tiene un mximo de 19 caracteres mas el carcter nulo \0,
con el cual el C++ finaliza todas las cadenas de caracteres. Como se mencion
anteriormente, no es necesario aadir el carcter nulo al final de la cadena el
compilador lo hace automticamente.

L u i s F L o r e s \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Si no se especifica el tamao del arreglo de caracteres, el lenguaje C asumir
como tamao el total de caracteres de la cadena inicializada ms el carcter
nulo.

Por ejemplo:

char mensaje[] = Positivo;

Dado que el tamao de la cadena Positivo es de 8 caracteres, el compilador
reserva 9.

P o S i t i v o \0
0 1 2 3 4 5 6 7 8

Si se especifica el tamao del arreglo de caracteres y la cadena asignada es
ms larga que el tamao especificado, se obtiene un error en el momento de la
compilacin.

Por ejemplo:

char cadena[3]= abcd;

Muestra el mensaje de error, array bounds overflow, indicndonos que hemos
excedido los lmites del arreglo.

6.1.3. Uso del carcter \0 en procesos iterativos
La finalizacin de una cadena de caracteres es el carcter \0. Por lo cual podemos
afirmar que una cadena de caracteres termina cuando al examinar carcter por
carcter nos encontramos con el carcter \0.
Ejemplo
Programa para imprimir la cadena Machu Picchu.

Cdigo fuente
#include <iostream.h>
void main( )
{
int i = 0;
char n[] = Machu Picchu;
while (n[i] != '\0')
{
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

164
cout<<n[i];
i = i + 1;
}
cout<<endl;
}

Grficamente los datos del arreglo, se pueden ver as:

M A c h u P i c c h u \0
0 1 2 3 4 5 6 7 8 9 10 11 12

En lenguaje C++, todo valor diferente de cero (\0) es verdadero y los valores
nulos (\0) es falso.

6.1.4. Lectura de cadenas
La sentencia cin, termina la operacin de lectura cuando encuentra un espacio en
blanco. Por ejemplo:

char nombre[20];
cin>>nombre;

Si el usuario introduce Machu Picchu, la variable nombre contiene solamente la
palabra Machu.

M a c h u \0
0 1 2 3 4 5

En cambio, la sentencia gets() permite leer una cadena completa, incluyendo los
espacios en blanco. Para el uso de esta sentencia se debe incluir a la directiva
#include <stdio.h> al inicio del programa. Por ejemplo:
char nombre[20];
gets(nombre);

Se obtiene:

M A c h u P i c c h u \0
0 1 2 3 4 5 6 7 8 9 10 11 12

Ejemplo 01
Programa para leer e imprimir un carcter

Cdigo fuente:
#include <iostream.h>
void main()
{
char car;
cout<<Introduzca un caracter:;
cin>>car;
cout<<El character ingresado es <<car<<endl;
}


Salida del programa
Introduzca un caracter: x
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

165
Car = x

Ejemplo 02
Programa para leer e imprimir una cadena sin espacios en blanco

Cdigo fuente:
#include <iostream.h>
void main()
{
char cad[100];
cout<<Introduzca un cadena:;
cin>>cad;
cout<< La cadena ingresada es <<cad<<endl;
}

Ejemplo 03
Programa para leer e imprimir una cadena que contiene espacios en blanco

Cdigo fuente:
#include <iostream.h>
#include <stdio.h>
void main()
{
char cad[100];
cout<<Introduzca un cadena:;
gets(cad);
cout<< La cadena ingresada es <<cad<<endl;
}

6.1.5. Paso de arreglos de caracteres a una funcin
Cuando se pasa un arreglo de caracteres a una funcin se realiza mediante
parmetros de referencia, ya que el nombre del arreglo de caracteres es un puntero
a dicho arreglo.
Para pasar un arreglo de caracteres a una funcin se debe tener en cuenta:

a) Como parmetro actual dentro de la llamada a la funcin el nombre del arreglo
debe de aparecer solo, es decir sin corchetes o ndices.

nombreFuncin(nombreArregloCaracteres);

b) Como parmetro formal dentro del desarrollo de la funcin el arreglo debe estar
declarado con un par de corchetes especificando su tamao.

tipoDeFuncin nombreFuncin(char nombreArregloCaracteres[tamao])

Ejemplo 01
Programa que cuenta el nmero de caracteres de una cadena.

Mdulo que se utiliza:
void cuenta(char s[256], int &k), se obtiene el nmero de caracteres de una
cadena, por medio del parmetro por referencia k

Cdigo fuente:
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

166
#include <iostream.h>
void cuenta(char s[256], int &k); // funcin prototipo
void main()
{
int k;
char cadena[256];
cout<<Ingrese cadena: ;
gets(cadena);
cuenta(cadena, k); // la cadena no necesita corchetes
cout<<La longitud de la cadena es <<k<<endl;
}
void cuenta(char c[256], int &k)
{
int x=0;
while(c[x])
x++;
k=x;
}

6.2. Punteros
Un puntero es una variable que guarda la direccin de memoria de un identificador
como una variable, un elemento de un arreglo, una estructura, un objeto de una
clase y hasta de una funcin (Deitel y Deitel, 2004).
Los punteros, al igual que las variables deben ser declarados anteponindole un
tipo de dato primitivo, a la vez que debe ser precedido por un asterisco (*). Por
ejemplo:

int *p //el puntero p apunta a cualquier variable de tipo entero.
char *c //el puntero c apunta a cualquier variable de tipo char

El lenguaje C++ emplea el operado & para obtener la direccin de una variable y el
operador * para obtener el valor de una variable apuntada.

Por ejemplo:

int a; //variable entero
int *b; //puntero a entero
a = 23;
b = &a; //se asigna la direccin de a al puntero b
cout << La direccin de memoria de a es <<b<<endl;
cout << El contenido del a es <<*b<<endl;

Los punteros son bastantes tiles para trabajar con cadenas. Por ejemplo:

char cad[5] = hola;
char *p;
p = cad; //Puntero p apunta a cad

6.2.1. Errores en el uso de punteros
A continuacin se muestra algunas de las operaciones que no se puede realizar con
punteros:
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

167

int a=15;
int *p;
double *q;
p = a; //no se puede asignar una variable a un puntero
p = &50; //un valor constante como 50 no tiene direccin
p = &(a+1); //una expresin no tiene direccin
p = 30; //no se puede asignar un valor a un puntero
&a = p; //no puedo cambiar la direccin de una variable
p = q; //p es puntero de tipo entero y q de tipo double

Los errores ms comunes es el uso de punteros son:
No inicializar un puntero, pues de esta manera van ha contener cualquier valor
(basura).

int *p;
cout<<*p<< endl;

Referenciar un puntero con un valor NULL, provoca la excepcin de violacin de
acceso de memoria y detiene el programa.

int *p = NULL;
cout<<*p<< endl;

6.2.2. Inicializacin de punteros
Un puntero puede ser inicializado con la direccin de memoria de un elemento de
un arreglo o de una variable, para esto recuerde usar el operador '&' antepuesto a
un objeto nos devuelve su direccin de memoria. Tambin puede utilizarse un
literal (constante), ya sea numrico, caracter o otro tipo, y puede inicializarse como
puntero nulo, en este caso est permitido el uso de 0 NULL.
Por ejemplo para un tipo char se tiene:

Puntero inicializado a partir de Declaraciones Inicializacin
Un elemento
char ch;
char* p;
p = &ch;
p = cad; Un arreglo char cad[10];
char* p;
p = &cad[0];
p = 0; Valor 0 o Null=0
char* p;
p = NULL;
Otro puntero (ya inicializado)
char* ptr;
char* p ;
p = ptr;
Un literal char* p; p = "casa";
Tabla 6.1. Inicializacin de punteros

6.2.3. Vectores y Punteros
Un puntero tiene por finalidad guardar una direccin de memoria. Esto causa que
no se pueda guardar la direccin de memoria de todo un arreglo, sino solo la
direccin de uno de sus elementos. Por esta razn para el compilador no existe
diferencia alguna desde el punto de vista sintctico entre punteros a variables
individuales y a arreglos (Gottfried, 1991).
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

168

Por ejemplo:
int a;
int b[20];
int *p;
p=&a;
p=&b[0];

En C++ existe una estrecha relacin entre punteros y arreglos, pues el compilador
convierte toda referencia de un arreglo, en un puntero que apunta al primer
elemento del arreglo, de esta manera una variable de tipo arreglo puede
considerarse como un apuntador al tipo del arreglo (Deitel y Deitel, 2004).
As tenemos:
int a[10], *p;
Como a y p son apuntadores a un mismo tipo de datos, es correcta la asignacin:
p = a;
Grficamente se vera as:

0 1 2 3 4 5 6 7 8 9



p apunta a la misma direccin de a, es decir a la direccin del primer elemento del
arreglo: &a[0]

Por tanto la asignacin: p = a;
Es exactamente igual a: p = &a[0];

Hay que tener presente que existe diferencia entre un puntero y el nombre de un
arreglo, pues un puntero es una variable, por lo que las operaciones: p=a y p++
son correctas, en cambio el nombre de un arreglo es una constante, por lo que las
operaciones: a=p o a++ no son correctas.
Asimismo, para referirse a un elemento de un arreglo se puede emplear x[i] o
*(x+i), que son completamente equivalentes.

Si tenemos un arreglo tal como:

int a[10];



Para referirnos al contenido del elemento 4 empleamos: a[4]
Que es exactamente igual a: *(a+4)

Por ejemplo:
Empleando arreglos mostrar los nmeros de un vector inicializado.
Cdigo fuente
#include <iostream.h>
void main( )
{
int i, x[10]= {10,11,12,13,14,15,16,17,18,19};;
for(i=0; i<10; i++)
a = 15 20 4 9 17 22
a
p
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

169
cout<<I = <<x[i]<<endl;
}
Salida del programa:
i=1
i=11
i=12
i=13
i=14
i=15
i=16
i=17
i=18
i=19

Empleando punteros mostrar los numeros de un vector inicializado.
Cdigo fuente
#include <iostream.h>
int x[10]={10,11,12,13,14,15,16,17,18,19};
void main( )
{
int i;
for(i=0; i<10; i++)
cout<<i = <<*(x+i)<<endl;
}

6.2.4. Punteros a cadenas de caracteres
Una constante de cadena como pisco sour, se almacena como un arreglo de
caracteres con un caracter nulo al final.

char parray [ ] = pisco sour;




A un puntero de tipo caracter se le puede asignar una cadena como parte de su
declaracin:
char *p = pisco sour;
En esta sentencia se declara el puntero p y se inicializa la direccin del primer
caracter de la cadena.
De esta manera podemos decir que una cadena de caracteres puede ser
representada por un arreglo unidimensional o por un puntero de tipo caracter, es
decir: char parray[ ] y char *p, son totalmente equivalentes.
Pero la diferencia que existe, es que el valor de p puede modificarse, ya que es una
variable puntero, y el valor de parray no porque se trata de una constante puntero.

6.2.5. Funciones para manipular cadena de caracteres
Las funciones para manipular cadenas de caracteres se encuentran definidas en la
directiva string.h. Por lo tanto, el uso de estas funciones debe incluir a la directiva
#include <string.h> al inicio del programa.
Funcin Descripcin
p i s c o s o u r \0
1100 1109
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

170
Para copiar
strcat(c1,c2) concatena y copia c2 en c1
strncat(c1,c2) concatena y copia los n primeros
caracteres de c2 en c1.
strcpy(c1,c2) copia el contenido de c2 en c1.
strncpy(c1,c2,n) copia el contenido de los n primeros
caracteres de c2 en c1.
strdup(c1, c2) proporciona un duplicado de c2.
Para buscar caracteres en una cadena
strchr(c,ch) devuelve un puntero a la primera
coincidencia del carcter ch, en c
devuelve NULL, si no encuentra carcter
ch
strrchr(c,ch) devuelve un puntero a la ultima
coincidencia del carcter ch en c,
devuelve NULL si no encuentra carcter
ch
strpbrk(c1,c2) devuelve los caracteres de c1 desde
donde encontr el primer carcter de
c2.
strspn(c1,c2) devuelve el nmero de caracteres
comunes de c1 y c2.
strcspn(c1,c2) devuelve el nmero de caracteres que
estn en c1 y no en c2 hasta el primer
carcter comn.
strstr(c1,c2) devuelve un puntero a la primera
ocurrencia de la cadena c2, en cadena
c1, devuelve NULL si no encuentra
cadena.
Para comparar
strcmp(c1,c2) devuelve un nmero luego de efectuar
la comparacin entre c1 y c2.
strncmp(c1,c2,n) igual al anterior pero hace la
comparacin de los n primeros
caracteres. (0 si son iguales, >0 si
c1>c2, >0 si c1>c2)
Otras
strlen(c) devuelve la longitud sin contar el
delimitador nulo.
strlwr(c) devuelve la cadena en minscula
excepto la .
strupr(c) devuelve la cadena en mayscula
excepto la .
strnset(c,ch,n) coloca ch en los primeros n caracteres
de c.
strrev(c) invierte la cadena, el nico carcter que
respeta es el delimitador nulo.
memset(d,c,n) fija los primeros n caracteres de la
cadena d con el carcter c.
Tabla 6.2. Funciones de cadena



6.3. Ejercicios resueltos
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

171
Ejemplo 01
Escribir un programa que lea una cadena de caracteres y cuente el nmero de
palabras.
Por ejemplo, la cadena:
Los operadores en c++ son importantes
El nmero de palabras resultante es 6.

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
void main()
{
int nroPalabras=1, n;
char s1[80];
cout<<Ingrese cadena: ;
gets(s1);
n = strlen(s1);
for(int i=0; i<n; i++)
{
if (s1[i] == )
nroPalabras = nroPalabras+1;
}
cout<<Numero de palabras <<nroPalabras<<endl;
}

Ejemplo 02
Programa que permita ingresar una frase y muestre:
El nmero total de caracteres ledos
El nmero de vocales
El nmero de caracteres distinto a las vocales

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
void main()
{
char cad[80], c;
int n, vocal = 0,noVocal = 0;
cout<<Ingrese cadena:;
gets(cad);
n = strlen(cad);
for (int x=0; x<n; x++)
{
c = cad[x];
switch(c)
{
case a:
case e:
case i:
case o:
case u: vocal = vocal + 1; break;
default: noVocal = noVocal + 1;
}
}
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

172
cout<< Caracteres leidos <<n<<endl
<<Numero de vocales <<vocal<<endl
<<No vocales <<noVocal<<endl;
}

Ejemplo 03
Programa que convierte una cadena que representa una fecha en el formato
dd/mm/aa y obtiene como salida la fecha expresada textualmente. Por ejemplo
si se ingresa 12/10/91 se obtendr 12 de noviembre de 1991.

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
void main()
{
char fecha[8];
char dia[3], mes[3], anio[3];
char *meses[]={enero, febrero, marzo, abril, mayo, junio,
julio, agosto, setiembre, octubre, noviembre, diciembre};
int r, d, m, a;
cout<<Ingrese fecha dd/mm/aa: ;
cin>>fecha;
strncpy(dia, fecha, 2);
d = atoi(dia);
strncpy(mes, fecha+3, 2);
m= atoi(mes);
strncpy(anio, fecha+6, 2);
a= atoi(anio);
if(a<=10)
r=2000+a;
else
r=1900+a;
cout<<d<< de <<meses[m-1]<< de <<r<<endl;
}

Numeracin romana
Es un sistema de numeracin que usa letras maysculas a las que se ha asignado
un valor numrico.
La numeracin romana utiliza siete letras maysculas a las que corresponden los
siguientes valores:

Letras I V X L C D M
Valores 1 5 10 50 100 500 1000

Ejemplo 04
Programa que convierta nmeros romanos a su equivalente en decimal. Por
ejemplo:
Romano MDCLXVI
Decimal 1000 500 100 50 10 5 1

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <iomanip.h>
void main()
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

173
{
int i, posi, arabigos[] = {1,5,10,50,100,500,1000}, n;
char *pdesp, romanos[] = IVXLCDM, cad[50], c;
cout<<Ingresar romanos: ;
cin>>cad;
strupr(cad);
n=strlen(cad);
for(i=0; i<n; i++)
{
c = cad[i];
cout<<c<< equivale a ;
pdesp = strchr(romanos,c);
posi = pdesp - romanos;
cout<<arabigos[posi]<<endl;
}
}

Ejemplo 05
Programa para ingresar un nmero romano por el teclado y mostrar el nmero en
arbigo correspondiente.
Las caractersticas fundamentales que se debe tener en cuenta en la numeracin
romana son:
a) No se puede repetir mas de tres veces los smbolos I, V, X, C, M
b) Los smbolos L y D nos se repiten
c) El smbolo de menor valor, est a la derecha y se suma:
XI = 10 + 1 =11
d) El smbolo de menor valor, est a la izquierda y se resta:
IX = 10 - 1 = 9

En la siguiente tabla se muestra resultados para diferentes valores de la cadena
romano.

cadena suma
MIX 1000 - 1 + 10 = 1009
MCMLXLVIII 1000 - 100 + 1000 + 50 -10 + 50 + 5 + 1 + 1 + 1 = 1998
XIX 10 1 + 10 = 19
LIV 50 1 + 5 = 54
CXXIX 100 + 10 + 10 1 + 10 = 129
XL -10 + 50 = 40
CM -100 + 1000 = 900
XLV -10 + 50 + 5 = 45

Cdigo fuente:
#include <iostream.h>
#include <string.h>
void main()
{
int s=0, i, posi=0, m, m1=0, t, k=0, arabigos[]={1,5,10,50,100,500,1000};
char c,*pdesp, cad[80], romanos[] = IVXLCDM;
cout<<Ingrese cadena ;
cin>>cad;
strupr(cad);
int suma[20];
c = cad[0];
pdesp = strchr(romanos, c);
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

174
m = pdesp - romanos;
m = arabigos[m];
// hallamos el signo de cada elemento y lo guardamos en el array suma
for(i=1; i<strlen(cad); i++)
{
c = cad[i];
pdesp = strchr(romanos, c);
posi = pdesp - romanos;
m1 = arabigos[posi];
if (m>= m1)
t = m;
else
t = -m;
suma[k] = t;
k++;
m = m1;
}
suma[k] = m1; // guardamos el ltimo valor
// sumamos el arreglo suma
for(i=0; i<=k; i++)
{
cout<<suma[i]<< ;
s = s + suma[i];
}
cout<<endl<<cad <<" = "<<s<<endl;
}

Ejemplo 06
Programa para convertir un nmero arbigo en romano
Por ejemplo:
23 = XXIII
116 = CXVI

Mdulos que se utilizan:
void romanov(int g, int n, char *cad), tiene como precondicin a las variables g
y n, y como postcondicin al puntero *cad.
void romano(int n, char *cad), tiene como precondicin a la variable n, y como
postcondicin al puntero *cad.


Cdigo fuente:
#include <iostream.h>
#include <string.h>
void romanov(int g, int n, char *cad);
void romano(int n, char *cad);
void main()
{
int n;
char cad[50];
cout<<Numero : ;
cin>>n;
strcpy(cad, );
romano(n ,cad);
cout<<cad<<endl;
}
void romano(int n, char *cad)
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

175
{
if(n>=1000)
{
romanov(3, (n/1000), cad);
n = n%1000;
}
romanov(2, (n/100), cad);
n = n%100;
romanov(1, (n/10), cad);
n = n%10;
romanov(0, n, cad);
}
void romanov(int g, int n, char *cad)
{
if(g==3)
switch(n)
{
case 1: strcat(cad, M); break;
}
else if(g==2)
switch(n)
{
case 1: strcat(cad, C); break;
case 2: strcat(cad, CC); break;
case 3: strcat(cad, CCC); break;
case 4: strcat(cad, CD); break;
case 5: strcat(cad, D); break;
case 6: strcat(cad, DC); break;
case 7: strcat(cad, DCC); break;
case 8: strcat(cad, DCCC); break;
case 9: strcat(cad, CM); break;
}
else if(g==1)
switch(n)
{
case 1: strcat(cad, X); break;
case 2: strcat(cad, XX); break;
case 3: strcat(cad, XXX); break;
case 4: strcat(cad, XL); break;
case 5: strcat(cad, L); break;
case 6: strcat(cad, LX); break;
case 7: strcat(cad, LXX); break;
case 8: strcat(cad, LXXX); break;
case 9: strcat(cad, XC); break;
}
else
switch(n)
{
case 1: strcat(cad, I); break;
case 2: strcat(cad, II); break;
case 3: strcat(cad, III); break;
case 4: strcat(cad, IV); break;
case 5: strcat(cad, V); break;
case 6: strcat(cad, VI); break;
case 7: strcat(cad, VII); break;
case 8: strcat(cad, VIII); break;
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

176
case 9: strcat(cad, IX); break;
}
}
Ejemplo 07
Escriba un programa para eliminar espacios en blanco. Por ejemplo:
Si se ingresa: aprendiendo un poco de cadenas
Se obtendr: aprendiendounpocodecadenas

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
void main()
{
char s1[80], c, temp[80], s2[80];
cout<<"Ingrese cadena:";
gets(s1);
for (int i=0; i < strlen(s1); i++)
{
if (s1[i] != ' ' )
{
c = s1[i];
sprintf(temp,"%c",c);
strcat(s2,temp);
}
}
cout<<s<<endl;
}

Ejemplo 08
Escriba un programa que lea una cadena de caracteres y intercambie caracteres de
la forma, el primero con ltimo, segundo con penltimo, tercero con
antepenltimo,.
Por ejemplo:
algoritmos
somtirogla

Mdulo que se utiliza:
void intercambio (char s1[80]), permite intercambiar el primer carcter con el
ultimo, el segundo con el penltimo, , etc.

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
void intercambio(char s1[80]);
void main()
{
char s1[80];
cout<<Ingrese cadena:";
gets(s1);
intercambio(s1);
cout<<s1<<endl;
}
void intercambio(char s1[80])
{
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

177
char t;
int k, n;
n = strlen(s1);
k = n-1;
for(int i=0; i<n/2; i++)
{
if (i<k)
{
t= s1[i];
s1[i]= s1[k];
s1[k]=t;
}
k=k-1;
}
}

Ejemplo 09
El cdigo de Morse, desarrollado por Samuel Morse en 1832 para el sistema
telegrfico. El cdigo Morse asigna una serie de puntos y rayas a cada letra del
abecedario, a cada dgito y a algunos caracteres especiales (punto, coma, dos
puntos y punto y coma). Ver tabla adjunta.
Escriba un programa que lea una frase y la codifique en cdigo Morse.

Caracter Cdigo Caracter Cdigo Dgitos Cdigo
A .- N -. 1 .----
B -.. O --- 2 ..---
C -.-. P .--. 3 --
D -.. Q --.- 4 .-
E . R .-. 5 ..
F ..-. S 6 -
G --. T - 7 --
H . U ..- 8 ---..
I .. V - 9 ----.
J .--- W .-- 0 -----
K -.- X -..-
L .-.. Y -.--
M -- Z --..

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
void main ()
{
// Definir e inicializar variables y vectores
int posi,i;
char s1[80], s2[80], temp[80], c, *pdes, nuevaLinea;
char letras[] = abcdefghijklmnopqrstuvwxyz;
char morse[][20]={".-", "-..", "-.-.", "-..",".", "..-.","--.", "....",
"..",".---","--.-",".-..","--","-.","---",".--.","--.-",
".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
strcpy(s2, );
cout<<"Ingrese cadena a convertir:";
gets(s1);
for (i=0; i<strlen(s1); i++)
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

178
{
if (s1[i] != )
{
c = s1[i];
pdes = strchr(letras, c);
posi = pdes - letras;
strcat(s2, morse[posi]);
}
else
{
strcpy(temp, );
strcat(s2,temp);
}
}
cout<<s2<<"\n";
cout<<endl;
}


6.4. Ejercicios propuestos
1. Construir un mtodo copiar (), que reciba dos cadenas tal como a y b, y copie el
contenido de la cadena a en la cadena b. Para la construccin de este mtodo
suponga que la longitud de la cadena b es mayor que la longitud de la cadena a.
2. Construir un mtodo borrar (), que reciba una cadena y un dato tipo char, borre
de la cadena todos los caracteres que sean iguales al dato tipo char recibido.
Por ejemplo si el mtodo recibe los datos:
Cadena: Lima, cuidad de los reyes
Caracter: e
Se obtiene: Lima, cuidad d los rys
3. Escriba un programa que permita eliminar un caracter o una subcadena dentro
de otra cadena.
Por ejemplo:
Cuidad de los reyes
dad
Cui de los reyes
4. Escriba un programa donde se ingrese una frase que acepte espacios en blanco
y luego reemplace cada vocal con los siguientes smbolos:

Vocal Smbolo
a
e
i
o
u
@
#
!
%
$
5. Escriba un programa en C que acepte una palabra y la convierta en su pig latin.
Pig latin es una forma de escribir y hablar que suelen usar los nios ingleses
como juego. Una palabra en pig latin se forma trasponiendo le primera letra al
final de la misma y aadindole luego la letra a. As la palabra perro se
convierte en erropa, computador en omputadorca.
6. Escriba un programa que determine el numero de espacios en blanco que hay
en una cadena.
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

179
7. Construir un programa que contabilice la cantidad de letras b, m y t que se
hayan ingresado en una frase.
8. Julio Cesar enviaba mensajes a sus legiones encriptando los mensajes mediante
el siguiente algoritmo: Se escoga un nmero n como clave y se sumaba a cada
letra en el alfabeto n posiciones. As, si la clave escogida fuese 5, la a pasara a
ser la f, mientras que la f pasara a ser la k. Para las ltimas letras del
abecedario se seguira desde el principio. As, con la clave de 5 la y pasara a
ser la d.
9. Disear una funcin que invierte un texto y lo muestre en mayscula:
Se ingresa: La riqueza de mi pas
Se obtiene: PAS MI DE RIQUEZA LA
10. Disear una funcin que encuentre una palabra en un texto y sustituya cada
uno de los caracteres por un *.

Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

180
Leccin 7
Estructuras

En el desarrollo de los ejercicios anteriores a este captulo, se emplearon variables,
para guardar un dato de algn tipo especfico y arreglos para guardar varios datos
del mismo tipo. Sin embargo, existen ocasiones en que se desea guardar
informacin que contiene varios tipos de datos, como por ejemplo la informacin de
un alumno que tiene cdigo (cadena), nombres y apellidos (cadena), categora
(caracter), edad (entero) y promedio ponderado (real), para este tipo de caso el
C++ utiliza las estructuras.
De esta manera se define a una estructura como un tipo de dato compuesto que
est formado por dos o ms elementos lgicamente relacionados, que pueden ser
de diferente tamao y de diferente tipo de dato.
A estos elementos se le denomina Campos y a la disposicin consecutiva de
campos se denomina Registro (Gottfried, 1991; Deitel y Deitel, 2004).

7.1. Declaracin de una estructura
Para declarar una estructura se emplea la palabra struct, adems hay que definir
los campos que sta va a contener, que pueden ser variables, arreglos, punteros u
otras estructuras. Un punto y coma finaliza la definicin de una estructura. La
sintaxis es:

struct nombreEstructura {
tipo1 campo1;
tipo2 campo2;

tipoN campoN;
};

Ejemplo:

struct alumno
{
char codigo[10], nombre[40], categoria;
int edad;
double promedio;
};

Explicacin:
Esta estructura se llama alumno, contiene cinco elementos de tipo diferente:
Dos arreglo de caracteres (cdigo y nombre)
Un caracter (categoria)
Un entero (edad)
Un real (promedio)

7.2. Declaracin de variables de tipo estructura
Una vez que la estructura ha sido creada, se puede declarar variables o arreglos de
un tipo de estructura, para esto, como tipo de dato de la variable se coloca el
nombre de la estructura.
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

181
nombreEstructura variable;
Si son varias variables van separadas por comas:
nombreEstructura variable1, variable2, , variableN;
En C++ es opcional el uso de la palabra reservada struct para declarar variables:
struct nombreEstructura variable1, variable2, , variableN;
Ejemplo:
alumno alum1, alum2, alum3;
Las variables alum1, alum2, alum3 son del tipo alumno, por tal motivo, contiene
todos los campos de la estructura alumno.

7.3. Declaracin conjunta de estructuras y variables del tipo estructura
Es posible combinar la declaracin de la estructura con la declaracin de las
variables pertenecientes a esta estructura, para esto, antes del punto y coma que
finaliza la declaracin de una estructura se defina la variable o variables de este
tipo estructura. La sintaxis es:

struct nombreEstructura {
tipo1 campo1;
tipo2 campo2;

tipoN campoN;
} variable1, variable2, ..., variablesN;

Ejemplo:

struct alumno
{
char codigo[10], nombre[40], categoria;
int edad;
double promedio;
} alum1, alum2, alum3;

7.4. Referencia a los campos de una estructura. Notacin .
Una vez declarada una variable de tipo estructura, podemos leer y escribir los
campos que componen la estructura utilizando el operador punto (.), el cual
conecta a la variable de tipo estructura con un campo de la estructura (Lpez,
2003). As tenemos:
variable.campo
Ejemplo:
Si se declara la siguiente estructura:

struct alumno
{
char codigo[10], nombre[40], categoria;
int edad;
double promedio;
} alum;

Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

182
Se acceso a cada campo de la siguiente manera:

alum.codigo // accedemos al cdigo del alumno
alum .nombre // accedemos al nombre del alumno
alum.categoria // accedemos a la categoria del alumno
alum.edad // accedemos a la edad del alumno
alum.promedio // accedemos al promedio del alumno

7.5. Inicializando una estructura
Hay dos modos de inicializar una estructura:
1) A los campos de una variable de tipo estructura se les pueden asignar valores
iniciales prcticamente de la misma forma que a los arreglos. Los valores
iniciales deben aparecer en el orden en que sern asignados a sus
correspondientes campos de la estructura, encerrados entre llaves y separadas
por comas:
nombreEstructura variable={valor1, valor2, , valorN};
Donde:
valor1 : Se refiere al valor del primer campo de la estructura.
valor2 : Se refiere al valor del segundo campo de la estructura, etc.

Ejemplo:
Programa para inicializar un registro de la estructura alumno, cuyas componentes
de la estructura es el cdigo, nombre, categora, edad y promedio.

Cdigo fuente:
#include <iostream.h>
struct alumno
{
char codigo[10], nombre[40], categoria;
int edad;
double promedio;
};
void main()
{
alumno alum = {0950080, Juan Carlos Flores Salazar, A, 22, 16.3};
cout<<Codigo: <<alum.codigo<<endl
<<Nombre: <<alum.nombre<<endl
<<Categoria: <<alum.categoria<<endl
<<Edad: <<alum.edad<<endl
<<Promedio: <<alum.promedio<<endl;
}

2) Puede inicializar una estructura utilizando instrucciones del lenguaje:
alum.codigo = 0950080;
alum.nombre = Juan Carlos Flores Salazar ";
alumn.categoria = A;
alum.edad = 22;
alum.promedio = 16.3;

7.6. Estructuras anidadas
Una estructura anidada es aquella que pertenece a otra estructura.
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

183
Ejemplo:

struct fecha
{
int dia, mes, anio;
};
struct persona
{
int codigo;
char nombre[40];
fecha ingreso;
float sueldo;

};

persona empleado;
La variable ingreso es una estructura de tipo fecha y se encuentra anidada dentro
de la estructura persona.

Ingreso
codigo nombre
dia mes anio
sueldo


Para referirnos a cualquier dato que pertenezca a una estructura anidada se utilizan
cuantos caracteres puntos . sean necesarios hasta completar el nivel de
anidamiento, por ejemplo para referirnos al dia, empleamos dos puntos:

empleado.ingreso.dia;

Las estructuras anidadas se pueden inicializar de la siguiente manera:

persona empleado= {177, Juan Fernndez ,{12, 12, 2008}, 12567};

Ejemplo:

#include <iostream.h>
struct fecha
{
int dia, mes, anio;
};
struct persona
{
int codigo;
char nombre[40];
fecha ingreso;
float sueldo;
};
void main()
{
persona empleado= {177, Juan Fernndez ,{16, 12, 2009}, 12567};
cout<<Codigo: <<empleado.codigo<<endl
<<Nombres: <<empleado.nombre<< endl
<<Fecha de ingreso: <<empleado.ingreso.dia<</
<<empleado.ingreso.mes<</
<<empleado.ingreso.anio<<endl
<<Sueldo: <<empleado.sueldo<<endl;
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

184
}

7.7. Arreglos de estructuras
Hasta el momento hemos guardado informacin de un alumno mediante una
estructura, supongamos que queremos guardar informacin de un grupo de
alumnos, en este caso utilizaremos los arreglos de estructura.
Un arreglo de tipo estructura es aquel en el cual cada uno de sus componentes es
una estructura.
Si se tiene la siguiente estrutura:
struct alumno
{
char codigo[10], nombre[40], categoria;
int edad;
double promedio;
};

La declaracin de un arreglo de estructura es:
alumno alum[100];

Y podemos acceder a los datos de cada uno de sus componentes de la siguiente
manera:
alum[i].codigo;
alum[i].nombre;
alum[i].categoria;
alum[i].edad;
alum[i].promedio;
Donde i es el ndice correspondiente a cada elemento del arreglo de estructura. Por
ejemplo, si queremos acceder al nombre del alumno 14 escribimos
alum[13].nombre; recuerda que los ndices de los arreglos empiezan en 0.

Ejemplo
Programa para imprimir los datos de una estructura alumno.

Cdigo fuente:
#include <iostream.h>
struct alumno
{
char codigo[10], nombre[40], categoria;
int edad;
double promedio;
};
void main( )
{
alumno alum[ ]={{0950080, Juan Carlos Flores Snchez, B, 22, 17.6},
{0950100, Julio Csar Castillo Roca, A, 23, 8.1},
{0951200, Diego Manuel Cuba Miranda, C, 21, 16.9},
{0951233, Ana Fernanda Montalvo Ros, A, 22, 9.5},
{0951343, Jos Luis Sols Villarn, C, 20, 11.3}};
int i;
for(i=0; i<5; i++)
cout<<alum[i].codigo<<\t<<alum[i].nombre<<\t
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

185
<<alum[i].categoria<<\t<<alum[i].edad<<\t
<<alum[i].promedio<<endl;
}

Al ejecutar el programa se obtiene la siguiente salida:
0950080 Juan Carlos Flores Snchez B 22 17.6
0950100 Julio Csar Castillo Roca A 23 8.1
0951200 Diego Manuel Cuba Miranda C 21 16.9
0951233 Ana Fernanda Montalvo Ros A 22 9.5
0951343 Jos Luis Sols Villarn C 20 11.3

7.8. Paso de arreglos de tipo estructura a una funcin
El paso de arreglos de tipo estructura a una funcin se realiza por medio de
parmetros por referencia, ya que el nombre del arreglo de tipo estructura es un
puntero a dicho arreglo.

Para pasar un arreglo de tipo estructura a una funcin se debe de tener en cuenta:
a) Parmetro actual:
dentro de la llamada a la funcin, el nombre del arreglo de tipo estructura debe
de aparecer sin corchetes o ndices.
Nombre del arreglo
nFuncion(nastruct) de tipo estructura

Nombre de la funcin

b) Parmetro formal:
En el desarrollo de la funcin, se debe declarar al arreglo de tipo estructura con
un par corchetes especificando su tamao.

Nombre del arreglo
Tipo nFuncion(nstruct nastruct[tamao]) de tipo estructura

Nombre de la funcin Nombre de la estructura

Ejemplo
Programa que permite guardar en un arreglo de estructura los datos de N alumnos.

Cdigo fuente:
#include <iostream.h>
#include <stdio.h>
struct alumno
{
char codigo[10], nombre[40], categoria;
int edad;
double promedio;
};
void ingresar(int &n, alumno alum[50]);
void imprimir(int n, alumno alum[50]);
int i;
void main()
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

186
{
int n;
alumno alum[50];
ingresar(n, alum);
imprimir(n, alum);
}

void ingresar(int &n, alumno alum[50])
{
cout<< Ingresar cantidad de alumnos: ;
cin>>n;
for(i=0; i<n; i++)
{
cout<<Codigo: ;
cin>>alum[i].codigo;
cout<<Nombre: ;
gets(alum[i].nombre);
cout<<Categoria: ;
cin>>alum[i].categoria;
cout<<Edad: ;
cin>>alum[i].edad;
cout<<Promedio: ;
cin>>alum[i].promedio;
}
}
void imprimir(int n, alumno alum[50])
{
for(i=0; i<n; i++)
cout<<alum[i].codigo<<\t<<alum[i].nombre<<\t
<<alum[i].categoria<<\t<<alum[i].edad<<\t
<<alum[i].promedio<<endl;
}

7.9. Apuntadores a estructuras
Un puntero a una estructura se define de la siguiente manera:
alumno *ptr;
Mediante esta declaracin decimos que ptr es una variable puntero y adems es un
puntero a la estructura alumno.

7.10. Referencia a los campos de una estructura con punteros. Notacion ->
Una vez declarada una variable puntero de tipo estructura, podemos leer y escribir
los campos que componen una estructura utilizando el signo menos seguido del
signo mayor (->) (Lpez, 2003). As tenemos:
variablePuntero -> campo
Que equivalente a:
(*variablePuntero).campo
Si tenemos:
struct libro{
char titulo[50], autor[80];
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

187
int paginas;
};

libro *p;
libro
titulo Autor paginas

El puntero p apunta a la estructura libro.

El acceso a la estructura por medio del puntero es:
p ->titulo
p ->autor
p ->paginas

Que es equivalente a:
(*p).titulo
(*p).autor
(*p).paginas

De donde concluimos que:
p es un puntero
(*p) es la estructura
(*p).autor es la variable autor dentro de la estructura

Ejemplo
Programa para imprimir la estructura libro

Cdigo fuente:
#include <iostream.h>
struct libro{
char titulo[50], autor[80];
int paginas;
};
void main( )
{
libro ficha={Las TI en la industria, Pedro Torres, 350}, *p;
p=&ficha;
cout<<p->titulo<<\t<<p->autor<<\t<<p->paginas<<endl;
}

Al ejecutar el programa se obtiene la siguiente salida
Las TI en la industria Pedro Torres 350

7.11. Paso de una estructura a una funcin empleando punteros
El paso de una estructura a una funcin se realiza por medio de parmetros por
referencia, ya que el nombre de la estructura es un puntero a dicha estructura
(Gottfried, 1991).
Para pasar una estructura a una funcin se debe de tener en cuenta:
a) Parmetro Actual:
Dentro de la llamada a la funcin, la variable de tipo estructura debe estar
precedido por el operador &, que indica la direccin de la variable.

p
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

188

Nombre de la variable de tipo estructura

nFuncin(&nvs);

Nombre de la function

b) Parmetro formal:
En el desarrollo de la funcin, se debe declarar un puntero a una estructura.

Tipo nFuncin (struct nstruct *pstruct)

Nombre de la funcin Puntero a la estructura nstruct

Ejemplo
Programa que permite guardar el registro de un libro.

Cdigo fuente:
#include <iostream.h>
#include <stdio.h>
struct libro{
char titulo[50], autor[80];
int paginas;
};

void ingresar(libro *pt);
void imprimir(libro *pt);
void main()
{
libro ficha;
ingresar(&ficha);
imprimir(&ficha);
}

void ingresar(libro *pt)
{
cout<<Ttulo del libro: ;
gets(pt->titulo);
cout<<Auto: ;
gets(pt->autor);
cout<<Paginas: ;
cin>>pt->paginas;
}
void imprimir(libro *pt)
{
cout<<pt->titulo<<\t<<pt->autor<<\t<<pt->paginas<<endl;
}

7.12. Ejercicios resueltos
Ejemplo 01
Escribir un programa que funcione como un diccionario ingls - espaol, esto es, al
introducir una palabra en ingls, se escriba su correspondiente palabra en espaol.
El nmero de parejas de palabra es variable, pero limitado a un mximo de 100.
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

189
Por ejemplo:
Introducir las siguientes parejas de letras:
book libro
green verde
mouse ratn
Una vez finalizada la introduccin de la lista de palabras, pasamos al modo de
traduccin, de forma que si tecleamos green la respuesta ha de ser verde, y en el
caso que la palabra no se encuentra se emitir un mensaje.
El Programa constar de dos funciones:
a) Crear el diccionario
b) Traducir
La funcin crear diccionario finaliza cuando se introduce la palabra fin
Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
struct diccionario
{
char ingles[40], castellano[40];
};
void menu();
void crear(diccionario dic[100]);
void traducir(diccionario dic[100]);
int i=0;
void main()
{
diccionario dic[100];
int opcion;
do
{
menu();
cout<<"Ingrese opcion: ";
cin>>opcion;
switch (opcion)
{
case 1: crear(dic); break;
case 2: traducir(dic); break;
}
}
while (opcion != 3);
}
void menu()
{
system(cls);
cout<<MENU DE OPCIONES<<endl
<<--------------------------<<endl
<<1) Crear diccionario<<endl
<<2) Traducir<<endl
<<3) Salir<<endl;
}
void crear(diccionario dic[100])
{
do
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

190
{
cout<<Palabra en ingles: ;
cin>>dic[i].ingles;
strupr(dic[i].ingles);
if(stricmp(dic[i].ingles, "fin")!=0){
cout<<Palabra en castellano: ;
cin>>dic[i].castellano;
strupr(dic[i].castellano);
i = i + 1;
}
}
while(stricmp(dic[i].ingles, fin)!=0);
}
void traducir(diccionario dic[100])
{
int sw=0, j=0;
char pal[40];
cout<<Ingrese palabra en ingles: ;
cin>>pal;
strupr(pal);
while (j < i && sw==0 )
{
if (stricmp(dic[j].ingles, pal) == 0)
{
sw=1;
break;
}
j = j + 1;
}
if (sw)
cout<<La palabra en castellano es: <<dic[j].castellano<<endl;
else
cout<<No existe palabra en el diccionario<<endl;
getch();
}

Ejemplo 02
Escriba un programa que permita:
a) Almacenar en un arreglo de estructura los datos como cdigo, nombre, apellido
y direccin de N empleados.
b) Buscar un empleado ingresando cdigo
c) Buscar un empleado ingresando por apellido

El programa constar de tres funciones
a) Crear
b) Buscar por cdigo
c) Buscar por apellido
La funcin crear finaliza cuando se introduce como cdigo de empleado la palabra
fin

Cdigo fuente:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct empleado
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

191
{
char codigo[6], nombre[40], apellido[40], direccion[40];
};
void menu();
void crear(empleado emp[100]);
void buscaCodigo(empleado emp[100]);
void buscaApellido(empleado emp[100]);
int i=0;
void main()
{
empleado emp[100];
int opcion;
do
{
menu();
cout<<Ingrese opcion: ;
cin>>opcion;
switch (opcion)
{
case 1: crear(emp); break;
case 2: buscaCodigo(emp); break;
case 3: buscaApellido(emp); break;
}
}while (opcion != 4);
}
void menu()
{
system(cls);
cout<<MENU DE OPCIONES"<<endl
<<--------------------------"<<endl
<<1) Crear empleado<<endl
<<2) Buscar por codigo<<endl
<<3) Buscar por apellido<<endl
<<4) salir<<endl;
}
void crear(empleado emp[100])
{
do
{
cout<<Codigo: ;
cin>>emp[i].codigo;
if(stricmp(emp[i].codigo, fin)!=0){
strupr(emp[i].codigo);
cout<<Nombre: ;
gets(emp[i].nombre);
strupr(emp[i].nombre);
cout<<Apellido: ;
gets(emp[i].apellido);
strupr(emp[i].apellido);
cout<<Direccion: ;
gets(emp[i].direccion);
strupr(emp[i].direccion);
i = i + 1;
}
}
while(stricmp(emp[i].codigo, fin)!=0);
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

192
}
void buscaCodigo(empleado emp[100])
{
int sw=0, j=0;
char cod[40];
cout<<Codigo: ;
cin>>cod;
strupr(cod);
while (j < i && sw==0)
{
if (stricmp(emp[j].codigo, cod) == 0)
{
sw=1;
break;
}
j = j + 1;
}
if (sw)
{
cout<<Nombre: <<emp[j].nombre<<endl
<<Apellido: <<emp [j].apellido<<endl
<<Direccion: <<emp [j].direccion<<endl;
}
else
cout<<No existe codigo<<endl;
}
void buscaApellido(empleado emp[100])
{
int sw=0, j=0;
char ape[40];
cout<<Ingrese apellido: ;
gets(ape);
strupr(ape);
while (j < i && sw==0)
{
if (stricmp(emp[j].apellido, ape) == 0 )
{
sw=1;
break;
}
j = j + 1;
}
if (sw)
{
cout<<Nombre: <<emp[j].nombre<<endl
<<Apellido: <<emp [j].apellido<<endl
<<Direccion: <<emp [j].direccion<<endl;
}
else
cout<<No existe apellido<<endl;
}

Ejemplo 03
Una biblioteca almacena los datos de sus libros en un arreglo de estructura como
cdigo, titulo, autor, rea (ciencias, letras) y cantidad de ejemplares. Se pide
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

193
calcular la cantidad de libros del rea de ciencias y del rea de letras, as como
mostrar la relacin de libros ordenados alfabticamente por autor.

Codigo fuente:
#include <iostream.h>
struct libro{
char codigo[10], titulo[50], autor[50], area;
int cantidad;
};
int i;
void ingresar(int &n, libro b[100]);
void calcular(int n, libro b[100]);
void ordenar(int n, libro b[100]);
void imprimir(int n, libro b[100]);
void main()
{
libro b[100];
int n;
ingresar(n, b);
calcular(n, b);
ordenar(n, b);
imprimir(n, b);
}
void ingresar(int &n, libro b[100]){
cout<<"Ingresar cantidad de libros: ";
cin>>n;
for(i=0; i<n; i++){
cout<<"Codigo: ";
cin>>b[i].codigo;
cout<<"Titulo: ";
cin>>b[i].titulo;
cout<<"Autor: ";
cin>>b[i].autor;
cout<<"Area (C)iencias, (L)etras: ";
cin>>b[i].area;
cout<<"Cantidad de ejemplares: ";
cin>>b[i].cantidad;
}
}
void calcular(int n, libro b[100]){
int sumac=0, sumal=0;
for(i=0; i<n; i++)
switch(b[i].area){
case 'C': sumac=sumac+b[i].cantidad; break;
case 'L': sumal=sumal+b[i].cantidad; break;
}
cout<<"La cantidad de libros de ciencias es "<<sumac<<" y "
<<"la cantidad de libros de letras es "<<sumal<<endl;
}
void ordenar(int n, libro b[100]){
int j;
libro aux;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(strcmp(b[i].autor, b[j].autor)>0)
{
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

194
aux=b[i];
b[i]=b[j];
b[j]=aux;
}
}
void imprimir(int n, libro b[100]){
for(i=0; i<n; i++)
cout<<b[i].codigo<<"\t"
<<b[i].titulo<<"\t"
<<b[i].autor<<"\t"
<<b[i].area<<"\t"
<<b[i].cantidad<<endl;
}

Ejemplo 04
Empleando punteros a estructuras, calcular el pago mensual que realiza un socio de
un club, el monto base mensual es de S/45.00 y adicionalmente tendr que pagar
por cada hijo una monto que depende de la categora, como se muestra en el
siguiente cuadro:

Categora Tarifa x hijo (s/.)
A
B
C
12.5
9.7
7.2

Codigo fuente:
#include <iostream.h>
#define base 45.00
struct socio{
char nombre[40], categoria;
int hijos;
double total;
};
void ingresar(socio *s);
void imprimir(socio *s);
void calcular(socio *s);
void main()
{
int n;
socio s;
ingresar(&s);
calcular(&s);
imprimir(&s);
}
void ingresar(socio *s){
cout<<"Nombre: ";
cin>>s->nombre;
cout<<"Categoria: ";
cin>>s->categoria;
cout<<"Cantidad de hijos: ";
cin>>s->hijos;
}
void imprimir(socio *s){
cout<<"El pago mesual del socio"<<s->nombre<<" es "<<s->total<<endl;
}
void calcular(socio *s){
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

195
double tarifa;
switch(s->categoria){
case 'A': tarifa = 12.5; break;
case 'B': tarifa = 9.7; break;
case 'C': tarifa = 7.2; break;
}
s->total=base+s->hijos * tarifa;
}
Ejemplo 05
Una empresa tiene almacenado a sus vendedores en un arreglo de estructura. Por
cada vendedor se guarda se DNI, Nombre, Apellidos, Sueldo, Venta Mensual y
Comisin. La comisin se calcular aplicando un porcentaje variable a la Venta
Mensual, dicho porcentaje variar segn la siguiente tabla:

Venta mensual Comisin (%)
0 1500
1501 2150
2151 2900
2901 3500
3501 ms
0
13
16
18
20

Empleando punteros a estructuras, se pide calcular la comisin y el total que recibe
cada vendedor.

Cdigo fuente:
#include <iostream.h>
#include <stdlib.h>
struct vendedor{
char dni[8], nombre[40], apellido[50];
double sueldo, venta, comision, total;
};
void ingresar(int &n, vendedor *v);
void imprimir(int n, vendedor *v);
void calcular(int n, vendedor *v);
int i;
void main()
{
int n;
vendedor vend[80];
ingresar(n, vend);
calcular(n, vend);
imprimir(n, vend);
}
void ingresar(int &n, vendedor *v){
cout<<"Ingresar cantidad de vendedores: ";
cin>>n;
for(i=0; i<n; i++){
cout<<"DNI: ";
cin>>(v+i)->dni;
cout<<"Nombre: ";
cin>>(v+i)->nombre;
cout<<"Apellidos: ";
cin>>(v+i)->apellido;
cout<<"Sueldo: ";
cin>>(v+i)->sueldo;
cout<<"Ventas: ";
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

196
cin>>(v+i)->venta;
}
}
void imprimir(int n, vendedor *v){
cout<<"DNI\tNombre\tApellidos\tSueldo\tVenta\tComision\tTotal"<<endl;
for(i=0; i<n; i++)
cout<<(v+i)->dni<<"\t"
<<(v+i)->nombre<<"\t"
<<(v+i)->apellido<<"\t"
<<(v+i)->sueldo<<"\t"
<<(v+i)->venta<<"\t"
<<(v+i)->comision<<"\t"
<<(v+i)->total<<endl;
}
void calcular(int n, vendedor *v){
for(i=0; i<n; i++){
if((v+i)->venta<=1500)
(v+i)->comision=0;
else if((v+i)->venta<=2150)
(v+i)->comision=(v+i)->venta*0.13;
else if((v+i)->venta<=2900)
(v+i)->comision=(v+i)->venta*0.16;
else if((v+i)->venta<=3500)
(v+i)->comision=(v+i)->venta*0.18;
else
(v+i)->comision=(v+i)->venta*0.20;
(v+i)->total=(v+i)->sueldo+(v+i)->comision;
}
}

7.13. Ejercicios Propuestos
1. Un banco guarda en un arreglo de estructura los datos de sus clientes, como:
nmero de cuenta, nombre, apellidos, saldo actual. Construir un programa que
permita ingresar un nmero de cuenta para ubicar a un cliente, de manera que
este cliente pueda realizar un depsito o un retiro. Finalmente, tendr que
mostrar el nuevo saldo.
2. Una distribuidora de prendas de vestir almacena en un arreglo de estructura los
datos de las prendas que comercializa como: Cdigo, Genero, Talla, Color y
Cantidad, construir un programa que calcule la cantidad de prendas de talla S,
M y L, tanto para mujeres como para varones (V, M).
3. Escriba un programa interactivo que acepte el nombre de un pas como entrada
y escriba su correspondiente capital.
El programa constar de dos funciones: crear y encontrar. La funcin crear
capital finaliza cuando se introduce la palabra fin
4. Construir un programa que gestione dinmicamente la informacin referente a
un campeonato de ftbol. Para cada equipo se registra su nombre, el nmero de
victorias, nmero de derrotas y nmero de empates. Se pide mostrar el puntaje
final de cada equipo, el cual se calcula segn el siguiente baremo: 1 victoria = 2
puntos, 1 derrota = -1 puntos, 1 empate = 1 punto.
5. En un taller de reparacin de automviles se almacena la siguiente informacin
para cada una de las reparaciones realizadas: placa del vehculo, nombre del
propietario, descripcin de la reparacin, importe de la reparacin. Elaborar un
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

197
programa que permita eliminar un registro ingresando la placa del vehculo,
adems calcular el ingreso total que obtuvo el taller y mostrar los datos del
arreglo ordenados alfabticamente de acuerdo con el nombre del propietario.
6. Calcular el monto final que paga N clientes durante una compra en un
supermercado, de acuerdo con el monto de la compra el cliente recibe los
siguientes descuentos:
Compra Descuento (%)
0 500
501 1000
1001 1500
1501 ms
5
13
18
25
7. En nuestra capital se esta organizando un congreso de profesionales, para lo
cual por cada expositor se guarda: numero de DNI, nombre, regin a la que
representa (costa, sierra, selva) y edad. Elaborar un programa que muestre la
relacin de profesionales por cada regin, la regin con ms nmeros de
participantes y el nombre del expositor de menor edad en cada regin.
8. Construir un programa que permita ingresar el Cdigo, Nombre, Sueldo y
Condicin (Estable, Contratado) de N empleados, de acuerdo con su condicin el
sueldo vara en:
Condicin Sueldo (S/.)
Estable
Contratado
2600.00
2100.00
Luego calcule el total de empleados estables y contratados y ordene los datos
de acuerdo al cdigo e imprima sus datos.
9. En un arreglo de estructura se guarda los datos de los alumnos de una
universidad como: cdigo, nombre, edad y facultad. Construir un programa que
calcule y muestre: La relacin de alumnos por facultad, el promedio de edades
de cada facultad y el nombre del alumno con mayor edad.
10. Guardar en un arreglo de estructuras las N facturas emitidas por una tienda y
calcular el monto total de cada factura, tener en cuenta que en una factura se
pueden comprar cantidades diferentes de diversos productos.
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

198
Resumen

Esta unidad comprende conceptos y ejemplos prcticos relacionados a cadenas de
caracteres y estructuras, los cuales permitiren al estudiante almacenar y manipular
un texto que antes de este captulo no era posible, adems de definer un tipo de
dato compuesto como son las estructuras. En ambos temas se considera el uso de
punteros debido a su utilidad principalmente en el manejo de cadenas.

Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

199
Lectura
Etapas de la Programacin

El proceso de programacin consta, tericamente, de tres partes: La primera, que
recibe el nombre de especificacin, consiste en detallar que tiene que hacer el
programa o, dicho de otra manera, concretar qu problemas tiene que resolver
nuestro programa. Una vez determinado qu har nuestro programa empieza la
fase de diseo.
En la fase de diseo se escribe el algoritmo que es el conjunto de pasos que hay
que realizar para resolver el problema planteado en la fase de especificaciones. De
algoritmos pueden haber varios que hagan lo mismo, algunos sern ms rpidos,
otros ms lentos, ms simples o ms complejos. Finalmente hay que implementar
el algoritmo en un lenguaje de programacin.
En la mayora de los casos la implementacin se realizar en un lenguaje de
programacin de alto nivel.
Los lenguajes de programacin son un conjunto de reglas y smbolos que permiten
la implementacin de los algoritmos y/o diagramas de flujo. En el caso de los
lenguajes de alto nivel, stos son ms cercanos a la sintaxis humana y al
programador mientras que los de bajo nivel son ms cercanos a las rdenes que
entiende la mquina y en general ms alejados del lenguaje natural. A
consecuencia de esto los lenguajes de alto nivel se pueden emplear en ms de un
sistema mientras que los de bajo nivel tienen un mbito ms restringido.
Los programas escritos en lenguajes de alto nivel tienen que ser convertidos a
lenguajes de bajo nivel para ser ejecutados en un sistema. Con esta finalidad
existen los compiladores y los intrpretes. El compilador transforma el lenguaje de
alto nivel en un lenguaje de bajo nivel que suele ser cdigo mquina (o sea,
directamente ejecutable por el procesador). Mientras que el intrprete codifica una
o ms instrucciones de forma secuencial, a medida que las va leyendo. Son
lenguajes interpretados el BASIC y el LISP, mientras que el Pascal y el C o C++ y
muchos otros, son compilados. Finalmente existe una opcin hbrida introducida por
JAVA que dispone de compilador e intrprete de los bytecodes que el compilador
genera.

Gottfried, Byron S. (1995) Programacin en Pascal. Madrid. McGraw-Hill
Interamericana de Espaa. Cap 1. Conceptos introductorios. pp 13
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

200
Glosario

Cadena: Secuencia de caracteres que se indican entre comillas dobles ( ).
Puntero: Es una variable que almacena la direccin de memoria de otra variable.
Estructura: Dato compuesto que est formado por dos o ms elementos
lgicamente relacionados, que pueden ser de diferente tamao y de diferente tipo
de dato.
Estructuras anidadas: Una estructura anidada es aquella que pertenece a otra
estructura.
Arreglo de estructura: Es aquel en el cual cada uno de sus componentes es una
estructura.
Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

201
Autoevaluacin

1. Escriba la declaracin adecuada para:
a) Dos punteros que apuntad a las variables enteras a y b.
b) Un puntero que apunta a una variable de tipo estructura.
c) Un punter a una cadena.

2. Declare y defina la forma de ingreso de:
a) Una cadena cin espacios.
b) Una cadena sin espacios.

3. Defina la salida generada del siguiente programa:

#include <iostream.h>
struct dato{
int i;
double j;
};
void funcioncalculo(dato x);
void main()
{
dato x;
x.i=300;
x.j=2.34;
funcioncalculo(x);
cout<<x.i<<x.j<<endl;
}
void funcioncalculo(dato x){
x.i=400;
cout<<x<<endl;
}

4. Codifique los siguiente:
a) Un programa que contabilice la cantidad de letras b, m y t que se hayan
ingresado en una frase.
b) Un hospital almacena la informacin de sus pacientes como: Cdigo,
Nombre, Distrito, Telfono, Diagnstico. Construir un programa que permita
introducir los datos de los pacientes a un arreglo de estructura, que dado el
nombre de un paciente se muestre su diagnstico, adems muestre la
relacin de pacientes que tiene un diagnostico ingresado.


Lenguaje de Programacin I - Unidad III Yuliana Juregui y otros

202
Bibliografa

Joyanes Aguilar, Luis, Rodrguez Baena, Luis y Fernndez Azuela, Matilde
(2003) Fundamentos de programacin. Libro de problemas algoritmos,
estructuras de datos y objetos. 2da Edicin. Madrid. McGraw-Hill.
Interamericana de Espaa. Cap. 7. Las cadenas de caracteres. pp. 157 158.
Gottfried, Byron S. (1991) Programacin en C. Mxico DF. McGraw-Hill. Cap.
11. Estructuras y Uniones. pp 373 - 420.
Leobardo Lpez, R. (2003) Programacin estructurada: un enfoque algortmico.
2da. Edicin. Editorial Alfaomega Mxico DF. Cap 10. Registros y archivos. pp
211 235.
Deitel, Harvey M. y Dietel, Paul J. (2004) Como Programar en C/C++ y Java.
4ta Edicin. Mxico DF. Pearson Addison-Wesley. Cap. 7. Apuntadores en C. pp
233 263.

Enlaces

http://sistemas.itlp.edu.mx/tutoriales/tutorc/index.htm
http://www.itq.edu.mx/vidatec/maestros/sis/mlopez/Tutorial/index2.htm
http://foro.undersecurity.net/read.php?19,4260,4260
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Arrays_y_ca
denas_de_texto

Potrebbero piacerti anche