Pascal/Turbo Pascal - Hola necesitaria ayuda, no me inicia ninguna variable y estoy muy estresado

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

Hola necesitaria ayuda, no me inicia ninguna variable y estoy muy estresado

Publicado por Juan Cruz (1 intervención) el 25/06/2020 20:52:52
Hola necesitaria ayuda, no me inicia ninguna variable y estoy muy estresado
Este es el programa


Program programamedico;
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
// Santiago Berrios, Dante Denegri y Juan Cruz Bonanno
Uses crt;
 
Const
  s = 20;
  e = 10;
  sine = 6;
  n = 23;
  L = 20;
Type
  vecSint = Array [1..s] Of String;
  vec = Array [1..n] Of String;
  vec1 = Array [1..L] Of String;
  mat = Array [1..e,1..sine] Of String;
Var
  CS: mat;
  SE: mat;
  sinT: vecSint;
  codS: vecSint;
  cp: vec;
  opcion: Char;
  ef,es,i,cont,conts,j,N1,N2,contador: Integer;
  lista: vec;
  aux: String;
  ordenado: Boolean;
  V: vec;
  Bar: vec1;
 
Procedure CargarPROV(Var bar:vec1);
Begin
  For i :=1 To n Do
    Readln (V[i]);
End;
 
Procedure MostrarPROV(c:vec1);
Begin
  For i :=1 To n Do
    Writeln (c[i]);
End;
Procedure ordenarPROV(Var bar:vec1);
Begin
  For i := 1 To 20-1 Do
    For j := i+1 To n Do
      If bar[i]> bar[j]
        Then
        Begin
          aux := bar[i];
          bar[i] := bar[j];
          bar[j] := aux;
        End
End;
Procedure CargarCOD(Var V:vec);
Begin
  For i :=1 To n Do
    Readln (V[i]);
End;
 
Procedure MostrarCOD(S:vec);
Begin
  For i :=1 To n Do
    Writeln (S[i]);
End;
Procedure ordenarCOD(Var V:vec);
Begin
  For i := 1 To n-1 Do
    For j := i+1 To n Do
      If v[i]> v[j]
        Then
        Begin
          aux := V[i];
          V[i] := V[j];
          V[j] := aux;
        End
End;
 
Procedure cargaE(x:String;Var m:mat);
Begin
  Writeln(' Ingrese los codigos: ', X);
  For ef:= 1 To e Do
    Begin
      Writeln('Ingrese los sintomas de cada codigo: ',ef);
      For es:= 1 To sine Do
        Readln(m[ef,es]);
    End;
  Writeln();
End;
Procedure cargaS( Var s:vecSint ; Var cs:vecSint);
Begin
  i := 0;
  Repeat
    Writeln('Ingresar los sintomas');
    Readln(s[i]);
    Writeln('Ingrese su codigo');
    Readln(cs[i]);
    i := i + 1;
  Until (i = 20) Or (s[i]= '*')
End;
Begin
  Repeat
    Clrscr;
    textcolor(2);
    Writeln('--------Menu Principal---------');
    Writeln('-------1-Provincias--------');
    Writeln('-------2-Sintomas --------');
    Writeln('-------3-Enfermedades--------');
    Writeln('-------4-Pacientes--------');
    Writeln('-------5-Historia Clinicas--------');
    Writeln('-------6-Estadisticas--------');
    Writeln('-------7-Salir--------');
    Readln(opcion);
    Case opcion Of
      '1':Begin
           Begin
             Writeln('Ingrese los codigos de la provincia');
             cargarCOD(V);
             Writeln('arreglo sin ordenar');
             mostrarCOD(v);
             Writeln('arreglo ordenado');
             ordenarCOD(V);
             mostrarCOD(V);
						 END;
						 Begin
             Writeln('Ingrese lOS nombres de la provincia');
             cargarPROV(bar);
             Writeln('arreglo sin ordenar');
             mostrarPROV(bar);
             Writeln('arreglo ordenado');
             ordenarprov(bar);
             mostrarPROV(bar);
             Readkey
           End;
					 END;
      '2':
           Begin
             Writeln ('Sintomas');
             cargaS(sinT,codS);
             Readln();
           End;
      '3':
           Begin
             Writeln ('Enfermedades');
             cargaE ('CS',CS);
             cargaE ('SE',SE);
           End;
      '4': Writeln ('Pacientes');
      '5': Writeln ('EN EJECUCION');
      '6': Writeln ('EN EJECUCION');
    End;
    Readkey;
  Until opcion = '7';
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

Algunas correcciones

Publicado por juanba (40 intervenciones) el 26/06/2020 10:32:50
Buenos días. Ha llegado la respuesta a tus plegarias.
Pero antes algunos consejos comerciales:
- Algunos no llevamos dias construyendo tu programa y no sabemos qué es lo que pretende hacer. Una breve explicación nos podría, por ejemplo ahorrar un viaje a Wikipedia para comprobar que Argentina está dividida en 23 provincias más la capital.
Claro que siempre viene bien pasear por Wikipedia. Yo, por ejemplo no sabía que hay una provincia llamada Chutbut. Creo que no aparece en la literatura de Borges, que esa sí me la he leido.
- Usar identificadores un poco más significativos también ayuda. Por ejemplo "const NumProvincias = 23" es más explícito que "const n = 23". Al fin y al cabo un prograna debe ser leido y comprendido por el programador. Al compilador le da lo mismo un identificador que otro. Cuesta más trabajo escribir nombres tan largos pero a la hora de depurar, corregir o modificar un programa se ve que vale la pena.

Y ahora vamos a examinar tu programa:
Está compuesto de 8 procedimientos y un programa principal.
Las declaraciones de constantes, tipos y variables son tan poco claras que aun no he conseguido saber qué significan
nombres como L, bar, N1, N2... Además, según mi compilador hay ocho (8) variables que no se usan.

El primer procedimiento (CargarPROV) hace algo sorprendente: pasa como parámetro una variable "bar" de tipo "vecl". Y luego carga los datos sobre otra variable (global) "V" de tipo "vec".

No sé qué significan "bar", "V", "vec" ¿vector? ni "vec1" pero si sé que leer 23 valores en un vector que solo tiene espacio para
20, puede llevar al desastre. Tendrás que decidir si llenar V desde 1 hasta L o llenar bar desde 1 hasta n.

El siguiente procedimiento, MostrarPROV se porta mejor en cuanto que llena el vector pasado por parametro pero también tiene el fallo de encajar 23 datos donde solo caben 20.
Por cierto, este es el que vuelve loco al programa.

El siguiente procedimiento, ordenarPROV, parece ser un algoritmo de ordenacion por burbuja y también aqui hay dos bucles For, uno de los cuales procesa vectores de 20 elementos y el otro de 23.
Además, para mayor variedad, el limite de 20 esta expresado con un literal que probablemente corresponde a la constante L.

A los procedimientos CargarCod, MostrarCOD y OrdenarCOD no les veo ningún problema.
A los procedimientos cargaE, cargaS no les veo ningún problema sintáctico.
¿Has notado que cargaE obliga a introducir 60 datos seguidos y que eso es bastante aburrido?
Además cargaE es llamado dos veces seguidas en el programa principal, lo que hace 120 datos sin parar.
Como suceda el fin de jornada cuando vas por el sintoma 4 de la enfermedad 7 de puedes acordar de todos los parientes del programador.
cargaS tiene un problema lógico. Creo que has previsto que se pueda detener la entrada de datos poniendo '*' como sintoma. Pero la comprobacion de fin de bucle la haces despues de incrementar la variable i, con lo que realmente consultas es el siguiente elemento del array, que aun no esta definido. Si he interpretado bien tu proposito, la rutina deberia ser algo asi como:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Procedure cargaS( Var s:vecSint ; Var cs:vecSint);
Begin
  i := 0;
  Repeat
    Writeln('Ingresar los sintomas');
    Readln(s[i]);
    if s[i] <> '*' then
    begin
      Writeln('Ingrese su codigo');
      Readln(cs[i]);
      i := i + 1;
    end;
  Until (i = 20) Or (s[i]= '*')
End;

Quedarían algunas cosas que decir sobre la estructura del programa, sobre todo si hay alguna intención usarlo en modo profesional, pero creo que no es ese el objetivo del post. De todos modos, cuando no estés estresado puedes considerar:
- Si las variables i, j y aux fueran locales, el programa se sentiría más cómodo. No conviene que las variables sean visibles fuera del ámbito en que se usan.
- Si la carga de síntomas por enfermedad (cargaE) estuviera provista de un submenu que pidiera el codigo de enfermedad y permitiera inrtoducir / modificar exclusivamente los sintomas de una enfermedad, el programa y el usuario se sentirían más cómodos.
- Si las reglas de nomenclatura de identificadores fueran consistentes, sería más fácil comprender el programa. Por ejemplo, declarar Bar con B mayúscula y luego utilizarla como bar es correcto, pero confuso.
- Si los identificadores significan algo, mejor aún. Por ejemplo MatDeSintPorEnf hace pensar en "Matriz de Sintomas por Enfermedad" pero mat puede sugerir matriz, matemáticas, mate ...
- Lo mismo para los textos que aparecen en pantalla: si en lugar de "Ingrese los sintomas" pone "Ingrese los sintomas. Teclee * (asterisco) para terminar" el usuario puede no quedarse mirando la pantalla cuando ejecute esta opcion con una lista de solo cinco sintomas en lugar de veinte.

Aqui envío modificada la primera parte del programa, lo suficiente para que funcione de acuerdo con lo que se supone debe de hacer.

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
Const
  s = 20;
  e = 10;
  sine = 6;
  n = 23;
//  L = 20;                             // No es necesario en esta adaptacion
Type
  vecSint = Array [1..s] Of String;
  vec = Array [1..n] Of String;
//  vec1 = Array [1..L] Of String;      // No lo uso
  mat = Array [1..e,1..sine] Of String;
Var
  CS: mat;
  SE: mat;
  sinT: vecSint;
  codS: vecSint;
  cp: vec;
  opcion: Char;
  ef,es,i,j: Integer;
  aux: String;
  V: vec;
  Bar: vec;
 
Procedure CargarPROV(Var bar:vec);   //vec1
Begin
  For i :=1 To n Do
//  Readln (V[i]);
    Readln(bar[i]);
End;
 
Procedure MostrarPROV(c:vec);    //vec1
Begin
  For i :=1 To n Do
  Writeln (c[i]);
End;
 
Procedure ordenarPROV(Var bar:vec);    //vec1
Begin
//  For i := 1 To 20-1 Do
  For i := 1 To n-1 Do
    For j := i+1 To n Do
      If bar[i]> bar[j] Then
      Begin
        aux := bar[i];
        bar[i] := bar[j];
        bar[j] := aux;
      End
End;

Perdona si he introducido correcciones que no son consistentes con tu estilo de escritura. Tengo la costumbre de escribir las palabras reservadas en minúsculas. Los textos sustituidos han quedado como texto comentado.
Buena suerte. Y si hay más problemas, comentalos en el foro.
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