Errore?

Messaggioda Mikii02 » 18/12/2021, 18:48

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?

Codice:
#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--;
  }
}
Mikii02
Starting Member
Starting Member
 
Messaggio: 9 di 26
Iscritto il: 05/11/2021, 20:43

Re: Errore?

Messaggioda vict85 » 18/12/2021, 20:14

Un problema è che
Codice:
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: x < a[index] && a[index] < y

Inoltre la riga successiva avrebbe dovuto essere b[*dimensione2] = a[index];
vict85
Moderatore
Moderatore
 
Messaggio: 10562 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Errore?

Messaggioda Mikii02 » 19/12/2021, 11:22

Ciao ho corretto il primo errore ma lo stesso non va.. Scusa se ti pongo la domanda ma perché dovrebbe essere
Codice:
 b[*dimensione2] = a[index]
?
Mikii02
Starting Member
Starting Member
 
Messaggio: 10 di 26
Iscritto il: 05/11/2021, 20:43

Re: Errore?

Messaggioda Quinzio » 19/12/2021, 12:51

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

Codice:
for (index=0; index<dimensione1; index++) {
  if((x < a[index]) && (a[index] < y)) {
    b[indice] = a[index];
    indice++;
    (*dimensione2++);
  }
}
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4741 di 10548
Iscritto il: 24/08/2010, 06:50

Re: Errore?

Messaggioda Quinzio » 19/12/2021, 12:53

Mikii02 ha scritto: ma perché dovrebbe essere
Codice:
 b[*dimensione2] = a[index]
?

Va bene cosi' com'e' nel tuo codice.
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4742 di 10548
Iscritto il: 24/08/2010, 06:50

Re: Errore?

Messaggioda vict85 » 19/12/2021, 13:45

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

Codice:
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 è:
Codice:
for (index=0; index<dimensione1; index++) {
  if((x < a[index]) && (a[index] < y)) {
    b[*dimensione2] = a[index];
    (*dimensione2++);
  }
}
vict85
Moderatore
Moderatore
 
Messaggio: 10563 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Errore?

Messaggioda Quinzio » 19/12/2021, 14:10

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

in questo
Codice:
(*dimensione2)++;

il post-increment ha la precedenza.



https://onlinegdb.com/OKXYBSYl5

Testo nascosto, fai click qui per vederlo
Codice:
#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;
}






#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;

  for (index = 0; index < dimensione1; index++)
    {
      if (x < a[index] && 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--;
    }
}



Codice:
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.
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4743 di 10548
Iscritto il: 24/08/2010, 06:50

Re: Errore?

Messaggioda Mikii02 » 19/12/2021, 15:28

Grazie davvero tante per avermi aiutata a risolvere il problema, ora mi restituisce il vettore come richiesto!!
Grazie ancora!!!!!
Mikii02
Starting Member
Starting Member
 
Messaggio: 11 di 26
Iscritto il: 05/11/2021, 20:43


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite