Rayaxe Posted March 14, 2012 at 10:15 PM Report #444006 Posted March 14, 2012 at 10:15 PM 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
nunopicado Posted March 14, 2012 at 10:36 PM Report #444015 Posted March 14, 2012 at 10:36 PM 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.
Rayaxe Posted March 14, 2012 at 10:49 PM Author Report #444019 Posted March 14, 2012 at 10:49 PM ai jesuss que burrooo xD obrigado ^^ ah eu uso o free pascal, deve ser por isso que nao ha compatibilidade
nunopicado Posted March 14, 2012 at 10:49 PM Report #444020 Posted March 14, 2012 at 10:49 PM 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.
nunopicado Posted March 14, 2012 at 10:52 PM Report #444021 Posted March 14, 2012 at 10:52 PM 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.
passarito Posted March 15, 2012 at 02:09 PM Report #444063 Posted March 15, 2012 at 02:09 PM 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?
nunopicado Posted March 15, 2012 at 05:11 PM Report #444075 Posted March 15, 2012 at 05:11 PM 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.
passarito Posted March 15, 2012 at 07:40 PM Report #444095 Posted March 15, 2012 at 07:40 PM 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!!!!
nunopicado Posted March 15, 2012 at 07:44 PM Report #444097 Posted March 15, 2012 at 07:44 PM 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.
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