javsrt Posted February 27, 2014 at 10:03 PM Report #547001 Posted February 27, 2014 at 10:03 PM boa noite, deram-me o seguinte enunciado para eu fazer o programa em c, em seguida eu coloco o meu código. o problema, é que ele não está a funcionar corretamente e não consigo descobrir o porque agradecia a vossa ajuda "Pretende-se construir um programa em C que implemente um jogo do tipo tiro ao alvo. O objetivo é acertar num barco que se encontra a uma distância dist de um precipício. Para o efeito existe um canhão, situado a uma altura h, que dispara uma bala com uma velocidade inicial v0 e uma inclinação a. Nestas condições sabe-se que a distância horizontal, d, percorrida pela bala é dada por: d = (v0x/g) . (v0y + sqrt(v0y2 + 2 g h)) sendo g = 9,81 a aceleração da gravidade e v0x = v0.cos(a) e v0y = v0.sin(a) as componentes horizontais e verticais da velocidade inicial, respectivamente. O utilizador disporá de um conjunto de tentativas para acertar no alvo, devendo definir, em cada tentativa, o ângulo do canhão. Considera-se que a bala atingiu o alvo se |d – dist| ≤ tolerância. Outros dados do problema: dist: a ser inicializada aleatoriamente no intervalo [10..20] constantes: h = 20, v0 = 10, tolerância = 0.4, número máximo de tentativas = 10 ângulo do canhão: a pedir ao utilizador O programa deve indicar em cada iteração o local onde a bala caiu, bem como se a mesma ultrapassou ou não chegou ao alvo. No final, devem ser indicadas quantas tentativas foram necessárias para acertar ou, caso contrário, deve ser dito que o utilizador não foi capaz de acertar." #include #include #include int main() { int h=20,dist,v=10,tol=0.4,tent=10,i=1,alpha; float g=9.81,vx,vy,jogada; srand(time(NULL)); dist = rand() % 11+10; do{ printf("\nInsira o angulo(radianos):"); scanf("%d",α); vx=v*cos(alpha); vy=v*sin(alpha); jogada=(vx/g)*(vy+(pow(pow(vy,2)+2*g*h,0.5))); if(jogada>=dist-0.4 && jogada<=dist+0.4) printf("Acertou no alvo!\nForam precisas %d tentativas",i); else if(jogada>=dist+0.4) printf("A bala passou o alvo\nCaiu a uma distancia de %d metros",jogada); else if(jogada<=dist-0.4) printf("A bala caiu antes do alvo\nCaiu a uma distancia de %d metros",jogada); i=i+1; }while(i<=10 || (jogada>=(dist-0.4) && jogada<=dist+(0.4))); }
HappyHippyHippo Posted February 27, 2014 at 10:09 PM Report #547004 Posted February 27, 2014 at 10:09 PM antes sequer de olhar para o código, deverias dizer o que queres dizer com : "não está a funcionar corretamente" é que as pessoas tem mais que fazer do que passar o tempo a fazer de conta que são compiladores e debuggers IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
javsrt Posted February 27, 2014 at 10:11 PM Author Report #547005 Posted February 27, 2014 at 10:11 PM e suposto dizer onde a bala caiu, e o meu programa diz que caiu sempre no mesmo sitio, dando valores absurdos,
HappyHippyHippo Posted February 27, 2014 at 10:17 PM Report #547007 Posted February 27, 2014 at 10:17 PM estas são as mensagens do compilador quando compilei o teu código : src/hhh_main.c:1:10: error: #include expects "FILENAME" or <FILENAME> src/hhh_main.c:2:10: error: #include expects "FILENAME" or <FILENAME> src/hhh_main.c:3:10: error: #include expects "FILENAME" or <FILENAME> src/hhh_main.c: In function ‘main’: src/hhh_main.c:9:1: warning: implicit declaration of function ‘srand’ [-Wimplicit-function-declaration] src/hhh_main.c:9:1: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration] src/hhh_main.c:9:12: error: ‘NULL’ undeclared (first use in this function) src/hhh_main.c:9:12: note: each undeclared identifier is reported only once for each function it appears in src/hhh_main.c:10:1: warning: implicit declaration of function ‘rand’ [-Wimplicit-function-declaration] src/hhh_main.c:13:1: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration] src/hhh_main.c:13:1: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default] src/hhh_main.c:14:1: warning: implicit declaration of function ‘scanf’ [-Wimplicit-function-declaration] src/hhh_main.c:14:1: warning: incompatible implicit declaration of built-in function ‘scanf’ [enabled by default] src/hhh_main.c:16:1: warning: implicit declaration of function ‘cos’ [-Wimplicit-function-declaration] src/hhh_main.c:16:6: warning: incompatible implicit declaration of built-in function ‘cos’ [enabled by default] src/hhh_main.c:17:1: warning: implicit declaration of function ‘sin’ [-Wimplicit-function-declaration] src/hhh_main.c:17:6: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default] src/hhh_main.c:18:1: warning: implicit declaration of function ‘pow’ [-Wimplicit-function-declaration] src/hhh_main.c:18:20: warning: incompatible implicit declaration of built-in function ‘pow’ [enabled by default] src/hhh_main.c:23:1: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat] src/hhh_main.c:26:1: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat] src/hhh_main.c:7:28: warning: unused variable ‘tent’ [-Wunused-variable] src/hhh_main.c:7:20: warning: unused variable ‘tol’ [-Wunused-variable] src/hhh_main.c:31:1: warning: control reaches end of non-void function [-Wreturn-type] se achas que isso é aceitável, acho que estar a ir pelo caminho erraado ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
javsrt Posted February 27, 2014 at 10:33 PM Author Report #547008 Posted February 27, 2014 at 10:33 PM dai eu ter dito que n funcionava corretamente
javsrt Posted February 27, 2014 at 10:45 PM Author Report #547012 Posted February 27, 2014 at 10:45 PM o erro que esta a aparecer ai e por causa das bibliotecas e n sei porque motivo n copiou #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>
HappyHippyHippo Posted February 27, 2014 at 10:54 PM Report #547016 Posted February 27, 2014 at 10:54 PM #define G 9.81 #define H 20 #define V 10 #define PI 3.14 double calc_dist(double degree) { double rad = degree * PI / 180; return ((V*cos(rad)) / G) * ((V*sin(rad)) + sqrt(pow(V*sin(rad), 2) + 2*G*H)); } agora resolve o resto IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Rui Carlos Posted February 27, 2014 at 11:28 PM Report #547017 Posted February 27, 2014 at 11:28 PM #include #include #include int main() { int h=20,dist,v=10,tol=0.4,tent=10,i=1,alpha; float g=9.81,vx,vy,jogada; srand(time(NULL)); dist = rand() % 11+10; do{ printf("\nInsira o angulo(radianos):"); scanf("%d",&alpha); vx=v*cos(alpha); vy=v*sin(alpha); jogada=(vx/g)*(vy+(pow(pow(vy,2)+2*g*h,0.5))); if(jogada>=dist-0.4 && jogada<=dist+0.4) printf("Acertou no alvo!\nForam precisas %d tentativas",i); else if(jogada>=dist+0.4) printf("A bala passou o alvo\nCaiu a uma distancia de %d metros",jogada); else if(jogada<=dist-0.4) printf("A bala caiu antes do alvo\nCaiu a uma distancia de %d metros",jogada); i=i+1; }while(i<=10 || (jogada>=(dist-0.4) && jogada<=dist+(0.4))); } Olha para os tipos das variáveis que estás a usar. A distância é suposto ser um inteiro? (Até podia ser, mas não me parece grande opção.) A velocidade é suposto ser um inteiro? (Até podia ser, mas não me parece grande opção.) 0.4 é um inteiro? 🙂 O ângulo é suposto ser um inteiro? (Tendo em conta que estás a pedir um ângulo em radianos, é muito má opção.) Aquilo que te sugiro é mudares todas as variáveis referentes a medidas de grandezas físicas para double (neste caso não há razão para usares float em vez de double). Diria que apenas o i e o tent é que é suposto serem inteiros. Rui Carlos Gonçalves
javsrt Posted February 28, 2014 at 07:24 AM Author Report #547032 Posted February 28, 2014 at 07:24 AM n tinha reparado niso, obrigado
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now