# Erro ao compilar

## Recommended Posts

Muito bom dia a todos do fórum. Um  agradecimento humilde ao HH por toda a ajuda que da no forum...

Estou a fazer o seguinte exercício de um livro (Cprimer plus, Stephen Prata):

Citação

Write a program that requests the hours worked in a week and then prints the gross pay,
the taxes, and the net pay. Assume the following:
a. Basic pay rate = \$10.00/hr
b. Overtime (in excess of 40 hours) = time and a half
c. Tax rate: #15% of the first \$300
20% of the next \$150
25% of the rest
Use #define constants, and don’t worry if the example does not conform to current
tax law.

O codigo que fiz foi este:

```/*  */
#include <stdio.h>
#define PAYRATE 10
#define NORMALTIME 40
#define OVERTIME 1.5
#define PAYRATE2 (PAYRATE*OVERTIME)
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
#define BREAK1 300
#define BREAK2 450
#define TAX1 (RATE1*BREAK1)
#define TAX2 (TAX1+(RATE2*(BREAK2-BREAK1))

int main(void)
{
double hours_w,gross_pay,net_pay,taxes;
hours_w=gross_pay=net_pay=taxes=0.0;

printf("Please insert the number of hours worked this week:\n");
scanf("%lf",&hours_w);

if(hours_w<=NORMALTIME)

gross_pay=hours_w*PAYRATE;
else
gross_pay=(hours_w*PAYRATE)+(hours_w-NORMALTIME*PAYRATE2);
if(gross_pay<=BREAK1)
{
taxes=gross_pay*RATE1;
net_pay=gross_pay-taxes;
}
else if(gross_pay<=BREAK2)
{
taxes=TAX1+(gross_pay-BREAK1)*RATE2;
net_pay=gross_pay-taxes;
}
else
{
taxes=TAX2+(gross_pay-BREAK2)*RATE3;
net_pay=gross_pay-taxes;
}
printf("Number of hours worked:%2.2lf\n",hours_w);
printf("gross pay=%2.2lf; taxes=%2.2lf; net pay=%2.2lf.\n",gross_pay,taxes,net_pay);
return 0;
}```

O programa parece estar bem feito, mas da este estranho erro de compilacao referente ao ultimo else do programa:

Citação

test1.c:41:38: error: expected ‘)’ before ‘;’ token
taxes=TAX2+(gross_pay-BREAK2)*RATE3;
^
test1.c:43:2: error: expected ‘;’ before ‘}’ token
}

Ora se eu alterar o ultimo else para:

```taxes=TAX2+(gross_pay-BREAK2)*RATE3);
net_pay=gross_pay-taxes;;```

...o que semanticamente esta brutalmente mal, mas o programa nao se queixa e corre normal. Esquisito...

O que esta mal? Porque e que isto acontece? E defeito do programa ou falha do compilador...?

Ja agora aproveito e estou aberto a uma possível sugestão de melhoria do programa, e agradeco imenso o vosso apoio e paciencia.

Abraco a todos

##### Share on other sites

Falta-te fechar um ) logo no início:

`#define TAX2 (TAX1+(RATE2*(BREAK2-BREAK1)))`

E por isso é que tens os ( ) desiquilibrados. Um dica simples de otimização:

podes tirar esta linha de todos os ramos do if

`net_pay=gross_pay-taxes;`

e colocar apenas uma vez imediatamente após o if, dado que se repete sempre.

```10 REM Generation 48K!
20 INPUT "URL:", A\$
30 IF A\$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
50 PRINT "./M6 @ Portugal a Programar."```

##### Share on other sites

o problema já foi apontado pelo @M6, mas se pretendes ter o código mais "limpo", aqui tens uma solução

```/*  */
#include <stdio.h>

#define PAYRATE 10.0
#define NORMALTIME 40.0
#define OVERTIME 1.5
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
#define BREAK1 300.0
#define BREAK2 150.0

#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

int main(void)
{
// declaration with instantiation
double hours     = 0.0,
gross_pay = 0.0,
taxes     = 0.0;

// cleaner and safer way to ask for a value
do {
printf("Please insert the number of hours worked this week: ");
fflush(stdout);
fflush(stdin);
} while (scanf(" %lf", & hours) == 0 || hours < 0.0);

// calculate gross pay
gross_pay = (max(hours, NORMALTIME) + max(0.0, hours - NORMALTIME) * OVERTIME) * PAYRATE;

// calculate taxes
taxes = RATE1 * min(gross_pay, BREAK1) +
RATE2 * max(0, min(gross_pay - BREAK1, BREAK2)) +
RATE3 * max(0, gross_pay - BREAK1 - BREAK2);

// present values
printf("Number of hours worked = %2.2lf\n", hours);
printf("gross pay              = %2.2lf\n", gross_pay);
printf("taxes                  = %2.2lf\n", taxes);
printf("net pay                = %2.2lf.\n", gross_pay - taxes);

return 0;
}```
 IRC : sim, é algo que ainda existe >> #p@p
##### Share on other sites

11 horas atrás, M6 disse:

Falta-te fechar um ) logo no início:

```
#define TAX2 (TAX1+(RATE2*(BREAK2-BREAK1)))```

E por isso é que tens os ( ) desiquilibrados. Um dica simples de otimização:

podes tirar esta linha de todos os ramos do if

```
net_pay=gross_pay-taxes;```

e colocar apenas uma vez imediatamente após o if, dado que se repete sempre.

Obrigado por me desfazer a duvida! Era na verdade o que indicou- a falta de parenteses no #define!

Acerca da optimizacao e na verdade uma dica crucial, nao havia necessidade alguma de tantos

`net_pay=gross_pay-taxes;`

bastando apenas um a seguir as condicoes if elses.

```/*  */
#include <stdio.h>
#define PAYRATE 10
#define NORMALTIME 40
#define OVERTIME 1.5
#define PAYRATE2 (PAYRATE*OVERTIME)
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
#define BREAK1 300
#define BREAK2 450
#define TAX1 (RATE1*BREAK1)
#define TAX2 (TAX1+(RATE2*(BREAK2-BREAK1)))

int main(void)
{
double hours_w,gross_pay,net_pay,taxes;
hours_w=gross_pay=net_pay=taxes=0.0;

printf("Please insert the number of hours worked this week:\n");
scanf("%lf",&hours_w);

if(hours_w<=NORMALTIME)

gross_pay=hours_w*PAYRATE;
else
gross_pay=(NORMALTIME*PAYRATE)+((hours_w-NORMALTIME)*PAYRATE2);
if(gross_pay<=BREAK1)
taxes=gross_pay*RATE1;
else if(gross_pay<=BREAK2)
taxes=TAX1+(gross_pay-BREAK1)*RATE2;
else
taxes=TAX2+(gross_pay-BREAK2)*RATE3;
net_pay=gross_pay-taxes;
printf("Number of hours worked:%2.2lf\n",hours_w);
printf("gross pay=%2.2lf; taxes=%2.2lf; net pay=%2.2lf.\n",gross_pay,taxes,net_pay);
return 0;
}```

##### Share on other sites

8 horas atrás, HappyHippyHippo disse:

o problema já foi apontado pelo @M6, mas se pretendes ter o código mais "limpo", aqui tens uma solução

```
/*  */
#include <stdio.h>

#define PAYRATE 10.0
#define NORMALTIME 40.0
#define OVERTIME 1.5
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
#define BREAK1 300.0
#define BREAK2 150.0

#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

int main(void)
{
// declaration with instantiation
double hours     = 0.0,
gross_pay = 0.0,
taxes     = 0.0;

// cleaner and safer way to ask for a value
do {
printf("Please insert the number of hours worked this week: ");
fflush(stdout);
fflush(stdin);
} while (scanf(" %lf", & hours) == 0 || hours < 0.0);

// calculate gross pay
gross_pay = (max(hours, NORMALTIME) + max(0.0, hours - NORMALTIME) * OVERTIME) * PAYRATE;

// calculate taxes
taxes = RATE1 * min(gross_pay, BREAK1) +
RATE2 * max(0, min(gross_pay - BREAK1, BREAK2)) +
RATE3 * max(0, gross_pay - BREAK1 - BREAK2);

// present values
printf("Number of hours worked = %2.2lf\n", hours);
printf("gross pay              = %2.2lf\n", gross_pay);
printf("taxes                  = %2.2lf\n", taxes);
printf("net pay                = %2.2lf.\n", gross_pay - taxes);

return 0;
}```

Este codigo e muito bom! Quem me dera que um dia possa chegar a esta eficiencia. Galactico!

##### Share on other sites

Este codigo e muito bom! Quem me dera que um dia possa chegar a esta eficiencia. Galactico!

se não complicases farias igual ...

 IRC : sim, é algo que ainda existe >> #p@p
##### Share on other sites

19 horas atrás, HappyHippyHippo disse:

se não complicases farias igual ...

Permita-me: Como e que eu deixo de ser complicado? E uma pergunta seria!

##### Share on other sites

Em 6/27/2017 às 17:12, Inacabado disse:

Permita-me: Como e que eu deixo de ser complicado? E uma pergunta seria!

A velha máxima: think twice, code once.

Não que o número de vezes seja de facto importante num sentido tão literal, mas o que se pretende com essa afirmação é dar ênfase ao aspecto de planeamento que deve ser utilizado ao programar; frequentemente conseguimos observar padrões no problema que estamos a tentar resolver quando paramos um pouco para pensar nele.

O teu código original é quase uma tradução do enunciado de Inglês/Português para C -- leste o problema e não pensaste duas vezes, escreveste logo o código.

Relativamente ao HappyHippyHippo, penso que posso dizer que ao olhar para o mesmo enunciado ele tentou primeiro pensar no problema não como código mas sim como uma série de operações matemáticas que, como vimos, podem ser simplificadas para obter uma «fórmula» bastante legível, uma abordagem mais conceptual -- pensou duas vezes -- e só depois fez o código.

## Create an account

Register a new account

×

• #### Revista PROGRAMAR

• Wiki
• IRC
×
• Create New...