aiuto creazione calcolatrice in C
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 7 di 7

Discussione: aiuto creazione calcolatrice in C

Cambio titolo
  1. #1
    Programmatore in erba L'avatar di Beppe91
    Registrato il
    06-06
    Messaggi
    96

    aiuto creazione calcolatrice in C

    ciao a tutti, comincio dicendovi k sn un novizio del C, "programmo" si e no da un paio di mesi, gg mi stavo dilettando () nella creazione di una calcolatrice con 4 operatori e qnd avvio il debug mi spunta qst errore:

    Run-Time Check Failure #2 - Stack around the variable 'operazione' was corrupted.

    cosa vuol dire? c'è un rimedio?

    grz d tutto!!
    MIO PC:
    - Asus M2n
    - AMD Athlon x2 5200+
    - 3 gb di RAM Corsair 800 mhz
    - 160 gb HD Segate
    - Zotac 8800 GTS 512mb

  2. #2

  3. #3
    Programmatore in erba L'avatar di Beppe91
    Registrato il
    06-06
    Messaggi
    96
    #include <stdio.h>

    void main (void)

    {
    char oper;
    char domanda;
    float a,b,som,sot,molt,div;
    printf(" CALCOLATRICE");
    printf("\n\n\nOperatori disponibili:");
    printf("\n\n- Somma");
    printf("\n\n- Sottrazione");
    printf("\n\n- Moltiplicazione");
    printf("\n\n- Divisione");
    while (domanda == 'n'&&'o')
    {
    printf("\n\n\nInserire l'operatore che devo utilizzare per compiere l' operazione ---->");
    scanf("&#37;s",&oper);


    if(oper = 's'&&'o'&&'m'&&'m'&&'a')
    {
    printf(" SOMMA\n\n\n");
    printf("Eseguiro la somma di due numeri inseriti da tastiera");
    printf("\n\n\nInserisci il primo numero ----> ");
    scanf("%f",&a);
    printf("\n\n\nInserisci il secondo numero ---->");
    scanf("%f",&b);
    som=a+b;
    printf("Il risultato della somma tra %f e %f e' %f",a,b,som);
    printf("\n\nVuoi farmi fare un'altra operazione?");
    scanf("%s", &domanda);
    }


    if(oper = 'm'&&'o'&&'l'&&'t'&&'i'&&'p'&&'l'&&'i'&&'c'&&'a'&&'z'&&'i' &&'o'&&'n'&&'e')
    {
    printf(" MOLTIPLICAZIONE\n\n\n");
    printf("Eseguiro la moltiplicazione di due numeri inseriti da tastiera");
    printf("\n\n\nInserisci il primo numero ----> ");
    scanf("%f",&a);
    printf("\n\n\nInserisci il secondo numero ---->");
    scanf("%f",&b);
    molt=a*b;
    printf("Il risultato della moltiplicazione tra %f e %f e' %f",a,b,molt);
    printf("\n\nVuoi farmi fare un'altra operazione?");
    scanf("%s", &domanda);
    }


    if(oper = 's'&&'o'&&'t'&&'t'&&'r'&&'a'&&'z'&&'i'&&'o'&&'n'&&'e')
    {
    printf(" SOTTRAZIONE\n\n\n");
    printf("Eseguiro la sottrazione di due numeri inseriti da tastiera");
    printf("\n\n\nInserisci il primo numero ----> ");
    scanf("%f",&a);
    printf("\n\n\nInserisci il secondo numero ---->");
    scanf("%f",&b);
    sot=a-b;
    printf("Il risultato della sottrazione tra %f e %f e' %f",a,b,sot);
    printf("\n\nVuoi farmi fare un'altra operazione?");
    scanf("%s", &domanda);
    }


    if(oper = 'd'&&'i'&&'v'&&'i'&&'s'&&'i'&&'o'&&'n'&&'e')
    {
    printf(" DIVISIONE\n\n\n");
    printf("Eseguiro la divisione di due numeri inseriti da tastiera");
    printf("\n\n\nInserisci il primo numero ----> ");
    scanf("%f",&a);
    printf("\n\n\nInserisci il secondo numero ---->");
    scanf("%f",&b);
    div=a/b;
    printf("Il risultato della divisione tra %f e %f e' %f",a,b,div);
    printf("\n\nVuoi farmi fare un'altra operazione?");
    scanf("%s", &domanda);
    }
    }
    }


    gli errori ora sono 2 identici:
    Run-Time Check Failure #2 - Stack around the variable 'oper' was corrupted.
    Run-Time Check Failure #2 - Stack around the variable 'domanda' was corrupted.

    EDIT:
    ho risolto ma gia k ci siamo vi kiedo una cs: cm faccio a far finire il programma qnd qst finisce di fare un operazione?
    Ultima modifica di Beppe91; 2-12-2008 alle 21:24:51
    MIO PC:
    - Asus M2n
    - AMD Athlon x2 5200+
    - 3 gb di RAM Corsair 800 mhz
    - 160 gb HD Segate
    - Zotac 8800 GTS 512mb

  4. #4
    Antitetico L'avatar di IceFlame
    Registrato il
    04-06
    Località
    In altri mondi
    Messaggi
    2.961
    Non vorrei dire qualcosa di sbagliato, ma credo che il problema stia nel fatto che hai dichiarato oper e domanda come char, ma nell'input li tratti come stringhe (per la precisione usando il &#37;s nello scanf).

    Per quanto riguarda la seconda domanda (come far finire il programma...) devi mettere
    Codice:
    return;
    nel punto in cui vuoi che termini una volta giunto l&#236;. Oppure, soluzione pi&#249; "ortodossa", metti gli if annidati con la struttura if ... else if. Ti faccio un esempio:
    Codice:
    if (a>b)
    {
    fai qualcosa;
    }
    else if (a<b)
    {
    fai qualcos'altro;
    }
    Lo so che non &#232; un esempio vero e proprio, ma non mi viene in mente niente

    EDIT: comunque non preoccuparti, fra poco sicuramente passer&#224; qualcuno a dire che ho detto un mare di caxxate
    In ogni mio post è sottinteso un "IMHO", un "Per favore", un "Grazie" e un "Se non ricordo male".

    Stai attento a ciò che desideri, perchè potresti anche ottenerlo.
    Non piangete per me, sono già morto


    Quoto; Parole sante;
    Dal forum: 1
    2 3 4 5 6 7 8 9 10 11 12 13 14 15
    16 17 18 19 20 21 22 23 24 25 26 27 28 29
    30 31 32

  5. #5
    *
    Registrato il
    09-06
    Messaggi
    7.701
    Citazione IceFlame Visualizza Messaggio
    Non vorrei dire qualcosa di sbagliato, ma credo che il problema stia nel fatto che hai dichiarato oper e domanda come char, ma nell'input li tratti come stringhe (per la precisione usando il %s nello scanf).
    infatti,in quei test io avrei usato la strcmp della string.h.
    anche se sarebbe molto più comodo un input con una "codifica",quindi ad esempio ad ogni opzione corrisponde un numero o un carattere da digitare...
    però dice di aver risolto il proòlema,quindi poco importa.
    *

  6. #6
    I am a stegosaurus! L'avatar di The_Ed
    Registrato il
    10-02
    Località
    Milanese imbruttito
    Messaggi
    9.963
    probabilmente si riferisce al fatto che tu
    1) dichiari un char e questo finisce nello stack
    2) fai una scanf e infili il risultato in oper. Il C fa pochi controlli su cosa scrivi e dove lo scrivi: se tu provi a mettere la stringa "somma" in un char con una scanf, pu&#242; darsi che a tempo di esecuzione il programma scriva il char 's' nello spazio di oper, e i caratteri 'o', 'm', 'm' e 'a' nelle celle di memoria successive, "corrompendo" lo stack nei dintorni della variabile oper.

    Io punterei sul char *, che ti infila queste stringhe nello heap... ma almeno conosci la differenza fra stack e heap? Se non la sai dimmi che ti faccio una piccola lezione teorica (don't worry, non &#232; lunga da sapere ne' particolarmente difficile )

    E come ti hanno detto sopra, i confronti fra stringhe si DEVONO fare con la strcmp, contenuta in string.h

    if(oper = 'd'&&'i'&&'v'&&'i'&&'s'&&'i'&&'o'&&'n'&&'e') -> if ((strcmp(oper, "divisione")) == 0)

    Io scriverei una roba del genere
    Codice:
    #include <stdio.h>
    
    #define MAX_OPER_LEN 16
    #define MAX_QUESTION_LEN 16
    
    #define DIVISIONE "divisione"
    #define SOMMA "somma"
    #define SOTTRAZIONE "sottrazione"
    #define MOLTIPLICAZIONE "moltiplicazione"
    
    void main (void) /* mi hanno sempre consigliato di usare int main(int argc, char **argv) per motivi "storici"... ma son dettagli */
    {
        char *oper = malloc(MAX_OPER_LEN * sizeof(char)), *domanda = malloc (MAX_QUESTION_LEN * sizeof(char));
    
        float a,b,som,sot,molt,div;
    
        printf(" CALCOLATRICE");
        printf("\n\n\nOperatori disponibili:");
        printf("\n\n- Somma");
        printf("\n\n- Sottrazione");
        printf("\n\n- Moltiplicazione");
        printf("\n\n- Divisione");
    
        while ((strcmp(domanda, "no")) == 0)
        {
            printf("\n\n\nInserire l'operatore che devo utilizzare per compiere l' operazione ---->");
            scanf("&#37;s", oper); /* oper &#232; gi&#224; un puntatore quindi non c'&#232; bisogno di passare riferimenti */
    
    
            if((strcmp(oper, SOMMA)) == 0)
            {
                printf(" SOMMA\n\n\n");
                printf("Eseguiro la somma di due numeri inseriti da tastiera");
    
                printf("\n\n\nInserisci il primo numero ----> ");
                scanf("%f",&a);
    
                printf("\n\n\nInserisci il secondo numero ---->");
                scanf("%f",&b);
    
                som=a+b;
    
                printf("Il risultato della somma tra %f e %f e' %f",a,b,som);
                printf("\n\nVuoi farmi fare un'altra operazione?");
                scanf("%s", domanda);
            }
    
            /* e cos&#236; via con le altre */
        }
    }
    juventino, dailyrander, informatico, musicomane, giocatore

  7. #7
    I am a stegosaurus! L'avatar di The_Ed
    Registrato il
    10-02
    Località
    Milanese imbruttito
    Messaggi
    9.963
    Citazione Beppe91 Visualizza Messaggio
    ho risolto ma gia k ci siamo vi kiedo una cs: cm faccio a far finire il programma qnd qst finisce di fare un operazione?
    due maniere:
    1) aggiungi alla cascata di if
    Codice:
    if ((strcmp(oper, "quit")) == 0)
        printf("Sto chiudendo...");
        return;
    2) se vuoi chiudere alla fine dell'operazione metti semplicemente return; alla fine di ogni corpo dell'if
    juventino, dailyrander, informatico, musicomane, giocatore

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •