IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Пара задач (циклы for do ), .
Дмитрий Ильин
сообщение 24.12.2011 20:44
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Доброго времени суток жителям форума,в изучении темы задался вопросом решения задач(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.

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


--------------------
Каждый программист - Творец (с)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 24.12.2011 22:16
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

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

А что не работает то?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Дмитрий Ильин
сообщение 24.12.2011 22:19
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Цитата(Krjuger @ 24.12.2011 22:16) *

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

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

моя задача - написать программу по заданию,правильного ответа я не нашел,спросить не у кого,решил проверить код у вас,правильно ли я действую,есть ли ошибки.и можно ли как нибудь оптимизировать код?
P.s. модуль crt - потому что программирую в PascalABC


--------------------
Каждый программист - Творец (с)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 24.12.2011 22:42
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


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

Цитата
P.s. модуль crt - потому что программирую в PascalABC
PascalABC также прекрасно работает без Crt, просто вся работа осуществляется в одном окне, а не создается новое. Да и вообще: PascalABC - не самый удачный выбор для изучения основ программирования. Я где-то уже говорил об этом, начинать лучше с того, что дает меньше лишних возможностей. К примеру, с Турбо Паскаля. Чтоб не было соблазна использовать средства, специфичные для какого-то компилятора, пока не научишься использовать стандартные средства самого языка.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Дмитрий Ильин
сообщение 24.12.2011 23:06
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Создал мини "таблицу" из двух столбиков
!факториал числа = число
Код
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


--------------------
Каждый программист - Творец (с)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 24.12.2011 23:28
Сообщение #6


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
так пойдет или нужно другую таблицу?
Я бы все-таки отформатировал, чтоб таблица на таблицу была похожа:
for k:=1 to n do
begin
p:=p*k;
writeln(k:2,'! = ',p:12);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Дмитрий Ильин
сообщение 24.12.2011 23:47
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Цитата(IUnknown @ 24.12.2011 23:28) *

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


Действительно,красиво,спасибо вам good.gif


--------------------
Каждый программист - Творец (с)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Дмитрий Ильин
сообщение 25.12.2011 14:11
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


у меня к вам еше 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.

Поможете?

Сообщение отредактировано: Дмитрий Ильин - 25.12.2011 14:13


Прикрепленные файлы
Прикрепленный файл  ZVEZDA_E.PAS ( 576 байт ) Кол-во скачиваний: 193


--------------------
Каждый программист - Творец (с)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 25.12.2011 14:32
Сообщение #9


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


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

Зачем еще 4 цикла (тем более, зачем циклы делать вложенными) - непонятно совершенно. Вложенность тут напрочь не нужна.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Дмитрий Ильин
сообщение 25.12.2011 15:05
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Цитата(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 задачу?

Сообщение отредактировано: Дмитрий Ильин - 25.12.2011 15:29


--------------------
Каждый программист - Творец (с)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 25.12.2011 15:30
Сообщение #11


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
там все точно так же как и вы говорите
Неправда. Я ничего не говорил о том, что внутри цикла по 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;

не пробовал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Дмитрий Ильин
сообщение 25.12.2011 16:12
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Работает,работает...
Вот только для понимания сложно,а додумать тем более .
Можете немного пояснить алгоритм и названия переменных?
Надеюсь на понимание


--------------------
Каждый программист - Творец (с)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 25.12.2011 16:31
Сообщение #13


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Названия переменных - стандартные: 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 числа в цикле ты уже умеешь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 24.05.2024 7:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"