Тема: Порозрядні логічні операції. Дороблення програми.

Є умова (на першому фото). Я вже майже зробив. Але не знаю як записати там де число f  в 1-их випадках дійсне, в інших ціле (знаю, як робити його або дійсним, або цілим, але не знаю як записати логічні операції(тобто треба дописати 1 if)).
Зараз ще скину 2 фото з моєю існуючою програмою (в мене є той if, але я його спростив, просто написавши, якщо а!=0)

Post's attachments

IMG_20151127_115810(2).jpg 308.48 kb, 242 downloads since 2015-12-06 

2

Re: Порозрядні логічні операції. Дороблення програми.

Тепер моя програма

Post's attachments

DSC_4619.jpg 532.62 kb, 249 downloads since 2015-12-06 

3 Востаннє редагувалося КиївОболонь (06.12.2015 12:40:27)

Re: Порозрядні логічні операції. Дороблення програми.

і продовження програми

Post's attachments

DSC_4620.jpg 620.52 kb, 228 downloads since 2015-12-06 

4 Востаннє редагувалося koala (06.12.2015 13:42:16)

Re: Порозрядні логічні операції. Дороблення програми.

Умова містить помилки (a,d,c) і двозначності (не ясно, як визначається ціла частина від'ємних чисел, і що означає "функція приймає ціле значення" - "приймає" в сенсі "приймає параметрами" чи в сенсі "набуває"?)
http://instacod.es/file/104334

5

Re: Порозрядні логічні операції. Дороблення програми.

koala написав:

Умова містить помилки (a,d,c)
http://instacod.es/file/104334

це я зразу помітив (там не "D", а "B").

6

Re: Порозрядні логічні операції. Дороблення програми.

koala написав:

Умова містить і двозначності (не ясно, як визначається ціла частина від'ємних чисел, і що означає "функція приймає ціле значення" - "приймає" в сенсі "приймає параметрами" чи в сенсі "набуває"?)

Це я зробив (коли треба ціле число, то я просто беру FLOOR для відкидання дробової частини). Я не знаю як скласти сам вираз (яку умову записати в if  замість a!=0?)

7

Re: Порозрядні логічні операції. Дороблення програми.

koala написав:

і що означає "функція приймає ціле значення" - "приймає" в сенсі "приймає параметрами" чи в сенсі "набуває"?)

Якщо виконується умова (та яку я поки замінив на a!=0), то f виводиться на екран таким, яким воно є насправді(ну воно float), а якщо ж умова не виконується, то від f відрізається дійсна частина, а на екран виводиться ціла частина (якщо f=1/3, то при обрубуванні на екран виводиться f=0, а якщо дійсна частина не відрізається, то на екран виводиться f=0.333)

8 Востаннє редагувалося Betterthanyou (06.12.2015 15:21:46)

Re: Порозрядні логічні операції. Дороблення програми.

КиївОболонь не знаю чому ви код програми вставляєте у вигляді фото, але на всяк випадок скажу що і в Turbo C++ є *.CPP файли які можна відкрити Notepadдом (стандартна програма windows) і скопіювати код

9

Re: Порозрядні логічні операції. Дороблення програми.

Betterthanyou написав:

КиївОболонь не знаю чому ви код програми вставляєте у вигляді фото, але на всяк випадок скажу що і в Turbo C++ є *.CPP файли які можна відкрити Notepadдом (стандартна програма windows) і скопіювати код

Та я знаю. Так, для більшої наочності.

10

Re: Порозрядні логічні операції. Дороблення програми.

Так, для більшої наочності.

Краще би сам код текстом вставив...

11

Re: Порозрядні логічні операції. Дороблення програми.

Це буде виглядати десь так

#include <stdio.h>

float F(float a, float b, float c, float x);

int main(){
    float xn = -1.0f;
    float xk = 2.3f;
    float dx = 0.1f;
    float x  = 0.0f;
    float y =  0.0f;
    float a = 3.0f;
    float b = -0.3f;
    float c = 1.5f;
    int  Ac = (int)a;
    int  Bc = (int)b;
    int  Cc = (int)c;
    int flag= (Ac ^ Bc % 2) & ~(Ac | Cc);
    xk = xk + dx;
    for( x = xn; x < xk; x = x + dx )
    {
        
        if( flag )
        {
            y = F(a, b, c, x);
        }
        else
        {
            y = F(Ac, Bc, Cc, x);
        }
        printf("x = %.3f\ty = %.3f\n", x, y);
    }
    return 0;
}

float F(float a, float b, float c, float x){
    float y = 0.0f;
    if( x )
        y = a + x / c;
    else
    if( b )
        y = a*(x + c)*(x + c) - b;
    else
        y = (x - a) / -c;
    return y; 
}


http://codepad.org/rSb0ZGDD

x = -1.000    y = 2.000
x = -0.900    y = 2.100
x = -0.800    y = 2.200
x = -0.700    y = 2.300
x = -0.600    y = 2.400
x = -0.500    y = 2.500
x = -0.400    y = 2.600
x = -0.300    y = 2.700
x = -0.200    y = 2.800
x = -0.100    y = 2.900
x = 0.000    y = 3.000
x = 0.100    y = 3.100
x = 0.200    y = 3.200
x = 0.300    y = 3.300
x = 0.400    y = 3.400
x = 0.500    y = 3.500
x = 0.600    y = 3.600
x = 0.700    y = 3.700
x = 0.800    y = 3.800
x = 0.900    y = 3.900
x = 1.000    y = 4.000
x = 1.100    y = 4.100
x = 1.200    y = 4.200
x = 1.300    y = 4.300
x = 1.400    y = 4.400
x = 1.500    y = 4.500
x = 1.600    y = 4.600
x = 1.700    y = 4.700
x = 1.800    y = 4.800
x = 1.900    y = 4.900
x = 2.000    y = 5.000
x = 2.100    y = 5.100
x = 2.200    y = 5.200
x = 2.300    y = 5.300

Також зазаначу що не робив гілки для перевірки с != 0 для ділення на с

Подякували: КиївОболонь1

12

Re: Порозрядні логічні операції. Дороблення програми.

КиївОболонь написав:

Я не знаю як скласти сам вираз (яку умову записати в if  замість a!=0?)

Я ж вам дав відповідь, що вам у ній не подобається?

Подякували: КиївОболонь1

13 Востаннє редагувалося КиївОболонь (06.12.2015 23:22:30)

Re: Порозрядні логічні операції. Дороблення програми.

koala написав:
КиївОболонь написав:

Я не знаю як скласти сам вираз (яку умову записати в if  замість a!=0?)

Я ж вам дав відповідь, що вам у ній не подобається?

Дякую, але мені здається, що там має бути в кінці if ще вираз "!=0"?(ну, і я вирішив залишити floor замість static).
До речі, там же можна замість INT писати floor?
Як я зрозумів, "-" перед "c" -означає слово "не"?
P.S. A INT заокруглює до ближчого цілого чи до меншого цілого?

14 Востаннє редагувалося КиївОболонь (06.12.2015 23:22:54)

Re: Порозрядні логічні операції. Дороблення програми.

Викладу те, що вийшло вже в форматі тексту (а не фото)

Прихований текст
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<math.h>
void main()
{
clrscr();
float a,b,c,f=0;
int x=0,xpoc,xkin,dx;
cout<<"vvedit a=";
cin>>a;
cout<<"vvedit b=";
cin>>b;
cout<<"vvedit c=";
cin>>c;
cout<<"vvedit xpoc=";
cin>>xpoc;
cout<<"vvedit xkin=";
cin>>xkin;
cout<<"vvedit krok dx=";
cin>>dx;
for(x=xpoc;x<=xkin;x+=dx)
{
if((x==0)&&(b!=0))
f=a*(x+c)*(x+c)-b;
if((x==0)&&(b==0))
f=(x-a)/(x-c);
else f=a+(x/c);
if(int(a)^int(b)&-(int(a)|int(c))!=0){
cout<<"f="<<(f)<<"\t";
cout<<"x="<<x<<"\n";}
else{
cout<<"f="<<floor(f)<<"\t";
cout<<"x="<<x<<"\n";}
}
getch();
}

15 Востаннє редагувалося КиївОболонь (06.12.2015 23:27:39)

Re: Порозрядні логічні операції. Дороблення програми.

-=ЮрА=- написав:
Прихований текст

Це буде виглядати десь так

#include <stdio.h>

float F(float a, float b, float c, float x);

int main(){
    float xn = -1.0f;
    float xk = 2.3f;
    float dx = 0.1f;
    float x  = 0.0f;
    float y =  0.0f;
    float a = 3.0f;
    float b = -0.3f;
    float c = 1.5f;
    int  Ac = (int)a;
    int  Bc = (int)b;
    int  Cc = (int)c;
    int flag= (Ac ^ Bc % 2) & ~(Ac | Cc);
    xk = xk + dx;
    for( x = xn; x < xk; x = x + dx )
    {
        
        if( flag )
        {
            y = F(a, b, c, x);
        }
        else
        {
            y = F(Ac, Bc, Cc, x);
        }
        printf("x = %.3f\ty = %.3f\n", x, y);
    }
    return 0;
}

float F(float a, float b, float c, float x){
    float y = 0.0f;
    if( x )
        y = a + x / c;
    else
    if( b )
        y = a*(x + c)*(x + c) - b;
    else
        y = (x - a) / -c;
    return y; 
}


http://codepad.org/rSb0ZGDD

x = -1.000    y = 2.000
x = -0.900    y = 2.100
x = -0.800    y = 2.200
x = -0.700    y = 2.300
x = -0.600    y = 2.400
x = -0.500    y = 2.500
x = -0.400    y = 2.600
x = -0.300    y = 2.700
x = -0.200    y = 2.800
x = -0.100    y = 2.900
x = 0.000    y = 3.000
x = 0.100    y = 3.100
x = 0.200    y = 3.200
x = 0.300    y = 3.300
x = 0.400    y = 3.400
x = 0.500    y = 3.500
x = 0.600    y = 3.600
x = 0.700    y = 3.700
x = 0.800    y = 3.800
x = 0.900    y = 3.900
x = 1.000    y = 4.000
x = 1.100    y = 4.100
x = 1.200    y = 4.200
x = 1.300    y = 4.300
x = 1.400    y = 4.400
x = 1.500    y = 4.500
x = 1.600    y = 4.600
x = 1.700    y = 4.700
x = 1.800    y = 4.800
x = 1.900    y = 4.900
x = 2.000    y = 5.000
x = 2.100    y = 5.100
x = 2.200    y = 5.200
x = 2.300    y = 5.300

Також зазаначу що не робив гілки для перевірки с != 0 для ділення на с

Незвично мало підключених бібліотек :D. Хоча з іншого боку, тут використовується НЕ потокове введення/виведення, не робиться очищення екрану.

16

Re: Порозрядні логічні операції. Дороблення програми.

Betterthanyou написав:

КиївОболонь є *.CPP файли які можна відкрити Notepadдом

Та можна і вордом

17

Re: Порозрядні логічні операції. Дороблення програми.

Незвично мало підключених бібліотек :D. Хоча з іншого боку, тут використовується НЕ потокове введення/виведення, не робиться очищення екрану.

- по твоєму скриншоту я побачив що проводиш розробку за допомогою Builder 4.0 може ще старіше, це дуже древній компілятор, тому я перевів код у Сі щоб бути певним у успішній копіляції(старий копілятор має багато несумісних з теперішніми С++ копіляторами моментів а ось Сі код обробить ще більш прискіпливо ніж теперішні).

Прихований текст

Лаконічність - сестра таланту, такої концепції намагаюсь придержуватись.

18

Re: Порозрядні логічні операції. Дороблення програми.

Ну тоді і я код додам:

if(int(a) ^ int(b) & ~( int(a) | int(c) )
{
  f = static_cast<double>( static_cast<int>( f ) );
}
КиївОболонь написав:

Дякую, але мені здається, що там має бути в кінці if ще вираз "!=0"?

Ненульовий вираз еквівалентний true, нульовий - false, і if одразу перевіряє, чи не дорівнює вираз 0, тому !=0 можна опустити (а ==0 замінити на !). Зазвичай, дійсно, треба ставити !=0, але тут виконується відверто безглузда операція, тому не бачу сенсу робити її зрозумілішою.

КиївОболонь написав:

До речі, там же можна замість INT писати floor?

КиївОболонь написав:

P.S. A INT заокруглює до ближчого цілого чи до меншого цілого?

Де ви в моєму коді INT побачили? C та C++ - реєстрозалежні, INT - не int. І отут якраз проблема - я точно стандарт не пам'ятаю, ліньки дивитися, але у вас ще й старий компілятор, можливо, він трохи відхиляється тут від стандарту, але перетворення від'ємних float-ів на цілі трохи заплутана справа. Ні, не до найближчого точно, але для додатних int(x) працює майже так само, як і floor(x) (тільки тип інший), а от для від'ємних - треба дивитися. Можливо, там і стандарт каже, що це визначається компілятором - чи int(-5.9) дорівнює -6 (найбільше ціле, що менше за число), чи -5 (менше за абсолютним значенням). А в завданні цього не сказано.

КиївОболонь написав:

Як я зрозумів, "-" перед "c" -означає слово "не"?

Там не -, а ~. Побітове НІ.

19 Востаннє редагувалося КиївОболонь (07.12.2015 21:57:25)

Re: Порозрядні логічні операції. Дороблення програми.

-=ЮрА=- написав:

Незвично мало підключених бібліотек :D. Хоча з іншого боку, тут використовується НЕ потокове введення/виведення, не робиться очищення екрану.

- по твоєму скриншоту я побачив що проводиш розробку за допомогою Builder 4.0 може ще старіше,

Тільки не Builder. Бо це ж не візуалізована версія у мене.

20

Re: Порозрядні логічні операції. Дороблення програми.

koala написав:

Ну тоді і я код додам:

if(int(a) ^ int(b) & ~( int(a) | int(c) )
{
  f = static_cast<double>( static_cast<int>( f ) );
}
КиївОболонь написав:

Дякую, але мені здається, що там має бути в кінці if ще вираз "!=0"?

Ненульовий вираз еквівалентний true, нульовий - false, і if одразу перевіряє, чи не дорівнює вираз 0, тому !=0 можна опустити (а ==0 замінити на !). Зазвичай, дійсно, треба ставити !=0, але тут виконується відверто безглузда операція, тому не бачу сенсу робити її зрозумілішою.

КиївОболонь написав:

До речі, там же можна замість INT писати floor?

КиївОболонь написав:

P.S. A INT заокруглює до ближчого цілого чи до меншого цілого?

Де ви в моєму коді INT побачили? C та C++ - реєстрозалежні, INT - не int. .

Взагалі то, я написав з великої букви, щоб виділити це слово в повідомленні(мабуть, краще виділяти підкреслюванням в наступний раз). А те, що вони реєстрозалежні, то я знаю (до речі, деколи заважає, якщо натиснути випадково CapsLock)