PDA

View Full Version : [C] Programma da fare con ciclo while, penso


Cadetto Entusiasta
23-10-2009, 18:53
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è:


#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;

}


solo che, naturalmente non è giusto è deve ancora essere finito, ma non riesco a capire/pensare come faccio a mettere assieme tutti gli if in un while.
Qualcuno pò aiutarmi per favore?

euphyllia87
23-10-2009, 19:13
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è:


#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;

}


solo che, naturalmente non è giusto è deve ancora essere finito, ma non riesco a capire/pensare come faccio a mettere assieme tutti gli if in un while.
Qualcuno pò aiutarmi per favore?

while...?
:mbe:

usare uno switch no? :muro:

euphyllia87
23-10-2009, 19:14
Poi... io non userei gli integer... per i cash ;) ma i floating point!
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 ;)

Cadetto Entusiasta
23-10-2009, 19:18
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"..

euphyllia87
23-10-2009, 19:22
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"..

Dammi due minuti.
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.

Cadetto Entusiasta
23-10-2009, 19:25
Certamente che aspetto.
Guarda, è tutto il pomeriggio che sto facendo prove, schemi, ma non ho ancora risolto niente....
E adesso eccomi qua a :muro:

euphyllia87
23-10-2009, 19:27
#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));
}

Cadetto Entusiasta
23-10-2009, 19:34
Sinceramente, non ho capito molto/quasi niente di quello che hai postato..

euphyllia87
23-10-2009, 19:45
Sinceramente, non ho capito molto/quasi niente di quello che hai postato..

LOL... ho cercato di farlo più semplice possibile.
Devo spiegartelo? Ho usato una funzione calc...

euphyllia87
23-10-2009, 23:27
Ora è completo e corretto:

#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));
}

Ovviamente l'unsigned sui valori float non esiste... l'IEEE ci ha insegnato qualcosa :)

euphyllia87
23-10-2009, 23:38
Rivisto per l'ultima volta

#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));
}

||ElChE||88
24-10-2009, 00:41
Ma li compili i programmi prima di postare?
La funzione calc non restituisce niente.

euphyllia87
24-10-2009, 00:43
Ma li compili i programmi prima di postare?
La funzione calc non ritorna niente.

Infatti è una procedura... ;) non è una funzione.

||ElChE||88
24-10-2009, 00:56
Infatti è una procedura... ;) non è una funzione.
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?

euphyllia87
24-10-2009, 01:00
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?

La funzione RITORNA un valore... una procedura non necessariamente.
La puoi trasformare in funzione con un semplice:

return payments;

ed per l'ANSI C è decisamente più corretto.
La procedura sopra da me descritta non RITORNA un valore, ma restituisce una variabile con un valore.

||ElChE||88
24-10-2009, 01:24
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)
float calc
significa che la funzione restituisce un float. Non restituire niente è sbagliato, avresti dovuto dichiararla come
void calc

2)
(float payments, short int hour, short int value)
Se vuoi che le modifiche alla variabile payments si propaghino al di fuori della funzione devi passare un puntatore alla variabile, altrimenti viene passata solo una copia della variabile.
(float* payments, short int hour, short int value)
...
*payments += ((*payments/36) * (hour * value));

3)
printf("Salario per questa settimana: %.2f Euro\n", calc(payments, hour, RANGE_A));
Se una funzione non restituisce nulla non puoi usarla in quel modo...
calc(&payments, hour, RANGE_B);
printf("Salario per questa settimana: %.2f Euro\n", payments);

euphyllia87
24-10-2009, 01:36
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...

euphyllia87
24-10-2009, 01:40
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).

||ElChE||88
24-10-2009, 02:36
Procedure e funzioni sono un discorso legato a qualsiasi linguaggio di programmazione imperativo... non solo al C.
Il linguaggio C ha soltanto funzioni; la divisione tra funzioni e procedure fa parte di altri linguaggi (Pascal ad esempio)... poi nessuno vieta di applicare il concetto al C (però rimane comunque soltanto un concetto).
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.
Se non è sintatticamente corretto è sbagliato. Comunque:

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).

E' come la storia del void main(); ci sono filosofie di pensiero completamente diverse su questo tema
Purtroppo lo standard non è molto chiaro in merito, ma sono previsti anche tipi di ritorno diversi da int (ANSI C § 5.1.2.2/1 e § 5.1.2.2/3)
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).
Ehm, veramente (come ho specificato sopra) il programma non restituisce il risultato corretto. :fagiano:

euphyllia87
24-10-2009, 07:48
Allora, una cosa e la ripeto per l'ultima volta. :D

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. :D Non girarla in maniera diversa :D

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? :cool: Indagherò quest'oggi.

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

Cadetto Entusiasta
24-10-2009, 11:56
Ringrazio per questi mega discorsi molto interessanti, che però non riesco ancora a comprendere appieno.

Grazie per il programma svolto, ma volevo chiedere delle cose:
- lo stesso programma non si può svolgere con cicli while?
- ho provato a compilare l'ultima versione di euphyllia87, ma facendo i test con 40 e 50 ore lavorative a 360€, il programma mi da in output 1.#R; non è giusto, vero?

euphyllia87
24-10-2009, 12:00
Ringrazio per questi mega discorsi molto interessanti, che però non riesco ancora a comprendere appieno.

Grazie per il programma svolto, ma volevo chiedere delle cose:
- lo stesso programma non si può svolgere con cicli while?
- ho provato a compilare l'ultima versione di euphyllia87, ma facendo i test con 40 e 50 ore lavorative a 360€, il programma mi da in output 1.#R; non è giusto, vero?

In output 1.#R? C'è ti stampa a video questo?

Strano, ieri l ho provato l'ultima volta sulla mia macchina è funziona senza problemi.

è quell'R che non mi convince.

Per quanto riguarda il while...permette l'esecuzione reiterativa di un blocco di istruzioni finché una certa condizione rimane vera.
Come la implementeresti? :)

Cadetto Entusiasta
24-10-2009, 12:11
Sì, a video come risultato di stampa, mi da 1.#R...
Il fatto che forse a te andava e a me no, sarà che facendo girare lo stesso programma con macchine diverse cambia, oppure sarà per il compilatore diverso..

Il fatto di implementare il while con un blocco si istruzioni finchè una non è vera, era ed è il mio reale problema, cioè non so come poterlo fare..

euphyllia87
24-10-2009, 12:13
Sì, a video come risultato di stampa, mi da 1.#R...
Il fatto che forse a te andava e a me no, sarà che facendo girare lo stesso programma con macchine diverse cambia, oppure sarà per il compilatore diverso..

Il fatto di implementare il while con un blocco si istruzioni finchè una non è vera, era ed è il mio reale problema, cioè non so come poterlo fare..

beh il while continua ad eseguirsi finche la condizione non si verifica.
Iniziare il programma intero con un while finche la condizione delle ore non è verificata... potrebbe essere una soluzione, ma onestamente lo trovo poco produttivo (sotto ogni aspetto).

||ElChE||88
24-10-2009, 15:13
Allora, una cosa e la ripeto per l'ultima volta. :D

In C, come in tutti i linguaggi imperativi esistono procedure e funzioni.
Che non vengano usate (le procedure) è un discorso diverso.

Ma esistono.
No, non esistono.
Dai un occhiata al K&R (scritto da colui che ha ideato e implementato il C) e allo standard ANSI: non cè nessun riferimento a procedure. ;)
Il mio sorgente è compilato e funziona; mi riporta i valori esatti.
Impossibile: è proprio sbagliato il modo in cui calcoli il risultato nel caso le ore fossero superiori a 36.
Basta che guardi l'esempio nel primo post - con dei valori di 360 e 38 il risultato dovrebbe essere 384, ma il tuo programma restituisce 380, mentre con dei valori di 360 e 50 il risultato dovrebbe essere 540, ma il tuo programma restituisce 500.
Sì, a video come risultato di stampa, mi da 1.#R...
Il fatto che forse a te andava e a me no, sarà che facendo girare lo stesso programma con macchine diverse cambia, oppure sarà per il compilatore diverso..
Stai usando la versione senza il return, è normale che non funzioni.

Ecco un esempio corretto di come andrebbe risolto l'esercizio:
#include <stdio.h>

int main()
{
float sal, orario;
int ore, diff12 = 0, diff15 = 0;

printf("Inserire il salario settimanale dell’impiegato [Euro]: ");
scanf("%f", &sal);
orario = sal / 36;

printf("Inserire il numero di ore lavorate: ");
scanf("%d", &ore);

if (ore > 46)
{
diff15 = ore - 46;
sal += diff15 * orario * 1.5;
ore -= diff15;
}

if (ore > 36)
{
diff12 = ore - 36;
sal += diff12 * orario * 1.2;
ore -= diff12;
}

printf("Salario per questa settimana: %.0f\n", sal);

if (diff12 > 0)
printf("Numero di ore pagate a 1.2 volte il salario di base: %d\n", diff12);

if (diff15 > 0)
printf("Numero di ore pagate a 1.5 volte il salario di base: %d\n", diff15);

return 0;
}

euphyllia87
24-10-2009, 16:26
Io ho pensato di risolverlo in un altra maniera.
Il K&R intendi di Ritchie?

Strano però che su 2 libri universitari che ho letto e pure il docente universitario introduce alle procedure... che l'ANSI C non ne parli?

Dove posso trovare l'elenco DI TUTTE le regole semantiche/sintattiche dell'ANSI C?

||ElChE||88
24-10-2009, 18:41
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1336.pdf

euphyllia87
24-10-2009, 18:48
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1336.pdf

Grazie mille è un pdf che può tornare molto utile.
Per le procedure che dico a tutti quei docenti/libri ecc che sostengono esistere nel C?

Cadetto Entusiasta
25-10-2009, 16:38
Ecco un esempio corretto di come andrebbe risolto l'esercizio:
#include <stdio.h>

int main()
{
float sal, orario;
int ore, diff12 = 0, diff15 = 0;

printf("Inserire il salario settimanale dell’impiegato [Euro]: ");
scanf("%f", &sal);
orario = sal / 36;

printf("Inserire il numero di ore lavorate: ");
scanf("%d", &ore);

if (ore > 46)
{
diff15 = ore - 46;
sal += diff15 * orario * 1.5;
ore -= diff15;
}

if (ore > 36)
{
diff12 = ore - 36;
sal += diff12 * orario * 1.2;
ore -= diff12;
}

printf("Salario per questa settimana: %.0f\n", sal);

if (diff12 > 0)
printf("Numero di ore pagate a 1.2 volte il salario di base: %d\n", diff12);

if (diff15 > 0)
printf("Numero di ore pagate a 1.5 volte il salario di base: %d\n", diff15);

return 0;
}

Ti ringrazio, ||ElChE||88 per la versione corretta.
Però, dato che vorrei capirci bene sulle cose devo fare, non mi sono accontetato e, sulla falsa riga del tuo, ne ho fatto uno io ex-novo, come l'avrei fatto io, però naturalmente non mi da quello che vorrei.
Questo
#include <stdio.h>

int main()
{

float euro, euro12, euro15, ore, ore12, ore15;

printf("Inserire il salario settimanale dell’impiegato [Euro]: ");
scanf("%f", &euro);
printf("Inserire il numero di ore lavorative: ");
scanf("%f", &ore);

if ( ore <= 36 )
printf("Salario per questa settimana: %.0f Euro\n", euro);

if (ore >= 37 || ore <= 46 )
{
ore12 = ore - 36;
euro12 = euro + ((euro/36) * (ore12 * 1.2));
printf("Salario per questa settimana: %.0f Euro\n", euro12);
}

if (ore >= 47 || ore <= 99 )
{
ore15 = ore - 36;
euro15 = euro + ((euro/36) * (ore15 * 1.5));
printf("Salario per questa settimana: %.0f Euro\n", euro15);
}

if (ore >= 37 || ore <= 46 )
{
ore12 = ore - 36;
printf("Numero di ore pagate a 1.2 volte il salario di base: %.0f\n", ore12);
}

if (ore >= 47 || ore <= 99 )
{
ore15 = ore - 47;
printf("Numero di ore pagate a 1.5 volte il salario di base: %.0f\n", ore15);
}

return 0;
}



che da quello che ho scoperto adesso che sto scrivendo che praticamente uguale a quello che avevo fatto prima....

Perchè poi come output mi da:
http://img12.imageshack.us/img12/8188/outputo.th.jpg (http://img12.imageshack.us/i/outputo.jpg/)
che come prima mi da tutti i tipi di risultati possibili che può dare, senza differenziarli dal tipo di if che gli ho messo io.

Oltre al non capire la differrenza che c'è dalle due stesure del programma, nel tuo non capisco l'utilizzo dei simboli "-=" e "+=", non lì ho ancora studiati, ma dalle definizione che ho sono decremento/incremento non unitario, ma come si utilizzano? A cosa servono?

euphyllia87
25-10-2009, 18:11
il simbolo += sta per somma e riassegna. Un esempio:

A = A + B

può essere scritto come:

A += B

che indica somma ad A, B e riponi in A.
stessa cosa per la differenza

A = A - B

in:

A -= B

Cadetto Entusiasta
25-10-2009, 19:33
Ah, ok, praticamente una scorciatoia, invece di far fare un operazione che sommi alla variabile A la variabile B, senza introdurre una nuova variabile, si usa +=.
E stessa cosa per la differenza.
Grazie

euphyllia87
25-10-2009, 19:44
Ah, ok, praticamente una scorciatoia, invece di far fare un operazione che sommi alla variabile A la variabile B, senza introdurre una nuova variabile, si usa +=.
E stessa cosa per la differenza.
Grazie

Si, risparmi codice e una variabile da dichiarare.

||ElChE||88
25-10-2009, 19:46
Ah, ok, praticamente una scorciatoia, invece di far fare un operazione che sommi alla variabile A la variabile B, senza introdurre una nuova variabile, si usa +=.
E stessa cosa per la differenza.
Grazie
No, non risparmi variabili.
A += B
è uguale ad
A = A + B
Come puoi vedere le uniche variabili sono A e B, presenti in entrambi i casi.

Darecon
25-10-2009, 19:49
Grazie mille è un pdf che può tornare molto utile.
Per le procedure che dico a tutti quei docenti/libri ecc che sostengono esistere nel C?
Scusate l'ot, ma questo interessa anche a me, c'e' qualche fonte ufficiale che dice questo? Mi ha molto incuriosito.. :)

euphyllia87
25-10-2009, 20:04
Scusate l'ot, ma questo interessa anche a me, c'e' qualche fonte ufficiale che dice questo? Mi ha molto incuriosito.. :)

Infatti, chiedo anche io la fonte ufficiale.
E' un documento interessantissimo.

euphyllia87
25-10-2009, 20:07
No, non risparmi variabili.
A += B
è uguale ad
A = A + B
Come puoi vedere le uniche variabili sono A e B, presenti in entrambi i casi.

Risparmia una variabile (in scrittura e in memoria) nel caso di C = A + B; d'altronde non ha senso utilizzare un'altra variabile.

Quindi come dici tu è corretto A = A + B da cui deriva A += B; risparmia una variabile in scrittura (di codice).

Giusto!

Cadetto Entusiasta
25-10-2009, 21:44
Sì infatti, io volevo proprio intendere che si risparmia una variabile per il codice, senza introdurne altre nuove e impiegare più memoria..

euphyllia87
25-10-2009, 21:50
Sì infatti, io volevo proprio intendere che si risparmia una variabile per il codice, senza introdurne altre nuove e impiegare più memoria..

La risparmieresti solo nel caso di C = A + B;
ma nel caso di A = A + B; no. Risparmi solo tempo a scrivere :D

Cadetto Entusiasta
25-10-2009, 21:55
La risparmieresti solo nel caso di C = A + B;
ma nel caso di A = A + B; no. Risparmi solo tempo a scrivere :D

Sì, è vero solo in quel caso...;)

Ma sapreste dirmi cosa sbaglio/cosa c'è di tanto diverso tra

#include <stdio.h>

int main()
{
float sal, orario;
int ore, diff12 = 0, diff15 = 0;

printf("Inserire il salario settimanale dell’impiegato [Euro]: ");
scanf("%f", &sal);
orario = sal / 36;

printf("Inserire il numero di ore lavorate: ");
scanf("%d", &ore);

if (ore > 46)
{
diff15 = ore - 46;
sal += diff15 * orario * 1.5;
ore -= diff15;
}

if (ore > 36)
{
diff12 = ore - 36;
sal += diff12 * orario * 1.2;
ore -= diff12;
}

printf("Salario per questa settimana: %.0f\n", sal);

if (diff12 > 0)
printf("Numero di ore pagate a 1.2 volte il salario di base: %d\n", diff12);

if (diff15 > 0)
printf("Numero di ore pagate a 1.5 volte il salario di base: %d\n", diff15);

return 0;
}

di ||ElChE||88 e il mio

#include <stdio.h>

int main()
{

float euro, euro12, euro15, ore, ore12, ore15;

printf("Inserire il salario settimanale dell’impiegato [Euro]: ");
scanf("%f", &euro);
printf("Inserire il numero di ore lavorative: ");
scanf("%f", &ore);

if ( ore <= 36 )
printf("Salario per questa settimana: %.0f Euro\n", euro);

if (ore >= 37 || ore <= 46 )
{
ore12 = ore - 36;
euro12 = euro + ((euro/36) * (ore12 * 1.2));
printf("Salario per questa settimana: %.0f Euro\n", euro12);
}

if (ore >= 47 || ore <= 99 )
{
ore15 = ore - 36;
euro15 = euro + ((euro/36) * (ore15 * 1.5));
printf("Salario per questa settimana: %.0f Euro\n", euro15);
}

if (ore >= 37 || ore <= 46 )
{
ore12 = ore - 36;
printf("Numero di ore pagate a 1.2 volte il salario di base: %.0f\n", ore12);
}

if (ore >= 47 || ore <= 99 )
{
ore15 = ore - 47;
printf("Numero di ore pagate a 1.5 volte il salario di base: %.0f\n", ore15);
}

return 0;
}

che non riesco a capire?