Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2013, 20:02   #31
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Ягодка Посмотреть сообщение
Цикл Repeat-Until при этом остаётся?
Да, конечно. У Вас же все делается в цикле, и ошибка там вычисляется, и центроиды. Просто в случае, когда у Вас новый центроид и предыдущий совпадут, программа выйдет из цикла repeat..until и продолжит выполнение.

То, что я написал, это все внутри цикла. Если с учетом кода, что Вам исправил преподаватель, то как-то так:


Код:
Repeat

{ ... }

x1 := m1[1];  y1 := m1[2];  z1 := m1[3];
x2 := m2[1];  y2 := m2[2];  z2 := m2[3];


for i:=1 to 10 do begin
sumIn1:=sumIn1+In1[i];
sumIn2:=sumIn2+In2[i];
end;

for i:=1 to 10 do begin
sumKol1:=sumKol1+(Kol[i]*In1[i]);
sumGar1:=sumGar1+(Gar[i]*In1[i]);
sumRem1:=sumRem1+(Rem[i]*In1[i]);
sumKol2:=sumKol2+(Kol[i]*In2[i]);
sumGar2:=sumGar2+(Gar[i]*In2[i]);
sumRem2:=sumRem2+(Rem[i]*In2[i]);
end;

for i:=1 to 3 do begin
m1[1]:=sumKol1/sumIn1;
m1[2]:=sumGar1/sumIn1;
m1[3]:=sumRem1/sumIn1;
m2[1]:=sumKol2/sumIn2;
m2[2]:=sumGar2/sumIn2;
m2[3]:=sumRem2/sumIn2;
end;

if (x1-m1[1] = 0) and (y1-m1[2]=0) and (z1-m1[3]=0)
    and (x2-m2[1] = 0) and (y2-m2[2]=0) and (z2-m2[3]=0) then
  break;

Until {...}
Μολὼν λαβέ

Последний раз редактировалось alexander13; 19.02.2013 в 20:05.
alexander13 вне форума Ответить с цитированием
Старый 19.02.2013, 20:09   #32
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

alexander13, пребольшое спасибо, всё получилось =)
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 20:15   #33
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Ягодка Посмотреть сообщение
alexander13, пребольшое спасибо, всё получилось =)
Да не за что, обращайтесь.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 19.02.2013, 20:17   #34
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

Хмм... а я сделала
Код:
Until (x1-m1[1] = 0) and (y1-m1[2]=0) and (z1-m1[3]=0)
    and (x2-m2[1] = 0) and (y2-m2[2]=0) and (z2-m2[3]=0);
Не писать же в Until снова E<E1/1000
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 20:19   #35
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

Вот полный текст:
Код:
Repeat
sumKol1:=0;
sumGar1:=0;
sumRem1:=0;
sumIn1:=0;
sumKol2:=0;
sumGar2:=0;
sumRem2:=0;
sumIn2:=0;
E:=0;

x1 := m1[1];  y1 := m1[2];  z1 := m1[3];
x2 := m2[1];  y2 := m2[2];  z2 := m2[3];

for i:=1 to 10 do begin
sumIn1:=sumIn1+In1[i];
sumIn2:=sumIn2+In2[i];
end;

for i:=1 to 10 do begin
sumKol1:=sumKol1+(Kol[i]*In1[i]);
sumGar1:=sumGar1+(Gar[i]*In1[i]);
sumRem1:=sumRem1+(Rem[i]*In1[i]);
sumKol2:=sumKol2+(Kol[i]*In2[i]);
sumGar2:=sumGar2+(Gar[i]*In2[i]);
sumRem2:=sumRem2+(Rem[i]*In2[i]);
end;

for i:=1 to 3 do begin
m1[1]:=sumKol1/sumIn1;
m1[2]:=sumGar1/sumIn1;
m1[3]:=sumRem1/sumIn1;
m2[1]:=sumKol2/sumIn2;
m2[2]:=sumGar2/sumIn2;
m2[3]:=sumRem2/sumIn2;
end;

for i:=1 to 10 do begin
Dm1[i]:=sqrt(sqr((Kol[i]-m1[1]))+sqr((Gar[i]-m1[2]))+sqr((Rem[i]-m1[3])));
Dm2[i]:=sqrt(sqr((Kol[i]-m2[1]))+sqr((Gar[i]-m2[2]))+sqr((Rem[i]-m2[3])));
if Dm1[i]<Dm2[i] then
In1[i]:=1 else
In1[i]:=0;
if Dm1[i]<Dm2[i] then
In2[i]:=0 else
In2[i]:=1;
E:=E+((sqr(Dm1[i])*In1[i])+(sqr(Dm2[i])*In2[i]));
end;

Until (x1-m1[1] = 0) and (y1-m1[2]=0) and (z1-m1[3]=0)
    and (x2-m2[1] = 0) and (y2-m2[2]=0) and (z2-m2[3]=0);
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 20:21   #36
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Ягодка Посмотреть сообщение
Хмм... а я сделала
Код:
Until (x1-m1[1] = 0) and (y1-m1[2]=0) and (z1-m1[3]=0)
    and (x2-m2[1] = 0) and (y2-m2[2]=0) and (z2-m2[3]=0);
Не писать же в Until снова E<E1/1000
Ну я бы все же оставил первый вариант. А вдруг найдутся такие входные данные и центроиды, что ошибка у Вас все-таки будет в 1000 раз меньше, а центроиды еще не стабилизировались?
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 19.02.2013, 20:25   #37
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

И то правда... Спасибо! =*
Ягодка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл repeat until ac1d_buRn Помощь студентам 4 06.10.2009 21:55
Как правильно построить цикл для выборки? Tanuska___:) БД в Delphi 1 12.01.2009 14:50
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34