← Desenvolvimento

Dúvida C - exercícios

Lida 1174 vezes

Offline

Pedro Miguel 
Membro
Mensagens 1161 Gostos 25
Feedback +11

Troféus totais: 27
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2

Boas!

Ando aprender C e fiquei bloqueado num exercício. Se me pudessem ajudar:

Questão
As pessoas com agendas sobrecarregadas têm alguma dificuldade em marcar reuniões. Há as que dizem "posso das x às y, mas às y já tenho outra reunião" e as que dizem "não posso das z às t, mas às t já estou livre". As outras possibilidades não serão interessantes agora e para simplificar vamos supor que dizem sempre "posso".

Tarefa
Escrever um programa que, dada a duração (em horas) prevista para uma reunião entre duas pessoas e dois pares de inteiros A B e C D, verifica se é possível agendar a reunião e quando. Neste caso, a primeira pessoa diria "posso das A horas às B horas, mas às B já tenho outra reunião" e a segunda diria "posso das C horas às D horas, mas às D já tenho outra reunião'', sendo A, B, C e D inteiros entre 9 e 19. Assume-se que A é menor do que B e que C é menor do que D.

A reunião tem de decorrer entre as 9 e as 19 horas e a sua duração é um inteiro. A primeira linha de dados tem essa duração e as duas seguintes os dois pares referidos. Conforme o caso, o programa escreve uma linha ou com a palavra Impossivel (sem acento) ou com um inteiro se a reunião só se puder realizar a uma hora ou com dois inteiros se houver flexibilidade (estes inteiros definem o intervalo em que se pode fixar o início da reunião).


Citar
#include <stdio.h>
int main () {
    int h,a,b,c,d,i,p;
    scanf("%d",&h); //quantas horas dura a reunião
    scanf("%d %d %d %d",&a,&b,&c,&d); //a,b | c,d (horas início - fim)
  
   while (i>9 && i<19) {  
          if (a<b && c<d) {
                 if (a==b) {
                         p=a+h; // hora inicial que ambos podem + h
                         printf("%d %d\n",a,p);
                         }
                        
                 else if (c==d)
                               p=c-h; // hora inicial que ambos podem finalizar a reunião - h
                               printf("%d %d\n",p,c);
                               }
          else printf("Impossivel\n");
          
          }
 
return 0;
}

Já usei o : http://codepad.org/kuu9mz5V e não dá qualquer erro de compilação e quando tento submeter o exercício na plataforma dá-me erro.

Alguém me ajuda?  :cool:
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

não vou estar a ler o enunciado nem a validar o código, só me lembro dos meus tempos de submissão de código para validadores ter de ter muito cuidado com a validação dos inputs recebidos, coisa que parece que não fazes, presumo que estejas a compilar com -WALL por causa de warnings e assim...

exemplos de validação de maus inputs,

reuniões entre 9 - 19

e se eu submeter um range tipo 12 9, é possível ?
Offline

Pedro Miguel 
Membro
Mensagens 1161 Gostos 25
Feedback +11

Troféus totais: 27
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2

não vou estar a ler o enunciado nem a validar o código, só me lembro dos meus tempos de submissão de código para validadores ter de ter muito cuidado com a validação dos inputs recebidos, coisa que parece que não fazes, presumo que estejas a compilar com -WALL por causa de warnings e assim...

exemplos de validação de maus inputs,

reuniões entre 9 - 19

e se eu submeter um range tipo 12 9, é possível ?

Não percebi onde querias chegar.
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Boas,

Tens ai muitos problemas. Vou tentar chegar a tudo... :)

  • O compilador não dá erros, porque o código não tem erros.

  • Logo no início do programa, porque é que utilizaste um while? Não me parece que tenhas assimilado a utilidade dessa estrutura de controlo, nem o seu propósito. Vai rever esse conceito.

  • Também na guarda dessa estrutura de controlo, recorres a uma variável i? O que é i? Tu crias a variável, mas esta nunca é inicializada (muito menos até ao ponto do programa onde a utilizas a 1ª vez).

    O valor que i contém quando tentas fazer while(i>9 && i<19) é atribuído pelo compilador. Na prática estás a tentar testar uma condição que nem tu sabes o que é, porque nem tu sabes o que é i.

    O resultado é que o teu programa salta da linha 7 para a linha 20...

  • Pelo amor de Deus, não dês nomes às variáveis a,b,c,d,e,f,g. És um Humano. É muito mais difícil estar a ler código quando o nome das variáveis não te dizem absolutamente nada.

    De 3 em 3 linhas estás-te a perguntar: "Afinal o que é que é suposto o a ser?". E lá vais tu ler para trás até encontrares onde declaraste a variável, onde lhe atribuíste um valor só para perceberes o que é que aquilo é.

    Se em vez de a deres o nome à variável de horaInicio torna tudo mais simples - para ti e para qualquer outro que leia o que fizeste.

  • Mesmo entrando pelo while a dentro, continuo a não perceber a lógica. Então se as horas de início coincidirem imprimes a hora de início e p.

    Imagina que um pode das 9 às 16 e outro das 11 às 15. A reunião é de 1 hora e pode ser feita entre as 11h - 14h. Na tua lógica, como não podem os dois logo às 9h (porque 9 != 11), então já não é possível...

  • A mesma coisa para a hora do fim. Esta ainda me fez menos sentido...



Algumas sugestões. O teu problema (ainda) não está no código, está na lógica, no algoritmo. Antes de te sentares ao computador, agarra num pedaço de papel e escreve\desenha\rabisca os passos que tens de tomar para chegares ao resultado.

http://www.unf.edu/~broggio/cop2221/2221pseu.htm
http://en.wikipedia.org/wiki/Pseudocode

Em problemas grandes, ajuda-te a esmiuçar o problema em problemas mais pequenos e a resolvê-los. Em questões mais "intuitivas" como esta, força-te a fazer o exercício de colocar "passo a passo" a tua linha de raciocínio (repara que no exemplo que dei acima, dizeres que a reunião é possível das 11h às 14h sai-te quase automaticamente - a questão é como é que na tua cabeça tu raciocinaste para chegar lá).

Depois de teres rabiscado, riscado e reescrito o programa 20x's (que no início é sempre o que acontece), passa então para a frente do PC para lidares com erros de compilação e afins.

Sugestão de resolução - é a minha. Devias tentar chegar à tua (espero não te estar a fazer um trabalho de casa, MESMO).

Pseudo-Código (deves fazer isto com papel e caneta, não no Word): http://ge.tt/8jzou59?c
Solução (em Java porque tinha o IDE aberto, se não entenderes alguma coisa, diz): http://paste2.org/p/1734859
Offline

Pedro Miguel 
Membro
Mensagens 1161 Gostos 25
Feedback +11

Troféus totais: 27
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2

Diogo muito obrigado pela tua resposta. Ando a fazer exercícios e deparei-me com esse problema: a lógica. Li a sua resposta com atenção e a sua resposta, vou estudar o programa e amanhã vou fazer em C e depois coloca aqui.

Mais uma vez obrigado ;)