Pascal/Turbo Pascal - El programa se ejecuta pero luego deja de funcionar

 
Vista:
sin imagen de perfil

El programa se ejecuta pero luego deja de funcionar

Publicado por Damián (1 intervención) el 29/07/2021 03:19:51
Buenas, soy estudiante y estoy haciendo un taller de pascal, con mis compañeros hicimos este codigo que aparentemente no tiene ningun error, pero cuando se ejecuta y se ingresa el codigo el programa se cierra. No logramos comprender a que se debe. Como es la primera vez que programamos seguro que estamos haciendo muchas cosas mal. Dejo la consigna y el codigo.

La empresa que comercializa articulos para la construccion SRL desea obtener un infrome de sus materiales para contruccion guardados en antiguas secuencias.Por ello se le pide a usted que realice un programa en pascal que permita solucionar su problema.
Cuentan con una secuencia de caracteres que contiene el codigo del material (5 caracteres), un caracter que indica su tecnologia ('B', 'L', 'P', 'F'), el nombre clave del mismo (finaliza con #, maximo de 30 caracteres) la cantidad que se posee (3 digitos) y su estado (100 caracteres, con espacios en blancos en caso de que sobren).

Se pide:

. Generar una secuencia de salida que contenga los materiales de tecnologia 'L' y 'F'.
Incluir su nombre clave y cantidad.
. Informar por pantalla la cantidad de los diferentes materiales de cada tipo de tecnologia.
. Generar un archivo de salida con los nombres clave, cantidad y estado de los materiales de tipo 'L' con codigo igual a uno ingresado por el usuario.

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
program Materiales;
uses crt;
 
type
	RegSal = record
		Nomb: string[31];
		Cant: string[4];
		Est: string[101];
	end;
 
 
 
const
	Tec= ['L', 'F', 'P', 'B'];
	Tec1= ['L', 'F'];
var
	Sec1: file of char; 				// secuencia de entrada
	v: char;
	i: integer;
	Sal: file of char;    				// secuencia de salida
 
	CdUs: integer;
	CdUs_1, CdUs_2, CdUs_3, CdUs_4, CdUs_5: integer;
 
	Res_1, Res_2, Res_3, Res_4, Res_5: integer;
 
	contB, contL, contP, contF: integer;
 
	Nom: string[31];
	Can: string[4];
	Es: string[101];
 
	ArchSal: file of RegSal;
	Arch: RegSal;
 
 
 
	function chartoint(n:char):integer;
	begin
		case (n) of
	       	'1': exit(1);
	       	'2': exit(2);
	       	'3': exit(3);
	       	'4': exit(4);
	       	'5': exit(5);
	       	'6': exit(6);
	       	'7': exit(7);
	       	'8': exit(8);
	       	'9': exit(9);
	       	'0': exit(0);
		end;
	end;
 
 
	begin
 
 
 
     	assign(Sec1,'D:\TrabajoPascal\Datos\SecuenciaEntrada.txt');
 		{$I-}
    	reset(Sec1);
 		{$I+}
 
 		assign(Sal,'D:\TrabajoPascal\Datos\SecuenciaSalida.txt');
 		{$I-}
    	rewrite(Sal);
 		{$I+}
 
 		assign(ArchSal,'D:\TrabajoPascal\Datos\ArchivoSalida.dat');
 		{$I-}
    	rewrite(ArchSal);
 		{$I+}
 
 
 
 
		writeln ('Ingrese el codigo del material para generar el archivo');
		readln (CdUs);
 
		CdUs_1:= CdUs DIV 10000;
		CdUs_2:= CdUs DIV 1000 MOD 10;
		CdUs_3:= CdUs DIV 100 MOD 10;
		CdUs_4:= CdUs DIV 10 MOD 10;
		CdUs_5:= CdUs mod 10;
 
		Nom:=' ';
		Can:=' ';
		Es:=' ';
 
 
		contB:= 0;
		contL:= 0;
		contP:= 0;
		contF:= 0;
 
		while not EOF(Sec1) do
		begin
			read(Sec1, v);
			read(ArchSal, Arch);
 
			Res_1:=chartoint(v);
			read(Sec1, v);
			Res_2:=chartoint(v);
			read(Sec1, v);
			Res_3:=chartoint(v);
			read(Sec1, v);
			Res_4:=chartoint(v);
			read(Sec1, v);
			Res_5:=chartoint(v);
			read(Sec1, v);
 
			if (Res_1 = CdUs_1) and (Res_2 = CdUs_2) and (Res_3 = CdUs_3) and (Res_4 = CdUs_4) and (Res_5 = CdUs_5) and (v = 'L') then
			begin
				ContL:= ContL + 1;
				read(Sec1, v);
				while v <> '#' do
				begin
					Nom:= Nom + v;
					write(Sal, v);
					read(Sec1, v);
				end;
				write(Arch.Nomb, Nom);
				write(Sal, '#');
				for i:= 1 to 3 do
				begin
					Can:= Can + v;
					write(Sal, v);
					read(Sec1, v);
				end;
				write(Arch.Cant, Can);
				write(Sal, '_');
				for i:= 1 to 100 do
				begin
					Es:= Es + v;
					read(Sec1, v);
				end;
				write(Arch.Est, Es);
			end;
			if v in Tec then
			begin
				case v of
					'L': ContL:= ContL + 1;
					'F': ContF:= ContF + 1;
					'B': ContB:= ContB + 1;
					'P': ContP:= ContP + 1;
				end;
				if v in Tec1 then
				begin
					read(Sec1, v);
					while v <> '#' do
					begin
						write(Sal, v);
						read(Sec1, v);
					end;
					write(Sal, '#');
					for i:= 1 to 3 do
					begin
						write(Sec1, v);
						read(Sec1, v);
					end;
					write(Sal, '_');         // Graba marca para separar los materiales
				end
				else
				begin
					while v<>'#' do
					begin
						read(Sec1, v);
					end;
					for i:= 1 to 103 do
					begin
						read(Sec1, v);
					end;
				end;
			end;
 
		end;
		Close(ArchSal);
		Close(Sec1);
		Close(Sal);
		write('La cantidad de materiales de cada tecnologia son los siguientes:');
		writeln('L: ', ContL);
		writeln('F: ', ContF);
		writeln('B: ', ContB);
		writeln('P: ', ContP);
		readkey;
	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

El programa se ejecuta pero luego deja de funcionar

Publicado por ramon (2158 intervenciones) el 01/08/2021 11:41:49
tu programa corregido.

program Materiales;
uses crt;

type
RegSal = record
Nomb: string[31];
Cant: string[4];
Est: string[101];
end;



const
Tec= ['L', 'F', 'P', 'B'];
Tec1= ['L', 'F'];
var
Sec1: file of char; {// secuencia de entrada }
v: char;
i: integer;
Sal: file of char; {// secuencia de salida}
ch : char;
CdUs: integer;
CdUs_1, CdUs_2, CdUs_3, CdUs_4, CdUs_5: integer;

Res_1, Res_2, Res_3, Res_4, Res_5: integer;

contB, contL, contP, contF: integer;

Nom: string[31];
Can: string[4];
Es: string[101];

ArchSal: file of RegSal;
Arch: RegSal;



function chartoint(n:char):integer;
begin
case (n) of
'1': exit;
'2': exit;
'3': exit;
'4': exit;
'5': exit;
'6': exit;
'7': exit;
'8': exit;
'9': exit;
'0': exit;
end;
end;


begin

clrscr;

assign(Sec1,'SecuenciaEntrada.txt');

{$I-} reset(Sec1); {$I+}
if ioresult <> 0 then
begin
writeln('el Archivo No Existe O Esta Da¤ado ');
readkey;
exit;
end;


assign(Sal,'SecuenciaSalida.txt');

rewrite(Sal);

assign(ArchSal,'ArchivoSalida.dat');

rewrite(ArchSal);





write('Ingrese el codigo del material para generar el archivo : ');
readln(CdUs);

CdUs_1:= CdUs DIV 10000;
CdUs_2:= CdUs DIV 1000 MOD 10;
CdUs_3:= CdUs DIV 100 MOD 10;
CdUs_4:= CdUs DIV 10 MOD 10;
CdUs_5:= CdUs mod 10;

Nom:=' ';
Can:=' ';
Es:=' ';


contB:= 0;
contL:= 0;
contP:= 0;
contF:= 0;

while not EOF(Sec1) do
begin
read(Sec1, v);
read(ArchSal, Arch);

Res_1:=chartoint(v);
read(Sec1, v);
Res_2:=chartoint(v);
read(Sec1, v);
Res_3:=chartoint(v);
read(Sec1, v);
Res_4:=chartoint(v);
read(Sec1, v);
Res_5:=chartoint(v);
read(Sec1, v);

if (Res_1 = CdUs_1) and (Res_2 = CdUs_2) and (Res_3 = CdUs_3) and (Res_4 = CdUs_4) and (Res_5 = CdUs_5) and (v = 'L') then
begin
ContL:= ContL + 1;
read(Sec1, v);
while v <> '#' do
begin
Nom:= Nom + v;
write(Sal, v);
read(Sec1, v);
end;
write(Arch.Nomb, Nom);

ch := '#';
write(Sal, ch);
for i:= 1 to 3 do
begin
Can:= Can + v;
write(Sal, v);
read(Sec1, v);
end;
write(Arch.Cant, Can);
ch := '-';
write(Sal, ch);
for i:= 1 to 100 do
begin
Es:= Es + v;
read(Sec1, v);
end;
write(Arch.Est, Es);
end;
if v in Tec then
begin
case v of
'L': ContL:= ContL + 1;
'F': ContF:= ContF + 1;
'B': ContB:= ContB + 1;
'P': ContP:= ContP + 1;
end;
if v in Tec1 then
begin
read(Sec1, v);
while v <> '#' do
begin
write(Sal, v);
read(Sec1, v);
end;
ch := '#';
write(Sal, ch);
for i:= 1 to 3 do
begin
write(Sec1, v);
read(Sec1, v);
end;
ch := '_';
write(Sal, ch); { // Graba marca para separar los materiales}
end
else
begin
while v<>'#' do
begin
read(Sec1, v);
end;
for i:= 1 to 103 do
begin
read(Sec1, v);
end;
end;
end;

end;
Close(ArchSal);
Close(Sec1);
Close(Sal);
write('La cantidad de materiales de cada tecnologia son los siguientes:');
writeln('L: ', ContL);
writeln('F: ', ContF);
writeln('B: ', ContB);
writeln('P: ', ContP);
readkey;
end.
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