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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка на входных данные, Помогите с лабораторной на C. 
:(
    Опции темы
prowoke
Дата 20.11.2010, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Мне нужна помощь по лабораторной работе. Разложение синус через ряд тейлора на C. Саму лабу я сделал. Я не могу понять как мне сделать проверку, чтобы входные данные были только положительные и отрицательные числа. В справочнике вроде функция isdigit() это делает. Но она как то по хитрому делает и только с типом данных char. В общем никак не могу допереть как мне это реализовать. Помогите пожалуйста. Вот сам код лабы.
Код

#include <stdio.h>
#include <math.h>      
int main()
      {
// Определяем типы данных.
float  x,  stx, sinx, e, realx, y, pi, factorial;
int inc, z;
double i;

// Ввод данных.
printf("Input x: ");
scanf("%f", &x);
pi = 3.141592653;
e = 0.001;
// Проверка данных и преобразование к нужному виду.
    if (x > 360 || x < 0)
    {
    y = x/360;
    y = fabs (y);
    modf(y, &i);
        if (x > 360)
        {
        realx = x-i*360;    
        }
        if (x < 0)
        {
        i = i + 1;
        realx = x + i*360;
        }    
    }
    else
    {
    realx = x;
    }
    realx = pi*realx/180;
        stx = realx;
        factorial = 1;
        sinx = 0;
        inc = 1;
        z = 1;

// Раскладываем синус через ряд Тейлора.
        while (stx/factorial >= e) 
        {
        sinx = sinx + z*stx/factorial;
        inc = inc + 2;
        stx = stx*realx*realx;
            factorial = factorial*(inc-1)*inc;
            z = z*(-1);
        }

// Вывод данных.
    printf ("Sin %.0f = %.3f\n", x, sinx);

    return 0;
     }

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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



prowoke, isdigit возвращает не ноль (читай true), когда проверяемый символ является цифрой. Это не твой случай.
Вообще-то числа в переменной вещественного типа бывают 5-х типов: "нечисло" (NaN - not a number), "бесконечность" (+inf/-inf), 0, отрицательное и положительное. Ты хочешь исключить три первых? То это делается просто: if ((x < 0) || (x > 0)) {}
PM   Вверх
prowoke
Дата 20.11.2010, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну я хочу исключить первые 2. Синус 0 тоже существует.
Если я делает так как вы посоветовали, то он почему то буквы тоже считает и выводит результат, как будто бы введён 0. Вот как я код сдеал.
Код

#include <stdio.h>
#include <math.h>      
int main()
      {
// Определяем типы данных.
float  x,  stx, sinx, e, realx, y, pi, factorial;
int inc, z;
double i;

// Ввод данных.
printf("Input x: ");
scanf("%f", &x);
pi = 3.141592653;
e = 0.001;
// Проверка данных и преобразование к нужному виду.
if ((x >= 0) || (x <= 0))
 {
    if (x > 360 || x < 0)
    {
    y = x/360;
    y = fabs (y);
    modf(y, &i);
        if (x > 360)
        {
        realx = x-i*360;    
        }
        if (x < 0)
        {
        i = i + 1;
        realx = x + i*360;
        }    
    }
    else
    {
    realx = x;
    }
    realx = pi*realx/180;
        stx = realx;
        factorial = 1;
        sinx = 0;
        inc = 1;
        z = 1;

// Раскладываем синус через ряд Тейлора.
        while (stx/factorial >= e) 
        {
        sinx = sinx + z*stx/factorial;
        inc = inc + 2;
        stx = stx*realx*realx;
            factorial = factorial*(inc-1)*inc;
            z = z*(-1);
        }

// Вывод данных.
    printf ("Sin %.0f = %.3f\n", x, sinx);
}
else
{
printf ("Wrong x !! \n");
}
    return 0;
     }

PM MAIL   Вверх
Леопольд
Дата 21.11.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(prowoke @  20.11.2010,  01:05 Найти цитируемый пост)
if ((x >= 0) || (x <= 0))
Когда это условие не выполнится?


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


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


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

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



prowoke, вместо 0 нужно e и -е ..




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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



mes, думаю, нужно if (abs(x) < e)... Имхо, так более математически. Кстати, в твоем случае нужно еще и || менять на &&
PM   Вверх
prowoke
Дата 26.11.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем сделал таким вот образом:
Код

if ((x <= e) && (x >= -e))
{
printf ("Wrong x !! \n");
}    
else
{
// Код программы    
 }

Только теперь у меня пару вопросов. Справочником, которым я пользовался в интеренте, он старый и не особо хороший и там я не нашёл что такое "e"  и вообще там мало чего. А книг я по C никаких не читал, поэтому знания по этому языку у меня кусочные, а точнее никаких. Так вот расскажите мне вкратце что именно то я сделал? Почему проверка на "и" а не на "или". И что за е? Просто что то меня заинтересовал C, может быть для себя им увлекусь, а то  после PHP , он кажется таким умным и для "программистов" smile. 
PM MAIL   Вверх
toxx
Дата 26.11.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

И что за е?


так это у тебя наверно нужно спросить?) ты лабу делал вроде бы?) 

Цитата

Почему проверка на "и" а не на "или"

Наверно потому, что ты проверяешь на диапазон значений?Если будет или это не будет область на прямой.
PM MAIL   Вверх
prowoke
Дата 26.11.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(toxx @ 26.11.2010,  22:11)
Цитата

И что за е?


так это у тебя наверно нужно спросить?) ты лабу делал вроде бы?) 

Цитата

Почему проверка на "и" а не на "или"

Наверно потому, что ты проверяешь на диапазон значений?Если будет или это не будет область на прямой.

Ну да. Я чёт про какие то константы думал. А e это точность. Я понял всё, что я сделал. 
PM MAIL   Вверх
xvr
Дата 29.11.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



В VS есть функция _finite, как раз то, что нужно.
Цитата(prowoke @  20.11.2010,  01:05 Найти цитируемый пост)
Если я делает так как вы посоветовали, то он почему то буквы тоже считает и выводит результат, как будто бы введён 0.
Это не отработал scanf - проверяй возвращаемое им значение (должна быть 1)


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

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

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

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

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


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

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


 




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


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

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