Jump to content
Evenilink

Break / Continue - Problema no programa

Recommended Posts

Evenilink

Boas! :D

Estava a tentar "fazer" um programa, só que o compilador está sempre a emitir um Warning...

O que tenho de fazer é o seguinte:

"Escreva um programa que solicite o utilizador um número. Em seguida escreve todos os números inteiros a partir desse número excepto os múltiplos de 3. Quando encontrar o primeiro múltiplo de 10 termina a execução."

Aqui está o código que fiz:

#include <stdio.h>
main()
{
     int num, i;

     printf("Introduza um numero: ", num);
     scanf("%d", &num);
     for (i=num; ; i++);
         {
               if (i%10 == 0)
                  break;
               else
               if (i%3 == 0)  
                  continue;
               printf("%d", i);
         }

     getchar();
     getchar();
}

Está sempre a dar erro no Break e no Continue. O que estou a fazer mal?

Desculpem se o erro é de principiante, estou mesmo a começar com isto! :D

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
thoga31

Estás a ler o Damas, portanto.

Primeiro que nada, declara bem o main, não é como está no livro:

int main(void) {
  /* programa */
  return 0;
}

De seguida, leste bem todos os warnings? Eles não são um texto aleatório. Repara:

- Porque estás a fazer printf de num? Nem sequer tens um argumento na string para receber num, daí o warning:

prog.c:6:7: warning: too many arguments for format [-Wformat-extra-args]
      printf("Introduza um numero: ", num);
      ^

- Porquê dois getchar?

- De seguida, tens um ; após o for, e não devias estar lá nenhum. Daí estes erros:

prog.c:11:20: error: break statement not within loop or switch
                   break;
                   ^
prog.c:14:20: error: continue statement not within a loop
                   continue;
                   ^

O compilador dá-nos informação vital ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
pikax

o num no primeiro printf nao esta a fazer nada.

Falta-te a condicao no for.

- Porquê dois getchar?

E' por causa do buffer, e' a maneira mais facil e simples de para a aplicacao, o primeiro getchar() apanha o Enter do buffer e o segundo fica 'a espera.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Evenilink

Oh realmente tenho um ; depois do "for"... Estava tão focado no Break e Continue que nem procurei outros erros.

Sim estou a ler o Damas! Pedi-o ao meu primo, assim quando for para a Universidade tenho pelo menos algumas bases.

E' por causa do buffer, e' a maneira mais facil e simples de para a aplicacao, o primeiro getchar() apanha o Enter do buffer e o segundo fica 'a espera.

É a única maneira que descobri para fazer parar o programa, no livro não diz nada sobre isso.

Primeiro que nada, declara bem o main, não é como está no livro:

int main(void) {
  /* programa */
  return 0;
}

Isso não sabia, ainda não me foi introduzido o "void", só uma pequena referência!

Mas desculpem lá o erro estúpido, e obrigado! :D

Edited by Evenilink

Share this post


Link to post
Share on other sites
HappyHippyHippo

Isso não sabia, ainda não me foi introduzido o "void", só uma pequena referência!

Mas desculpem lá o erro estúpido, e obrigado! :D

então ficas a saber (só para referência) que a chamada completa do main é :

int main(int argc, char ** argv) {
 return 0;
}

mas ficas bem servido com a solução anterior porque não vais usar esses argumentos tão cedo.

eu não faço ideia o porque do raio do break e do continue:

#include <stdio.h>

int main(int argc, char ** argv)
{
 int num, i;

 printf("Introduza um numero: "/*, num */); // porque razão estás a dar a variável "num" à função ?
 fflush(stdout); // não vale a pena saberes porque, basta saber que se o printf não tem o '\n', o melhor é ter isso logo a seguir
 scanf("%d", &num);

 for (i = num;     // inicialização
      i % 10 == 0; // condição de paragem (verificada antes de todas as execuções do ciclo, mesmo a primeira)
      i++);        // incremento do ciclo
 {
    if (i%3 != 0)
      printf("%d\n", i);
 }

 // getchar ?? nop, usa a consola
 return 0;
}

Edited by HappyHippyHippo
  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pwseo

Só para referência (também), podemos escrever a função main com ou sem argumentos -- uma forma não é mais completa ou correcta que a outra. O standard diz especificamente que devemos utilizar uma de duas formas (ou equivalente):

int main(void) { ... }
int main(int argc, char *argv[]) { ... }

A questão do return 0 no final também tem as suas nuances: em C99 é opcional. De qualquer modo, faz sempre sentido colocá-lo explicitamente seja em que standard for, até porque a própria declaração indica que a função devolve um int.

De resto... está na altura de começar a ler os warnings com mais atenção :)

Share this post


Link to post
Share on other sites
thoga31

eu não faço ideia o porque do raio do break e do continue:

Sem dúvida que a tua solução é muito melhor e também seria a minha forma de resolver o exercício. Mas acho que este está inserido na parte que fala dos Continue e Break, pelo que é normal o aprendiz se sentir "inspirado" a usá-los :P


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.