Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429

    [C] Programma con Switch e procedure

    Ho scritto il seguente pogramma per esercitarmi un pò con gli switch, programma che esegue le 4 operazioni fondamentali:

    codice:
    #include <stdio.h>
    #include <conio.c>
    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
    
    void addizione(void);
    void sottrazione (void);
    void moltiplicazione (void);
    void divisione (void);
    
    int main()
    {
      int ch;
      gotoxy(25,1);
      printf("Calcolatrice elementare\n");
      gotoxy(1,2);
      printf("_Premere 1 per eseguire un'addizione\n");
      printf("__Premere 2 per eseguire una sottrazione\n");
      printf("___Premere 3 per eseguire una moltiplicazione\n");
      printf("____Premere 4 per eseguire una divisione\n");
      printf("_____Inserisci la tua scelta ");
      ch=getchar();  //legge il carattere inserito
      switch(ch) {
         case '1' :
              addizione();
              break;
         case '2' :
              sottrazione();
              break;
         case '3' :
              moltiplicazione();
              break;
         case '4' :
              divisione();
              break;
         default  :
              printf("Non e' stata selezionata alcuna opzione ");
      }
      getch();
      return 0;
    }
    
    void addizione(void){      //esegue la somma di due operandi
         float x, y, somma;
         printf("Inserisci i due numeri da sommare ");
         scanf("%f  %f", x, y);
         somma=x+y;
         printf("La somma dei due operandi e' %f ", somma);
         getch();
    }
    
    void sottrazione(void){       //esegue la sottrazione di due operandi
         float x, y, differenza;
         printf("Inserisci i due numeri da sottrarre ");
         scanf("%f  %f", x, y);
         differenza=x-y;
         printf("La differenza dei due operandi e' %f ", differenza);
         getch();
    }
    
    void moltiplicazione(void){
         float x, y, prodotto;
         printf("Inserisci i due numeri da moltiplicare ");
         scanf("%f  %f", x, y);
         prodotto=x*y;
         printf("Il prodotto dei due operandi e' %f ", prodotto);
         getch();
    }
    
    void divisione(void){
         float x, y, quoziente;
         printf("Inserisci i due numeri da dividere ");
         scanf("%f  %f", x, y);
         quoziente=x/y;
         printf("Il quoziente dei due operandi e' %f ", quoziente);
         getch();
    }
    Lo mando in esecuzione e inserito il primo operando mi da una segnalazione d'errore di windows...che c'è che nn va?

  2. #2
    alla scanf vanno passati gli indirizzi delle variabili, sennò non può memorizzare in esse i valori! :gren:




    ps: cmq da qualche altra parte del forum se ne era parlato qualche giorno fa

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    lo scanf accetta come parametro l'indirizzo di dove vuoi che il valore venga memorizzato.

    Come fare a prendere l'indirizzo è una questione che varia a seconda di dove vuoi scrivere il valore.

    esempi:

    variabile: &var
    array: arr
    campo di una struttura: &(str.campo01)

  4. #4
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Originariamente inviato da Lucked
    lo scanf accetta come parametro l'indirizzo di dove vuoi che il valore venga memorizzato.

    Come fare a prendere l'indirizzo è una questione che varia a seconda di dove vuoi scrivere il valore.

    esempi:

    variabile: &var
    array: arr
    campo di una struttura: &(str.campo01)
    cacchio sto fatto in C me lo dimentico sempre

    vabbè devo ancora affronatre lo studio delle funzioni di I/O e quindi nn me ne faccio una grande colpa

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da Iena87
    vabbè devo ancora affronatre lo studio delle funzioni di I/O e quindi nn me ne faccio una grande colpa
    Non è una questione di funzioni di input/output, ma dipende da una regola fondamentale del C, ovvero tutti i parametri delle funzioni sono passati per valore, cioè viene creata una copia temporanea della variabile che passi, e quindi le modifiche operate da una funzione sul suo argomento sono perse una volta usciti dalla funzione; se una funzione deve modificare la variabile argomento, come deve fare la scanf, diventa necessario passare non la variabile stessa, ma il suo indirizzo, in modo che la funzione, accedendo alla locazione in cui si trova la variabile, possa modificarla.


  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    wow..un vera perla di saggezza questa di Anx!

  7. #7
    Originariamente inviato da anx721
    Non è una questione di funzioni di input/output, ma dipende da una regola fondamentale del C, ovvero tutti i parametri delle funzioni sono passati per valore, cioè viene creata una copia temporanea della variabile che passi, e quindi le modifiche operate da una funzione sul suo argomento sono perse una volta usciti dalla funzione; se una funzione deve modificare la variabile argomento, come deve fare la scanf, diventa necessario passare non la variabile stessa, ma il suo indirizzo, in modo che la funzione, accedendo alla locazione in cui si trova la variabile, possa modificarla.

    leggendo quanto hai scritto mi è venuto un dubbio...
    se faccio cosi' il valore della var viene cmq modificato vero?

    codice:
    void funz(int *a){
    *a=10;
    }
    
    int main(){
    int a=5;
    printf("\nValore di a prima della chiamata della funz %d\n",a);
    
    funz(a);
    
    printf("\nDopo la chiamata a vale %d\n",a);
    return 0;
    }
    Grazie
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    certo, il programma giusto è cosi.

    codice:
    void funz(int *a){
    *a=10;
    }
    
    int main(){
    int a=5;
    printf("\nValore di a prima della chiamata della funz %d\n",a);
    
    funz(&a);
    
    printf("\nDopo la chiamata a vale %d\n",a);
    
    getch();
    return 0;
    }
    viene modificato perchè agisci con un puntatore e passi l'indirizzo

  9. #9
    Originariamente inviato da Lucked
    certo, il programma giusto è cosi.

    codice:
    void funz(int *a){
    *a=10;
    }
    
    int main(){
    int a=5;
    printf("\nValore di a prima della chiamata della funz %d\n",a);
    
    funz(&a);
    
    printf("\nDopo la chiamata a vale %d\n",a);
    
    getch();
    return 0;
    }
    viene modificato perchè agisci con un puntatore e passi l'indirizzo
    cosi' xchè è sbagliato?
    codice:
    void funz(int *a){
    *a=10;
    }
    
    int main(){
    int a=5;
    printf("\nValore di a prima della chiamata della funz %d\n",a);
    
    funz(a);
    
    printf("\nDopo la chiamata a vale %d\n",a);
    return 0;
    }
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    int *a è una variabile puntatore a intero. Ogni puntatore si aspetta di ricevere un indirizzo che tu gli passi con &a.

    poi..proprio per la natura del puntatore facendo:
    a = 10;
    gli dici di puntare alla locazione di memoria numero 10, cosa che non si fa e che non vuoi neanche fare.
    tu vuoi modificare il valore puntato, quindi devi agire dove punta il puntatore e lo fai con l'asterisco e quindi

    *a = 10;

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.