Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Знатокам C, помощь в лабе.  (Прочитано 1198 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн prowoke

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Знатокам C, помощь в лабе.
« : 19 Ноября 2010, 12:08:53 »
Вот код программы, которая раскладывает синус через ряд Тейлора.
#include <stdio.h>
#include <math.h>      
int main()
      {
// Определяем типы данных.
float  x,  stx, sinx, e, realx, y, pi, factorial;
int inc, z;
double i;

// Ввод данных.
printf("in x:");
scanf("%f", &x);
pi = 3.141592653;
e = 0.001;
// Проверка данных и преобразование к нужному виду.
if (isdigit(x) == 0)
{
printf ("Wrong format\n");
}
else
{
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 ("%.3f\n", sinx);
}

return 0;
     }
Хочу сделать проверку на введённые данные. Чтобы если были не цифры, то он ругался бы. Ну вот функцию нашёл isdigit. И вроде всё правильно применил, но он на всё пишет "Wrong format". Сам не допру почему, вроде если не цифра, то возвращает фунция 0, ну я условие и сделал, а всё равно не работает так, как надо. В общем подскажите в чём косяк то?

Оффлайн inikakinache

  • Новичок
  • *
  • Сообщений: 12
  • Оправдывать глупости
    • Просмотр профиля
Re: Знатокам C, помощь в лабе.
« Ответ #1 : 19 Ноября 2010, 12:30:55 »
Вот код программы, которая раскладывает синус через ряд Тейлора.
//...
float  x;
//...
scanf("%f", &x);
//...
if (isdigit(x) == 0)
{
printf ("Wrong format\n");
}
else
{
//...
}
//...
Хочу сделать проверку на введённые данные. Чтобы если были не цифры, то он ругался бы. Ну вот функцию нашёл isdigit. И вроде всё правильно применил, но он на всё пишет "Wrong format". Сам не допру почему, вроде если не цифра, то возвращает фунция 0, ну я условие и сделал, а всё равно не работает так, как надо. В общем подскажите в чём косяк то?
Стандартный isdigit() не различает float. Используйте char.
Вот одна из её возможных реализаций
int isdigit(ch)
char ch;
{
    if (ch > '9' || ch < '0') {
      return(FALSE);
    } else {
      return(TRUE);
    }
}


Оффлайн prowoke

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Знатокам C, помощь в лабе.
« Ответ #2 : 19 Ноября 2010, 13:51:50 »
Так если я x на char поменяю, то синус уже неправильно считается, там диапазон значений который char допускает маленький, как я понимаю. Есть ли ещё какие нибудь способы реализовать такую проверку на моём примере? И ещё один вопросик. А если я буду писать в консоли "-6". То фунция тоже будет - возвращать 0 и прерывать программу? Просто на примере из справочника, она отрицательную цифру за цифру не считает.
« Последнее редактирование: 19 Ноября 2010, 13:56:11 от prowoke »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Знатокам C, помощь в лабе.
« Ответ #3 : 19 Ноября 2010, 14:20:24 »
Лучше считывать все в строку, а потом читать данные из нее с помощью sscanf.
Эта функция возвращает количество, так сказать, означенных переменных.

пример:
int n,a,b;
const char *st="10 20";

n = sscanf(st,"%d %d",&a,&b);
if(n!=2){
  process_error("ошибка при вводе");
}
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн prowoke

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Знатокам C, помощь в лабе.
« Ответ #4 : 19 Ноября 2010, 23:16:38 »
Чёт я не допёр, а как проверку то на отсутствие лишних символов, кроме - и 0-9 сделать с помощью этого?

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Знатокам C, помощь в лабе.
« Ответ #5 : 22 Ноября 2010, 13:43:14 »
Если sscanf-у требуется прочесть из строки, скажем, три числа, а в строке что-то корявое, то sscanf вернет меньше 3.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.023 секунд. Запросов: 21.