Jump to content

Problema na Identificaçao num Erro


Rayaxe
 Share

Recommended Posts

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:ex_1_18_fig_1.jpg

Entrada:

6

Pedro

Ana

Joao

Rita

Carlos

Rui

4

6

5

Saida:

Rita

Rui

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

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

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

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.