Ir ao conteúdo

Posts recomendados

Postado

Boa tarde,

Estou no 1 semestre de analise e desenvolvimento de sistemas, não consegui tirar a duvida antes das férias, gostaria que alguém pudesse me ajudar. o codigo esta rodando bem em todos os descontos, com exceção do desconto acima do teto que seria de 621.04 para quem ganha acima de 5646.81. o valor sempre apresenta negativo, como corrigir? Segue o código abaixo e o print do "erro".  tentar explicar de outra forma, na hora de aparecer o valor do desconto INSS para quem ganha acima de 5646.81 o mesmo ja esta aparecendo o salario-o desconto. quando deveria aparecer somente o desconto de 

 

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {

float salario, inss, ir, sal_liquido;

printf("Informe seu salario bruto:");
scanf("%f", &salario);

if (salario<=1693.72){
    inss=salario*0.08;
}
else

if (salario>=1693.73 && salario<=2822.90){
    inss=salario*0.09;
}
else
if (salario>=2822.91 && salario<=5646.80){
    inss=salario*0.11;
}
else
if (salario>=5646.81){
    inss=salario-621.04;
}
if (salario>=1903.99 && salario<=2826.65){
    ir=salario*0.075;
}
else
if (salario>=2826.66 && salario<=3751.05){
    ir=salario*0.15;
}
else
if (salario>=3751.06 && salario<=4664.68){
    ir=salario*0.225;
}
else
if (salario>=4664.69){
    ir=salario*0.275;
}


sal_liquido=(salario-inss)-ir;

printf("\nDesconto INSS: %8.2f",inss);
printf("\nDesconto IR: %8.2f",ir);
printf("\nVoce vai receber: %8.2f",sal_liquido);


    return 0;
}

Salario.png

Postado

@Evandro Candido Constantes decimais em C++ são double então envite comparar constantes desse tipo com float como fez. Isso pode levar a erros em testes condicionais, p.ex,

 

int main(void){
    float valor = 0.01;
        
    if(valor == 0.01){
        cout << "Igual\n";
    }else{
        cout << "Diferente\n";
    }
    return 0;
}

 

Esse código vai retornar "Diferente", para evitar isso você pode declarar a variável como double ou então fazer uma conversão da constante com cast ou colocar 0.01f (f no valor).

 

Para testar a tabela dos valores não precisa colocar o intervalo, basta fazer um teste de cada,

if(salario <= 1693.72){
    
}else if(salario <= 2822.90){
    
}else if(salario <= 5646.80){
    
...

 

No caso do desconto, o valor não devia ser só abatido do salário em vez de atribuir a diferença para a variável inss?

Postado

@Evandro Candido Olá Evandro, como vai?

 

Matematicamente falando, os códigos estão sendo executados corretamente, veja a seguir:

 

Se eu informar, por exemplo, 5800 reais eu vou cair na condição igual ou maior que 5646,81, correto? Em outras palavras:

 

INSS recebe 5800-621,04=5178,96

 

Prosseguindo na source, você calcula em seguida o IR com salário igual ou acima de 4664,69, que é o nosso caso, tu discorre desta forma:

 

IR recebe 5800*0,275=1595

 

No final você calcula o salário líquido desta forma:

 

Salário Líquido recebe (5800-5178,96)-1595=−973.96

 

O seu código está totalmente correto, o resultado está dando negativo, pois você - não sei por que -, está descontando 621,04 e a multiplicação do IR é gigantesca, neste caso, 0.275, entendeu?

 

Eu nem precisei manipular o seu código, eu só peguei uma folha e caneta aqui do meu lado e fui seguindo o passo a passo do seu código.

 

Isso não é bug.

 

Até.

Postado

@Evandro Candido Nas suas condicionais a variável inss já recebe o valor que deve ser abatido do bruto na atribuição de sal_liquido. Então não é a diferença que deve atribuir a inss, mas o valor desse desconto: inss = 621.04.

Postado
3 minutos atrás, ZTM disse:

@Evandro Candido Olá Evandro, como vai?

 

Matematicamente falando, os códigos estão sendo executados corretamente, veja a seguir:

 

Se eu informar, por exemplo, 5800 reais eu vou cair na condição igual ou maior que 5646,81, correto? Em outras palavras:

 

INSS recebe 5800-621,04=5178,96

 

Prosseguindo na source, você calcula em seguida o IR com salário igual ou acima de 4664,69, que é o nosso caso, tu discorre desta forma:

 

IR recebe 5800*0,275=1595

 

No final você calcula o salário líquido desta forma:

 

Salário Líquido recebe (5800-5178,96)-1595=−973.96

 

O seu código está totalmente correto, o resultado está dando negativo, pois você - não sei por que -, está descontando 621,04, entendeu?

 

Eu nem precisei manipular o seu código, eu só peguei uma folha e caneta aqui do meu lado e fui seguindo o passo a passo do seu código.

 

Isso não é bug.

 

Até.

@ZTMObrigado por disponibilizar seu tempo.

 

Então, a intenção não é fazer (5800-5178,96)-1595=−973.96

a intenção é que se eu colocar qualquer valor acima de 5646,81 ele desconte 621,04 e dai no exemplo mencionado deveria aparecer:

salario 5800

 

Desconto INSS: 621,04

Desconto IR: 1595

Você vai receber: 3.583,96

 

Como descrever essa parte em codigo, pois o meu no caso esta fazendo exatamente como você discorreu no papel

10 minutos atrás, Midori disse:

@Evandro Candido Nas suas condicionais a variável inss já recebe o valor que deve ser abatido do bruto na atribuição de sal_liquido. Então não é a diferença que deve atribuir a inss, mas o valor desse desconto: inss = 621.04.

@Midori Perfeito, sabia que era algo simples. Funcionou da forma desejada. Agradeço demais seu tempo em me ajudar,

Postado

@Evandro Candido

 

Ficaria desta maneira.

 

sal_liquido = (salario-ir)-621,04

 

Eu achava que o 621,04 era o desconto obrigatório e que futuramente você iria utilizar o valor de INSS.

 

Fiz a source aqui, espero que tenha gostado.

 

spacer.png

 

spacer.png

 

#include <stdio.h>


int main(void) {

float salario, inss, ir, sal_liquido, sal_liquido2;


printf("Informe seu salario bruto:");
scanf("%f", &salario);

if (salario<=1693.72){
	inss=salario*0.08;
}
else if (salario>=1693.73 && salario<=2822.90){
	inss=salario*0.09;
}
else if (salario>=2822.91 && salario<=5646.80){
	inss=salario*0.11;
}



if (salario>=1903.99 && salario<=2826.65){
	ir=salario*0.075;

}else if (salario>=2826.66 && salario<=3751.05){
	ir=salario*0.15;

}
else if (salario>=3751.06 && salario<=4664.68){
	ir=salario*0.225;

}
else if (salario>=4664.69){
    ir=salario*0.275;
}



sal_liquido=(salario-inss)-ir;

if(salario>=5646.81) {

	sal_liquido2 = (salario-ir)-621.04;

	printf("Desconto INSS: 621,04\n");
	printf("Desconto IR: %.2f\n",ir);
	printf("voce vai receber: %.2f\n", sal_liquido2);

}else if(salario < 5646.81){

	printf("Desconto INSS: %.2f\n",inss);
	printf("Desconto IR: %.2f\n",ir);
	printf("voce vai receber: %.2f\n",sal_liquido);
}

    return 0;
}

 

 

Até.

 

By ZTM.

Postado
30 minutos atrás, ZTM disse:

@Evandro Candido

 

Ficaria desta maneira.

 

sal_liquido = (salario-ir)-621,04

 

Eu achava que o 621,04 era o desconto obrigatório e que futuramente você iria utilizar o valor de INSS.

 

Fiz a source aqui, espero que tenha gostado.

 

spacer.png

 

spacer.png

 

#include <stdio.h>


int main(void) {

float salario, inss, ir, sal_liquido, sal_liquido2;


printf("Informe seu salario bruto:");
scanf("%f", &salario);

if (salario<=1693.72){
	inss=salario*0.08;
}
else if (salario>=1693.73 && salario<=2822.90){
	inss=salario*0.09;
}
else if (salario>=2822.91 && salario<=5646.80){
	inss=salario*0.11;
}



if (salario>=1903.99 && salario<=2826.65){
	ir=salario*0.075;

}else if (salario>=2826.66 && salario<=3751.05){
	ir=salario*0.15;

}
else if (salario>=3751.06 && salario<=4664.68){
	ir=salario*0.225;

}
else if (salario>=4664.69){
    ir=salario*0.275;
}



sal_liquido=(salario-inss)-ir;

if(salario>=5646.81) {

	sal_liquido2 = (salario-ir)-621.04;

	printf("Desconto INSS: 621,04\n");
	printf("Desconto IR: %.2f\n",ir);
	printf("voce vai receber: %.2f\n", sal_liquido2);

}else if(salario < 5646.81){

	printf("Desconto INSS: %.2f\n",inss);
	printf("Desconto IR: %.2f\n",ir);
	printf("voce vai receber: %.2f\n",sal_liquido);
}

    return 0;
}

 

 

Até.

 

By ZTM.

Sem palavras para agradecer o tempo disponibilizado @ZTM. Muito obrigado, de verdade!

Postado

@Evandro Candido

 

Eu estava ocupado e acabei visualizando o seu tópico, logo, comecei fazendo os cálculos, quando fui ver estava programando.

 

Essa source está em C, mas a diferença para C++ provavelmente foi a substituição de:

 

#include <iostream.h>

para

#include <stdio.h>

 

Peço desculpas, fiz na correria.

Postado
                if (salario >= 5646.81) {
                    inss = salario - 621.04;
                }

 

Isso não é o que você queria escrever. Nada tem a ver com `C++` esse problema. O teto de contribuição que está no enunciado é de 621.04. Esse é o valor do desconto para qualquer valor acima desses 5646.81 como você escreveu. Então escreva o certo para esse caso:

 

    inss = 621.04;


Mas não é só isso 😞 

 

    if (salario <= 1693.72) {
        inss = salario * 0.08;
    }
    else
        if (salario >= 1693.73 && salario <= 2822.90) {
            inss = salario * 0.09;
        }
        else
            if (salario >= 2822.91 && salario <= 5646.80) {
                inss = salario * 0.11;
            }
            else
                if (salario >= 5646.81) {
                    inss = salario - 621.04;
                }


Veja bem o que escreveu... É fato conhecido que se o salário não é <= 1693.72 ele é maior. Porque testou de novo TODOS os intervalos? Isso deve custar boa parte de sua nota --- se eu corrigir seu programa. Não pode acabar de testar se é <= e depois testar se é >= o mesmo valor mais um centavo

 

Veja como pode ser mais simples:


 

   float inss = 621.04; // teto do desconto
    if (salario <= 1693.72)
        inss = salario * 0.08;
    else
        if (salario <= 2822.90)
            inss = salario * 0.09;
        else
            if (salario <= 5646.80)
                inss = salario * 0.11;

 

E não use essas dezenas de chaves se não precisa. 

 

No caso do IR é o mesmo problema: ou é isento ou paga. Veja


 

   // ir
    float ir = 0.; // isento
    if (salario >= 1903.99)
        if (salario <= 2826.65)
            ir = salario * 0.075;
        else
            if (salario <= 3751.05) 
                ir = salario * 0.15;
            else
            if (salario <= 4664.68)
                ir = salario * 0.225;
            else
                ir = salario * 0.275;


E na saída não pode usar um monte de printf() de uma linha a invés de um printf() de várias linhas. Não é esperto e vai levar umas 20x mais tempo. Além de ficar um inferno para alinhar os dados.

 

Veja o simples:

 

    // extrato
    printf("\
    Desconto INSS:    %8.2f\n\
    Desconto IR:      %8.2f\n\
    voce vai receber: %8.2f",
    inss, ir, (salario - ir - inss));


 

Note que não precisa do valor do saldo a receber já que não vai usar para nada.

 

E assim tem um EXEMPLO

 

#include <cstdio>
int main(void)
{
    // salario?
    float salario = 0.;
     printf("Informe seu salario bruto: ");
    if (1 != scanf("%f", &salario)) return -1;
    printf("\n    Salario:          %8.2f\n", salario);
    // inss
    float inss = 621.04;
    if (salario <= 1693.72)
        inss = salario * 0.08;
    else
        if (salario <= 2822.90)
            inss = salario * 0.09;
        else
            if (salario <= 5646.80)
                inss = salario * 0.11;
    // ir
    float ir = 0.; // isento
    if (salario >= 1903.99)
        if (salario <= 2826.65)
            ir = salario * 0.075;
        else
            if (salario <= 3751.05) 
                ir = salario * 0.15;
            else
            if (salario <= 4664.68)
                ir = salario * 0.225;
            else
                ir = salario * 0.275;
    // extrato
    printf("\
    Desconto INSS:    %8.2f\n\
    Desconto IR:      %8.2f\n\
    voce vai receber: %8.2f",
    inss, ir, (salario - ir - inss));
    return 0;
}


Que mostra
 

Informe seu salario bruto: 6000.25

    Salario:           6000.25
    Desconto INSS:      621.04
    Desconto IR:       1650.07
    voce vai receber:  3729.14
    


Seu programa tem vários problemas ainda.

 

  • Se está programando em `C++` e até incluiu `iostream` faça o simples e use `cout`. `C` e `C++` são linguagens muito diferentes e não ajuda nada usar partes de `C` nesses programas. Não use `printf()`. Se pode e prefere apenas escreva em `C`. Isso vale também para o uso de `scanf()` a menos que precise realmente do scanner. `scanf()` é um scanner de todo modo. Para simplesmente ler valores use `cin`.
  • Se vai usar `scanf()` leia o manual e entenda que `scanf()` retorna um `int`. SEMPRE teste o retorno.
  • Como está aprendendo, se acostume a mostrar na tela os valores do que leu. Muitas vezes pode ter surpresas. MOSTRE o valor lido para o salário. Veja o exemplo acima, que imprime o salário antes de calcular os descontos
  • use os includes de C como recomendado: tire o .h e coloque um c na frente. stdio.h vira cstdio por exemplo. É o padrão.
  • Se não usa a linha de comando não declare os parâmetros. Use só 
    int main(void)


 

Claro que você devia usar (a linha de comando) porque é muito chato num programa que lê um único valor ter que rodar o programa, esperar um prompt, digitar o salário e teclar ENTER. Mesmo que tenha que ler depois só coloque isso depois de seu programa estar testado. Só vai perder tempo. No geral NUNCA escreva um programa interativo. 

Inicialize todas as variáveis e declare uma por linha. É grátis. E nem todos seus programas vão ter 20 linhas.

 

  • Curtir 1
  • Obrigado 1
Postado

@arfneto

 

Segue as dicas do arfneto.

 

Apesar de você estar fazendo Análise e Desenvolvimento de Sistemas, onde grande parte dessas Universidades não se preocupam em ensinar coisas mais aprofundadas, só devem ficar no famoso Python, PHP, HTML5, CSS3, Javascript, enfim, nesse tecnólogo nem deve ter Estrutura de Dados, porém, é aí que surge a pergunta de alguns: Será que estas pessoas que fazem o tecnólogo(2 anos) visando entrar no mercado rápido, precisam mesmo aprender coisas mais complexas, sendo que talvez ele irá ser especialista em PHP ou algo do tipo? Deixo para vocês pensarem. Em contra partida, já vi Engenheiro da Computação fazendo Engenharia Reversa em código binário, coisa maluca, esta galera PRECISA saber disso, enfim.

 

Se quiser ser um bom profissional vai ter que ler os livros específicos, trabalhar na resolução de problemas com resposta enxuta, esguia, buscar em português nos forums problemas semelhantes ao seu, tanto em português, inglês ou até em outras línguas. Uma gambiarra todo mundo gosta, mas isso é no seu computador, no mercado de trabalho é cobrança e muita disputa.

 

Nunca se esqueça que os melhores na computação, passam o dia inteiro na frente de um computador, respiram computação, sei que a vida é difícil e precisamos trabalhar, cuidar da família, se engajar em outras coisas, mas é isso.

 

São pessoas mais experientes como o arfneto e outros aqui do forum que passam a visão sobre a computação, hoje está até melhor, antigamente ninguém ensinava nada.

 

Ah, eu nem faço faculdade, se eu errei algo no meu código foi na correria, eu vi todas as condições, porém, eu não iria enxugar aquilo, só queria solucionar.

 

Valeu.

  • Curtir 1
Postado

@arfneto e @ZTM Sem duvidas em poucos topicos, vocês ja ensinaram mais que o 1 semestre. Os inúmeros erros ou trabalhos que tive foi justamente por seguir a linha de ensinamento da faculdade, que de fato não estão se preocupados em ensinar coisas mais complexas. INclusive essa questão de calcularem INSS e IR eles pararam no momento de calcular os 9% e pasmem, a professora quando rodou apresentou erro, desconversou e ja pulou para uso das condições (do- while). Enfim foi imensamente grato ao esclarecimento não só desta questão, como as dicas apresentadas, irem refazer utilizando as dicas até mesmo para economizar trabalho, uma vez  que o código pode ficar muito mais simples. Obrigado de coração.

  • Curtir 1
Postado

@arfneto Desculpe tomar seu tempo por mais uma vez, estou estudando aqui as dicas passadas e dado um exemplo aleatório usando varios printf

#include <stdio.h>

int main(){

float altura[3] = {1, 1.5, 1.7};

printf("\n Vetor altura[0] = %f",altura[0]);

printf("\n Vetor altura[1] = %f",altura[1]);

printf("\n Vetor altura[2] = %f",altura[2]);

return 0;

}

 

Utilizei a dica e reduzi para:

 

#include <stdio.h>
int main(){
    float altura[3] = {1, 1.5, 1.7};
    printf("\
    Vetor altura[0] = %f\n\
    Vetor altura[1] = %f\n\
    Vetor altura[2] = %f", altura[0], altura[1], altura[2]);
    
    
    return 0;
}

 

Estou fazendo um mega intensivo de retrospectiva do semestre, o que complica é que como vocês ja observaram eles não aprofundaram tanto e nem sei se irão, então estou tentando coletar o máximo de informações e dicas em sites e ajuda de vocês. 

  • Curtir 1
Postado
2 horas atrás, Evandro Candido disse:

Os inúmeros erros ou trabalhos que tive foi justamente por seguir a linha de ensinamento da faculdade, que de fato não estão se preocupados em ensinar coisas mais complexas

 

Não fique preocupado, mas essas não são "coisas mais complexas".  Trata-se de calcular dois valores e mostrar um extrato apenas. Seu curso adota um livro? Talvez fosse bom ter um livro ou dois.

 

47 minutos atrás, Evandro Candido disse:

Utilizei a dica e reduzi para:

 

Eu te mostrei um exemplo e o resultado. Não entendi se tem uma pergunta ou só está mostrando algo. Atente para as outras coisas que te expliquei. Não perguntou nada sobre aquilo.

 

Ainda em relação ao programa, eis um segundo exemplo, ainda usando printf() e scanf() da biblioteca de C

 

#include <cstdio>

float c_inss(float);
float c_ir(float);

int main(void)
{
	float salario = 0.f;
	printf("Informe seu sal bruto: ");
	if (1 != scanf("%f", &salario)) return -1;
	printf("\n\n    %-20s  %8.2f\n", "Salario:", salario);
	// usa as funcoes para inss e ir
	float inss = c_inss(salario);
	float ir = c_ir(salario);
	// extrato
	printf("\
    %-20s  %8.2f\n\
    %-20s  %8.2f\n\
    %-20s  %8.2f\n\n",
    "Desconto INSS:", inss,
    "Desconto IR:", ir,
    "voce vai receber:", (salario - ir - inss));
	return 0;
}

float c_inss(float sal)
{	// retorna o valor do inss
	float inss = 621.04f;
	if (sal <= 1693.72f)
		inss = sal * 0.08f;
	else
		if (sal <= 2822.90f)
			inss = sal * 0.09f;
		else
			if (sal <= 5646.80f)
				inss = sal * 0.11f;
	return inss;
}

float c_ir(float sal)
{	
	// retorna o valor do ir
	float ir = 0.; // isento
	if (sal >= 1903.99)
		if (sal <= 2826.65)
			ir = sal * 0.075f;
		else
			if (sal <= 3751.05f)
				ir = sal * 0.15f;
			else
				if (sal <= 4664.68f)
					ir = sal * 0.225f;
				else
					ir = sal * 0.275f;
	return ir;
}

 

 

A diferença

 

  • Entenda o us de funções para calcular IR e INSS. Isso separa as coisas para testar e para poder em outros programas.
  • Veja o uso de protótipos para declarar as funções antes e o código depois.
  • %-20s nos printf alinha os campos a esquerda com 20 posições e assim não precisa ficar contando os espaços para alinhas. Bem conveniente
  • O uso do sufixo f para as constantes float. Em muitos lugares, escolas e empresas, todos os avisos do compilador são tratados como erro e toda conversão implícita é condenada. E 2.0 é double e 2.0f é float. Se escrever
        float dois = 2.0; 
    estará usando uma conversão implícita e isso é rejeitado em geral.

 

 

A saída é claro a mesma.

  • Obrigado 1
Postado

@arfneto Se trata de faculdade EAD, estou lendo o livro "recomendado" deles. Mais uma vez refiz com base no que eles passaram até agora e com as modificações de dicas sua e ficou desta forma:

#include <stdio.h>
int main(){
    float salario, inss, ir, sal_liquido;

printf("Informe seu salario bruto:    R$");
scanf("%f", &salario);

//INSS
inss=621.04;
if (salario<=1693.72)
    inss=salario*0.08;
else
    if (salario<=2822.90)
        inss=salario*0.09;

    else
        if (salario<=5646.80)
            inss=salario*0.11;

//IR
if (salario>=1903.99)
    ir=salario*0.075;
else
    if (salario>=2826.65)
        ir=salario*0.15;
    else
        if (salario>=3751.05)
            ir=salario*0.225;
        else
            if (salario>=4664.69)
                ir=salario*0.275;


sal_liquido=(salario-inss)-ir;

printf("\
Desconto INSS:             R$%8.2f\n\
Desconto IR:             R$%8.2f\n\
voce vai receber:         R$%8.2f", inss, ir,sal_liquido);


    return 0;
}

Ainda estou assimilando seus exemplos para não confundir muito a cabeça.

 

print da saída apresentada em um exemplo qualquer, mas ressalto que testei diversos valores.

 

Informe seu salario bruto:      R$5900
Desconto INSS:                  R$  621.04
Desconto IR:                    R$  442.50
voce vai receber:               R$ 4836.46
--------------------------------
Process exited after 5.987 seconds with return value 0
Pressione qualquer tecla para continuar. . .

 

Meu medo é atropelar as informações, adiantar muito e na hora que precisar de algo "básico" eu talvez não lembrar como fazer, pois não pratiquei e ou vi todas as opções possíveis. Como eu disse depois disso eles ja pularam para condições (do-while) e (matriz), achei que o "básico" ficou muito vago, tanto que na elaboração completa deste exemplo ficaram muitas duvidas, que somente agora vocês estão me ajudando.

  • Curtir 1
Postado
5 minutos atrás, Evandro Candido disse:

Meu medo é atropelar as informações, adiantar muito e na hora que precisar de algo "básico" eu talvez não lembrar como fazer

 

Então... Vou repetir: não desanime, mas isso tudo é básico. trata-se de um programa de 20 linhas que tem 2 if e um printf.

 

Sugiro reler o que eu disse e implementar. Tudo. E é sim básico.

 

Uma noção importante pra c. é a de encapsulamento. Um nome chique para juntar as coisas onde elas são importantes e não ver o programa todo de uma vez.

 

Seu programa novo está errado. Se tivesse atentado para o encapsulamento acho que não teria errado.

 

eis o que eu te mostrei

 

13 horas atrás, arfneto disse:
   // ir
    float ir = 0.; // isento
    if (salario >= 1903.99)
        if (salario <= 2826.65)
            ir = salario * 0.075;
        else
            if (salario <= 3751.05) 
                ir = salario * 0.15;
            else
            if (salario <= 4664.68)
                ir = salario * 0.225;
            else
                ir = salario * 0.275;

 

Ou melhor ainda

 

26 minutos atrás, arfneto disse:
float c_ir(float sal)
{	
	// retorna o valor do ir
	float ir = 0.; // isento
	if (sal >= 1903.99)
		if (sal <= 2826.65)
			ir = sal * 0.075f;
		else
			if (sal <= 3751.05f)
				ir = sal * 0.15f;
			else
				if (sal <= 4664.68f)
					ir = sal * 0.225f;
				else
					ir = sal * 0.275f;
	return ir;
}

 

Que pega o salário e retorna o valor do ir. Não faz mais nada. A função só faz isso. Então é fácil de testar, de confiar, de usar em outros programas.

 

De volta ao seu programa

 

13 horas atrás, arfneto disse:

Inicialize todas as variáveis e declare uma por linha. É grátis. E nem todos seus programas vão ter 20 linhas.

 

Pois é. Fez falta. O que vai acontecer com o cara isento de IR? 

E porque não testou o retorno de scanf()? Eu te expliquei e mostrei o exemplo. É ingênuo não testar. Ainda mais em um programa de estudo em que pode só cancelar e pronto.

 

  • Obrigado 1
Postado
39 minutos atrás, arfneto disse:

E porque não testou o retorno de scanf()? Eu te expliquei e mostrei o exemplo. É ingênuo não testar. Ainda mais em um programa de estudo em que pode só cancelar e pronto.

então, por ignorância da minha parte, eu não compreendi como testar, estava aqui lendo os livros com vergonha de perguntar, porém como mencionou outra vez, tomei coragem agora. Seria essa linha aqui?

    if (1 != scanf("%f", &salario)) return -1;     

printf("\n    Salario:          %8.2f\n", salario);

 

Você ja esta depositando um tempo valioso em me explicar e dar exemplos, sou grato por isso! Pode ter certeza que estou relendo tudo e tentando assimilar da melhor forma.

  • Obrigado 1
Postado
23 horas atrás, Evandro Candido disse:
if (salario<=1693.72){
    inss=salario*0.08;
}
else

if (salario>=1693.73 && salario<=2822.90){
    inss=salario*0.09;
}

 

Antes de qualquer coisa, entendeu o que expliquei que está errado acima?

 

E entendeu o erro do seu último programa em relação ao ir?

 

Entendeu como é muito mais fácil e seguro usar funções e o tal encapsulamento?

 

Não devia estar usando scanf(). scanf() é um scanner. Por isso tem esse nome. Não é A  função para entrada de dados via teclado, como está escrito em toda parte. Acabei de fazer uma pesquisa em português e não me surpreende que as pessoas não entendam isso, já que autores e professores parece que também não entendem. scanf significa scan formatted input. Se algum autor ou professor acha que o teclado é "formatted input" então temos mesmo problemas.

 

Sobre scanf() veja o documentação em português aqui

 

1 hora atrás, Evandro Candido disse:

então, por ignorância da minha parte, eu não compreendi como testar, estava aqui lendo os livros com vergonha de perguntar

 

O forum é uma oportunidade de perguntar. Se não usar apesar de ter postado uma questão estará se afastando do objetivo.

 

scanf retorna um int com o total de especificadores atendido. Especificadores são aquelas coisas que começam por % e não por %%, tipo "%s". Ou retorna -1 em caso de erro. Não ler nada não é um erro. Ler menos que o pedido não é um erro. Achar que isso é um erro é sim um erro 😉 

 

1 hora atrás, Evandro Candido disse:

Seria essa linha aqui?

 

Claro, essa linha. A única chamada a scanf no programa. E você não deveria estar usando, como te disse no primeiro post. Devia usar algo simples como

 

#include <cstdio>
#include <iostream> // cin 
  // ...
  
	printf("Informe seu sal bruto: ");
	std::cin >> salario;
	if ( not std::cin.good() ) return -1; // não leu
//...

 

C tem esses arquivos abertos: stdin, stdout e stderr, para todo programa em C. O teclado, a tela e a tela...

 

 

Em C++ esses são cin cout e cerr e é tudo diferente. Use esses. Programe em C++. É muito mais expressivo, tem mais recursos e é quase tão rápido quanto C em quase tudo.

 

 

 

 

 

 

 

 

  • Obrigado 1
Postado
58 minutos atrás, arfneto disse:

Antes de qualquer coisa, entendeu o que expliquei que está errado acima?

 

Se eu entendi certo, inicialmente eu estava sendo acredito que redundante em colocar 

(salario>=1693.73 && salario<=2822.90)

porque se o salário não é <= 1693.72 obviamente ele será maior, logo posso deixar de forma mais simples, como feito.

Sem contar a quantidade de chaves utilizada.

 

Quanto ao encapsulamento e a utilização do <cstdio> e ou 'cin' e até mesmo o 'cout'. Nada disso foi mencionado no semestre, porém com com a menção de vocês fui buscar saber.

 

Dai vem a questão, como e quando usar o encapsulamento. Entendi que ele é uma forma de deixar o codigo mais isolado, como o caso do IR, que foi feito

 

fiz um teste com cout e cin pelo que explicou e veio outra duvida:

#include <iostream>
#include <cstdio>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() {

float salario;

    std::cout << "informe seu salario bruto:";
    std::cin >> salario;
    if ( not std::cin.good() ) return -1;

    return 0;
}

 

58 minutos atrás, arfneto disse:

E você não deveria estar usando, como te disse no primeiro post. Devia usar algo simples como

voce quis dizer que eles ja passaram para algo "complexo" scanf ou invés de simples como mencionado : std::cin ?

 

Quando utilizar 'cout' e 'cin'

quando utilizar da forma que fez printf e cin

Quando usar printf e scanf

 

em uma pesquisa rápida, encontrei: "A única diferença visível é que scanf() precisa declarar explicitamente o tipo de entrada, enquanto cin tem a operação de redirecionamento sobrecarregada usando modelos. Isso não parece ser um motivo bom o suficiente para um impacto de desempenho de 5x."

 

deixando essa pesquisa de lado essa pesquisa e sugando um pouco mais do seu conhecimento, que por sinal esta abrindo e muito minha mente.

 

 

  • Curtir 1
Postado
49 minutos atrás, Evandro Candido disse:

Quanto ao encapsulamento e a utilização do <cstdio> e ou 'cin' e até mesmo o 'cout'. Nada disso foi mencionado no semestre, porém com com a menção de vocês fui buscar saber.

 

Encapsulamento é um princípio básico para escrever código em qualquer linguagem e não usar é que é problema. Sempre vai cair na sua cabeça. Vai ser difícil reaproveitar código, integrar com outros programas, testar, trabalhar com outras pessoas.

 

Não usar as streams de C++ em um curso de C++ é só incompreensível. Não sei o que dizer de seu curso.

 

52 minutos atrás, Evandro Candido disse:

voce quis dizer que eles ja passaram para algo "complexo" scanf ou invés de simples como mencionado : std::cin ?

 

Nada tem a ver uma coisa com a outra. 

 

53 minutos atrás, Evandro Candido disse:

em uma pesquisa rápida, encontrei: "A única diferença visível é que scanf() precisa declarar explicitamente o tipo de entrada, enquanto cin tem a operação de redirecionamento sobrecarregada usando modelos. Isso não parece ser um motivo bom o suficiente para um impacto de desempenho de 5x."

 

Não sei o que o autor tinha em mente ao escrever isso. O que eu posso repetir e indica que eu devo ter razão é que scanf() é um scanner. Tem esse nome por ter esse propósito, como eu expliquei: scanf formatted input. Isso nunca foi pensado em ser usado para ler coisas do teclado. Mais ainda, C não foi escrita com esse propósito. Muita gente que programa em C passa anos sem ler nada do teclado. 

 

C streams em C++ são muito muito lentas. Isso é conehcido. E não é um problema porque não deveriam mesmo ser usadas afinal. De todo modo se precisa usar deve chamar como descrito em https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rio-sync

 

	ios_base::sync_with_stdio(false);

 

A linguagem C foi escrita para escrever um sistema. O Unix. E em Unix TUDO é um arquivo. Sem surpresas, C é excelente para ler arquivos. Os caras que escreveram C e Unix eram talvez os melhores dessa época. E ainda são, os que trabalham ainda...

 

Programas em C geralmente leêm do teclado na linha de comando apenas. Ou leem e escrevem para outros programas, ou sockets, ou chips ou dispositivos mesmo.

 

scanf() foi escrita para ler dados tabulares. Coisas como arquivos CSV e tabelas de valores. Nesses arquivos cada campo é separado por algo, tipo a própria vírgula que dá nome ao formato, e tem esses campos entre as vírgulas que podem ser texto, números inteiros ou decimais, e scanf ou fscanf ou sscanf consomem esses dados, tratando separadores, convertendo valores e até pulando campos, numa única chamada para cada linha. Super conveniente. Para isso foi escrita.

 

fgetc e fgets são provavelmente mais adequadas para ler do teclado... Mas não convertem formatos e então os professores e autores introduzem scanf() como uma opção para isso, por preguiça de introduzir atoi() atof() e atod() por exemplo. E ai se vê até professores tentando justificar isso.

 

Por isso te disse que seu programa devia ler da linha de comando e expliquei porque no primeiro post. É o esperado de um programa C que lê um único valor.

 

1 hora atrás, Evandro Candido disse:

Quando utilizar 'cout' e 'cin'

quando utilizar da forma que fez printf e cin

Quando usar printf e scanf

 

Em C++ use C++. Muitas vezes não precisa de cin ou cout ou cerr em C++: é  mais conveniente usar iteradores em C++.

 

printf() ainda é uma opção para formatar saída, porque std::format que é a versão moderna de formatação em C++ desde C++2020 está demorando muito para ser adotada. Em especial os compiladores estão demorando muito para inlcuir esse suporte na linguagem, exceto o da Microsoft. Não estou certo de como está isso agora, mas precisaria ver em que nível está o suporte a <format> nos compiladores clang e gcc por exemplo. Mas é mais legível que printf().

 

cout e <iomanip> são um pouco chatas para formatar e visualizar dados assim formatados.

 

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...