Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi, Eu fiz um programa que entra com senha e login depois que digitou login e senha corretos ele vai somar dois números que digitar, queria que depois de mostrar o resultado, ele fise uma pergunta deseja sair sim ou não ?, se sim volta pra tela de login, senão continua fazendo a soma. alguém poderia me ajudar.Segue abaixo o programa.
#include <conio.h>
#include <string>
#include <conio.c>
#define user"CJR"
#define pass"7609"
using namespace std;
int main(int argc, char *argv[])
{
int a, x, c;
string usuario, senha;
system("color F0");
printf("\t\t\t Login");
printf("\n\t\t\t-----------\n\n");
printf("\n\tUsuario: ");
getline(cin, usuario);
printf("\n\tSenha: ");
getline(cin, senha);
if (usuario == user && senha == pass){
system("cls");
printf("Digite o valor de a: ");
scanf("%d", &a);
printf("Digite o valor de x: ");
scanf("%d", &x);
c = a + b;
printf("Resultado: %d\n", c);
}
else {
printf("\n\tUsuario e Senha estao incorretos");
}
cin.get();
cin.get ();
return 0;
}Então fiz como você passou, mas quando eu aperto s ele volta mas volta com o cursor direto na senha, segue abaixo o programa, vê o que fiz de errado. Também queria que ele tivesse até 3 tentativas para digitar a senha e mostrasse a mensagem de erro caso exceda as tentativas.
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
#define user"CJR"
#define pass"7609"
using namespace std;
int main(int argc, char *argv[])
{
int a, x, c;
string usuario, senha;
char r = 's';
while (r == 's') {
system("cls");
system("color F0");
printf("\t\t\t Login");
printf("\n\t\t\t-----------\n\n");
printf("\n\tUsuario: ");
getline(cin, usuario);
printf("\n\tSenha: ");
getline(cin, senha);
if (usuario == user && senha == pass){
system("cls");
printf("Digite o valor de a: ");
scanf("%d", &a);
printf("Digite o valor de x: ");
scanf("%d", &x);
c = a + b;
printf("Resultado: %d\n", c);
system("cls");
printf("Você deseja continuar ? [s/n]");
scanf(" %c", &r);
}
else {
printf("\n\tUsuario e Senha estao incorretos");
}
}
return 0;
}>
Em 23/09/2016 at 13:21, carlos jr disse:
Então fiz como você passou, mas quando eu aperto s ele volta mas volta com o cursor direto na senha, segue abaixo o programa, vê o que fiz de errado. Também queria que ele tivesse até 3 tentativas para digitar a senha e mostrasse a mensagem de erro caso exceda as tentativas.
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
#define user"CJR"
#define pass"7609"
using namespace std;
int main(int argc, char *argv[])
{
int a, x, c;
string usuario, senha;
char r = 's';
while (r == 's') {
system("cls");
system("color F0");
printf("\t\t\t Login");
printf("\n\t\t\t-----------\n\n");
printf("\n\tUsuario: ");
getline(cin, usuario);
printf("\n\tSenha: ");
getline(cin, senha);
if (usuario == user && senha == pass){
system("cls");
printf("Digite o valor de a: ");
scanf("%d", &a);
printf("Digite o valor de x: ");
scanf("%d", &x);
c = a + b;
printf("Resultado: %d\n", c);
system("cls");
printf("Você deseja continuar ? [s/n]");
scanf(" %c", &r);
}
else {
printf("\n\tUsuario e Senha estao incorretos");
}
}
return 0;
}
Na linha:
c = a + b;
a variável b não está declarada em parte alguma do código. A linguagem C e também C++ não permite o uso de variáveis não declaradas. O seu programa não compila por esse motivo. Onde está b na verdade é o lugar da variável x. Trocando b por x o programa compila e executa.
O programa volta no campo senha quando você aperta s por que há sujeira no buffer de entrada de teclado. Essa sujeira fica toda vez que você lê um caracter com a função scanf. Então para que o programa volte no campo usuário e não na senha você deve limpar essa sujeira do buffer antes de voltar a ler um caracter novamente pelo teclado para que o programa não interprete a sujeira como sendo o novo caracter digitado e não pule automaticamente para o próximo campo. Há duas formas de se fazer isso. A primeira é mandar o programa ignorar o lixo que há no buffer de entrada usando o comando "%*c" na função scanf após a leitura de qualquer caracter pelo teclado. Dessa forma o programa "pula" a sujeira do buffer e lê normalmente o novo caracter que o usuário vai digitar. Então na linha onde está:
scanf(" %c", &r);
Irá ficar:
scanf(" %c%*c", &r);
Sendo assim a função scanf irá ler o caracter digitado e então pulará o lixo de buffer para que na próxima chamada a essa mesma função o buffer de entrada de teclado já esteja limpo. Isso é por que o asterisco sigfica "descartar" então nesse caso a linha de código acima quer dizer "leia um caracter da entrada e após isso leia e descarte um caracter" ou seja, é para a função ler o caracter e depois ela ler e descartar o caracter que vai ficar sendo lixo de buffer. A segunda forma de limpar lixo de buffer de teclado é usando o comando fflush. Esse comando é muito utilizado no compilador Bloodshed Dev-C++. Fica desse jeito:
fflush(stdin);
No caso desse programa, irá ficar assim:
scanf(" %c", &r);
fflush(stdin);
As linhas de código acima querem dizer "leia um caracter, armazene-o na variável e depois limpe o buffer de entrada" pois o comando fflush(stdin) limpa todo o lixo que estiver no buffer de entrada de teclado.
Usando qualquer uma dessas duas formas o programa não irá mais pular o campo usuário e ir direto para a senha.
Uma outra coisa errada em seu programa é que ele está dizendo que tanto o usuário como a senha estão incorretos mesmo que um desses dois campos esteja correto o que não é verdade. Então nesse caso, a mensagem emitida por ele em caso de usuário incorreto e/ou senha incorreta deve ser levemente modificada de "Usuário e senha estão incorretos" para "Usuário e/ou senha estão incorretos" colocando um "/ou" para deixar aberta no programa a possibilidade de o usuário digitar apenas um dos dois campos errado e o outro certo ou então os dois errados mas sem dizer para o usuário que os dois campos estão errados mesmo que um deles esteja certo. Então:
printf("\n\tUsuario e Senha estao incorretos");
Irá ficar:
printf("\n\tUsuario e/ou Senha estao incorretos");
Outro problema que há no seu programa é que ele mostra o resultado da soma porém ele não aguarda alguma ação do usuário antes de apagar a mensagem que mostra esse resultado assim como ele também faz quando o usuário digita o nome de usuário e/ou senha errados. Assim não há como o usuário ver o resultado da soma na tela e nem ler a mensagem que informa que ele está digitando o nome de usuário e/ou a senha incorretamente. Pra solucionar isso há um comando também muito usado no compilador Bloodshed Dev-C++ que faz com que o programa fique pausado até que o usuário pressione alguma tecla, assim ele pode ver as mensagens antes que elas se apaguem. A linha de código que pausa os programas no Dev C++ é a seguinte:
system("pause");
Isso faz com que o programa chame o comando pause do Windows antes de executar sua próxima ação. Sendo assim as mensagens só se apagarão após o usuário pressionar algo no teclado. O usuário terá o tempo que ele quiser para ler essas mensagens.
Abaixo vai o código desse mesmo programa porém refeito com as pausas para aparecer as mensagens na tela e também a modificação que coloca 3 tentativas de login e caso falhe as 3 exibe uma mensagem de erro.
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
#define user"CJR"
#define pass"7609"
using namespace std;
int main(int argc, char *argv[])
{
int a, x, c, tentativas=0;
string usuario, senha;
char r = 's';
while ((r == 's') && (tentativas<3)){
system("cls");
system("color F0");
printf("\t\t\t Login");
printf("\n\t\t\t-----------\n\n");
printf("\n\tUsuario: ");
getline(cin, usuario);
printf("\n\tSenha: ");
getline(cin, senha);
if (usuario == user && senha == pass){
tentativas = 0;
system("cls");
printf("Digite o valor de a: ");
scanf("%d", &a);
printf("Digite o valor de x: ");
scanf("%d", &x);
c = a + x;
printf("Resultado: %d\n", c);
system("pause");
system("cls");
printf("Você deseja continuar ? [s/n]");
scanf(" %c%*c", &r);
}
else {
printf("\n\tUsuario e/ou Senha estao incorretos");
system("pause");
tentativas++;
}
if(tentativas==3){
printf("\nNumero maximo de tentativas atingido.");
system("pause");
}
}
return 0;
}
Você pode colocar o conteúdo de seu programa num while, por exemplo. Algo desse tipo:
int main() {