Domanda

io riesco anche a questa rapida: Ho una domanda per l'iPhone OS 3.1.2, che ridurrà le frazioni. Ho 4 punti:

  1. Otop e oBottom:. Due UITextFields, sta per originalTop e originalBottom
  2. RTOP e rBottom: due UILabels, sta per reducedTop e reducedBottom
.

Ecco il codice che uso:

- (IBAction) ridurre {

int numerator = [[oTop text] intValue];
int denominator = [[oBottom text] intValue];
if (denominator > 0) {
    NSMutableArray *factors1 = [[NSMutableArray alloc] init];
    NSMutableArray *factors2 = [[NSMutableArray alloc] init];
    int factors1length;
    int factors2length;
    for (int i = 1; i < ceil(sqrt(numerator)); i ++) {
        [factors1 addObject:[NSString stringWithFormat:@"%@", i]];
        if (round(numerator / i) != numerator / i) {
            [factors1 removeLastObject];
        } else {
            factors1length ++;
        }
    }
    for (int i = factors1length; i <= 0; i --) {
        [factors1 addObject:[NSString stringWithFormat:@"%@", (numerator / [[factors1 objectAtIndex:i] intValue])]];
    } //End get numerator factors
    for (int i = 1; i < ceil(sqrt(denominator)); i ++) {
        [factors2 addObject:[NSString stringWithFormat:@"%@", i]];
        if (round(denominator / i) != denominator / i) {
            [factors2 removeLastObject];
        } else {
            factors2length ++;
        }
    }
    for (int i = factors2length; i <= 0; i --) {
        [factors2 addObject:[NSString stringWithFormat:@"%@", (denominator / [[factors2 objectAtIndex:i] intValue])]];
    } //End get denominator factors 
}

}

Mi dispiace per le linee di randagi. In ogni caso, qualcuno potrebbe dirmi che cosa sta succedendo? Quando lancio, digitare un numero in entrambi i campi di testo, maggiore di 0, e premere il pulsante "ridurre", l'applicazione si blocca. Si prega di aiuto,

HiGuy

EDIT:. Cambiato il 1 ° e 3 ° per i loop da (int i = 0 a (int i = 1

È stato utile?

Soluzione

appare come nel primo ciclo per-i, i inizia a 0 e divide da i (che è zero).

EDIT:. C'è stato un problema prima che la divisione per zero, che ha causato il crash iniziale e molti altri in seguito, nonché

  1. Nel primo ciclo, l'addObject viene fatto usando @ "% @", ma questo deve essere @ "% d" perché i è un numero intero non una stringa. Vedere String identificatori di formato .

  2. factors1length e factors2length hanno bisogno di essere inizializzato a zero altrimenti inizieranno con valori casuali che buttare fuori il resto del codice.

  3. L'addObject nel secondo ciclo ha bisogno di usare @ "% f" invece di @ "% @", perché si sta tentando di utilizzare un valore in virgola mobile c'è (numeratore / xxx ...). Tuttavia, ci sono problemi con l'approccio di memorizzare numeri nella propria matrice come stringhe. In primo luogo, si sta memorizzare alcuni come int e alcuni come galleggianti. Stick per un tipo. In secondo luogo, è meglio memorizzare i numeri come numeri piuttosto che la conversione a stringa e viceversa. È possibile memorizzare interi / galleggia in un NSMutableArray convertendoli a un oggetto NSNumber.

Se non l'hai già fatto, si prega di seguire il consiglio di cdespinosa e passo attraverso il codice di una riga alla volta nel debugger e vedere quali valori le variabili hanno e esattamente ciò che viene eseguito il codice.

Consiglio anche cercando di non mettere troppa logica in una sola riga. Ad esempio, la linea di addObject nel secondo ciclo sta facendo troppo rendendo difficile vedere il problema. Break it up dichiarando variabili locali per memorizzare i valori delle espressioni all'interno della linea.
Così, invece di questo:

[factors1 addObject:[NSString stringWithFormat:@"%@", (numerator / [[factors1 objectAtIndex:i] intValue])]];

scrivere in questo modo:

int iFactor = [[factors1 objectAtIndex:i] intValue];
float value = (numerator / iFactor);
NSString *newFactor = [NSString stringWithFormat:@"%@", value];
[factors1 addObject:newFactor];

In questo modo sarà più facile per eseguire il debug.

Altri suggerimenti

Si potrebbe voler guardare in algoritmo di Euclide per trovare il massimo comun divisore di due interi . E 'molto più veloce (e ancora più facile da codice) di factoring. Ci sono le implementazioni di esempio in questo articolo di Wikipedia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top