You are on page 1of 11

#include<iostream.

h> const int VECT=5; typedef int a[VECT];

oid

ectorial!a m"a n#$

int p[5]; for!int i=%;i<VECT;i&&#$ p[i]=m[i]'n[i]; cout<<p[i]<<endl;( ( oid main!#$ a ); a y; for!int i=%;i<VECT;i&&#$ cout<<*in+rese los elementos del primer ector*<<endl; cin>>)[i];( for! i=%;i<VECT;i&&#$ cout<<*in+rese los elementos del se+undo ector*<<endl; cin>>y[i];( ectorial!)"y#; ( ,-. /E 01102- E3 C&& 0rrays como par4metros. En C&&" para poder usar un par4metro de tipo array en una llamada a un su5pro+rama de5e ha5er un identificador 6ue desi+ne al tipo array" y el par4metro actual de5e ser una aria5le del mismo tipo 6ue el del par4metro formal. 7or e8emplo" si la funci9n *imprimir* ha de reci5ir un array de :% enteros" el aspecto del pro+rama 6ue la contiene seria as;< #include <stdli5.h> #include <iostream.h> const int =0>01102 = :%; typedef int Tarray [=0>01102]; oid imprimir !Tarray m# $ int 8; for !8 = %; 8 < =0>01102; 8&&# $ cout << *El elemento * << 8 << * tiene el alor < * << m[8] << endl; (

( oid main !# $ Tarray a; int i; for !i = %; i < =0>01102 & :; i&&# a[i] = i ' :% & i; imprimir !a#; ?? @lamada a su5pro+rama system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( El resultado de la e8ecuci9n de este pro+rama ser;a< El elemento % tiene el alor < % El elemento : tiene el alor < :: El elemento A tiene el alor < AA El elemento B tiene el alor < BB El elemento C tiene el alor < CC El elemento 5 tiene el alor < 55 El elemento D tiene el alor < DD El elemento E tiene el alor < EE El elemento F tiene el alor < FF El elemento G tiene el alor < GG 7resione una tecla para continuar . . . -in em5ar+o" aun6ue en el e8emplo anterior no usemos el cualificador HIJ de paso de par4metros por referencia en la definici9n de los par4metros formales" Kste es el mecanismo 6ue si+ue C&& a la hora de pasar arrays como par4metros. Ve4moslo el si+uiente e8emplo< #include <stdli5.h> #include <iostream.h> const int =0>01102 = B; typedef int Tarray [=0>01102]; oid cam5iar !Tarray )# $ int 8; for !8 = %; 8 < =0>01102; 8&&# )[8] '= :%; ( oid imprimir !Tarray m# $ int 8; for !8 = %; 8 < =0>01102; 8&&# $ cout << *El elemento * << 8 << * tiene el alor < * << m[8] << endl; ( ( oid main !# $ Tarray a = $:" A" B(; cout << *0ntes de llamar a cam5iar* << endl;

imprimir !a#; cam5iar !a#; cout << */espues de llamar a cam5iar* << endl; imprimir !a#; system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( El resultado de la e8ecuci9n del pro+rama anterior es< 0ntes de llamar a cam5iar El elemento % tiene el alor < : El elemento : tiene el alor < A El elemento A tiene el alor < B /espues de llamar a cam5iar El elemento % tiene el alor < :% El elemento : tiene el alor < A% El elemento A tiene el alor < B% 7resione una tecla para continuar . . . Como emos" el su5pro+rama ha modificado los par4metros reales 6ue se le han pasado. Ello es de5ido a la relaci9n e)istente entre los arrays y las direcciones de memoria 6ue ya se coment9 anteriormente. Este hecho repercute en el paso de par4metros cuando estos son arrays. En efecto" en C&& no se puede pasar un array por alor" ya 6ue C&& trasmite siempre por referencia las aria5les de array" y al pasar su nom5re no realiLa una copia del alor sino lo 6ue hace realmente es pasar su direcci9n !una referencia al par4metro real#. 0s;" en la instrucci9n 6ue in oca a una funci9n" se escri5e siempre el nom5re de la aria5le sin mas y en la ca5ecera de la funci9n in ocada se indica el tipo y nom5re del correspondiente par4metro formal. 7or todo ello es necesario e)tremar las precauciones a la hora de tra5a8ar con arrays y su5pro+ramas. .perador siLeof 7odemos +eneraliLar aun m4s el diseMo de su5pro+ramas con arrays si en eL de utiliLar la constante +lo5al 6ue indica la dimensi9n del array dentro del su5pro+rama usamos el operador siLeof. -inta)is< siLeof !nom5reNtipo# En donde nom5reNtipo es el nom5re de un tipo predefinido o un tipo definido mediante la sentencia typedef" sea simple o estructurado. Este operador de uel e el nOmero de 5ytes 6ue ocupa una aria5le del tipo 6ue se le indica en un compilador y ma6uina concreto. E8emplo<#include <stdli5.h> #include <iostream.h> const int =0>01102 = 5; typedef int Tentero; typedef int Tarray [=0>01102]; oid main !# $ cout << *char < * << siLeof !char# << endl;

siLeof !nom5reNtipo# cout << *5ool < * << siLeof !5ool# << endl; cout << *int < * << siLeof !int# << endl; cout << *Tentero < * << siLeof !Tentero# << endl; cout << *short int < * << siLeof !short int# << endl; cout << *lon+ int < * << siLeof !lon+ int# << endl; cout << *unsi+ned int < * << siLeof !lon+ int# << endl; cout << *float < * << siLeof !float# << endl; cout << *dou5le < * << siLeof !dou5le# << endl; cout << *Tarray < * << siLeof !Tarray# << endl; system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( @a e8ecuci9n de este pro+rama en C&& nos da el si+uiente resultado< char < : 5ool < : int < C Tentero < C short int < A lon+ int < C unsi+ned int < C float < C dou5le < F Tarray < A% 7resione cual6uier tecla para continuar . . . @a utilidad de este operador a la hora de diseMar su5pro+ramas con arrays es 6ue nos e ita el tener 6ue usar el nOmero o constante 6ue define la dimensi9n del array" pudiendo calcularlo din4micamente; aun6ue realmente este c4lculo es resuelto en tiempo de compilaci9n y por tanto no so5recar+a la e8ecuci9n del su5pro+rama. Esto permite construir su5pro+ramas m4s +enKricos. @a forma de usarlo es simplemente sustituir la constante 6ue indica la dimensi9n del array por la si+uiente e)presi9n constante< siLeof !tipoNarray# ? siLeof !tipoN5ase# Como siLeof!tipoNarray# nos da como resultado el nOmero de 5ytes 6ue ocupa una aria5le del tipoNarray" si di idimos ese alor por el nOmero de 5ytes 6ue ocupa cada componente !los cuales son de tipoN5ase# o5tendremos la dimensi9n del array. Veamos el e8emplo anterior de uso de su5pro+ramas aplicando los operadores siLeof dentro de los mismos. #include <stdli5.h> #include <iostream.h> const int =0>01102 = B; typedef int Tarray [=0>01102]; oid cam5iar !Tarray )# $ int 8;

for !8 = %; 8 < siLeof!Tarray# ? siLeof!int#; 8&&# siLeof !tipoNarray# ? siLeof !tipoN5ase# )[8] '= :%; ( oid imprimir !Tarray m# $ int 8; for !8 = %; 8 < siLeof!Tarray# ? siLeof!int#; 8&&# $ cout << *El elemento * << 8 << * tiene el alor < * << m[8] << endl; ( ( oid main !# $ Tarray a = $:" A" B(; cout << *0ntes de llamar a cam5iar* << endl; imprimir !a#; cam5iar !a#; cout << */espues de llamar a cam5iar* << endl; imprimir !a#; system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( Punciones y arrays. 0l i+ual 6ue podemos pasar arrays como par4metros" tam5iKn podr;amos pensar en usar tipos array como resultado de las funciones. 7or e8emplo" el si+uiente pro+rama< #include <stdli5.h> #include <iostream.h> const int =0>Q=. = :%; typedef int T ector [=0>Q=.]; T ector leeVector !# $ T ector ); int i; for !i = %; i < siLeof!T ector# ? siLeof!int#; i&&# $ cout << *Qn+resar )[* << i << *] = *; cin >> )[i]; ( return ); ( oid escri5eVector !T ector )# $ int i; for !i = %; i < siLeof!T ector# ? siLeof!int#; i&&# cout << *)[* << i << *] = * << ) [i] << endl; ( oid main !#

$ T ector ector; ector = leeVector!#; escri5eVector ! ector#; system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( 0l compilarlo se produce el si+uiente error de compilaci9n< *RleeVectorR declared as function returnin+ an array*. Claramente C&& no permite de ol er el alor de un array. 7or tanto no se de5en usar arrays como resultado de funciones. -i necesitamos de ol er un array" usaremos entonces un procedimiento con un par4metro pasado por referencia para el array !de hecho como imos anteriormente los par4metros de array siempre se pasan por referencia#" con lo 6ue el pro+rama anterior de5er;amos escri5irlo de la si+uiente manera< #include <stdli5.h> #include <iostream.h> const int =0>Q=. = :%; typedef int T ector [=0>Q=.]; oid leeVector !T ector I)# $ int i; for !i = %; i < siLeof!T ector# ? siLeof!int#; i&&# $ cout << *Qn+resar )[* << i << *] = *; cin >> )[i]; ( return ); ( oid escri5eVector !T ector )# $ int i; for !i = %; i < siLeof!T ector# ? siLeof!int#; i&&# cout << *)[* << i << *] = * << ) [i] << endl; ( oid main !# $ T ector ector; leeVector! ector#; escri5eVector ! ector#; system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( E8emplo :< Veamos un pro+rama e8emplo completo so5re el mane8o de arrays. ,n pal;ndromo es una frase 6ue !atendiendo s9lo a sus letras e i+norando los espacios" acentos" si+nos de

puntuaci9n y tipo de letra" mayOscula o minOscula# e)presa lo mismo le;da de iL6uierda a derecha 6ue de derecha a iL6uierda. 7or e8emplo< *da5ale arroL a la Lorra el a5ad*.-e necesita un pro+rama 6ue lea una frase de no m4s de :%% letras" terminada en un punto" y 6ue determine si es o no un pal;ndromo. 7ara ello usaremos un array con tipo 5ase char. ??SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSS ?? 7ro+rama e8emplo para la determinaci9n de si una frase es ?? un pal;ndromo. ??SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSS #include <stdli5.h> #include <iostream.h> const char TE1=Q30/.1 = R.R; const int =0>Q=. = :%%; typedef char Tfrase [=0>Q=.]; char a=ayuscula !char c# $if !!c >= RaR# II !c <= RLR## return char !int !c# S int!RaR# & int!R0R##; else return c; ( oid main ! # $ Tfrase frase; int i" 8; char car; cout << *Escri5a la frase" terminada por * << TE1=Q30/.1 << * < *; i = %; do $ cin >> car; ?? -e filtran todos los caracteres reco+idos 6ue no sean letras if !!!car>=R0R# II !car<=RTR## UU !!car>=RaR# II !car<=RLR### $ frase [i] = a=ayuscula !car#; i&&; ( ( Vhile !!car W= TE1=Q30/.1# II !i < =0>Q=.##; iSS; 8 = %; Vhile !!8 < i# II !frase [8] == frase [i]## $

8&&; iSS; ( if !8 >= i# cout << *Es palindromo* << endl; else cout << *3o es palindromo* << endl; system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( .5sKr ese la utiliLaci9n de los operadores de con ersi9n de tipo !castin+# para calcular la letra mayOscula correspondiente a una minOscula dentro de la funci9n a=ayuscula. @a e)presi9n *char !int !c# S int!RaR# & int!R0R##* es e6ui alente a la e)presi9n en 7seudo len+ua8e< *CX1 !.1/ !c# S .1/ !RaR# & .1/ !R0R#*. E8emplo A< 1ealiLar un pro+rama en C&& 6ue procese mediante su5pro+ramas un array de hasta :%% nOmeros reales realiLando las si+uientes tareas< a# @ectura del array. 5# Qmpresi9n en pantalla del array introducido. c# /eterminaci9n del nOmero menor del array. d# C4lculo de la suma de los elementos del array. e# C4lculo de la media de los alores del array. f# C4lculo de la arianLa de los alores del array. +# C4lculo de la des iaci9n t;pica de los alores del array. ??SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSS ?? 7ro+rama e8emplo de procesamiento de un ector de reales ??SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSS #include <stdli5.h> #include <iostream.h> #include <math.h> const int =0>Q=. = :%%; typedef dou5le T ector [=0>Q=.]; oid leeVector !T ector I)" int Itam# $ int i; cout << *Qn+resar el tamaMo del ector a procesar !ma)imo * << siLeof!T ector# ? siLeof!dou5le# << *#< *; cin >> tam; if !tam < %# tam = %; else if !tam > siLeof!T ector# ? siLeof!dou5le## tam = siLeof!T ector# ? siLeof!dou5le#;

for !i = %; i < tam; i&&# $ cout << *Qn+resar )[* << i << *] = *; cin >> )[i]; ( ( oid escri5eVector !T ector )" int tam# $ int i; for !i = %; i < tam; i&&# cout << *)[* << i << *] = * << ) [i] << endl; ( dou5le menorVector !T ector )" int tam# $ dou5le menor; int i; menor = ) [%]; for !i = :; i < tam; i&&# menor = !menor > ) [i]# Y ) [i] < menor; return menor; ( dou5le sumaVector !T ector )" int tam# $ dou5le suma; int i; suma = %.%; for !i = %; i < tam; i&&# suma &= ) [i]; return suma; ( dou5le mediaVector !T ector )" int tam# $ return sumaVector !)" tam# ? tam; ( dou5le arianLaVector !T ector )" int tam# $ dou5le suma" media; int i; suma = %.%; media = mediaVector !)" tam#; for !i = %; i < tam; i&&# suma &= poV !) [i] S media" A.%#; return suma ? tam; ( dou5le des iacionVector !T ector )" int tam# $ return s6rt !! arianLaVector !)" tam# ' tam# ? !tam S :##; ( oid main !# $ T ector ector;

int tamano; cout << *Qn+resar las componentes del ector* << endl; leeVector ! ector" tamano#; cout << *Vector introducido* << endl; escri5eVector ! ector" tamano#; cout << *Valor menor = * << menorVector ! ector" tamano# << endl; cout << *-umatorio = * << sumaVector ! ector" tamano# << endl; cout << *=edia = * << mediaVector ! ector" tamano# << endl; cout << *VarianLa = * << arianLaVector ! ector" tamano# << endl; cout << */es iacion = * << des iacionVector ! ector" tamano# << endl; system!*pause*#; ?? Espera 6ue se pulse una tecla para aca5ar ( E8ercicios. :. /iseMa un pro+rama C&& 6ue solicite dos ectores por teclado y calcule su producto escalar y su producto ectorial. A. Escri5e un pro+rama C&& 6ue lea una sucesi9n de :% nOmeros naturales" encuentre el alor m4)imo y lo imprima 8unto con el nOmero de eces 6ue aparece" y las posiciones en 6ue esto ocurre. El proceso se repite con el resto de la sucesi9n hasta 6ue no 6uede nin+On elemento por tratar. E8emplo de entrada< E :% :CB :% 5A :CB EA :% :CB E -alida +enerada< :CB aparece B eces" en posiciones B D G. ... E aparece A eces" en posiciones : :% B. /iseMa un pro+rama C&& para realiLar la con ersi9n de nOmeros en 5ase decimal entre % y BA%%% a 5ase he)adecimal. 7ara ello el al+oritmo tendr4 como< Z /atos de entrada< ,n nOmero entero positi o entre % y BA%%% cual6uiera dado por el usuario. El pro+rama de5er4 erificar 6ue el numero entrado cumple esas condiciones. Z /atos de salida< Qmpresi9n en pantalla de un array de caracteres 6ue conten+a el e6ui alente en 5ase he)adecimal del numero entrado. Este array de5er4 estar formado por un m4)imo de cuatro elementos !d;+itos# 6ue pueden ser cifras entre % y G y letras entre 0 y P. C. /iseMa un pro+rama C&& 6ue lea por teclado las

coordenadas en el plano de dos ectores y calcule el 4n+ulo en +rados 6ue forman esos dos ectores. 5. /adas las si+uientes definiciones de tipo< typedef char T ector [3]; typedef char T ector+ [A ' 3]; Z /iseMa una funci9n 6ue" dados dos ectores ordenados del tipo T ector como par4metros" de uel a otro ector ordenado de tipo T ector+ 6ue sea la meLcla de am5os. Z /iseMa una funci9n l9+ica 6ue dados dos ectores del tipo T ector" de uel a true si son i+uales y false en otro caso. 7ara este caso supondremos 6ue dos ectores son i+uales si contienen los mismos elementos y en el mismo orden relati o" suponiendo 6ue el primer elemento si+ue al Oltimo. 7or e8emplo" si la entrada fuera< [R0R" RCR" R/R" RPR" RER] [R/R" RPR" RER" R0R" RCR] la funci9n de ol er;a true. -uponer" adem4s" 6ue cada car4cter aparece a lo sumo una eL. Z @a moda de un array de caracteres es el car4cter del array 6ue se repite m4s frecuentemente. -i arios caracteres se repiten con la misma frecuencia m4)ima" entonces no hay moda. Escri5e un procedimiento 6ue acepte un ector de tipo T ector y de uel a la moda" o una indicaci9n de 6ue la moda no e)iste.

You might also like