Форум «Всё о Паскале» _ Задачи _ Паскаль. массивы.
Автор: aigulia 22.04.2010 19:14
Помогите написать программы на Паскале! Сама в этом не разбираюсь, по этому прошу вашей помощи! Заранее спасибо!!
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).
Автор: TarasBer 22.04.2010 19:57
> Сама в этом не разбираюсь, по этому прошу вашей помощи!
Зря. Начали бы сами, помогли бы нормально. А так...
Специально напишу не на паскале, а на псевдокоде. Чтобы вам было, над чем подумать. И правильность не проверял.
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
Автор: Lapp 23.04.2010 8:09
По 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. "псевдокод" я бы не приветствовал на форуме по Паскалю.. Правильно оформить реальный кусок кода - уже некоторая задача для новичка. Если недостаточно - есть и другие способы усложнить..
Автор: Lapp 23.04.2010 9:15
3-я задача тоже интересная. Я написал, потом стал смотреть решение TarasBer'а. Выяснилось, что ход решения практически тот же )). Потом я все же дал себе труд перевести этот "псевдокод" на Pascal, и - результат негативный ((. TarasBer, ищи ошибку. Мне кажется, ты запутался в последних подсчетах, но настаивать не буду..
Автор: Lapp 23.04.2010 12:17
Во 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); {вывод результата}
Автор: TarasBer 23.04.2010 14:02
> 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) вместо логарифма, мне это не нравится.
Автор: TarasBer 23.04.2010 14:24
Попробовал
for i := 0 to RD do RN := RN div 10;
Заменить на
for i := 0 to RD - 1 do RN := RN div 10;
Так лучше. Прогнал до k=1000, вроде достоверно.
Автор: volvo 23.04.2010 14:24
Цитата
3. Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа.
Задача решалась, причем не одним пользователем на этом форуме (См. Олимпиадные задачи, пост №15). Прежде всего надо было обратиться к поиску. Автор даже этого не сделал. Надо ему очень эти фрагменты решений? От сейчас их возьмет и пойдет на другой форум. А там ему слепят из них очередного монстра... "Псевдокод"... Я тебе, TarasBer, тоже как-нибудь отвечу с использованием псевдокода. Посмотрим, сколько тебе времени понадобится, чтобы разобраться и перенести решение на любой другой язык...
Автор: Lapp 23.04.2010 14:55
Цитата(volvo @ 23.04.2010 11:24)
Задача решалась, причем не одним ... Автор даже этого не сделал. Надо ему очень эти фрагменты решений?
volvo, я не думаю, что ты думаешь, что я думаю, что эта задача не решалась )). Но дело же не в этом.. В конце концов, главное - потрепаться, и чтоб задача была хорошая )). А что до автора - ну, ну.. ну - чиво тут поделаешь?.. СУДБА..
TarasBer, спасибо за поправку. И обрати внимание на слова volvo по псевдокоду тоже (я не одинок)).
Автор: Халявов 8.11.2017 3:14
Цитата(aigulia @ 22.04.2010 19:14)
Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, https://xn--d1aqfdigh.xn--p1ai/examples/PRG/COLLECT.PRG/Pilsshikov/05/05_57_01.PAS.html.
Задачка из Пильщикова
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.