[ Foro de Pascal ]

Ejercicio FOR

22-Mar-2014 19:02
Invitado (Marc)
5 Respuestas

Hola!

Me he estancado con este ejercicio del nuevo curso de pascal. Dice así:

Ejercicio propuesto 3.2.2.2: Crea un programa que escriba 3 líneas, cada una de las cuales contendrá 4 veces la palabra "Hola" seguida por un espacio.

Y yo he creado este código. Pero aunque he realizado otras variantes, no consigo crear por medio del segundo bucle (el que muestra 'hola') que se muestre cuatro veces en una misma línea.


program for4;

uses
	crt;
var
	linea, saludo : byte;
begin
	for linea := 1 to 3 do
		begin
			for saludo := 1 to 4 do
				write('hola');
		end;
			
		
end.


Me muestra 'hola' en una misma línea y todo seguido :(


22-Mar-2014 22:29
Nacho Cabanes (+84)

Casi lo tienes. Te falta un espacio tras cada "Hola", y un avance de línea cuando se termine de repetir el "for" interior:


program for4;

uses
    crt;
var
    linea, saludo : byte;
begin
    for linea := 1 to 3 do
        begin
            for saludo := 1 to 4 do
                write('hola ');
            writeLn;
        end; 
end.



22-Mar-2014 22:32
Luis Torres (+18)

El programa genera tres veces, cuatro "hola", pero los pone todos en la misma línea y, de paso, no los separa por un espacio. Debes buscarte la forma de que cuando finalice el for interno (el del saludo) se pase a la siguiente línea; lo cual puedes hacer con un writeln. Para el espacio de separación entre cada "hola" puedes lograrlo colocándolo allí mismo, después del "hola", de la siguiente forma: write('hola ').

Saludos.


23-Mar-2014 10:45
Invitado (Marc)

¡Muchas gracias! Una vez visto, que fácil parece. No me quiero ni imaginar los 'problemas' que tendrán los grandes programas :(

Dicho esto...veo que tengo un problema serio con los FOR.

Por lo que veo, dentro de un bucle for no se puede utilizar este tipo de contador (que si se puede en C y Python):

i + := 2
ó
i + i := 2

En este ejercicio:

Ejercicio propuesto 3.2.6.3: Un programa que escriba la secuencia de números 3, 5, 7,..., 21.

Hago...


program forSecuencias;
uses
	crt;
var
	i : byte;
begin
	for i := 1 to 21 do
		write(i + 2);
			
end.


Pero en contador  "i"  no me funciona. Sale la secuencia: 3,4,5,6,7,8,9...23
Y no: 3,5,7...21

Creía que añadiendo el + 2 en cada iteracion sumaria la variable con dos unidades.


23-Mar-2014 21:40
Luis Torres (+18)

Necesitas hacer una corrida de mesa para que aclares lo que se está produciendo en cada iteración dentro del cliclo for, en el que i toma los valores que van desde 1 hasta 21:

- Cuando i vale 1, write(1+2) muestra el valor 3 en pantalla.
- Cuando i vale 2, write(2+2) muestra el valor 4 en pantalla.
- Cuando i vale 1, write(3+2) muestra el valor 5 en pantalla.
- Cuando i vale 1, write(4+2) muestra el valor 6 en pantalla.
- Cuando i vale 1, write(5+2) muestra el valor 7 en pantalla.
- Cuando i vale 1, write(6+2) muestra el valor 8 en pantalla.
- Cuando i vale 1, write(7+2) muestra el valor 9 en pantalla.
- Cuando i vale 1, write(8+2) muestra el valor 10 en pantalla.
  .
  .
  .
- Cuando i vale 21, write(21+2) muestra el valor 23 en pantalla.

Por lo tanto, la salida será 3,4,5,6,7,8,9,10,...,23 . Tal como lo escribiste en tu post.

La idea del programa es más bien, comenzar desde el valor 3, le sumas 2, y al resultado le sumas dos hasta alcanzar el número 21. Lo cual podrías lograr de esta manera:


program numerosImpares;
var
  num,i: integer;
BEGIN
  num:= 3;
  for i:=1 to 10 do
   Begin
        write(num,' ');
        num:= num + 2;
   End;
  readln;
END.



Saludos.


24-Mar-2014 01:20
Nacho Cabanes (+84)

Efectivamente, como tú mismo has descubierto, en Pascal no puedes hacer que el contador cambie de 2 en 2. Hay dos alternativas: la más sencilla es la que propone Luis, de usar una segunda variable.

Una alternativa menos evidente es mostrar un valor modificado, que calcules a partir del contador. Para eso tendrías que saber un poco sobre "progresiones aritméticas" y cómo calcular su término general. Por ejemplo, en ese ejercicio, que pide mostrar los impares del 3 al 21, podrías hacer:


program forSecuencias;
var
    i : byte;
begin
    for i := 1 to 10 do
        write(i*2 + 1);			
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.)