Ir ao conteúdo
  • Cadastre-se
ngiovana

C For com comando vazio

Recommended Posts

Estava fazendo uns exercícios e fiquei com dúvida em um que pedia para verificar se um número é triangular.

 

O código abaixo é a resposta do exercício, eu tinha feito a mesma coisa, exceto por ter usado chaves para o for.

 

/* Programa que determina se um numero e' triangular */

#include <stdio.h>

int main() {
  int i, n;
  
  printf("Digite o valor de n: ");
  scanf("%d",&n);
  
  /* for com comando vazio! */
  for (i = 1; i*(i+1)*(i+2) < n; i++)
    ;
  
  if (i*(i+1)*(i+2) == n)
    printf("%d e' o produto %d*%d*%d\n", n, i, i+1, i+2);
  else
    printf("%d nao e' triangular\n", n);
  
  return 0;
}

 

É a primeira vez que vejo isso, e não consegui entender o motivo de dar errado se usar as chaves no for, nem quando se aplica o for com comando vazio.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para todos os números considerados triangular, esta expressão disse "nao e' triangular": 

i*(i+1)*(i+2) ≡ i3 + 3i2 + 2i

Independente do chaveamento do bloco nulo em FOR.

 

 

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

1#

Sobre:

1 hora atrás, ngiovana disse:

O código abaixo é a resposta do exercício, eu tinha feito a mesma coisa, exceto por ter usado chaves para o for.

 

De um modo geral, não se pode afirmar que o exercício tem apenas UMA resposta... ou seja, tecnicamente não seria "a" resposta, mas sim "uma" resposta.

 

 

 

2#

1 hora atrás, ngiovana disse:

É a primeira vez que vejo isso, e não consegui entender o motivo de dar errado se usar as chaves no for, nem quando se aplica o for com comando vazio.

 

Nesse caso tem que entender "o que está dando errado". Um dos problemas está no próprio resultado.. veja:

1 hora atrás, ngiovana disse:

  if (i*(i+1)*(i+2) == n)
    printf("%d e' o produto %d*%d*%d\n", n, i, i+1, i+2);

 

Oras! quem disse que todo "número triangular" é um produto de 3 outros números? por si só essa parte já parece que tem algo errado nesse algoritmo.

 

RESUMINDO: é necessário antes revisar o que é um "número triangular", para só depois tentar implementar um algoritmo para resolver o problema.

 

 

***

 

Uma sugestão:

Esqueça que a linguagem C existe, tente «verificar se um número é triangular»  ou não no papel. Como você faria? pegue uma sequência de número e diga quais deles são números triângulos.

 

Aí, tenta criar um algoritmo para "definir" os passos necessários para resolver esse problema (que é "verificar se um número é triangular ou não)... algo como criar os passos necessários para calcular, como estivesse passando as instruções para outra pessoa (no caso, pode ser para você mesmo, mais ao "executar o algoritmo", siga passo a passo o que "implementou").

 

A linguagem C (ou qualquer outra) entra "apenas" para "automatizar o processo". 

 

 

Vou dar um spoiler

Spoiler

O código vai funcionar por exemplo com o 6. Pois este é o único número que é triangular e é produto de 3 outros números ao mesmo tempo.
obs.: além do 6, podem aparecer outros "falsos" positivos. (que satisfazem a regra do if, mas que não é triangular)
obs.2: pode acontecer de um desses "falsos positivos" serem de fato um número triangular, mas seria apenas uma coincidência! ou seja, informaria que é um número triangular por sorte (não pela lógica, que como sugerido na postagem, está errada)!

 

 

No aguardo.

adicionado 8 minutos depois

Sobre:

1 hora atrás, AnsiC disse:

Para todos os números considerados triangular, esta expressão disse "nao e' triangular": 

i*(i+1)*(i+2) ≡ i3 + 3i2 + 2i

Independente do chaveamento do bloco nulo em FOR.

 

Cai no citado no spoiler anterior:

Spoiler

 

Com n=6, o i ficará com 1 (pelo menos aqui deu), logo:


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

E 6 é um número triangular.

 

adicionado 13 minutos depois

ADENDO:

Outro ponto importante que o cálculo do "número triangular" não é com produto, mas sim com adição, ou seja:
 

Spoiler

6 resultar corretamente também é um coincidência: 
Em vez de 1*(1+1)*(1+2), seria 1+(1+1)+(1+2) que é igual a 1+(2)+(3) que também dá 6.

 

 

Correto?

  • Curtir 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como foi mencionado pelo @AnsiC e o @Simon Viegas  o cálculo para verificar se é um número triangular está errado.

 

 

Mas quanto a sua dúvida...

 

Assumo que quando falou em usar chaves quis dizer fazer algo assim?

for (i = 1; i*(i+1)*(i+2) < n; i++) {
  if (i*(i+1)*(i+2) == n)
    printf("%d e' o produto %d*%d*%d\n", n, i, i+1, i+2);
}

Isso não funciona pois quando i*(i+1)*(i+2) é igual ou maior que n o ciclo for é encerrado, logo quando n é igual a i*(i+1)*(i+2) sai do for então o if dentro do for não é executado e verificado, logo nunca vai executar a linha do printf

 

 

 

Quanto a este for sem chaves:

for (i = 1; i*(i+1)*(i+2) < n; i++);

O que ele faz é inicializa a variável i com valor 1, e vai incrementando +1 em i enquanto i*(i+1)*(i+2) for menor que n.

Logo, a função dele é apenas ir aumentando o valor de i até chegar num número para o qual i*(i+1)*(i+2) é maior ou igual a n.

 

Aí quando o ciclo for acabar basta usar o valor final de i e checar a condição de igualdade para imprimir se o número é ou não triangular (assumindo que seja usada a fórmula correta).

  • Curtir 3

Compartilhar este post


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

Com n=6, o i ficará com 1 (pelo menos aqui deu), logo:


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

E 6 é um número triangular.

Ainda acho muito curioso da certo para 1, contudo, para todos os outros que testei o resultado é falso.

 

 

24 minutos atrás, isrnick disse:

Assumo que quando falou em usar chaves quis dizer fazer algo assim?


for (i = 1; i*(i+1)*(i+2) < n; i++) {
  if (i*(i+1)*(i+2) == n)
    printf("%d e' o produto %d*%d*%d\n", n, i, i+1, i+2);
}

Isso não funciona pois quando i*(i+1)*(i+2) é igual ou maior que n o ciclo for é encerrado, logo quando n é igual a i*(i+1)*(i+2) sai do for então o if dentro do for não é executado e verificado, logo nunca vai executar a linha do printf

Não imaginei assim, pensei em apenas substituir ; por { }.

 

 

Legal!

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar complementar..

 

1#
Sobre:

Em 08/08/2018 às 17:59, AnsiC disse:

Não imaginei assim, pensei em apenas substituir ; por { }.

Sim... eu também. Imaginei isso:

for (i = 1; i*(i+1)*(i+2) < n; i++) {}

 

@ngiovana, aproveitando o contexto, sobre:

Em 08/08/2018 às 15:23, ngiovana disse:

É a primeira vez que vejo isso, e não consegui entender o motivo de dar errado se usar as chaves no for, nem quando se aplica o for com comando vazio.

 

Então, se for como @AnsiC e eu entendemos, os códigos são análogos, ou seja, fazem a mesma coisa, apenas com a sintaxe diferente.

 

O código:

  /* for com comando vazio! */
  for (i = 1; i*(i+1)*(i+2) < n; i++);   //obs.: o ";" abaixo não faz diferença... é só uma questão visual

É o mesmo que:

  /* for com comando vazio! */
  for (i = 1; i*(i+1)*(i+2) < n; i++){}

 

...sobre a parte de "entender como eles funcionam", entendi como sendo mais ou menos que esse trecho vai ficar "GERANDO" todos os ditos* "números triângulos" até que, o número gerado, não se iguale ou ultrapasse o número que está sendo verificado.

 

Como assim? Veja:

Com 1, gera 6. (1*2*3)

Com 2, gera 24 (2*3*4)

Com 3, gera 60 (3*4*5)

Etc

 

Por exemplo, se eu inserir 6:

i começa com 1, certo? a "fórmula" vai resultar em 6. Como 6 NÃO é menor que 6, o for termina. Logo, i vai ficar com o valor de 1.

- Daí, o if abaixo verifica se o for terminou porque foi IGUAL ou se foi MAIOR, se for igual, então o número é* triangular. 

 

Agora usando 10.

i começa com 1. A "fórmula" vai resultar em 6. O for continua pois é menor que 10.

- i passa par 2. Dá 24, que é maior que 10. O for termina e o vai ficar com 2.

- Daí, o if vai ver que não deu igual, logo o não seria triangular. 

 

etc.

 

*comento "ser ou não ser" em 2#.

 

 

 

2#

Acho que aqui entra a questão "do que se quer", em detrimento apenas "do que está escrito". Vejamos:

Em 08/08/2018 às 15:23, ngiovana disse:

Estava fazendo uns exercícios e fiquei com dúvida em um que pedia para verificar se um número é triangular.

O código abaixo é a resposta do exercício, eu tinha feito a mesma coisa, exceto por ter usado chaves para o for.

 

 

@ngiovana, o que está definido como sendo um "número triangular"? Para mim seria relacionado a isto:

Citação

Um número triangular é um número natural que pode ser representado na forma de triângulo equilátero. Para encontrar o n-ésimo número triangular a partir do anterior basta somar-lhe n unidades. A sequência dos números triangulares (sequência A000217 na OEIS), começando pelo 0-ésimo termo, é:

0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

 

Fonte: https://pt.wikipedia.org/wiki/Número_triangular

 

Se for isso, seu algoritmo não se encaixa.

 

Maaaas... se a definição de "número triangular" for outra, como algo como "número natural formado pela multiplicação de 3 números naturais consecutivos"*.  Aí a história muda! O algoritmo me parece que estaria correto (ou pelo menos eficaz).

 

RESUMINDO:

Precisa ver o que se quer! Se possível, poste o enunciado completo.

 

 

***

  • Curtir 2

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

×