Errore?

Mikki0222
Ciao a tutti.
Sto riscontrando problemi con questo programma
La traccia è la seguente : scrivere una funzione che, data in ingresso un vettori di interi e due interi x e y restituisca un nuovo vettore degli elementi maggiori di x e minori di y e li ordini in senso crescente. Io ho fatto due file uno contenente il main e l'altro una funzione. Il codice compila, però quando lo vado ad eseguire non mi esce nulla (nel senso mi fa inserire la dimensione, gli elementi e poi non mi esce il nuovo vettore ordinato in senso crescente, non esce nulla).Quale può essere il problema?

#include <stdio.h>
#include <stdlib.h>
#define maxDim (100)
void vettore (int a[], int dimensione1, int b[], int x, int y, int*dimensione2);

int main (void) { 
   int a[maxDim];
   int b[maxDim];
   int index;
   int indice;
   int x;
   int y;
   int dimensione1;
   int dimensione2;
   
   //Inserimento delle dimensioni
   printf("Inserisci la dimensione dell'array (max%d): ", maxDim);
   scanf("%d", &dimensione1);
   
   printf("Inserisci il valore dell'intero x: ");
   scanf("%d", &x);
   
   printf("Inserisci il valore dell'intero y: ");
   scanf("%d", &y);
   
   //Controllo di allocazione statica
   if ((dimensione1 > 0) && (dimensione1 <= maxDim)) {
       //Lettura dell'array
       for (index = 0; index < dimensione1; index++) {
          printf("Inserisci il valore %d-esimo:\n", index);
          scanf("%d", &a[index]);
       }
   
   //Chiamata della funzione
   vettore (a, dimensione1, b, x, y, &dimensione2);
   
   //Stampa del vettore
   if (dimensione2 > 0) {
      for (indice = 0; indice < dimensione2; indice++) {
      printf("b[%d] = %d\n", indice, b[indice]);
      }
   }
 } else {
   printf("Errore: la dimensione inserita e' maggiore di %d", maxDim);
 }
return 0;
}
     




funzione
#include <stdio.h>
#include <stdlib.h>
#define maxDim (100)

void vettore (int a[], int dimensione1, int b[], int x, int y, int* dimensione2) {
  int index;
  int indice;
  int alto;
  int swap;

  //Calcolo degli elementi compresi tra x e y
  (*dimensione2) = 0;
  indice = 0;
  
  if(x < a[index] < y) {
  b[indice] = a[index];
  indice++;
  (*dimensione2++);
  }
  
  //Ordinamento dell'array (bubble sort)
  alto = *dimensione2;
  while (alto > 0) {
      for (indice = 0; indice < (*dimensione2) -1; indice++) {
          if (b[indice] > b[indice+1]) {
              swap = b[indice];
              b[indice] = b[indice+1];
              b[indice+1] = swap;
          }
      }
  alto--;
  }
}

Risposte
vict85
Un problema è che
if (x < a[index] < y)

non fa quel che pensi. Insomma, il c++ non definisce l'operatore ternario \(\displaystyle a < x < b \) (l'operatore inclusione). Devi scrivere esplicitamente le due condizioni: [inline]x < a[index] && a[index] < y[/inline]

Inoltre la riga successiva avrebbe dovuto essere [inline]b[*dimensione2] = a[index];[/inline]

Mikki0222
Ciao ho corretto il primo errore ma lo stesso non va.. Scusa se ti pongo la domanda ma perché dovrebbe essere
 b[*dimensione2] = a[index]
?

Quinzio
Eh, devi mettere un "for loop" per iterare su tutto l'array, altrimenti non hai speranze che funzioni.

for (index=0; index<dimensione1; index++) { 
  if((x < a[index]) && (a[index] < y)) {
    b[indice] = a[index];
    indice++;
    (*dimensione2++);
  }
}

Quinzio
"Mikii02":
ma perché dovrebbe essere
 b[*dimensione2] = a[index]
?

Va bene cosi' com'e' nel tuo codice.

vict85
"Quinzio":
Eh, devi mettere un "for loop" per iterare su tutto l'array, altrimenti non hai speranze che funzioni.

for (index=0; index<dimensione1; index++) { 
  if((x < a[index]) && (a[index] < y)) {
    b[indice] = a[index];
    indice++;
    (*dimensione2++);
  }
}


Questo codice legge sia \(a\) che \(b\) fuori dal limiti dell'array, e persino salta elementi.

Quello corretto è:
for (index=0; index<dimensione1; index++) { 
  if((x < a[index]) && (a[index] < y)) {
    b[*dimensione2] = a[index];
    (*dimensione2++);
  }
}

Quinzio
Va beh, ho capito...
ho solo modificato questo
(*dimensione2++);

in questo
(*dimensione2)++;

il post-increment ha la precedenza.



https://onlinegdb.com/OKXYBSYl5



Inserisci la dimensione dell'array (max100): 8
Inserisci il valore dell'intero x: 2
Inserisci il valore dell'intero y: 5
Inserisci il valore 0-esimo:
8
Inserisci il valore 1-esimo:
7
Inserisci il valore 2-esimo:
6
Inserisci il valore 3-esimo:
5
Inserisci il valore 4-esimo:
4
Inserisci il valore 5-esimo:
3
Inserisci il valore 6-esimo:
2
Inserisci il valore 7-esimo:
1
b[0] = 3
b[1] = 4


...Program finished with exit code 0
Press ENTER to exit console.

Mikki0222
Grazie davvero tante per avermi aiutata a risolvere il problema, ora mi restituisce il vettore come richiesto!!
Grazie ancora!!!!!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.