Newsgroup: it.comp.programmare
Titolo: Problema semplicissimo per un esperto difficilissimo per un neofita

Ciao a tutti  innanzitutto mi scuso per l'irruzione nelle vostre
caselle di
mail ma ho un problema al quale voi sicuramente potrete darmi una
risposta in pochissimi secondi
Vi premetto che son un neofita del c e che sono iscriitto al primo
anno di informatica quindi sono qui per imparare se mi puoi aiutare te
ne saro molto grato
Ho un esercizio da svolgere prima con l'uso di if ed else poi con
l'uso di switch
per if ed else non ci sono stati grossi problmei con switch si. Il
quesito posto è questo
questo l'ho preso direttamente dal programma devC++ che sto utlizzando
la prima parte arriva fino a quando ho messo $$$$$$$$$$$ ed è quella
dataci dal professore quello in mezzo lo fatto io.... cosi come lo
sviluppato mi funziona solo se ho un reddito <7000 ma non riesco a
dagli le altre variabili che sono (reddito<13000 , reddito<35000 e
reddito<35000
Ti premetto che tutto quello che trovi compreso in $$$$$$$$$$$$$$ è
quello che ho fatto io
#include <stdio.h>
int main()
{
   float  reddito;
   float tasse;
   printf("Inserire il reddito in euro (es: 13402,32):\n");
   scanf("%f", &reddito);
  //Partendo dalla traccia di codice sotto riportata, edita un
programma che, dato in ingresso
  //un reddito, calcoli le tasse secondo il seguente schema di
aliquote:
//fino a 7000 euro: esenzione;
//da 7000 a 13000 euro: aliquota al 13%;
//da 13000 a 35000 euro: aliquota al 23%;
//oltre 35000 euro: aliquota al 33%.
 // completare usando la struttura case
   // serviranno anche degli if all'interno dei singoli casi?
//$$$$$$$$$$$$$$$$$$$$$$$$
int opzione (reddito<7000);
  switch (opzione)
  {
case 1 :
                               tasse = 0;
               printf("hai tasse per %f", tasse);
              break;
case 2:
               tasse = 0+((reddito-7000)*13/100);
               printf("hai tasse per %f", tasse);
              break;
case 3:
               tasse = 0+((13000-7000)*13/100)+
((reddito-13000)*23/100);
       printf("hai tasse per %f", tasse);
              break;
case 4:
               0+((13000-7000)*13/100)+((35000-13000)*23/100)+
((reddito-35000)*33/100);
       printf("hai tasse per %f", tasse);
              break;
                 }
 //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
   printf("\n\nPremi un tasto per uscire");
   fflush(stdin);
   getchar();   // trucco per far rimanere aperta la finestra di
testo
   return 0;
}
GRAZIE SE MI POTETE AIUTARE E BUON LAVORO A TUTTI

 
Intanto, trattandosi di denaro, io userei i double invece dei float.
Scritta coi piedi, la funzione la farei cosi', fermo restando che
preferirei lavorare di piu' sulla funzione di calcolo, evitando quegli
if, ma non ho tempo di pensarci su.
double tasse(double reddito)
{
  if (reddito < (double)7000)
     return (double)0;
  else if (reddito < (double)13000)
     return (double)(0+((reddito-7000)*13/100));
  else if (reddito < (double)35000)
     return (double)(0+((13000-7000)*13/100)+((reddito-13000)*23/100));
  else
     return
(double)(0+((13000-7000)*13/100)+((35000-13000)*23/100)+((reddito-35000)*33/100));
}
    ...
    printf("hai tasse per %lf\n", tasse(reddito));
    ...
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

>    fflush(stdin);
No [2]
Ciao
[1] 
http://c-faq.com/stdio/scanfvsprintf.html
[2] 
http://c-faq.com/stdio/stdinflush.html
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 ha scritto nel messaggio
news:1171293316.9...@j27g2000cwj.googlegroups.com...
int opzione (reddito<7000);
forse volevi scrivere
int opzione = (reddito<7000);
a questo punto opzione vale 0 oppure 1. Quindi nello switch sotto entra in 1
se reddito < 7000, altrimenti non fa nulla.
  switch (opzione)
  {
...
forse dovresti partire a ragionare cosí:
int opzione = 0
if(reddito < 7000) opzione = 1
.....
e poi usare switch, anche se mi sembra una complicazione inutile, meglio
usare solo if.
Ciao, Enrico

 No [2]
Questo non e' mio: e' del messaggio originale ed effettivamente non ha
senso.


Ok ragazzi vi do ragione a tutti ma essendo uno studente neofita come
vi avevo detto ___ mi scuso per le miei incompetenze ma sto studiando
per imparare.....
Allora per l'utilizzo di if ...else    è tutto chiaro per me ... in
quella parte ho svolto l'esercizio correttamente in questa maniera-.
#include <stdio.h>
int main()
{
    float reddito;
    float tasse;
    printf("Inserire il reddito in euro (es: 13402,32):\n");
    scanf("%f", &reddito);
    if (reddito<7000)
    {tasse = 0;
        printf("hai un tasse per %f", tasse);
    } else if (reddito<13000)
    {
           tasse = 0+((reddito-7000)*13/100);
        printf("hai un reddito di %f", tasse);
     } else if (reddito<35000)
    {
           tasse = 0+((13000-7000)*13/100)+((reddito-13000)*23/100);
        printf("hai un reddito di %f", tasse);
    } else if (reddito>35000)
    {
           tasse = 0+((13000-7000)*13/100)+((35000-13000)*23/100)+
((reddito-35000)*33/100);
        printf("hai un reddito di %f", tasse);
    }
    // completare usando la struttura if .... elseif ...elseif .....
else
    printf("\n\nPremi un tasto per uscire");
    fflush(stdin);
    getchar();   // trucco per far rimanere aperta la finestra di
testo
    return 0;
}
//////////////////////////////////////////////// esercizio corretto
dal mio tutor dicendomi che andava
bene///////////////////////////////////////////////
QUELLO CHE CHIEDEVO ERA UN ALTRA COSA E CIO QUELLO CHE MI ERA STATO
CHIESTO O MEGLIO DI USARE
  //Partendo dalla traccia di codice sotto riportata, edita un
programma che, dato in ingresso
  //un reddito, calcoli le tasse secondo il seguente schema di
aliquote:
//fino a 7000 euro: esenzione;
//da 7000 a 13000 euro: aliquota al 13%; //da 13000 a 35000 euro:
aliquota al 23%; //oltre 35000 euro: aliquota al 33%.
 // completare usando la struttura case
   // serviranno anche degli if all'interno dei singoli casi?
//$$$$$$$$$$$$$$$$$$$$$$$$
LA TRACCIA CHE MI è STATA DATA è QUESTA
#include <stdio.h>
int main()
{
   float  reddito;
   float tasse;
   printf("Inserire il reddito in euro (es: 13402,32):\n");
   scanf("%f", &reddito);
 // completare usando la struttura case
   // serviranno anche degli if all'interno dei singoli casi?
   printf("\n\nPremi un tasto per uscire");
   fflush(stdin);
   getchar();   // trucco per far rimanere aperta la finestra di
testo
   return 0;
}

    fflush(stdin);
fflush() è definita solo per stream di output.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

     printf("hai tasse per %lfn", tasse(reddito));
Non serve %lf per i double (oltretutto dovrebbe essere %Lf).  Con printf()
c'č la promozione di tipo (float --> double), quindi, a differenza di
scanf(), %f vale sia per i float che per i double.


 senso.
Per precisione: non č che non abbia senso a priori, ha un comportamento
indefinito da standard, il che non esclude che su alcune piattaforme tale
comportamento possa essere definito.


    // serviranno anche degli if all'interno dei singoli casi?
Non riesco a capire la domanda:
che cosa e' una "struttura case" ?
sarebbe forse uno switch() ?
Non e' assolutamente indicato uno switch() in questa circostanza.
Lo switch si utilizza quando devi discriminare tra diverse costanti
numeriche.
Qui invece hai delle condizioni di disuguaglianza.
A differenza del basic dove la SELECT consente di mettere delle
condizioni di disuguaglianza, in C il confronto e' solo di uguaglianza,
e per giunta tra numeri: niente stringhe.
Pertanto una serie di if a cascata, con tutte le condizioni previste, e'
a mio parere la soluzione piu' semplice e piu' leggibile.


capisco esattamente che non è utile usare switch in una situazione
come questa ma il mio esercizio lo richiede e per poterlo utilizzare
mi chiedono anche se è necessario utilizzare degli if e penso proprio
di si per ora ho provato a fare cosi anceh se non mi funziona alla
perfezione avete dei suggerimenti.
#include <stdio.h>
int main()
{
int fascia_Reddito;
float reddito;
float tasse;
printf("Inserire il reddito in euro (es: 13402,32):\n");
scanf("%f", &reddito);
if (reddito <=7000) fascia_Reddito=1;
else if (reddito < 13000) fascia_Reddito=2;
else if (reddito < 35000) fascia_Reddito=3;
switch (fascia_Reddito){
case '1': tasse = 0+((reddito-7000)*13/100);
break;
case (2): tasse = tasse = (0+((13000-7000)*13/100)+
((reddito-13000)*23/100));
break;
case (3): printf("\n\n Sei esente");
break;
default: tasse = tasse = (0+((13000-7000)*13/100)+
((35000-13000)*23/100)+((reddito-35000)*33/100));
//printf("\n\n Sei esente");
break;
}
printf("\n\n La tua aliquota da pagare e':%f", tasse);


 fflush(stdin);
Toglilo.


 perfezione avete dei suggerimenti.
Il problema di fondo è che non sarà utile, *per te*, farti fare il compito
di scuola dagli altri. Cosa stai imparando da queste risposte del ng? Stai
chiedendo come risolvere un problema con gli if e gli switch ma mi sembra
che tu non ne abbia la completa padronanza. E continui a restarne senza.
Credo che se tu avessi studiato a fondo prima questi costrutti avresti
potuto risolvere il problema da solo, magari con prove e tentativi dai
quali avresti imparato molto di più.
-- 
Ti scrivo perchè ora non ho niente da fare, 
e concludo subito perchè non ho niente da dire.

 dagli le altre variabili che sono (reddito<13000 , reddito<35000 e
??????
Per curiosità: quanti anni hai, quale scuola superiore hai fatto e che 
voti avevi in italiano?
Non te la prendere a male, ma se davvero pensi di laurearti, pensa anche 
seriamente a migliorare il tuo italiano. Scrivere cose del genere ti 
squalifica istantaneamente di fronte a chiunque. Dopo hai voglia a 
sventolare la laurea... come minimo ti chiedono se l'hai trovata 
nell'uovo di pasqua :-)

 ha scritto nel messaggio
news:1171447074....@s48g2000cws.googlegroups.com...
capisco esattamente che non è utile usare switch in una situazione
come questa ma il mio esercizio lo richiede e per poterlo utilizzare
mi chiedono anche se è necessario utilizzare degli if e penso proprio
di si per ora ho provato a fare cosi anceh se non mi funziona alla
perfezione avete dei suggerimenti.
Era quello che ti avevo suggerito, anche se ripeto che il metodo è molto
inefficiente.
Per il fatto che non ti funziona ti consiglio di rivedere il codice e capire
cosa fa per bene: ad esempio per fascia_Reddito=3 hai messo esente, non
ricordo esattamente i parametri iniziali del problema ma dubito che fosse
esente la fascia 3, forse è la 1 :-)
Infine per provare il codice, abituati ad usare una funzione di test o
qualcosa di simile.
Ciao, Enrico

 perfezione avete dei suggerimenti.
Il suggerimento si chiama debug!
E se il tuo ambiente non dispone della possibilita' di eseguire il
programma passo passo, allora devi scriverti una funzioncina di debug
(generalmente una fprintf(stderr,...) da inserire nei punti critici per
visualizzare lo stato delle variabili e dedurre da quello che cosa c'e'
che non va.


Ringrazio tutti voi per gli aiuti che mi avete dato.... ringrazio
anche chi mi ha detto di imparare prima l'italiano e mi scuso se sua
eminenza conesce l'italiano superbiamente e non commette mai errori
dovuti alla fretta o alla stanchezza... ringrazio chi mi ha detto di
cambiare idea sui miei studi.... ma in me la voglia di imparare è
notevole e nessuno nasce genio.... adesso con l'aiuto della mia santa
pazienza e con il riprendere il ragionamento logico della struttura
sono riuscito a risolvere il mio problema magari non perfettamente ma
andro a migliorarmi con il tempo ...
PS non mi sono certo iscritto qui per farmi fare i compitini dagli
altri ma per capire dove sbagliavo e mi sono reso conto perfettamente
di essere una capretta ma nessuno parte programmatore esperto.
Grazie a tutti e spero di poter essere sempre aiutato da persone come
voi,,,,
PS il programma che penso di aver scritto correttametne è il seguente:
#include <stdio.h>
int main()
{
    float reddito;
    float tasse;
    int opzione;
   // opzione = 0;
    printf ("inserite il vostro reddito: \n");
    scanf ("%f", &reddito);
{
          if (reddito <= 7000) opzione = 1;
          else if (reddito <= 13000) opzione = 2;
          else if (reddito < 35000) opzione = 3;
          //else if (reddito > 35000) opzione = 4;
          switch (opzione)
          {
                 case (1) : tasse = 0;
                 break;
                 case (2) : tasse = ((reddito-7000)*13/100);
                 break;
                 case (3) : tasse = ((13000-7000)*13/100)+
((reddito-13000)*23/100);
                 break;
                 default :   tasse = ((13000-7000)*13/100)+
((35000-13000)*23/100)+((reddito-35000)*33/100);
                 break;
                 }
                 printf (" il tuo reddito di %f", tasse);
                 }
                 getchar ();
                 fflush (stdin);
                 main ();
                 }
sicuramente avra errori ma spero di potermi migliorare anche con il
vostro aiuto   // forse sicuramente con il vostro aiuto  ...
l'esperienza conta tantissimo
buon lavoro a tutti...

 l'esperienza conta tantissimo
Da un parsing fatto a occhio, mi pare a posto.
Ti suggerisco di rinominare la variabile "opzione" in "fascia", che
dovrebbe migliorare la leggibilita'.


                 main ();
????