Reihenbildungsgesetze finden - Wie erkläre ich es meinen Studenten?

  
nach meinen bisherigen Tutorien in Lineare Algebra, Diskrete Mathematik und Theoretischer Informatik, darf ich in diesem Semester Studenten durch ihre Analysis-Prüfungen helfen. Gestern habe ich eine Frage zur folgenden Aufgabe bekommen:
  
"Man finde ein Bildungsgesetz für die folgende Reihe und prüfe sie auf Konvergenz: \(1 - 3 + 9/2 - 27/6 + 81/24 - ...\)"
  
Man sieht meiner Ansicht nach relativ schnell, dass das dahinterstehende Bildungsgesetz $$\sum\_{k=0}^{\infty}{(-1)^k \cdot \left(\dfrac{3^k}{k!}\right)}$$ lautet. Die Studies kamen da leider nicht drauf und wollten ein paar Tipps, wie man Bildungsgesetze (am besten mit einem Rezept) finden kann. Ich habe der Gruppe folgende Tipps an die Hand gegeben:
  
1.) Wenn man ein **alternierendes Vorzeichen** sieht, liegt der Schluss nahe, dass \((-1)^k\) vorkommt.2.) Häufig tauchen bei diesem Aufgabentyp **Kombinationen aus \(a^k\) und \(k!\)** auf.3.) Man muss ein wenig mit den **Zahlen jonglieren**.4.) Durch **viel Übung** bekommt man ein Gespür für Bildungsgesetze.5.) Bei Reihen, in denen die Glieder z.B. durch \(\dfrac{2^2}{2!} + \dfrac{2^3}{3!} + \dfrac{2^4}{4!} + ...\) dargestellt werden, kann man die konstanten von den nicht konstanten Parametern trennen und untersuchen, wie der **Verlauf der nicht konstanten Parameter** aussieht (hier wäre z.B. die Basis 2 konstant, Exponent und Divisor veränderlich).
  
Jetzt ist meine Frage, ob ihr Ideen habt, **was man noch als Tipp geben könnte**.
  
Ich persönlich sehe diesen Aufgabentyp in Prüfungen eher kritisch, denn ich halte folgende Argumentation ebenfalls für legitim: die Reihenglieder liegen alle auf einem Interpolationspolynom. Im obigen Beispiel ergibt das (z.B. mit "dividierten Differenzen" oder Neville-Aitken) das Polynom $$\sum\_{k=0}^{\infty}{\dfrac{491}{192}\cdot k^4-\dfrac{1921}{96}\cdot k^3+\dfrac{9193}{192}\cdot k^2-\dfrac{3305}{96}\cdot k+1}$$ Nun vereinfacht sich aber die Konvergenzuntersuchung erheblich und man hätte einen Algorithmus, mit dem man jede dieser so formulierten Aufgabenstellungen zuverlässig lösen kann. Wenn der Dozent nicht explizit hinschreibt "eine Lösung durch Interpolationspolynome ist nicht zulässig" spricht meiner Ansicht nach nichts gegen diese Argumentation, oder was meint ihr? Auch wenn der Dozent die "offensichtlichste" Lösung einfordert, müsste er zunächst einmal definieren, was "offensichtlichst" heißt und ob die Studenten-Antworten statistisch valide erhoben wurden, um eine Argumentation über die Häufigkeitsverteilung der Antworten zu rechtfertigen.
  
Ich freue mich auf eure Gedanken zu diesem Thema!
  
GrußAndré
Hallo savest8 (André),

gerade Studenten sollen doch wissen, dass jede **endliche Reihe ohne Angabe von Randbedingungen durch unendlich viele Algorithmen "hingebastelt"** werden können. (das Summenzeichen ist ja hier irrelevant)

(unter <http://www.gerdlamprecht.de/Zahlenfolgen.html> zig Beispiele dafür)

Es kann doch nicht sein, dass die intelligenteren Studenten, die mehr Algorithmen (Funktionen usw.) kennen als andere, dann bestraft werden, nur weil "ihre Gedanken" etwas komplexer  waren als bei anderen... 

OK, Nachkommastellen-Algorithmen oder Pseudo-Zufallsgenerator-Algorithmen kann man wohl ausschließen.

( Im Gegenteil, ich würde Studenten Extra-Punkte vergeben, wenn sie neben einer primitiven noch eine andere Lösung finden... )

Die **Angabe von Randbedingungen** halte ich als **ganz wichtige Angabe einer "sauberen Aufgabenstellung"**!

Beispiele:

- Angabe, ob Brüche gekürzt sind (wurde ja schon genannt)

- Angabe, ob Interpolationspolynom (will man dies nicht explizit nennen, kann dies auch indirekt erfolgen, wenn durch Angabe der maximalen (Ganz-)Zahl im Algorithmus & genügen viele Glieder ein Polynom ausgeschlossen wird; Beispiel oben taucht ja die Zahl 9193 auf -> die Randbedingung "im Algorithmus keine Ganzzahlen über 99" oder Maximalzahl von Operatoren & Funktionen... Beispiel: (k(k(k(491*k-3842)+9193)-6610)+192)/192 )

- Angabe, ob höhere Funktionen beteiligt, sonst kommt noch so etwas:

(k(k(7k(271k-2266)+35507)-8102)+960)*Bernoulli(2k+2)/160
  


<http://www.wolframalpha.com/input/?i=table+(k(k(7k(271k-2266)%2B35507)-8102)%2B960)*bernoulli(2k%2B2)%2F160,k%3D0...4>
  


Die Angabe der maximalen Operatoren/Funktionen oder Klammern ist auch wichtig, um Lösungen wie

(2k(k((k-4)k+8)-2)+3)/3*(-1)^k/k!
  


{ LINK: <http://www.wolframalpha.com/input/?i=table++(2k(k((k-4)k%2B8)-2)%2B3)%2F3*(-1)%5Ek%2Fk!,k%3D0...4>

} auszuschließen.

Sonderrolle spielen Primzahlen. Manchmal bereits in der Grundschule erwartet...

einige Programme haben sie integriert {WolframAlpha kennt Prime(x) }

... eine exakte Formel wie <http://www.lamprechts.de/gerd/php/Formeln/Formel-7.png>

wird nie in Aufgaben abgefragt werden...

Was generell viele falsche Gedankengänge vertreiben hilft, sind mehr als 5 Glieder in der Aufgabenstellung.

wenn da noch -243/120 steht, **sieht man schneller**, dass:

- Vorzeichen immer wechselt

- hier nicht gekürzt wurde

- 120 bei der Fakultät auftaucht

- das Interpolationspolynom kaum noch mit üblichen Faktoren dargestellt werden kann (Taschenrechnergenauigkeit reicht nicht mehr)
Klicken Sie sich einfach mal hier durch und zählen Sie mit (einfach in die Grafik klicken; dazu muss aber auch gesagt werden, dass die Anzahl der Schritte von der Anwendungsreihenfolge der beiden möglichen Vereinfachungsregeln abhängt, wir haben in der Klausur deshalb damals auch 14 als richtige Lösung gelten lassen):  

  

@[ID-22789]@ <p>sie sollten versuchen, schleifen generell zu vermeiden. sie sind normalerweise weniger effizient als satzbasierte lösungen und weniger lesbar.</p><p>das folgende sollte ziemlich effizient sein.</p><p>dies gilt umso mehr, wenn die spalten name und weight im index <code>include-</code> d sein könnten, um die schlüsselsuche zu vermeiden.</p><p>es kann den eindeutigen index in der reihenfolge <code>turn</code> scannen und die laufende summe der spalte <code>weight</code> berechnen. verwenden sie dann <code>lead</code> mit denselben ordnungskriterien, um die laufende summe zu ermitteln die nächste reihe wird sein.</p><p>sobald die erste zeile gefunden wird, in der diese 1000 überschreitet oder <code>null</code> ist (was anzeigt, dass keine nächste zeile vorhanden ist), kann der scan gestoppt werden.</p><pre><code>with t1 as (select *, sum(weight) over (order by turn rows unbounded preceding) as cume\_weight from [dbo].[line]), t2 as (select lead(cume\_weight) over (order by turn) as next\_cume\_weight, * from t1) select top 1 name from t2 where next\_cume\_weight &gt; 1000 or next\_cume\_weight is null order by turn </code></pre><h1>ausführungsplan</h1><p> <a href="https://i.stack.imgur.com/gb1mw.png">(<img src="https://i.stack.imgur.com/gb1mw.png" alt="enter image description here"></a> </p><p>in der praxis scheint es ein paar zeilen vor dem unbedingt erforderlichen zu lesen - es sieht so aus, als würde jedes fenster-spool/stream-aggregat-paar zwei zusätzliche zeilen lesen.</p><p>für die beispieldaten in der frage müssten im idealfall nur zwei zeilen aus dem index-scan gelesen werden, in wirklichkeit werden jedoch 6 zeilen gelesen. dies ist jedoch kein wesentliches effizienzproblem und verschlechtert sich nicht, wenn der tabelle weitere zeilen hinzugefügt werden (wie in) <a href="https://dbfiddle.uk/?rdbms=sqlserver\_2017&amp;fiddle=892e6bb7c1af912413b01d05e606a98a">diese demo</a> )</p><p>für diejenigen, die an dieser ausgabe interessiert sind, wird unten ein bild mit den von jedem operator ausgegebenen zeilen (wie durch das erweiterte ereignis <code>query\_trace\_column\_values</code> gezeigt) angezeigt. die zeilen werden in der reihenfolge <code>row\_id</code> ausgegeben (beginnend mit <code>47</code> für die erste zeile, die vom index-scan gelesen wurde und bei <code>113</code> für <code>top</code> endet)</p><p>klicken sie auf das bild unten, um es zu vergrößern, oder sehen sie alternativ <a href="https://imgur.com/a/c7npqqh">die animierte version, um den ablauf einfacher zu verfolgen</a> .</p><p>anhalten der animation an dem punkt, an dem das rechte stream-aggregat seine erste zeile ausgegeben hat (für gary - turn = 1). es scheint offensichtlich, dass es darauf gewartet hat, seine erste zeile mit einem anderen windowcount zu erhalten (für jo - turn = 2). und die fensterspule gibt die erste "jo" -zeile erst frei, wenn sie die nächste zeile mit einem anderen <code>turn</code> gelesen hat (für thomas - turn = 3)</p><p>die fensterspule und das stream-aggregat bewirken also, dass eine zusätzliche zeile gelesen wird, und es gibt vier davon im plan - daher 4 zusätzliche zeilen.</p><p> <a href="https://i.stack.imgur.com/cwllc.jpg">(<img src="https://i.stack.imgur.com/cwllc.jpg" alt="enter image description here"></a> </p><p>es folgt eine erläuterung der oben gezeigten spalten (basierend auf info <a href="https://www.microsoft.com/en-us/p/microsoft-sql-server-2012-high-performance-t-sql-using-window-functions/fgqpf3h0qlch">hier</a> )</p><ul> <li><strong> knotenname: index-scan, knoten-id: 15, spaltenname: id </strong> basistabellenspalte, die vom index abgedeckt wird</li> <li><strong> knotenname: index-scan, knoten-id: 15, spaltenname: drehen sie die basistabellenspalte </strong>, die vom index abgedeckt wird</li> <li><strong> nodename: clustered index seek, nodeid: 17, columnname: gewicht </strong> basistabellenspalte, die aus der suche abgerufen wurde</li> <li><strong> nodename: clustered index seek, nodeid: 17, columnname: name </strong> basistabellenspalte, die aus der suche abgerufen wurde</li> <li><strong> nodename: segment, nodeid: 13, columnname: segment1010 </strong> gibt 1 am anfang einer neuen gruppe zurück oder andernfalls null. da kein <code>partition by</code> in <code>sum</code> vorhanden ist, erhält nur die erste zeile 1</li> <li><strong> nodename: sequenzprojekt, nodeid: 12, columnname: rownumber1009 </strong> <code>row\_number()</code> innerhalb der durch das segment1010-flag angegebenen gruppe. da sich alle zeilen in derselben gruppe befinden, werden ganze zahlen von 1 bis 6 aufgestiegen. wird in fällen wie <code>rows between 5 preceding and 2 following</code> zum filtern von zeilen mit rechten rahmen verwendet. (oder wie für <code>lead</code> später)</li> <li><strong> nodename: segment, nodeid: 11, columnname: segment1011 </strong> gibt 1 am anfang einer neuen gruppe zurück oder andernfalls null. da kein <code>partition by</code> in <code>sum</code> vorhanden ist, erhält nur die erste zeile 1 (wie segment1010).</li> <li><strong> nodename: window spool, nodeid: 10, columnname: windowcount1012 </strong> attribut, das zeilen gruppiert, die zu einem fensterrahmen gehören. diese fensterspule verwendet den fall "fast track" für <code>unbounded preceding</code>. wo es zwei zeilen pro quellzeile ausgibt. eins mit den kumulativen werten und eins mit den detailwerten. obwohl es keinen sichtbaren unterschied in den durch <code>query\_trace\_column\_values</code> offenbarten zeilen gibt, gehe ich davon aus, dass kumulative spalten in der realität vorhanden sind.</li> <li><strong> nodename: stream aggregate, nodeid: 9, columnname: expr1004 </strong> <code>count(*)</code> gruppiert nach windowcount1012 gemäß plan, aber tatsächlich eine laufende anzahl</li> <li><strong> nodename: stream aggregate, nodeid: 9, columnname: expr1005 </strong> <code>sum(weight)</code> gruppiert nach windowcount1012 gemäß plan, aber tatsächlich die laufende gewichtssumme (dh <code>cume\_weight</code>)</li> <li><strong> nodename: segment, nodeid: 7, columnname: expr1002 </strong> <code>case when [expr1004]=(0) then null else [expr1005] end</code> - sehen sie nicht, wie <code>count(*)</code> kann sei 0, also läuft immer die summe (<code>cume\_weight</code>)</li> <li><strong> knotenname: segment, knoten-id: 7, spaltenname: segment1013 </strong> nein <code>partition by</code> in <code>lead</code>, sodass die erste zeile 1 erhält. alle verbleibenden werden null</li> <li><strong> nodename: sequenzprojekt, nodeid: 6, columnname: rownumber1006 </strong> <code>row\_number()</code> innerhalb der durch das segment1013-flag angegebenen gruppe. da sich alle zeilen in derselben gruppe befinden, sind dies ganze zahlen von 1 bis 4</li> <li><strong> nodename: segment, nodeid: 4, columnname: bottomrownumber1008 </strong> rownumber1006 + 1, da <code>lead</code> die nächste zeile erfordert</li> <li><strong> nodename: segment, nodeid: 4, columnname: toprownumber1007 </strong> rownumber1006 + 1, da <code>lead</code> die nächste zeile erfordert</li> <li><strong> knotenname: segment, knoten-id: 4, spaltenname: segment1014 </strong> nein <code>partition by</code> in <code>lead</code>, sodass die erste zeile 1 erhält. alle verbleibenden werden null</li> <li><strong> nodename: window spool, nodeid: 3, columnname: windowcount1015 </strong> attribut, das zeilen, die zu einem fensterrahmen gehören, unter verwendung der vorherigen zeilennummern gruppiert. der fensterrahmen für <code>lead</code> hat maximal 2 zeilen (die aktuelle und die nächste)</li> <li><strong> nodename: stream aggregate, nodeid: 2, columnname: expr1003 </strong> <code>last\_value([expr1002])</code> für <code>lead(cume\_weight)</code></li> </ul> Du gibst auf. Schade. Und ob Du nur Deine Meinung sagst oder dich zu unrecht auflehnst, kann ich auch nicht beurteilen. Ich habe aber einen Rat für Dich, den ich oft in solchen Fällen gebe:


Besorge Dir einen Collegeblock. Schreib in jeder Unterrichtsstunde Stichworte auf, was der jeweilige Lehrer von sich gibt. Mach zu Hause ganze Sätze daraus und lerne diese auswendig. Wenn Du zu einem Stichwort keinen Satz bilden kannst, mach Dir eine Notiz und frag in der nächsten Stunde nach! Melde Dich mindestens 10 Mal in jeder Stunde und führ Strichliste! Du wirst nicht jedes Mal drangenommen werden, aber jeder Lehrer sieht Deine Hand. Und das zählt als mündliche Note! Wenn Du drangenommen wirst, musst Du natürlich auch was gutes sagen oder fragen. Richtig sein muss es nicht immer. Du wirst sehen, wie schnell sich Deine Noten verbessern! <p>ich denke, dies wirft weitere fragen und potenzielle probleme auf:</p><ol> <li>ist es wirklich notwendig, zwei getrennte arten von feldern für diese arten von zahlen zu haben? die tatsache, dass sie probleme haben, sie richtig zu kennzeichnen, bedeutet, dass dies wahrscheinlich zu einer schlechten benutzererfahrung führt.</li> <li>was ist, wenn der benutzer der meinung ist, dass die antwort eine dezimalstelle enthält, aber nur eine ganze zahl eingeben darf? sollten sie auf- oder abrunden?</li> <li>gibt es eine möglichkeit, sie nur mit einem nummernfeld zu versehen und den rest programmgesteuert zu erledigen? vielleicht dezimalstellen runden oder entfernen?</li> </ol><p>wenn sie sie nicht zu einem feldtyp kombinieren können, können sie sie auf jedem etikett explizit angeben:</p><ul> <li>geben sie eine zahl ein (dezimalstellen erlaubt)</li> <li>geben sie eine zahl ein (keine dezimalstellen)</li> </ul> Hi ich studiere Sport auf Lehramt und in der Uni haben wir Promi-Laufen als Aufwärmspiel für eine Ausdauerstunde gespielt.
- Schüler in 3er gruppen einteilen
- Jeder Schüler bekommt mit tesafilm einen Zettel mit einem Promi Namen drauf auf den Rücken geklebt (darf nicht vorher gesehen werden)
- die 3er Gruppen laufen hintereinander durch die Halle der erste versucht durch fragen den Promi zu erraten, der auf seinem Rücken steht
- die fragen dürfen nur mit ja oder nein beantwortet werden
- errät der erste seinen promi wird gewechselt und der nächste lauft vor


Das Spiel ist sehr gut zum Aufwärmen geeignet weil man eigentlich gar nicht merkt, dass man läuft, da man sich auf das Fragen und Erraten konzentriert. Du solltest noch ein paar extra Promizettel bereithalten damit du denen die extrem schnell fertig werden eine neue Aufgabe geben kannst. Wie lange das Ganze geht kommt drauf an wie schnell die Promis erraten werden oder wie lange du es möchtest (kannst ja denen die fertig sind neue Zettel geben). Das Spiel kann auch mit Älteren gespielt werden hatten in der Uni alle ziemlich viel Spaß dabei. *Hallo Jessi,*

vielleicht hilft das ein wenig:
  

  
1949 - 2013 (in den Wahlperioden)
  

  
<https://de.statista.com/statistik/daten/studie/155525/umfrage/anzahl-der-gesetzesbeschluesse-auf-initiative-von-bundestag-bundesrat-und-bundesregierung/>
  

  
So einfach scheint das nicht zu sein:
  

  
<https://www.klartext-jura.de/2016/07/08/wie-viele-deutsche-gesetze-gibt-es/>
  

  
<https://fragdenstaat.de/anfrage/anzahl-der-gesetze-2010-2019/#nachricht-481264>
  


<https://www.juraforum.de/gesetze/>
  


*Gruß Wolfgang* Bin upset, wie du!   

  

Anders kann ich es hier . . . Community-kompatibel . . . nicht beschreiben.   

  

Kommt ja noch das „Sahnehäubchen“ obendrauf:   

An Schulen soll die Abgabe n i c h t geleistet werden müssen!!!   

  

Schlage vor, eine Bewegung à la: „Geh-ma in Kita“   

  

. . . zu gründen . . . und s i n g e n d dem Unsinn sofort einen Riegel vorzuschieben.   

  

Welches Lied da wirken könnte . . . mhhh:   

  

„Ein Loch ist im Eimer“ . . . oder:   

  

„What shall we do with the drunken sailor“?   

  

Mehr weiß ich momentan leider auch nicht.   

  

Werd sofort dabei sein, eine Bewegung aktiv zu unterstützen,   

um so einen Quatsch in den Ordner   

  

„Vergeblich versucht“   

  

zu verbannen.   

  

In diesem Fall bin ich optimistisch: Das Problem schaffen wir aus der Welt . . .   

  

. . . und die Menschen, die sowas verdenken . . . dürften sich ihres Jobs   

nicht mehr lange sicher sein!   

  

P.S.: Hab ich grad beim Stöbern in einer FAZ-Glosse gefunden:   

  

„Eine Kindertagesstättenliedgut-   

verwertungsschutzverordnung ist überfällig" . . . *lach*   

  

[http://www.faz.net/s/Rub5A6DAB001EA2420B...](http://www.faz.net/s/Rub5A6DAB001EA2420BAC082C25414D2760/Doc~EEFE7B643269F4B80AF21B2EA35A56536~ATpl~Ecommon~Scontent.html)   

  

PPS:   

  

Rechnung nicht begleichen . . . Mahnungen abwarten . . . evtl. bis zur Androhung, dass ein Gerichtsvollzieher auftaucht.   

  

Nochmal Nachtrag mit etwas mehr Hintergrund:   

  

[http://www.focus.de/finanzen/news/gebueh...](http://www.focus.de/finanzen/news/gebuehren-gema-weist-verantwortung-von-sich_aid_585493.html) Am besten einen Vergleich machen. <h2>moderne html5-techniken zum ändern von klassen</h2><p>moderne browser haben <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist"><strong>classlist</strong></a> hinzugefügt, das methoden zur verfügung stellt, mit denen klassen leichter ohne bibliotheken bearbeitet werden können:</p><pre><code>document.getelementbyid("myelement").classlist.add('myclass'); document.getelementbyid("myelement").classlist.remove('myclass'); if ( document.getelementbyid("myelement").classlist.contains('myclass') ) document.getelementbyid("myelement").classlist.toggle('myclass'); </code></pre><p>leider funktionieren diese in internet explorer vor version 10 nicht, obwohl es ein <a href="http://en.wikipedia.org/wiki/shim\_(computing)">shim</a> gibt, um die unterstützung für ie8 und ie9 hinzuzufügen, die unter <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist">diese seite</a> verfügbar ist. es wird jedoch immer mehr <a href="http://caniuse.com/#feat=classlist">unterstützt</a> .</p><h2>einfache browserübergreifende lösung</h2><p>die standard-javascript-methode zur auswahl eines elements ist <a href="https://developer.mozilla.org/en-us/docs/dom/document.getelementbyid"><code>document.getelementbyid("id")</code></a> . dies wird in den folgenden beispielen verwendet. sie können elemente natürlich auch auf andere weise erhalten. in der richtigen situation können sie stattdessen einfach <code>this</code> verwenden ins detail geht dies nicht in den rahmen der antwort.</p><h3>so ändern sie alle klassen für ein element:</h3><p>um alle vorhandenen klassen durch eine oder mehrere neue klassen zu ersetzen, legen sie das classname-attribut fest:</p><pre><code>document.getelementbyid("myelement").classname = "myclass"; </code></pre><p>(sie können eine durch leerzeichen getrennte liste verwenden, um mehrere klassen anzuwenden.)</p><h3>so fügen sie einem element eine zusätzliche klasse hinzu:</h3><p>um einem element eine klasse hinzuzufügen, ohne vorhandene werte zu entfernen/zu beeinflussen, fügen sie ein leerzeichen und den neuen klassennamen wie folgt hinzu:</p><pre><code>document.getelementbyid("myelement").classname += " myclass"; </code></pre><h3>so entfernen sie eine klasse aus einem element:</h3><p>um eine einzelne klasse zu einem element zu entfernen, ohne andere potenzielle klassen zu beeinflussen, ist ein einfacher regex-ersetzen erforderlich:</p><pre><code>document.getelementbyid("myelement").classname = document.getelementbyid("myelement").classname.replace ( /(?:^|\s)myclass(?!\s)/g , '' ) /* code wrapped for readability - above is all one statement */ </code></pre><p>eine erklärung dieser regex lautet wie folgt:</p><pre><code>(?:^|\s) # match the start of the string, or any single whitespace character myclass # the literal text for the classname to remove (?!\s) # negative lookahead to verify the above is the whole classname # ensures there is no non-space character following # (i.e. must be end of string or a space) </code></pre><p>das flag <code>g</code> weist das ersetzen an, nach bedarf zu wiederholen, falls der klassenname mehrmals hinzugefügt wurde.</p><h3>so prüfen sie, ob eine klasse bereits auf ein element angewendet wurde:</h3><p>der gleiche reguläre ausdruck, der oben zum entfernen einer klasse verwendet wurde, kann auch zur überprüfung verwendet werden, ob eine bestimmte klasse vorhanden ist:</p><pre><code>if ( document.getelementbyid("myelement").classname.match(/(?:^|\s)myclass(?!\s)/) ) </code></pre><p><br/></p><h3>zuweisen dieser aktionen zu onclick-ereignissen:</h3><p>es ist zwar möglich, javascript direkt in die html-ereignisattribute (z. b. <code>onclick="this.classname+=' myclass'"</code>) zu schreiben, dies wird jedoch nicht empfohlen. insbesondere bei größeren anwendungen wird durch die trennung von html-markup von javascript-interaktionslogik ein wartungsfähigerer code erzielt.</p><p>der erste schritt dazu ist das erstellen einer funktion und das aufrufen der funktion im onclick-attribut. beispiel:</p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } &lt;/script&gt; ... &lt;button onclick="changeclass()"&gt;my button&lt;/button&gt; </code></pre><p><sub><em>(es ist nicht erforderlich, dass dieser code in skript-tags enthalten ist. dies ist lediglich der kürze halber als beispiel gedacht. das einschließen von javascript in eine andere datei ist möglicherweise geeigneter.)</em></sub></p><p>der zweite schritt besteht darin, das onclick-ereignis aus dem html-code in javascript zu verschieben, beispielsweise mit <a href="https://developer.mozilla.org/en-us/docs/dom/element.addeventlistener">addeventlistener</a> </p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } window.onload = function(){ document.getelementbyid("myelement").addeventlistener( 'click', changeclass); } &lt;/script&gt; ... &lt;button id="myelement"&gt;my button&lt;/button&gt; </code></pre><p>(beachten sie, dass der window.onload-teil erforderlich ist, damit der inhalt dieser funktion <em>ausgeführt wird, nachdem der html-code</em> vollständig geladen wurde. andernfalls ist das myelement möglicherweise nicht vorhanden, wenn der javascript-code aufgerufen wird, sodass die zeile fehlschlägt .)</p><p><br/></p><h2>javascript frameworks und bibliotheken</h2><p>der obige code ist alles in standard-javascript enthalten. es ist jedoch üblich, entweder ein framework oder eine bibliothek zu verwenden, um allgemeine aufgaben zu vereinfachen und von behobenen fehlern und edge-fällen zu profitieren, an die sie beim schreiben des codes nicht denken.</p><p>während einige leute es für übertrieben halten, ein ~ 50 kb-framework für das einfache ändern einer klasse hinzuzufügen, ist die überlegung, wenn sie umfangreiche javascript-arbeiten ausführen oder etwas, das ungewöhnliches cross-browser-verhalten hat, eine überlegung wert.</p><p><em>(in groben zügen handelt es sich bei einer bibliothek um eine reihe von werkzeugen, die für eine bestimmte aufgabe entwickelt wurden, während ein framework im allgemeinen mehrere bibliotheken enthält und eine reihe von aufgaben ausführt.)</em></p><p>die obigen beispiele wurden im folgenden mit <a href="http://jquery.com">jquery</a> wiedergegeben, wahrscheinlich der am häufigsten verwendeten javascript-bibliothek (obwohl es auch andere gibt, die es zu untersuchen gilt).</p><p>(beachten sie, dass <code>$</code> hier das jquery-objekt ist.)</p><h3>klassen mit jquery ändern:</h3><pre><code>$('#myelement').addclass('myclass'); $('#myelement').removeclass('myclass'); if ( $('#myelement').hasclass('myclass') ) </code></pre><p>darüber hinaus bietet jquery eine verknüpfung zum hinzufügen einer klasse, wenn sie nicht angewendet wird, oder zum entfernen einer klasse, die folgendes ausführt:</p><pre><code>$('#myelement').toggleclass('myclass'); </code></pre><p><br/></p><h3>zuweisen einer funktion zu einem klickereignis mit jquery:</h3><pre><code>$('#myelement').click(changeclass); </code></pre><p>oder, ohne eine id zu benötigen:</p><pre><code>$(':button:contains(my button)').click(changeclass); </code></pre><p><br/></p> Entweder durch 4 Regeln, wie von GF123 beschrieben, oder als Formel über:  

"Formel zur Ermittlung der zu formatierenden Zellen verwenden" und dann als Formel, für z.B. die Zelle A1:  

=ODER($A$1="a";$A$1="d";$A$1="g";$A$1="j")  

Klappt es?