Ir para conteúdo
carlos jr

Programa de deseja sai ou não c++

Recommended Posts

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;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode colocar o conteúdo de seu programa num while, por exemplo. Algo desse tipo:

int main() {

   char r = 's';
   while (r == 's') {
 
      // Seu código
    
      printf("Você deseja continuar ? [s/n]"); 
      scanf(" %c", &r); 
   }
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
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;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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

  • Conteúdo Similar

    • Por Sharank
      Strcat Function In C++
       
      I'm new to C and C++ programming, can anyone give me a hint on what I'm doing wrong here. I'm trying to write to concat function that takes to pointers to chars and concatenates the second to the first. The code does do that, but the problem is that it adds a bunch of junk at the end.
       
      For instance, when passing the arguments - "green" and "blue", the output will be "greenblue" plus a bunch of random characters. I also wrote the strlen function that strcat uses, which I will provide below it for reference. I'm using the online compiler at InterviewBit The exact instructions and specification is this:
       
      int main(int argc, char** argv)
      {
      const int MAX = 100;
       
      char s1[MAX];
      char s2[MAX];
       
      cout << "Enter your first string up to 99 characters. ";
      cin.getline(s1, sizeof(s1));
      int size_s1 = strlen(s1);
      cout << "Length of first string is " << size_s1 << "\n";
       
      cout << "Enter your second string up to 99 characters. ";
      cin.getline(s2, sizeof(s2));
      int size_s2 = strlen(s2);
      cout << "Length of second string is " << size_s2 << "\n";
      cout << " Now the first string will be concatenated with the second
      string ";
      char* a = strcat(s1,s2);
       
      for(int i = 0; i<MAX; i++)
      cout <<a;
       
      // system("pause");
      return 0;
      }
       
      //strcat function to contatenate two strings
      char* strcat(char *__s1, const char *__s2)
      {
      int indexOfs1 = strlen(__s1);
      int s2L = strlen(__s2);
      cout <<s2L << "\n";
      int indexOfs2 = 0;
      do{
      __s1[indexOfs1] = __s2[indexOfs2];
      indexOfs1++;
      indexOfs2++;
      }while(indexOfs2 < s2L);
       
       
      return __s1;
      }
       
      //Returns length of char array
      size_t strlen(const char *__s)
      {
      int count = 0;
      int i;
      for (i = 0; __s != '\0'; i++)
      count++;
      return (count) / sizeof(__s[0]);
       
      }
    • Por roberson abalaid
      #include <stdio.h>
      #include <stdlib.h>
      int arr[3][5];
      int main(){
          
          printf("Favor inserir os dados...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  scanf("%d", &arr[j]);
              }
          }
          
            printf("os valores inseridos foram...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  printf("  %d  ", arr[j]);
              }
              printf("\n");
          }
          return 0;
      }
    • Por ment0r
      Boa a noite a todos.
      Estou desenvolvendo um sistema que utiliza uma função JavaScript pra auxiliar na exclusão dos registros. É bem simples:
       
      <a href='' onclick="confExclusao('aluno.php', <?= trim($row->ID) ?>)"> O link manda como parâmetro a página e o id. Agora a função confExclusao:
       
      function confExclusao(url, idLocacao) { var resposta = confirm("Deseja excluir esse registro?"); if (resposta == true) { window.location.href = url+"?id="+id; } } A função recebe a página e o id como parâmetro e então utiliza window.location.href para enviar isso pra mesma página e na página em questão há um trecho que deleta o registro:
      if (isset($_GET['id'])) { $aluno = new Escola(); if ($aluno->desativa($_GET['id'])) { echo $mensagem->erroMsg("Aluno deletado com sucesso", "aluno.php"); } } O problema é que window.location.href não funciona (já tentei as variações do window.location). Alguém tem ideia do que possa ser? O mais engraçado é que funcionava...
      Fico aguardando qualquer ajuda - só falta isso pra eu entregar o sistema.

      Um grande abraço a todos.
    • Por flipmartinz13
      Alguém pode me ajudar nessa questão de C++? não estou conseguindo construir o algorítmo corretamente.

      5.92)    Faça um algoritmo que leia a matrícula, nome, sexo e três notas dos alunos de uma escola e obtenha os seguintes resultados:
      a) A matrícula da aluna que obteve a maior média.
      b) A matrícula do aluno que obteve a menor média.
      c) O percentual de mulheres na turma.
      d) Quantos alunos foram aprovados, independente do sexo.
      e) O percentual de alunas aprovadas.
      Obs.: o flag é uma matrícula igual a 0 (zero).
    • Por flipmartinz13
      Estou tentando fazer esse exercício de introdução a programação em C++, e estou tendo dificuldades para criar os algoritmos. Alguém poderia me ajudar?


      Uma agência de turismo quer fazer um levantamento das praias da cidade para um programação turística de verão, sabendo-se que cada praia tem um nome e uma distância (em Km) do hotel. Criar um algoritmo que forneça os seguintes dados:
      18

       Porcentagem de turistas nas praias próprias do hotel
       A praia mais adiante
       Nome e distancia das praias não-próprias com distancia do hotel maior que 10 km.
      O algoritmo acaba quando se digita @ para nome da praia.
×

Informação importante

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