Pascal/Turbo Pascal - tp pascal

 
Vista:

tp pascal

Publicado por Hernan1990 (6 intervenciones) el 26/05/2012 23:50:24
Buenas tardes, estoy con un tp de pascal y me quede muy trabado... trata de sacar la informacion de un archivo externo de la pc .txt . En el txt hay escritos numeros separados con un espacio dando a conocer info sobre las secciones(zonas) donde hay laboratorios que analizan bacterias y dan resultado positivo o negativo. En la consigna dice son 5 secciones, cada una con 4 laboratorios, cada una analiza 3 bacterias y obtiene pos o neg,,, cada lab analiza las mismas tres bacterias, osea serian 20 laboratorios en total y cada uno analiza 3 bacterias osea analisis totales son 60 , osea en el txt van a aparecer 60 filas cuyas columnas son 1)n_sec 2)n_lab 3)t_bac (cada lab tiene 1 - 2 -3) 4)rdo (resultado que es positivo o negativo). Me piden armar una matriz 3d, seria como un cubo, que tiene como dimensiones n_sec n_lab y t_bac y cada cuadradito adentro contiene o positivo o negativo...

la pregunta que me hacen es que porcentaje de laboratorios detectaron positivos en la bacteria 1. Mas o menos me doy una idea como hacerlo if t_bac=1 and rdo=positivo then (y hago una funcion para que sume, dsp divido por 20 labs y me da el porcentaje. El tema que no puedo llegar a plantear eso porque tengo mal toda la cargada de matriz...

Aca les dejo como lo fui armando pero da mil errores y todo mal:

program Untitled;

uses crt,dos;

type

datos=record
n_sec,n_lab,t_bac:integer;
rdo:string[4];
end;


M3=array[1..60,1..60,1..60] of integer;

var

rdo:string[4];
mat3d:M3;
arch:text;
n_sec,n_lab,t_bac:integer;

{aca puedo poner un procedure de carga}


begin

assign(arch,'c:\TPO.txt');

reset(arch);

while not eof(arch) do

begin

readln(arch,n_sec,n_lab,t_bac,mat3d[n_suc,n_lab,t_bac].rdo);

writeln(n_sec,n_lab,mat3d);

close(arch);

readkey

end;

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

tp pascal

Publicado por ramon (2158 intervenciones) el 27/05/2012 16:11:38
Disculpa pero te explico la matriz que tu presentas supone unas valores de 60x60x60 = 216000
lo cual no corresponde con los 60 que tu dices eso seria M3 = array[1..5,1..4,1..3] of integer;
lo cual nos daría 5x4x3 = 60 valores, espero sea un error de forma.
En el caso del archivo si es de texto se supone que cada linea corresponde a una sección de la
forma 1ª Sección, 2ª Laboratorio, 3ª bacteria y por ultimo resultado que sera true o false.
con lo cual la linea 1 seria cargada en M3[1,1,1] = resultado, M3[1,1,2] = resultado , y M3[1,1,3] = resultado y así sucesivamente todos los demás esto es cierto o no.
Puedes presentar el contenido del archivo en esta para mejor comprehender y ayudarte.
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

tp pascal

Publicado por Hernan1990 (6 intervenciones) el 27/05/2012 19:24:05
Muchas gracias por la pronta respuesta. Tenes razon en lo que decis, yo lo habia pensado asi pero no sabia bien como iba a hacer para recorrer todas las filas del txt si la primer columna era de 1..5 ... pero claro ahora creo que entiendo: mi txt lo arme asi:
1 1 1 pos
1 1 2 neg
1 1 3 pos
1 2 1 neg
1 2 2 neg
1 2 3 pos
1 3 1 pos
1 3 2 pos
1 3 3 pos
1 4 1 neg
1 4 2 neg
1 4 3 pos
2 5 1 pos
2 5 2 neg
2 5 3 pos
2 6 1 neg
2 6 2 neg
2 6 3 pos
2 7 1 pos
2 7 2 pos
2 7 3 pos
2 8 1 neg
2 8 2 neg
2 8 3 pos
3 9 1 pos
3 9 2 neg
3 9 3 pos
3 10 1 neg
3 10 2 neg
3 10 3 pos
3 11 1 pos
3 11 2 pos
3 11 3 pos
3 12 1 neg
3 12 2 neg
3 12 3 pos
4 13 1 pos
4 13 2 neg
4 13 3 pos
4 14 1 neg
4 14 2 neg
4 14 3 pos
4 15 1 pos
4 15 2 pos
4 15 3 pos
4 16 1 neg
4 16 2 neg
4 16 3 pos
5 17 1 pos
5 17 2 neg
5 17 3 pos
5 18 1 neg
5 18 2 neg
5 18 3 pos
5 19 1 pos
5 19 2 pos
5 19 3 pos
5 20 1 neg
5 20 2 neg
5 20 3 pos

la primer columna seccion la segunda laboratorios 4 por seccion y dsp 3 bacterias por lab y el resultado... ahora bien.. la matriz la deberia hacer mat[i,j,k] con las dimensiones que vos decis 1..5,1..4,1..3 pero dsp no se como vincularlas al resultado pos. Dsp en mi txt que puse ahi ,,, la segunda fila haria referencia a este lugar [1,1,2] , la tercer fila [1,1,3] la cuarta [1,2,1] y asi sucesivamente lo recorre el pascal al txt ??? entonces si me piden que porcentaje de laboratorios dieron positivo en la bacteria 1 deberia evaluar los resultados
for i:=1 to 5 do
for:j:=1 to 4 do
for k:=1 do (asi me analiza solo las bacterias de tipo 1)
(y dsp hago una sumatoria para que cuando de positivo sume 1 y dsp el total de labs los tengo y puedo hallar el porcentaje ) Pero bueno ya no se como vincular esas referencias a positivo y negativo y ya me re marie. Es mi primer tp en pascal y no tengo mucha experiencia y menos con los arrays etcetc.

El tpo dice asi:

Hacer un programa en pascal que lea un archivo externo tipo texto provisto por todos los laboratorios de una ciudad que reciben muestras de agua de la red tomadas en distintos puntos de la ciudad con la siguiente información:
Nº de sección Nº de laboratorio Tipo de bacteria resultado

3 4 1 “positivo”
2 4 2 “negativo”
Etc…

Se sabe que son 4 laboratorios por sección, que son cinco secciones, que toman muestras de 3 tipos distintos de bacterias en cada sección. Todos los laboratorios toman muestras de todas las bacterias.
Se pide armar una matriz 3D con los resultados obtenidos de las muestras y luego indicar:
a) que porcentaje de laboratorios detectaron positivos en la bacteria 1.

Desde ya muchas gracias ramon !
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

tp pascal

Publicado por ramon (2158 intervenciones) el 28/05/2012 15:33:26
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
{Mira este programa te carga tu archivo de texto y toma las posiciones adecuadas a el
 pero ten en cuenta que los números entrados son 1..5, 1..4, 1..3 no mas como veras
 que te lo puse copia con bloc de notas y guarda lo como .txt  y ejecuta el programa
 fíjate en los directorios de nombre y cambia a los tuyos.
 
program trwx;
 uses
   crt;
   const
      nombre = 'c:\tp\bin\mitexto.txt';
   var
     datos : array[1..5,1..4,1..3] of boolean;
     f : text;
     x, y, di, cl : integer;
     prim, segun, terc : integer;
     esta : string[3];
 
   function stringinteger(sa : char) : integer;
   var
     gi : string[2];
     error, ac : integer;
   begin
       gi[1] := sa;
       gi[0] := chr(1);
       val(gi,ac,error);
       if error > 0 then
       begin
          delete(gi,error,1);
          val(gi,ac,error);
       end;
         stringinteger := ac;
   end;
 
   procedure limpiamatriz;
   var
     u, i, w : integer;
   begin
       for u := 1 to 5 do
        for i := 1 to 4 do
          for w := 1 to 3 do
          datos[u,i,w] := false;
   end;
 
   procedure lee_assigna;
   var
     lin : string[15];
     como : boolean;
   begin
      assign(f,nombre);
   {$I-} reset(f); {$I+}
   if ioresult <> 0 then
   begin
      writeln('El archivo no existe pulse [enter]');
      readln;
      halt(1);
   end
 else
    begin
       di := 1;
       while not Eof(f) do
       begin
          readln(f,lin);
          for cl := 1 to length(lin) do
          begin
          if lin[cl] = ' ' then
          begin
              delete(lin,cl,1);
          end
        end;
          esta := copy(lin,length(lin) - 2,3);
           prim := stringinteger(lin[1]);
          segun := stringinteger(lin[2]);
           terc := stringinteger(lin[3]);
          if esta = 'pos' then
          como := true
        else
          como := false;
          datos[prim,segun,terc] := como;
       end;
       close(f);
    end;
   end;
 
  begin
      clrscr;
      limpiamatriz;
      lee_assigna;
      x := 1;
      y := 1;
      for prim := 1 to 5 do
        for segun := 1 to 4 do
          for terc := 1 to 3 do
          begin
             gotoxy(x,y);write(datos[prim,segun,terc]);
             x := x + 6;
             if x > 73 then
             begin
             y := y + 2;
             x := 1;
             end;
          end;
      readln;
  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

tp pascal

Publicado por ramon (2158 intervenciones) el 28/05/2012 15:35:22
{El archivo de testo queda así.}

1 1 1 pos
1 1 2 neg
1 1 3 pos
1 2 1 neg
1 2 2 neg
1 2 3 pos
1 3 1 pos
1 3 2 pos
1 3 3 pos
1 4 1 neg
1 4 2 neg
1 4 3 pos
2 1 1 pos
2 1 2 neg
2 1 3 pos
2 2 1 neg
2 2 2 neg
2 2 3 pos
2 3 1 pos
2 3 2 pos
2 3 3 pos
2 4 1 neg
2 4 2 neg
2 4 3 pos
3 1 1 pos
3 1 2 neg
3 1 3 pos
3 2 1 neg
3 2 2 neg
3 2 3 pos
3 3 1 pos
3 3 2 pos
3 3 3 pos
3 4 1 neg
3 4 2 neg
3 4 3 pos
4 1 1 pos
4 1 2 neg
4 1 3 pos
4 2 1 neg
4 2 2 neg
4 2 3 pos
4 3 1 pos
4 3 2 pos
4 3 3 pos
4 4 1 neg
4 4 2 neg
4 4 3 pos
5 1 1 pos
5 1 2 neg
5 1 3 pos
5 2 1 neg
5 2 2 neg
5 2 3 pos
5 3 1 pos
5 3 2 pos
5 3 3 pos
5 4 1 neg
5 4 2 neg
5 4 3 pos
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

tp pascal

Publicado por Hernan1990 (6 intervenciones) el 29/05/2012 04:26:01
Antes que nada muchisimas gracias por tomarte el tiempo y simplificarme bastante el practico. Igualmente lo que vos escribiste es mucho mas complejo que lo que me piden creo... todo lo de length(lin) y lo de stringinteger no tengo idea para que esta ni lo habiamos visto en clase. Para responder al punto a) del practico hice unos ajustes al final pero siempre me toma cont como 1 , el contador no aumenta cuando va encontrando nuevos true. Por eso el porcentaje me toma como 5. Hay 20 labs y me toma el cont como 1. El cont creo que deberia dar 10 y el porcentaje 50. Se podra hacer algo para sacar todos los ceros decimales que quedan luego de ejecutar ?, .

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
program trwx;
 uses
   crt;
   const
      nombre = 'c:\tp\bin\mitexto.txt';
   var
     datos : array[1..5,1..4,1..3] of boolean;
     f : text;
     x, y, cl : integer;
     prim, segun, terc : integer;
     esta : string[3];
     cont: integer;
     porcentaje: real;
 
   function stringinteger(sa : char) : integer;
   var
     gi : string[2];
     error, ac : integer;
   begin
       gi[1] := sa;
       gi[0] := chr(1);
       val(gi,ac,error);
       if error > 0 then
       begin
          delete(gi,error,1);
          val(gi,ac,error);
       end;
         stringinteger := ac;
   end;
 
   procedure limpiamatriz;
   var
     u, i, w : integer;
   begin
       for u := 1 to 5 do
        for i := 1 to 4 do
          for w := 1 to 3 do
          datos[u,i,w] := false;
   end;
 
   procedure lee_assigna;
   var
     lin : string[15];
     como : boolean;
   begin
      assign(f,nombre);
      reset(f);
       begin
       while not Eof(f) do
       begin
          readln(f,lin);
          for cl := 1 to length(lin) do
          begin
          if lin[cl] = ' ' then
          begin
              delete(lin,cl,1);
          end
        end;
          esta := copy(lin,length(lin) - 2,3);
           prim := stringinteger(lin[1]);
          segun := stringinteger(lin[2]);
           terc := stringinteger(lin[3]);
          if esta = 'pos' then
          como := true
        else
          como := false;
          datos[prim,segun,terc] := como;
       end;
       close(f);
    end;
   end;
 
  begin
      clrscr;
      limpiamatriz;
      lee_assigna;
       cont:=1;
      for prim := 1 to 5 do
        for segun := 1 to 4 do
          for terc := 1 to 1 do     {limito a uno para que solo analice
                                      las bacterias tipo 1}
          begin
             if datos[prim,segun,terc]= true then
             cont := cont + 0 ;  {quiero hacer un ciclo para que me cuente los
                                  resultados positivos (true) de la bac 1 }
 
            end;
 
            porcentaje:= cont*100/20; {20 son los labs}
 
 
            writeln('la respuesta al punto a es  ',porcentaje);
 
      readln;
  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

tp pascal

Publicado por ramon (2158 intervenciones) el 29/05/2012 12:19:07
{Primero aclaración, [ length(lin) es comando pascal que nos informa de la longitud de la
cadena [lin] para poderla leer.
La parte o function [function stringinteger(sa : char) : integer;] convierte el carácter a integer.
Lo del contador [cont] que siempre es 0 es normal puesto que tienes puesto que lo sea
me explico cont := cont + 0 ; esto que pones sera siempre 0 puesto que 0 + 0 = 0.
Tendrías que poner cont := cont + 1; que incrementara cont en 1 en cada pasada.
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

tp pascal

Publicado por Hernan1990 (6 intervenciones) el 30/05/2012 01:27:22
Entiendo lo que decis, asi y todo poniendo :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cont:=0;
      for prim := 1 to 5 do
        for segun := 1 to 4 do
          for terc := 1 to 1 do
          begin
             if datos[prim,segun,terc]= true then
 
             cont := cont + 1 ;
 
            end;
 
            porcentaje:= cont*100 div 20; {20 son los labs}
 
            writeln('la respuesta al punto a es  ',porcentaje);

me sigue dando 5% , como que no aumenta el valor del cont... no se si el error esta en como escribi el for de la terc :=1 to 1 ... yo queria poner que siempre valga 1 , para que analice bacteria 1 , creo que esta bien... no se me ocurre donde esta el error...
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

tp pascal

Publicado por ramon (2158 intervenciones) el 30/05/2012 22:14:29
1
2
3
4
5
{Fíjate en los for el ultimo es de 1 a 3 no de 1 a 1}
 
 for prim := 1 to 5 do
        for segun := 1 to 4 do
          for terc := 1 to 1 do
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

tp pascal

Publicado por Hernan1990 (6 intervenciones) el 31/05/2012 00:38:56
Pero lo puse de 1 a 1 la tercer columna porque es el tipo de bacteria y el enunciado punto a me piden que indique en que casos el tipo de bacteria 1 es positivo osea el resto cuando es 2 o 3 no me importa. Unicamente me tengo q fijar que sea uno terc (t_bac) .
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

tp pascal

Publicado por Hernan1990 (6 intervenciones) el 31/05/2012 02:57:01
Ramon, muchisimas gracias por tu ayuda estos dias. Ahi termine el punto a) que a continuacion te muestro como resolvi la duda del comentario anterior. El TPO tiene hasta el punto f creo pero ahora ya estoy mucho mas encaminado.

program Untitled;

uses
crt,dos;
const
nombre = 'c:\TPO1.txt';
type
M3D = array[1..5,1..4,1..3] of byte;

var
MAT:M3D;
i,j : byte;
arch : text;
cont: integer;
porcentaje: integer;



procedure blanqueomat;

var
i,j,k : byte;

begin
for i:=1 to 5 do
for j:=1 to 4 do
for k:=1 to 3 do
MAT[i,j,k]:= 0;

end;

procedure cargadatos;

var
n_sec, n_lab, t_bac, rdo: byte;

begin

assign(arch, nombre);
reset(arch);

while not eof(arch) do
begin
readln(arch, n_sec, n_lab, t_bac, rdo);
MAT[n_sec, n_lab, t_bac] := rdo;
end;

end;

function puntoa : integer;

begin

cont:=0;
for i := 1 to 5 do
for j := 1 to 4 do
if MAT[i,j,1] = 1 then {uso 0 negativo y 1 positivo}
cont := cont + 1 ;


porcentaje := cont*100 div 20; {20 son los labs}
writeln('la respuesta al punto a es ', porcentaje);

end;

begin

blanqueomat;
cargadatos;
puntoa;

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

tp pascal

Publicado por ramon (2158 intervenciones) el 31/05/2012 17:02:40
{Correcto corresponde al 45% de laboratorios.
Con poner a 1 o 0 es lo mismo que false o true pero esta bien}
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