sanningstabell => C-kod

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Re: sanningstabell => C-kod

Inlägg av Greve Hamilton »

Nerre
Inlägg: 27208
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: sanningstabell => C-kod

Inlägg av Nerre »

Kod: Markera allt

if (!B)
  if (C || !A ) { gör nånting};
Är väl snyggaste (mest lättlästa) sättet att skriva ErikJs lösning? (Edit: Icecap hade visst redan skrivit det, men det inlägget var så kort att jag missade det:-)

För grejen här är väl att villkoren A, B och C är saker som så att säga är i klartext?

Typ:

Kod: Markera allt

if (!upptagen)
  if (klart || !blockerad) { gör det som skall göras};
MEN, jag är lite osäker på de här två raderna som anges med x i första inlägget. Spelar det ingen roll vad som händer där eller?

Eller är det så att ingenting skall göras där, en sak när det är noll och en annan sak när det är ett?

Om x får vara 1 eller 0 så kan man förenkla lite mer.

Kod: Markera allt

if (!A || (B && C))
Fördelen med den koden är väl också att om A är 0 så behöver resten av uttrycket inte exekveras.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: sanningstabell => C-kod

Inlägg av sodjan »

> MEN, jag är lite osäker på de här två raderna som anges med x i första inlägget.
> Spelar det ingen roll vad som händer där eller?

Detta (också från första inlägget) är väl inte helt svårt att förstå :

> (då A och B båda är noll är resultatet irrelevant eftersom denna situation ej kan uppstå, därför ett "x" i resultatet)

Eller ?
Nerre
Inlägg: 27208
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: sanningstabell => C-kod

Inlägg av Nerre »

Ja se där, en liten parantes som jag hade missat.

Men det innebär ju då att man kan förenkla uttrycket väldigt mycket, eftersom man kan sätta de där X till precis vad man vill.

Om man t.ex. sätter 000 till 1 och 001 till 0 så får man uttrycket !(A && C) || (B && C).


(Fast att anta att en situation "aldrig kan uppstå" är ju nåt man inte ska göra. Såna antaganden har legat bakom tusentals buggar.)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: sanningstabell => C-kod

Inlägg av jesse »

Nerre - har du inte läst något annat inlägg än det allra första? :roll:

>(Fast att anta att en situation "aldrig kan uppstå" är ju nåt man inte ska göra. Såna antaganden har legat bakom tusentals buggar.)

Det är sant, men i det här fallet tas detta om hand innan:

A=0 och B=0 kan inte uppstå samtidigt eftersom det hela sker inom en if-sats:

Kod: Markera allt

Z = positivt värde;
if ( A || B ) {                 // skippar alltihop om varken A eller B är etta.
     kod;
     if ( (B && C) || (!A)) Z = 0;     // den omdiskuterade if-satsen
     mera kod;
}
Tar inte med hela programmet nu , men A heter egentligen max, B heter min och C heter toggle.
A och B kan anta värdena 1 eller 0, C är en integer som räknar upp, men bara bit 0 avläses (toggle&1)

programmet skall växla mellan "max och min" varannan gång om båda är sanna, men om bara en är sann skall den välja den. "väljer" gör den genom att nollställa en variabel 'Z' för "min" eller behålla värdet på Z för 'max'

Kod: Markera allt

max min toggle Z
0   1   0      0
0   1   1      0
0   1   0      0
0   1   1      0
1   1   0      32
1   1   1      0
1   1   0      25
1   1   1      0
1   1   0      23
1   0   1      23
1   0   0      23
1   0   1      21
1   0   0      24
1   0   1      26
Nerre
Inlägg: 27208
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: sanningstabell => C-kod

Inlägg av Nerre »

Det var ju det första jag hade läst dåligt:-)

Alla andra förslag förutsätter ju såvitt jag kan se att de där x skall vara noll? Men om den kan vara vad som helst får du ett enklare uttryck om du istället sätter dem till ett.

Rita ett karnaugh-diagram så ser du.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: sanningstabell => C-kod

Inlägg av jesse »

Nja, jag syftar mest på din förenkling. Vi har redan kommit fram till att man kan skriva if ( (B && C) || !A ), och sen skriver du:
Men det innebär ju då att man kan förenkla uttrycket väldigt mycket...
... så får man uttrycket !(A && C) || (B && C).
:D
Nerre
Inlägg: 27208
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: sanningstabell => C-kod

Inlägg av Nerre »

Ja men det är ju grunduttrycket, som skall jämföras med (C && B) || (B && !A) :-)

Jag har inte tittat på om det går att "bryta ut" nåt ur det.
Skriv svar