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

kutani

dúvida sobre variável auxiliar

10 mensagens neste tópico

Boas pessoal,

sou estudante de engenharia electrotécnica do ISEL, encontrei este fórum enquanto pesquisava umas coisas de programação e achei interessante. Espero poder aprender muito por aqui, pois acho que será uma mais valia para o futuro aprender mais do que aquilo que ensinam de prog. pela universidade (o que é mto pouco).

Para começar tinha por aqui uma dúvida num trabalho que tenho de fazer para a cadeira de Estrutura de Dados e Algoritmos.

No programa a que me refiro tem de se trabalhar com números complexos, e fazer um género de uma calculadora, em que se define um valor base através de uma das opções do menu switch e depois nas outras opções que correspondem a operações da calculadora definimos o outro complexo com que trabalhamos. Mais à frente é nos pedido que façamos mais umas opções no menu em que teremos de criar uma variável auxiliar onde será guardado inicialmente o valor base, para posteriormente esta variável ser também utilizada nas operações. A questão é se a variável tem de ser algum tipo especial ou uma variável normal?

Peço desculpa se fui demasiado confuso xD.

O programa que uso é o facultado pela universidade, o visual studio 2005.

Desde já obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem vindo, colega :D

Não percebi bem a tua dúvida. O que queres dizer com "variável especial" ou "normal"?

Se as operações são todas feitas sobre valores complexos, provavelmente tens uma struct (ou classe) que dará suporte a esse tipo de valores, e a variável auxiliar a que te referes será também desse tipo.

Já agora, és de que curso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado por me abrires os olhos. Acho que ainda estou a dormir :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenho sim uma classe, onde consigo atribuir a parte imaginária e a parte real.

O que eu fiz foi criar a variável do tipo complexo através da classe, mas não tinha a certeza se era assim xD.

Já agora, surgiu me outra dúvida. Tendo um vector(array) com 26 elementos, cada elemento correspondendo a uma letra do abecedário, como posso atribuir a uma letra escolhida pelo utilizador um dado número complexo.

já agora deixo aqui o código do programa, pode ser que ajude xD.

O objectivo final do programa é o utilizador colocar uma expressão como por exemplo a*b+c-d e o programa executar a conta, sendo as letras elementos do array.

#include <stdio.h>
#include <math.h>
#define M_PI 3.141592654

class complexo
{
private:
  float re;
  float im;



public:

  complexo()
  {
     re=0;
     im=0;
  }
  complexo (float r, float i)
  {
     re=r;
     im=i;
  }
  float parteReal()
  {
     return re;
  }
  float parteImaginaria()
  {
     return im;
  }
  float modulo()
  {
     float modulo;

     modulo=sqrt(re*re+im*im);
     return modulo;
  }
  float argumento()
  {
     float arg;
     float arg1;

     arg=atan2(im,re);

     arg1=(arg/M_PI)*180;
     return arg1;
  }
  complexo conjugado ()
  {
   complexo c;
   c.re=re;
   c.im=-im;
   return c;
  }
  complexo simetrico ()
  {
complexo c;
c.im=-im;
c.re=-re;
return c;

  }
  complexo inverso ()
  {
complexo c;
c.im=im/((im*im)+(re*re));
c.re=re/((im*im)+(re*re));
return c;
  }
  complexo expoente()
  {
int exp;
int z=1;
complexo c;
printf("Qual o expoente pretendido?\n\n");
scanf("%i",&exp);

if(z<exp)
{
	c=c*c;
	z++;
}
return c;
  }
  complexo raiz ()
  {

complexo c;
c.re=sqrt((modulo()+re)/2);
c.im=im/(sqrt(2*(modulo()+re)));
return c;
  }
  complexo operator+(complexo b)
  {
   complexo c;
	c.re = re + b.re;
	c.im = im + b.im;
	return c;
  }
  complexo operator-(complexo b)
  {

	complexo c;
	c.re = re - b.re;
	c.im = im - b.im;
	return c;
}

  complexo operator*(complexo b)
  {
   complexo c;
   c.re=((re*b.re)-(im*b.im));
   c.im=((re*b.im)+(b.re*im));
   return c;
  }

  complexo operator/(complexo b)
  {
     complexo c;
     c.re=((re*b.re)+(im*b.im))/((b.re*b.re)+(b.im*b.im));
     c.im=((b.re*im)-(re*b.im))/((b.re*b.re)+(b.im*b.im));
     return c;
  }
void ler_comp()
		{

			printf("\nQual a parte real? \n");
			scanf_s(" %f", &re);

			printf("\nQual a parte imag? \n");
			scanf_s(" %f", &im);

		}
void imprimir()
  {
     printf("%f * cis%f \n\n", modulo(), argumento());
     printf("%f + j%f \n\n", re, im);
  }
};

void main()

{   
  char op;
  char let;
  float modulo;
  float argumento;
  float re;
  float im;


complexo a;
complexo b;
complexo c;
complexo aux;
char letras[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
complexo letra;

  fflush(stdin);
do
  {
  printf("Escolha a operacao a fazer\n");
  printf("digite a para definir o valor base.\n");
  printf("digite b para eliminar o valor base.\n");
  printf("digite c para soma.\n");
  printf("digite d para subtraccao.\n");
  printf("digite e para multiplicacao.\n");
  printf("digite f para divisao.\n");
  printf("digite g para obter o conjugado do complexo base.\n");
  printf("digite h para obter o simetrico do complexo base.\n");
  printf("digite i para obter o inverso do complexo base.\n");
  printf("digite j para obter a raiz quadrada do complexo base.\n");
  printf("digite k para obter a potencia do complexo base com expoente inteiro.\n");
  printf("digite l para memorizar o valor do complexo base numa variavel auxiliar.\n");
  printf("digite m para somar o valor memorizado ao valor do complexo base.\n");
  printf("digite n para subtrair o valor do complexo base ao valor memorizado.\n");
  printf("digite o para escolher a variavel e o numero complexo a atribuir a esta.\n");
  printf("digite p para visualizar uma variavel ah sua escolha\n");
  printf("digite q para introduzir uma expressao e saber o respectivo resultado\n");
  printf("digite r para abandonar o programa.\n");
  scanf("\n%c", &op);

  switch (op)
  {
     case 'a' :                    a.ler_comp();
                                   break;

     case 'b' :					
                                   break;

     case 'c' :                    b.ler_comp();
                                   a=a+b;
								printf("soma=");
								a.imprimir();
                                   break;

     case 'd' :                    b.ler_comp();
                                   a=a-b;
								printf("diferença= ");
								a.imprimir();
                                   break;

     case 'e' :                    b.ler_comp();
                                   a=a*b;
								printf("produto= ");
								a.imprimir();
                                   break;

     case 'f' :                    b.ler_comp();
                                   a=a/b;
								printf("quociente= ");
								a.imprimir();
                                   break;

  case 'g' :					a=a.conjugado();
								printf("conjugado= ");
								a.imprimir();
								break;

  case 'h' :					a=a.simetrico();
								printf("o complexo eh:");
								a.imprimir();
								break;

  case 'i' :					a=a.inverso();
								printf("o inverso eh:");
								a.imprimir();
								break;

  case 'j' :					a=a.raiz();
								printf("a raiz do complexo base eh:");
								a.imprimir();
								break;

  case 'k' :					a=a.expoente();
								printf("a=");
								a.imprimir();
								break;

  case 'l' :					aux=a;
								break;

  case 'm' :					aux=aux+a;
								break;

  case 'n' :					aux=aux-a;
								break;

  case 'o' :					letra.ler_comp();
								printf("qual a letra a que pretende atribuir valor\n");
								scanf("%s",&let);
								char letras[let]=letra; /*Ja descobri que nao funciona */

  case 'p' :					/* visualizar uma variavel (letra)*/

  case 'q' :					/* avaliar uma expressao*/

     case 'r' :                   printf("saiu do programa\n\n");
                                   break;

     default:
								printf("opcao invalida\n\n");

  }
  }while(op!=15);

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes utilizar um std::map<char, complexo*> para associar directamente um caracter a um apontador para complexo, algo do género:

#include <map>

//...

    complexo c1(10, 2);
    std::map<char, complexo*> varMap;
    varMap['a'] = &c;
    complexo c2(varMap['a']->parteReal(), varMap['a']->parteImaginaria());

//...

ou podes criar um array de 26 apontadores para complexos em vez do array de chars, que ficará algo assim:

complexo *variaveis[26];

//...

    complexo c1(2, 5);
    variaveis['c'-'a'] = &c1;
    complexo c2(variaveis['c'-'a']->parteReal(), variaveis['c'-'a']->parteComplexa());

//...

em que o complexo associado ao caracter 'c' fica guardado em variaveis['c'-'a'] = variaveis[2], e o associado ao caracter e fica em variaveis['e'-'a'] = variaveis[4], e o associado ao caracter a fica em variaveis['a'-'a'] = variaveis[0].

Já agora, porquê usar stdio.h e printf e scanf em vez de iostream e std::cout e std::cin?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Thedark brigadão pla ajuda :D.

O segundo exemplo percebi, o primeiro não :S. Vou tentar usar esse segundo, acho que já tinha visto isso em algum lado.

Uma questão referente ao segundo exemplo, esse código todo é só para a letra c certo?

Uso o stdio.h porque foi o que me ensinaram, os outros que referiste não conheço lol xD.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aquele exemplo é para a letra 'c', se quiseres atribuir um valor a uma letra definida pelo utilizador e essa letra estiver numa variável char chamada letra, basta-te substituir 'c' por letra.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O melhor seria provavelmente criares duas funções, por exemplo complexo *getVariavel(char letraVariavel) e void setVariavel(char letraVariavel, complexo *valor), uma para obter e outra para associar um complexo a uma letra, para tratar disso mais facilmente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Brigadão pla ajuda.

Já vou ver se consigo pôr isto a funcionar xD.

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