Rayaxe Posted March 14, 2012 Report Share Posted March 14, 2012 Bom pessoal, estive um bom tempo afastado do forum, mas foi por um bom motivo, porque assim de repente comecei a perceber disto e a tirar 19 e 20 nos testes entao nunca tive duvidas, mas hj apareceu me um exercicio que me deu a volta á cabeça. Ele pareceu me facil, mas ja estou ha 1 hora com ele e nao consigo detetar o erro do meu algoritomo. Aqui vai: Elabore um programa que leia um vector XNOMES com um número par de nomes de alunos. Após a leitura dos nomes deve ler um novo vector TROCA, com metade dos elementos do anterior, que leia para a 1ª metade dos elementos, qual o elemento da 2ª metade com que vai trocar de posição. O seu programa deve alterar e imprimir o vector XNOMES trocando os elementos da 1ª metade com os elementos da 2ª indicados pelo vector TROCA, por exemplo: Entrada: 6Pedro Ana Joao Rita Carlos Rui 4 6 5 Saida: RitaRui Carlos Pedro Joao Ana Bem, o que eu fiz foi o seguinte: (não vou explicar passo por passo porque vcs entendem disto mais do que eu e porque o meu raciocinio é facil de entender) program ex17; var n,j,i:integer; t:string; XNOMES:array[1..100] of string; TROCA:array[1..100] of integer; begin readln(n); for i:=1 to n do begin readln(XNOMES[i]); end; for i:=1 to (n div 2) do begin readln(TROCA[i]); end; for i:=1 to (n div 2) do begin XNOMES[i]:=t; j:=TROCA[i]; XNOMES[i]:=XNOMES[j]; XNOMES[j]:=t; end; for i:=1 to n do begin writeln(XNOMES[i]); end; end. agora eu pergunto... porque é que isto não funciona? o resultado deste programa são apenas os 3 primeiros nomes, que neste caso acima seriam Rita, Rui, Carlos... o resto nao sai EDIT: GeSHi adicionado. thoga31 Link to comment Share on other sites More sharing options...
nunopicado Posted March 14, 2012 Report Share Posted March 14, 2012 Para começar, parabéns pela evolução. O programa que puseste aqui não compila. Esqueceste-te de colocar o índice quando usar os arrays (possivelmente só no forum, certo?) De qualquer maneira, o teu problema está no 3º ciclo FOR Começas por dizer que XNomes = T, mas nesta fase, o T não tem nada. Por isso é que os nomes da segunda metade aparecem sem nada. troca o 3º FOR por este: for i:=1 to (n div 2) do begin t:=XNOMES[i]; XNOMES[i]:=XNOMES[Troca[i]]; XNOMES[Troca[i]]:=t; end; Nitidamente uma distração! 🙂 às vezes este tipo de coisas fazem-nos a andar que tempos atrás do erro, para depois dizer: dahhhh! PS: Eliminei o uso do J, porque podes colocar directamente o Troca dentro do indice do XNomes. Se preferires, mantém-no. E vai aparecendo... O forum precisa tanto dos que não sabem como dos que sabem... 🙂 "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
Rayaxe Posted March 14, 2012 Author Report Share Posted March 14, 2012 ai jesuss que burrooo xD obrigado ^^ ah eu uso o free pascal, deve ser por isso que nao ha compatibilidade Link to comment Share on other sites More sharing options...
nunopicado Posted March 14, 2012 Report Share Posted March 14, 2012 Já agora, sugiro-te o seguinte: - Colocar uma constante com o valor máximo do array XNomes - Declarar os arrays baseados nessa constante Const MaxItems = 100; Var XNOMES:array[1..MaxItems] of string; TROCA:array[1..(MaxItems DIV 2)] of integer; Assim, basta mudares o valor da constante para alterares logo correctamente os dois arrays (até porque o Troca só precisa ter metade do XNomes) "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
nunopicado Posted March 14, 2012 Report Share Posted March 14, 2012 ai jesuss que burrooo xD obrigado ^^ ah eu uso o free pascal, deve ser por isso que nao ha compatibilidade hehehe não te preocupes... Isto é daquelas coisas que se nota que não é por não saberes. É distração mesmo. Não percebi essa da compatibilidade... O indice do array ter de ser definido, mesmo no free pascal. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
passarito Posted March 15, 2012 Report Share Posted March 15, 2012 Edit: Não liguem a este post, fiz confusão Passarito Olá, Não necessitas da variável t:string, uma vez que o exercício te "obriga a ter o vector troca com os valores da 2ª metade do vector. Pessoalmente eu não usaria o vector, mas se o exercício pede, nós respeitamos. Assim, sem a variável t eu programaria o ciclo da seguinte forma: for i:=1 to (n div 2) do begin XNOMES[(n div 2) + i]:=XNOMES[i]; XNOMES[i]:=Troca[i]; end; Outra observação ao Nuno, provavelmente devo estar errado, mas a linha de código XNOMES[i]:=XNOMES[Troca[i]]; não dará erro? É que troca devolve uma string e não um inteiro, ou há por aí algum jogo de cintura que me esteja a falhar? Link to comment Share on other sites More sharing options...
nunopicado Posted March 15, 2012 Report Share Posted March 15, 2012 Não dá erro pelo mesmo motivo que a tua sugestão de código não funcionaria... 🙂 O array TROCA não guarda string, mas sim integer. Só guarda as posições a trocar, e não os nomes! 🙂 "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
passarito Posted March 15, 2012 Report Share Posted March 15, 2012 iiiiiiiiii ia jurar que tinha visto que o array troca era do tipo string.... assim, já cá não está quem falou...` :spank: estejam `vontade para me espancarem!!!! Link to comment Share on other sites More sharing options...
nunopicado Posted March 15, 2012 Report Share Posted March 15, 2012 hehehe "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
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