Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странно ведет себя код 
:(
    Опции темы
cuore
Дата 16.5.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.11.2012

Репутация: нет
Всего: нет



Вот такой вот код
Код

#include <stdio.h>
#include <conio.h>
#include <dos.h>

int main()
{
 int i;
 double 
     a = 0.7,
     b = 0.8,
     y = 0,
     f[3],
     x[4] = {1,1,1,1},
     k[3] = {1,1,1};
 double 
     y1[3],
     fmax[4] = {0,0,0,0};

 for (i = 2; i >= 0; i--)
 {
     for (y = 0; y < 1; y += 0.001)
     {
         f[i] = 0.6*y + 0.5*(1-y) + fmax[i+1] * (a*y + b*(1-y));
         if(f[i] > fmax[i])
         {
             fmax[i] = f[i];
             y1[i] = y;
         }        
     }
     if (y1[i] == 1) 
     {
         k[i] = a;
     } 
     else 
     {
         k[i] = b;
     }    
    printf("i= %d, y=%4.2f, fmax[%d]=%f", i, y1[i], i, fmax[i]);
    printf("\n");
 }

for (int r=0; r<3; r++) printf("%.2f ", k[r]);


 cprintf("\nostatki sredstv:\n");
 for (i=1;i<=3;i++)
 {
    x[i]=k[3-i]*x[i-1];
    printf("\nx%d=%4.3f*x",i,x[i]);
 }
 getch();
 return 0;
}

Странно работает часть
Код

 if (y1[i] == 1) 
     {
         k[i] = a;
     } 
     else 
     {
         k[i] = b;
     }    

ведь она должна присваивать итому элементу массива k или а, или b, в зависимости от того, какой y1[i]. Однако этого не происходит - если вывести полученный массив 
Код

for (int r=0; r<3; r++) printf("%.2f ", k[r]);

то получается, что он заполняется только значениями b, хотя должно сначала дважды присвоиться а, а один раз - b.
Что не так? 
PM MAIL   Вверх
Guinness
Дата 16.5.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Код

    for (i = 2; i >= 0; i--){
        for (y = 0; y < 1; y += 0.001){
            f[i] = 0.6*y + 0.5*(1-y) + fmax[i+1] * (a*y + b*(1-y));
            if(f[i] > fmax[i]){
                fmax[i] = f[i];
                y1[i] = y;
            }
        }

        k[i] = (y1[i] == 1) ? a : b;

        // printf("f[%d] = %f\n", i, f[i]);
        printf("y1[%d] = %f\n", i, y1[i]);
        printf("fmax[%d] = %f\n", i, fmax[i]);
        printf("k[%d] = %f\n", i, k[i]);
        printf("-------------------------------------\n");
    }


Посмотри вывод. У тебя "у" строго меньше 1, т.к. в цикле строгое неравенство.

Ну и сравнивать числа с плавающей точкой таким образом y1[i] == 1 - бесполезно.  Погугли по поводу сравнения чисел с плавающей точкой.

Это сообщение отредактировал(а) Guinness - 16.5.2013, 15:46
PM MAIL   Вверх
cuore
Дата 16.5.2013, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.11.2012

Репутация: нет
Всего: нет



так ведь все равно не так получается...
Вот на скрине запущенной программы
user posted image
там, где отмечено кружком - k должно быть 0.8, а где прямоугольником - 0.7.
А оно везде 0.8..

Это сообщение отредактировал(а) cuore - 16.5.2013, 17:10
PM MAIL   Вверх
Guinness
Дата 16.5.2013, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Рекомендую все же прочитать про сравнение чисел с плавающей точкой.
Так вот на последней итерации, когда складывается 0.999... + 0.001, вряд ли получится 1. Поэтому код выполняется некорректно.
Рекомендую переделать цикл. Например так:
Код

int y_begin = 0;
int y_end = 1;
int num_steps = 1000;
double step = (y_end - y_begin) / num_steps;

y = y_begin;
for(int num = 0; num <= num_steps; ++num){
     // тело цикла
     y += step;
}


И естественно определить функцию сравнения чисел double.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0803 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.