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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в for или if? или где вообще) 
V
    Опции темы
Kruger2
Дата 15.1.2011, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Задание:
 Задание: Вычислить и вывести на экран значения аргумента и значения функции, заданной несколькими выражениями, для заданного интервала  хн ≤ x ≤ хк и шага dx изменения аргумента. Параметры a, b, c – действительные числа.



F = 1 / (a * x) - b; при х + а < 0 и с = 0

F = (x - a)/sinx; при х + a > 0 и с ≠ 0

F = 10 * x / (c - 6);  в остальных случаях


Код

#include <stdio.h>
#include <math.h>
main ()
{
     double F, x, a, b, c, xn, xk, step, sinx;
     
     printf("Enter xn < x < xk (xn) \n", xn);
     scanf("%lf", &xn);
     
     printf("Enter xk: \n", xk);
     scanf("%lf", &xk);
     
     printf("Enter step: \n");
     scanf("%lf", &step);
     
     printf("Enter a: \n");
     scanf("%lf", &a);
     
     printf("Enter b: \n");
     scanf("%lf", &b);
     
     printf("Enter c: \n");
     scanf("%lf", &c);
     
    
     
     
    for(x=xn; x<=xk; x+=step){
       printf ("x= \n", &x);
        if((x+a)<0 && c==0)
            F=1.0/(double)(a*x) - b;
        }else{
            if((x+a)>0 && c!=0)
                F=(x-a)/sin((double)x);
            }else{
                F = 10 * x / (c - 6);
            }
        }
        printf(" F= \n", &F);
    }
         
         
system("pause");
 return 0;    
}     
     


     

объясните кто нить, почему мне тут выдаёт просто 
F=
F=
F=

 и т.д., 2 стены уже сломал)


Это сообщение отредактировал(а) Kruger2 - 15.1.2011, 22:50
PM MAIL   Вверх
mes
Дата 15.1.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Kruger2 @  15.1.2011,  21:30 Найти цитируемый пост)
    printf(" F= \n", &F);

а где  плейсхолдер в строке формата для  переменной ?



--------------------
PM MAIL WWW   Вверх
Kruger2
Дата 15.1.2011, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не совсем ориентируюсь в том что есть плейсхолдер(

Добавлено через 2 минуты и 17 секунд
F объявил как double, значение F определяется выражением, которые будет зависеть от условий. Затем должно вывести значение F, после расчета уравнения.

Куда ещё засунуть F надо?
PM MAIL   Вверх
mes
Дата 15.1.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



откуда она узнает куда надо выводить значение F ? 
вообщем почитайте описание строки формата (для printf) и обратите внимание на спецификаторы (%..)



--------------------
PM MAIL WWW   Вверх
Kruger2
Дата 15.1.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо, детская ошибка конечно


printf(" F= %.lf\n", F) без амперсанды естесно)


но теперь выдаёт в ответе 78000000000000000000000000000000000000000000000000000000000000000000000000000000 и ещё много такого, есть идеи, что тут не так?)

Это сообщение отредактировал(а) Kruger2 - 15.1.2011, 23:16
PM MAIL   Вверх
mes
Дата 15.1.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Kruger2 @  15.1.2011,  22:09 Найти цитируемый пост)
но теперь выдаёт в ответе 

eще не все ошибки исправили.. посмотрите, что именно Вы передаете принтфу..




--------------------
PM MAIL WWW   Вверх
Kruger2
Дата 15.1.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Значнеие функции F передаётsmile

было подозрение, что принтф не вылавливает только значения последнего блока {}, но вроде правильно всё :(

Добавлено через 5 минут и 29 секунд
Разобрался, вспомнил, что if может содержать 1 действие, без скобок, поэтому удалив их всех нафик получил ответ smile

Большое спасибо, за наводящие вопросы, очень правильно)
PM MAIL   Вверх
mes
Дата 16.1.2011, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Kruger2 @  15.1.2011,  22:28 Найти цитируемый пост)
Значнеие функции F передаёт

Цитата(Kruger2 @  15.1.2011,  22:09 Найти цитируемый пост)
без амперсанды естесно)

теперь  да smile


--------------------
PM MAIL WWW   Вверх
Kruger2
Дата 16.1.2011, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дальше больше, задаю интервал от -50 до 50 с шагом 10.
получаю
-50    F
-40    F
-30    F
-20    F
-10    F Это значение равно следующему
0       F Вот этому

10     F

Причины ошибки мне понятны, деление на ноль. Но как сделать проверку?
 
Код

if (x == 0)
   printf("Delenie na nol` \n", F);



не получается, т.к просто вставляется рядом, а не заменяет F. Значение F при делении на ноль мне неизвестно. Как выполнить проверку деления на ноль?


Код

#include <stdio.h>
#include <math.h>
main ()
{
     float x, a, b, c, xn, xk, step;
     
     printf("xn < x < xk  Enter (xn) \n", xn);
     scanf("%f", &xn);
     
     printf("Enter xk: \n", xk);
     scanf("%f", &xk);
     
     printf("Enter step: \n");
     scanf("%f", &step);
     
     printf("Enter a: \n");
     scanf("%f", &a);
     
     printf("Enter b: \n");
     scanf("%f", &b);
     
     printf("Enter c: \n");
     scanf("%f", &c);
     
    
     float F;
     puts("\n\nArgument\t\tValue");
     
    for(x = xn; x <= xk; x += step){
        printf("%6.2lf\t\t", x);
       
        if((x + a)<0 && c == 0 && (a * x) != 0 )
            F=1.0/(a*x) - b;
        else
            if((x+a)>0 && c!=0 && x != 0  )
                F=(x-a)/sin(x);
           else if (c != 6.)  
                F = 10 * x / (c - 6);
                
                  printf("%15lf\n", F);
                  
                  if (x == 0)
                   printf("Delenie na nol` \n", F);
                }
         
system("pause");
 return 0;    
}   


Это сообщение отредактировал(а) Kruger2 - 16.1.2011, 00:24
PM MAIL   Вверх
Kruger2
Дата 16.1.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решил  smile  smile 

Код

#include <stdio.h>
#include <math.h>
main ()
{
     float F, x, a, b, c, xn, xk, step;
     
     printf("Enter (xn) for the interval xn < x < xk \n", xn);
     scanf("%f", &xn);
     
     printf("Enter (xk) for the interval xn < x < xk : \n", xk);
     scanf("%f", &xk);
     
     printf("Enter step: \n");
     scanf("%f", &step);
     
     printf("Enter a: \n");
     scanf("%f", &a);
     
     printf("Enter b: \n");
     scanf("%f", &b);
     
     printf("Enter c: \n");
     scanf("%f", &c);
     
    
     puts("\n\nArgument\t\tValue\n");
     
    for(x = xn; x <= xk; x += step){
        printf("%6.2lf\t\t", x);
        
        if((x + a)<0 && c == 0 && (a * x) != 0 )
                F=1.0/(a*x) - b;
        else if((x+a)>0 && c!=0 && x != 0  )
                F=(x-a)/sin(x);
        else if (c != 6.)  
                F = 10 * x / (c - 6);
                
        x == 0 ? puts("   divide by zero") : printf("%15lf\n", F);      
        }
         printf("\n\n");
system("pause");
return 0;    
}    


По ходу решения и поиска ошибок программа стала намного красившеsmile

Всем большое спасибо за помощь.
PM MAIL   Вверх
mes
Дата 16.1.2011, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Kruger2 @  15.1.2011,  23:58 Найти цитируемый пост)
По ходу решения и поиска ошибок

ну тогда стоит почитать еще о сравнении чисел с плавающей запятой.. 



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

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

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

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

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


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

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


 




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


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

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