if bedingung vereinfachen

Gast #2321477
Lesenswert?

Hallo,ich habe hier ein Programm,welches auch einwandfrei läuft.
In einer schleife wird folgende if bedingung bei jedem durchlauf 
ausgewertet.

if(zaehler > 21 & zaehler < 26 || zaehler > 31 & zaehler < 36 || zaehler 
> 41 & zaehler < 46 || zaehler > 51 & zaehler < 56)
   {
      anzeige [5] [0] = anzeige [5] [0] << 1;
      anzeige [4] [0] = anzeige [4] [0] << 1;
      anzeige [3] [0] = anzeige [3] [0] << 1;
      anzeige [2] [0] = anzeige [2] [0] << 1;

     }

if(zaehler > 26 & zaehler < 31 || zaehler > 36 & zaehler < 41 || zaehler 
> 46 & zaehler < 51 || zaehler > 56 & zaehler < 61)
   {
      anzeige [5] [0] = anzeige [5] [0] >> 1;
      anzeige [4] [0] = anzeige [4] [0] >> 1;
      anzeige [3] [0] = anzeige [3] [0] >> 1;
      anzeige [2] [0] = anzeige [2] [0] >> 1;
     }
zaehler wird in jedem durchlauf um 1 erhöht.Da mein zaehler vergleich 
bis 200 so fortgeführt werden soll,gibt das lange bedingungen.
Ich sitze hier schon einige Zeit und überlege,wie man das einfacher 
hinbekommen kann,komme aber auf nichts.Hat vielleicht jemand einen Tip?.

gruss

andy
#2321493
Lesenswert?

das zweite if sieht so aus als ob es das Gegenteil vom ersten wäre. Wie 
die Sache bei zaehler < 22 ist bzw über 60 musst du wissen, aber ich 
vermute mal, dass das ganze erst mal ein Fall für einen else ist.

   if( Bedinung )
     ...
   else
     ...


damit spart man sich schon mal die 2. te Bedinung. Der else Zweig 
behandelt automatisch alle Fälle die nicht von der Bedinung abgedeckt 
sind.

Dann: Das sieht so aus, als ob es die Bedingung davon abhängt, wie die 
Einerstelle deines zahlers aussieht: von 2 bis 5, ist es der eine Faall; 
von 6 bis 1 der andere.

Die Einerstelle kriegt man aber leicht

  einer = zaehler % 10;

  if( einer > 1 && einer < 6 ) {
      anzeige [5] [0] = anzeige [5] [0] << 1;
      anzeige [4] [0] = anzeige [4] [0] << 1;
      anzeige [3] [0] = anzeige [3] [0] << 1;
      anzeige [2] [0] = anzeige [2] [0] << 1;
  }
  else {
      anzeige [5] [0] = anzeige [5] [0] >> 1;
      anzeige [4] [0] = anzeige [4] [0] >> 1;
      anzeige [3] [0] = anzeige [3] [0] >> 1;
      anzeige [2] [0] = anzeige [2] [0] >> 1;
 }

ob das jetzt alles 100% bei dir so einsatzbar ist oder nicht, kann man 
anhand eines einzelnen kleinen Codeausshcnitts so nicht sagen. Eventuell 
sind da noch ein paar Modifikationen notwendig, aber ich denke soweit 
liegt das nicht daneben.
Persönliche Seite #2321501
Lesenswert?

Ich glaub nicht, daß du & in den Bedingungen willst. Vielmehr wohl &&, 
oder?

In ersten Vergleich ist zähler / 10 = 2..4 und zähler % 10 = 2..5, 
allerdings glaube ich nicht, daß du mit Divisionsn anfanngen willst 
wenn's dir um Effizienz geht.

Anstatt eine if-Bedingung zu schreiben geht auch ein switch, so daß der 
Compiler das in einen binären Entscheidungsbaum aufdröseln kann (GNU-C). 
Das ist effizienter als das Rumgeturne mit div und mod auch wenn's nicht 
so elegant aussieht:
1
switch (zaehler)
2
{
3
   case 22 ... 25:
4
   case 32 ... 35:
5
   case 42 ... 45:
6

7
     anzeige[5][0] <<= 1;
8
     anzeige[4][0] <<= 1;
9
     anzeige[3][0] <<= 1;
10
     anzeige[2][0] <<= 1;
11
      
12
     break;
13
}

Möglicherweise ist es aber einfach ungeschickt, zähler als Skalar zu 
führen anstatt ihn zB in 2 Variablen aufzuspalen, zB in Zehner und 
Einer.
Persönliche Seite #2321520
Lesenswert?

Habe eben mal folgenden Code durch avr-gcc 4.6 durchgelassen:
1
char a;
2

3
void foo (unsigned char z)
4
{
5
    switch (z)
6
    {
7
    case 22 ... 25:
8
    case 32 ... 35:
9
    case 42 ... 45:
10
        
11
        a = 0;
12
        break;
13
    }
14
}
Für einen ATmega8 mit -Os gibt das:
1
foo:
2
  cpi r24,lo8(36)
3
  brsh .L4
4
  cpi r24,lo8(32)
5
  brsh .L3
6
  subi r24,lo8(-(-22))
7
  rjmp .L6
8
.L4:
9
  subi r24,lo8(-(-42))
10
.L6:
11
  cpi r24,lo8(4)
12
  brsh .L1
13
.L3:
14
  sts a,__zero_reg__
15
.L1:
16
  ret
Sieht doch sehr gut aus!
Gast #2321521
Lesenswert?

hallo,vielen dank für die antworten.Ich schaue stundenlang drauf und 
sehe es nicht.Das mit dem auswerten der einerstellen ist einerstellen 
ist genial,peinlich das ich nicht selber drauf gekommen bin.
Nochmals vielen dank.

gruss

andy

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren