Помощь - Поиск - Пользователи - Календарь
Полная версия: Пара задач (циклы for do )
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Дмитрий Ильин
Доброго времени суток жителям форума,в изучении темы задался вопросом решения задач(2 штучки),свои варианты написал,но не уверен,правильно ли с точки зрения программирования
Задание 6.5.
Написать программу вычисления n! (факториал числа n), где n положительно. Определение факториала:
0! = 1
1! = 1
2! = 1*2
3! = 1*2*3
n! = 1 * 2 * 3 *.... * (n - 1) * n
Другими словами, n! — это произведение первых n натуральных чисел.
Каждый следующий результат (обозначим его Р) получается путем умножения предыдущего результата (предыдущего Р) на счетчик, который пробегает значения от 1 до n.
Обозначим значение счетчика буквой k.
Получаем общий вид выражения: Р = Р * k (то есть воспользуемся рекуррентной формулой вычисления факториала: n! = (n - 1)! * n).
Программа должна быть организована так: с клавиатуры вводится число n (n— положительно), а затем на экран выдается таблица факториалов чисел до n включительно.
____________________________________________________
Как я понял натуральные числа-все целые,не отрицательные числа(12,256,1),но не (-24.5 ; 45.6);
Тогда вот код:
Код
uses crt;
var p,k,n:integer;
begin
p:=1;
readln(n);
for k:=1 to n do
   p:=p*k;
writeln(p);
end.


Почему k:=1 ? ...Потому что если К будет =0 то P:=p*k = (P*0),а любое число,умнодженное на ноль - ноль),поэтому я взял k:=1
__________________________________
Задание 6.6.
Написать программу вычисления суммы ряда S=1 + 2 + 3 + 4 + 5 + 6. Нарисовать блок-схему и заполнить таблицу трассировки. Убедиться при трассировке, что сумма равна 21.
________________
Мое решение :
Код
uses crt;
var p,k,n:integer;
begin
p:=0;
readln(k);
for n:=1 to k do
p:=P+n;
writeln(p);
end.

Вот собственно,можете проверить,что я не так делаю?
Спасибо.
Krjuger
Зачем подключать crt, если вы его не используете,во вторых, зачем писать такую терраду,на тему факториала. В третьих, не понятно,в чем вопрос то?
Цитата

Вот собственно,можете проверить,что я не так делаю?
Спасибо.

А что не работает то?
Дмитрий Ильин
Цитата(Krjuger @ 24.12.2011 22:16) *

Зачем подключать crt, если вы его не используете,во вторых, зачем писать такую терраду,на тему факториала. В третьих, не понятно,в чем вопрос то?

А что не работает то?

моя задача - написать программу по заданию,правильного ответа я не нашел,спросить не у кого,решил проверить код у вас,правильно ли я действую,есть ли ошибки.и можно ли как нибудь оптимизировать код?
P.s. модуль crt - потому что программирую в PascalABC
IUnknown
Цитата
Программа должна быть организована так: с клавиатуры вводится число n (n— положительно), а затем на экран выдается таблица факториалов чисел до n включительно.
И что, таблица-таки выдается? smile.gif

Цитата
P.s. модуль crt - потому что программирую в PascalABC
PascalABC также прекрасно работает без Crt, просто вся работа осуществляется в одном окне, а не создается новое. Да и вообще: PascalABC - не самый удачный выбор для изучения основ программирования. Я где-то уже говорил об этом, начинать лучше с того, что дает меньше лишних возможностей. К примеру, с Турбо Паскаля. Чтоб не было соблазна использовать средства, специфичные для какого-то компилятора, пока не научишься использовать стандартные средства самого языка.
Дмитрий Ильин
Создал мини "таблицу" из двух столбиков
!факториал числа = число
Код
var p,k,n:integer;
begin
p:=1;
writeln('Введите число ...');
readln(n);
for k:=1 to n do
begin
   p:=p*k;
writeln('!',k,'=',p);
end;
writeln('факториал числа ',n,'= ',p);
end.

Uses crt; убрал....
так пойдет или нужно другую таблицу? blink.gif wacko.gif
IUnknown
Цитата
так пойдет или нужно другую таблицу?
Я бы все-таки отформатировал, чтоб таблица на таблицу была похожа:
for k:=1 to n do
begin
p:=p*k;
writeln(k:2,'! = ',p:12);
end;
Дмитрий Ильин
Цитата(IUnknown @ 24.12.2011 23:28) *

Я бы все-таки отформатировал, чтоб таблица на таблицу была похожа:
for k:=1 to n do
begin
p:=p*k;
writeln(k:2,'! = ',p:12);
end;


Действительно,красиво,спасибо вам good.gif
Дмитрий Ильин
у меня к вам еше 2 вопроса
1)
есть задача,в ней мы должны уложиться в 4 цикла,а у меня получается только в 8....т.е. 4 но в каждом из них по вложенному циклу
Задание 6.8.
Используя возможности модуля Crt, напишите программу, в которой символ «звездочка» (*) пробегает по всему периметру экрана из верхнего левого угла.
Пояснение: в программе организуйте 4 цикла. В качестве счетчика используйте координаты X и Y. Нарисуйте блок-схему алгоритма.
Попробуйте изменить программу, используя всего два цикла: в одном цикле звездочки бегут сразу по верхней и нижней строкам экрана, в другом — сразу по левому и правому краю. Пусть каждая следующая звездочка выводится случайным цветом.(это я вообще не смог сделать,возможно необходимо будет прописать
random,но как...? )
Мой вариант без выделенного условия(вложение turboPascal)
2)
Задание 6.6.
Написать программу вычисления суммы ряда для n слагаемых (n вводится с клавиатуры):
1/(1*2*3) + 1/(2*3*4) + 1/(3*4*5) + 1/(4*5*6) + …
Заметил тут лишь закономерность,в знаменателе идет три цифры,причем начинаются они с n+1,т.е. первое число знаменателя 2*3*4 ... потом 3*4*5...потом 4*5*6,а как это реализовать?
с 1/(1*1)+1/(2*2)+1/(3*3) я сделал

Код
var k,n:integer;
    a,s:real;
begin
S:=0;
readln(k);
for n:=1 to k do
begin
a:=1/n;
s:=s+a*a
end;
writeln('Сумма чисел = ',S:6:2);
readln
end.

Поможете?
IUnknown
Цитата
а у меня получается только в 8
Первый цикл - координата X изменяется от 1 до 80, Y - постоянна (равна 1).
Второй: координата X постоянна (равна 80), Y изменяется от 1 до 25.
Третий: X изменяется от 80 до 1, Y = 25
Четвертый: X постоянна (равна 1), Y меняется от 25 до 1

Зачем еще 4 цикла (тем более, зачем циклы делать вложенными) - непонятно совершенно. Вложенность тут напрочь не нужна.
Дмитрий Ильин
Цитата(IUnknown @ 25.12.2011 14:32) *

Первый цикл - координата X изменяется от 1 до 80, Y - постоянна (равна 1).
Второй: координата X постоянна (равна 80), Y изменяется от 1 до 25.
Третий: X изменяется от 80 до 1, Y = 25
Четвертый: X постоянна (равна 1), Y меняется от 25 до 1

Зачем еще 4 цикла (тем более, зачем циклы делать вложенными) - непонятно совершенно. Вложенность тут напрочь не нужна.

Вы вложение смотрели?там все точно так же как и вы говорите,вот только как ей перемещаться,если одной из координат не будет?Поэтому и приходится ее писать (GoToXY(x,y))
Хотя можно заменить "в холостую руботающий цикл" на Y:=1 ...
Тут я с вами согласен.
А вот как сделать 2 задачу?
IUnknown
Цитата
там все точно так же как и вы говорите
Неправда. Я ничего не говорил о том, что внутри цикла по X должен быть цикл по Y.
Цитата
for x:=1 to 80 do
for y:=1 to 1 do
, и про это:
Цитата
For x:=80 to 80 do
for y:=1 to 23 do
я тоже ничего не говорил. Закончился один цикл - начался второй.

Добавлено через 2 мин.
Цитата
первое число знаменателя 2*3*4 ... потом 3*4*5...потом 4*5*6,а как это реализовать?

s := 0;
for i := 1 to n do
begin
p := 1;
for j := 0 to 2 do p := p * (i + j);

s := s + 1 / p
end;

не пробовал?
Дмитрий Ильин
Работает,работает...
Вот только для понимания сложно,а додумать тем более .
Можете немного пояснить алгоритм и названия переменных?
Надеюсь на понимание
IUnknown
Названия переменных - стандартные: S=сумма, P=произведение, i=управляющая переменная цикла. Алгоритм такой:
Цитата
Заметил тут лишь закономерность,в знаменателе идет три цифры,причем начинаются они с
N (а не с N+1). Значит, для того чтобы найти знаменатель на каждом шаге, достаточно перемножить 3 последовательных числа, начиная с N. Как это проще всего сделать? Правильно, написав вложенный цикл j = 0..2, и добавив переменную j к номеру текущего слагаемого. Тогда для i = 1 внутренний цикл переберет значения
j = (1+0), (1+1), (1+2) = 1, 2, 3
, для i = 2:
j = (2+0), (2+1), (2+2) = 2, 3, 4
и так далее... Ну, а перемножать 3 числа в цикле ты уже умеешь.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.