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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2012, 20:42   #1
Silken Lili
Новичок
Джуниор
 
Регистрация: 25.09.2012
Сообщений: 3
По умолчанию Ошибка в программе на С

Дано задание : удовлетворяют ли элементы последовательности данному рекурентному соотношению: с1*a(i-1)+c2*ai+c3*a(i-1)=b
Вроде написала, но есть ошибка, из-за которой программа не запускается.
Помогите, пожалуйста, с ошибкой =__=


#include <stdio.h>
#include <math.h>

int main(void)
{
double x, y, z, b, c1, c2, c3, sum;
FILE *fin=NULL;
if ( (fin=fopen("input.txt", "r"))==NULL)
{printf("didnt open"); return -1;}

printf ("write c1, c2, c3 and b\n");
scanf ("%lf%lf%lf%lf", c1, c2, c3, b);

while (fscanf(fin, "%lf%lf%lf", &x, &y, &z)==1)
sum=c1*x+c2*y+c3*z;

if (sum==b)
printf("you are right!");
if (sum!=b)
printf("You are wrong!");

return 0;
}
Silken Lili вне форума Ответить с цитированием
Старый 25.09.2012, 21:13   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <stdio.h>
#include <math.h>

int
main(void)
{
    double a1, a2, b, c1, c2, c3, num;
    FILE *fin=NULL;
    if ((fin = fopen("input.txt", "r")) == NULL) {
        printf("Cant open\n");
        return -1;
    }
    printf("Input c1, c2, c3 and b:\n");
    scanf("%lf%lf%lf%lf", c1, c2, c3, b);  
    if (fscanf(fin, "%lf%lf", &a1, &a2) < 2) {
        printf("Count of elements too small\n");
        return -1;
    }
    while(c1 * a1 + c2 * a2 + c3 * a1 == b && fscanf("%lf", &num) > 0) {
        a1 = a2;
        a2 = num;
    }
    if (c1 * a1 + c2 * a2 + c3 * a1 == b) {
        printf("True\n");
    } else {
        printf("False\n");
    }
    return 0;
}
Не проверял.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.09.2012, 21:20   #3
Silken Lili
Новичок
Джуниор
 
Регистрация: 25.09.2012
Сообщений: 3
По умолчанию

мм, при компилировании он показывает "comparing floating point with == and != is unsafe". у меня уже такое не раз было, так и не поняла почему.
и еще, не могли бы вы объяснить вот эту часть :

while(c1 * a1 + c2 * a2 + c3 * a1 == b && fscanf("%lf", &num) > 0) {
a1 = a2;
a2 = num;
}
Silken Lili вне форума Ответить с цитированием
Старый 25.09.2012, 21:33   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,375
По умолчанию

Цитата:
"comparing floating point with == and != is unsafe". у меня уже такое не раз было, так и не поняла почему.
Так понимаю, что сравнение == или != проходит надежно для целых чисел.
Вещественные надо сравнивать с каким то эпсилон, типа:
if (a-b) <= eps.




Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 25.09.2012, 22:03   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

ViktorR прав. Нужно ввести какое-либо eps.
Код:
#include <stdio.h>
#include <math.h>

#define EPS 0.000001

int
main(void)
{
    double a1, a2, b, c1, c2, c3, num;
    FILE *fin=NULL;
    if ((fin = fopen("input.txt", "r")) == NULL) {
        printf("Cant open\n");
        return -1;
    }
    printf("Input c1, c2, c3 and b:\n");
    scanf("%lf%lf%lf%lf", c1, c2, c3, b);  
    if (fscanf(fin, "%lf%lf", &a1, &a2) < 2) {
        printf("Count of elements too small\n");
        return -1;
    }
    while(fabs(c1 * a1 + c2 * a2 + c3 * a1 - b) < EPS && fscanf("%lf", &num) > 0) {
        a1 = a2;
        a2 = num;
    }
    if (fabs(c1 * a1 + c2 * a2 + c3 * a1 - b) < EPS) {
        printf("True\n");
    } else {
        printf("False\n");
    }
    return 0;
}
Сначала считываем 2 элемента.
Затем заходим в условие while.
while(fabs(c1 * a1 + c2 * a2 + c3 * a1 - b) < EPS && fscanf("%lf", &num) > 0) {
a1 = a2;
a2 = num;
}
Сначала проверяется условие для считанных ранее a1 и a2 (первый и второй элементы последовательности).
Если оно истинно, тогда выполняется вторая часть условия, т.е. считывается еще 1 элемент (если возможно).
Если эти условия выполнены, то элементы "сдвигаются" (первый отбрасывается, второй становится на место первого, а ново считанный на место второго).
Затем цикл повторяется.
Он выполняется, пока есть элементы в файле и пока выполняется заданное условие на последовательность.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.09.2012, 22:26   #6
Silken Lili
Новичок
Джуниор
 
Регистрация: 25.09.2012
Сообщений: 3
По умолчанию

спасибо большое, вроде все понятно)
Silken Lili вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе Катакомба Помощь студентам 8 14.10.2011 18:11
Ошибка в программе на Си++ Эммануэль Помощь студентам 20 09.04.2011 18:04
Ошибка в программе Rusl_v Общие вопросы C/C++ 4 17.12.2010 16:24
Ошибка в программе w6120w Общие вопросы C/C++ 3 04.10.2010 19:37
Ошибка в программе. T@tali Паскаль, Turbo Pascal, PascalABC.NET 15 25.05.2010 13:36