webForumDet fria alternativet

Förklara kod?

C/C++

13 svar · 257 visningar · startad av Fredde Mannen

Medlem sedan nov. 20014 054 inlägg
Frågan#1

Hur skulle ni förklara denna mängd med if-satser?

  int tal = 0, i = 0;
  char tecken = '0';
  if(tecken && i)
  if(tal || i)
  if(!tal);
  else if(!i) {
  if(tal+i)
  printf("Hej på er!\n");}
  else
  printf("Vad händer?\n");
  printf("Nu är det slut!\n");
  return 0;

och vad skulle ni ändra på för att få resultatet

Hej på er!
Medlem sedan maj 20018 027 inlägg
#2

tecken && i: sant om tecken pekar mot NULL, vilket det inte gör. Alltså falskt. Därmed struntar vi i de två nästföljande if-satserna, och går direkt vidare till första else.

if (!i): sant, eftersom i == falskt.

if (tal + i): falskt, eftersom tal + i == 0.

Därför skrivs inte nästföljande sats, som du vill ha utskriven.

Jag skulle sätta tal = 1 i början. Då borde den önskade utskriften komma, för då skulle den sista if-satsen bli sann. De andra if-satserna som tal förekommer i, kommer man i vilket fall som helst inte till, så det blir den enda skillnaden.

Jag reserverar mig för att jag själv tycker det såg tillkrånglat ut. ;)

Medlem sedan nov. 20014 054 inlägg
#3

det är du inte ensam om! :)

tack! :)

Medlem sedan nov. 20014 054 inlägg
#4

men att ange tal = 1, kommer inte att gör någon förändring! Här skrivs fortfarande endast satsen "Nu är det slut!".

Ingen förändring dvs.

Förändingar får jag genom att sätta tal = 1 samt i = 1.

Förändring:
"Vad händer?"
"Nu är det slut!"

fler ljusa idéer! :)

Medlem sedan maj 20018 027 inlägg
#5

När jag tänker efter, har jag nog resonerat fel angående den första if-satsen. Men slutsatsen angående den, bör vara rätt. Egentligen blir "vad som helst" && 0 == 0 och därmed falskt. Så slutsatsen är fortfarande densamma, även om resonemanget bakom den var tokigt.

Det är lite krångligt, som sagt var. :)

Medlem sedan nov. 20014 054 inlägg
#6

UlfT skrev:

När jag tänker efter, har jag nog resonerat fel angående den första if-satsen. Men slutsatsen angående den, bör vara rätt. Egentligen blir "vad som helst" && 0 == 0 och därmed falskt. Så slutsatsen är fortfarande densamma, även om resonemanget bakom den var tokigt.

Det är lite krångligt, som sagt var. :)

Jo tack.. det är lite krångligt! :)

Japp.. resonemanget är det juh inget fel på! :)

Krångligt krångligt.. :)

Medlem sedan maj 20018 027 inlägg
#7

Fredde Mannen skrev:

Förändingar får jag genom att sätta tal = 1 samt i = 1.

Förändring:
"Vad händer?"
"Nu är det slut!"

Åtminstone kan vi konstatera att du därmed kommer till if(!i). Eftersom i == 1, blir !i == falskt. Då får du inte den utskrift du ville ha. Förmodligen har jag tänkt fel angående de if-satser som jag påstod kommer hoppas över. Om vi antar att båda dessa if-satser utförs, då borde vi ha:

if (tal || i): sant om minst en av dem är 1.

if (!tal): falskt om tal == 1. Sant om tal == 0.

Den första if-satsen (if (tecken && i)) borde bli sann om i == 1. Då utförs nästa if-sats, som under samma förutsättningar, därmed är sann, även om tal == 0. Detta ger att (if(!tal)) blir sann om tal == 0. Men då blir ju if(!i) som sagt falsk.

Tyvärr kommer jag inte fram till en lösning. :(

Medlem sedan nov. 20014 054 inlägg
#8

Ingen fara... detta är så kallad hjärngymnastik! ;)

tack i alla fall.. har något att grummla på i natt :e

Medlem sedan maj 20018 027 inlägg
#9

Jag kom att tänka på att du inte specificerade hur man får ändra. Hittills har vi bara resonerat om ändringar av variablerna. Men tänk om man får ändra även på villkoren? Då skulle man kunna tänka sig:

i = 1 och tal = 1 som utgångspunkt.

if(tecken && i): sant, eftersom både tecken och i skiljer sig från noll, och därmed är sanna.

if(tal || i): sant, eftersom minst en av dem är sanna.

if(!tal); : falskt, eftersom tal är sant.

därmed kommer vi till följande villkor:

if(!i)

Med i == 1, blir ju det villkoret falskt, och den önskade texten uteblir. Men om det är tillåtet att ändra villkoret, skulle vi lika gärna kunna skriva det som:

if(i)

Då blir det sant, och vi kommer till:

if (tal+i)

där tal + i skiljer sig från noll. Det villkoret är därmed också sant, och den önskade texten skrivs ut.

Medlem sedan nov. 20014 054 inlägg
#10

Bingo! ;)

Där satt den UlfT! :e

Medlem sedan maj 20018 027 inlägg
#11

Nu installerade jag en c-kompilator. Jag fann att min sistnämnda lösning funkar. Jag fann också en annan lösning som bara kräver två ändringar:

tal = 1

och

if (tecken && i) -> if (tecken || i)

Därmed blir det villkoret sant i och med att tecken != NULL, och if(!i) är sant eftersom i = false.

Man måste alltså fortfarande ändra i ett av villkoren, men antalet ändringar är nu färre. :)

Medlem sedan nov. 20014 054 inlägg
#12

Japp! :) *skål* :bire

Medlem sedan maj 20021 466 inlägg
#13

Vad är meningen med koden?

Varför tar du inte bort allt utom printf om du bara vill skriva ut en text?

Medlem sedan nov. 20014 054 inlägg
#14

Marcus E skrev:

Vad är meningen med koden?

Varför tar du inte bort allt utom printf om du bara vill skriva ut en text?

Det var en liten hjärnmassageuppgift! :e

273 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
134 ms — ändringar (db)