C++ - ler variável "cin >>area;"

ThinkBrunus

Power Member
Boas!

Estou a estudar sobre c++, visto que já mexi em C á alguns anos, julgo que esta seja uma fase de adaptação...entretanto estou a fazer uns testes simples de um manual q é o seguinte:

#include<iostream>
#include <cmath>

int main(){
using namespace std;
double area;
cout << "Qual a área do quadrado?";
cin >> area;
double lado = sqrt(area);
cout << "O lado é " << lado << "." << endl;
return 0;
}


O q está a acontecer-me é q ao inserir o valor da área, o programa termina....

Isto é o q me está a aparecer no debug:

'prjNovo01.exe': Loaded 'D:\MyWork\Projectos C++\prjNovo01\debug\prjNovo01.exe', Symbols loaded.
'prjNovo01.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'prjNovo01.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'prjNovo01.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcp80d.dll', Symbols loaded.
'prjNovo01.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll', Symbols loaded.
'prjNovo01.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
The program '[3628] prjNovo01.exe: Native' has exited with code 0 (0x0).

Espero q me possam ajudar, parece-me uma questão simples mas mesmo assim não encontro explicação.

Cumprimentos
 
Isso está a funcionar perfeitamente.

Provavelmente o que acontece é que quando lê a variavel area, o que acontece é que apresenta o resultado mas fecha logo a seguir por causa do return 0. Na realidade isso significa que o programa termina correctamente. Antes do return 0 coloca getchar();
 
Pois essa pode ser uma possivel....entretanto apresentaram-me uma solução alternativa bem simples que foi o suficiente para ele correr normalmente, correr o programa sem o debug (Ctrl + F5 no Visual Studio).

De qualquer forma obrigado pela atenção.

Cumprimentos
 
Pois essa pode ser uma possivel....entretanto apresentaram-me uma solução alternativa bem simples que foi o suficiente para ele correr normalmente, correr o programa sem o debug (Ctrl + F5 no Visual Studio).

De qualquer forma obrigado pela atenção.

Cumprimentos

Era exactamente essa solução que ia dar..antes de ler a tua resposta.

Mas o que por vezes vejo é colegas meus a usar o:

Código:
system("pause");

Mas fica muito mal no programa..é sempre preferível usar o:

Código:
getchar();
tal como o sir_atmc referiu.

cump's
 
pois tal como o legion disse podes fazer o seguinte:

#include "windows.h" //biblioteca a incluir

system("pause");

assim no fim do programa aparece "Prima qualquer tecla para continuar..." :D

Ah atençao porque ha certos compiladores que nao aceitam esse comando nem sequer conhecem a biblioteca... mas se tiveres a usar o visual studio é na boa...:D
 
pois tal como o legion disse podes fazer o seguinte:

#include "windows.h" //biblioteca a incluir

system("pause");

assim no fim do programa aparece "Prima qualquer tecla para continuar..." :D

Ah atençao porque ha certos compiladores que nao aceitam esse comando nem sequer conhecem a biblioteca... mas se tiveres a usar o visual studio é na boa...:D

O system("pause"); nao precisa de #include "windows.h"
 
Alguns pontos que eu gostaria de focar:

1. A versão C++ do getchar() é o cin.get().
2. Usar só um getchar() ou só um cin.get() no contexto deste problema não chega, porque o operador >> de cin deixa um '\n' na stream de input (noutros sistemas operativos, deixa inclusivamente um '\r').

Solução:

system("pause")

ou

while (cin.get() != '\n');
cin.get();

3. Por convenção, a linha "using namespace std;" deve ficar fora de qualquer método.
 
Alguns pontos que eu gostaria de focar:

1. A versão C++ do getchar() é o cin.get().
2. Usar só um getchar() ou só um cin.get() no contexto deste problema não chega, porque o operador >> de cin deixa um '\n' na stream de input (noutros sistemas operativos, deixa inclusivamente um '\r').

Solução:

system("pause")

ou

while (cin.get() != '\n');
cin.get();

3. Por convenção, a linha "using namespace std;" deve ficar fora de qualquer método.

Oi. Desculpa lá, se calhar sou eu que não estou a ver bem a coisa. O operador >> deixa sempre um '\n' na stream?

Outra coisa. Também referis-te o caracter '\r'. Tenho ouvido muita coisa sobre estes dois caracteres, nem sempre sabendo em quem devo acreditar. Qual é, para ti, a diferença entre '\n' e '\r'?

Vá, cumps
(post 100:D)
 
Oi. Desculpa lá, se calhar sou eu que não estou a ver bem a coisa. O operador >> deixa sempre um '\n' na stream?

Outra coisa. Também referis-te o caracter '\r'. Tenho ouvido muita coisa sobre estes dois caracteres, nem sempre sabendo em quem devo acreditar. Qual é, para ti, a diferença entre '\n' e '\r'?

Vá, cumps
(post 100:D)

Neste caso, sim, deixa sempre um '\n' na stream, já que estamos a ler "doubles". O mesmo aconteceria se estivéssemos a ler um "int", por exemplo. Por isso é que o uso do operador >> não é muito recomendado para ler input do utilizador. Na minha opinião, vale mais ler uma string e ver, por exemplo, se de facto contém lá um double. No entanto, a maneira "C++" de fazer isto é usar "string streams", que é um tópico mais avançado e que, consequentemente, não o discutirei aqui a não ser que me seja pedido.

Em relação à segunda questão, espero que este código te ajude a perceber o funcionamento do '\r':

#include <iostream>
using namespace std;

int main() {
cout << "1111\r";
cout << "222";
cin.get();
return 0;
}

Porque é que o output é 2221? Porque o que o '\r' faz é "recuar" o cursor para o início da linha. A partir daí, ele começa a sobrepor os caracteres do output anterior (neste caso, "1111"). O mesmo não se passaria se lá estivesse um '\n', que provocaria uma simples mudança de linha.

A título de curiosidade:

'\n' = line-feed
'\r' = carriage return

Espero ter ajudado,
Miguel Martins
 
Back
Topo