|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
[C] Programma da fare con ciclo while, penso
Allora, ho da fare questo esercizio, e penso ma non ne sono sicurissimo, devo utilizzare il ciclo while.
L'esercizio è: " Scrivere un programma in linguaggio C che determini la paga lorda settimanale di un impiegato. Si tenga presente che: • per le prime 36 ore lavorate l’impiegato riceve il salario settimanale di base; • per le ore lavorate fra 37 e 46 il valore dell’ora aumenta a 1.2 volte il suo valore di base; • per le ore oltre la 46 l’azienda paga 1.5 volte il valore orario base. Il programma chiede e riceve in input il valore del salario settimanale base ed il numero totale di ore lavorate. Il programma deve fornire in output la paga totale specificando i dettagli per le ore lavorate oltre alla 36. Sono riportati qui sotto degli esempi di interazione del programma con diversi dati di ingresso: • Inserire il salario settimanale dell’impiegato [Euro]: 360 Inserire il numero di ore lavorate: 33 Salario per questa settimana: 360 Euro • Inserire il salario settimanale dell’impiegato [Euro]: 360 Inserire il numero di ore lavorate: 38 Salario per questa settimana: 384 Euro Numero di ore pagate a 1.2 volte il salario di base: 2 • Inserire il salario settimanale dell’impiegato [Euro]: 360 Inserire il numero di ore lavorate: 50 Salario per questa settimana: 540 Euro Numero di ore pagate a 1.2 volte il salario di base: 10 Numero di ore pagate a 1.5 volte il salario di base: 4 " Allora, dato che io non ho ancora mai usato il ciclo while, ho fatto che sviluppare il programma con un approccio un pò più semplicistico, cioè: Codice:
#include <stdio.h>
int main()
{
int sal, ore, i, sal12, orep, orepp, sal15;
printf("Inserire il salario settimanale dell'impiegato [Euro]: ");
scanf("%d", &sal);
printf("Inserire il numero di ore lavorative: ");
scanf("%d", &ore);
if( ore <= 36)
printf("Salario per questa settimana: %d\n", sal);
if(( ore >= 37 ) || ( ore <= 46 ))
{
orep = ore - 36;
sal12 = sal + ((sal/36) * (orep * 1.2));
printf("Salario per questa settimana: %d\n", sal12);
printf("Numero di ore pagate a 1.2 volte il salario di base: %d\n", orep);
}
if(( ore >= 46 ) || ( ore <= 99 ))
{
orepp = ore - 36;
sal15 = sal + ((sal/36) * (orepp * 1.5));
printf("Salario per questa settimana: %d\n", sal15);
printf("Numero di ore pagate a 1.5 volte il salario di base: %d\n", orepp);
}
return 0;
}
Qualcuno pò aiutarmi per favore?
__________________
IMPOSSIBLE IS NOTHING |
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Quote:
usare uno switch no?
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Poi... io non userei gli integer... per i cash
Poi la condizione sull'IF è sbagliata... devi usare && (and logico...) Poi l'ultima IF... perche deve essere minore di 99? Non hai un limite imposto nell'esercizio
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard Ultima modifica di euphyllia87 : 23-10-2009 alle 19:17. |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
Il fatto è che lo switch non ce lì hanno ancora spiegati...
E per il floating point al posto degli interi veramente ci avevo pensato anche io, però poi non lì ho usati perchè da output di esempio i valori venivano restituiti tipo "360" e non "360.000"..
__________________
IMPOSSIBLE IS NOTHING |
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Quote:
Lo Switch va bene ma dovresti usare un altro sistema... ovvero dividere i pagamenti in fasce (fascia 1, 2 e 3). Ora ti stampo il codice ottimizzato.
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
Certamente che aspetto.
Guarda, è tutto il pomeriggio che sto facendo prove, schemi, ma non ho ancora risolto niente.... E adesso eccomi qua a
__________________
IMPOSSIBLE IS NOTHING |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Codice:
#include "stdio.h"
float calc(float payments, int hour, int value);
int main(int argc, char* argv[])
{
int hour, value;
float payments;
printf("Inserire il salario settimanale dell'impiegato [Euro, esempio: 100.00]: ");
scanf("%f", &payments);
printf("Inserire il numero di ore lavorative: ");
scanf("%d", &hour);
if(hour <= 36)
{
printf("Salario per questa settimana: %2f\n", payments);
return 0;
}
else if(hour >= 36 && hour <= 47)
{
printf("Salario per questa settimana: %2f\n", calc(payments, hour, 1.2));
return 0;
}
else
{
printf("Salario per questa settimana: %2f\n", calc(payments, hour, 1.5));
return 0;
}
}
float calc(float payments, int hour, int value)
{
hour -= 36;
payments += ((payments/36) * (hour * value));
}
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
Sinceramente, non ho capito molto/quasi niente di quello che hai postato..
__________________
IMPOSSIBLE IS NOTHING |
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Quote:
Devo spiegartelo? Ho usato una funzione calc...
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard |
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Ora è completo e corretto:
Codice:
#include "stdio.h"
float calc(float payments, int hour, int value);
int main(int argc, char* argv[])
{
int unsigned hour, value;
float payments;
printf("Inserire il salario settimanale dell'impiegato [Euro, esempio: 100.00]: ");
scanf("%f", &payments);
printf("Inserire il numero di ore lavorative: ");
scanf("%d", &hour);
if(hour <= 36)
{
printf("Salario per questa settimana: %.2f\n", payments);
return 0;
}
else if(hour > 36 && hour <= 47)
{
printf("Salario per questa settimana: %.2f\n", calc(payments, hour, 1.20));
return 0;
}
else
{
printf("Salario per questa settimana: %.2f\n", calc(payments, hour, 1.50));
return 0;
}
}
float calc(float payments, int hour, int value)
{
hour -= 36;
payments += ((payments/36) * (hour * value));
}
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Rivisto per l'ultima volta
Codice:
#include "stdio.h"
#define RANGE_A 1.20
#define RANGE_B 1.50
float calc(float payments, short int hour, short int value);
int main(int argc, char* argv[])
{
unsigned short int hour, value;
float payments;
printf("Inserire il salario settimanale dell'impiegato [Euro, esempio: 100.00]: ");
scanf("%f", &payments);
printf("Inserire il numero di ore lavorative: ");
scanf("%hd", &hour);
if(hour <= 36)
{
printf("Salario per questa settimana: %.2f Euro\n", payments);
return 0;
}
else if(hour > 36 && hour <= 47)
{
printf("Salario per questa settimana: %.2f Euro\n", calc(payments, hour, RANGE_A));
return 0;
}
else
{
printf("Salario per questa settimana: %.2f Euro\n", calc(payments, hour, RANGE_B));
return 0;
}
}
float calc(float payments, short int hour, short int value)
{
hour -= 36;
payments += ((payments/36) * (hour * value));
}
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Ma li compili i programmi prima di postare?
La funzione calc non restituisce niente. Ultima modifica di ||ElChE||88 : 24-10-2009 alle 00:57. |
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Quote:
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard Ultima modifica di euphyllia87 : 24-10-2009 alle 00:45. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Può anche essere la dentiera di mia nonna, ma se scrivi float calc significa che devi restituire un float.
PS: Qual'è la differenza tra procedura e funzione? Ultima modifica di ||ElChE||88 : 24-10-2009 alle 01:02. |
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Quote:
La puoi trasformare in funzione con un semplice: Codice:
return payments; La procedura sopra da me descritta non RITORNA un valore, ma restituisce una variabile con un valore.
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Sei sei sicuro di sapere il C?
In C ci sono soltanto funzioni. Quando parli di procedura probabilmente intendi una funzione che non restituisce niente (void) e che modifica una delle variabili passate negli argomenti. Tralasciando il fatto che il modo in cui esegui i calcoli è sbagliato (basta provare con gli esempi del primo post), gli errori gravi che hai fatto sono: 1) Codice:
float calc Codice:
void calc Codice:
(float payments, short int hour, short int value) Codice:
(float* payments, short int hour, short int value) ... *payments += ((*payments/36) * (hour * value)); Codice:
printf("Salario per questa settimana: %.2f Euro\n", calc(payments, hour, RANGE_A));
Codice:
calc(&payments, hour, RANGE_B);
printf("Salario per questa settimana: %.2f Euro\n", payments);
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Procedure e funzioni sono un discorso legato a qualsiasi linguaggio di programmazione imperativo... non solo al C.
Per quanto riguarda la funzione ritorna un float nel caso tu ritorni un float. Se non ritorni un niente, è una procedura; è corretto indicarla con un void ma non sbagliato indicarla con un tipo di dato diverso al void; certo non è sintatticamente corretto. E' un pò come la storia del void main(); c'è chi sostiene che il main debba ritornare un integer e quindi si definisce come int main con un return finale, c'è chi invece definisce il void e non ritorna niente (e qui splittano i vari utilizzi/impieghi/necessità del void/int main). Per quanto riguarda il discorso del puntatore... è una cosa che non sapevo; di solito utilizzo il puntatore per accedere alle locazioni di memoria delle variabili. PS. non ho mai detto di essere un esperto del C di conseguenza posso commettere anche degli errori di sintassi, non toccando questo splendido linguaggio da oltre 6 anni...
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard Ultima modifica di euphyllia87 : 24-10-2009 alle 01:50. |
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Ho dato uno scorcio ora al tuo codice.
Cosa ritornerebbe ora calc dopo la modifica? payments? Ma non era un puntatore? EDIT: ho intuito che hai cambiato il tipo di dato della funzione. Tornando in tema, l'unico errore 'grave' da me commesso è l'assenza del return nella funzione calc di tipo float. E nonostante questo siamo riusciti a fornire due soluzioni valide e funzionanti all'utente che ne aveva bisogno (lo scopo del topic).
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard Ultima modifica di euphyllia87 : 24-10-2009 alle 01:46. |
|
|
|
|
|
#19 | ||||
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
Quote:
ANSI C § 6.9.1/12 If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined. Tu hai fatto proprio questo (usato la funzione all'interno della printf). Quote:
Quote:
|
||||
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 209
|
Allora, una cosa e la ripeto per l'ultima volta.
In C, come in tutti i linguaggi imperativi esistono procedure e funzioni. Che non vengano usate (le procedure) è un discorso diverso. Ma esistono. Ne ho avuto conferma guardando almeno una decina di codici sorgenti di 'progetti' opensource, prendendo in mano due libri di C e guardando gli appunti di un mio docente universitario che si occupa di C e basta. Su questo sono sicuro. Per la storia dell'annidamento delle funzioni, sai che non lo sapevo? Mi fai crollare un mondo! D'altronde non toccando C da tanti anni alcune cose si dimenticano, soprattutto se utilizzi linguaggi OOP come Java e C#. Il mio sorgente è compilato e funziona; mi riporta i valori esatti. Come è possibile? PS. ora basta però mi sa che siamo ampiamente in OT, la soluzione l'abbiamo fornita all'utente Se vuoi continuare a parlarne possiamo farlo benissimo in PVT
__________________
MacBook White 13.3'' Intel CPU :: 2GB DDR2 800Mhz :: 160Gb :: Mac OS X 10.6 Snow Leopard Ultima modifica di euphyllia87 : 24-10-2009 alle 08:08. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:32.




















