Aiutino per un neofita autodidatta? (ma parecchio neofita!)

di il
10 risposte

Aiutino per un neofita autodidatta? (ma parecchio neofita!)

Buonasera!

Volevo chiedere una mano per un impiccio che non riesco a risolvere

Sto facendo uno dei miei primi programmi e volevo impostarlo in modo tale che se da tastiera si inseriva un numero, in output si otteneva una determinata frase.
Se invece l'utente inserisce specificatamente la parola "infinito", dava in output un'altra frase.
Ecco, proprio in quest'ultimo punto ho un problemino. Non riesco a fare la distinzione tra intero e carattere al momento dell'input.
Difatti quando inserisco infinito, in output mi dà la risposta degli interi >_<

Inserisco il codice!
#include <stdio.h>
#include <conio.h>
main () {
     float i;
     char a[9]="infinito";
     printf ("Ma quanto sono impedito da uno a mille???");
     if (scanf ("%d",&i)>=0.0) {
               printf ("Cosi' poco?!?!?!?!?!?!?!?!");
               } else if (scanf("%s",&a) && a=="infinito") {
                      printf ("Questa e' la risposta esatta *_*");
                      }
     getch();
}
Il problema credo risieda nel secondo if e nell'and.
Grazie mille per l'eventuale aiuto e spiegazione!

10 Risposte

  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    
        main ()
    
    ..........
    
    char a="infinito";
    
    
    .......
    scanf("%s",&x);
    
    .....
    
    
    


  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Derek ha scritto:


    Ciao,
    in primis c'è un'incoerenza tra la dichiarazione e l'acquisizione della variabile i, viene dichiarata come float ma la acquisisci come intero (%d) anzichè come float (%f)..per il resto provo a darci un occhio e se trovo qualcosa lo posto
    Ups!
    Mi era sfuggito nel momento in cui ho cambiato la variabile i da int a float
    Ero un po'
    Grazie!
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Derek ha scritto:


    ..dovrebbe funzionare, se inserisci un numero intero in ingresso ottieni una risposta, se inserisci la parola infinito stampa a video la parola infinito, se inserisci una parola differente da infinito stampa un'altra cosa ancora(abc):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
        main () {
             int i;
             char a[9]="infinito";
             char x[9];
    		 printf ("Ma quanto sono impedito da uno a mille???");
             if (scanf ("%d",&i)>=0) {
                       printf ("Cosi' poco?!?!?!?!?!?!?!?!");
    				   return(0);
                       } else 
    				   scanf("%s",&x);
    				   if (strcmp(x,a)==0) {
                              printf ("Questa e' la risposta esatta *_*: %s",a);
    						  return(0);
                              }
        printf("abc");
    	}
    spero sia ciò che ti serviva..
    Non me lo compila, Derek

    Edit: Ora sì XD
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    A me non torna ancora:
    1. non esiste main() (vedi il link che ti ho messo sopra)
    2. scanf su stringhe vuole l'indirizzo della variabile non un riferimento all'indirizzo.
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Hai ragione skynet; continua a non andare.

    Mi da in output "Così poco!?!?!??" anche nel caso in cui in input scrivo infinito o qualsiasi altro carattere.
    Ehm...si, sulle stringhe sono infinitamente scarso ç__ç
    Lette/studiate ieri pomeriggio ma mi sono impicciato in una maniera indecente >_>

    PS. aggiunto INT prima di main! ( domandina allora: perchè gli altri programmi che ho fatto, senza inserire l'Int, andavano perfettamente? )
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Perche è un compilatore non conforme ai standard. Prova a compilarlo su gcc e vediamo cosa ti dice. Poi bisogna vedere a che livello hai messo gli warning del compilatore.
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Leggi lo standard poi ne parliamo.
    http://c0x.coding-guidelines.com/5.1.2.2.1.htm

    Mi puoi spiegare come una funzione che ritorna void (cioè nulla) accetta la tua riga: return(0)?

    ecco cosa dicono i compilatori standard riguardo al tuo codice
    
    Your Comeau C/C++ test results are as follows:
    
    Comeau C/C++ 4.3.9 (Mar 27 2007 17:24:47) for ONLINE_EVALUATION_BETA2
    Copyright 1988-2007 Comeau Computing.  All rights reserved.
    MODE:strict errors C99 noC++0x_extensions
    
    "ComeauTest.c", line 4: error: return type "int" omitted in declaration of function
              "main", so use int main() OR int main(int argc, char *argv[])
              main () {
              ^
    
    "ComeauTest.c", line 13: warning: argument is incompatible with corresponding
              format string conversion
                         scanf("%s",&x);
                                    ^
    
    1 error detected in the compilation of "ComeauTest.c".
    
    
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Questo inceve lo dice lo stesso compilatore in vecchio formato dello standard cioè C89/C90
    
    Your Comeau C/C++ test results are as follows:
    
    Comeau C/C++ 4.3.9 (Mar 27 2007 17:24:47) for ONLINE_EVALUATION_BETA2
    Copyright 1988-2007 Comeau Computing.  All rights reserved.
    MODE:strict errors C90noC++0x_extensions
    
    "ComeauTest.c", line 13: warning: argument is incompatible with corresponding
              format string conversion
                         scanf("%s",&x);
    
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Se compili con l'opzione -Wall abiliti tutti gli warning.
    Nel caso spefico della main ed altre funzioni il manuale non è chiaro... o meglio non mi risulta esserlo
    
    -Wreturn-type
    Warn whenever a function is defined with a return-type that defaults to int. Also warn about any return statement with no return-value in a function whose return-type is not void (falling off the end of the function body is considered returning without a value), and about a return statement with an expression in a function whose return-type is void.
    For C++, a function without return type always produces a diagnostic message, even when -Wno-return-type is specified. The only exceptions are `main' and functions defined in system headers.
    
    This warning is enabled by -Wall. 
    
    Ho scritto qui di seguito un esempio che ho compilato senza porre attenzione sugli warnings e l'oggetto disassemblato
    si presenta cosi:
    
    foo ()                 
    {                      
       0:   55                      push   rbp
       1:   48 89 e5                mov    rbp,rsp
    }                                             
       4:   c9                      leave         
       5:   c3                      ret           
    
    0000000000000006 <main>:
    main ()                 
    {                       
       6:   55                      push   rbp
       7:   48 89 e5                mov    rbp,rsp
       a:   48 83 ec 10             sub    rsp,0x10
                                                   
      int i=foo();
       e:   b8 00 00 00 00          mov    eax,0x0
      13:   e8 00 00 00 00          call   18 <main+0x12>
      18:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
    }
      1b:   c9                      leave
      1c:   c3 
    
    Ecco un buon motivo per compilare con l'opzione '-Wall':
    Qui si puo' notare come la funzione main che punta sullo stack al ritorno di foo su zona che non esiste per assegnare 'i'. Anche la main dovrebbe restituire il valore di return in eax, ma niente di tutto ciò.
    Il valore di 'i' e il return del main rimangono indefiniti
  • Re: Aiutino per un neofita autodidatta? (ma parecchio neofita!)

    Il buon vecchio assembler non sbaglia mai.
Devi accedere o registrarti per scrivere nel forum
10 risposte