Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dezt

[Resolvido] Resultado Estranho na Subtração de Inteiros.

Recommended Posts

Bom pessoal, desde já agradeço pela minha última dúvida, que foi sanada com clareza pela equipe iMasters, vocês estão de parabéns.

 

Infelizmente, surgiu uma outra dúvida aqui, que é em relação a subtração de resultados declarados como int.

 

Tenho estas partes do código aqui que são os prováveis motivos da falha:

 

	int a;
int y = 2011;
int r = y-a;

 

O estranho é que ele reconhece o ano que eu inseri, pois no resultado, o texto sai corretamente:

 

Resultado:

Olá Reinaldo você nasceu no dia 4 de março de 1988
Você tem -13130569 anos, você ainda é menor de idade

 

O problema ficou é na última linha, onde a idade saiu completamente estranha, gostaria de saber o motivo deste resultado, já procurei em vários lugares e nada, testei no Windows (alterando as bibliotecas) também e o resultado foi um pouco diferente, deu que eu tinha 2012 anos.

 

Bom, desculpe qualquer coisa, mas postei para ver se alguém dava uma luz, pois estou aprendendo C++ ainda, imagina no futuro se eu não souber fazer uma simples subtração no C++, espero um dia poder ter bons conhecimentos na área para voltar aqui e retribuir ajudando os futuros iniciantes em C++. ;)

 

Abraços pessoal, tenham um excelente fim de semana.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual eh o valor de "a"? Se você n atribuir um valor a variavel "a" ela sera automaticamente inicializada com valor indefinido, q comumente chamamos de "lixo", por isso eh q ta saindo esse valor negativo inesperado. Esse valor indefinido seria um valor entre -2,147,483,648 +2,147,483,647 contando q na plataforma em questao int represente 32bits...

 

 

Abraco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual eh o valor de "a"? Se você n atribuir um valor a variavel "a" ela sera automaticamente inicializada com valor indefinido, q comumente chamamos de "lixo", por isso eh q ta saindo esse valor negativo inesperado. Esse valor indefinido seria um valor entre -2,147,483,648 +2,147,483,647 contando q na plataforma em questao int represente 32bits...

 

 

Abraco

 

Entendi sua explicação.

 

Porém, vou postar uma outra parte do código, que ela pega o valor de "a".

 

		cout << "Por favor, digite o seu nome: ";
	cin >> nome;
	cout << "Digite o dia em que você nasceu: ";
	cin >> dia;
	cout << "Digite o mês em que você nasceu: ";
	cin >> mes;
	cout << "Digite o ano em que você nasceu: ";
	cin >> a;
	cout << "Olá " << nome << " você nasceu no dia " << dia << " de " << mes << " de " << a << '\n';

 

Note que eu pego o valor de a, o resultado entende que a é a data que eu nasci, pois no output mostra meu nome e que eu nasci no dia 04 de março de 1988 certinho, o problema é na subtração da idade, que dá um valor estranho.

 

Tentei fazer o que você disse, coloquei que a=0 (por exemplo), só que ele me deu que eu nasci em 2011, eu creio que o erro está na subtração ou na maneira da qual o meu programinha está coletando os dados do cin >> a;.

 

Abraços, muito obrigado pela atenção, ainda espero uam solução, estou procurando aqui, mas não encontro mesmo. :\

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Se você digitar 0valor, por exemplo 04, o valor será contado como octal, e então convertido para decimal.

Se digitar 0xvalor (pra vce entender), por exemplo 0x4, o va lor será contado como hexadecimal, e então convertido para decimal.

 

 

Coloque todo o código do seu programa, com pedaços não dá para entender o que está dando errado...

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Se você digitar 0valor, por exemplo 04, o valor será contado como octal, e então convertido para decimal.

Se digitar 0xvalor (pra vce entender), por exemplo 0x4, o va lor será contado como hexadecimal, e então convertido para decimal.

 

 

Coloque todo o código do seu programa, com pedaços não dá para entender o que está dando errado...

 

 

Abraços :D

 

Opa, beleza, só não postei o código completo antes devido as regras do fórum, bom, mas aí segue o código completo:

 

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main ()
{
string nome;
int dia;
string mes;
int a; // Já tentei botar que a=0 e nada.
int y = 2011;
int r = y-a;

	cout << "Por favor, digite o seu nome: ";
	cin >> nome;
	cout << "Digite o dia em que você nasceu: ";
	cin >> dia;
	cout << "Digite o mês em que você nasceu: ";
	cin >> mes;
	cout << "Digite o ano em que você nasceu: ";
	cin >> a;
	cout << "Olá " << nome << " você nasceu no dia " << dia << " de " << mes << " de " << a << '\n';

		if (r<=18)

			cout << "Você tem " << r << " anos, você ainda é menor de idade" << '\n';

		else

			cout << "Você tem " << r << " anos, você já é maior de idade" << '\n';
	sleep(1);
return 0;
}


Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

1º erro: você declara uma string, mas não adicionou o #include necessário para usála: o <string>.

 

Sugiro que utilize os headers <cstdlib> e <cstdio> da C++, se estiver utilizando-a, pois são equivalentes ao <stdlib.h> e <stdio.h> da C, respectivamente, e diferenciam seu código C para o código C++.

 

 

O erro do seu programa:

 

A variável r estava sendo calculada antes de o valor de a ser atribuído, por isso o valor era randômico. Coloque int r; no começo e coloque r = y-a; depois da atribuição de a, assim:

 

#include <iostream>
#include <string>

using namespace std;

int main ()
{
string nome, mes;

int dia, a, r;

const int y = 2011;

cout << "Por favor, digite o seu nome: ";
cin >> nome;
cout << "Digite o dia em que você nasceu: ";
cin >> dia;
cout << "Digite o mês em que você nasceu: ";
cin >> mes;
cout << "Digite o ano em que você nasceu: ";
cin >> a;
cout << "Olá " << nome << " você nasceu no dia " << dia << " de " << mes << " de " << a << '\n';


r = y-a; // AGORA deve calcular, já que tem o valor de a definido.

if (r <= 18)              
	cout << "Você tem " << r << " anos, você ainda é menor de idade" << '\n';                   
else               
	cout << "Você tem " << r << " anos, você já é maior de idade" << '\n';

return 0;
}     

 

PS: sleep() não é nem da <cstdio> nem da <cstdlib> (ou <stdio.h> e <stdlib.h> em C), por isso não precisa utilizá-lo. O #include do sleep() é outro, que não me lembro agora. Se você não incluir o header usado para sleep(), o programa não compilará.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

1º erro: você declara uma string, mas não adicionou o #include necessário para usála: o <string>.

 

Sugiro que utilize os headers <cstdlib> e <cstdio> da C++, se estiver utilizando-a, pois são equivalentes ao <stdlib.h> e <stdio.h> da C, respectivamente, e diferenciam seu código C para o código C++.

 

 

O erro do seu programa:

 

A variável r estava sendo calculada antes de o valor de a ser atribuído, por isso o valor era randômico. Coloque int r; no começo e coloque r = y-a; depois da atribuição de a, assim:

 

PS: sleep() não é nem da <cstdio> nem da <cstdlib> (ou <stdio.h> e <stdlib.h> em C), por isso não precisa utilizá-lo. O #include do sleep() é outro, que não me lembro agora. Se você não incluir o header usado para sleep(), o programa não compilará.

 

 

Abraços :D

 

Nossa, muito obrigado mesmo, você explicou direitinho de uma maneira compreensível até para mim, que sou leigo.

 

Realmente, era um erro grave, pois ele estava sendo calculado antes que eu capturasse o valor dele, o que segundo sua explicação anterior, gerava um número randômico, perfeito.

 

Em relação as bibliotecas, realmente foi bom você me dar um toque, preciso ler um pouco sobre elas, pois eu não entendo exatamente para que serve uma, ou para que serve a outra.

 

Em relação ao sleep, eu também não encontrei exatamente qual era, mas mesmo, assim funcionou usando essas duas que você disse.

 

Essa sua ajuda foi fundamental para eu ir para um próximo desafio, muito obrigado.

 

Tenha um excelente fim de semana.

 

[RESOLVIDO]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

O sleep() não é de implementação standard da C++, então ele varia de sistema operacional para sistema operacional. Qual você usa?

 

Uma biblioteca é um "armazenador de código". Ela armazena funções e classes pré-definidas para que você, simplesmente incluindo o header da biblioteca, possa usar, sem ter que re-fazer essa função ou classe.

 

Por exemplo, se você não incluir nenhum header, a instrução cout não vai funcionar. Mas se você incluir o header da biblioteca de I/O da C++, que é o iostream, usando a instrução #include <header> (o que no caso ficaria #include <iostream>), poderá usar todas as funções da biblioteca de I/O da C++.

 

Se não tivesse como fazer isso, você teria que criar uma função de I/O para você poder usar, o que chamamos de "Re-inventar a roda".

 

Quando você inclui o header string, pode usar o tipo de arquivo chamado string.

 

Se você inclui cstdio, você passa a poder usar as funções de I/O da C (em C esse header chama stdio.h, ou Standard Input/Output).

 

Então, incluindo um header, você passa a poder usar as funções da biblioteca ao qual o header pertence.

 

 

Mas como saber de qual função é o header? Simples. Acesse http://cprogramming.com ou http://cplusplus.com e pesquise pela função. A documentação da mesma que está nessa página especifica o header que você deve incluir.

 

Mais uma coisa. Tudo o que eu falei de headers é para headeres que vem junto com a C++. Tem headers feitos por terceiros que implementam funções que não vem junto com a C++, e que normalmente só podem ser usados por um sistema operacional. É o caso da função sleep() que você estava usando, que em linux fica no header <uninstd.h>, mas que não existe no Windows.

 

 

Espero que tenha ficado clara essa minha bagunça XD

 

Bom fim de semana pra você também!

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

O sleep() não é de implementação standard da C++, então ele varia de sistema operacional para sistema operacional. Qual você usa?

 

Uma biblioteca é um "armazenador de código". Ela armazena funções e classes pré-definidas para que você, simplesmente incluindo o header da biblioteca, possa usar, sem ter que re-fazer essa função ou classe.

 

Por exemplo, se você não incluir nenhum header, a instrução cout não vai funcionar. Mas se você incluir o header da biblioteca de I/O da C++, que é o iostream, usando a instrução #include <header> (o que no caso ficaria #include <iostream>), poderá usar todas as funções da biblioteca de I/O da C++.

 

Se não tivesse como fazer isso, você teria que criar uma função de I/O para você poder usar, o que chamamos de "Re-inventar a roda".

 

Quando você inclui o header string, pode usar o tipo de arquivo chamado string.

 

Se você inclui cstdio, você passa a poder usar as funções de I/O da C (em C esse header chama stdio.h, ou Standard Input/Output).

 

Então, incluindo um header, você passa a poder usar as funções da biblioteca ao qual o header pertence.

 

 

Mas como saber de qual função é o header? Simples. Acesse http://cprogramming.com ou http://cplusplus.com e pesquise pela função. A documentação da mesma que está nessa página especifica o header que você deve incluir.

 

Mais uma coisa. Tudo o que eu falei de headers é para headeres que vem junto com a C++. Tem headers feitos por terceiros que implementam funções que não vem junto com a C++, e que normalmente só podem ser usados por um sistema operacional. É o caso da função sleep() que você estava usando, que em linux fica no header <uninstd.h>, mas que não existe no Windows.

 

 

Espero que tenha ficado clara essa minha bagunça XD

 

Bom fim de semana pra você também!

 

Abraços :D

 

Opa, tranqüilo, então, em relação aos headers, eu já sacava que era algo mais ou menos desse tipo, para que eu não tenha que fazer a função novamente todas vez que precisar executar, sendo assim, só chamar ela, já também escrevi algumas funções simples seguindo alguns tutoriais e funcionaram e tal.

 

Em relação aos sites que você me indicou, são muito bons, eu por exemplo, estou justamente seguindo o tutorial do cplusplus.com, comecei a seguir ele no Windows, mas como eu uso mais o Linux, eu sigo os tutoriais e vou mudando uma coisa ou outra que não se encaixe perfeitamente aqui no Linux. :)

 

Mas sem dúvidas, esta explicação sobre headers foi excelente, muito obrigado mesmo. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.