Ir ao conteúdo

Posts recomendados

Postado

Boa noite pessoal acabei de fazer esse código, até então está tudo correto nele, porém tenho uma duvida, é possível por exemplo eu fazer com que o usuário defina quantos números vão entrar nas operações matemáticas abaixo ? isso em todas as operações, por exemplo somar 5 números, subtrair 3

[Nota de moderação: realocado texto acima que estava junto com o código]

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

int main()
{
    setlocale(LC_ALL, "Portuguese");
    float n1=0, n2=0, resultado=0;
        int opcao=0;
    do{
    	printf ("Digite o primeiro numero: \n");
    	scanf ("%f", &n1);
    	printf ("Digite o segundo numero: \n");
    	scanf ("%f", &n2);
        printf("-----------------------------------------------------------------------------\n");
        printf(" [1] Soma\n");
        printf(" [2] subtração\n");
        printf(" [3] multiplicação\n");
        printf(" [4] divisão\n");
        printf("sua opção: ");
        scanf ("%d", &opcao);
        printf("\n-----------------------------------------------------------------------------\n");
        switch(opcao){
                case 1:
                    resultado = n1+n2;
                    break;
                case 2:
                    resultado = n1-n2;
                    break;
                case 3:
                    resultado = n1*n2;
                    break;
                case 4:
                    resultado = n1/n2;
                    break;
                default:
                    printf("\n Digite uma opção valida\n");
                    break;
                }
                printf("\n\t O resultado e: %0.2f", resultado);
                printf("\n Digite 0 para continuar ou outra tecla para sair");
                scanf("%i", &opcao);
        }while(opcao==0);
    return 0;
}

 

  • Obrigado 1
Postado
5 minutos atrás, Mauro Britivaldo disse:

Acho que fiquei com dúvidas na sua pergunta! Dê-me uma exemplo de entrada e saída. 

@Mauro Britivaldo tem como eu fazer com que o usuario defina quantos numeros vão entrar nas operações ? por exemplo: somar 4 numeros ou somar 3 numeros.

  • Obrigado 1
Postado

É foi isso que não ficou totalmente claro para mim.

 

Por exemplo, o usuário digita: + 45 90 1024 1

Disso, o programa  responde: 1160

 

É isso?

  • Obrigado 1
Postado

@Mauro Britivaldo SIMMM você escolheu somar 4 numeros, mas o usuario poderia escolher somar 7, não sei como fazer isso.

 essa é a descrição da atividade  
Operações lógicas e aritméticas

● Somar ○ O usuário define quantos números vão entrar na operação

● Subtrair ○ O usuário define quantos números vão entrar na operação

● Dividir ○ O usuário define quantos números vão entrar na operação

● Multiplicar ○ O usuário define quantos números vão entrar na operação

  • Curtir 1
Postado

Nesse formato: Usuário define a operação e a quantidade de operandos em uma linha.ACtC-3eyvahV6p4wE2raxkJ6BYXRGfqRbZX1WOhK

 

O caractere de nova linha ('\n'), que surge no fim de cada entrada, marca o fim da operação e também dos operandos. O operador ('+','-','/','*') define o tipo da operação e será o primeiro caractere em cada linha. Todos argumentos têm um espaço entre eles (backspace).  

 

 

Sim, você pode reutilizar esse outro programa. Com pequenas diferenças.

  1. Leia antes de tudo o operador
  2. Depois leia o primeiro valor
  3. Dentro de cada switch case: ao invés de uma operação terá quantas forem necessárias, ou seja, em loop. Enquanto pegar (getchar ()) um caractere diferente de nova linha ('\n') novo valor é lido no corpo do loop e a operação escolhida executada. E quando finalmente o caractere de nova linha surgir, o loop acaba e imprime o resultado, conforme o operador.

 

Tente e depois mostre (faça só para adição)

Postado
3 horas atrás, byForteES disse:

Boa noite pessoal acabei de fazer esse codigo, até então está tudo correto nele, porém tenho uma duvida, é possivel por exemplo eu fazer com que o usuario defina quantos numeros vão entrar nas operações matematicas abaixo ? isso em todas as operações, por exemplo somar 5 numeros, subtrair 3,...


Você incluiu o texto da pergunta junto ao código e aí ficou bem difícil de ler... :D 

 

E acho que não perguntou o que queria mesmo perguntar...

 

Para o usuário definir quantos vão entrar você apenas pergunta a ele. Mas se quer que o programa funcione para um número arbitrário de operadores depois do operando pode fazer o simples: 

  • lembrando do ensino fundamental, comece com o elemento neutro, zero para soma e subtração ou 1 para multiplicação. Para divisão o que faz mais sentido é começar a dividir o primeiro pelo segundo e seguir daí dividindo
  • pode fazer algo como @Mauro Britivaldo sugeriu

    No entanto

     
    1 hora atrás, Mauro Britivaldo disse:

    Todos argumentos têm um espaço entre eles (backspace)

Não é um backspace que separa os argumentos. backspace não pode ser lido da entrada com esses comandos

 

Mas o mais simples é ler usando scanf() mas usar o valor de retorno. Parece ter uma lei que impede as pessoas de usar isso. Em um loop, Você usa scanf() para ler um número e enquanto ela devolver um número você aplica o operador. Quando não vier nada você para e mostra o resultado. Só isso.

 

scanf() e todas as outras da família devolvem o total de itens lidos. Apenas use para controlar o loop. Não deve dar 10 linhas de programa

  • Haha 1
Postado

 

7 horas atrás, arfneto disse:

Mas o mais simples é ler usando scanf() mas usar o valor de retorno. Parece ter uma lei que impede as pessoas de usar isso. Em um loop, Você usa scanf() para ler um número e enquanto ela devolver um número você aplica o operador. Quando não vier nada você para e mostra o resultado. Só isso.

 

scanf() e todas as outras da família devolvem o total de itens lidos. Apenas use para controlar o loop. Não deve dar 10 linhas de programa

 

 

Não é só isso. É preciso mais que isso. Observem:

while (scanf ("%f", valor) == 1){
	...
	...
}

Continua esperar mesmo com fim dos valores, disso basta digitar, por exemplo: # e depois ENTER

 

ACtC-3ex4MQr9wDSzXnk5wgoHRvfAF9jzVgAP8_u

*Eliminou-se a espera porque a função retorna 0 quando alcança # um valor ilegal para máscara de leitura ("%f"). Sim é uma maneira de delimitar.

 

 

7 horas atrás, arfneto disse:

Mas se quer que o programa funcione para um número arbitrário de operadores depois do operando pode fazer o simples: 

lembrando do ensino fundamental, comece com o elemento neutro, zero para soma e subtração ou 1 para multiplicação. Para divisão o que faz mais sentido é começar a dividir o primeiro pelo segundo e seguir daí dividindo

pode fazer algo como @Mauro Britivaldo sugeriu

Eu não rsrsr. Se enganou  porque eu não sugeri quantidade de operadores e operação arbitrários.

 

Veja:

10 horas atrás, Mauro Britivaldo disse:

É foi isso que não ficou totalmente claro para mim.

 

Por exemplo, o usuário digita: + 45 90 1024 1

Disso, o programa  responde: 1160

 

É isso?

Um operador por operação, operandos em sequência que lembra a notação polonesa, só que  o nosso sinal indica em todos casos adição, multiplicação ou ... dos n termos.. 

 

Básico

Estou interessado no Produtório de n  {-3 2 1 -2}

      o usuário digita: * -3 2 1 -2

      o programa  responde: 12

* -3 2 1 -2 == (-3) * 2 * 1 * (-2)

Aninhado

Estou interessado no Somatório de n {2, 3, -1,  Produtório de {-3 2 1 -2}}

      o usuário digita: * -3 2 1 -2 + 2 3 -1

      o programa  responde: 14

* -3 2 1 -2 + 2 3 -1 == ((-3) * 2 * 1 * (-2)) + 2 + 3 + (-1)

Unitário

Estou interessado no Somatório de n {2,  Produtório de {-3}}

      o usuário digita: * 3 + 2

      o programa  responde: 5

* 3 + 2 == 3 + 2

 

😉 Fica no Básico!

 

 

7 horas atrás, arfneto disse:

Não é um backspace que separa os argumentos. backspace não pode ser lido da entrada com esses comandos

Que mané backspace kkkkk coisa ridícula é space-barque dá espaços.

 

Postado
8 horas atrás, Mauro Britivaldo disse:

Não é só isso. É preciso mais que isso. Observem:

 

SIM. É só isso

 

Você não leu direito o que eu escrevi e como todos aqui parece não levar a sério a declaração de scanf()
 

int scanf(const char *format, ...)

 

8 horas atrás, Mauro Britivaldo disse:

Continua esperar mesmo com fim dos valores, disso basta digitar, por exemplo: # e depois ENTER

 

Use o valor de retorno. E vai funcionar para a entrada esperada. 

 

Em relação a aceitar coisas estranhas na entrada entenda que scanf() não foi escrita para isso e quando você usa para ler do teclado sempre pode ter surpresas. scanf() foi escrita para ler entrada formatada.

 

Se der tempo mais tarde eu posto um exemplo e talvez fique mais claro para todos

 

8 horas atrás, Mauro Britivaldo disse:

Que mané backspace kkkkk coisa ridícula é space-barque dá espaços.

 

Foi o que você escreveu :) 

Postado
4 horas atrás, arfneto disse:

SIM. É só isso Você não leu direito o que eu escrevi e como todos aqui parece não levar a sério a declaração de scanf()

Fico sem entender.

 

Veja:

13 horas atrás, arfneto disse:

Em um loop, Você usa scanf() para ler um número e enquanto ela devolver um número você aplica o operador. Quando não vier nada você para e mostra o resultado.

Disso, se fez a interpretação (+)

// Enquanto Ler um Numero, devolve 1 Numero
while (scanf ("%f", &valor) == 1){
		resultado += valor; // Aplica o Operador
  		valor = .0f;
}
	

 

 
4 horas atrás, arfneto disse:

Em relação a aceitar coisas estranhas na entrada entenda que scanf() não foi escrita para isso e quando você usa para ler do teclado sempre pode ter surpresas. scanf() foi escrita para ler entrada formatada.

Isso é folclórico. O identificador da função scan+f, f no final que remete a palavra inglesa formatted.

 
4 horas atrás, arfneto disse:

Use o valor de retorno. E vai funcionar para a entrada esperada. [...]

Se der tempo mais tarde eu posto um exemplo e talvez fique mais claro para todos

Isso inclusive ficamos sabendo qual é a sua entrada.

Postado
5 minutos atrás, Mauro Britivaldo disse:

O identificador da função tem o f no final que remete a palavra inglesa formatted

 

exato. É o que eu sempre tento explicar. Entrada pelo teclado é tudo menos isso. É o que o americano chama de free-form. O usuário pode digitar qualquer coisa. E já sai na tela!  E move o cursor! E aí já era...
 

scanf() é perfeita para coisas como consumir formulários, tabelas, arquivos csv e foi escrita para isso. Você já deve ter lido aqui quando eu escrevo sobre isso: scanf() significa  scan formatted input. E vem desde os tempos em que ela residia na pasta /usr/bin do diretório do Ken Thompson na Bell.

 

Nenhum programa de produção usaria scanf() para ler do teclado, porque é preciso ter controle do que está entrando. O que se faz é em geral ler letra a letra e não mostrar antes de ver se é o esperado. Ou com algum risco ler uma linha por vez.

 

10 minutos atrás, Mauro Britivaldo disse:

Fico sem entender, escreva um programa de exemplo e talvez assim deixa mais claro essa afirmação

 

Sobre esse caso aqui por exemplo, veja uma possível aproximação com scanf() que vou deixar:


O resultado antes:

Entre operador [+-*/]: +
Operador lido: '+'
Lendo operandos: -1 2 -3 4 5 -6 7 8 9 -10 clube
Operando 0: -1
Operando 1: 2
Operando 2: -3
Operando 3: 4
Operando 4: 5
Operando 5: -6
Operando 6: 7
Operando 7: 8
Operando 8: 9
Operando 9: -10

Lidos 10 operandos

Para esse programa

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(int argc, char** argv)
{
	char arq[80]; 
	char delim[4]; // delimitador
	int  n = 0;
	const char* sc_operador = "%[+-/*]%c";
	const char* sc_operandos = "%d%c";

	printf("Entre operador [+-*/]: ");
	n = scanf( sc_operador, arq, delim);
	if (n != 2)
	{	printf("Nao conseguiu ler operador\n");
		return -1;
	};
	printf("Operador lido: '%c'\n", arq[0]);
	int oper = 0; // operador
	int total = 0; 
	printf("Lendo operandos: ");
	while ( (n = scanf( sc_operandos, &oper, delim)) == 2 )
	{
		printf("Operando %d: %d\n", total, oper);
		total += 1;
		if (delim[0] == '\n') break;
	};
	printf("\nLidos %d operandos\n", total);
	return 0;
};

 

Não vou explicar linha a linha. Me pergunte se não entender algo. Escrevendo assim se pode ler o operador e depois ler todos os parâmetros na linha, e contar o total deles. Seria bem suficiente para um estudante ou um programa de teste. E até aceita alguns casos limite, como

Entre operador [+-*/]: -*/-/-*+
Operador lido: '-'
Lendo operandos: 101 233 3455 azul
Operando 0: 101
Operando 1: 233
Operando 2: 3455

Lidos 3 operandos

Caso em que o cara digitou vários operadores, e digitou "azul" ao final da linha :)

 

Deixei os especificadores usados para scanf() no início do programa, para facilitar alterar e para poder ve-los juntos aqui, ao invés de deixar embutidos lá nas chamadas

 

Sobre os especificadores para  scanf() aqui

	const char* sc_operador = "%[+-/*]%c";
	const char* sc_operandos = "%d%c";
  • Um especificador é algo que começa por % e não tem um % a seguir ;) então aqui nos dois casos tem dois deles. Então isso é o que scanf() vai sair furiosamente tentando consumir da entrada, seja um vetor --- sscanf() --- arquivo  ---fscanf() --- ou mesmo da entrada padrão --- scanf().
     
  • scanf() precisa ler algo, e cada "algo" termina por ENTER espaço ou TAB. E não desiste.
     
  • E ao retornar vai retornar algo nesse caso igual a 0, 1 ou 2, porque esse é o total de dados que ela vai tentar consumir. E por isso eu sempre escrevo e ensino aqui para NUNCA deixar de ler esse valor de retorno. Porque o programa não volta sózinho e scanf() pode consumir outros dados e passar reto...
     
  • o primeiro especificador aceita apenas os operadores, mas aceita um grupo deles e considera só o primeiro. Você pode limitar com %1[+-*/] onde o 1 é o tamanho máximo que você quer ler
     
  • o segundo especificador lê um número e uma letra. Isso é importante porque a letra pode ser uma letra mesmo, ou espaço ou TAB ou ENTER. E se foi um ENTER vai sinalizar o fim da linha, que é o fim dos argumentos e o sinal pra sair do loop. Então para tomar a decisão certa é preciso ler o delimitador e saber como scanf() retornou
     

Assim pode resolver a maioria dos casos para esse enunciado, tratando os argumentos de acordo.
 

Claro, deveria esvaziar a entrada ao final do primeiro scanf() porque pode ter sobrado algo que vai comprometer a leitura dos operandos adiante.
 

Claro, scanf() precisa ler algo para retornar quando tenta ler um número então se o cara teclar enter direto na entrada do primeiro scanf vai mudar de linha... scanf() é isso...

 

Isso é só um exemplo para mostrar a mecânica disso. Não é exatamente uma solução para o problema e nem vou dizer que é a melhor, sequer uma boa maneira de fazer. Mas é assim que a rotina funciona e é o que estou tentando mostrar

 

Como fazer essa m#$%a de ler dados com segurança então?

 

O seguro é o conhecido: posiciona o cursor, tenta ler de um grupo de teclas esperado, mas não mostra a letraToca um beep e não move se veio algo diferente, tipo algo que não seja um operador no primeiro caso. Não move o cursor. Se foi uma tecla válida aceita e mostra e avança o cursor até ler o campo todo.

 

Ao ler todos os campos fecha o formulário. TAB avança para o próximo campo, SHIFT TAB volta campo, ESC sai e assim era quando se liam coisas do terminal e não se podia deixar o usuário teclar qualquer coisa e zoar a tela.

 

Usando scanf() a partir de um arquivo

 

Para um arquivo de entrada assim

+-* 1 2 3 4 5 6 7 8 9 10

Esse seria o resultado 

Entre operador [+-*/]: Operador lido: '+'
Lendo operandos:  1 2 3 4 5 6 7 8 9 10
Lidos 10 operandos

Desse programa

 

Citação

fscanf() funciona do mesmo modo que scanf(). Apenas sscanf() é diferente porque não há buffer na leitura a partir de um vetor...

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(int argc, char** argv)
{
	char arq[80], delim[4];
	int  n = 0;
	FILE* ent = fopen("rpn.txt", "r");

	printf("Entre operador [+-*/]: ");
	n = fscanf(ent, "%[+-/*]%c", arq, delim);
	if (n != 2)
	{
		printf("Nao conseguiu ler operador\n");
		return -1;
	};
	printf("Operador lido: '%c'\n", arq[0]);
	int oper = 0;
	int total = 0;
	printf("Lendo operandos: ");
	while ( (n = fscanf(ent, "%d%c", &oper, delim)) == 2)
	{
		printf(" %d", oper);
		total += 1;
	};
	printf("\nLidos %d operandos\n", total);
	return 0;
};
  • Curtir 1
Postado
1 hora atrás, arfneto disse:

exato. É o que eu sempre tento explicar. Entrada pelo teclado é tudo menos isso. É o que o americano chama de free-form. O usuário pode digitar qualquer coisa. E já sai na tela!  E move o cursor! E aí já era...
 

scanf() é perfeita para coisas como consumir formulários, tabelas, arquivos csv e foi escrita para isso. Você já deve ter lido aqui quando eu escrevo sobre isso: scanf() significa  scan formatted input. E vem desde os tempos em que ela residia na pasta /usr/bin do diretório do Ken Thompson na Bell.

Isso par mim é folclórico @arfneto

 

😒 Seu código de exemplo nada tem haver com a discussão inicial:

" scanf() para ler um número e enquanto ela devolver um número você aplica o operador".

6 horas atrás, arfneto disse:

SIM. É só isso

No final, comprovou ser bem +.

 

ACtC-3daH7YxayY08RB1-xwPY627deMtFpTr7Li1

A entrada também é diferente!

 

ACtC-3eKXYlJeNB7Z5rxCBTNyu8dfaj_07NEGq1N

Código realmente ficou o mais simples.

 

15 horas atrás, arfneto disse:

Não deve dar 10 linhas de programa

Erro de planejamento.

Postado
1 hora atrás, Mauro Britivaldo disse:

Isso par mim é folclórico @arfneto

 

😒 Seu código de exemplo nada tem haver com a discussão inicial:

" scanf() para ler um número e enquanto ela devolver um número você aplica o operador".

 

Pense bem, @Mauro Britivaldo  o loop do programa que te mostrei vai trazer os operandos um a um.... E depois de ler o operador. 

Como você pode escrever que "nada tem a ver"? Pense mais.

Eu só não quis postar uma solução para o problema mas achei que estava óbvia uma solução aí. Eu até escrevi tal solução, neste mesmo loop. Só não postei porque não vi solução do autor ou de ninguém aqui e escrevo para ajudar e não para aparecer.

 

Espero que você tenha entendido o exemplo que postei e já terei ajudado.

 

Usando esse loop a solução só não é absolutamente trivial porque a divisão precisa de um tratamento ou convenção diferente. Depois eu posto o código

 

adicionado 2 minutos depois
1 hora atrás, Mauro Britivaldo disse:

No final, comprovou ser bem +.

 

bem mais o que? um programa de 1 loop e 30 linhas não tem lugar pra muita coisa

Postado
2 horas atrás, Mauro Britivaldo disse:

A entrada também é diferente!

 

Isso é um exemplo e muita gente parece não entender scanf(). É mais útil como exemplo assim como escrevi
 

16 horas atrás, Mauro Britivaldo disse:

scanf() e todas as outras da família devolvem o total de itens lidos. Apenas use para controlar o loop. Não deve dar 10 linhas de programa


trecho.png.e51776193fa8e93b0db45c68d2e258ea.png

 

"para controlar o loop". Talvez não tenha lido direito. Na verdade na solução que escrevi tem 5 linhas apenas. porque eu deixei a operação em uma função que tem umas 15...

Mas não achei importante. E a função não controla o loop.

 

 

Postado
2 horas atrás, arfneto disse:

Pense bem, @Mauro Britivaldo  o loop do programa que te mostrei vai trazer os operandos um a um.... E depois de ler o operador. 

 Não correspondeu em grau com teu enunciado

 

18 horas atrás, arfneto disse:

Em um loop, Você usa scanf() para ler um número e enquanto ela devolver um número você aplica o operador.

É uma solução que até interessante de observa também, mesmo no caso mais básico, porém não aconteceu nada desse jeito. Acredito que eu fui mais fidedigno que você

VEJA:

5 horas atrás, Mauro Britivaldo disse:

Disso, se fez a interpretação (+)


// Enquanto Ler um Numero, devolve 1 Numero
while (scanf ("%f", &valor) == 1){
		resultado += valor; // Aplica o Operador
  		valor = .0f;
}
	

 

 

 

2 horas atrás, arfneto disse:

bem mais o que? um programa de 1 loop e 30 linhas não tem lugar pra muita coisa

Encrencou-se ao falar que a resposta fica em no máximo 10 linhas e agora sabemos que não.

 

56 minutos atrás, arfneto disse:

Na verdade na solução que escrevi tem 5 linhas apenas. porque eu deixei a operação em uma função que tem umas 15... Mas não achei importante. E a função não controla o loop.

A solução é soma de todas as partes. Mas se não é importante as 15 linhas então pague-as!

 

 
2 horas atrás, arfneto disse:

Usando esse loop a solução só não é absolutamente trivial porque a divisão precisa de um tratamento ou convenção diferente. Depois eu posto o código

Sim, com certeza e eu em momento algum subestimei.

 

No Aguardo das 10 linhas😉

Postado
13 minutos atrás, Mauro Britivaldo disse:

Não correspondeu em grau com teu enunciado

 

Eu te expliquei: é difícil ver exemplos de scanf() para esse tipo de caso do modo como eu expliquei. E por isso EU expliquei. Isso aqui é para ajudar mais pessoas. Pode ser útil para mais pessoas. Até você, que nunca tem dúvidas, poderia até de repente aprender algo. E eu também.


Não é uma competição. É uma colaboração. Eu ao menos não iria competir exceto se pago.

 

16 minutos atrás, Mauro Britivaldo disse:

É uma solução que até interessante de observa também, mesmo no caso mais básico, porém não aconteceu nada desse jeito. Acredito que eu fui mais fidedigno que você

 

Não estou escrevendo somente para o autor. Minha intenção era explicar como usar scanf() para consumir a entrada com argumentos variáveis, o que você postou depois de eu ter escrito. Mas você não postou um programa que fizesse algo, apenas 3 linhas. Há grande diferença entre um post e outro.

 

21 minutos atrás, Mauro Britivaldo disse:

Acredito que eu fui mais fidedigno que você

 

Pois é: não estou competindo com você ou ninguém. 

 

Mas postei detalhes, códigos e argumentos mais genéricos e que podem servir para outros casos

 

Esse programa por exemplo trataria um linha com operador e um número arbitrário de operandos

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(int argc, char** argv)
{
	char operador[80];
	char delimitador[4];
	int n = scanf("%[+-/*]%c", operador, delimitador);
	if (n != 2)	return -1;
	int operando = 0, total = 0, res = 0;
	while ( (n = scanf("%d%c", &operando, delimitador)) == 2)
	{	// le e opera
		switch (operador[0])
		{
		case '+':
			res = res + operando;
			break;
		case '-':
			if (total==0)
				res = operando;
			else
				res = res - operando;
			break;
		case '*':
			if (total == 0)
				res = operando;
			else
				res = res * operando;
			break;
		case '/':
			if (total == 0)
				res = operando;
			else
				res = res / operando;
			break;
		};	// switch()
		total += 1;
		if (delimitador[0] == '\n') break;
	};
	if (total > 0)	printf(	"%d\n", res);
	return 0;
};
// fim

E mostraria para  algumas testes

+ 1 2 3 4 teste
10

- 10 1 1 1 1
6

----

* 1 2 3 4 5
120

----

/ 64 2 2 2 2
4

---- 

/ 64
64

Inicialmente havia uma função no loop e era algo assim

	while ((n = scanf(sc_operandos, &operando, delim))==2)
	{
		res = opera(arq[0], operando, res, total);
		total += 1;
		if (delim[0] == '\n') break;
	};

e é o loop de controle mesmo. O único. Era mais legível. E a função opera() era basicamente a operação em si. Mais legível que o código acima, e menos útil que o código original que era genérico sobre o uso de scanf() e tinha mais mensagens de acompanhamento

 

int opera(char op, int A, int B, int ind)
{	// executa a operacao e retorna o total
	switch (op)
	{
	case '+':
		return(A + B);
		break;
	case '-':
		if (!ind) B = A, A = 0;
		return(B - A);
		break;
	case '*':
		if (!ind) B = 1;
		return(A * B);
		break;
	case '/':
		if (!ind) B = A, A = 1;
		return(B / A);
		break;
	};	// switch()
	return 0;
};	// opera()

 

 

Postado
1 hora atrás, arfneto disse:

Eu te expliquei: é difícil ver exemplos de scanf() para esse tipo de caso do modo como eu expliquei. E por isso EU expliquei. Isso aqui é para ajudar mais pessoas. Pode ser útil para mais pessoas. Até você, que nunca tem dúvidas, poderia até de repente aprender algo. E eu também.

Notei que apresentou uma solução um pouco só menos trabalhosa.

 

1 hora atrás, arfneto disse:

Pois é: não estou competindo com você ou ninguém. 

Não se trade de competir com mais ninguém, se existi de certa maneira uma competição foi de você contra você mesmo.

 

 

VEJA:

1 hora atrás, arfneto disse:

while ( (n = scanf("%d%c", &operando, delimitador)) == 2)

Entenda que aqui não somente ler um número e retornando um número!

 

Faltou algo a mais e importante o caractere "%c", principalmente o problema do '\n' que mencionei bem aqui

19 horas atrás, arfneto disse:

Você usa scanf() para ler um número e enquanto ela devolver um número você aplica o operador.

19 horas atrás, Mauro Britivaldo disse:

Não é só isso. É preciso mais que isso. Observem:


while (scanf ("%f", valor) == 1){
	...
	...
}

 

 

1 hora atrás, arfneto disse:

Mas postei detalhes, códigos e argumentos mais genéricos e que podem servir para outros casos

Eu até entendo, mas acredito que o problema em discussão dá minha parte é outro.

 

👍 Principalmente fazer tudo em 10.

Postado

 

2 horas atrás, Mauro Britivaldo disse:

Notei que apresentou uma solução um pouco só menos trabalhosa.

 

Eu não pretendia apresentar uma solução. em princípio. Tentava explicar uma aproximação para esse tipo de problema. Passou a fazer sentido mostrar o que eu tinha escrito depois do que eu expliquei e do que você questionou.

 

"um pouco mais trabalhosa" é algo curioso. O autor do tópico apresentou um código mas estava em busca de uma solução. E o mais remotamente próximo de uma solução seria o que você postou? Alguns parágrafos de texto e umas telas de execução de algum programa que não apresentou? 

 

Isso parece competitivo, de novo, afinal é uma comparação. "um pouco menos trabalhosa" disse você. E se for o caso nem adianta. Você sequer apresentou uma solução, e não frequento o forum para competir. E você provavelmente não seria um oponente, fosse eu fazer isso.

image.png.609b120373cb5b0cd560bd12b8ee362b.png

 

Você podia se expressar um pouco mais claramente, ou eu poderia ter uma compreensão mais criativa de suas construções verbais.  Se está apenas tentando contradizer o que eu disse porque a chamada a scanf() que mostrei tem dois especificadores não entendo a relevância. De fato se "usa scanf() para devolver um número e aí se aplica o operador" como eu disse. O delimitador indica como prosseguir. Não parece relevante, assim como o fato de ter mais de 10 linhas ou não. 

 

O loop de controle no programa que mostrei é esse

	while ((n = scanf(sc_operandos, &operando, delim))==2)
	{
		res = opera(arq[0], operando, res, total);
		//printf("Operando %d: %d\n", 1 + total, operando);
		total += 1;
		if (delim[0] == '\n') break;
	};

e tem o sentido bastante claro e legível. Escrevi para iniciantes. E como planejado a chamada a scanf() devolve os operandos uma um. opera() é apenas um seletor de operando e eu mostrei que não precisaria estar aí, mas poderia. Postei o código sem a função também.

 

Não sei onde você quer chegar. Eu escrevi e mostrei o que eu pretendia: uma opção usando essa rotina --- que eu não recomendo para isso --- e como usar em casos mais genéricos.

 

Se está remoendo o fato de ter mais de 10 linhas ou de eu ter usado o delimitador para dirigir a próxima chamada a scanf() essa é uma técnica comum na prática.

 

Espero ter ajudado alguém em algo

  • Haha 1
Postado
13 horas atrás, arfneto disse:

Eu não pretendia apresentar uma solução. em princípio. Tentava explicar uma aproximação para esse tipo de problema. Passou a fazer sentido mostrar o que eu tinha escrito depois do que eu expliquei e do que você questionou

Quando anunciou um número para linhas do código tornou um pouco interessante um exemplo com esse mesmo número.

 

13 horas atrás, arfneto disse:

Alguns parágrafos de texto e umas telas de execução de algum programa que não apresentou? 

Já que o "mais simples" é com scanf, não tenho razões para escrever de outra do forma seria redundante

 

13 horas atrás, arfneto disse:

Você podia se expressar um pouco mais claramente, ou eu poderia ter uma compreensão mais criativa de suas construções verbais.

O mérito é daquela que compreende mais, se você é realmente qualificado vai ter capacidade de entender qualquer um, assim como eu compreendo você.

 

13 horas atrás, arfneto disse:

Se está apenas tentando contradizer o que eu disse porque a chamada a scanf() que mostrei tem dois especificadores não entendo a relevância.

 

VEJA:

Em 24/06/2020 às 02:14, arfneto disse:

Em um loop, Você usa scanf() para ler um número e enquanto ela devolver um número você aplica o operador

 

Em 24/06/2020 às 02:22, Mauro Britivaldo disse:

Não é só isso. É preciso mais que isso. Observem:


while (scanf ("%f", valor) == 1){
	...
	...
}

Continua esperar mesmo com fim dos valores

 

Em 24/06/2020 às 11:03, arfneto disse:

SIM. É só isso

 

Você não leu direito o que eu escrevi e como todos aqui parece não levar a sério a declaração de scanf()

 

17 horas atrás, arfneto disse:

while ( (n = scanf("%d%c", &operando, delimitador)) == 2)

Conclusão: Algoritmo narrativo para o controle do loop do problema principal tem faltas na compreensão dos detalhes. É importante detalhar bem porque esse tipo de algoritmo é passivo de erros principalmente pela falta de detalhes.

 

13 horas atrás, arfneto disse:

Isso parece competitivo, de novo, afinal é uma comparação. "um pouco menos trabalhosa" disse você. E se for o caso nem adianta. Você sequer apresentou uma solução, e não frequento o forum para competir. E você provavelmente não seria um oponente, fosse eu fazer isso.

 

Em 24/06/2020 às 02:14, arfneto disse:

Mas o mais simples é ...

e "um pouco menos trabalhosa é" são significativamente iguais. Eu confirmei sua afirmação.

 

13 horas atrás, arfneto disse:

De fato se "usa scanf() para devolver um número e aí se aplica o operador" como eu disse. O delimitador indica como prosseguir. Não parece relevante, assim como o fato de ter mais de 10 linhas ou não. 

Você diz que é desapego ao detalhes, já eu acho que sua falta nos detalhes é indicio de quem só tem uma ideia na cabeça e nenhum o programa escrito, ou seja, não escreveu o programa antes e falou besteira no caso das 10 linhas.

 

 

13 horas atrás, arfneto disse:

Não parece relevante, assim como o fato de ter mais de 10 linhas ou não. 

Tornou-se relevante porque você falou. No próxima tópico seja menos irrelevante com as palavras e capriche no quesito detalhes. Obrigado.

 

 

  • Haha 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...