Amazon.com Widgets Chapter 7, Couple Of Questions
Welcome, Guest. Please login or register.
Did you miss your activation email?
June 20, 2013, 02:09:40 AM
Home Help Search chat Login Register   
News: Read this please.The Great Kangaroo Escape Looking for reviews of the 4th ed on Amazon!   Twitter:  @skochan
                     

+  Official Forum for Programming in Objective-C (the iPhone Programming Language) - Stephen Kochan
|-+  Old Stuff
| |-+  Chapter Study
| | |-+  Chapter 7 - More on Classes
| | | |-+  Chapter 7, Couple Of Questions
Pages: [1]   Go Down
Print
Author Topic: Chapter 7, Couple Of Questions  (Read 1040 times)
ariel_mirahy
Newbie
*
Posts: 11


Email




« on: April 11, 2009, 11:17:20 AM »

1st: Can you translate a sentence that takes an argument into a DOT NOTATION sentence?, for example
Code: (Objective-C)
 frac3 = [frac1 sumar: frac2]; 
into something like
Code: (Objective-C)
 frac3 = frac1.sumar: frac2;

2nd: In the FractionTest, my method 'add' (sumar) is not calling another function 'reduce' (reducir) when I use the keyword SELF, but it does work when I substitute it with the word frac3 (which is my instace class name), why isn't it working with the self keyword?

Here is my code:

Fraction.h
Code: (Objective-C)
#import <Foundation/Foundation.h>


@interface Fraccion : NSObject
{
int numerador, denominador; // Variables de instancia de la clase
}

// Si sintetizamos la variables se crean los 'getters' y 'setters' automaticamente y ya podemos usar el 'DOT NOTATION', los getters creados se llaman como su mismo nombre 'numerador' y 'denominador', cuando queramos llamarlos simplemente con ese nombre, mientras que los getters creados se crean con el nombre de 'set' + el numbre de tu variable con la primera letra en MAYUSCULA 'setNumerador' y 'setDenominador'
@property int numerador, denominador; // Las vamos a sintetizar, para eso se necesitan 2 pasos '@property' y '@synthezise', el '@synthezise' se declara en la fase de implementacion

// Declaramos los metodos de la clase
-(void) imprimir;
-(void) alistarNumerador: (int) n yDenominador: (int) d; // Ya no es necesario, es simplemente para hacerlo todo en un mismo renglon
-(void) reducir;
-(Fraccion *) sumar: (Fraccion *) f; // Este metodo te regresa una instancia de la clase y recibe como argumento a otra instancia de la misma clase
-(double) convertirAEntero;

@end


Fraction.m
Code: (Objective-C)

#import "Fraction.h" // Importamos el nombre de nuestra clase entre comillas


@implementation Fraccion

@synthesize numerador, denominador; // Esta es la fase en la cual sintetizamos nuestras variables de instancia, en este paso a diferencia de @property, omitimos la palabra 'int', 'float', 'double', 'char', etc.


// Los metodos declarados en la fase anterior '@interface' seran definidos en esta fase '@implementation'
-(void) imprimir
{
NSLog(@"\n\n%i / %i\n\n", numerador, denominador);
}

-(void) alistarNumerador: (int) n yDenominador: (int) d // Ya no es necesario, es simplemente para hacerlo todo en un mismo renglon
{
numerador = n;
denominador = d;
}

-(void) reducir
{
int n = numerador, d = denominador, temp;

while (d)
{
temp = n % d;
n = d;
d = temp;
}

numerador /= n;
denominador /= n;
}

-(Fraccion *) sumar: (Fraccion *) f // Este metodo te regresa una instancia de la clase y recibe como argumento a otra instancia de la misma clase
//Para sumar 2 fracciones: a/b + c/d = ((a*d) + (b*d)) / (b*d)
{
Fraccion *frac3 = [[Fraccion alloc] init]; // Le asignamos un espacio en la memoria, por lo cual se debera expulsar en el programa principal

int resDenominador, resNumerador;

resNumerador = (numerador * f.denominador) + (denominador * f.numerador); // = (numerador * [f denominador]) + (denominador * [f numerador]);
resDenominador = denominador * f.denominador; // = denominador * [f denominador];

frac3.numerador = resNumerador; // = [frac3 numerador] = resNumerador;
frac3.denominador = resDenominador; // = [frac3 numerador] = resDenominador;

self.reducir; // = [self reducir]; = en ESTE CASO a frac3.reducir; o [frac3 reducir];
// self en ESTE CASO = frac3
//frac3.reducir;

return frac3;
}

-(double) convertirAEntero
{
if (denominador)
{
return (double) numerador / denominador;
} else {
return 1.0;
}
}

@end


FractionTest.m
Code: (Objective-C)
#import "Fraction.h" // Importamos la clase, siempre importamos el archivo '.h'

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Creamos nuevos objetos con su nombre de instancia
Fraccion *frac1 = [[Fraccion alloc] init];
Fraccion *frac2 = [[Fraccion alloc] init];
Fraccion *frac3; // A este objeto le damos nombre de instancia, pero no lo creamos, porque se crea en el metodo de la clase 'sumar', pero somos responsables de darle un nombre de instancia en nuestro programa principal y de hacerle un 'release'

frac1.numerador = 1;
frac1.denominador = 4;
// Los ultimos 2 renglones = [frac1 alistarNumerador: 1 yDenominador: 4];

[frac2 alistarNumerador: 1 yDenominador: 2]; // Ya no es necesario, es simplemente para hacerlo todo en un mismo renglon
/* El ultimo renglon = a los siguientes 2 renglones
frac2.numerador = 1;
frac2.denominador = 2;
*/

frac1.imprimir; // = [frac1 imprimir];
NSLog(@"\n\n+\n\n");
[frac2 imprimir]; // = frac2.imprimir;
NSLog(@"\n\n=\n\n");

frac3 = [frac1 sumar: frac2];
frac3.imprimir; // = [frac3 imprimir];
[[frac1 sumar: frac2] imprimir];
frac1.imprimir;

[frac1 release]; // = frac1.release;
frac2.release; // = [frac2 release];
frac3.release; // Aunque no hayamos asignado un espacio en la memoria para frac3 en el programa principal, lo creamos en el metodo sumar, por lo cual se le debe hacer el 'release' (desasignarle el espacio en la memoria)

    [pool drain];
    return 0;
}
« Last Edit: April 11, 2009, 11:26:04 AM by skochan » Logged
skochan
Administrator
Hero Member
*****
Posts: 3109







« Reply #1 on: April 11, 2009, 11:42:18 AM »

Hi,

I'm enjoying seeing all these code postings in different languages!  Smiley

To answer your questions:

1st:  No, you can't do that.
2nd: You want to reduce frac3--which is the result of the operation.  self is the receiver of the message, which is not the fraction you want to reduce.

Cheers,

Steve Kochan
Logged
ariel_mirahy
Newbie
*
Posts: 11


Email




« Reply #2 on: April 11, 2009, 11:52:31 AM »


Thanks Steve,

I'm enjoying your book as well!.
Logged
Pages: [1]   Go Up
Print
Jump to:  



Login with username, password and session length

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC Valid XHTML 1.0! Valid CSS!
Entire forum contents (c) 2009 classroomM.com. All rights reserved.