Facultad de Ciencias Exactas, Ingeniera y Agrimensura
Departamento de Sistemas e Informtica
Escuela de Electrnica Informtica II Prctica 1: Arrays y punteros Contenido: Esta prctica est diseada para que el estudiante comience a utilizar el concepto de puntero, ntimamente relacionado con el de array. 1) Descubriendo punteros: analizar los resultados del ejemplo. #include <stdio.h> int main(void) { int i = 8, *pi=&i; long long l = 8, *pl=&l; float f = !".8f, *pf=&f; dou#le d=$%8.&&, *pd=&d; p'intf((va'ia#le int, tam.#)tes* +d ,tdi'.&i* +p ,tvalo'* +d,n(, si-eof(i), &i, i); p'intf((punte'o int, tam.#)tes= +d ,tdi'.&pi* +p ,tvalo'* +p,n(, si-eof(pi), &pi, pi); p'intf((va'ia#le long, tam.#)tes* +d ,tdi'.&l* +p ,tvalo'* +ld,n(, si-eof(l), &l, l); p'intf((punte'o long, tam.#)tes* +d ,tdi'.&pl* +p ,tvalo'* +p,n(, si-eof(pl), &pl, pl); p'intf((va'ia#le float, tam.#)tes* +d ,tdi'.&f* +p ,tvalo'* +.f,n(, si-eof(f), &f, f); p'intf((punte'o float, tam.#)tes* +d ,tdi'.&pf* +p ,tvalo'* +p,n(, si-eof(pf), &pf, pf); p'intf((va'ia#le dou#le, tam.#)tes* +d ,tdi'.&d* +p ,tvalo'* +."lf,n(, si-eof(d), &d, d); p'intf((punte'o dou#le, tam.#)tes* +d ,tdi'.&pd* +p ,tvalo'* +p,n(, si-eof(pd), &pd, pd); int vec.!!/; 00 linea de cam#ios vec.!/ = &&; p'intf((va'ia#le a''a), tam.#)tes* +d ,tdi'.&vec.!/* +p ,tvalo'* +d,n(, si-eof(vec.!/), &vec.!/, vec.!/); p'intf((punte'o a''a), tam.#)tes* +d ,tdi'.&vec* +p ,tvalo'* +p,n(, si-eof(vec), &vec, vec); 'etu'n !; 1 Verifique el tamao de cada tipo de variable y del puntero asociado. En 200 linea de cam#ios3 acer el si!uiente reemplazo: int *vec; vec= (int*)malloc(si-eof(int)*!!); "nalizar los resultados. 2) Escriba un pro!rama que defina las si!uientes variables: int i=4, 5./={,",6,&,4,$,%,8,7,!1; cha' 8 = 9a9, pal ./ =(te8to en c(; int *pi; cha' *pc; Informtica II Prctica 0 v. 2011 Pg 1 de 4 1 #ostrar la direcci$n de i y su valor. ! #ostrar los mismos valores a trav%s del puntero pi. " &ecorrer el vector j mostrando para cada elemento, su direcci$n y su valor. # &ecorra el vector accediendo a trav%s del puntero pi y usando l!ebra de punteros. $ &epita lo mismo con las variables char, el arre!lo y el puntero. '. (inalmente muestre la direcci$n donde se almacenan ambos punteros. )enere una salida del tipo: :o' ;a'ia#le* 9i9 ;alo'* 4 <i'ecci=n* 6>>4? :o' :unte'o* 9pi9 ;alo'* 4 <i'ecci=n* 6>>4? :o' ;a'ia#le* 95.!/9 ;alo'* <i'ecci=n* 6>>"? :o' :unte'o* 9 pi(=&5)@!9 ;alo'* <i'ecci=n* 6>>"? :o' ;a'ia#le* 95./9 ;alo'* " <i'ecci=n* 6>>6! :o' :unte'o* 9pi(=&5)@9 ;alo'* " <i'ecci=n* 6>>6! A :o' ;a'ia#le* 989 ;alo'* a <i'ecci=n* 6>>"6 :o' :unte'o* 9pc9 ;alo'* a <i'ecci=n* 6>>"6 :o' ;a'ia#le* 9pal.!/9 ;alo'* t <i'ecci=n* 6>>!? :o' :unte'o* 9pc(=&pal)@!9 ;alo'* t <i'ecci=n* 6>>!? :o' ;a'ia#le* 9pal./9 ;alo'* e <i'ecci=n* 6>>!< :o' :unte'o* 9 pc(=&pal)@9 ;alo'* e <i'ecci=n* 6>>!< A <i'ecci=n de *pi* 6>>!! <e *pc* 6>B>& 3) *rear un pro!rama que lea un n+mero determinado ,-.//0 de reales introducidos por teclado, los almacene en un vector para lue!o mostrarlos en orden inverso. 1ara recorrer el array deber usar aritm%tica de punteros en lu!ar de ndices del array. 4) Escribir una funci$n que tome como ar!umento un entero positivo entre . y 2 y retorne un puntero a cadena con el nombre del da de la semana correspondiente al ar!umento. 1robar dic3a funci$n. 5) Escribir una funci$n void que tome como ar!umentos: la cantidad de 4ilos de determinado producto adquirido por un cliente y el precio por 4ilo del mismo ,ambos n+meros flotantes05 la misma debe calcular el importe de la compra. El descuento efectuado a compras superiores a .//6 es del ./7, con lo cual la funci$n deber tambi%n calcular el nuevo monto, si es que corresponde el descuento. 8sar ar!umentos pasados como punteros, donde corresponda. 6) Escribir las funciones que operan sobre cadenas de caracteres. #include <stdio.h> #include <stdli#.h> t)pedef enum { CDEFG?FHDG, CIJFG?FHDG 1 ma)Kmin; int st'Ha'go(const cha' *o'igen); 00?antidad de ca'acte'es int st';acio(const cha' *o'igen); 00'eto'na si tiene al menos un ca'acte', ! en ot'o caso Informtica II Prctica 0 v. 2011 Pg 2 de 4 void st'?opia(cha' *destino, const cha' *o'igen); 00 ?opiado' void 'eve'se(cha' *st'ing);00inve'ti' una cadena void st'I-L(cha' *destino, const cha' *o'igen); 00 Gaca #lancos I-L. void st'<e'(cha' *destino, const cha' *o'igen); 00 Gaca #lancos <e'. void st'Dm#os(cha' *destino, const cha' *o'igen); 00 Gaca #lancos I-L. ) <e'. void st'Ca)Cin(cha' *destino, const cha' *o'igen, ma)Kmin m); 00 ?onvie'te Ca). Cin. int main(){ cha' *te8t =( Ge'a ?ie'to MM (; int la'go=st'Ha'go(te8t)@; cha' *'esult = (cha' *)malloc (la'go); if('esult == JFHH) 'etu'n N;00sino pudo 'ese'va' memo'ia pa'a 'esult p'intf((Ha cadena* (); puts(te8t); p'intf((Ge encuent'a* +s,n(,(st';acio(te8t) M (Jo vacia( * (;acia()); p'intf((Ha'go * +d,n(, st'Ha'go(te8t)); st'?opia('esult,te8t); p'intf((?opia * .+s/,n(, 'esult); st'I-L('esult,te8t); p'intf((Gin #lancos a la I-L*(); puts('esult); st'<e'('esult,te8t); p'intf((<e' * .+s/,n(, 'esult); st'Dm#os('esult,te8t); p'intf((Dm#os* .+s/, sin #lancos al p'incipio ni al final.,n(, 'esult); st'Ca)Cin('esult,te8t, CDEFG?FHDG); p'intf((Ca)usculas * .+s/,n(, 'esult); st'Ca)Cin('esult,te8t, CIJFG?FHDG); p'intf((Cinusculas * .+s/,n(, 'esult); 'etu'n !; 1 Salida: Ha cadena* Ge'a ?ie'to MM Ge encuent'a* Jo vacia Ha'go * "! ?opia * . Ge'a ?ie'to MM / Gin #lancos a la I-L*Ge'a ?ie'to MM <e' * . Ge'a ?ie'to MM/ Dm#os* .Ge'a ?ie'to MM/, sin #lancos al p'incipio ni al final. Ca)usculas * . GBOD ?IBOPQ MM / Cinusculas * . se'a cie'to MM / :'esione una tecla pa'a continua' . . . ) Escribir una funci$n que reciba como ar!umento un entero y lo convierta ,valor de retorno0 en una cadena de caracteres en su representaci$n decimal. 9dem para: representaci$n octal, 3e:adecimal y binaria ,!enere una funci$n por cada una de estas opciones0
Informtica II Prctica 0 v. 2011 Pg 3 de 4 !) ;e necesita contar las letras de un te:to in!resado. El te:to puede tener varias oraciones. *rear una rutina que almacene las letras y la cantidad de veces que aparecen. )enerar un informe con el detalle, en caso de no sean alfab%ticos o n+meros, mostrar su valor 3e:adecimal. Debe crear un vector de punteros que almacenen las frases y lue!o recorrerlo con un puntero de doble in<direcci$n. ") Escriba una funci$n que reciba como ar!umento un entero positivo ,n0 y que !enere en forma dinmica una matriz identidad de dimensi$n n. 1#)Escribir un pro!rama para calcular el determinante de una matriz: ;olicite la dimensi$n por teclado. ;olicite memoria para el almacenamiento. =n!rese por teclado los coeficientes con valores. Desarrolle una funci$n que realice el clculo. int dete'minanteKCat'i-(int tam, int **mat'i-); #ostrar por pantalla los ran!os de la memoria asi!nada para la matriz. Verificar los resultados. >ota: &ecordar que el determinante de una matriz es !1 1! !! 11 !! !1 1! 11 a a a a A a a a a = 1! !1 "" 11 !" "! 1" !! "1 "! !1 1" "1 !" 1! "" !! 11 "" "! "1 !" !! !1 1" 1! 11 a a a a a a a a a a a a a a a a a a a a a a a a a a a + + = *ompare las tres formas de resolver: #atriz con subndice, solo punteros y punteros con subndices. ,Esto es: en tiempo de escritura del pro!rama, cantidad de memoria ocupada y cantidad de operaciones para resolver el problema0. 11)1roducto escalar de #atriz: )enera una nueva matriz al que se le multiplica cada elemento por un valor ,escalar0: ;olicite el valor escalar y la dimensi$n de la matriz por teclado. ;olicite memoria para el almacenamiento. ?lene la matriz con valores aleatorios. Desarrolle una funci$n que realice el clculo clculo y devuelva un puntero a la nueva matriz. int ** p'oductoKBscala'KCat'i-(int fil, int col, int esc, int **mat'i-); Informtica II Prctica 0 v. 2011 Pg 4 de 4