Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Variabili booleane e array...
Forum - C/C++ - Variabili booleane e array...

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 16:46
Domenica, 27/12/2009
Ciao a tutti, volevo chiedere un aiuto per quanto riguarda questo codice. La traccia dell'esercizio è questa:

Codice sorgente - presumibilmente C++

  1. /*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.*/
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5.  
  6. const int size=50;
  7. typedef int vettore[size];
  8.  
  9. int leggidimensione();
  10. void leggivettore(vettore, int);
  11. bool controllovettore(vettore, vettore, int, int, int, int);
  12. void stampa(int, int, int);
  13.  
  14.  
  15. main()
  16. {
  17.       int n, p, q, r; vettore x, y;
  18.      
  19.       n=leggidimensione();
  20.      
  21.       printf("\n\n Il vettore x ha le seguenti componenti:");
  22.      
  23.       leggivettore(x, n);
  24.      
  25.       printf("\n\n Il vettore y ha le seguenti componenti");
  26.      
  27.       leggivettore(y, n);
  28.      
  29.       controllovettore(x, y, n, p, q, r);
  30.      
  31.       stampa(p, q, r);
  32.      
  33.       system("PAUSE");
  34.       return 0;
  35. }
  36.  
  37.  
  38. int leggidimensione()
  39. {
  40.     int a;
  41.    
  42.     do
  43.       {
  44.           printf("\n\n Quante componenti hanno i vettori x e y?   n=");
  45.           scanf("%d", &a);
  46.       }
  47.     while(a>size);
  48.    
  49.     return a;
  50. }
  51.  
  52.  
  53. void leggivettore(vettore A, int n)
  54. {
  55.      for(int i=1; i<=n; i++)
  56.              {
  57.                   printf("\n Inserire la componente %d del vettore:", i);
  58.                   scanf("%d", &A[i]);
  59.              }
  60.      return;
  61. }
  62.  
  63. bool controllovettore(vettore x, vettore y, int n, int p, int q, int r)
  64. {
  65.    for(int i=1; i<=n; i++)
  66.            {
  67.                 if(x[i]<y[i])    return(p==1);
  68.                
  69.                 else if(x[i]>y[i])       return(q==1);
  70.                
  71.                 else if(x[i]==y[i])        return(r==1);
  72.            }
  73. }
  74.  
  75.  
  76. void stampa(int p, int q, int r)
  77. {
  78.      if(p==1) printf("\n\n Il vettore x e' minore del vettore y\n\n");
  79.      
  80.      else if(q==1)  printf("\n\n Il vettore x e' maggiore del vettore y\n\n");
  81.      
  82.      else if(r==1)  printf("\n\n I vettori x e y sono uguali\n\n");
  83.      
  84.      return;    
  85. }



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



PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1057
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 17:16
Domenica, 27/12/2009
è 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:

Codice sorgente - presumibilmente C++

  1. if (x[1] < y[1] ){
  2.                 for (int i = 1; i <=n; i++){
  3.                         if(x[i]>=y[i])
  4.                                 return 0;
  5.                 }
  6.         return 1;
  7.         }
  8.         else
  9.         if (x[1] > y[1]){
  10.                 for (int i = 1; i <=n; i++){
  11.                         if(x[i]<=y[i])
  12.                                 return 0;
  13.                 }
  14.                 return -1;
  15.         }
  16.         else
  17.                 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 il 27/12/2009 alle 17:31


ti piacciono gli indovinelli e gli enigmi? visita http://www.moscio88.altervista.org/gioco
e vedi quanto impieghi ad arrivare al sessantesimo livello!
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:45
Domenica, 27/12/2009
Testo quotato

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:

Codice sorgente - presumibilmente C++

  1. if (x[1] < y[1] ){
  2.                 for (int i = 1; i <=n; i++){
  3.                         if(x[i]>=y[i])
  4.                                 return 0; *
  5.                 }
  6.         return 1; *
  7.         }
  8.         else
  9.         if (x[1] > y[1]){
  10.                 for (int i = 1; i <=n; i++){
  11.                         if(x[i]<=y[i])
  12.                                 return 0; *
  13.                 }
  14.                 return -1; *
  15.         }
  16.         else
  17.                 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.




PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1057
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 18:28
Domenica, 27/12/2009
Testo quotato


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 il 27/12/2009 alle 18:30


ti piacciono gli indovinelli e gli enigmi? visita http://www.moscio88.altervista.org/gioco
e vedi quanto impieghi ad arrivare al sessantesimo livello!
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:55
Domenica, 27/12/2009
Anonimo ha ragione!

8-| Non ci avevo proprio fatto caso!


PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1057
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 19:06
Domenica, 27/12/2009
questo cmq dovrebbe essere il programma completo...

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. const int size=50;
  5. typedef int vettore[size];
  6.  
  7. int leggidimensione();
  8. void leggivettore(vettore, int);
  9. int controllovettore(vettore, vettore, int);
  10. void stampa(int);
  11.  
  12.  
  13. main()
  14. {
  15.       int n, p; vettore x, y;
  16.      
  17.       n=leggidimensione();
  18.      
  19.       printf("\n\n Il vettore x ha le seguenti componenti:");
  20.      
  21.       leggivettore(x, n);
  22.      
  23.       printf("\n\n Il vettore y ha le seguenti componenti");
  24.      
  25.       leggivettore(y, n);
  26.      
  27.       p = controllovettore(x, y, n);
  28.      
  29.          
  30.           stampa(p);
  31.      
  32.       system("PAUSE");
  33.  
  34.  
  35.       return 0;
  36. }
  37.  
  38.  
  39. int leggidimensione()
  40. {
  41.     int a;
  42.    
  43.     do
  44.       {
  45.           printf("\n\n Quante componenti hanno i vettori x e y?   n=");
  46.           scanf("%d", &a);
  47.       }
  48.     while(a>size);
  49.    
  50.     return a;
  51. }
  52.  
  53.  
  54. void leggivettore(vettore A, int n)
  55. {
  56.      for(int i=1; i<=n; i++)
  57.              {
  58.                   printf("\n Inserire la componente %d del vettore:", i);
  59.                   scanf("%d", &A[i]);
  60.              }
  61.      return;
  62. }
  63.  
  64. int controllovettore(vettore x, vettore y, int n)
  65. {
  66.         if (x[1] < y[1] ){
  67.                 for (int i = 1; i <=n; i++){
  68.                         if(x[i]>=y[i])
  69.                                 return 0;
  70.                 }
  71.         return 1;
  72.         }
  73.         else
  74.         if (x[1] > y[1]){
  75.                 for (int i = 1; i <=n; i++){
  76.                         if(x[i]<=y[i])
  77.                                 return 0;
  78.                 }
  79.                 return -1;
  80.         }
  81.         else
  82.                 return 0;
  83. }
  84.  
  85.  
  86. void stampa(int p)
  87. {
  88.      if (p == -1)
  89.                   printf("\n\n x maggiore y");
  90.           else
  91.           if (p == 1)
  92.                   printf("\n\n x minore y");
  93.           else
  94.                 printf("\n\n ne maggiore ne minore");
  95.  
  96.            
  97. }



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 il 27/12/2009 alle 19:07


ti piacciono gli indovinelli e gli enigmi? visita http://www.moscio88.altervista.org/gioco
e vedi quanto impieghi ad arrivare al sessantesimo livello!
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:09
Domenica, 27/12/2009
manca solamente il caso in cui i due vettori siano uguali identicamente come chiesto dalla traccia:

Codice sorgente - presumibilmente C++

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



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

PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1057
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 20:13
Domenica, 27/12/2009
Testo quotato

Postato originariamente da Riuzaki:

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

Codice sorgente - presumibilmente C++

  1. if (x[1] == y[1] ){
  2.         for (int i = 1; i <=n; i++){
  3.             if(x[i]!=y[i])
  4.                 return 0;
  5.         }
  6.     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 il 27/12/2009 alle 20:14


ti piacciono gli indovinelli e gli enigmi? visita http://www.moscio88.altervista.org/gioco
e vedi quanto impieghi ad arrivare al sessantesimo livello!
PM Quote
Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 20:50
Domenica, 27/12/2009
grazie mille per il codice però mi è statao chiesto di fare questo esercizio dichiarando p, q, r e stampare quindi in base al valore di queste. come faccio in base al mio vecchio codice a non perdere il lavoro fatto dalla funzione booleana?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo