1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por ThinkBrunus, 10 de Dezembro de 2007. (Respostas: 10; Visualizações: 5229)

  1. ThinkBrunus

    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
     
  2. OubeLa

    OubeLa Power Member

    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();
     
  3. ThinkBrunus

    ThinkBrunus Power Member

    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
     
  4. legion

    legion Power Member

    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
     
  5. renatocardoso17

    renatocardoso17 Power Member

    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
     
  6. legion

    legion Power Member


    Por isso é que eu disse que ficava mal...é melhor usar uma função getchar() à função system("pause").

    Assim não aparece "prima qualquer tecla..blah blah"..é mais bonito e funcional..:D
     
  7. OubeLa

    OubeLa Power Member

    O system("pause"); nao precisa de #include "windows.h"
     
  8. renatocardoso17

    renatocardoso17 Power Member

    Mas eu uso o visual studio 2005 e sem por o include nao reconhece o system("pause").
     
  9. Mr_Miguel

    Mr_Miguel Power Member

    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.
     
  10. mj2p

    mj2p I'm Cool Cuz I Fold

    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)
     
  11. Mr_Miguel

    Mr_Miguel Power Member

    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
     

Partilhar esta Página