Pascal/Turbo Pascal - "ELSE" problema de syntax ¿Cómo lo resuelvo?¿Qué me falta?

 
Vista:
sin imagen de perfil
Val: 9
Ha disminuido 1 puesto en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

"ELSE" problema de syntax ¿Cómo lo resuelvo?¿Qué me falta?

Publicado por erick (3 intervenciones) el 15/07/2020 17:05:19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
program lab2;
 
uses crt;
 
type
 
	sec_numero = file of Integer;
	sec_sal = file of Char;
var
	sec: sec_numero;
	salida:sec_sal;
	v:Integer;
	cont, i, y,bin : Integer;
 
Procedure InicializarSecuencia(VAR sec_local: sec_numero);
	begin
		assign(sec_local, 'datos_secuencia.txt');
 
		//Control de acciones sobre el archivo
		{$I-}
			reset(sec_local);
		{$I+}
 
		//Verifico estado de la accion ejecutada
		if IOResult <> 0 then
	    	writeln('No se pudo crear el archivo...ERROR');
		end;
 
Procedure CrearSecuenciaSalida(VAR sec_salida: sec_sal);
 
	begin
		assign(sec_salida, 'datos_salida.txt');
 
		//Control de acciones sobre el archivo
		{$I-}
			rewrite(sec_salida);
		{$I+}
 
		//Verifico estado de la accion ejecutada
	  	if IOResult <> 0 then
		      writeln('No se pudo crear el archivo...ERROR');
 
	end;
 
 
 
 
begin
 
	clrscr;
	InicializarSecuencia(sec);
	CrearSecuenciaSalida(salida);
	cont:= 0;
	i:= 0;
	y:= 0;
	writeln('**********************************************************************');
	writeln('Este programa convierte los numeros en base binaria a base hexadecimal');
	writeln('**********************************************************************');
	readkey;
	read(Sec,v);
 
	while not eof(sec) do
		begin
 
			for i := 1 to 4 do
			 	begin
				if i = 1 then
					begin
						case v of
							1: bin:= 8;
							0: bin:= 0;
						else
							write('ERROR');
 
 
					end;
 
				Else // ACA SE PRESENTA EL ERROR
					begin
					if i = 2 then
						begin
							case v of
								1:bin:= 4;
								0:bin:= 0;
							else
								write('ERROR');
						end;
					end;
				Else
					begin
					if i = 3 then
						begin
							case v of
								1:bin:= 2;
								0:bin:= 0;
							else
								write('ERROR');
 
						end;
					end;
				Else
					begin
					case v of
						1:bin:= 1;
						0:bin:= 0;
					else
						write('ERROR');
					end;
 
					cont:= cont + bin;
					read(sec, v);
 
 
				end;
		case cont of
			begin   // convierte la suma decimal en hexadecimal
				0 : write(salida,'0');
				1 : write(salida,'1');
				2 : write(salida,'2');
				3 : write(salida,'3');
				4 : write(salida,'4');
				5 : write(salida,'5');
				6 : write(salida,'6');
				7 : write(salida,'7');
				8 : write(salida,'8');
				9 : write(salida,'9');
				10 : write(salida,'A');
				11 : write(salida,'B');
				12 : write(salida,'C');
				13 : write(salida,'D');
				14 : write(salida,'E');
				15 : write(salida,'F');
			else
				write('ERROR');
 
			end;
			cont:= 0;
			y:= y+1;
			read(sec, v);
 
			if y = 2 then
				begin
					write(salida, '-');
					y:= 0;
 
					read(sec, v);
 
				end;
 
		end;
 
 
writeln('**********************************************************************');
writeln('Proceso terminado con mucho exito!');
writeln('**********************************************************************');
readkey;
 
close(sec);
close(salida);
end.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 112
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

"ELSE" problema de syntax ¿Cómo lo resuelvo?¿Qué me falta?

Publicado por juanba (40 intervenciones) el 15/07/2020 19:50:03
Hola.
He mirado tu programa y creo que más que faltar algo sobran algunos begin. No estoy muy seguro de cual es el formato de los datos así que no se si el programa tiene mas errores, pero por lo menos te adjunto la primera parte del bucle de lectura del archivo de entrada corregida de manera que compila y creo que hace lo que tu quieres. Es la parte que va entre las lineas 62 y 117 de tu programa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
while not eof(sec) do
 
		begin
 
			for i := 1 to 4 do
 
			 	begin
 
				if i = 1 then
 
					begin
 
						case v of
 
							1: bin:= 8;
 
							0: bin:= 0;
 
						else
 
							write('ERROR');
                                                end;    // Case..else..end;
 
					end     // if i = 1. No hay ";" porque sigue un else
 
				Else // ACA SE PRESENTA EL ERROR
 
// Este begin sobra                     begin
 
					if i = 2 then
 
						begin
 
							case v of
 
								1:bin:= 4;
 
								0:bin:= 0;
 
							else
 
								write('ERROR');
 
						        end;    // Case..Else.. End
                                		end    // if i = 2. No hay ";" porque sigue  un else
 
                                        Else
 
       // Este begin sobra              begin
 
					if i = 3 then
 
						begin
 
							case v of
 
								1:bin:= 2;
 
								0:bin:= 0;
 
							else
 
								write('ERROR');
                                                        end;    // Case..else..end;
 
 
						end     // if i = 3
 
				Else
 
                                        begin        // Este también sobra, junto con su end. Pero como veo que te gustan ...
 
                                                case v of
 
						        1:bin:= 1;
 
						        0:bin:= 0;
 
					        else
 
						        write('ERROR');
 
					        end;
                                        end;    // Del else final
 
// No se si el bucle for i := 1 to 4 se cierra aqui o tres lineas mas abajo
// porque no veo en que formato estan los datos en el archivo de entrada
//                              end;
				cont:= cont + bin;
				read(sec, v);
 
 
			end;
 
		case cont of
                // convierte la suma decimal en hexadecimal
// ILEGAL "begin"  siguiendo "case cont of". Sobra
// Y aqui sigue la linea 117 de tu programa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 9
Ha disminuido 1 puesto en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

"ELSE" problema de syntax ¿Cómo lo resuelvo?¿Qué me falta?

Publicado por erick (3 intervenciones) el 15/07/2020 21:53:50
Que tal juanba !

agradezco de corazon tu correccion y ayuda!
Como mencionaste en las partes de los blocks begin y end, me base mucho en la teoria que nos brindaron en la unversidad, pero veo que no funciona tan asi.

La consigna del trabajo de PASCAL es:
Desarrollar un programa PASCAL que haga la conversión del sistema binario al
hexadecimal de una palabra de 48 bits que se ingresa como un archivo texto. Se
desea generar una secuencia de salida con el texto encriptado. Para ello se
debe convertir y almacenar en una secuencia de salida los dígitos
hexadecimales obtenidos de la siguiente manera:
Entrada: 101000011100110100100011010001010111100011000010
Salida (a almacenar): A1-CD-23-45-78-C2
Conversión
• Tomar en cuenta la tabla de hexadecimal desde el 0 a 9 y de A a la D con su
correspondiente valor en binario, ejemplo hexadecimal 0 es en binario 0000

• Tomar grupo de a 4 bits del dato de entrada realizar la conversión y luego
escribir de acuerdo al ejemplo presentado (respetando el formato pedido. Este
formato representa una dirección MAC que usan las computadoras para enviarse
mensajes en una red Ethernet)


Esa es la consigna y con los datos con los cuales deberia de contarse al principio jeje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 112
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Dos versiones de BinToHex

Publicado por juanba (40 intervenciones) el 16/07/2020 10:15:51
Hola, Erick.
Me alegro que el código que he puesto te sirva para algo. De todos modos con la explicacion del propósito del trabajo queda todo mucho más claro y ahora entiendo el porqué de algunas instrucciones de tu programa.

Quisiera hacer una sugerencia: Creo que sería más cómodo leer la cadena completa de 48 caracteres '0' y '1' con la representacion binaria de una MAC en un string y trabajar con éste.
De esta manera, aunque la definición del trabajo habla de una única MAC, se podría extender fácilmente a una lista de ellas guardadas en el mismo archivo de entrada en lineas consecutivas. Bastaría hacer un bucle while que leyera cada direccion completa, la tradujera al formato de salida y volviera al archivo a por la siguiente linea.
En cualquier caso, te propongo una funcion de traduccion de binario a hexadecimal que he programado según lo que se pide por si te sirve como ejemplo para que desarrolles tu propio código.
Está escrita según mi estilo habitual que es bastante denso, pero la he comentado al máximo para que quien esté interesado pueda utilizarla y/o convertirla en lo que necesite.
La idea es tomar una cadena de caracteres binarios, un indice que empieza apuntando al último y que va componiendo un numero segun el peso (1, 2, 4, 8) de los cuatro caracteres que va encontrando a medida que retrocede hacia el inicio del string.
Cada cuatro pasos convierte el valor númerico que ha ido calculando en digito hexadecimal y lo agrega, por la izquierda, a la cadena de salida.
Cuando el indice, que ha empezado valiendo 48 llega a 0 ha tratado toda la cadena.
Más abajo pongo otra versión un poco más compacta y sin comentarios, para los amantes de los sudokus y otros juegos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const numBits = 48;
      sep = ':';                       // Separador de bytes
//----------------------------------------------------------------------------
// funcion BinToHex
// Bastante compacta y bastante comentada
// Admite como entrada un string de numBits (48) caracteres '0' o '1' que
// representan una MAC en formato binario y lo traduce a hexadecimal.
// La seleccion de grupos de 4 bits para cada digito hexadecimal no se hace con
// un bucle for i := 1 to 4... sino haciendo recorrer a la variable peso (peso
// de cada bit) los valores 8, 4, 2 y 1 con lo que la misma variable sirve para
// calcular el valor numerico del digito hex y como contador de los 4 bits.
// Requiere que se haya definido la constante o variable numBits que tiene que
// valer un multiplo de 4.
//----------------------------------------------------------------------------
function BinToHex(sEntrada: string): string;
const DigitosHex = '0123456789ABCDEF';
 
var  numero,                           // Valor numerico como integer de cada numero hex
     peso,                             // factor 1,2,4,8 o peso de cada uno de sus bits
     indice: integer;                  // indice del bit de la cadena de entrada que se esta tratando
begin
                                       // comnprobacion de errores. Prescindible
  if (numBits <= 0) or ((numBits mod 4) <> 0) or (Length(sEntrada) <> numBits) then
  begin
    writeln('ERROR xyz');
    exit;                              // o Goto Label...
  end;
 
  BinToHex := '';
  indice := numBits;                   // Viajamos desde el final hacia el principio
  while indice > 0 do
  begin
    numero := 0;                       // Numero formado por este bit y los tres que estan a la izda.
    peso := 1;                         // Empezamos por el bit mas bajo (mas a la derecha)
    while peso  <= 8 do                // Ciclar el factor o peso 1,2,4,8 segun el bit
    begin
      if sEntrada[indice] = '1' then   // Cuidado. Este es el caracter '1', NO el digito ni el bit 1
        numero := numero + peso        // Añadir el peso segun la posicion del bit a este numero
      else if sEntrada[indice] <> '0' then   // Lo mismo con el '0'
      begin
        writeln('ERROR xyz en la posicion ', indice);
        exit;                          // o Goto Label...
      end;
      peso := peso + peso;             // O peso * 2, o peso shl 1...
                                       // Cosa estética y prescindible. Presentar
                                       // los valores hexadecimales como bytes separados por ':'
      if (indice < numBits) and ((indice mod 8) = 0) then
        BinToHex := Sep + BinToHex;    // Poner el separador que se use
                                       // Bit "indice" tratado. Moverse una posicion a la Izda.
      indice := indice - 1;            // Indice del caracter del string sEntrada que estamos tratando ahora
    end;                               // Hex tratado. Agregarlo al string de salida
                                       // Añadir el hex a la cadena de salida. Por la izaquierda.
    BinToHex := DigitosHex[numero + 1] + BinToHex;
  end;
end;

Si te interesa utilizar este codigo pero hay algo que no entiendes, mandame un mensaje. Intentaré aclarártelo.
He comprobado la rutina con varios ejemplos, incluyendo el que tu propones
Ah, los digitos hexadecimales van hasta la 'F', no hasta la 'D'. Como las teclas 'D' y 'F' están contiguas en el teclado, supongo que el muy cabrito dió un saltito hacia la derecha en el momento que ibas a pulsar la 'F'. No se puede confiar en estos teclados.
Y si alguien quiere utilizar este código para sus aplicaciones, por mí puede hacerlo libremente. Negaré tener cualquier relacion con esta rutina. ;-)
Y ya de paso, aqui pongo otra versión un poco más apretada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const numBits = 48;
      sep = ':';                       // Separador de bytes
 
function BinToHex(sEntrada: string): string;
const DigitosHex: array [0..15] of char = '0123456789ABCDEF';
      pesos: array[0..3] of integer = (1,8,4,2);
 
var  numero,
     indBit,
     indice: integer;
begin
  if (numBits <= 0) or ((numBits mod 4) <> 0) or (Length(sEntrada) <> numBits) then
  begin
    writeln('ERROR xyz');
  end else
  begin
    BinToHex := '';
    numero := 0;
    for indice := numBits downto 1 do
    begin
      indBit := Indice  mod 4;
      if sEntrada[indice] = '1' then
        numero := numero + pesos[indBit];
      else if sEntrada[indice] <> '0' then
      begin
        writeln('ERROR xyz en la posicion ', indice);
        exit;                          // o Goto Label...
      end;
      if (indice < numBits) and ((indice mod 8) = 0) then
        BinToHex := ':' + BinToHex;
      if indBit = 1 then
      begin
        BinToHex := DigitosHex[numero] + BinToHex;
        numero := 0;
      end;
    end;
  end;
end;

Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido 1 puesto en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Dos versiones de BinToHex

Publicado por erick (3 intervenciones) el 18/07/2020 04:42:21
heyyy!!! es increíble lo que pudiste hacer con pascal, me parece genial la complementación con la función que agregaste. Hay algunas cosas que no las vi todavía, son cosas pequeñas, pero me dan pie para aprender mas.
El código compacto que enviaste también me llamo mucho la atención, voy a estudiar bien el proceso y la lógica, me interesa mucho!
Voy a probarlos detenidamente, muchas gracias de nuevo !
Se que es un lenguaje bastante estructurado, pero se puede sacar mucho provecho de su aprendizaje.
Un abrazo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar