1 Востаннє редагувалося Betterthanyou (13.09.2014 23:05:10)

Тема: bool повертає 204 ?

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>

char priclad[200];

struct MyStruct
{
    //bukva tip
    char bi;
    char bc;
}Tsyfra[20];

int Scan()
{
    //Зчитувння
    char bukvi[50];
    printf("1 - ^, 2 - v, 3 - <->, 4 - ->, 5 - ");
    printf("%c", (char)191);
    printf("\n");
    scanf("%s", &priclad);
    scanf("%s", &bukvi);
    strcpy(priclad, strupr(priclad));
    //Розпізнання
    char bukva;
    int j = 0;
    strcpy(bukvi, strupr(bukvi));
    for (int i = 0; i < strlen(bukvi); i++)
    {
        if (bukvi[i] == ',' || bukvi[i] == '.')
            continue;
        if (bukvi[i] != ' ' && bukvi[i] != '1' && bukvi[i] != '0' && bukvi[i] != '=')
            bukva = bukvi[i];
        else
            if (bukvi[i] == ' ' && bukvi[i] != '1' && bukvi[i] != '0')
                continue;
            else
                if (bukvi[i] == '1')
                {
                    Tsyfra[j].bc = bukva;
                    Tsyfra[j++].bi = '1';
                }
                else
                    if (bukvi[i] == '0')
                    {
                    Tsyfra[j].bc = bukva;
                    Tsyfra[j++].bi = '0';
                    }
    }
    return j;
}

void ScanModernizator()
{
    char *priclad_cpy = new char[strlen(priclad) + 40];
    for (int i = 0; i < strlen(priclad);i++)
        switch ((int)priclad[i])
    {
        case 49:priclad[i] = '^'; break;
        case 50:priclad[i] = 'v'; break;
        case 51:
            strcpy(priclad_cpy, priclad);
            priclad_cpy[i] = '<';
            priclad_cpy[i + 1] = '-';
            priclad_cpy[i + 2] = '>';
            priclad_cpy[i + 3] = '\0';
            strcat(priclad_cpy, &priclad[i + 1]);
            strcpy(priclad, priclad_cpy);
            break;
        case 52:
            strcpy(priclad_cpy, priclad);
            priclad_cpy[i] = '-';
            priclad_cpy[i + 1] = '>';
            priclad_cpy[i + 2] = '\0';
            strcat(priclad_cpy, &priclad[i + 1]);
            strcpy(priclad, priclad_cpy);
            break;
        case 53:priclad[i] = (char)191; break;
            //47 i 92 ne vivod
    }
    delete[]priclad_cpy;
    printf("%s", priclad);
    printf(" = ");
}

void Prysvoyennya_znachennya(int k_s)
{
    for (int i = 0; i < strlen(priclad); i++)
        for (int j = 0; j < k_s; j++)
            if (priclad[i] == Tsyfra[j].bc)
                priclad[i] = Tsyfra[j].bi;
    printf("%s", priclad);
}

//Логічні операції Begin
void zaperechena(char *v_duzhkakh)
{
    for (int i = 0; i < strlen(v_duzhkakh); i++)
        if (v_duzhkakh[i] == (char)191)
            if (v_duzhkakh[i + 1] == '1')
                v_duzhkakh[i + 1] = '0';
            else
                if (v_duzhkakh[i + 1] == '0')
                    v_duzhkakh[i + 1] = '1';
}

bool log_i(bool A,bool B)
{
    if (A == 0 && B == 0)
        return 0;
    else
        if (A == 0 && B == 1)
            return 0;
        else
            if (A == 1 && B == 0)
                return 0;
            else
                if (A == 1 && B == 1)
                    return 1;
}

bool log_abo(bool A, bool B)
{
    if (A == 0 && B == 0)
        return 0;
    else
        if (A == 0 && B == 1)
            return 1;
        else
            if (A == 1 && B == 0)
                return 1;
            else
                if (A == 1 && B == 1)
                    return 1;
}

bool log_ekvivalentnist(bool A, bool B)
{
    if (A == 0 && B == 0)
        return 1;
    else
        if (A == 0 && B == 1)
            return 0;
        else
            if (A == 1 && B == 0)
                return 0;
            else
                if (A == 1 && B == 1)
                    return 1;
}

bool log_implikatsiya(bool A, bool B)
{
    if (A == 0 && B == 0)
        return 1;
    else
        if (A == 0 && B == 1)
            return 1;
        else
            if (A == 1 && B == 0)
                return 0;
            else
                if (A == 1 && B == 1)
                    return 1;
}
//Логічні операції End

bool arykhmetyka(char *v_duzhkakh)
{
    bool sifra[4];//1,2 - для значення 3,4 - для розгалуження
    int lo = -1;//l - logichna o - operasiya
    zaperechena(v_duzhkakh);
    for (int i = 0; i < strlen(v_duzhkakh); i++)
    {
        switch (v_duzhkakh[i])
        {
        case '^':lo = 1; break;
        case 'v':lo = 2; break;
        case '<':
            if (v_duzhkakh[i + 1] == '-' && v_duzhkakh[i + 2] == '>')
                lo = 3;
        case '-':
            if (v_duzhkakh[i + 1] == '>')
                lo = 4;
        case (char)191:lo = 5; break;
        case 49:
            sifra[0] = 0,
                sifra[3] = true; break;
        case 50:
            sifra[1] = 1,
                sifra[4] = true; break;
        }
        if (sifra[3] == 1 && sifra[4] == 1)
        {
            switch (lo)
            {
            case 1:sifra[0] = log_i(sifra[0], sifra[1]); break;
            case 2:sifra[0] = log_abo(sifra[0], sifra[1]); break;
            case 3:sifra[0] = log_ekvivalentnist(sifra[0], sifra[1]); break;
            case 4:sifra[0] = log_implikatsiya(sifra[0], sifra[1]); break;
            }
            lo = -1;
            sifra[3] == true;
            sifra[4] == false;
        }
    }
    return sifra[3];
}

bool Diyi()
{
    char pochatok = -1, kinets = -1;
    for (int i = 0; i < strlen(priclad); i++)
    {
        if (priclad[i] == '(')
            pochatok = i;
    }
    for (int i = 0; i < strlen(priclad); i++)
    {
        if (priclad[i] == ')')
        {
            kinets = i;
            break;
        }
    }
    char *v_duzhkakh = new char[(kinets - pochatok) + 2];
    strcpy(v_duzhkakh, &priclad[pochatok + 1]);
    v_duzhkakh[kinets - 1 - pochatok] = '\0';
    bool znachena = arykhmetyka(v_duzhkakh);
    char *priclad_cpy = new char[strlen(priclad)+1];
    strcpy(priclad_cpy, priclad);
    if (pochatok>0 && kinets > 0)
    {
        if (znachena == 1)
            priclad[pochatok] = '1';
        else
            priclad[pochatok] = '0';
        priclad[pochatok + 1] = '\0';
        strcat(priclad, &priclad_cpy[kinets+1]);//tobto \ (\ - znk diy, \ - znk)
        pochatok = -1;
        kinets = -1;
        return true;
    }
}

int main()
{
    int kilkict_struct = Scan();
    ScanModernizator();
    Prysvoyennya_znachennya(kilkict_struct);

    while (Diyi() == true);
        printf(" = %s", priclad);
    std::cout<<" = "<< arykhmetyka(priclad);//?

    getch();
    return 0;
}

В мене сталось щось не зрозуміле bool arykhmetyka повертає 204 коли я пишу такій приклад q25(r4(p25q3r)) <enter> p=0,q=0,r=1 <enter> . Хіба може bool повертати 204 ?
Дальше НЕ важлива інформація Програму я пишу для себе "Математична логіка -  чи є вірне висловлювання" тому там присутні пояснення які зрозумію напевне тільки я і одночасно printf i cout тому що я цю програму хочу запустити на планшеті я найшов спеціальний компілятор а в ньому немає iostream.

2

Re: bool повертає 204 ?

bool - це той самий int. 0 - це false, все інше - true. Тому писати A == 1 не найкраща ідея.

Подякували: koala1

3

Re: bool повертає 204 ?

quez написав:

bool - це той самий int. 0 - це false, все інше - true. Тому писати A == 1 не найкраща ідея.

Зовсім з вами не згідний int має 4 байта а bool 1 тобто

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    bool A;
    A = 204;
    cout << "A = "<<A;
    getch();
    return 0;
}

а буде дорівнювати 1 а не 204

4

Re: bool повертає 204 ?

Ага, 1 байт = 256 значень.

5 Востаннє редагувалося Betterthanyou (14.09.2014 00:15:20)

Re: bool повертає 204 ?

Chemist-i тобто ви впевнені в тому що замінивши всі цифри на false i true я отримаю вірне значення 1 ?

6

Re: bool повертає 204 ?

Betterthanyou написав:

Chemist-i тобто ви впевнені в тому що замінивши всі цифри на false i true я отримаю вірне значення 1 ?

значення True, якщо працюєте з булевим типом забудьте за цифри, для Вас є тільки істина (true) і неістина (false) =)
А от якщо вже треба зберегти 8 булевих значень у одному байті - то вже користуйтесь іншим типом, char чи byte, і бітовими операціями для діставання конкретного біту.

7 Востаннє редагувалося koala (14.09.2014 07:52:33)

Re: bool повертає 204 ?

bool взагалі не треба ні з чим порівнювати! if( A == true ) - так неправильно, треба писати просто if( A ). Це вже bool, нащо його ще приводити?
Ну а весь ваш код - страшна маячня:

bool log_i(bool A,bool B)
{
    retrun A && B;
}

і т.д. Невже складно?

Що ж до того, чи працюватиме програма - це залежить від того, як саме вона має працювати.

8

Re: bool повертає 204 ?

З практики: є у мене на роботі клієнт бази даних. Старий і страшний, на C++Builder 5. Страшний настільки, що компілюється тільки з відповідною фазою Місяця, і туди не намагаємося лізти взагалі. Нещодавно довелося лізти виправляти один баг, і я знайшов там таку конструкцію (баг викликала не вона):

bool wrapper()
{
  real_int_finction(...);
}
...
if( wrapper() == INT_CONST )
  ...

(real_int_finction повертає int) і воно працювало, хоч і з попередженнями!

9

Re: bool повертає 204 ?

(Це трішки модернізована програма тепер тут менше помилок)

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>

char priclad[200];

struct MyStruct
{
    //bukva tip
    char bi;
    char bc;
}Tsyfra[20];

int Scan()
{
    //Зчитувння
    char bukvi[50];
    printf("1 - ^, 2 - v, 3 - <->, 4 - ->, 5 - ");
    printf("%c", (char)191);
    printf("\n");
    scanf("%s", &priclad);
    scanf("%s", &bukvi);
    strupr(priclad);
    //Розпізнання
    char bukva;
    int j = 0;
    strupr(bukvi);
    for (int i = 0; i < strlen(bukvi); i++)
    {
        if (bukvi[i] == ',' || bukvi[i] == '.')
            continue;
        if (bukvi[i] != ' ' && bukvi[i] != '1' && bukvi[i] != '0' && bukvi[i] != '=')
            bukva = bukvi[i];
        else
            if (bukvi[i] == ' ' && bukvi[i] != '1' && bukvi[i] != '0')
                continue;
            else
                if (bukvi[i] == '1')
                {
            Tsyfra[j].bc = bukva;
            Tsyfra[j++].bi = '1';
                }
                else
                    if (bukvi[i] == '0')
                    {
            Tsyfra[j].bc = bukva;
            Tsyfra[j++].bi = '0';
                    }
    }
    return j;
}

void ScanModernizator()
{
    char priclad_cpy[200];
    for (int i = 0; i < strlen(priclad); i++)
        switch ((int)priclad[i])
    {
        case 49:priclad[i] = '^'; break;
        case 50:priclad[i] = 'v'; break;
        case 51:
            strcpy(priclad_cpy, priclad);
            priclad_cpy[i] = '<';
            priclad_cpy[i + 1] = '-';
            priclad_cpy[i + 2] = '>';
            priclad_cpy[i + 3] = '\0';
            strcat(priclad_cpy, &priclad[i + 1]);
            strcpy(priclad, priclad_cpy);
            break;
        case 52:
            strcpy(priclad_cpy, priclad);
            priclad_cpy[i] = '-';
            priclad_cpy[i + 1] = '>';
            priclad_cpy[i + 2] = '\0';
            strcat(priclad_cpy, &priclad[i + 1]);
            strcpy(priclad, priclad_cpy);
            break;
        case 53:priclad[i] = (char)191; break;
    }
    printf("%s", priclad);
    printf(" = ");
}

void Prysvoyennya_znachennya(int k_s)
{
    for (int i = 0; i < strlen(priclad); i++)
        for (int j = 0; j < k_s; j++)
            if (priclad[i] == Tsyfra[j].bc)
                priclad[i] = Tsyfra[j].bi;
    printf("%s", priclad);
}

//Логічні операції Begin
void zaperechena(char *v_duzhkakh)
{
    for (int i = 0; i < strlen(v_duzhkakh); i++)
        if (v_duzhkakh[i] == (char)191)
            if (v_duzhkakh[i + 1] == '1')
                v_duzhkakh[i + 1] = '0';
            else
                if (v_duzhkakh[i + 1] == '0')
                    v_duzhkakh[i + 1] = '1';
}

int log_ekvivalentnist(int A, int B)
{
    if (A == 0 && B == 0)
        return 1;
    else
        if (A == 0 && B == 1)
            return 0;
        else
            if (A == 1 && B == 0)
                return 0;
            else
                if (A == 1 && B == 1)
                    return 1;
}

int log_implikatsiya(int A, int B)
{
    if (A == 0 && B == 0)
        return 1;
    else
        if (A == 0 && B == 1)
            return 1;
        else
            if (A == 1 && B == 0)
                return 0;
            else
                if (A == 1 && B == 1)
                    return 1;
}
//Логічні операції End

int arykhmetyka(char *v_duzhkakh)
{
    int chyslo1 = -1, chyslo2 = -1;
    int lo = 0;//l - logichna o - operasiya
    zaperechena(v_duzhkakh);
    for (int i = 0; i < strlen(v_duzhkakh); i++)
    {
        switch (v_duzhkakh[i])
        {
        case '^':lo = 1; break;
        case 'v':lo = 2; break;
        case '<':
            if (v_duzhkakh[i + 1] == '-' && v_duzhkakh[i + 2] == '>')
                lo = 3;
        case '-':
            if (v_duzhkakh[i + 1] == '>')
                lo = 4;
        }
        //
        if (v_duzhkakh[i] == '0')
        {
            if (chyslo1 == -1)
                chyslo1 = 0;
            else
                chyslo2 = 0;
        }
        else
            if(v_duzhkakh[i] == '1')
            {
            if (chyslo1 == -1)
                chyslo1 = 1;
            else
                chyslo2 = 1;
            }
        //
        if (chyslo1 != -1  && chyslo2 != -1)
        {
            switch (lo)
            {
            case 1:chyslo1 = chyslo1 && chyslo2; break;
            case 2:chyslo1 = chyslo1 || chyslo2; break;
            case 3:chyslo1 = log_ekvivalentnist(chyslo1, chyslo2); break;
            case 4:chyslo1 = log_implikatsiya(chyslo1, chyslo2); break;
            }
            lo = -1;
            chyslo2 = -1;
        }
    }
    return chyslo1;
}

int dushka_begin, dushka_end;

void rpzpiznavanna()
{
    int lich = 0, max = 0;
    for (int i = 0; i < strlen(priclad); i++)
    {
        if (priclad[i] == '(')
            lich++;
        else
            if (priclad[i] == ')')
                lich--;
        if (lich > max)
            max = lich,
            dushka_begin = i;
    }
    for (int i = dushka_begin; i < strlen(priclad); i++)
        if (priclad[i] == ')')
        {
        dushka_end=i;
        break;
        }
}

int Diyi()
{
    dushka_begin = -1, dushka_end = -1;
    rpzpiznavanna();
    if (dushka_begin == -1 && dushka_end == -1)
        return 1;
    char v_duzhkakh[200];
    strcpy(v_duzhkakh, &priclad[dushka_begin + 1]);
    v_duzhkakh[dushka_end - 1 - dushka_begin] = '\0';
    int znachena = arykhmetyka(v_duzhkakh);//
    char priclad_cpy[200];
    strcpy(priclad_cpy, priclad);

        if (znachena == 1)
            priclad[dushka_begin] = '1';
        else
            priclad[dushka_begin] = '0';
        priclad[dushka_begin + 1] = '\0';
        strcat(priclad, &priclad_cpy[dushka_end + 1]);//tobto \ (\ - znk diy, \ - znk)
        return 0;

}

int main()
{
    int kilkict_struct = Scan();
    ScanModernizator();
    Prysvoyennya_znachennya(kilkict_struct);

    while (Diyi() == 0)
        printf(" = %s", priclad);
    printf(" = %i", arykhmetyka(priclad));

    getch();
    return 0;
}

Допоможіть розібратися хто не прав є таке висловлювання з математичної логіки
q диз'юнкція заперечення (r імплікація ( p диз'юнкція  заперечення q еквівалентність r )) p=0,q=0,r=1
в моїй програмі воно виглядає так q25(r4(p25q3r)) <enter> p=0,q=0,r=1 <enter> я думаю ви зрозуміли чому
результат виходить 0 а в конспекті 1. Де допущена помилка ?

10

Re: bool повертає 204 ?

Betterthanyou написав:

Де допущена помилка ?

мнеі здається чи комусь вже час використовувати дебагер ?

11 Востаннє редагувалося Betterthanyou (14.09.2014 14:42:13)

Re: bool повертає 204 ?

reverse2500 дебагер тут не допоможе бо я не знаю точну відповідь на висловлювання. Я сам не розумію як робити це: q диз'юнкція заперечення (r імплікація ( p диз'юнкція  заперечення q еквівалентність r )) p=0,q=0,r=1
тому і прошу допомоги тих хто знає дискретну математику мені потрібне розв'язання щоб я міг дізнатися яку дію я виконав не вірно

12

Re: bool повертає 204 ?

Я так розумію, вам треба знати значення виразу
(q V ! ( r -> ( p V ! q == r ) ) ) при p=0, q=0, r=1?
Як я розумію, еквівалентність тут має вищий пріорітет перед диз'юнкцією (взагалі раджу ставити дужки в таких випадках); а значення цього виразу буде
(0 V ! ( 1 -> ( 0 V ! 0 == 1 ) ) )
(0 V ! ( 1 -> ( 0 V ! 0 ) ) )
(0 V ! ( 1 -> ( 0 V 1 ) ) )
(0 V ! ( 1 -> 1 ) )
(0 V ! 1 )
(0 V 0 )
0

Подякували: Betterthanyou1

13

Re: bool повертає 204 ?

Betterthanyou написав:
quez написав:

bool - це той самий int. 0 - це false, все інше - true. Тому писати A == 1 не найкраща ідея.

Зовсім з вами не згідний int має 4 байта а bool 1 тобто

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    bool A;
    A = 204;
    cout << "A = "<<A;
    getch();
    return 0;
}

а буде дорівнювати 1 а не 204

Ок. bool може бути int`ом, як в C.
Ну і щодо байтів:

§5.3.3 написав:

sizeof(bool) is not required to be 1.

Подякували: koala1

14

Re: bool повертає 204 ?

Справа у вирівнюванні зсуву даних в сучасних мікропроцесорах (і х86 родини зокрема), бо до вирівняних даних швидше доступ.