Ir ao conteúdo
  • Cadastre-se
glaukito

C++ Opção sair ou contiuar. como fazer?

Recommended Posts

boa noite!

estou com o seguinte problema:

o programa solicita 2 valores, e pergunta qual é o resultado (a operação matemática é escolhida randomicamente). preciso que após cada resposta o programa pergunte ao usuário se ele quer continuar ou sair.

creio que devo usar um "do", mas não estou sabendo como fazer.

 

desde já grato pela atenção.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <time.h>
#include <conio.h> 
#include <cstdlib>
#include <ctime>

/*Em grupos de até três integrantes, desenvolver um programa em C que um utilizador informe
nome e então escolha 2 números (os operandos) entre 0 e 20. Depois de os mostrar
ao utilizador, pergunte ao utilizador aleatoriamente, o valor do produto, da adição, da multiplicação,
da subtração, ou da divisão. Ao fim de N tentativas ou do utilizador informar que deseja sair do programa,
o computador indicar o número de vezes que o utilizador acertou o resultado e o número de vezes que errou o resultado.

Algumas exigências mínimas que devem compor o trabalho:

O programa ao iniciar deve perguntar o nome do usuário; ok
O programa deve pedir que o usuário digite dois valores; ok
O programa deve perguntar ao utilizador aleatoriamente o valor do produto, da adição, da multiplicação, da subtração, ou da divisão dos dois valores informados. ok
Ao final de cada tentativa o usuário deve ser perguntado se deseja tentar novamente ou sair do programa
Se o usuário informar que deseja continuar o programa repete todos os passos após a pergunta do nome.
Se o usuário informar sair, o programa deve o computador indicar o número de vezes que o utilizador acertou o resultado e o número de vezes que errou o resultado.
Caso o usuário não queria sair, ao final de N vezes (a escolha dos desenvolvedores) o programa deve encerrar e indicar o número de vezes que o utilizador acertou o resultado e o número de vezes que errou o resultado.
O desenvolvedor deve utilizar o máximo de conteúdo aprendido na disciplina (IF, ELSE, WHILE, DO WHILE, FOR, FUNÇÕES, VETORES e MATRIZES ...)*/

float calc (float num1, float num2){
	
	int op;
	float result, respUsu;
	
	srand(time(NULL));
    op= (rand() % 3)+1;
	
	switch (op){

		case 1:
			
			printf ("qual é o resultado da soma dos valores? ");
			scanf ("%f", &respUsu);
			
			result= num1+num2;
			
			return result;
			
			break;

		case 2:	
			
			printf ("qual é o resultado da subtração dos valores? ");
			scanf ("%f", &respUsu);
			
			result= num1-num2;
			
			return result;
			
			break;
			
		case 3:	
		
			printf ("qual é o resultado da multiplicação dos valores?");
			scanf ("%f", &respUsu);

			result= num1*num2;
			return result;
			break;
		
		case 4:	
		
			printf ("qual é o resultado da divisão dos valores?");
			scanf ("%f", &respUsu);

			result= num1/num2;
			return result;
				
		default:
			printf ("*****!!!!");		
	}
}
	
int main (void){
	
	setlocale (LC_CTYPE, "Portuguese");
	
	char n=20, nome[n], final;
	float num1, num2, result;
	int i, j, op;
	
	printf ("digite seu nome: ");
	scanf ("%s", &nome);
	
	printf ("digite o primeiro valor: ");
	scanf ("%f", &num1);
	
	printf ("digite o segundo valor: ");
	scanf ("%f", &num2);
	
	for (i=0; i<=100; i++){
		
		result= calc(num1, num2);
	
		printf ("%f\n", result);
		
	}
}

  

  • Obrigado 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@glaukito    é o do / while mesmo , ele seria assim  :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <time.h>
#include <conio.h> 
#include <cstdlib>
#include <ctime>
#include <ctype.h>

float calc (float num1, float num2){
	
	int op;
        char resp;
	float result, respUsu;
	
	srand(time(NULL));
    do{
        op= (rand() % 3)+1;
	
	switch (op){

		case 1:
			
			printf ("qual é o resultado da soma dos valores? ");
			scanf ("%f", &respUsu);
			
			result= num1+num2;
			
			return result;
			
			break;

		case 2:	
			
			printf ("qual é o resultado da subtração dos valores? ");
			scanf ("%f", &respUsu);
			
			result= num1-num2;
			
			return result;
			
			break;
			
		case 3:	
		
			printf ("qual é o resultado da multiplicação dos valores?");
			scanf ("%f", &respUsu);

			result= num1*num2;
			return result;
			break;
		
		case 4:	
		
			printf ("qual é o resultado da divisão dos valores?");
			scanf ("%f", &respUsu);

			result= num1/num2;
			return result;
				
		default:
			printf ("*****!!!!");		
	}
        printf("Quer Continuar  S/N ");
        scanf("%c",&resp);
    }while(toupper(res) != 'N');
}
	
int main (void){
	
	setlocale (LC_CTYPE, "Portuguese");
	
	char n=20, nome[n], final;
	float num1, num2, result;
	int i, j, op;
	
	printf ("digite seu nome: ");
	scanf ("%s", &nome);
	
	printf ("digite o primeiro valor: ");
	scanf ("%f", &num1);
	
	printf ("digite o segundo valor: ");
	scanf ("%f", &num2);
	
	for (i=0; i<=100; i++){
		
		result= calc(num1, num2);
	
		printf ("%f\n", result);
		
	}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@glaukito Olá. Eu já daria a resposta abaixo. 

Coloquei depois de dada uma resposta. Tal como você falou

Ficou assim:

 

char menu() {

    char resp;

    printf("Quer Continuar? [s/n]: ");
    scanf("%c", &resp);
    limpa_linha();

    return resp;
}

E aí no main faz isso:

do {

    result = calc(num1, num2);

    printf ("%.2f\n", result);

    op = menu();

} while (op != 'n');

Também recomendo, para evitar problemas por ser feitas várias leituras do teclado, usar a função abaixo:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

E aí chama essa função após cada scanf. Dessa forma você limpa o stdin, e aí evita q 'sujeira no buffer' atrapalhe as leituras seguintes. Vê se é isso q você quer

 

Também é preciso ajustar o operação que gera de forma aleatória a pergunta. Seria isso:

op = (rand() % 4) + 1;

O comando rand() % 3 vai gerar números 'aleatórios' de 0 a 2, com + 1 ficaria de 1 a 3 (!?)

Seria de 1 a 4!

 

Se quiser passo o código todo, ok?

adicionado 38 minutos depois

@devair1010 Olá. Perceba o seguinte: Você colocou o menu q solicita p o usuário se ele deseja ou não continuar depois da função retornar o resultado da operação. Logo, dessa forma, o fluxo do programa não vai chegar até o menu  :(

 

Editado por giu_d
corrigir comentário
  • Curtir 2
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

-------------------------------------------------------------------

Programação procedural é do bem!

Hoje há uma qualidade que dou atenção de mais 

em  meus códigos, a generalidade; que resulta

na  analise e reusabilidade isso é bom ツ


O professores Allen Downey [no Python],

Donald Knuth um dos maiores gigantes da

programação, se não mais importante na Ciência

da Programação; denunciam os abusos que 

comentemos ao exibir um código muito

específico, e também pouco ou nada literário.

 

Rescrevendo o código, mais literário,

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <time.h>
#include <conio.h>

/* Em grupos de até três integrantes, desenvolver um programa em C
que um utilizador:
  
1) Informe nome e então escolha 2 números(os operandos)
entre 0 e 20.
2) Depois de os mostrar ao utilizador,
3) pergunte ao utilizador aleatoriamente, o valor do produto,
da adição, da multiplicação,da subtração, ou da divisão.
4) Ao fim de N tentativas ou do utilizador informar que deseja sair
do programa;
4.1) o computador indicar o número de vezes que o utilizador
acertou o resultado e o número de vezes que errou o resultado.

Algumas exigências mínimas que devem compor o trabalho:

[✓] O programa ao iniciar deve perguntar o nome do usuário;
[✓] O programa deve pedir que o usuário digite dois valores;
[✓] O programa deve perguntar ao utilizador aleatoriamente o valor
do produto, da adição, da multiplicação, da subtração, ou da
divisão dos dois valores informados;
[ ] Ao final de cada tentativa o usuário deve ser perguntado se
deseja tentar novamente ou sair do programa;
[ ] Se o usuário informar que deseja continuar o programa repete
todos os passos após a pergunta do nome;
[ ] Se o usuário informar sair, o programa deve o computador
indicar o número de vezes que o utilizador acertou o resultado e o
número de vezes que errou o resultado;
[ ] Caso o usuário não queria sair, ao final de N vezes
(a escolha dos desenvolvedores) o programa deve encerrar e indicar
o número de vezes que o utilizador acertou o resultado e o número
de vezes que errou o resultado;
[ ] O desenvolvedor deve utilizar o máximo de conteúdo aprendido na
disciplina (IF, ELSE, WHILE, DO WHILE, FOR, FUNÇÕES, VETORES e
MATRIZES ...); */

/* -------------------------------------------------FUNC_CALCULAR--
 *
 * Realiza as 4- operações básicas da aritmética elementar
 * [somar, subtrair, dividir, multiplicar]
 *
 * Parâmetro
 *    oper_1: float
 *        operando do lado esquerdo da operação
 *    oper_2: float
 *        operando do lado direito da operação
 *    operador: int
 *        símbolo da operação ou Índice{ 1:'+', 2:'-', 3:'*', 4:'/' }
 *
 * Retorna
 *    float
 *    Resultado da operação.
 *
 * Possivéis Erros
 *    Atribuir operandos ou operação invalida.
 */
float func_calcular( float oper_1, float oper_2, int operador )
{/* Realizar operações básicas da matemática */

    float result; /* resultado ou retorno da função */


    /* OPERAÇÃO */
    switch( operador ){

        case 1: case '+': /* SOMAR */
            result= oper_1 + oper_2;
            return result;

        case 2: case '-': /* SUBTRAIR */
            result= oper_1-oper_2;
            return result;

        case 3: case '*': /* MULTIPLICAR */
            result= oper_1 * oper_2;
            return result;

        case 4: case '/': /* DIVIDIR */
            result= oper_1 / oper_2;
            return result;

        default: /* Tratamento de erros */
            printf( "%s\n","Func: Calcular ...");
            printf( "Runtime erro: %s ","Operador Invalido!" );
            exit(EXIT_FAILURE); /* Com erro, finalizar programa */
    }
}

/* ----------------------------------------------------------MAIN--
 *
 * Primeira chamada na arrancando do sistema.
 */
int main ( void )
{/* Função princial */
    setlocale( LC_CTYPE, "Portuguese" ); /* Definir padrões I/O
    Definir padrões de Entrada e Saída */

    char  n= 20, /* É o número de Vezes? */
          nome[120]= {0}, /* Nome do usuário */
          *operacao[]=  { "Operação",
                          "soma",
                          "subtração",
                          "multiplicação",
                          "divisão" }, /* List. Operações */
          final; /* Não sei o que é isso !? */
    float oper_1, /* Operando num1 */
          oper_2, /* Operando num2 */
          result; /* Resposta do usuário */
    int   i, /* Contador i? */
          j, /* Contador j? */
          acertos= 0, /* Núm. de Acertos */
          op;/* Sinal do Operador */


    printf( "Digite seu nome: " );
    scanf( "%s",&nome );


    printf( "Digite o primeiro valor: " );
    scanf( "%f",&oper_1 );

    printf( "digite o segundo valor: " );
    scanf( "%f",&oper_2 );

    srand( time(0) ); /* Semear valor randomizante */
    op= (rand() % 4) + 1; /* Selecionar Operador */

    printf( "\n%s %s %s",
        "Qual é o resultado da",operacao[op],"dos valores?" );
    scanf( "%f",&result );

    /* Testar se respondeu corretamente */
    if( result == func_calcular(oper_1,oper_2,op) ){

        acertos++; /* Adicionar +1 acerto */
    }
    return 0;
    /* Fim do programa */
}

-------------------------------------------------------------------

Na leiguice há esperança, depois que maus

hábitos se consolidam, se torna mais difícil.

 

Alguns programadores são contra, porque gostam

de resumir, principalmente aquilo que para eles é

óbvio não necessita documentar. 

São os péssimos e  prepotentes.

 

 

 

@glaukito

Bons Códigos.

 

Editado por AnsiC
Fazendo do português algo mais legível
  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adendo:

30 minutos atrás, AnsiC disse:

case 1: case '+': /* Operação SOMA *

 

A operação chama-se "adição" :D. Soma está para adição, assim como produto está para multiplicação.

 

Outra coisa, antes da divisão, é necessário verificar se o denominador é diferente de 0, pois o computador não entende essa divisão... lembrando que se o numerador for diferente de 0, não é possível dividir por zero.

 

  • Curtir 1
  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC

 

48 minutos atrás, AnsiC disse:

@glaukito

Bons Códigos.

 

Também estou vendo isso. E o  cara chegou há pouco tempo aqui!  :thumbsup:

 

Editado por giu_d
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Simon Viegas disse:

A operação chama-se "adição" :D. Soma está para adição, assim como produto está para multiplicação.

Corrigido para "SOMAR" :D ou ou efetuar a operação da "soma"

soma_sinonimo_de_adicao.png

obrigado!

 

 
1 hora atrás, Simon Viegas disse:

Outra coisa, antes da divisão, é necessário verificar se o denominador é diferente de 0, pois o computador não entende essa divisão... lembrando que se o numerador for diferente de 0, não é possível dividir por zero.

@glaukitoOlha o tratamento dos operandos ... Junte também ao limite. Só que no caso do limite [0,20] um novo método, que não func_calcular, caso coloque a verificação dos limites na função de calculo tirará sua generalidade. Isso não é bom; segundo os grandes programadores.

 

 

1 hora atrás, giu_d disse:

Também estou vendo isso. E o  cara chegou há pouco tempo aqui!

E você, deu-lhe boas dicas :thumbsup:

Editado por AnsiC
  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre:

1 hora atrás, AnsiC disse:

Corrigido para SOMAR.

 

Sinônimo é diferente de "necessariamente a mesma coisa". Tem gente que chama "gabinete do computador" de "CPU", por exemplo... nem por isso aquilo é um.

:)

 

Foi apenas reforçar esse engano (senso comum). O nome da operação na matemática é adição mesmo. Soma é o resultado da adição... Ex.: a soma de 2+4 é 6, assim como o produto de 2*4 é 8.

 

Em fim, "soma" é o termo vulgar, que vai acabar significando a mesma coisa, já que "todo mundo entende".

 

Para mim, seria como chamar multiplicação de produto, divisão de quociente, ou subtração de diferença.

 

Outro exemplo:

eficácia.png

 

Seria a eficácia a mesma coisa que a eficiência? rs

 

adicionado 13 minutos depois

Só para reforçar a minha interpretação: é possível chamar de "soma", "junção", "conta de mais" etc, mas o termo matemático é um só: Adição... ou seja, ao se referir "operação", teria que usar adição mesmo. Pelo menos assim entendo.

Editado por Simon Viegas
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas 

5 minutos atrás, Simon Viegas disse:

Para mim, seria como chamar multiplicação de produto, divisão de quociente, ou subtração de diferença.

Para você, e para quem mais? Quem mais faz questão disso!

 

7 minutos atrás, Simon Viegas disse:

Em fim, "soma" é o termo vulgar, que vai acabar significando a mesma coisa, já que "todo mundo entende".

Sou estudante de física de uma boa instituição, com bons Doutores, bons Mestres, nenhum deles fazem tanta distinção de soma e adição da maneira que faz tu. Jamais ocorrerá á homens e mulheres tão inteligentes, atacar coisa tão pequena. Eu sei adição é operação, bem como nós sabemos que soma é seu sinônimo, está nos livros, nos dicionário em toda parte, na fala inclusive na fala do brasileiro. O Brasil é grande, ao contrario de você, para nos outros soma tem mesmo sentido!

 

Sua a língua é viva, como ser vivo também se transforma, e não importa o que achemos dela.

 

 

11 minutos atrás, Simon Viegas disse:

Seria a eficácia a mesma coisa que a eficiência? rs

Não entendi porque responder isso é importante.

 

É Totalmente fora do tema e você na qualidade de moderador deveria saber que é contra as regras do fórum discussões off tópico, seja um moderador melhor. 

 

Não faço questão nenhum de mudar a tua maneria de pensar, 207 bilhões de brasileiros com a vulgar mania de falar estão pouco se lixando da vulgaridade da coisa . Assumo que errei! Nem sei o que significa sinônimo, isso te fará sentir melhor tenho certeza.

 

Tchau, tenho que tomar balho agora!

  • Curtir 1
  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@glaukito Olá. Gostei do código e resolvi dar um 'tapinha' nele. Só q não está completo, com todas as funcionalidades.

Tem o seguinte ponto no código q notei: Se você escolher os números 5 e 3 (por exemplo) vai ficar difícil verificar se a resposta da divisão está correta. Não deu p identificar o por que do problema ainda

Vou postar o código, mas antes uma observação: Seria importante você entender tudo q está sendo feito no código. Também tem a questão de q no código são feitas várias leituras do teclado, e devido a isso recomendo fazer uso da função limpa_linha com mencionei acima para limpar o stdin.

Segue o código:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#include <string.h>

int acertos = 0;

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

int verificarResposta(float a, float b) {

    char valor1[10], valor2[10];

    sprintf(valor1, "%.2f", a);

    sprintf(valor2, "%.2f", b);

    if (!strcmp(valor1, valor2)) {
        printf("\nAcertou!\n");
        acertos++;
    } else {
        printf("\nErrou!\n");
    }
}

void exibirResposta(float a) {
    printf("\nsua resposta: %.2f\n", a);
}

char menu() {

    char resp;

    printf("deseja continuar? [s/n]: ");
    scanf("%c", &resp);
    limpa_linha();

    return resp;
}

float calc (float num1, float num2) {

    float result, respUsu;
    char op;

    srand(time(NULL));

    op = (rand() % 4) + 1;
 
    switch (op) {

        case 1:
            printf ("resultado da soma dos valores: ");
            scanf ("%f", &respUsu);
            limpa_linha();

            result = num1 + num2;

            verificarResposta(result, respUsu);

            exibirResposta(respUsu);

            return result;
            break;
        case 2:
            printf ("resultado da subtração dos valores: ");
            scanf ("%f", &respUsu);
            limpa_linha();

            result = num1 - num2;

            verificarResposta(result, respUsu);

            exibirResposta(respUsu);

            return result;
            break;
       case 3:
            printf ("resultado da multiplicação dos valores: ");
            scanf ("%f", &respUsu);
            limpa_linha();

            result = num1 * num2;

            verificarResposta(result, respUsu);

            exibirResposta(respUsu);

            return result;
            break;
       case 4:
            printf ("resultado da divisão dos valores: ");
            scanf ("%f", &respUsu);
            limpa_linha();

            result = num1 / num2;

            verificarResposta(result, respUsu);

            exibirResposta(respUsu);

            return result;
            break;
    }
}

int main (void) {

    setlocale (LC_CTYPE, "Portuguese");

    char nome[40];
    float num1, num2, result;
    char op;
    int qtdeResp = 0;

    printf ("digite seu nome: ");
    scanf ("%[^\n]", nome);
    limpa_linha();

    do {
        system("cls");

        do {
            printf ("digite o primeiro valor: ");
            scanf ("%f", &num1);
            limpa_linha();

        } while (num1 > 20 || num1 < 1);

        do {
            printf ("digite o segundo valor: ");
            scanf ("%f", &num2);
            limpa_linha();

        } while (num2 > 20 || num2 < 1);

        printf("\n");

        result = calc(num1, num2);

        printf ("\nresposta correta: %.2f\n\n", result);

        qtdeResp++;

        op = menu();

    } while (op != 'n');

    printf("\nNome do jogador(a): %s\n\n", nome);
    printf("Quantidade de respostas: %d\n\n", qtdeResp);
    printf("Quantidade de acertos: %d\n", acertos);

    return 0;
}

Só q tô achando muita moleza para vocês eu passar o código quase pronto hehe

Abraço!

Editado por giu_d
Correção no código
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa noite gente boa!

 

muuuuuito obrigado por todos os comentários, vocês realmente me ajudaram muito.

 

aquele abraço!

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d

 

última pergunta... o que essa parte do código está fazendo? principalmente essa parte: printf(valor1, "%c.2f", a);

int verificarResposta(float a, float b) {

    char valor1[10], valor2[10];

    sprintf(valor1, "%.2f", a);

    sprintf(valor2, "%.2f", b);
}

 

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@glaukito Olá. Já esperava q você fosse perguntar isso. Na verdade o q está acontecendo no código é q não tá fechando a comparação de valores com casas decimais para o cálculo da divisão.

Faça o seguinte no código:

printf ("resultado da divisão dos valores: ");
scanf ("%f", &respUsu);
limpa_linha();

result = num1 / num2;

if (respUsu == result) // essa comparação aqui não fecha para o caso do resultado ser 1.25 por exemplo e o usuário digitar 1.25
    printf("Acertou!")
else
    printf("Errou!")

Faça o teste p ver. Não entendi o por quê disso. Mas para contornar esse problema o que eu faço é copiar para uma string o valor formatado de a e o valor formatado de b com duas casas decimais apenas e aí comparar as strings.

Pérai q fiquei sem internet hehe. Deu 'zica' aqui

Creio q o problema é com respeito as casas decimas para o tipo de dado float, que, por padrão, são 6

 

Editado por giu_d
corrigir comentário
  • Curtir 1

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





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×