Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите пожалуста понять почему C++ ...  (Прочитано 12740 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Arcadie
Гость
« : 25-05-2008 08:10 » 

Код:
struct gene
{
int alleles[4];
int fitness;
        int i;
float likelihood;

// тестирует на равноправие
operator==(gene gn)
 //{
      for (i=0 ;   i<4 ;   i++)
{
  if (gn.alleles[i] != alleles[i]) return false else  return true;

       }

return true;

};

выдает ошибки около 9 штук именно на цикле for
« Последнее редактирование: 25-05-2008 08:15 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-05-2008 08:18 » 

Arcadie,

потому что красиваое форматирование рулит Улыбаюсь

Код:
struct gene
{
   int alleles[4];
   int fitness;
   int i;
   float likelihood;

   // тестирует на равноправие
   bool operator==(const gene& gn) const
   {
      for (i=0 ;   i<4 ;   i++)
      {
         if(gn.alleles[i] != alleles[i])return false;
         return true;
      }

      return true;
   }
};

и сразу видно, где нарушения синтаксиса

остаётся невнятной логика - зачем цикл, если он всегода только один раз выполнится ?
« Последнее редактирование: 25-05-2008 08:20 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 25-05-2008 08:21 » 

кстати, я ещё подправил свой пост, если ты уже читал его
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #3 : 25-05-2008 08:23 » 

Алексей1153++, не опытный не заметит  Ага
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 25-05-2008 08:24 » 

я бы поступил так:

Код:
#pragma pack(push,1)

struct gene
{
   int alleles[4];
   int fitness;
   int i;
   float likelihood;

   // тестирует на равноправие
   bool operator==(const gene& gn) const
   {
      return (0==memcmp(gn.alleles,alleles,sizeof(gn.alleles)));
   }
};
#pragma pack(pop)

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 25-05-2008 08:25 » 

Алексей1153++, не опытный не заметит  Ага

а что замечать то Улыбаюсь Когда форматирование понятное глазу - видно всё хорошо Улыбаюсь
Записан

Arcadie
Гость
« Ответ #6 : 25-05-2008 10:16 » 

Код:
class CDiophantine {
public:
CDiophantine(int, int, int, int, int);
// конструктор с каэфициентом для a,b,c,d.
int Solve();

// Возврат gene.
gene GetGene(int i) { return population[i];}

protected:
int ca,cb,cc,cd;
int result;
gene population[MAXPOP];
int Fitness(gene &);
void GenerateLikelihoods();
// генерирование likelihoods.
float MultInv();

int CreateFitnesses();
void CreateNewPopulation();
int GetIndex(float val);

gene Breed(int p1, int p2);

};

CDiophantine::CDiophantine(int a, int b, int c, int d, int res) : ca(a), cb(b), cc(c), cd(d), result(res) {//}

int CDiophantine::Solve()
{
int fitness = -1;
srand((unsigned)time(NULL));
for(int i=0;i<MAXPOP;i++) {
for (int j=0;j<4;j++) {
    population[i].alleles[j] = rand() % (result + 1);
}
}
if (fitness = CreateFitnesses()) {
return fitness;
}
int iterations = 0;
/
while (fitness != 0 || iterations < 50)
{
     GenerateLikelihoods();
CreateNewPopulation();
if (fitness = CreateFitnesses()) {
return fitness;
}

iterations++;
}

return -1;
}

int CDiophantine::Fitness(gene &gn) {
int total = ca * gn.alleles[0] + cb * gn.alleles[1] + cc * gn.alleles[2] + cd * gn.alleles[3];

return gn.fitness = abs(total - result);
}

int CDiophantine::CreateFitnesses() {
float avgfit = 0;
int fitness = 0;
for(int i=0;i<MAXPOP;i++) {
fitness = Fitness(population[i]);
avgfit += fitness;
if (fitness == 0) {
return i;
}
}

return 0;
}

float CDiophantine::MultInv() {
float sum = 0;

for(int i=0;i<MAXPOP;i++) {
sum += 1/((float)population[i].fitness);
}

return sum;
}

void CDiophantine::GenerateLikelihoods() {
float multinv = MultInv();

float last = 0;
for(int i=0;i<MAXPOP;i++) {
population[i].likelihood = last = last + ((1/((float)population[i].fitness) / multinv) * 100);
}
}

int CDiophantine::GetIndex(float val) {
float last = 0;
for(int i=0;i<MAXPOP;i++) {
if (last <= val && val <= population[i].likelihood) return i;
else last = population[i].likelihood;
}

return 4;
}

gene CDiophantine::Breed(int p1, int p2) {
int crossover = rand() % 3+1;
int first = rand() % 100;
gene child = population[p1];
int initial = 0, final = 3;
if (first < 50) initial = crossover;
else final = crossover+1;
for(int i=initial;i<final;i++) {
child.alleles[i] = population[p2].alleles[i];
if (rand() % 101 < 5) child.alleles[i] = rand() % (result + 1);
}
return child;

}

void CDiophantine::CreateNewPopulation() {
gene temppop[MAXPOP];

for(int i=0;i<MAXPOP;i++) {
int parent1 = 0, parent2 = 0, iterations = 0;
while(parent1 == parent2 || population[parent1] == population[parent2])
{
parent1 = GetIndex((float)(rand() % 101));
parent2 = GetIndex((float)(rand() % 101));
if (++iterations > 25) break;
}

temppop[i] = Breed(parent1, parent2);
}

for(i=0;i<MAXPOP;i++) population[i] = temppop[i];
}
       
}


изза чего видается ошибка identifier Solve cannot have a type qualifier(int CDiophantine::Solve())
deklaration mising (конец)
« Последнее редактирование: 25-05-2008 10:20 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 25-05-2008 10:21 » 

опечатка в коде:

Код:
	int iterations = 0;
/                <--------- ТУТ
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 25-05-2008 10:23 » 

и тут

CDiophantine::CDiophantine(int a, int b, int c, int d, int res) : ca(a), cb(b), cc(c), cd(d), result(res) {//}

надо

CDiophantine::CDiophantine(int a, int b, int c, int d, int res) : ca(a), cb(b), cc(c), cd(d), result(res) {}
Записан

Arcadie
Гость
« Ответ #9 : 25-05-2008 10:48 » 

сечас выдает ошибку
на последней } unexpected }
и два Warning один на if (fitness = CreateFitnesses()) possible inncorect assigment
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 25-05-2008 11:05 » 

Arcadie, синтаксис учи обязательно! Ну чё в самом то деле , ругается на лишнюю скобку - удали лишнюю скобку

Цитата
if (fitness = CreateFitnesses())

компилятор говорит тебе - возможно, неверный аргумент. Скорее всего ты поставил "=" вместо "==" , а "=" у тебя ничего не возвращает (скорее всего)
Записан

Arcadie
Гость
« Ответ #11 : 25-05-2008 11:46 » 

спасибо тебе огромное
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 25-05-2008 11:48 » 

да не за что же Улыбаюсь
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #13 : 26-05-2008 06:30 » new

Arcadie, при копировании примеров, ты хоть проглядывай глазами что там написано вообще Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines