Oppure

Loading
27/12/09 15:46
Puffetta
Ciao a tutti, volevo chiedere un aiuto per quanto riguarda questo codice. La traccia dell'esercizio è questa:

/*Dati due vettori x e y ad n componenti, diremo che x > y se risulta essere xi>yi per ogni i= 1; 2;...; n, e analogamente diremo che x<y se risulta essere xi<yi per ogni i=1;2;...;n. Scrivere un programma C++ che acquisisce da tastiera un intero positivo n, due vettori x ed y ad n componenti e successivamente stabilisce se x > y, se x < y, se x = y o se non vale nessuna delle precedenti condizioni.*/

#include<stdio.h>
#include<stdlib.h>

const int size=50;
typedef int vettore[size];

int leggidimensione();
void leggivettore(vettore, int);
bool controllovettore(vettore, vettore, int, int, int, int);
void stampa(int, int, int);


main()
{
      int n, p, q, r; vettore x, y;
      
      n=leggidimensione();
      
      printf("\n\n Il vettore x ha le seguenti componenti:");
      
      leggivettore(x, n);
      
      printf("\n\n Il vettore y ha le seguenti componenti");
      
      leggivettore(y, n);
      
      controllovettore(x, y, n, p, q, r);
      
      stampa(p, q, r);
      
      system("PAUSE");
      return 0;
}


int leggidimensione()
{
    int a;
    
    do
      {
          printf("\n\n Quante componenti hanno i vettori x e y?   n=");
          scanf("%d", &a);
      }
    while(a>size);
    
    return a;
}


void leggivettore(vettore A, int n)
{
     for(int i=1; i<=n; i++)
             {
                  printf("\n Inserire la componente %d del vettore:", i);
                  scanf("%d", &A[i]);
             }
     return;
}

bool controllovettore(vettore x, vettore y, int n, int p, int q, int r)
{
   for(int i=1; i<=n; i++)
           {
                if(x[i]<y[i])    return(p==1);
                
                else if(x[i]>y[i])       return(q==1);
                
                else if(x[i]==y[i])        return(r==1);
           }
}


void stampa(int p, int q, int r)
{
     if(p==1) printf("\n\n Il vettore x e' minore del vettore y\n\n");
     
     else if(q==1)  printf("\n\n Il vettore x e' maggiore del vettore y\n\n");
     
     else if(r==1)  printf("\n\n I vettori x e y sono uguali\n\n");
     
     return;    
}


Cos'è che non va in questo codice? ho capito che il problema è nella funzione di stampa ma non riesco a capire come risolvere... C'è qualcuno che mi potrebbe aiutare?


grazie mille


aaa
27/12/09 16:16
Anonymous
è sbagliato l'algoritmo dentro a "controlloVettore"
poi non capisco perché gli passi le tre variabili p q r...

che tra l'altro poi ciascun risultato che questa funzione ti restituisce tu lo butti via perché dentro al main chiami la funzione senza assegnarla a nessuna variabile... quindi è come se quel controllo non lo fa mai... (in realtà lo fa ma lo butti via subito appena eseguito)


cmq secondo me l'algoritmo dentro a questa funzione dovrebbe esser cosi:

prima di tutto gli passi solamente i due vettori e la lunghezza

poi fai partire un ciclo for più o meno cosi:

if (x[1] < y[1] ){
		for (int i = 1; i <=n; i++){
			if(x[i]>=y[i])
				return 0;
		}
	return 1;
	}
	else
	if (x[1] > y[1]){
		for (int i = 1; i <=n; i++){
			if(x[i]<=y[i])
				return 0;
		}
		return -1;
	}
	else
		return 0; 




cosi sai che se restituisce -1 allora significa che x è minore di y, se restituisce 1 sai che x è maggiore e se restituisce 0 significa che non è nessuno dei due...


quindi dentro al main dovrai fare un if che controlla questi tre casi e stampa a schermo la risposta
Ultima modifica effettuata da Anonymous 27/12/09 16:31
aaa
27/12/09 16:45
Postato originariamente da Anonymous:

è sbagliato l'algoritmo dentro a "controlloVettore"
poi non capisco perché gli passi le tre variabili p q r...

che tra l'altro poi ciascun risultato che questa funzione ti restituisce tu lo butti via perché dentro al main chiami la funzione senza assegnarla a nessuna variabile... quindi è come se quel controllo non lo fa mai... (in realtà lo fa ma lo butti via subito appena eseguito)


cmq secondo me l'algoritmo dentro a questa funzione dovrebbe esser cosi:

prima di tutto gli passi solamente i due vettori e la lunghezza

poi fai partire un ciclo for più o meno cosi:

if (x[1] < y[1] ){
		for (int i = 1; i <=n; i++){
			if(x[i]>=y[i])
				return 0; *
		}
	return 1; *
	}
	else
	if (x[1] > y[1]){
		for (int i = 1; i <=n; i++){
			if(x[i]<=y[i])
				return 0; *
		}
		return -1; *
	}
	else
		return 0; * 




cosi sai che se restituisce -1 allora significa che x è minore di y, se restituisce 1 sai che x è maggiore e se restituisce 0 significa che non è nessuno dei due...


quindi dentro al main dovrai fare un if che controlla questi tre casi e stampa a schermo la risposta



In realtà la funzione non esegue tutti i controlli sull' array, siccome quando incontra il comando return ( vedi asterischi ) essa termina bruscamente.

In questo caso è necessario salvare il risultato parziale su una variabile temporanea.



27/12/09 17:28
Anonymous
In realtà la funzione non esegue tutti i controlli sull' array, siccome quando incontra il comando return ( vedi asterischi ) essa termina bruscamente.

assolutamente no...


il primo return fa uscire dal ciclo appena incontra una anomalia perché incontrata la prima è inutile coontinuare a fare le scansioni quando tanto sai già che il risultato sarà false.... e da come risultato 0 per far capire che non è ne maggiore ne minore

il secondo return viene eseguito soltanto se tutti gli elementi del primo vettore sono minori dei corrispondenti elementi del secondo vettore

il terzo return è come il primo
e il quarto return è come il secondo, solo che viene eseguito solo se tutti gli elementi del primo sono minori dei corrispettivi elementi del secondo

il quinto return viene eseguito solo nell'unico caso in cui il primo elemento di entrambi i vettori sono uguali... e quindi segna anomalia... cioè return 0
Ultima modifica effettuata da Anonymous 27/12/09 17:30
aaa
27/12/09 17:55
Anonimo ha ragione!

8-| Non ci avevo proprio fatto caso!

27/12/09 18:06
Anonymous
questo cmq dovrebbe essere il programma completo...

#include<stdio.h>
#include<stdlib.h>

const int size=50;
typedef int vettore[size];

int leggidimensione();
void leggivettore(vettore, int);
int controllovettore(vettore, vettore, int);
void stampa(int);


main()
{
      int n, p; vettore x, y;
      
      n=leggidimensione();
      
      printf("\n\n Il vettore x ha le seguenti componenti:");
      
      leggivettore(x, n);
      
      printf("\n\n Il vettore y ha le seguenti componenti");
      
      leggivettore(y, n);
      
      p = controllovettore(x, y, n);
      
	  
	  stampa(p);
      
      system("PAUSE");


      return 0;
}


int leggidimensione()
{
    int a;
    
    do
      {
          printf("\n\n Quante componenti hanno i vettori x e y?   n=");
          scanf("%d", &a);
      }
    while(a>size);
    
    return a;
}


void leggivettore(vettore A, int n)
{
     for(int i=1; i<=n; i++)
             {
                  printf("\n Inserire la componente %d del vettore:", i);
                  scanf("%d", &A[i]);
             }
     return;
}

int controllovettore(vettore x, vettore y, int n)
{
	if (x[1] < y[1] ){
		for (int i = 1; i <=n; i++){
			if(x[i]>=y[i])
				return 0;
		}
	return 1;
	}
	else
	if (x[1] > y[1]){
		for (int i = 1; i <=n; i++){
			if(x[i]<=y[i])
				return 0;
		}
		return -1;
	}
	else
		return 0; 
}


void stampa(int p)
{
     if (p == -1)
		  printf("\n\n x maggiore y");
	  else
	  if (p == 1)
		  printf("\n\n x minore y");
	  else
		printf("\n\n ne maggiore ne minore");
  
	    
} 


le modifiche apportate sono state fatte sulla procedura stampa che è stata anche ridefinita togliendo le variabili inutili p q r
e poi anche la funzione controllavettore che da boolean l'ho fatta diventare di tipo intero (dato che ci sono 3 casi possibili di restituzione e non solo 2) oltre ad aver tolto le variabili inutili anche qui...
Ultima modifica effettuata da Anonymous 27/12/09 18:07
aaa
27/12/09 19:09
manca solamente il caso in cui i due vettori siano uguali identicamente come chiesto dalla traccia:

 if (x[1] == y[1] ){ 
        for (int i = 1; i <=n; i++){ 
            if(x[i]!=y[i]) 
                return 0; 
        } 
    return 2;


cosi c'è anche questa eventualità che puoi inserire nella funzione controlla...:)
27/12/09 19:13
Anonymous
Postato originariamente da Riuzaki:

manca solamente il caso in cui i due vettori siano uguali identicamente come chiesto dalla traccia:

 if (x[1] == y[1] ){ 
        for (int i = 1; i <=n; i++){ 
            if(x[i]!=y[i]) 
                return 0; 
        } 
    return 2;


cosi c'è anche questa eventualità che puoi inserire nella funzione controlla...:)


si giusto... non avevo letto che chiedeva anche di controllare se erano uguali..
Ultima modifica effettuata da Anonymous 27/12/09 19:14
aaa