Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - mi potreste dare una mano??(vettore con stringhe)
Forum - C/C++ - mi potreste dare una mano??(vettore con stringhe)

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
sono alle prime armi (ho 11 anni e sto studiando il mio primo libro di C, siate clementi per i mille errori che ci saranno:rotfl:) e ho provato a scrivere questo programma ma non funziona:-?

Codice sorgente - presumibilmente C++

  1. /*programma per il calcolo di un termine incognito di una proporzione*/
  2. #include<stdio.h>
  3.  
  4. int calcX(int y,int z,int t); /*calcola primo termine*/
  5. int calcY(int x,int z,int t); /*calcola secondo termine*/
  6. int calcZ(int x,int y,int t); /*calcola terzo termine*/
  7. int calcT(int x,int y,int z); /*calcola quarto termine*/
  8.  
  9. int main() {
  10.    
  11.     int x;   /*primo termine*/
  12.     int y;   /*secondo termine*/
  13.     int z;   /*terzo termine*/
  14.     int t;   /*quarto termine*/
  15.     char vf; /*vero/falso*/
  16.     char string[] = {"Si", "si", "Vero", "vero", "Giusto", "giusto", "V", "v", "OK", "Ok", "ok"};
  17.    
  18.     do {
  19.     printf("Inserisci i termini(0 come termine incognito):\n");
  20.     scanf ("%d%d%d%d", &x, &y, &z, &t);
  21.     printf("%d:%d=%d:%d\tGiusto?", x, y, z, y);
  22.     scanf ("%c", &vf);
  23.     } while (vf != string)/*fine del comando do...while*/
  24.    
  25.     if( x = 0 ) {
  26.         calcolaX(y,z,t); } /*fine del ramo if*/
  27.         else
  28.         if( y = 0 ) {
  29.             calcolaY(x,z,t); } /*fine del ramo if*/
  30.             else
  31.             if ( z = 0 ) {
  32.                 calcolaZ(x,y,t); } /*fine del ramo if*/
  33.                 else
  34.                 if ( t = 0 ) {
  35.                    calcolaT(x,y,z); } /*fine del ramo if*/
  36.                    
  37.                    printf("%d:%d=%d:%d", x, y, z, t);
  38. } /*fine della funzione main*/
  39.  
  40. int calcX(int y,int z,int t) {
  41.     int x;
  42.     x = y * z / t;
  43.    
  44.     return x;
  45. } /*fine della funzione calcX*/
  46. int calcY(int x,int z,int t) {
  47.     int y;
  48.     y = x * t / z;
  49.    
  50.     return y;
  51.    
  52. } /*fine della funzione calcY*/
  53. int calcZ(int x,int y,int t) {
  54.     int z;
  55.     z = x * t / y;
  56.    
  57.     return z;
  58. } /*fine della funzione calcZ*/
  59. int calcT(int x,int y,int z) {
  60.     int t;
  61.     t = y * z / x;
  62.    
  63.     return t;
  64.    
  65. } /*fine della funzione calcT*/


Ultima modifica effettuata da il 11/03/2009 alle 19:26
PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 20:23
Mercoledì, 11/03/2009
Ci siamo passati tutti quindi tranquillo che non ti mangia nessuno :k:
Passiamo ora al tuo programma.
L'errore che ti viene segnalato, come probabilmente già saprai, è dovuto alla seguente riga

Codice sorgente - presumibilmente C/C++

  1. char string[] = {"Si", "si", "Vero", "vero", "Giusto", "giusto", "V", "v", "OK", "Ok", "ok"};



il problema è che una stringa è una vettore di caratteri, ma nel tuo caso tu dovresti scrivere un vettore di vettori, ossia una matrice.

Esempio :

Codice sorgente - presumibilmente C/C++

  1. char s[3][3] = {"A","ABC","CD"};



il risultato sarebbe

Matrice 3x3

   |0|1|2|
|0| A
|1| A B C
|2| C D

Come puoi vedere il risultato prodotto è quello che serve a te ossia leggendo solo le righe ottieni un vettore di stringhe. Tuttavia, dato che in C non vi è il tipo stringa ma deve essere definito, e di conseguenza trattato, come vettore di caratteri hai bisogno di creare un vettore di vettori di caratteri, altrimenti detto matrice.
Dato che i vettori sono entità non dinamiche, ossia una volta creato un vettore di 10 elementi quello rimane composto di 10 elementi, non può essere ampliato o ristretto.
Per questo motivo devi definire un numero sufficiente di caratteri tali da contenere tutte le parole previste.

Nell'esempio fatto gli indici posti tra parentesi quadre equivalgono a

Codice sorgente - presumibilmente C/C++

  1. char s[NumeroStringhe][NumeroCaratteriPerStringa] = {"A","AB","CD"};



quindi nel tuo codice avresti dovuto scrivere

Codice sorgente - presumibilmente C/C++

  1. char string[11][6] = {"Si", "si", "Vero", "vero", "Giusto", "giusto", "V", "v", "OK", "Ok", "ok"};



corretto questo problema te ne si presente un altro alla seguente riga :

Codice sorgente - presumibilmente C/C++

  1. } while (vf != string)/*fine del comando do...while*/



è un warning con il seguente testo :

[Warning] comparison between pointer and integer

ossia tenti di confrontare un carattere con l'indirizzo in memoria dove è salvata la matrice e quindi genera un warning. Dovresti confrontare ogni singolo elemento della matrice con il tuo carattere.

Infine vi è un ultimo errore

syntax error before "if"

alla riga

Codice sorgente - presumibilmente Plain Text

  1. if( x = 0 ) {



in quanto dopo la fine del do..while va posto il ;

Inoltre l'operatore di confronto è '==' e non '='
dovresti riscrivere

Codice sorgente - presumibilmente Plain Text

  1. if( x == 0 ) {



spero di esserti stato di aiuto :k:

Ultima modifica effettuata da andrea.b89 il 11/03/2009 alle 21:49
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:35
Mercoledì, 11/03/2009
Grazie mille, ma non ho capito bene cosa devo fare in questa parte

Testo quotato

Postato originariamente da andrea.b89:
Codice sorgente - presumibilmente C/C++

  1. } while (vf != string)/*fine del comando do...while*/



è un warning con il seguente testo :

[Warning] comparison between pointer and integer

ossia tenti di confrontare un carattere con l'indirizzo in memoria dove è salvata la matrice e quindi genera un warning. Dovresti confrontare ogni singolo elemento della matrice con il tuo carattere.


PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 21:47
Mercoledì, 11/03/2009
Prima cosa, se devi verificare una stringa, ciò che devi  fare è leggere una stringa.
Quindi la scanf deve essere scritta con argomento diverso.
Per il controllo ecco come devi fare :

Codice sorgente - presumibilmente C/C++

  1. while(trovato == 0 && i < 11)
  2.                      if (strcmp(vf, string[i]) == 0)
  3.                         trovato = 1;
  4.                      else
  5.                          i++;



quanto scritto rappresenta il controllo per verificare se la risposta data è contenuta nel tuo vettore string.

Ora ti posto il codice del programma corretto, perchè gli errori sono diversi. Ad esempio quando chiami una funzione devi darle lo stesso nome del prototipo (ossia il nome di quando viene definita, ad esempio per la funzione sulla X devi scrivere calcX e non calcolaX).

Codice sorgente - presumibilmente C++

  1. /*programma per il calcolo di un termine incognito di una proporzione*/
  2. #include<stdio.h>
  3. #include<string.h>
  4.  
  5. int calcX(int y,int z,int t); /*calcola primo termine*/
  6. int calcY(int x,int z,int t); /*calcola secondo termine*/
  7. int calcZ(int x,int y,int t); /*calcola terzo termine*/
  8. int calcT(int x,int y,int z); /*calcola quarto termine*/
  9.  
  10. int main() {
  11.      
  12.     int x;   /*primo termine*/
  13.     int y;   /*secondo termine*/
  14.     int z;   /*terzo termine*/
  15.     int t;   /*quarto termine*/
  16.    
  17.      //lettura di una stringa
  18.    
  19.     char string[11][6] = {"Si", "si", "Vero", "vero", "Giusto", "giusto", "V", "v", "OK", "Ok", "ok"};
  20.    
  21.    
  22.     char vf[6]; //stringa
  23.     int trovato;
  24.     int i;
  25.     do {
  26.        printf("Inserisci i termini(0 come termine incognito):\n");
  27.        scanf ("%d %d %d %d", &x, &y, &z, &t);
  28.        printf("%d:%d=%d:%d\tGiusto?", x, y, z, t);
  29.        //lettura di una stringa
  30.        //la sequenza di caratteri letti viene memorizzata a
  31.        //partire dalla prima posizione del vettore vf
  32.        scanf ("%s", &vf[0]);
  33.        
  34.        trovato = 0;
  35.        i = 0;
  36.        
  37.        //controllo stringa inserita
  38.        
  39.        while(trovato == 0 && i < 11)
  40.                      if (strcmp(vf, string[i]) == 0)
  41.                         trovato = 1;
  42.                      else
  43.                          i++;
  44.      
  45.     } while (trovato == 0);/*fine del comando do...while*/
  46.      
  47.  
  48.     if( x == 0 ) {
  49.         calcX(y,z,t); } /*fine del ramo if*/
  50.         else
  51.         if( y == 0 ) {
  52.             calcY(x,z,t); } /*fine del ramo if*/
  53.             else
  54.             if ( z == 0 ) {
  55.                 calcZ(x,y,t); } /*fine del ramo if*/
  56.                 else
  57.                 if ( t == 0 ) {
  58.                    calcT(x,y,z); } /*fine del ramo if*/
  59.                    
  60.     printf("%d:%d=%d:%d", x, y, z, t);
  61.    
  62. } /*fine della funzione main*/
  63.  
  64. int calcX(int y,int z,int t) {
  65.     int x;
  66.     x = y * z / t;
  67.      
  68.     return x;
  69. } /*fine della funzione calcX*/
  70. int calcY(int x,int z,int t) {
  71.     int y;
  72.     y = x * t / z;
  73.      
  74.     return y;
  75.      
  76. } /*fine della funzione calcY*/
  77. int calcZ(int x,int y,int t) {
  78.     int z;
  79.     z = x * t / y;
  80.      
  81.     return z;
  82. } /*fine della funzione calcZ*/
  83. int calcT(int x,int y,int z) {
  84.     int t;
  85.     t = y * z / x;
  86.      
  87.     return t;
  88.      
  89. } /*fine della funzione calcT*/



prova a confrontare il codice che ti ho corretto con il tuo originale e se avrai domande sarò felice di risponderti :k: comunque tranquillo che non ti ho toccato il resto del programma, ho solo corretto gli errori ;) comunque per avere 11 anni sei sulla buona strada :)

PM Quote