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

amp

Planetas do Sistema Solar

1 mensagem neste tópico

Boas,

Criei um programa em C para mostrar a informação principal de todos os planetas do Sistema Solar (incluindo Plutão) mas, como ainda estou a aprender a programar, não sei se escrevi tudo correctamente, se existem erros de sintaxe ou se o programa não está funcional.

Se pudessem dar umas dicas para melhorar este programa ficaria grato. Obrigado :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define NUM_PLAN 9
#define NUM_PROP 6

//Definicao da estrutura de cada planeta
typedef struct
{
  char   nome[15];
  double distancia;
  double massa;
  double raio;
  double periodo;
  int    satelites;
}planeta;

//Vector de estruturas com os dados dos planetas
planeta planetas[NUM_PLAN]={
  {"Mercurio", 5.79e7, 3.30e23, 2.44e3, 7.60e6, 0 },
  {"Venus"   , 1.08e8, 4.87e24, 3.03e3, 2.10e7, 0 },
  {"Terra"   , 1.50e8, 5.97e24, 6.38e3, 3.16e7, 1 },
  {"Marte"   , 2.28e8, 6.42e23, 3.40e3, 5.94e7, 2 },
  {"Jupiter" , 7.78e8, 1.90e27, 7.15e4, 3.74e8, 63},
  {"Saturno" , 1.40e9, 6.69e26, 6.03e4, 9.29e8, 60},
  {"Urano"   , 2.87e9, 8.69e25, 2.59e4, 2.65e9, 27},
  {"Neptuno" , 4.50e9, 1.02e26, 2.48e4, 5.20e9, 13},
  {"Plutao"  , 5.83e9, 1.31e22, 1.15e3, 7.83e9, 3 }
};

//Funcao de impressao dos dados de um planeta
void
print_planeta (planeta  *ptr)
{
  printf ("Nome do planeta:   %s\n\n"   , ptr->nome);
  printf ("Distancia ao Sol:  %.2e Km\n", ptr->distancia);
  printf ("Massa:             %.2e Kg\n", ptr->massa);
  printf ("Raio medio:        %.2e Km\n", ptr->raio);
  printf ("Periodo:           %.2e s\n" , ptr->periodo);
  printf ("Num. Satelites:    %d\n\n"   , ptr->satelites);
}

//Funcao de Ajuda
void
ajuda (status)
{
  printf("\t\t\t MENU AJUDA\n\n");
  printf("A entrada na linha de comando deve ter a seguinte forma:\n\n");
  printf("Para ver:\n\n");
  
  printf("  Toda a informacao de um planeta :");
  printf("   <nome_programa> <planeta>\n");
  
  printf("  Prop. especifica de um planeta  :");
  printf("   <nome_programa> <planeta> <propriedade>\n");
  
  printf("  Propriedade de todos os planetas:");
  printf("   <nome_programa> <propriedade>\n");
  
  printf("\nPropriedades:\n\n  'nome' , 'distancia' , 'massa' ,");
  printf(" 'raio' , 'periodo' , 'satelites'");
  printf("\n");
  printf("\nPlanetas:\n\n  'Mercurio','Venus','Terra','Marte',");
  printf("'Jupiter','Saturno','Urano','Neptuno','Plutao'\n\n");
  exit(status);
}

//Main
int
main(int argc,char **argv)
{
  int teste=0,teste1=0,teste2=0,pro=0,plan=0;
  char propriedade[NUM_PROP][10]={"nome","distancia","massa","raio","periodo","satelites"};
  
  printf("\n\t\t  Planetas do Sistema Solar\n");
  printf("\t    *************************************\n\n");
  
  //O utilizador inseriu 2 argumentos
  if(argc==2)
    {
      //Caso argv[1] seja um  planeta, mostra os seus dados
      for(plan=0;plan<NUM_PLAN;++plan)
      	{
          if(strcmp(argv[1],planetas[plan].nome)==0)
            {
              print_planeta(&planetas[plan]);
      return 0;
            }
}
      //Verifica se argv[1] e uma prop. e mostra-a para todos os planetas
      for(pro=0;pro<NUM_PROP;++pro)
{
          if(strcmp(argv[1],propriedade[pro])==0)
    {
              for(plan=0;plan<NUM_PLAN;++plan)
	{
	  if(pro==0)printf ("Nome do planeta:   %s\n\n"   , planetas[plan].nome);
	  if(pro==1)printf ("Distancia ao sol de %9s: %.2e\n",planetas[plan].nome,planetas[plan].distancia);
	  if(pro==2)printf ("Massa de %9s: %.2e Kg\n", planetas[plan].nome,planetas[plan].massa);
	  if(pro==3)printf ("Raio medio de %9s: %.2e Km\n", planetas[plan].nome,planetas[plan].raio);
	  if(pro==4)printf ("Periodo de %9s: %.2e s\n" , planetas[plan].nome,planetas[plan].periodo);
	  if(pro==5)printf ("Num. Satelites de %9s: %d\n\n"   , planetas[plan].nome,planetas[plan].satelites);
	}
      return 0;
            }
}
      //Se nao e nem prop. nem planeta, mostra mensagem de erro e o menu de ajuda
      if(pro==NUM_PROP)
{
  printf("\n\t *** O argumento inserido nao e valido ***\n\n");
  ajuda(-1);
}
    }

  //O utilizador inseriu 3 argumentos
  else if (argc==3)
    {
      //Verifica se argv[1] tem o nome de um planeta
      for(plan=0;plan<NUM_PLAN;++plan)
        {
  if(strcmp(argv[1],planetas[plan].nome)==0)
    {
      teste1=1;
      break;
    }
}
      //Verifica se argv[2] tem o nome de uma propriedade
      for(pro=0;pro<NUM_PROP;++pro)
        {
  if(strcmp(argv[2],propriedade[pro])==0)
    {
              teste2=1;
              break;
            }
}

      //Argumentos mal inseridos: mostar mensagem de erro e ajuda
      if(teste1==0 || teste2==0)
{
  printf("\n\t*** Os argumentos inseridos sao invalidos ***\n\n");
  ajuda(-1);
}
      //Argumentos bem inseridos: Mostrar propriedade do planeta
      else
{
  if(pro==0)printf ("Nome do planeta:   %s\n\n"   , planetas[plan].nome);
  if(pro==1)printf ("Distância ao sol de %s: %.2e\n\n",planetas[plan].nome,planetas[plan].distancia);
  if(pro==2)printf ("Massa de %s: %.2e Kg\n\n", planetas[plan].nome,planetas[plan].massa);
  if(pro==3)printf ("Raio medio de %s: %.2e Km\n\n", planetas[plan].nome,planetas[plan].raio);
  if(pro==4)printf ("Periodo de %s: %.2e s\n\n" , planetas[plan].nome,planetas[plan].periodo);
  if(pro==5)printf ("Num. Satelites de %s: %d\n\n"   , planetas[plan].nome,planetas[plan].satelites);
}
    }
  //Numero de argumetos invalido:mostrar ajuda
  else
    {
      printf("\n     *** Inseriu um numero de argumentos invalido ***\n\n");
      ajuda(-1);
    }
  
  return 0;
}

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