Domanda

Sto avendo un momento difficile la comprensione e quindi la gestione di matrici e indici manualmente in C.Questi sono i miei due classici approcci ma non sembra funzionare, come mantenere il loop quando la condizione è raggiunto:

#include<stdio.h>
#define MAX 255

int main(){

    int arr[MAX]={0};
    int idx=0;

    /* Approach #1 */

    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);

    while(arr[idx-1] != -1 && idx < MAX){
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;        
    }

    /* Approach #2 */

    do{
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;
    }while(arr[idx-1] != -1 && idx < MAX);

    // Main func continues here.

}

Qualsiasi consiglio sarebbe molto apprezzato!

Aggiornamento:

Ora funziona!grazie mille tutti voi, ragazzi, per i quali le risposte immediate.Questa è sicuramente una grande comunità, che mi aiuta un sacco.

È stato utile?

Soluzione

arr[idx] <= MAX

dovrebbe essere

idx < MAX

a meno che non si stia verificando l'elemento anziché l'indice.

Controlla sempre anche " next " elemento per -1 (arr [idx]! = -1) perché stai aumentando idx prima di verificare il tuo valore aggiunto.

quindi se tu avessi

arr[idx-1] != -1

staresti bene.

Altri suggerimenti

arr[idx] <= MAX

dovrebbe essere

idx <= MAX
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);
    idx++;        
}

Prima di tutto, si dovrebbe verificare se l'indice variabel idx è più piccolo di MAX (non minore di o uguale a).Vorresti andare out of bounds se l'indice è uguale a MAX.Un array con MAX = 10 ha valori di indice 0 e di cui 9, ma non 10.

In secondo luogo, si aggiunge il primo elemento per arr[0], si incrementa l'indice da 0 a 1, quindi si salta indietro di condizione e controllare se arr[1] == -1, il che non è.In modo da controllare invece che arr[idx-1] != -1.Si noti, tuttavia, che la prima volta che si ottiene il ciclo while, sarà effettivamente controllare arr[-1] != -1, che è anche fuori dei limiti.;) Quindi è necessario capire come risolvere questo.

a Roman M:

Prima di tutto, il ragazzo che ha posto la domanda ha appena iniziato un corso di programmazione e probabilmente non ha ancora imparato a conoscere i puntatori. In secondo luogo, ora hai a che fare sia con un contatore che con un puntatore. Non sono sicuro di vedere il vantaggio di farlo rispetto all'utilizzo di un indice come questo:

per (idx = 0; idx < MAX; ++ idx) {

scanf("%d", &arr[idx]);
if(arr[idx] == -1)
    break;

}

Utilizzando un ciclo for puoi eliminare la necessità del disordinato idx-1 codice di controllo:

/* Approach #3*/
int i;
int value;

for (i = 0; i < MAX; ++i)
{
  printf("Enter elements, -1 to finish:\n");
  scanf("%d", &value);
  if (value == -1) break;
  arr[i] = value;
}

Le matrici C iniziano a contare da 0.

Se si alloca un array di dimensioni MAX, l'accesso all'elemento su MAX sarebbe un errore. Cambia il loop in;

int arr[MAX];
for ( .... && idx < MAX )

Nel tuo primo ciclo while,

arr[idx] <= MAX

la riga dovrebbe leggere

idx <= MAX

Nel tuo secondo ciclo, stai incrementando idx prima del test - dovrebbe terminare con

} while ((arr[idx-1] != -1) && (idx-1 <= MAX));

Tendo anche a mettere tra parentesi tutte le condizioni interne solo per essere assolutamente certo che la precedenza sia corretta (da qui le parentesi extra sopra).

Andrei con qualcosa del genere.

Non devi preoccuparti dei limiti dell'array e di altre condizioni confuse.

int cnt = MAX;        // how many elements in the array, in this case MAX
int * p = &arr[0];    // p is a pointer to an integer and is initialize to the address of the first
                      // element of the array. So now *p is the same as arr[0] and p is same as &arr[0]

// iterate over all elements. stop when cnt == 0
while (cnt) {

    // do somthing
    scanf("%d", *p); // remember  that *p is same as arr[some index]
    if (*p == -1)    // inspect element to see what user entered
        break;

    cnt --;  // loop counter
    p++;     // incrementing p to point to next element in the array
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top