Pascal/Turbo Pascal - Matriz MCCUD

 
Vista:
sin imagen de perfil

Matriz MCCUD

Publicado por user (11 intervenciones) el 27/11/2013 18:50:32
Hola a todos!! haber si pudieses guiarme un poco con este ejercicio que me trae de calle :s muchisimas gracias!!!
Una matriz cuadrada de enteros se define como de “máximos crecientes continuos y uniformemente
distribuidos” (MCCUD) si cumple:
1. Todos los valores de una fila son distintos entre sí.
2. max_fila_1 < max_fila_2 < max_fila_3 < ...< max_final_N donde, max_fila_i, representa el mayor
valor entero encontrado en la fila i-ésima de la matriz.
3. \/ i, (max_fila_i+1 – max_fila_i = constante), es decir, la diferencia entre los máximos de dos filas
consecutivas es constante.
4. En cada columna de la matriz sólo puede aparecer el valor máximo de una de las filas.
En la figura se muestra una matriz MCCUD.
http://gyazo.com/c7e86d34a101bb7c4762ddde75c6cd35
Se pide codificar el programa mccud.pas en Pascal que pida la dimensión de la matriz por teclado,
aceptando como máximo matrices de hasta dimensión 10, pida los valores de sus elementos también
por teclado y determine si es MCCUD. Es muy recomendable la utilización de procedimientos y
funciones para la realización de esta práctica. En particular, podrían definirse procedimientos y funciones
para realizar la verificación de las condiciones.
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

Matriz MCCUD

Publicado por ramon (2158 intervenciones) el 29/11/2013 14:03:48
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
{Esto podía ser útil}
 
program matrizmccud;
 uses
    crt;
  const
      max = 10;
      pruev : array[1..4,1..4] of integer = (
      (5,6,2,-4),
      (6,-7,8,3),
      (10,4,-5,9),
      (4,-7,1,12));
 
  type
     matriz = array[1..max,1..max] of integer;
 
   var
     lamazt : matriz;
     laganch : integer;
     x, y : integer;
     maxfilg : array[1..max] of integer;
     constant : integer;
     tru : boolean;
 
   function filasondistintos(cual : integer) : boolean;
   var
     son : boolean;
     tu, nu, cu : integer;
   begin
      son := false;
      for cu := 1 to laganch do
      begin
        nu := lamazt[cual, cu];
        for tu := laganch downto cu + 1 do
        begin
        if nu = lamazt[cual, tu] then
         son := true;
         end;
       end;
       filasondistintos := son;
     end;
 
   function maximosfilas(dd : matriz) : boolean;
   var
     es : boolean;
     maxfi : array[1..max,1..max] of integer;
     n, tt, ma, cs : integer;
   begin
       fillchar(maxfi,sizeof(maxfi),0);
       for tt := 1 to laganch do
       begin
         n := lamazt[1,tt];
         ma := 1;
         for cs := 1 to laganch do
         begin
            if n < lamazt[cs,tt] then
            begin
            n := lamazt[cs,tt];
            ma := cs;
            end;
         end;
          maxfi[tt,ma] := n;
        end;
        n := 0;
        constant := 0;
        for tt := 1 to laganch do
        begin
         ma := 0;
         for cs := 1 to laganch do
         begin
            if maxfi[tt,cs] <> 0 then
            begin
            ma := ma + 1;
            if n = 0 then
            constant :=  maxfi[tt,cs];
            n := n + 1;
            if n = 2 then
            begin
               if constant > maxfi[tt,cs] then
               constant := constant - maxfi[tt,cs]
             else
               constant := maxfi[tt,cs] - constant;
               constant := 0;
               n := 0;
            end;
          end;
         end;
         if ma > 1 then
         begin
            es := true;
            break;
         end
       else
         if ma = 1 then
         es := false;
       end;
       maximosfilas := es;
       write('  ');
   end;
 
  procedure entredatos;
  var
    dd, mu, nn, tama : integer;
  begin
      clrscr;
      writeln(' ****** Entrada Numeros Matriz ******');
      writeln;
      write('   Entre Tama¤o Matriz Max 10 : ');
      readln(tama);
      laganch := (max - max + tama);
      nn := 1;
    repeat
        for dd := 1 to laganch do
        begin
        write('  Num.[',nn,'|',dd,'] : ');
        readln(mu);
        lamazt[nn,dd] := mu;
        end;
        nn := nn + 1;
    until nn > laganch;
  end;
 
   procedure cargaprueva(var dh : matriz);
   var
      cx, cy : integer;
   begin
      for cy := 1 to laganch do
        for cx := 1 to laganch do
        dh[cx,cy] := pruev[cx,cy];
   end;
 
  procedure resuelve(nnp : matriz);
  begin
     writeln('  **** La Matriz Cargada Es ****');
      writeln;
      for y := 1 to laganch do
      begin
        for x := 1 to laganch do
        begin
        write('  ',nnp[y,x]);
        end;
        writeln;
       end;
       writeln;
      for y := 1 to laganch do
      begin
        if filasondistintos(y) = true then
        begin
           tru := true;
        end
      else
         tru := false;
       if tru = true then
       break;
      end;
      if (tru = false) and (maximosfilas(nnp) = false) then
      begin
         writeln('**** La Matriz Si Es MCCUD ****');
      end
   else
      begin
         writeln('**** La Matriz No Es MCCUD ****');
      end;
      writeln;
      writeln('  <<<< Pulse Una Tecla >>>>>');
      readkey;
  end;
 
  procedure menu;
  var
   sal : boolean;
   tec : char;
   begin
      sal := false;
    repeat
       clrscr;
       writeln('**** Menu Jeneral ****');
       writeln;
       writeln('   1 = Entrada Datos Manual');
       writeln('   2 = Ejecutar Ejemplo');
       writeln('   3 = Salir');
       writeln;
       writeln('<<<< Elija Opcion >>>>');
       repeat
           tec := readkey;
       until tec in['1','2','3'];
       clrscr;
   case tec of
 '1' : begin entredatos; resuelve(lamazt); end;
 '2' : begin cargaprueva(lamazt); resuelve(lamazt); end;
 '3' : sal := true;
   end;
    until sal = true;
 end;
 
   begin
      clrscr;
      tru := false;
      laganch := 4;
      menu;
   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
sin imagen de perfil

Matriz MCCUD

Publicado por Diego (11 intervenciones) el 29/11/2013 17:02:37
muchisimas gracias ramon!!! menudo programaco XDD ahora voy a repasarlo para entenderlo todo! gracias otra vez
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

Matriz MCCUD

Publicado por Diego (11 intervenciones) el 02/12/2013 17:49:46
Estoy tratando de conseguir el programa para introducir simplemente una matriz y me diga si es MCCUD o no, quitando el menu y demás ya que es demasiado sofisticado para haberlo hecho, no colaría jeje, de momento me resulta imposible, me pierdo con la notación que as utilizado, que es laganch? tu? cu? perdona las molestias pero por mas que lo miro no me aclara nada.
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

Matriz MCCUD

Publicado por ramon (2158 intervenciones) el 02/12/2013 21:56:05
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
{Fíjate bien en el programa y veras tu, cu, iaganch son variables locales y globales}
 
{ Fijate que loque pides no serrealiza con menos.
 
1. Todos los valores de una fila son distintos entre sí.
2. max_fila_1 < max_fila_2 < max_fila_3 < ...< max_final_N donde, max_fila_i, representa el mayor
valor entero encontrado en la fila i-ésima de la matriz.
3. \/ i, (max_fila_i+1 – max_fila_i = constante), es decir, la diferencia entre los máximos de dos filas consecutivas es constante.
4. En cada columna de la matriz sólo puede aparecer el valor máximo de una de las filas.}
 
program matrizmccud;
 uses
    crt;
  const
      max = 10;
      pruev : array[1..4,1..4] of integer = (
      (5,6,2,-4),
      (6,-7,8,3),   {esta es la matriz que cargo como prueva es para que ozserves tu}
      (10,4,-5,9),  {como trabaja el proceso tu esto y sucarga lo quitas }
      (4,-7,1,12));
 
  type
     matriz = array[1..max,1..max] of integer;
 
   var
     lamazt : matriz;
     laganch : integer;
     x, y : integer;
     maxfilg : array[1..max] of integer;
     constant : integer;
     tru : boolean;
 
   function filasondistintos(cual : integer) : boolean;
   var
     son : boolean;  {aqui verifica que Todos los valores de una fila son distintos}
     tu, nu, cu : integer;
   begin
      son := false;
      for cu := 1 to laganch do
      begin
        nu := lamazt[cual, cu];
        for tu := laganch downto cu + 1 do
        begin
        if nu = lamazt[cual, tu] then
         son := true;
         end;
       end;
       filasondistintos := son;
     end;
 
   function maximosfilas(dd : matriz) : boolean;
   var                    {aqui verifica maximo en fila}
     es : boolean;
     maxfi : array[1..max,1..max] of integer;
     n, tt, ma, cs : integer;
   begin
       fillchar(maxfi,sizeof(maxfi),0);
       for tt := 1 to laganch do
       begin
         n := lamazt[1,tt];
         ma := 1;
         for cs := 1 to laganch do
         begin
            if n < lamazt[cs,tt] then
            begin
            n := lamazt[cs,tt];
            ma := cs;
            end;
         end;
          maxfi[tt,ma] := n;
        end;
        n := 0;
        constant := 0;
        for tt := 1 to laganch do
        begin
         ma := 0;
         for cs := 1 to laganch do
         begin
            if maxfi[tt,cs] <> 0 then
            begin
            ma := ma + 1;
            if n = 0 then
            constant :=  maxfi[tt,cs];
            n := n + 1;
            if n = 2 then
            begin
               if constant > maxfi[tt,cs] then
               constant := constant - maxfi[tt,cs]
             else
               constant := maxfi[tt,cs] - constant;
               constant := 0;
               n := 0;
            end;
          end;
         end;
         if ma > 1 then
         begin
            es := true;
            break;
         end
       else
         if ma = 1 then
         es := false;
       end;
       maximosfilas := es;
       write('  ');
   end;
 
  procedure entredatos; {aqui entramos los datos}
  var
    dd, mu, nn, tama : integer;
  begin
      clrscr;
      writeln(' ****** Entrada Numeros Matriz ******');
      writeln;
      write('   Entre Tama¤o Matriz Max 10 : ');
      readln(tama);
      laganch := (max - max + tama);
      nn := 1;
    repeat
        for dd := 1 to laganch do
        begin
        write('  Num.[',nn,'|',dd,'] : ');
        readln(mu);
        lamazt[nn,dd] := mu;
        end;
        nn := nn + 1;
    until nn > laganch;
  end;
 
   procedure cargaprueva(var dh : matriz);
   var             {aqui cargo la prueva en tu caso sera la entrada de datos}
      cx, cy : integer;
   begin
      for cy := 1 to laganch do
        for cx := 1 to laganch do
        dh[cx,cy] := pruev[cx,cy];
   end;
 
  procedure resuelve(nnp : matriz);
  begin                     {aqui resuelbo lo que es}
     writeln('  **** La Matriz Cargada Es ****');
      writeln;
      for y := 1 to laganch do
      begin
        for x := 1 to laganch do
        begin
        write('  ',nnp[y,x]);
        end;
        writeln;
       end;
       writeln;
      for y := 1 to laganch do
      begin
        if filasondistintos(y) = true then
        begin
           tru := true;
        end
      else
         tru := false;
       if tru = true then
       break;
      end;
      if (tru = false) and (maximosfilas(nnp) = false) then
      begin
         writeln('**** La Matriz Si Es MCCUD ****');
      end
   else
      begin
         writeln('**** La Matriz No Es MCCUD ****');
      end;
      writeln;
      writeln('  <<<< Pulse Una Tecla >>>>>');
      readkey;
  end;
 
 
 begin
      clrscr;
      tru := false;  {programa principal}
      laganch := 4;  {como empleo la metriz que tu indicas esto es el tamaño de heya}
      entredatos;
      resuelve(lamazt);
      cargaprueva(lamazt);
      resuelve(lamazt);
  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
sin imagen de perfil

Matriz MCCUD

Publicado por Diego (11 intervenciones) el 03/12/2013 18:24:24
vale, entonces las variables que me dices, las llamas asi, como las podrias llamar, k,i,e etc? no???

Otra cosa, si tengo un programa en el cual, me piden mostrar la secuencia RLE de una introducida por el teclado, habia pensado en introducir la secuencia como un array y ver cuantas veces se repite el caracter, cada vez que se repita poner un contador +1 y al final en el display que aparezca el valor del contador acompañado del caracter, pero... tengo un problema para pasar al siguiente caracter, podrias ayudarme?? muchas gracias!

La técnica de compresión de datos RLE (Run Length Encoding) se utiliza para reducir el tamaño de las
secuencias de datos, comprimiendo su información. Se basa en la sustitución de una secuencia de datos
repetidos, por un dato especial (marcador) seguido del número de repeticiones y del dato que se repite.
Dicha sustitución se realiza solo en los casos en los que resulte favorable.
En el caso de secuencias de caracteres y usando el carácter '\' como marcador, se tiene:
Obsérvese que se realiza la sustitución de a y c porque se ahorra espacio, mientras que la sustitución de
d no mejoraría nada, y la de b, e, f y g supondría una mayor ocupación. Un caso especial se produce
cuando hay caracteres marcadores, que se sustituyen siempre, aunque no estén repetidos. Se pide:
1) Escriba el programa RLE.pas en PASCAL que lea del teclado una secuencia de caracteres terminada en
'.' y visualice la secuencia comprimida según la técnica anterior.
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

Matriz MCCUD

Publicado por ramon (2158 intervenciones) el 03/12/2013 22:27:43
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
{A la 1 Si así es}
 {A la 2 mira esto}
 uses
    crt;
  type
 
    letras = record
           let : char;
           rep : integer;
         end;
 
  var
    cadena : string[80];
    nurepe : array[1..200] of letras;
    c, cont : integer;
 
   procedure entrada;
   var
     n : integer;
     tk : char;
     x, y : integer;
   begin
      clrscr;
      n := 1;
      x := 1;
      y := 1;
      gotoxy(x,y);write('  Entre texto acavado en [.] : ');
      x := 32;
      repeat
         tk := readkey;
         if tk <> '.' then
         begin
          if tk = #13 then
          break;
           if tk <> #8 then
           begin
              cadena[n] := tk;
              cadena[0] := chr(n);
              gotoxy(x,y);write(cadena[n]);
              n := n + 1;
              x := x + 1;
              if n > 80 then
              begin
              n := 80;
              x := x - 1;
              end;
           end
         else
            begin
               if tk = #8 then
               begin
                  n := n - 1;
                  x := x - 1;
                  if n < 1 then
                  begin
                  n := 1;
                  x := x + 1;
                  end;
                  cadena[n] := ' ';
                  cadena[0] := chr(n);
                  gotoxy(x,y);write(cadena[n]);
               end;
            end;
         end;
      until (tk = '.') or (n > 80);
      cadena[n] := '.';
      cadena[0] := chr(n);
   end;
 
   procedure repetidas(cad : string);
   var
     long, nm, ff : integer;
     le : char;
     si : boolean;
   begin
       long := length(cad);
       for nm := 1 to long do
       begin
           le := cad[nm];
           si := false;
           for ff := long downto nm + 1 do
           if cad[ff] <> #0 then
           begin
           if cad[ff] = le then
           begin
              nurepe[cont].let := le;
              nurepe[cont].rep := nurepe[cont].rep + 1;
              cad[ff] := #0;
              si := true;
           end;
          end;
           if si = true then
           begin
           nurepe[cont].rep := nurepe[cont].rep + 1;
           cont := cont + 1;
           end;
        end;
     end;
 
 
  begin
      entrada;
      clrscr;
      cont := 1;
      repetidas(cadena);
      clrscr;
      writeln(' La Cadena Fue : ',cadena);
      writeln;
      for c := 1 to cont - 1 do
      if (nurepe[c].let <> #0) and (nurepe[c].let <> #32) then
      writeln(' Letra : ',nurepe[c].let,'  Num. Repetidas : ',nurepe[c].rep);
      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
sin imagen de perfil

Matriz MCCUD

Publicado por Diego (11 intervenciones) el 05/12/2013 01:09:00
buff me pierdo, hay muchas de esas ordenes que no las hemos dado en clase, se me hace lioso, todo lo que son los "goto", #8... ni idea de como funcionan,

tengo hasta ahora este codigo, si le escribo una secuencia de "aes" si me expresa el \4a por ejemplo, pero a la hora de que lea el siguiente character problemas...

program titulo;
var l1,l2 :char; cont:integer;
begin
write ('Escribe la secuencia:' );
read (l1);
read(l2);
If (l1 = l2) then
begin
while not eoln do
begin
cont := 1;
while l1 = l2 do
begin
l1 := l2;
read(l2);
cont := cont + 1;
end;
end;
end;
writeln ('/',cont,l1);
readln;
readln;

end.

Algun codigo mas basico que el que has introducido?? jeje muchas gracias por tomarte tantas molestias!
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

Matriz MCCUD

Publicado por ramon (2158 intervenciones) el 05/12/2013 21:37:04
{Mira lo que tu as echo es algo de esto pero no es lo que tu pedías referente a la secuencia RLE .
Referente a los gotoxy son posicionamiento en pantalla del texto y #8 es el carácter devuelto por readkey de la tecla
de retroceso}

program repeticiones;
uses
crt;
var
texto : string;
ten, pp, cont, tt : integer;
tenp, toma, letra : char;
begin
clrscr;
write(' Entre Texto Terminado En[.] : ');
readln(texto);
cont := 1;
tt := 0;
letra := ' ';
while texto[cont] <> '.' do
begin
letra := texto[cont];
pp := cont + 1;
ten := 0;
tenp := ' ';
repeat
if letra = texto[pp] then
begin
ten := ten + 1;
tenp := texto[pp];
end;
pp := pp + 1;
until (texto[pp] = '.') or (pp > 200);
if ten > tt then
begin
tt := ten;
toma := tenp;
end;
cont := cont + 1;
end;
writeln;
writeln(' Repeticiones = ',tt + 1,' La Letra = ',toma);
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