Hallo, wie kann ich ein Array in C prüfen ob alle Werte darin 0 sind? Also ohne eine Schleife zu durchlaufen. Atamer
Der Andere schrieb: > Gar nicht Doch klar.
1 | if(Array[0]==0&&Array[1]==0&&Array[2]==0&& … &&Array[n]==0) |
2 | {
|
3 | …
|
4 | }
|
Atamer schrieb: > Also ohne eine Schleife zu durchlaufen. So:
1 | if (elemnt[0] != 0) err++; |
2 | if (elemnt[1] != 0) err++; |
3 | if (elemnt[2] != 0) err++; |
4 | if (elemnt[3] != 0) err++; |
5 | if (elemnt[4] != 0) err++; |
6 | if (elemnt[5] != 0) err++; |
7 | if (elemnt[6] != 0) err++; |
8 | |
9 | // usw.
|
Braucht kaum Speicherplatz und geht ganz ohne Schleife.
Dussel schrieb: > Der Andere schrieb: >> Gar nicht > Doch klar. > >
1 | if(Array[0]==0&&Array[1]==0&&Array[2]==0&& … &&Array[n]==0) |
2 | > { |
3 | > … |
4 | > } |
5 | >
|
Genialer Programmierer schrieb: > Atamer schrieb: >> Also ohne eine Schleife zu durchlaufen. > > So: > >
1 | >
|
2 | > if (elemnt[0] != 0) err++; |
3 | > if (elemnt[1] != 0) err++; |
4 | > if (elemnt[2] != 0) err++; |
5 | > if (elemnt[3] != 0) err++; |
6 | > if (elemnt[4] != 0) err++; |
7 | > if (elemnt[5] != 0) err++; |
8 | > if (elemnt[6] != 0) err++; |
9 | >
|
10 | > // usw. |
11 | >
|
12 | >
|
> > Braucht kaum Speicherplatz und geht ganz ohne Schleife. Der 1. April war doch schon. ;-) Was wenn das Array z.B. 256 Elemente hat? 256 Zeilen Code hinschreiben oder wie? Das macht doch kein normaler Mensch.
:
Bearbeitet durch User
Atamer schrieb: > Hallo, > > wie kann ich ein Array in C prüfen ob alle Werte darin 0 sind? Also ohne > eine Schleife zu durchlaufen. Warum sollte es ein sinnvoller Ansatz sein, keine Schleife zu verwenden? Das ist genau die Standardlösung, die immer und ohne Probleme funktioniert. Da braucht man schon einen guten Grund um davon abzuweichen.
Wie kann ich ein Auto bauen das keine Räder hat. Und jetzt nicht kommen mit: Ich bau eins das fliegt, wenn es fliegt ist es ein Flugzeug, kein Auto, wenn es schwimmt ist es ein Boot, ... Trollfrage halt und ihr fallt darauf rein.
Mark B. schrieb: > Warum sollte es ein sinnvoller Ansatz sein, keine Schleife zu verwenden? Damit man was fertiges benutzen kann. Selber schreiben oder denken geht heute nicht mehr. "Ist ja umständlich. In Programmiersprache XY geht das ganz einfach"
Dirk B. schrieb: > Selber schreiben oder denken geht heute nicht mehr. Bei solchem Aufwand eine Schleife zu schreiben lohnt es sich schon mal im Internet zu suchen ob es da nicht was besseres gibt.
Ohne (eigene) Schleife: Neues Array anlegen und mit 0 initialisieren oder mit memset auf 0 setzen. oder ausreichend Speicher mit calloc besorgen. Dann mit memcmp vergleichen.
:
Bearbeitet durch User
Mark B. schrieb: > Was wenn das Array z.B. 256 Elemente hat? 256 Zeilen Code hinschreiben > oder wie? Das macht doch kein normaler Mensch. Die Frage war 'wie'. Die Antwort war 'Geht nicht'. Das ist in C falsch und ich habe gezeigt, dass es geht. Ob es sinnvoll ist, war nicht die Frage. Vielleicht entwickelt der Fragesteller ja gerade seinen eigenen C-Compiler und hat Schleifen noch nicht implementiert. ;-)
Vielleicht sowas in die richtung?
1 | struct int_array { |
2 | size_t set_count; |
3 | int* data; |
4 | };
|
5 | |
6 | int array_data[10]={0}; |
7 | struct int_array array={0,array_data}; |
8 | |
9 | void int_array_setValue( struct int_array* a, size_t i, int x ){ |
10 | int y = a->data[i]; |
11 | if( x && !y ) a->set_count++; |
12 | if( y && !x ) a->set_count--; |
13 | a->data[i] = x; |
14 | }
|
15 | |
16 | bool int_array_isNoneSet( struct int_array* a ){ |
17 | return !a->set_count; |
18 | }
|
:
Bearbeitet durch User
Oder mit Rekursion:
1 | bool allZero(const int* data, size_t count) |
2 | {
|
3 | if(count == 0) |
4 | return true; |
5 | else
|
6 | return data[0] == 0 && allZero(data+1, count-1); |
7 | }
|
Man könnte das ganze auch rekursiv lösen, z.B. indem man das Problem für ein Array der Größe N auf das der Größe N-1 zurückführt oder z.B. einen Binärbaum aufbaut. Im ersten Fall skaliert der Speicherverbrauch auf dem Stack linear mit der Größe des Arrays und im zweiten logarithmisch. Im konkreten Fall mag solch ein Vorgehen unglaublich ineffizient sein, aber bei manchen andere Fragestellungen durchaus sinnlos und effizient. Nachtrag: Mist, zu spät... ;-)
:
Bearbeitet durch User
1 | if (std::all_of(begin(a), end(a), [](auto x) { return x == 0; })) |
2 | ...
|
tictactoe schrieb:
1 | if (std::all_of(begin(a), end(a), [](auto x) { return x == 0; })) |
Das ist kein C, sondern C++.
:
Bearbeitet durch User
1 | int tst(int *arr, int size) __attribute__((optimize("-funroll-loops"))); |
2 | |
3 | int tst(int arr[], int size) |
4 | {
|
5 | int i; |
6 | |
7 | |
8 | for (i = 0; i < size; i++) |
9 | if (arr[i] != 0) |
10 | return 1; |
11 | return 0; |
12 | }
|
Ausdrucken, dem Lehrling in die Hand drücken und alle Nullen unterstreichen lassen. Geht super und ohne Schleife. Es sei denn der Lehrling hat eine an.
Markus F. schrieb: > ((optimize("-funroll-loops"))); naja, das geht ja nur bei festen Werten. Für eine optimal Laufzeit mit z.B. 100 oder 1000 Elementen sollte man Duffs Device (entsprechend) verwenden ;-) https://de.wikipedia.org/wiki/Duff%E2%80%99s_Device
Dirk B. schrieb: > Ohne (eigene) Schleife: > > Neues Array anlegen und mit 0 initialisieren oder mit memset auf 0 > setzen. > oder ausreichend Speicher mit calloc besorgen. > > Dann mit memcmp vergleichen. Zweites Array ist nicht nötig. Alle Elemente sind 0, wenn das erste Element 0 ist und jedes Element gleich dem Nachfolger ist:
1 | (a[0]==0) && (memcmp(a,a+1,sizeof(*a)*(a_len-1))==0) // a_len: Anzahl der Elemente in a. Der Typ von *a muss bitvergleichbar sein. |
;)
Vielleicht war hier tatsächlich eine rekursive Lösung gesucht anstatt einer iterativen. Dann klingt das Ganze ziemlich nach Hausaufgaben machen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.