PDA

Ver la Versión Completa : Duda con ejercicio de Diagrama de Barras


gerupc
12-08-2007, 00:45:28
Hola,

tengo un problema con un ejercicio. La presentación ha de ser así:

Introduce las longitudes del diagrama de barras a representar:
4 <R> I****

0 <R> I

5 <R> I*****

11 <R> I***********

14 <R> I**************

10 <R> I**********

7 <R> I*******

1 <R> I*

-1 <R>

¿Deseas representar mas diagramas de barras (S/N): N <R>Entonces, donde me bloque es a la hora de implementar un bucle for:

begin writeln('Introduce las longitudes del diagrama de barras a representar: ');
readln(cantidad);
asterisco := '*';
for i := 1 to cantidad do Begin //Aquí he probado unas cuantas cosas...pero nada.
end;

Se me ha ocurrido el hacer una conversión de datos y convertir el asterisco a entero para poderlo multiplicar por una variable de valor 1. De esta manera se me quedaría variable := asterisco solo (ya que lo he multiplicado por 1) y así poder hacer.

write('I', asterisco);


Alguna manera 'mejor'?? o más bien, alguna manera de hacerlo ;)??

Un saludo,

Geru.

cHackAll
12-08-2007, 02:30:56
uses SysUtils; {$apptype console}

var
Repeticiones, Cantidad: ShortInt;
Choice: Char;

label Back;
begin
Back: Write(#13'Introduce las longitudes del diagrama de barras a representar: ');
ReadLn(Repeticiones);
while Repeticiones > 0 do
begin
Dec(Repeticiones);
Read(Cantidad);
Write(#9);
if Cantidad > -1 then
Write('I');
while Cantidad > 0 do
begin
Write('*');
Dec(Cantidad);
end;
WriteLn;
end;
Write('¿Deseas representar mas diagramas de barras (S/N): ');
ReadLn(Choice);
if (Choice = 's') or (Choice = 'S') then
goto Back;
end.

Espero tengamos buena puntuacion en el "ejercicio"

gerupc
13-08-2007, 19:49:21
Hola,

muchas gracias por tu ayuda, de veras.

Pero no puedo utilizar 'label', y una cosa: qué es lo que hace la función 'dec'? y elWrite(#9); ?

Una vez más, gracias y un saludo,

Geru.

cHackAll
13-08-2007, 19:59:44
Dec decremente la variable introducida en 1, Write(#9) pone un tabulador, si no puedes usar label pues usa un repeat until

gerupc
13-08-2007, 20:09:04
Hola,

muchísimas gracias, voy a probar a ver...

Un saludo,

Geru.

b3nshi
13-08-2007, 20:36:19
Mmm creo de esa forma se resuelve el problema q tienes pero por si las moscas viendolo al codigo se me ocurre modificarlo de esta forma (y de acuerdo a mi interpretacion de consigna):


uses SysUtils; {$apptype console}
var
i: integer;
Rep: ShortInt;
res: Char;

begin
while (res = 's') or (res = 'S') do //no recuerdo si se usa or o ||
begin
Write(#13'Introduce las longitudes del diagrama de barras a representar: ');
ReadLn(Rep);
if rep >= 0 then
begin
Write('I');
for i := 0 to Rep do
begin
Write('*');
end; //Fin del for
end;//Fin del if
WriteLn;
Write('¿Deseas representar mas diagramas de barras (S/N): ');
ReadLn(res);
end;//Fin del while
end;
end.

En este caso solo te representaria una linea y preguntaria por empezar una nueva, es decir:
Representaria esto:
Rep es 4:
I****
Y preguntaria si queres representar mas...Es por las dudas... quizas yo entendi mal la consigna...

{Saludos}

gerupc
14-08-2007, 18:37:19
Hola,

muchísimas gracias B3nshi, pero creo que te has confundido con el primer while, ya que no se ha inicializado la variable resp (Ojo, creo ;-) )

Bueno, al final con vuestra ayuda y trasteando un poco, he conseguido lo que necesitaba, exceptuando dos detalles: (Primero el código y después los problemas)

uses SysUtils;

{$APPTYPE CONSOLE}

var
i: integer;
cantidad: integer;
opcion: char;
Begin
writeln('Introduce la longitud del diagrama de barras: ');
Repeat
Begin
readln(cantidad);
write(#9);
write('I');
for i := 1 to cantidad do
Begin
write('*');
end; //Fin de Bucle For
if cantidad = -1 then
write('Desea representar mas diagramas? S/N: ');
readln(opcion);
end;
until (opcion = 'n') or (opcion = 'N'); //Fin de Bucle Repeat
End.

1.-Al preguntarme: ¿Desea representar más diagramas? S/N:, me introduce una I justo delante de la pregunta, tal y como me hace para cada barra. Supongo que será mediante algún while >=0, pero no lo consigo, ya que me hace un bucle infinito...

2.- Me interesa que al finalizar cada barra, automáticamente se cambie de linea para poder introducir el número que desee, sin la necesidad de pulsar intro cada vez que finalice una barra, para cambiar de linea.

A ver si me podeis echar una mano ;-)

Un saludo,

Geru.

cHackAll
14-08-2007, 21:21:56
uses Windows, SysUtils; {$apptype console}
var
Handle: Cardinal; // El manejador de la consola
Info: TConsoleScreenBufferInfo; // Para GotoXY, WhereX, y WhereY
Repeticiones, Cantidad: ShortInt;
Choice: Char;
begin
Handle := GetStdHandle(STD_OUTPUT_HANDLE);
repeat Write('Introduce las longitudes del diagrama de barras a representar: ');
ReadLn(Repeticiones);
while Repeticiones > 0 do
begin
Dec(Repeticiones);
ReadLn(Cantidad);

GetConsoleScreenBufferInfo(Handle, Info); // Para obtener la posicion actual del cursor (WhereX & WhereY)
Info.dwCursorPosition.X := 16; //
Dec(Info.dwCursorPosition.Y); //
SetConsoleCursorPosition(Handle, Info.dwCursorPosition); // Para definit la nueva posicion del cursor (GotoXY(16, WhereY - 1)

if Cantidad > -1 then
Write('I');
while Cantidad > 0 do
begin
Write('*');
Dec(Cantidad);
end;
WriteLn;
end;
WriteLn;
Write('Deseas representar mas diagramas de barras (S/N): ');
ReadLn(Choice);
until (Choice <> 's') and (Choice <> 'S');
end.

Bueno ya que no puedes usar un goto label; entonces te dejo la solucion obvia y le agrego un toque visual agradable...

gerupc
16-08-2007, 13:55:49
Hola,

muchísimas gracias por tu interés y ayuda, pero, ha de ser mucho más sencillo que eso ;-)

Ten en cuenta que son ejercicios correspondientes a 1º de Ingeniería, y más concretamente, a los 3 meses de curso, es decir, que solamente se han visto, Bucles, estructuras de control anidadas...etc, poca leche ;-)

De todas maneras, muchísimas gracias, una vez más :-)

Un saludo,

Geru.

cHackAll
16-08-2007, 19:33:22
...Ten en cuenta que son ejercicios correspondientes a 1º de Ingeniería...

por eso le puse // a las lineas más "avanzadas" :rolleyes:

gerupc
16-08-2007, 19:40:04
Hola,

jeje, ya me he percatado xD, lo que ocurre es porque no me permiten utilizar eso aún, es decir, he de resolverlo (bueno, que nadie me lo va a corregir, que es por aprender) con lo dado hasta el momento, si no, no vale ;-)

Pero muchas gracias!!!
Un saludo,

Geru.