Ir ao conteúdo
  • Cadastre-se

Aninhamento de while do


Ir à solução Resolvido por dontpanic,

Posts recomendados

Eu tenho aqui pra fazer um exercicio em pascal que é um combinador de letras ou números.

Ele lê os caracteres de três arquivos e combina os caracteres depois de fazer algumas comparações. Os arquivos são AB, BC e CD e os caracteres estão dispostos dessa forma, nos respectivos arquivos:

 

AB:

01

11

 

BC:

01

11

12

 

CD:

11

22

33

 

O arquivo AB tá usando o X como variavel, o BC usa o Y e o arquivo CD usa o Z.

Os caracteres de AB são chamados X1 e X2, os de BC são Y1 e Y2 e de CD Z1 e Z2.

O programa teria que fazer as seguintes comparações:

Se o 2º caracter de AB for igual ao 1º caracter de BC e o 2º caracter de BC for igual ao 1º caracter de CD, então ele escreve (X1, X2, Y2, Z2). Isto é:

 

IF (X2=Y1) AND (Y2=Z1) THEN

 

   WRITELN(X1, X2, Y2, Z2)

 

O codigo está abaixo:

Program LETRAS_E_NUM;Uses CRT;Var  X1, X2, Y1, Y2, Z1, Z2:integer;  X, Y, Z: string[10];  AB, BC, CD: Text;BEGIN  ClrScr;  assign(AB, 'AB.txt');  reset(AB);  assign(BC, 'BC.txt');  reset(BC);  assign(CD, 'CD.txt');  reset(CD);  WHILE NOT EOF(AB) DO    BEGIN      READLN(AB, X);       X1:=ord(X[1])-Ord('0');       X2:=ord(X[2])-Ord('0');  WHILE NOT EOF(BC) DO    BEGIN      READLN(BC, Y);       Y1:=ord(Y[1])-Ord('0');       Y2:=ord(Y[2])-Ord('0');  WHILE NOT EOF(CD) DO    BEGIN      READLN(CD, Z);       Z1:=ord(Z[1])-Ord('0');       Z2:=ord(Z[2])-Ord('0');   WRITELN(Z1);    END;   WRITELN(Y1);    END;   WRITELN(X1);    END;  CLOSE(AB);  CLOSE(BC);  CLOSE(CD);  readln;END.

O problema é que não estou achando uma forma de aninhar os WHILES DO de forma que funcione. Do jeito que o código tá acima a saída é:

 

1

2

3

0

1

1

0

1

 

Esses são os algarismos dos respectivos arquivos AB, BC e CD.

A saída teria que ser, pra esses caracteres e nas condições exigidas: 0111

Porque o 2º do AB= 1º do BC e o 2º do BC= 1º do CD.

 

Link para o comentário
Compartilhar em outros sites

A questão não ficou muito clara pra mim. Se você pegou os valores dos dois primeiros caracteres nos 3 arquivos, porque você precisa aninhar os whiles?

 

Não bastaria fazer WHILE (NOT EOF(AB)) AND (NOT EOF(BC)) AND (NOT EOF(CD)), e depois simplesmente ler as 3 variáveis e comparar elas?

Link para o comentário
Compartilhar em outros sites

Eu fiz o que voce sugeriu:

Program LETRAS_E_NUM;Uses CRT;Var  X1, X2, Y1, Y2, Z1, Z2:integer;  X, Y, Z: string[10];  AB, BC, CD: Text;BEGIN  ClrScr;  assign(AB, 'AB.txt');  reset(AB);  assign(BC, 'BC.txt');  reset(BC);  assign(CD, 'CD.txt');  reset(CD);  WHILE (NOT EOF(AB)) AND (NOT EOF(BC)) AND (NOT EOF(CD)) DO    BEGIN      READLN(AB, X);       X1:=ord(X[1])-Ord('0');       X2:=ord(X[2])-Ord('0');        READLN(BC, Y);       Y1:=ord(Y[1])-Ord('0');       Y2:=ord(Y[2])-Ord('0');        READLN(CD, Z);       Z1:=ord(Z[1])-Ord('0');       Z2:=ord(Z[2])-Ord('0');   IF (X2=Y1) AND (Y2=Z1) THEN        WRITELN(X1, X2, Y2, Z2);    END;  CLOSE(AB);  CLOSE(BC);  CLOSE(CD);  readln;END.

Só que não saiu nada, ele não escreveu. Não sei como colocar esses whiles do. Tem caracteres dos arquivos que ele não tá lendo por isso não faz as combinações esperadas. 

Link para o comentário
Compartilhar em outros sites

Eu rodei o código aqui e funcionou.

Lembre-se que ele só imprime algo se a condição for encontrada... então talvez não tenha imprimido nada aí simplesmente porque os valores não são iguais mesmo nos seus arquivos.

 

Pra testar se tá funcionando, faça as três variáveis lerem o mesmo arquivo.

Link para o comentário
Compartilhar em outros sites

Tá, mas o exercicio exige que ele leia, de arquivos diferentes, caracteres diferentes. E eu fiz isso que você sugeriu e mesmo assim ele não fez todas as combinaçoes que deveria.

Eu mudei os caracteres e deixei assim, é como se ele lesse do mesmo arquivo:

 

AB: 01 e 11

BC: 01 e 11

CD: 01 e 11

 

Aí a unica combinação que ele faz é 1111, sendo que poderia fazer tambem 0111. 

Alguma coisa ainda não tá certa.

Link para o comentário
Compartilhar em outros sites

AB: 01 11

BC: 01 11

CD: 01 11

 

Na primeira passagem do loop, X, Y e Z vão ficar assim:

X = 01

Y = 01

Z = 01

 

X1 = 0

X2 = 1

 

Y1 = 0

Y2 = 1

 

Z1 = 0

Z2 = 1

 

X2 é igual a Y1? 1 = 0? Não.

Y2 é igual a Z1? 1 = 0? Não.

 

Por isso que não imprime nada.

 

Segunda passagem do loop:

X = 11

Y = 11

Z = 11

 

X1 = 1

X2 = 1

 

Y1 = 1

Y2 = 1

 

Z1 = 1

Z2 = 1

 

X2 = Y1? 1 = 1? Sim.

Y2 = Z1? 1 = 1? Sim.

 

A menos que eu não tenha entendido direito a questão (o que é bem possível) eu não consigo ver nada de errado no código.

Link para o comentário
Compartilhar em outros sites

  • Solução

Eu tô meio perdido aqui. Pelo que entendi, você quer o seguinte;

 

AB: [01] [11]

BC: [01] [11]

CD: [01] [11]

 

Você quer testar o primeiro par de AB tanto com o primeiro par de BC quanto o segundo, depois testar isso tudo tanto com o primeiro par de CD quanto o segundo... é isso?

 

assign(AB, 'AB.txt');reset(AB);WHILE NOT EOF(AB) DOBEGIN        READLN(AB, X);        X1:=ord(X[1])-Ord('0');        X2:=ord(X[2])-Ord('0');         assign(BC, 'BC.txt');        reset(BC);        WHILE NOT EOF(BC) DO        BEGIN                READLN(BC, Y);                Y1:=ord(Y[1])-Ord('0');                Y2:=ord(Y[2])-Ord('0');                 assign(CD, 'CD.txt');                reset(CD);                WHILE NOT EOF(CD) DO                BEGIN                        READLN(CD, Z);                        Z1:=ord(Z[1])-Ord('0');                        Z2:=ord(Z[2])-Ord('0');                         IF (X2=Y1) AND (Y2=Z1) THEN                                writeln( ... );                 END;                 close(CD);        END;        close(BC);END;close(AB);

 

Não testei o código acima. Mas acho que é isso.

Não sei se é necessário abrir e fechar os arquivos em todo while... talvez se apenas usar o reset() já funcione.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...