Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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.

 

 

 

Editado por AnsiC
melhorar a mensagem
  • 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?

Editado por Simon Viegas
  • 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).

Editado por isrnick
  • 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






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

×