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

thranduil

Exercício do "linguagem c"

27 mensagens neste tópico

bom.. dei-me aqui com um problema que acho que alguem me deve poder ajudar. nao quero que me escrevam o codigo. so que me ajudem a intrepertar o problema para ver se eu o percebo porque nao entendi  que o homem queria dizer :S. bom, aqui vai:

pag. 191 ex. 5.

Citação
Implemente a seguinte funçao

float val(float x, int n, float t)

  devolve o val (valor actual liquido) para n anos, a*acento* taxa t e e*acento* definido atraves da seguinte formula:

  val=x/(1+t) + x/(1+t)^2 + x/(1+t)^3 + ...... + x/(1+t)^n

Sugestao: utilize a funçao pot, implementada anteriormente (exercicios resolvidos)

pag. 183 (funçao pot)

Citação

Implemente a funçao

float pot(float x, int n)

  devolve o valor de x^n

      x^0 = 1.0

      x^n = x*........*x (n vezes)


float pot(float x, int n){
  float res;
  int i;

  for (i=1,res=1.0 ; i<=n ; i++)
      res*=x;
  return res;

}

main(){
  printf("%f %f %f",pot(2.0,4), pot(1.234,3), pot(3.0,0);
}

 

se alguem me puder ajudar agradecia muito :)

e desculpem a confusao dos acentos :S

-------------

e ja agora, como e que se poe o codigo para aparecer formatado nas cores como aparece, por exemplo, no php mas numa versao c?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

thank you :)

mas tou a ver que ninguem percebeu o problema :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pelos vistos ninguem respondeu aquele exercicio... mas pronto. agora tenho ainda outra duvida, dois exercicios a frente :)

no exercicio 7 ele pede-nos para fazermos um programa que adquira um numero de horas e um tipo de representaçao e que depois faça a converçao de horas para horas,minutos ou segundos. e temos que o fazer com uma funçao, de 3 maneiras diferentes: switch com break, switch sem break e if-else. bom, o programa que eu fiz foi este:

#include <stdio.h>

/* switch sem break
long int num(int n_horas, char tipo){
   switch(tipo){
      case 's': n_horas*=60;
      case 'm': n_horas*=60;
      case 'h': n_horas*=1;
   }
   return n_horas;
}
*/

/* switch com break
long int num(int n_horas, char tipo){
   switch(tipo){
      case 'h': n_horas*=1; break;
      case 'm': n_horas*=60; break;
      case 's': n_horas*=3600; break;
   }
   return n_horas;
}
*/

/* if-else
long int num(int n_horas, char tipo){
   if(tipo='h')
      return n_horas*1;
   else
      if(tipo='m')
         return n_horas*60;
      else
         if(tipo='s')
            return (n_horas*3600);
}
*/

main(){
   int n_horas;
   char tipo;

   printf("Insira um numero de horas e um modo de representaçao:");
   scanf("%d %c",&n_horas, &tipo);

   printf("%d h ---> %ld %c",n_horas,num(n_horas,tipo),tipo);
   getchar();
   getchar();
}

o meu problema e que quando eu peço o modo de representaçao, o programa deve aceita-lo como sendo o enter ou o espaço do numero de horas e passa isso a frente. logo a funçao vai dar sempre o default.. se alguem me pude-se ajudar agradecia ;)

edit: ja mudei o codigo para funcar direito :D

edit2: mudei o codigo porque troquei, na funçao de switch sem break, as horas pelos segundos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto está tudo muito bem menos o problema do modo de representação.

Tambem tive problemas parecidos a resolver um desses exercícios e consegui resolvê-los.Como disseste, o programa quando pedes um caracter está a ler o <enter> ou o <space>, logo visto que não é um dos caracteres que entra no ciclo sai do programa ou mostra e default.

Experimenta dar um espaço entre o "%" e o "c" no local onde está "%c".

Acho que a resolução é essa apesar de não ter a certeza. Vou investigar melhor no entanto confirma isso.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Experimenta dar um espaço entre o "%" e o "c" no local onde está "%c".

quase correcto..  :) então já se esqueceram do que leram umas 100 páginas  atrás?  ;)

o espaço é antes do %c, não entre  :roll:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Experimenta dar um espaço entre o "%" e o "c" no local onde está "%c".

quase correcto..  :) então já se esqueceram do que leram umas 100 páginas  atrás?  ;)

o espaço é antes do %c, não entre  :roll:

Exactamente...estive a rever umas páginas e é isso mesmo. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim eu lembro-me disso. mas se repararem bem isso esta la. eu ate adicionei varios espaços para ver se funcava mas nada...

edit: pois.. nao sei porque mas agora funcou, porque tirei os espaços a mais que la tinha :)

edit2: hmmm continua a haver algo mal no switch sem break. mesmo depois de trocar os segundos e as horas, aquilo nao me esta a mandar o 'h' para o sitio dele. esta a contar desde o inicio... :S

edit3: bem.. aquilo umas vezes sai bem outras nao.. deixem la ;)

edit4  8) : o if-else esta a mandar-me sempre o valor das horas... ja escrevi

long int num(int n_horas, char tipo){
   if(tipo='h')
      n_horas*=1;
   else
      if(tipo='m')
         n_horas*=60;
      else
         if(tipo='s')
            n_horas*=60;

   return n_horas;
}

e tambem ja experimentei o que esta no post acima mas mesmo assim de nenhuma das maneiras funcou.. tenho que abrir parentesis rectos ou assim??? :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é parentesis rectos é chavetas ('[]'!='{') :o

Experimenta abrindo chavetas que pode ser que dê.... :roll:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
sim eu lembro-me disso. mas se repararem bem isso esta la. eu ate adicionei varios espaços para ver se funcava mas nada...

qdo for assim sempre podes usar o fflush(stdin)  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim eu sei que e chavetas.. confundi :)

mas tento isso do fflush para o if-else? :S nao percebi..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em vez do espaço, que dizes s vezes dar problemas, podes usar a função fflush(stdin) para limpar o buffer do teclado

printf("introduza 1: ");
scanf("%d",&a);
fflush(stdin);
printf("introduza 2: ");
scanf("%d",&b);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas a duvida ja nao e essa :P para isso ja solucionei o problema :P a duvida ta que o if-else nao funciona...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mas a duvida ja nao e essa :P para isso ja solucionei o problema :P a duvida ta que o if-else nao funciona...

Experimenta retirar os "else" e coloca apenas if em cada uma das condições.

long int num(int n_horas, char tipo){
   if(tipo='h'|| tipo='H')
      n_horas*=1;

      if(tipo='m'|| tipo='M')
         n_horas*=60;
      
        if(tipo='s'|| tipo='S')
            n_horas*=60;

   return n_horas;
}

Alem de que coloquei tambem a letra maiuscula correspondente visto que o utilizador pode ter o CAPS LOCK ligado quando responde.... :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o if-else não funcionava provavelmente porque te faltavam { }.

long int num(int n_horas, char tipo){
   if(tipo='h')
      n_horas*=1;
   else {
      if(tipo='m')
         n_horas*=60;
      else {
         if(tipo='s')
            n_horas*=60;
      }
   }

   return n_horas;
}

De qualquer modo este código devia ser substituido por um switch.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

slider tambem suspeitava que o problema era esse. mas o desafio do problema e que tem que ser feito com if-else, switch com break e switch sem break...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nao. o problema mantem-se...

Assim funciona na perfeição:

#include <stdio.h>


long int num(int n_horas, char tipo){
   if(tipo=='h'|| tipo=='H'){
      n_horas*=1;
}
      if(tipo=='m'|| tipo=='M'){
         n_horas*=60;
         }
        if(tipo=='s'|| tipo=='S'){
            n_horas*=60;
}
   return n_horas;
}

main(){
   int n_horas;
   char tipo;

   printf("Insira um numero de horas e um modo de representaçao:");
   scanf("%d %c",&n_horas, &tipo);

   printf("%d h ---> %ld %c\n",n_horas,num(n_horas,tipo),tipo);
  system("PAUSE"); 
  
}

As alterações que fiz são mais que visíveis. São poucas mas funcionam.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem eu posso ajudar-te pois estudei o livro do Damas a pouco

tempo, e fiz esses problemas todos... vamos la ver é se me consigo

expressar bem :P

Este programa foi feito por mim, espero que percebas tudo o que escrevi,

podes compilar isso que funciona bem, e ja pos em comentarios pra te

facilitar  ;)

/*
  Name: Tofas
  Date: 09-08-05
  Description: Exercicio de linguagem C- Luis Damas
*/



#include <stdio.h>

float pot(float t, int n) 

// t é a taxa e n e os anos

{int i; 
float res;
for (i=1, res=1.0;i<=n;i++) 

  // nota o res e do tipo float inicializada com 1.0 (se fosse 0.0 dava mal pois dava sempre 0)
  // o i varia de 1 ate n(anos)

  res*=t; 
  
  // equivale a fazer res=res*t e isto é: i=1 res=t, i=2 res=t*t,... ,  
  //i=n res=t*t*...*t n vezes isto é a potencia de t de ordem n... 

return res;    // vai devolver a potencia de t de ordem 
  }
  
// e com este programa obtemos o a função potencia, vemos isto do seguinte modo
// se queremos a potencia de t elevado a n ou a potencia de t de ordem n chama a função
// do seguinte modo potencia=pot(t,n); em que potencia e do tipo float...
  
  
float val (float x, float t, int n) 

// x é a massa, t a taxa e n o anos

{ int i;
  float res;
  for(i=1, res=0.0;i<=n; i++) 


  // o i varia de 1 ate n, e o res e iniciado por 0.0 (nota este res e diferente do res na funçao pot)
  // aqui resultado e iniciado por 0 porque eu quero "somar 1 valor ao valor anterior" e se inicializasse por 1 
  // os valores estavam errados com uma diferenca de 1 unidade...


  res+=x/pot(1+t,n);
  
  
  // equivale a res=res+x/pot(1+t,n);
  // aqui efectuamos  res=x/(1+t) + x/(1+t)^2 + x/(1+t)^3 + ...... + x/(1+t)^n 
  // consegues ver que temos a potencia de (t+1)
  // com o ciclo efectuamos isso para i=1 temos res=0+ x/(t+1)^1; i=2 temos res=x/(t+1)^1+x/(t+1)^2
  // .... para i=n temos res=x/(t+1)^1+....+x/(t+1)^n
  
  return res;
  
  // vai devolver o valor actual liquido

}

main()
{ float x, t;
  int n;
  printf("introduza a massa x, a taxa t e os anos n\n"); //pede os valores x, t, n
  scanf("%f %f %d",&x,&t,&n); // ler os valor x, t, n
  printf("o valor actual liquido, sendo x=%f, t=%f e n=%d e %f\n",x,t,n,val(x,t,n)); 
  // vai escrever no ecra os valores de x, t, n e o valor actual liquido(val)
}

bem se tiveres duvida avisa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em realação ao execicio 7...eu fiz isto, e axo que está bem... ;)

/*
  Name: tofas
  Date: 11-08-05 */

#include <stdio.h>

/* Aqui vou usar o if-else!!!!*/

long int num1(int n, char c)
{ long int res;
  if(c=='h'|| c=='H')
    res=n;
   else 
    if(c=='m'|| c=='M')
     res=n*60;
    else
     res=n*3600;
  
return res;

}
   
/* Aqui vou usar o switch com break   */

long int num2(int n, char c)
{  int res;
   switch(c)
  { case 'S': 
    case 's': res=n*3600;break;
    case 'M':
    case 'm': res=n*60;break;
    case 'H':
    case 'h': res= n; break;
    default: res=0;
    return res;
  }
}


// ou mais rapido e simples 

/*  o switch com break   

long int num2(int n, char c)
{  int res;
   switch(c)
  { case 'S': 
    case 's': return n*3600;
    case 'M':
    case 'm': return n*60;
    case 'H':
    case 'h': return n;
    default: return 0;
  }
}  

*/
  

/* Aqui vou usar o switch sem break :/ */


long int num3(int n, char c)
{ long int res=n;
  switch(c)
  { case 'S':
    case 's': res=res*60;
    case 'M':
    case 'm': res=res*60; 
    case 'H':
    case 'h': res=res; 
  }
  return res;
}  

main()
{ char c;
  int n;
  printf("introduza um numero e introduza se quer em h-horas, m-minutos ou s-segundos.\n");
  scanf("%d %c",&n,&c);
  printf("1.o numero de %d sao %d %c.\n", n, num1(n,c), c);
  printf("2.o numero de %d sao %d %c.\n", n, num2(n,c), c);
  printf("3.o numero de %d sao %d %c.\n", n, num3(n,c), c);

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bom.. dei-me aqui com um problema que acho que alguem me deve poder ajudar. nao quero que me escrevam o codigo. so que me ajudem a intrepertar o problema para ver se eu o percebo porque nao entendi  que o homem queria dizer :S. bom, aqui vai:

pag. 191 ex. 5.

Implemente a seguinte funçao

float val(float x, int n, float t)

  devolve o val (valor actual liquido) para n anos, a*acento* taxa t e e*acento* definido atraves da seguinte formula:

  val=x/(1+t) + x/(1+t)^2 + x/(1+t)^3 + ...... + x/(1+t)^n

Sugestao: utilize a funçao pot, implementada anteriormente (exercicios resolvidos)

Vou tentar explicar o problema... (eu não percebo nada de biologia ou quimica...) vou tentar explicar por akilo que penso que é... ;)

Imagina que num laboratorio tens um determinado fracos com x microbios...e ele reproduzem-se ao longo do tempo e segundo uma taxa...e sabemos a lei que define o crescimento do microbios é  dada pela funcao f(x,n,t)=x/(1+t) + x/(1+t)^2 + x/(1+t)^3 + ...... + x/(1+t)^n

-x: é o num de microbios no frasco;

-n: o tempo, os anos...

-t: a taxa;

para te ajudar a vida no laboratorio, pra calculares qtos microbios tens ao fim de algum tempo, é te dado um programa (o nosso programa) que te pede : x , n e t e vai te dar f(x,n,t) e assim, n precisas de fazer calculos "complexos" á mao...

Assim, dado o valor inicial x, e a taxa t, sabes qto microbios tem daki a 1 meses , 1 ano 10 anos...

OBservação: apesar de estar envolvida uma função exponencial, a função vai tender pra um valor finito, note-se que a função pode ser vista como uma serie, neste caso serie convergente, e mais f(x,n,t)=1/(1+t)  (pelo estudo da serie...um estudo simples ;)  ) ja me estou a estender... :roll:

este exercicio e um programa "mto pratico"...que varia segundo varios dados...

por exemplo se o n = 10 vamos ter:

um for a fazer o "processo":

comecando i =0 ate 10 vai

i=0

f(x,n,t)=x/(1+t)

i=1

f(x,n,t)=x/(1+t) + x/(1+t)^2

i=2

f(x,n,t)=x/(1+t) + x/(1+t)^2 + x/(1+t)^3

....

i=9

f(x,n,t)=x/(1+t) + x/(1+t)^2 + x/(1+t)^3 + ...... + x/(1+t)^10

aki estou a sua o "metodo iterativo"....e no programa usei o metodo recursivo, que neste caso e melhor...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

okej ^^

acho que já consigo perceber isso um pouco melhor :)

obrigado tofas. e sorry. não tinha reparado nos elses do teu prog porque só lhe dei uma vista de olhos muito por alto e eu costumo dar uns espaços aos comandos que vêm depois do else ^^. ainda não testei porque não tive oportunidade mas obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem agora percebo pq não percebeste bem o que ele queria...tu so tens 14 anos?? :shock:  é assim mesmo força...daki a uns anos ja dominas isto!! é assim se calhar não deste o que é uma função, qto + uma função exponencial?? pois não? este tipo de promenores podem afectarem te um pouco...mas não te deixe intimidar...boa continuação...  ;)

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