Змінюй хід війни! Допомагай ЗСУ!

Pascal , покажите где ошибка ?

  • Автор теми Автор теми Honorocker
  • Дата створення Дата створення
А ты ****? Ума не хватает подпилить под турбопаскаль?

Или трудно скормить процедуре параметры?

Если TurboPascal не умеет привести булевский тип к целочисленному, то тот typecast можно спокойно развернуть в конструкцию if..then

Суть алгоритма простая как двери. Допустим надо посчитать сумму чисел от 1 до 10.
Смотрим на закономерность:

Код:
1 + 10 = 11
2 + 9  = 11
3 + 8  = 11
4 + 7  = 11
5 + 6  = 11

Итого, достаточно умножить сумму двух крайних элементов на половину их количества.
Код:
(1 + 10) * 10 / 2 = 55

kaska_, думаешь, что TurboPascal знает что-то про директиву {$APPTYPE CONSOLE}? SysUtils где прикажешь ТурбоПаскалю искать? :D
 
Останнє редагування:
kaska_, не пиши так больше. влом вникать в нечитабельный код. не стоит менять переменную цикла for внутри тела цикла если не хочешь запутать читающего.

перепиши вариант ASokol'a на паскаль у будет те счастье. Или если нужно циклами перепиши тот вариант с php.

ASokol, молодец, переплюнул всех, пока мы занимались оптимизацией циклов, написал алгоритм выполняющийся за постоянное время не зависимо от длины интервала.
 
а, я понял, ну можно и так написать:

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
i,summa,kolvo,step:integer;

begin
summa:=0;
kolvo:=0;
step:=12;
for i:=-100 to 100 do
if ((i mod 3)=0) and ((i mod 4)=0) then
begin
summa:=summa+i;
kolvo:=kolvo+1;
if ((i+step)<=100) then
i:=i+step;
end;
if (kolvo = 0) then writeln('В заданном диапазоне не найдено ни одной цифры, которые делятся одновременно на 3 и 4!')
else writeln('summa: ',summa,' ;kolvo: ',kolvo);
readln;
end.

какой кошмар,
ты так и не понял ничего ... вот что значит паскаль....
вот что значит ******ский цикл фор, позволяющий толькол увеличить или уменьшить переменную на единицу... хотя в моем коде переменная тоже увеличивалась на единицу
по большому счету, раз речь пошла о высоких материях

class progression {

function progression($type, $first_member, $step, $last_member) { .. }
...
function sum() { ....}

function numeric { ... }

}

но от ТС то хотели ж не этого
 
Что значит паскаль?
 
kaska_, думаешь, что TurboPascal знает что-то про директиву {$APPTYPE CONSOLE}? SysUtils где прикажешь ТурбоПаскалю искать? :D
:D та ну это же я просто код с 8 сообщения скопировал, а там же видно, что он на Делфи написан. А правильно будет конечно же так, как в начале ТС написал, т.е.:
program One ;
uses crt ;
var
...
begin
clrscr;
...
 
Арефмитическая прогрессия называется. =)
 
А ты ****? Ума не хватает подпилить под турбопаскаль?

Или трудно скормить процедуре параметры?

Если TurboPascal не умеет привести булевский тип к целочисленному, то тот typecast можно спокойно развернуть в конструкцию if..then

Суть алгоритма простая как двери.
Ну так вот возьми и подпили под Турбо Паскаль, у тебя ведь видимо хотя бы Делфи есть, в отличие от меня :rolleyes:

kaska_, не пиши так больше. влом вникать в нечитабельный код. не стоит менять переменную цикла for внутри тела цикла если не хочешь запутать читающего.
а чем там можно запутать? Сначало цикл идёт по одном шагу с начала диапазона до первого числа, который соответствует условию, а потом идёт только по тем числам, которые соответствуют условию, доходит до последнего такого числа и в конце опять идёт по одному шагу до конца диапазона.
 
издержки цикла фор...
а вот есть мнение, что
for i:=-100 to 100 do
if ((i mod 3)=0) and ((i mod 4)=0) then
begin
summa:=summa+i;
kolvo:=kolvo+1;
if ((i+step)<=100) then
i:=i+step;
end;
не отработает правильно
первое удовлетворяющее условию число -96 , -96+12 < 100 поэтому i=-96+12 =-84
но на следующую итерацию то прийдет -83
автор проверял свой шедевр? что то я сомневаюсь в корректности кода
даже если он рабочий, то написан супротив рекомк=ендация использования фора - там четко сказано, "не трогать переменную цикла, не менять ее", я не прав?
 
Никода не было рекомендации не трогать переменную цикла ниде.
Есть рекомендация помещать все итеративные переменные в цикл. :Р
 
Никода не было рекомендации не трогать переменную цикла ниде.
Есть рекомендация помещать все итеративные переменные в цикл. :Р

только итерировать их надо правильно, либо на +1 средствами самого фора, либо , если надо на 12, то в вайле... как то так, или нет?
обратите внимание, у меня не $i+=12 a $i++ хотя написаить код, легко переписываемый на паскаль, я не делал целью
но, как оказалось, ухитрились идею сокращения итераций реализовать итерируя не количество целочисленных частных
 
Компилятор delphi грязно выругается при попытке скомпилить код наподобие:
Код:
for i := 1 to 100 do
  inc(i);
 
издержки цикла фор...
а вот есть мнение, что
for i:=-100 to 100 do
if ((i mod 3)=0) and ((i mod 4)=0) then
begin
summa:=summa+i;
kolvo:=kolvo+1;
if ((i+step)<=100) then
i:=i+step;
end;
не отработает правильно
первое удовлетворяющее условию число -96 , -96+12 < 100 поэтому i=-96+12 =-84
но на следующую итерацию то прийдет -83
автор проверял свой шедевр? что то я сомневаюсь в корректности кода
даже если он рабочий, то написан супротив рекомк=ендация использования фора - там четко сказано, "не трогать переменную цикла, не менять ее", я не прав?
да, там проще вообще этот step убрать :rolleyes:

Чтобы так было:
for i:=-100 to 100 do
if ((i mod 3)=0) and ((i mod 4)=0) then
begin
summa:=summa+i;
kolvo:=kolvo+1;
if ((i+12)<=100) then
i:=i+11;
end;

ЗЫ: ясен перец, что ни на чём я этот код не проверял, не на чем :D
 
маразм крепчает :D
 
так это же вы начали с этими всеми 12, напишите лучше ТСу нормальный код на Турбо Паскале :D
Сейчас лучше напишу, чтоб оператор все цифры вводил, только я забыл какой там оператор прерывания, вроде же не abort. Exit что ли? :D
 
ТС'у алгоритм разжевали уже как могли, при чем не один вариант. Если у него не хватит ума сложить в кучу три десятка операторов, то в университете он зря теряет время.

Прерывание цикла в pascal (да и не только в нем) break.
 
program One ;
uses crt ;
var
i,summa,kolvo,MinD,MaxD,Del1,Del2:integer;

begin
clrscr;
summa:=0;
kolvo:=0;
Write('Введите начальное число диапазона: '); ReadLn(MinD);
Write('Введите конечное число диапазона: '); ReadLn(MaxD);
Write('Введите первый делитель: '); ReadLn(Del1);
Write('Введите второй делитель: '); ReadLn(Del2);
If (Del1=0) or (Del2=0) then
begin
WriteLn('Деление на ноль запрещенно!'); ReadKey; Exit
end else
for i:=MinD to MaxD do
if ((i mod Del1)=0) and ((i mod Del2)=0) then
begin
summa:=summa+i;
kolvo:=kolvo+1
end;
if (kolvo = 0) then writeln('В диапазоне от ',MinD,' до ',MaxD,' не найдено ни одной цифры, которые делятся одновременно на ',Del1,' и ',Del2, '!')
else writeln('summa: ',summa,' ;kolvo: ',kolvo);
ReadKey
end.

:D да, только там ещё нужно будет местами поменять, если MinD>MaxD, а это ещё одна лишняя переменная :D

Что-то типа такого:
...
end else
If MinD>MaxD then
begin
MinMaxD:=MinD;
MinD:=MaxD;
MaxD:=MinMaxD
end;
for i:=MinD to MaxD do
...
 
kaska_, почитай про арифметическую прогрессию. во вторых, если уж и использовать цикл, то перебирать нужно только нужные значения.

Код:
Del3 = Del1 * Del2;

if MinD mod Del3  <> 0 then
  MinD := (MinD div Del3 + 1) * Del3;

while MinD <= MaxD do begin
  summa := summa + MinD;
  inc(kolvo);
  MinD := MinD + Del3;
end;

Зачем использовать третью переменную для обмена значениями? ;)
 
Хм, и откуда ты вот это знаешь -> MinD := (MinD div Del3 + 1) * Del3 ?

А в остальном конечно же всё понятно. Только если бы ещё конечно вот эту формулу заранее знать.
 
Подумай головой. ;)

Есть число 33. Нам нужно начинать с чего-нить кратного 12. Как получить? Если число отрицательное, то просто умножить результат целочисленного деления на делитель ((-100 div 12) * 12 = -96). В ином случае:
1. Узнать сколько раз 12 вошло в 33 (33 div 12 = 2)
2. Увеличить полученное значение на 1, чтобы отсечь хвост. (2 + 1 = 3)
3. Ну и умножить на делитель (3 * 12 = 36).

Если число изначально кратное делителю, то его трогать не стоит :D Итого для Pascal код будет выглядеть следующим образом:
Код:
if MinD mod Del3 <> 0 then
  if MinD >= 0 then
    MinD := (MinD div Del3 + 1) * Del3
  else
    MinD := (MinD div Del3) * Del3;
 
Останнє редагування:
Закройте ветку, я не могу работать :підстолом::підстолом:.
 
Назад
Зверху Знизу