Logo Studenta

programacion c ejercicios resueltos-44

¡Estudia con miles de materiales!

Vista previa del material en texto

102 | Capítulo 3: Tipos numéricos, expresiones y salida
Usted especifi ca el nombre de una variable string (aquí, myName), luego un punto y después el 
nombre de la función y la lista de argumentos. La función length no requiere que le pasen argu-
mentos, pero se deben usar paréntesis para indicar una lista de argumentos vacía. Asimismo, length 
es una función de devolución de valor, así que la llamada de función debe aparecer dentro de una 
expresión:
 string fi rstName;
string fullName;
 fi rstName = "Alexandra";
cout << fi rstName.length() << endl; // Prints 9
fullName = fi rstName + " Jones";
cout << fullName.length() << endl; // Prints 15
Quizá se pregunte acerca de la sintaxis en una llamada de función como
 fi rstName.length()
Esta expresión usa una notación C++ llamada notación de punto. Hay un punto entre el nombre de 
variable fi rstName y el nombre de función length. Algunos tipos de datos defi nidos por el progra-
mador, como string, tienen funciones que están estrechamente relacionadas con ellos, y la notación 
de punto se requiere en las llamadas de función. Si olvida usar la notación de punto y escribe la 
llamada de función como
 length()
obtiene un mensaje de error al momento de compilar, algo como “UNDECLARED IDENTIFIER”. El 
compilador piensa que usted está tratando de llamar a una función ordinaria denominada length, 
no la función length relacionada con el tipo string. En el capítulo 4 se analiza el signifi cado de la 
notación de punto.
Algunas personas se refi eren a la longitud de una cadena como su tamaño. Para acomodar ambos 
términos, el tipo string proporciona una función llamada size. Tanto fi rstName.size() como 
fi rstName.length() devuelven el mismo valor.
Se dice que la función length devuelve un valor entero sin signo. Si se desea guardar el resul-
tado en una variable len, como en
 len = fi rstName.length();
entonces, ¿qué se debe declarar en cuanto a la identidad del tipo de datos de len? Para evitar tener 
que adivinar si unsigned int o unsigned long es correcto para el compilador particular con que 
se está trabajando, el tipo string defi ne un tipo de datos size_type para que se pueda usar
 string fi rstName;
string::size_type len;
 
fi rstName = "Alexandra";
len = fi rstName.length();
Observe que es necesario usar el nombre califi cado string::size_type (de la manera como se hizo 
con los identifi cadores en los espacios de nombre) porque de otro modo la defi nición de size_type 
se oculta dentro de la defi nición del tipo string.
Antes de dejar las funciones length y size, se debe hacer una observación acerca del uso de 
mayúsculas en los identifi cadores. En las normas dadas en el capítulo 2 se dijo que en este libro se 
comienzan con mayúscula los nombres de funciones defi nidas por el usuario y tipos de datos. Se 
DALE003.indd 102DALE003.indd 102 4/12/06 18:56:584/12/06 18:56:58
 www.FreeLibros.me
sigue esta convención al escribir nuestras propias funciones y tipos de datos en capítulos posteriores. 
Sin embargo, no se tiene control sobre el uso de mayúsculas en elementos provistos por la bibliote-
ca estándar de C++. Los identifi cadores de la biblioteca estándar se escriben por lo general con mi-
núsculas.
Función fi nd
La función fi nd busca una cadena para hallar la primera concurrencia de una subcadena particular y 
devuelve un valor entero sin signo (de tipo string:: size_type) que da el resultado de la búsque-
da. La subcadena, pasada como un argumento para la función, puede ser una cadena literal o una 
expresión string. Si str1 y str2 son de tipo string, las siguientes son llamadas de función váli-
das:
 str1.fi nd("the") str1.fi nd(str2) str1.fi nd(str2 + "abc")
En cada caso anterior, se busca en str1 para ver si dentro de ella se puede hallar la subcadena es-
pecifi cada. Si es así, la función devuelve la posición en str1 donde comienza la correspondencia. 
(Las posiciones se numeran comenzando en 0, de modo que el primer carácter de una cadena está en 
la posición 0, el segundo está en la posición 1, y así sucesivamente.) Para una búsqueda exitosa, la 
correspondencia debe ser exacta, incluso el uso idéntico de mayúsculas. Si no se puede hallar la 
subcadena, la función devuelve el valor especial string::npos, una constante nombrada que sig-
nifi ca “no es una posición dentro de la cadena”. (string::npos es el valor más grande de tipo 
string::size_type, un número como 4294967295 en muchas máquinas. Este valor es adecuado 
para “no es una posición válida” porque las operaciones string no permiten que ninguna cadena 
adquiera esta longitud.)
Dado el segmento de código
 string phrase;
string::size_type position;
phrase = "El perro y el gato";
la sentencia
 position = phrase.fi nd("el");
asigna a position el valor 12, mientras que la sentencia
 position = phrase.fi nd("rata");
asigna a position el valor string::npos, porque no hubo corresponencia.
El argumento para la función fi nd puede ser también un valor char. En este caso, fi nd busca la 
primera ocurrencia de ese carácter dentro de la cadena y devuelve su posición (o string::npos, si 
no se encontró el carácter). Por ejemplo, el segmento de código
 string theString;
theString = "Abracadabra";
cout << theString.fi nd('a');
produce el valor 3, que está en la posición de la primera ocurrencia de una a minúscula en theString.
A continuación se dan algunos ejemplos más de llamadas para la función fi nd, suponiendo que 
se ha ejecutado el siguiente segmento de código:
 string str1;
string str2;
 
str1 = "Programming and Problem Solving";
str2 = "gram";
 3.8 Más operaciones de cadena | 103
DALE003.indd 103DALE003.indd 103 4/12/06 18:56:594/12/06 18:56:59
 www.FreeLibros.me
104 | Capítulo 3: Tipos numéricos, expresiones y salida
Llamada de función Valor devuelto por la función
str1.fi nd("and") 12
str1.fi nd("Programming") 0
str2.fi nd("and") string::npos
str1.fi nd("Pro") 0
str1.fi nd("ro" + str2) 1
str1.fi nd("Pr" + str2) string::npos
str1.fi nd(' ') 11
Observe en el cuarto ejemplo que hay dos copias de la subcadena "Pro" en str1, pero fi nd 
devuelve sólo la posición de la primera copia. Observe también que las copias pueden ser palabras 
separadas o partes de palabras; fi nd solamente intenta hacer corresponder la secuencia de caracteres 
dada en la lista de argumentos. En el ejemplo fi nal se demuestra que el argumento puede ser tan 
simple como un solo carácter, incluso un solo espacio en blanco.
Función substr
La función substr devuelve una subcadena particular de una cadena. Suponiendo que myString es 
de tipo string, aquí se da una llamada de función:
 myString.substr(5, 20)
El primer argumento es un entero sin signo que especifi ca una posición dentro de la cadena, y el 
segundo es un entero sin signo que especifi ca la longitud de la subcadena deseada. La función de-
vuelve la parte de la cadena que empieza con la posición especifi cada y continúa para el número de 
caracteres dados por el segundo argumento. Observe que substr no cambia a myString; devuelve 
un nuevo valor string temporal, que es copia de una parte de la cadena. A continuación se dan 
algunos ejemplos, suponiendo que la sentencia
 myString = "Programming and Problem Solving";
se ha ejecutado.
Llamada de función Cadena contenida en el valor devuelto por la función
myString.substr(0, 7) "Program"
myString.substr(7, 8) "ming and"
myString.substr(10, 0) ""
myString.substr(24, 40) "Solving"
myString.substr(40, 24) Ninguna. El programa termina con un mensaje de error de ejecución.
En el tercer ejemplo, especifi car una longitud de 0 produce como resultado la cadena nula. En el 
cuarto ejemplo se muestra lo que sucede si el segundo argumento especifi ca más caracteres de los que 
están presentes después de la posición de inicio: substr devuelve los caracteres desde la posición 
inicial hasta el fi n de la cadena. En el último ejemplo se ilustra que el primer argumento, la posición, 
no debe estar más alládel fi n de la cadena.
Debido a que substr devuelve un valor de tipo string, puede usarlo con el operador de con-
catenación (+) para copiar partes de cadenas y unirlas para formar nuevas cadenas. Las funciones 
DALE003.indd 104DALE003.indd 104 4/12/06 18:57:004/12/06 18:57:00
 www.FreeLibros.me

Continuar navegando