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

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

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

 
 Ответить  Открыть новую тему 
> Паскаль. массивы.
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Женский

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


Помогите написать программы на Паскале! Сама в этом не разбираюсь, по этому прошу вашей помощи! Заранее спасибо!!

1. Если уравнение ax2 + bx + c = 0 (a не равно 0) имеет вещественные корни, то логической переменной t присвоить значение true, а переменным x1 и x2 – сами корни, иначе же переменной t присвоить false, а значения переменных x1и x2 не менять.
2. Дано 50 вещественных чисел. Найти порядковый номер того из них, которое наиболее близко к какому-нибудь целому числу.
3. Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа.
4.Даны целые числа x1, x2, …, x55. Вычислить величину
x1(x2+x3)(x4+x5+x6)(x7+x8+x9+x10)…( x46+x47+…+x55).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

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

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


> Сама в этом не разбираюсь, по этому прошу вашей помощи!

Зря. Начали бы сами, помогли бы нормально. А так...

Специально напишу не на паскале, а на псевдокоде. Чтобы вам было, над чем подумать.
И правильность не проверял.

1.
Код

d := b^2-4ac; дискриминант
if d >= 0
  t := true;
  s := sqrt(d);
  x1 := (-b-s)/2a;
  x2 := (-b+s)/2a;
else
  t := false;
end if

2.
Код

for i from 0 upto 49
  ad := abs(M[i] - N); расстояния от текущего элемента массива до того числа
  if i = 0 or d > ad
    MinIndex := i;
    d := ad;
  end if;
end for;

3.
Код

N := 0;
L := 1;
M := 9;
while K > N     вычисление первой степени десятки, запись до которой содержит хотя бы K цифр
  ON := N;
  N := N + M * L;
  L := L + 1;
  M := M * 10;
end while;
RN := (K - ON - 1) div (L - 1) + M div 90;   вычисление числа, в запись которого попала K-я цифра
RD := L - 2 - (K - ON - 1) mod (L - 1);       порядковый номер цифры в числе
for i from 0 upto RD
  RN := RN div 10;
end for
Result := RN mod 10;

4.
Код

P := 1;
S := 0;
N := 1;
K := 2;
for i from 1 upto 55
  S := S + X[i];  временная сумма
  if i = N        номер элемента, в котором надо обнулить временную сумму
    P := P * S;   ответ
    S := 0;
    N := N + K;
    K := K + 1;
  end if;
end for


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


По 4-й задаче: я б сделал вот так:
  p:=1;
for i:=1 to 10 do begin
s:=0;
for j:=1 to i do s:=s+x[(i-1)*i div 2+j];
p:=p*s
end;



P.S.
"псевдокод" я бы не приветствовал на форуме по Паскалю.. Правильно оформить реальный кусок кода - уже некоторая задача для новичка. Если недостаточно - есть и другие способы усложнить..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


3-я задача тоже интересная. Я написал, потом стал смотреть решение TarasBer'а. Выяснилось, что ход решения практически тот же )). Потом я все же дал себе труд перевести этот "псевдокод" на Pascal, и - результат негативный ((. TarasBer, ищи ошибку. Мне кажется, ты запутался в последних подсчетах, но настаивать не буду..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Во 2-й задаче, TarasBer, ты несколько не понял условие.. Нужно искать число, максимально близкое к любому (не важно, какому именно) целому.

Млжно примерно вот так:
  for i:=1 to 50 do a[i]:=Random*100;    {задаем массив вещественных чисел от 0 до 100}
d:=1.0; {подготавливаем минимальное расстояние}
for i:=1 to 50 do if Abs(a[i]-Round(a[i]))<d then m:=i; {поиск}
WriteLn('самое близкое к целому - число ',a[m],' под номером ',m); {вывод результата}


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

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

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


> for i:=1 to 50 do if Abs(a[i]-Round(a[i]))<d then m:=i;

А кто будет менять d?


for i := 1 to 50 do begin
ad := Abs(a[i] - Round(a[i]));
if (i = 1) or (ad < d) then begin
m := i;
d := ad;
end;
end;



> По 4-й задаче: я б сделал вот так:

Да, так лучше, тут я сбыдлокодил.

> Потом я все же дал себе труд перевести этот "псевдокод" на Pascal, и - результат негативный ((. TarasBer, ищи ошибку. Мне кажется, ты запутался в последних подсчетах, но настаивать не буду..

Очень может быть. Надо посмотреть. Вообще, конечно, можно тупо писать по очереди в строку, пока её длина не превысит k (чтобы память не тратилась, можно только запоминать длину, а строку заново переписывать для каждого числа), но это другой порядок скорости - O(n) вместо логарифма, мне это не нравится.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Злостный любитель
*****

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

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


Попробовал

for i := 0 to RD do RN := RN div 10;

Заменить на

for i := 0 to RD - 1 do RN := RN div 10;

Так лучше. Прогнал до k=1000, вроде достоверно.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
3. Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа.
Задача решалась, причем не одним пользователем на этом форуме (См. Олимпиадные задачи, пост №15). Прежде всего надо было обратиться к поиску. Автор даже этого не сделал. Надо ему очень эти фрагменты решений? От сейчас их возьмет и пойдет на другой форум. А там ему слепят из них очередного монстра... "Псевдокод"... Я тебе, TarasBer, тоже как-нибудь отвечу с использованием псевдокода. Посмотрим, сколько тебе времени понадобится, чтобы разобраться и перенести решение на любой другой язык...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(volvo @ 23.04.2010 11:24) *
Задача решалась, причем не одним ...
Автор даже этого не сделал. Надо ему очень эти фрагменты решений?
volvo, я не думаю, что ты думаешь, что я думаю, что эта задача не решалась )). Но дело же не в этом..
В конце концов, главное - потрепаться, и чтоб задача была хорошая )). А что до автора - ну, ну.. ну - чиво тут поделаешь?.. СУДБА..

TarasBer, спасибо за поправку. И обрати внимание на слова volvo по псевдокоду тоже (я не одинок)).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





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

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


Цитата(aigulia @ 22.04.2010 19:14) *
Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа.

Задачка из Пильщикова
Var K,
CurrentQuantitySymbol,
CurrentInteger,
PowerCurrentInteger:integer;
KSymbol:0..9;
BEGIN
Write('Введите K ');
Readln(K);
CurrentInteger:=1;
PowerCurrentInteger:=10;
CurrentQuantitySymbol:=1;
while K>CurrentQuantitySymbol do
begin
K:=K-CurrentQuantitySymbol;
CurrentInteger:=CurrentInteger+1;
if CurrentInteger=PowerCurrentInteger then
begin
CurrentQuantitySymbol:=CurrentQuantitySymbol+1;
PowerCurrentInteger:=PowerCurrentInteger*10
end
end;
for K:=K to CurrentQuantitySymbol-1 do
CurrentInteger:=CurrentInteger div 10;
KSymbol:=CurrentInteger mod 10;
Writeln(KSymbol)
END.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 




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