• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

2eve

[C] Ajuda: Em vez de goto que comando utilizar?

22 mensagens neste tópico

Olá!

Tou a fazer um programa que tem um switch e dentro desse switch tem if´s e dentro desses if´s tem outros if´s e ouvi dizer que n se deve uilizar goto.

O que eu queria era o seguinte:

printf ("deseja voltar ao inicio:\n<s/n>);

scanf ("%d";&a)

if (a=="y")goto xxxxxxxxx

perceberam?????????

mas como dizem que não se deve utilizar goto gostaria de saber qual o comando melhor!

Já agora gostaria de saber se existem algum comando para a raíz cubica???????

Thank´s :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

char a[1];
printf ("deseja voltar ao inicio:\n<s/n>");
scanf ("%s",a)
if (strcmp(a,"s")==0) {
  ....(volta ao inicio)
}
else{
.....(faz o que tu quizeres...)
}

Corrigi alguns erros. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não sei exactamente o que pretendes, mas deve ser mais ou menos isto...

char a='y';

while(a=='y')
{
  ...
  printf ("deseja voltar ao inicio:\n<s/n>");
  scanf ("%s",&a);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

char a[1];
printf ("deseja voltar ao inicio:\n<s/n>");
scanf ("%s",a)
if (strcmp(a,"s") {
  ....(volta ao inicio)
}
else{
.....(faz o que tu quizeres...)
}

Corrigi alguns erros. :)

Pois, mas o que eu quero saber é como voltar ao início

thank´s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas o que eu quero saber é como voltar ao início

thank´s

Mas tens de explicar melhor ou então pôr mais código ! Assim não sabemos bem o que pretendes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas o que eu quero saber é como voltar ao início

vê o código que eu coloquei....


não existe nenhum comando para a raíz cúbica, mas existe a função 'cbrt'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fica o código mas inda não tá completo e tem erros!!!!!!!

Eu quero que uma pessoa não tenha de voltar a abrir o progrma sempre que queira efectuar um cálculo:

Volto a dizer não está completo

#include <stdlib.h>
#include <stdio.h>
int main()
{

   int num;
   printf ("Seja bem vindo ao virtual calculator\nSoftware criado por Igor Cruz qualquer bug deve ser comunicado para igorpower@walla.com\n\nPor favor escolha a operacao Matematica que deseja efectuar:\n\n1-Soma\n2-Subtraccao\n3-Multiplicacao\n4-Divisao\n5-Raizes\n6-Potencias\n\n7-Areas\n8-Perimetros\n\n9-Conversor de unidades\n\n10-\1Equacoes\n");
   scanf ("%d",&num);
   switch(num) {
   case 1: {/*completo*/
               float a,b,c;
               char stop;
               printf ("Escolheu a operacao Soma\n");
               printf ("Por favor insira o primeiro numero que pretende somar\n\n");
               scanf ("%f",&a);
               printf ("Por favor insira o segundo numero que pretende somar\n\n");
               scanf ("%f",&b);
               c=a+b;
               printf ("O resultado da soma e de %f\n\n",c);               
               }
   case 2:{ /*completo*/
                float a,b,c;
                char stop;
                printf ("Escolheu a operacao Subtraccao\n");
                printf ("Por favor insira o primeiro numero que pretende subtrair\n\n");
                scanf ("%f",&a);
                printf ("Por favor insira o segundo numero que pretende subtrair\n\n");
                scanf ("%f",&b);
                c=a-b;
                printf ("O resultado da subtracção e de %f\n\n",c);
                }
   case 3: {/*completo*/
               float a,b,c;
               char stop;
               printf ("Escolheu a operacao Multiplicaccao\n");
               printf ("Por favor insira o primeiro numero que pretende multiplicar\n\n");
               scanf ("%f",&a);
               printf ("Por favor insira o segundo numero que pretende multiplicar\n\n");
               scanf ("%f",&b);
               c=a*b;
               printf ("O resultado da multiplicacao e de %f\n\n",c);
               }
   case 4: { /*completo*/
               float a,b,c;
               char stop;
               printf ("Escolheu a operacao Divisao\n");
               printf ("Por favor insira o dividendo\n\n");
               scanf("%f",&a);
               printf ("Por favor insira o divisor\n\n");
               scanf ("&f",&b);
               c=a/b;
               printf ("O resultado da divisao e de %f\n\n",c);
               }
   case 5:/*Código errado*/ {
               int raizes;
               char stop;
               printf ("Escolheu a opcao raizes\n\n Por favor indique a raiz que quer calcular\n1-Raiz quadrada\n2-Raiz cubica\n\n");
               scanf ("%d",& raizes);
               if (raizes==1)
               {
                              float a,b,c;
                              char stop;
                              printf ("Escolheu a operacao Raiz quadrada\n");
                              printf ("Por favor insira o numero que deseja saber a raiz quadrada\n\n");
                              scanf ("%f",&a);
                              printf ("Por favor insira o numero que deseja saber a raiz quadrada\n\n");
                              scanf ("%f",&b);
                              c=a*(1/b);
                              printf ("O quadrado do numero e %f\n\n",c);
                              }
               if (raizes==2){
                              float a,b;
                              char stop;
                              printf ("Escolheu a operacao Raiz cubica\n");
                              printf ("Por favor insira o numero que deseja saber a raiz cubica\n\n");
                              scanf ("%f",&a);
                              b=a*a*a;
                              printf ("O quadrado do numero e %f\n\n,b");
                              }
               }
   case 6:{/*completo*/
               int elevacoes;
               char stop;
               printf ("Escolheu a opcao potencias\n\nPor favor escolha uma das seguintes opcoes:\n1-Elevar ao quadrado\n2-Elevar ao cubo\n\n");
               scanf ("%d",& elevacoes);
               if (elevacoes==1){
                                 float a,b;
                                 char stop;
                                 printf ("Escolheu a operacao elevar ao quadrado\n");
                                 printf ("Por favor insira o numero que deseje elevar ao quadrado\n\n");
                                 scanf("&f",&a);
                                 b=a*a;
                                 printf ("O numero ao quadrado da %f\n\n",b);
                                 }
               if (elevacoes==2){
                                 float a,b;
                                 char stop;
                                 printf ("Escolheu a operacao elevar ao cubo\n");
                                 printf ("Por favor insira o numero que deseje elevar ao cubo\n\n");
                                 scanf ("%f",&a);
                                 b=a*a*a;
                                 printf ("O numero ao cubo da %f\n\n",b);
                                 }
                                 }
   case 7:{/*completo*/
        int opcao;
        printf ("Escolheu a opcao areas,\nEscolha uma das seguintes hipoteses:\n");
        printf ("1-Triangulo\n2-Quadrado/rectangulo\n3-Trapezio\n4-Circulo");
        scanf ("%d",&opcao);
        if (opcao==1){
                      float a,b,c;
                      char stop;
                      printf ("Escolheu a opcao areas de triangulos\npor favor indique o comprimento da base:\n");
                      scanf ("%f",&a);
                      printf ("Por favor indique a altura:\n");
                      scanf ("%f",&b);
                      c=(a*b)/2;
                      printf ("A area total do triangulo e de %f",c);
                                 }
        if (opcao==2){
                      float a,b,c;
                      char stop;
                      printf ("Escolheu a opcao areas de quadrados/rectangulos\npor favor indique o comprimento:\n");
                      scanf ("%f",&a);
                      printf ("Por favor indique a largura:\n");
                      scanf ("%f",&b);
                      c=a*b;
                      printf ("A area total do quadrado e de %f",c);
                                 }
        if (opcao==3){
                      float a,b,c,d;
                      char stop;
                      printf ("Escolheu a opcao areas de trapezios\npor favor indique o comprimento da base maior:\n");
                      scanf ("%f",&a);
                      printf ("Por favor indique o comprimento da base menor:\n");
                      scanf ("%f",&b);
                      printf ("Por favor indique a altura:\n");
                      scanf ("%f",&c);
                      d=(a*b)*c/2;
                      printf ("A area total do quadrado e de %f",d);
                                 }
        if (opcao==4){
                      float a,b;
                      char stop;
                      printf ("Escolheu a opcao areas de circulos\npor favor indique o raio:\n");
                      scanf ("%f",&a);
                      b=3.14159265*(a*a);
                      printf ("A area total do quadrado e de %f",b);
                                 }
                                 }
        case 8:{
             int opcao;
             printf ("Escolheu a opcao perimetros,\nEscolha uma das seguintes hipoteses:\n");
             printf ("1-Triangulo\n2-Circulo");
             scanf ("%d",&opcao);
             if (opcao ==1){
                      float a,b,c;
                      char stop;
                      printf ("Escolheu a opcao perimetros de triangulos\npor favor indique a area:\n");
                      scanf ("%f",&a);
                      printf ("Por favor indique a altura:\n");
                      scanf ("%f",&b);
                      c=(a*b)/2;
                      printf ("A area total do triangulo e de %f",c);
                                 }
             if (opcao==2){
                           float a,b;
                      char stop;
                      printf ("Escolheu a opcao perimetros de circulos\npor favor indique o diametro:\n");
                      scanf ("%f",&a);
                      b=a*3.14159265;
                      printf ("A perimetro total do triangulo e de %f\n",b);
             }
             }
        case 9:{
             int opcao;
             printf ("Escolheu a opcao escolheu a opcao conversor de unidades\nEscolha uma das seguintes opcoes:\n");
             printf ("1-Euros para escudos\n2-Escudos para euros\n3-Metros para pes\nQuilometros para milhas");
             scanf ("%d",&opcao);
             if (opcao ==1){
                      float a,b;
                      char stop;
                      printf ("Escolheu a opcao Euros para escudos\npor favor indique o valor de Euros:\n");
                      scanf ("%f",&a);
                      b=a*200.482;
                      printf ("%,f euros iquivalem a %f escudos\n\n",a,b);
                                 }
             if (opcao ==2){
                      float a,b;
                      char stop;
                      printf ("Escolheu a opcao Escudos para euros\npor favor indique o valor de escudos:\n");
                      scanf ("%f",&a);
                      b=a/200.482;
                      printf ("%f escudos iquivalem a %f euros\n\n",a,b);
                                 }
             }
        case 10:{
             }                                 
             } 

   system ("pause");
   return (0);
}


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazer com um

do{

aqui metes o switch 

while(opcao != 0);

Só te sai do menu quando escolheres a opção 0.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

  scanf ("%s",&a);

Não deveria ser

  scanf ("%c",&a);

?

Usamos %c quando for apenas com um caracter. Como a resposta dele vai levar em principio 3 (sim ou nao) usamos o %s (eu acho que o s vem de string, senao me engano, pois leva mais que 1 caracter).

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

  scanf ("%s",&a);

Não deveria ser

  scanf ("%c",&a);

?

Usamos %c quando for apenas com um caracter. Como a resposta dele vai levar em principio 3 (sim ou nao) usamos o %s (eu acho que o s vem de string, senao me engano, pois leva mais que 1 caracter).

Abraços

foi engano meu, devia estar lá '%c', pois a variável 'a' é do tipo 'char'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem lá mas continuo sem conseguir nem mesmo com gotos dá!!!!!!!!!

Tou a desesperar o que eu quero é que o programa volte ao início sempre que o utilizador desejar para poder efectuar outra operação!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include <stdlib.h>
#include <stdio.h>
int main()
{
do{
   int num;
   printf ("Seja bem vindo ao virtual calculator\nSoftware criado por Igor Cruz qualquer bug deve ser comunicado para igorpower@walla.com\n\nPor favor escolha a operacao Matematica que deseja efectuar:\n\n1-Soma\n2-Subtraccao\n3-Multiplicacao\n4-Divisao\n5-Raizes\n6-Potencias\n\n7-Areas\n8-Perimetros\n\n9-Conversor de unidades\n\n10-\1Equacoes\n");
   scanf ("%d",&num);
   switch(num) {
   case 1: {/*completo*/
            do{
               float a,b,c;
               char stop;
               int op = 1;
               printf ("Escolheu a operacao Soma\n");
               printf ("Por favor insira o primeiro numero que pretende somar\n\n");
               scanf ("%f",&a);
               printf ("Por favor insira o segundo numero que pretende somar\n\n");
               scanf ("%f",&b);
               c=a+b;
               printf ("O resultado da soma e de %f\n\n",c);               
               }
               printf("\nVoltar ao menu principal? (0-sim/<outro numero>--nao)");
               scanf("%d",&op);
            }while(op != 0);
   case 2:{ /*completo*/
          do{
                float a,b,c;
                char stop;
                int op = 1;
                printf ("Escolheu a operacao Subtraccao\n");
                printf ("Por favor insira o primeiro numero que pretende subtrair\n\n");
                scanf ("%f",&a);
                printf ("Por favor insira o segundo numero que pretende subtrair\n\n");
                scanf ("%f",&b);
                c=a-b;
                printf ("O resultado da subtracção e de %f\n\n",c);
                printf("\nVoltar ao menu principal? (0-sim/<outro numero>--nao)");
                scanf("%d",&op);
            }while(op != 0);
                }
   case 3: {

   .........................................

 }while(num != 0);                               
   system ("pause");
   return (0);
}

Ah e tal eu já te tinha dito! :P

Com do{ ... }while´s fazias isso na boa.

Atenção só te pus o exemplo para os dois primeiros switchs e para o menu principal.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado mesmo logo à noite já experimento agora n dá.

Desculpa eu tava a pensar que só se punha no principal.

Fica bem!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois parece que não está resolvido porque afinal não dá!!!!

Já tentei de várias formas!

Please help!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

simples vou meter aqui o pseudocodigo para isso

Escrever('programa basico para calcular coisinhas');
int opcao = 1;
While(opcao != 0)
{
bla bla bla dos switches e tal
Mostrar('deseja fazer mais continhas da treta? (S/N');
Ler(s);
if ((s == 'S')||(s == 's'))
{
opcao = 0;
}
}

(moderado)

depois diz-me se conseguiste ou não

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

killercode, tenta usar o GeSHi para pôr o código. Fica mais legível. :confused:

Quanto à tua resposta, não disseste nada de novo em relação às outras respostas. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(moderado)

(moderado)

Este tipo de comentários não ajuda. O que é óbvio para ti pode não ser para os outros. E se achas que isso já foi explicado muitas vezes, para quê repetires (embora não expliques nada)?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(moderado)

(moderado)

Este tipo de comentários não ajuda. O que é óbvio para ti pode não ser para os outros. E se achas que isso ja foi explicado muitas vezes, para quê repetires (embora não expliques nada)?

Exactamente, por isso conteúdo moderado!

Um bom explicador não é aquele que sabe, nem é aquele que tem a paciência de dizer sempre o mesmo.

Um bom explicador é aquele que consegue explicar uma coisa de mil e uma maneira, conseguindo contornar a dificuldade do explicando.

Agradecia que não houvesse mais post desmotivadores ou comentários infelizes.

Sobre a dúvida dos menus e sub-menu

(antes um comentário à parte: devias pegar na tua função e dividir em varias funções, assim torna-se mais facil de qualquer programador manipular o código se este estiver dividido em blocos)

Eu costumo fazer os menus e sub-menos com o while(flag).

Primeiro defines os acessos aos menus:

flag_menu = true;
flag_sub_menu_1 = false;
flag_sub_menu_2 = false;
flag_sub_sub_menu_1 = false;
flag_sub_sub_menu_2 = false;

Depois fica assim:

while(flag_menu)
{
    (...)

    switch (opcao)
    {
           case 1:
                // das acesso ao sub_menu1:
                flag_sub_menu_1 = true;
                
                while(flag_sub_menu_1)
                {
                      // eh!, eu estou dentro do sub menu 1
                      
                      (...)
                      
                      if( quero sair do sub_menu_1 )
                             flag_sub_menu_1 = false;
                      else
                             //ainda apetece fazer algo
                }
                break;
           case 2:
                // das acesso ao sub_menu2:
                flag_sub_menu_2 = true;
                
                while(flag_sub_menu_2)
                {
                      // agora o sub menu 2 é que esta a dar
                      
                      (...)
                      
                      switch (opcao)
                      {
                          case1:
                                 // das acesso ao sub_sub_menu1 (se o menu tivesse 4 níveis de profundidade, ficava sub_sub_sub_sub_menu ):
                                 flag_sub_sub_menu_1 = true;
                
                                 while(flag_sub_menu_1)
                                 {
                                       // epa, nunca fui tão longe...
                      
                                       (...)
                      
                                     if( quero sair do sub_sub_menu_1 )
                                             flag_sub_menu_1 = false;
                                     else
                                            //apetecia-me algo aqui no sub_sub_menu1
                                 }
                                 break;
                          case2:
                                 // das acesso ao sub_sub_menu2 (sub_sub_subir):
                                 flag_sub_sub_menu_2 = true;
                
                                 while(flag_sub_menu_2)
                                 {
                                       // epa, nunca fui tão longe...
                      
                                       (...)
                      
                                     if( quero sair do sub_sub_menu_2 )
                                             flag_sub_menu_2 = false;
                                     else
                                            //apetecia-me algo aqui no sub_sub_menu2
                                 }
                                 break;
                          otherwise:
                               //não ha mais opções
                      }

                      (...)
                      
                      if( quero sair do sub_menu_2 )
                             flag_sub_menu_2 = false;
                      else
                             //ainda apetece fazer algo
                }
                break;
           otherwise:
    }

    if( quero sair do menu, porque estou farto disto)
         flag_menu = false;
    else
          //ainda apetece dar mais uma volta por aqui
}

Espero ter ajudado.

Cumpr. bk@ero  :thumbsup:

EDIT: Atenção em C não tem a variável de tipo boolean!

Para isso existe duas alternativas: define e o enum. Para mais esclarecimentos:

http://c-faq.com/bool/booltype.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado

Parabéns pelo trabalho e obrigado, até porque eu percebi o outro código, mas não tava a fazer o que eu desejava.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

flag_menu = true;
flag_sub_menu_1 = false;
flag_sub_menu_2 = false;
flag_sub_sub_menu_1 = false;
flag_sub_sub_menu_2 = false;

a menos que definas um enum ou algo parecido, dúvido que isto funcione em C...


while(flag_menu)
{
    (...)

    switch (opcao)
    {
           case 1:
                // das acesso ao sub_menu1:
                flag_sub_menu_1 = true;
                
                while(flag_sub_menu_1)
                {
                      // eh!, eu estou dentro do sub menu 1
                      
                      (...)
                      
                      if( quero sair do sub_menu_1 )
                             flag_sub_menu_1 = false;
                      else
                             //ainda apetece fazer algo
                }
                break;
           case 2:
                // das acesso ao sub_menu2:
                flag_sub_menu_2 = true;
                
                while(flag_sub_menu_2)
                {
                      // agora o sub menu 2 é que esta a dar
                      
                      (...)
                      
                      switch (opcao)
                      {
                          case1:
                                 // das acesso ao sub_sub_menu1 (se o menu tivesse 4 níveis de profundidade, ficava sub_sub_sub_sub_menu ):
                                 flag_sub_sub_menu_1 = true;
                
                                 while(flag_sub_menu_1)
                                 {
                                       // epa, nunca fui tão longe...
                      
                                       (...)
                      
                                     if( quero sair do sub_sub_menu_1 )
                                             flag_sub_menu_1 = false;
                                     else
                                            //apetecia-me algo aqui no sub_sub_menu1
                                 }
                                 break;
                          case2:
                                 // das acesso ao sub_sub_menu2 (sub_sub_subir):
                                 flag_sub_sub_menu_2 = true;
                
                                 while(flag_sub_menu_2)
                                 {
                                       // epa, nunca fui tão longe...
                      
                                       (...)
                      
                                     if( quero sair do sub_sub_menu_2 )
                                             flag_sub_menu_2 = false;
                                     else
                                            //apetecia-me algo aqui no sub_sub_menu2
                                 }
                                 break;
                          otherwise:
                               //não ha mais opções
                      }

                      (...)
                      
                      if( quero sair do sub_menu_2 )
                             flag_sub_menu_2 = false;
                      else
                             //ainda apetece fazer algo
                }
                break;
           otherwise:
    }

    if( quero sair do menu, porque estou farto disto)
         flag_menu = false;
    else
          //ainda apetece dar mais uma volta por aqui
}

a parte dos sub-menus acho que ficava melhor numa função separada, tornava o código mais curto e estruturado (embora menos eficiente)...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

flag_menu = true;
flag_sub_menu_1 = false;
flag_sub_menu_2 = false;
flag_sub_sub_menu_1 = false;
flag_sub_sub_menu_2 = false;

a menos que definas um enum ou algo parecido, dúvido que isto funcione em C...

Obviamente que não pus todo o código, mas só o principal!

Não precisa de usar enum, a minha ideia era mesmo um define false 0 e true 1, é como eu costumo usar...

Cumpr. bk@ero  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora