Oppure

Loading
11/03/09 18:15
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:-?

/*programma per il calcolo di un termine incognito di una proporzione*/
#include<stdio.h>

int calcX(int y,int z,int t); /*calcola primo termine*/
int calcY(int x,int z,int t); /*calcola secondo termine*/
int calcZ(int x,int y,int t); /*calcola terzo termine*/
int calcT(int x,int y,int z); /*calcola quarto termine*/

int main() {
    
    int x;   /*primo termine*/
    int y;   /*secondo termine*/
    int z;   /*terzo termine*/
    int t;   /*quarto termine*/
    char vf; /*vero/falso*/
    char string[] = {"Si", "si", "Vero", "vero", "Giusto", "giusto", "V", "v", "OK", "Ok", "ok"};
    
    do {
    printf("Inserisci i termini(0 come termine incognito):\n");
    scanf ("%d%d%d%d", &x, &y, &z, &t);
    printf("%d:%d=%d:%d\tGiusto?", x, y, z, y);
    scanf ("%c", &vf);
    } while (vf != string)/*fine del comando do...while*/
    
    if( x = 0 ) {
        calcolaX(y,z,t); } /*fine del ramo if*/
        else
        if( y = 0 ) {
            calcolaY(x,z,t); } /*fine del ramo if*/
            else
            if ( z = 0 ) {
                calcolaZ(x,y,t); } /*fine del ramo if*/
                else
                if ( t = 0 ) {
                   calcolaT(x,y,z); } /*fine del ramo if*/
                   
                   printf("%d:%d=%d:%d", x, y, z, t);
} /*fine della funzione main*/

int calcX(int y,int z,int t) {
    int x;
    x = y * z / t;
    
    return x;
} /*fine della funzione calcX*/
int calcY(int x,int z,int t) {
    int y;
    y = x * t / z;
    
    return y;
    
} /*fine della funzione calcY*/
int calcZ(int x,int y,int t) {
    int z;
    z = x * t / y;
    
    return z;
} /*fine della funzione calcZ*/
int calcT(int x,int y,int z) {
    int t;
    t = y * z / x;
    
    return t;
    
} /*fine della funzione calcT*/ 
Ultima modifica effettuata da 11/03/09 18:26
11/03/09 19:23
andrea.b89
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

    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 :

    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

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


quindi nel tuo codice avresti dovuto scrivere

     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 :

    } 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

    if( x = 0 ) { 


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

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

    if( x == 0 ) { 


spero di esserti stato di aiuto :k:
Ultima modifica effettuata da andrea.b89 11/03/09 20:49
aaa
11/03/09 19:35
Grazie mille, ma non ho capito bene cosa devo fare in questa parte

Postato originariamente da andrea.b89:
    } 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.
11/03/09 20:47
andrea.b89
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 :

while(trovato == 0 && i < 11)
                     if (strcmp(vf, string[i]) == 0)
                        trovato = 1;
                     else
                         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).

/*programma per il calcolo di un termine incognito di una proporzione*/ 
#include<stdio.h> 
#include<string.h>

int calcX(int y,int z,int t); /*calcola primo termine*/ 
int calcY(int x,int z,int t); /*calcola secondo termine*/ 
int calcZ(int x,int y,int t); /*calcola terzo termine*/ 
int calcT(int x,int y,int z); /*calcola quarto termine*/ 

int main() { 
     
    int x;   /*primo termine*/ 
    int y;   /*secondo termine*/ 
    int z;   /*terzo termine*/ 
    int t;   /*quarto termine*/ 
    
     //lettura di una stringa
    
    char string[11][6] = {"Si", "si", "Vero", "vero", "Giusto", "giusto", "V", "v", "OK", "Ok", "ok"}; 
    
    
    char vf[6]; //stringa
    int trovato;
    int i;
    do { 
       printf("Inserisci i termini(0 come termine incognito):\n"); 
       scanf ("%d %d %d %d", &x, &y, &z, &t); 
       printf("%d:%d=%d:%d\tGiusto?", x, y, z, t); 
       //lettura di una stringa
       //la sequenza di caratteri letti viene memorizzata a
       //partire dalla prima posizione del vettore vf
       scanf ("%s", &vf[0]);
       
       trovato = 0;
       i = 0;
       
       //controllo stringa inserita
       
       while(trovato == 0 && i < 11)
                     if (strcmp(vf, string[i]) == 0)
                        trovato = 1;
                     else
                         i++;
     
    } while (trovato == 0);/*fine del comando do...while*/ 
     

    if( x == 0 ) { 
        calcX(y,z,t); } /*fine del ramo if*/ 
        else 
        if( y == 0 ) { 
            calcY(x,z,t); } /*fine del ramo if*/ 
            else 
            if ( z == 0 ) { 
                calcZ(x,y,t); } /*fine del ramo if*/ 
                else 
                if ( t == 0 ) { 
                   calcT(x,y,z); } /*fine del ramo if*/ 
                   
    printf("%d:%d=%d:%d", x, y, z, t); 
    
} /*fine della funzione main*/ 

int calcX(int y,int z,int t) { 
    int x; 
    x = y * z / t; 
     
    return x; 
} /*fine della funzione calcX*/ 
int calcY(int x,int z,int t) { 
    int y; 
    y = x * t / z; 
     
    return y; 
     
} /*fine della funzione calcY*/ 
int calcZ(int x,int y,int t) { 
    int z; 
    z = x * t / y; 
     
    return z; 
} /*fine della funzione calcZ*/ 
int calcT(int x,int y,int z) { 
    int t; 
    t = y * z / x; 
     
    return t; 
     
} /*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 :)
aaa