Jump to content
Inacabado

Erro ao compilar

Recommended Posts

Inacabado

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 this post


Link to post
Share on other sites
M6

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.

  • Vote 1

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

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

 

  • Vote 2

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Inacabado
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.

Assim com a sua mui agradecida ajuada o codigo ficou assim:

/*  */
#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;
}

Muito obrigado; abraco.

Share this post


Link to post
Share on other sites
Inacabado
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 this post


Link to post
Share on other sites
HappyHippyHippo
52 minutes ago, Inacabado said:

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 this post


Link to post
Share on other sites
Inacabado
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 this post


Link to post
Share on other sites
pwseo
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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.