Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 12
1

Деление в функции

23.01.2014, 20:12. Просмотров 806. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
есть вот такая функция, которую я вставлял в свитч а так же в операцю ? :
C
1
double DEL(double a, double b) { return a/b;}
результат функции присваивается переменной типа double
при этом всё не правильно считает... как пример 4/3=1, 5/5=0
Но если всё это вывести без ветвления:
C
1
2
double a, b, c;
c=b/a;
всё делится правильно
Вопрос: почему в ветвлениях не правильно считает.
Будьте любезны, помогите.
кому интересно вот весь код:
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
 
double DEL(double a, double b);
double STEP(double a, double b);
double PLUS(double a, double b);
double UMN(double a, double b);
double MINUS(double a, double b);
 
 
int main()
{
setlocale(LC_CTYPE, ".866");
char oper;
double num1, num2, result;
//___________________________________________________________________________________________
do {
    wprintf(L"Введите операцию для выполнения(*, /, ^, +, -): \n");
    fflush(stdin);
} while (scanf("%c", &oper)!=0 && oper!='\x2D' && oper!='\x2F' && oper!='\x5E' && oper!='\x2A' && oper!='\x2B');
system("cls");
 
do {
    wprintf(L"Введите 1-е число для выполнения операции(n%cm) \n", oper);
    fflush(stdin);
} while(scanf("%lf", &num1)!=1 && wprintf(L"Ввод совершен не коректно \n"));
system("cls");
 
do {
    wprintf(L"Введите 2-е число для выполнения операции(n%cm) \n", oper);
    fflush(stdin);
} while((oper=='\x5E' && (scanf("%lf", &num2)!=1 && wprintf(L"Ввод совершен не коректно \n")
        || (num2/int(num2))!=1 && wprintf(L"Степень должна быть целым числом! \n"))) 
        || oper !='\x5E' && scanf("%lf", &num2)!=1 && wprintf(L"Ввод совершен не коректно \n"));
system("cls");
//___________________________________________________________________________________________
switch(oper) {
case '\x2A': result=UMN(num1, num2); break;
case '\x2B': result=PLUS(num1, num2); break;
case '\x2F': result=MINUS(num1,num2); break;
case '\x2D': result=DEL(num1, num2); break;
case '\x5E': result=STEP(num1, num2); break;}
//___________________________________________________________________________________________
printf("%g%c%g=%g \n", num1, oper, num2, result);
system("pause");
return 0;
}
 
double UMN(double a, double b) {
     return a*b;
}
double PLUS(double a, double b) {
     return a+b;
}
double MINUS(double a, double b) {
     return a-b;
}
double DEL(double a, double b) {
         return a/b;
}
double STEP(double a, double b) {
    int i;
    double c=a;
    for(i=1;i<b;++i)
        c*=a;
    return c;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2014, 20:12
Ответы с готовыми решениями:

Деление в функции
function = sa(x) xs=0; d=0; ds=0; for i=1:length(x) xs=xs+x(i); ds=ds+(x(i))^2; end...

Деление на ноль в функции
Процедура с функциями нахождения наибольшего общего делителя (по алгоритму Эвклида) и наименьшего...

Ошибка при вычислении функции, деление на ноль.
Фрагмет: function Myfunc(a,eps:real):real; var i:integer; s,sn,t:real; begin if (a=0)...

Вычислить значение функции и обработать деление на ноль
Всем добрый день! Пожалуйста, помогите разобраться с задачкой: Дано: y=1/x (-10&lt;x&lt;10) Вывести...

7
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 12
24.01.2014, 21:00  [ТС] 2
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
 
double DEL(double a, double b);
double STEP(double a, double b);
double PLUS(double a, double b);
double UMN(double a, double b);
double MINUS(double a, double b);
 
 
int main()
{
setlocale(LC_CTYPE, ".866");
char oper;
double num1, num2, result;
//___________________________________________________________________________________________
do {
    wprintf(L"Введите операцию для выполнения(*, /, ^, +, -): \n");
    fflush(stdin);
} while (scanf("%c", &oper)!=0 && oper!='\x2D' && oper!='\x2F' && oper!='\x5E' && oper!='\x2A' && oper!='\x2B');
system("cls");
 
do {
    wprintf(L"Введите 1-е число для выполнения операции(n%cm) \n", oper);
    fflush(stdin);
} while(scanf("%lf", &num1)!=1 && wprintf(L"Ввод совершен не коректно \n"));
system("cls");
 
do {
    wprintf(L"Введите 2-е число для выполнения операции(n%cm) \n", oper);
    fflush(stdin);
} while((oper=='\x5E' && (scanf("%lf", &num2)!=1 && wprintf(L"Ввод совершен не коректно \n")
        || (num2/int(num2))!=1 && wprintf(L"Степень должна быть целым числом! \n"))) 
        || oper !='\x5E' && scanf("%lf", &num2)!=1 && wprintf(L"Ввод совершен не коректно \n"));
system("cls");
//___________________________________________________________________________________________
switch(oper) {
case '\x2A': result=UMN(num1, num2); break;
case '\x2B': result=PLUS(num1, num2); break;
case '\x2F': result=MINUS(num1,num2); break;
case '\x2D': result=DEL(num1, num2); break;
case '\x5E': result=STEP(num1, num2); break;}
//___________________________________________________________________________________________
printf("%g%c%g=%g \n", num1, oper, num2, result);
system("pause");
return 0;
}
 
double UMN(double a, double b) {
     return a*b;
}
double PLUS(double a, double b) {
     return a+b;
}
double MINUS(double a, double b) {
     return a-b;
}
double DEL(double a, double b) {
         return a/b;
}
double STEP(double a, double b) {
    int i;
    double c=a;
    for(i=1;i<b;++i)
        c*=a;
    return c;
}
Из этого кода если switch скопировать в пустую программу, скопировать переменные и дать им значение то всё делит правильно а в данном коде почему то нет... Как так?
0
Эксперт C
25061 / 15567 / 3328
Регистрация: 24.12.2010
Сообщений: 33,737
24.01.2014, 22:00 3
B1oodyWo1f, Вот на этом месте
C
1
2
3
while((oper=='\x5E' && (scanf("%lf", &num2)!=1 && wprintf(L"Ввод совершен не коректно \n")
        || (num2/int(num2))!=1 && wprintf(L"Степень должна быть целым числом! \n"))) 
        || oper !='\x5E' && scanf("%lf", &num2)!=1 && wprintf(L"Ввод совершен не коректно \n"));
Можно голову сломать. Сам-то понимаешь?
Сделай функцию с аргументами oper, double *p1, *p2, которая будет проверять ввод (в несколько строк) и возвращать 0 или 1(успех). И вместо всего этого сделай while(f(...));
После ввода выведи num1, num2 (чтоб увидеть, что ты действительно ввел)
1
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 12
24.01.2014, 22:55  [ТС] 4
Я понимаю что я там сделал, там идет проверка на ввод т.к. если ввел дробную степень или ввод не удался то это считается за ошибку.
И я проверял уже ввод. числа какие я ввожу( будь то с плавающей точкой или нет) вводятся правильно
+ ко всему я даже do while убирал что бы ввод был под ответственность пользователя и всё равно то же самое...
Не могу понять причину почему в switch не работает деление

Добавлено через 10 минут
даже в таком виде 5/5 выходит 0...
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
int main()
{
setlocale(LC_CTYPE, ".866");
char oper='/';
double num1=5, num2=5, result;
switch(oper) {
case '\x2D': result=DEL(num1, num2); break;
case '\x2A': result=UMN(num1, num2); break;
case '\x2B': result=PLUS(num1, num2); break;
case '\x2F': result=MINUS(num1, num2); break;
case '\x5E': result=STEP(num1, num2); break;}
printf("%g%c%g=%g \n", num1, oper, num2, result);
system("pause");
return 0;
}
double UMN(double a, double b) {
     return a*b;
}
double PLUS(double a, double b) {
     return a+b;
}
double MINUS(double a, double b) {
     return a-b;
}
double DEL(double a, double b) {
 double s=a/b;
    return s;
}
0
Эксперт C
25061 / 15567 / 3328
Регистрация: 24.12.2010
Сообщений: 33,737
24.01.2014, 23:25 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

B1oodyWo1f, Вот так
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
double UMN(double a, double b);
double PLUS(double a, double b);
double MINUS(double a, double b);
double DEL(double a, double b);
int main()
{
// setlocale(LC_CTYPE, ".866");
char oper='/';
double num1=5.2, num2=5, result;
switch(oper) {
case '/': result=DEL(num1, num2); break;
case '*': result=UMN(num1, num2); break;
case '+': result=PLUS(num1, num2); break;
case '-': result=MINUS(num1, num2); break;
}
printf("%g%c%g=%g \n", num1, oper, num2, result);
system("pause");
return 0;
}
double UMN(double a, double b) {
     return a*b;
}
double PLUS(double a, double b) {
     return a+b;
}
double MINUS(double a, double b) {
     return a-b;
}
double DEL(double a, double b) {
 double s=a/b;
    return s;
}
Все получилось.

Добавлено через 3 минуты
x2D - это - (минус)
x2F - это / (деление)
1
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 12
24.01.2014, 23:30  [ТС] 6
Байт, спасибо огромное!
0
Эксперт C
25061 / 15567 / 3328
Регистрация: 24.12.2010
Сообщений: 33,737
24.01.2014, 23:46 7
Цитата Сообщение от B1oodyWo1f Посмотреть сообщение
Байт, спасибо огромное!
Да в общем-то не жалко. Кушайте на здоровье.
Но любопытно, чего тебе в голову пришло вместо case '/'... использовать шестнадцатеричные представления? Чтоб никто не догадался? Чтоб служба медом не казалась?
1
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 12
25.01.2014, 00:09  [ТС] 8
Байт, да честно говоря даже не знаю почему.
Такая запись больше нравится
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2014, 00:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Задача про деление яблок (целочисленное деление)
Ребят,помогите с задачкой,как написать input.txt и output.txt? Помогите решить задачу. C++....

По номеру функции вычислить 1-сумму, 2-разность, 3-произведение, 4-деление введеных чисел
Написать программу,которая запрашивает два числа и номер функции от 1 до 4 и вычесляет: 1-сумму...

По номеру функции вычислить 1-сумму, 2-разность, 3-произведение, 4-деление введеных чисел
А можете еще помочь,надо к этой программе создать блок схему,а как она выглядить будет я не...

Найти корень методом дихотомии (деление отрезка пополам) для функции
Найти корень методом дихотомии (деление отрезка пополам) для функции 4 - e^(x^2) * x^2


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.