С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
7 / 7 / 1
Регистрация: 28.01.2011
Сообщений: 33

Вычисление тригонометрических функций

05.04.2013, 23:40. Показов 3494. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Никак не получается вычеслить значение тригонометрических функций,а точнее разбить строку так, чтобы это зделать.Нужно использовать только C.Я думал разбить строку на значение и текст ,тоисть :получить два масив из одного был
C
1
 ch[]="cos30+sin45-tg(44-22)";
а станет
C
1
num[]="30+45-(44-22)
и
C
1
cos+sin+tn
а потом подставлять но не получается потом это сделать.Может нада использовать другую идею или подскажите как реализовать эту.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include <conio.h>
#include <math.h>
#define PI 3.14159265
 
int f(char* ch, int n){
    int num=0, i;
    for(i=0; i<n; i++){
        num+=(int(ch[i])-48)*int(pow(float(10), n-1-i));
    }
    return num;
}
 
void main (){
 
char ch[]="cos30+sin45-tg(44-22)";
 
    char *ptr;
    int b;
    char key_num[] = "0123456789";
    int arr[100],c=0;
    char num[50];
    ptr = strpbrk (ch, key_num);
    while (ptr != NULL)
    {
     printf ("%c   %d " , *ptr, ptr-string);
        num[ c ]=ch[ptr-ch];
        ptr = strpbrk (ptr+1,key_num);
        c++;
    }
 
    
    
    
    
getch();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2013, 23:40
Ответы с готовыми решениями:

Вычисление тригонометрических функций
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;Windows.h&gt; void main() { SetConsoleCP(1251); ...

Вычисление функций разложением в ряд
Написать программу, вычисляющую сумму ряда для задаваемого значения x с точностью 10^-4. Для контроля программа должна выводить значение...

Вычисление функций с использованием итераций
Функция cos(x+1)+pow(sqrt(x-0.2),3) на промежутке от 0,3 до 0,8 Вычисление значений функции при помощи рядов вывести Х Точность ...

1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
06.04.2013, 12:21
Нужно потребовать от пользователя исполнения неких правил синтаксиса. Например, было бы удобно, если аргумент функций ВСЕГДА заключался в скобки:
ch[]="cos(30)+sin(45)-tg(44-22)";
Для считывания можно создать структуру (напрашивается односвязный список, с указателем на следующий элемент).

Ваши "объекты" на вскидку:
1) названия функций - 4 шт.
2) скобки () , сразу проверяем на корректность ввода
3) операции +,-,*,/
4) пробелы - могут быть введены где и сколько угодно - нужно сразу убрать.

Кстати, угол у вас в градусах? Тогда не забудьте перевести его в радианы для расчетов )

Добавлено через 11 минут
Вопрос: операции только +и-? Или *и / тоже?

Добавлено через 10 часов 39 минут
Разбор линейного выражения с +/- и int:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//маленький парсер, считываем справа налево=========================================
//операции +/-      ================================================================
//числа - int      ================================================================
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct ARG
{   int value;
    char operation;
    struct ARG *next;
};
 
struct ARG *start;
struct ARG *last;
 
//------------------------------------------------------------------------------------
//Односвязный список в режиме "write|append" )
//------------------------------------------------------------------------------------
void insert (   struct ARG *i, /* новый элемент */
                struct ARG **start, /* начало списка */
                struct ARG **last) /* конец списка */
{  if(!*last) /* первый элемент в списке */
    {   i->next = NULL;
        *last = i;
        *start = i;
        return;
    }
  (*last)->next = i; /* вставка в конец */
  i->next = NULL;
  *last = i;
}
 
//------------------------------------------------------------------------------------
//Готовим строку к работе - убираем все пробелы и добавляем впереди +, если необходимо
//------------------------------------------------------------------------------------
char *trimForWork(char *s)
{   char *res = (char*) malloc (strlen(s)+2);
    char *resPlus = (char*) malloc (strlen(s)+2);
    int i=0,k=0;
    for(; i<strlen(s); i++)
        if(s[i]!=' ')   res[k++]=s[i];  //убираем пробелы
    res[k] = '\0';
 
    if(res[0] != '+' && res[0] != '-')
    {   resPlus[0] = '+';   resPlus[1] = '\0';  //добавляем + слева для унификации
        strcat(resPlus,res);
        return resPlus;
    }
    return res;
}
 
//------------------------------------------------------------------------------------
//считываем число справа - до следующего +/-
//------------------------------------------------------------------------------------
int getArg(char *s)
{   int i = strlen(s)-1,len = 0, k;
    for(; i<strlen(s); i--, len++)
        if(s[i] == '+' || s[i] == '-')  break;
    char *res = (char*) malloc (len+1);
    i++;
    for(k=0; i<strlen(s); i++)
        res[k++] = s[i];
    res[k] = '\0';
    return atoi(res);
}
 
//------------------------------------------------------------------------------------
//укорачиваем строку на считанное число справа
//------------------------------------------------------------------------------------
char *cutStr(char *s)
{   int i = strlen(s)-1,len = 0;
    for(; i<strlen(s); i--, len++)
        if(s[i] == '+' || s[i] == '-')  break;
    s[strlen(s)-len] = '\0';
    return s;
}
 
//------------------------------------------------------------------------------------
//считываем операцию - последний символ текущей строки
//------------------------------------------------------------------------------------
char getOp(char *s)
{   return s[strlen(s)-1];
}
 
//------------------------------------------------------------------------------------
//укорачиваем строку на 1 символ - считанную операцию - справа
//------------------------------------------------------------------------------------
char *cutOne(char *s)
{   if(!strlen(s)) return s;
    s[strlen(s)-1]='\0';
    return s;
}
 
//------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------MAIN
//------------------------------------------------------------------------------------
int main()
{   int res = 0;
    char *expression = " 10 - 5 + 4 - 1 + 18";
    struct ARG *argument, *rewind;
    start = last = NULL;
    
    expression = trimForWork(expression);   //подготовка строки к работе
    puts(expression);                       //готовая строка
    while(strlen(expression))
    {   argument = (struct ARG *)malloc(sizeof(struct ARG));
        argument->value = getArg(expression);       //считываем число
        expression = cutStr(expression);            //укорачиваем на число справа
        argument->operation = getOp(expression);    //считываем операцию
        expression = cutOne(expression);            //укорачиваем на 1 символ с конца
        insert(argument,&start,&last);              //заносим текущий аргумент в список
    }
 
    rewind = start; //прокручиваем список, подсчитываем результат
    while(rewind)
    {   if(rewind->operation == '+')
            res += rewind->value;
        else
            res -= rewind->value;
        rewind = rewind->next;
    }
 
    printf("\nResult: %d",res);
        
    getchar();
    return 0;   
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2013, 12:21
Помогаю со студенческими работами здесь

Реализовать вычисление в виде функций
Есть задание - Значение аргумента x изменяется от a до b с шагом h. Для каждого x найти значения функции Y(x), суммы S(x) и |Y(x)-S(x)| и...

Вычисление факториала без использования функций
Вычисление факториала на языке СИ через функцию // Вычисление факториала на языке СИ через функцию #includ&lt;stdio.h&gt; int...

Вычисление текущих значений Y(x) и S(x) реализовать в виде отдельных функций
Вычисление текущих значений Y(x) и S(x) (где x принадлежит диапазону ) реализовать в виде отдельных функций. При выполнении задания...

Вычисление значений функций, используя разложение в ряд Тейлора
Составить программу вычисления значений функций на заданном отрезке с точностью e=10-6, воспользовавшись формулами разложения элементарных...

Вычисление суммы чисел в массиве с четными индексами (переделать в виде функций)
Имеется код программы,который вычисляет сумму чисел в массиве с четными индексами.Необходимо изменить программу прибегнув к использованию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru