[ Foro de Pascal ]

ayuda

04-Apr-2011 16:23
oscar gomez
7 Respuestas

Cordial saludo Profesor Nacho Cabanes y Antonio.
Agradecerles de antemano su tiempo y la ayuda que nos brindais y que nos ayuda tanto a descubrir nuevas cosas en la programacion.

tengo dudas de como resolver el siguiente ejercicio:

Un arreglo de números se llama partidario si todo número que está en una casilla par (2,4,…) es mayor que cualquiera de los números que están en las casillas impares (1,3,5,…). Escriba un programa que ( SEA  EFICIENTE EN SU RESPUESTA, es decir, en el momento que encuentre que alguno de los elementos no cumple la condicion del enunciado no siga recorriendo el resto del array ) lea un arreglo de números enteros y luego, diga si es partidario o no.

Por ejemplo, si el arreglo es el siguiente:

 1    2    3    4    5   6   7   8   9   10   //indices del arreglo    
100 5 200 1 1000 0 600 50 300 4    //valores del arreglo

El programa debe escribir: es partidario.

yo he intentado hacer algo como esto:

... declaracion de variables y del arreglo

for i:=1 to 10 do
if ( (i mod 2 = 0) and (arreglo[i]>arreglo[i+1]) ) then
   write('es partidario')
 else
   write('no es partidario')

pero claro en este caso de me estaria imprimiendo cada vez que cumpla la condicion del if el mensaje "es partidario", ademas creo que no estaria siendo eficiente por que con el for estaria recorriendo todo el vector y se supone que en el momento de encontrar un elemento que no cumpla se debe parar y enviar el mensaje " no es partidario.
pero no encuentro como hacerlo y por eso acudo a vuestra ayuda para que me orienten en como podria hacerlo y ademas como seria utilizando un while que creo seria la forma eficiente por que con este bucle controlaria la parada en caso de que un elementop no cumpliese con la condicion, pero no me surge como , con vuestra ayuda se que podre acalrar muchas dudas que tengo mil gracias como siempre por su valioso tiempo y la ayuda generosa que nos brindais.
 


04-Apr-2011 19:04
Nacho Cabanes (+84)

Si cualquier número de posición par tiene que ser mayor que TODOS los de posiciones impares, yo daría una primera pasada para descubrir el mayor de los valores de posiciones impares.

Después, en una segunda pasada, vas comparando ese valor memorizado con el valor de cada posición par. En cuanto encuentres un valor que no cumpla, interrumpes el proceso (puedes usar un "repeat..until" para eso). Si llegas al final sin encontrar valores incorrectos, es que sí era partidario.


04-Apr-2011 21:52
Antonio P.G.

Hola Óscar.

Efectivamente, yo te habría dicho lo mismo que el Profesor.

A lo mejor esto te ayuda en los siguientes programas:

RECORRIDO ---------------------------------- BUCLE

Completo ----------------------------------- For
Al menos un paso --------------------------- Repeat
Quizá no se entrará en el bucle ------------ While


¡Hasta luego!


05-Apr-2011 11:12
oscar gomez

Permiteme decirte profesor por que para mi lo eres, entre otras cosas por que tienes un don para ayudar y eso es de profesores,mil gracias siempre por tu ayuda.
Antonio, queria pedirte el favor si me puedes esquematizar en seudocodigo usando el repeat until, es que no entiendo bien como lo de la primera pasada y despues lo de la segunda pasada y como voy comparando ese valor ( el mayor de los valores de posiciones impares ) memorizado con el valor de cada posición par?? te agradezco muchisimo que me ayudes pues esta parte en la programacion me ha costado, es decir como se utiliza un ciclo cuando no hay que recorer todo el array, ayudame por favor pues gracias a sus explicaciones puedo ir superandome poco apoco pues desafortunadamente no cuento con los medios para poder ingresar en una academia y menos en una universidad pero quiero aprender a programar y se que con sus ayudas y explicaciones poco a poco estoy mejorando, mil gracias.


05-Apr-2011 20:53
Antonio P.G.

OK, pues vamos a ver:

Paso 1: Encontrar el máximo de las casillas impares.
Paso 2: Comparar el anterior valor con los de las casillas pares.

Nomenclatura que utilizaré:

- "vector": será el vector [1..N] celdas de valores integer.
- "max": será el valor máximo.
- "cont": será el contador para los bucles.

Vemos el paso nº1:

- Tener en cuenta que:
---> Solamente se examinan las celdas impares.
---> Si el valor que encontramos es mayor que max, max pasa a tener ese valor.

- Desarrollo:
max:= vector[1]; { Necesita un valor válido. }
desde cont=3 hasta N hacer
 si cont es impar then
   si max es menor que vector[cont] then
     max:= vector[cont];

- Tras este bucle, cont = N.(Es importante para el paso nº2, ya que aprovecho esa misma variable).


Vemos el paso nº2:

- Tener en cuenta que se examinan las celdas impares.
- Usamos repeat...until porque al menos habrá que examinar una vez (suponiendo, claro, que N es mayor o igual que 2, es decir, que al menos hay 2 celdas en el array).
- Hay que plantear bien la condición o condiciones de parada. El bucle parará cuando se produzca uno de estos hechos:
---> Nos pasemos de N con cont.
---> Encontremos un valor de las celdas pares mayor que max.

- Desarrollo:
cont:= 2; {Por eso decía que era importante lo del paso nº1}
repeat
 si vector[cont] es menor que max entonces
   cont:= cont + 2; {De celda par a celda par. }
until (vector[cont] es mayor que máx) o (cont es mayor que N);
si cont > N entonces {significa que no hemos encontrado ninguno mayor que max.}
 write ('Yuju!')
else
 write ('Hay un valor mayor que ',max,' en la casilla ',cont);


Y creo que así funcionría. Revísalo y luego trata de implementarlo y probarlo con diferentes ejemplares de funcionamiento.

¡Ciao!


06-Apr-2011 14:46
oscar gomez

Mil gracias Antonio me lo has explicado perfecto y he aprendido algo nuevo gracias a ti y a Nacho, mil gracias y que toda esta ayuda desinteresada colme a Uds y los suyos de bendiciones, mile gracias de verdad
ciao


08-Apr-2011 22:48
oscar gomez

Buenas noches profesor Antonio.
Mira implemente la idea que me diste en el algoritmo de este ejercicio pero al ejecutarlo para cualquier vector me sale que "es partidario" y no me entra en el caso de que deba mostrar el mensaje "el vector no es partidario", quisiera pòr favor me ayudaras a indicarme donde puede estar mi error, o si estoy haciendo algo mal y por eso no me funciona como deberia.El codigo completo compilado ok es:


program partidario;
uses crt;
type vector1=array[1..20] of integer;
var vect:vector1;
var  max,orden,cont:integer;

procedure leervector(var vec:vector1;var orden:integer);
begin
clrscr;
writeln;
writeln;
writeln;
writeln;
write('ingrese el tama¤o del vector :');
readln(orden);
for cont:=1 to orden do
begin
 write('escriba el elemento[',cont,']:');
 readln(vec[cont]);
 end;
end;

 procedure muestravector(var vec:vector1;var orden:integer);
 begin
  for cont:=1 to orden do
   write(vec[cont]:4);
   writeln;
 end;

 begin
 leervector(vect,orden);
 muestravector(vect,orden);
  max:=vect[1];
  for cont:=3 to orden do
    begin
      if(cont mod 2 <>0) then
         if(max<vect[cont]) then
            max:=vect[cont];
     end;

   cont:=2;
   repeat
     if(vect[cont]<max) then
       cont:=cont+2;
    until((vect[cont]>max) or (cont>orden));

     if(cont>orden) then
       write('el vector es partidario')
      else
        write('el vector no es partidario');
   readkey;
 end.

Tu ayuda al igual que la del profesor Nacho son tan importantes para nosotros que cada vez es un mil gracias sincero y ojala podamos alcanzar algun dia su nivel.

ayudame porfa a ver que esta mal para que me funcione ok, como ves le estoy dedicando tiempo a aprender y tu ayuda me sirve muchisimo.


11-Apr-2011 16:35
Nacho Cabanes (+84)

Las condiciones que tienes al final están mal: los pares deben ser mayores que los impares de modo que debes avanzar si es mayor, no si es menor:

if(vect[cont] > max) then
       cont:=cont+2;

y claro, la condición del "until" debe ser la contraria, porque repetirás hasta que encuentres un número que sea menor que el máximo de los impares:

until((vect[cont] < max) or (cont>orden));


Con las correcciones y con comentarios podría quedar así:

-----

program partidario;

uses crt;

type
 vector1=array[1..20] of integer;

var
 vect:vector1;
 max,orden,cont:integer;

procedure leervector(var vec:vector1;var orden:integer);
begin
clrscr;
writeln;
writeln;
writeln;
writeln;
write('ingrese el tama¤o del vector :');
readln(orden);
for cont:=1 to orden do
begin
 write('escriba el elemento[',cont,']:');
 readln(vec[cont]);
 end;
end;

procedure muestravector(var vec:vector1;var orden:integer);
begin
 for cont:=1 to orden do
   write(vec[cont]:4);
 writeln;
end;


(* Cuerpo del programa *)
begin
 leervector(vect,orden);
 muestravector(vect,orden);

 (* Busco el maximo de los impares *)
 max:=vect[1];
 for cont:=3 to orden do
   begin
     if(cont mod 2 <>0) then
         if(max < vect[cont]) then
           max := vect[cont];
    end;
 writeln('Maximo encontrado: ', max);


 (* Comparo todos los pares con el maximo *)
 cont:=2;
 repeat
   writeln('Comparando: ', vect[cont]);
   if(vect[cont] > max) then
     cont:=cont+2;
 until((vect[cont] < max) or (cont>orden));

 (* Si he llegado al final, era partidario *)
 if(cont > orden) then
   writeln('El vector es partidario')
 else
   write('El vector no es partidario');

 readkey;
end.







(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)