Hilfe zu der C-Syntax

Alles Wissenswerte über Skripte, Browser, Makros, PhP, HTML...

Moderatoren: Moderatoren, Redakteure

Benutzeravatar
Mr.Chips
Beiträge: 4936
Registriert: 02.09.2007 12:18
Persönliche Nachricht:

Hilfe zu der C-Syntax

Beitrag von Mr.Chips »

Heute haben wir die Grundlagen der C-Syntax durchgenommen, hab es aber nicht wirklich kapiert.
Zu allem Überfluss haben wir auch noch eine Hausaufgabe aufbekommen, wo wir a, b, und c ausrechnen sollen:

a= 5;
b= 10;
c= 15;
b- = c++;
a* = b;
c+ = --b;
a% = 5;
b- = a++ + --c;
c- = 6;
a= (a+ --b) * (3+ c++);

könnt ihr mir dabei helfen und evtl noch die ein oder andere erklärung geben? (besonders die Inkrement und Dekrement- Operatoren mögen mich nich so)
Benutzeravatar
Levi 
Beiträge: 44988
Registriert: 18.03.2009 15:38
Persönliche Nachricht:

Re: Hilfe zu der C-Syntax

Beitrag von Levi  »

Mr.Chips hat geschrieben:Heute haben wir die Grundlagen der C-Syntax durchgenommen, hab es aber nicht wirklich kapiert.
Zu allem Überfluss haben wir auch noch eine Hausaufgabe aufbekommen, wo wir a, b, und c ausrechnen sollen:

a= 5;
b= 10;
c= 15;
b- = c++;
a* = b;
c+ = --b;
a% = 5;
b- = a++ + --c;
c- = 6;
a= (a+ --b) * (3+ c++);

könnt ihr mir dabei helfen und evtl noch die ein oder andere erklärung geben? (besonders die Inkrement und Dekrement- Operatoren mögen mich nich so)
einmal bitte: WTF! ... sone syntax benutzt man nur, wenn man seine mitarbeiter ärgern will Oo ...
vor allem sind mir diese notationen:
b-
A*
c+
a%
komplett fremd Oo ...
--a <-- a -1 ... und dann verwenden
a++ <--- a verwenden, und danach +1 rechnen ...
a% ... könnte modulo sein ... aber ergibt auf der linken seite, irgendwie keinen sinn oO?


oder moment ...
kann es sein, dass es eigentlich:
b -= c++;
a *= b;
c += --b;
a %= 5;

heißen müsste?
Benutzeravatar
Mr.Chips
Beiträge: 4936
Registriert: 02.09.2007 12:18
Persönliche Nachricht:

Re: Hilfe zu der C-Syntax

Beitrag von Mr.Chips »

-Levi- hat geschrieben:
Mr.Chips hat geschrieben:Heute haben wir die Grundlagen der C-Syntax durchgenommen, hab es aber nicht wirklich kapiert.
Zu allem Überfluss haben wir auch noch eine Hausaufgabe aufbekommen, wo wir a, b, und c ausrechnen sollen:

a= 5;
b= 10;
c= 15;
b- = c++;
a* = b;
c+ = --b;
a% = 5;
b- = a++ + --c;
c- = 6;
a= (a+ --b) * (3+ c++);

könnt ihr mir dabei helfen und evtl noch die ein oder andere erklärung geben? (besonders die Inkrement und Dekrement- Operatoren mögen mich nich so)
einmal bitte: WTF! ... sone syntax benutzt man nur, wenn man seine mitarbeiter ärgern will Oo ...
vor allem sind mir diese notationen:
b-
A*
c+
a%
komplett fremd Oo ...
--a <-- a -1 ... und dann verwenden
a++ <--- a verwenden, und danach +1 rechnen ...
a% ... könnte modulo sein ... aber ergibt auf der linken seite, irgendwie keinen sinn oO?

wenn ich jetzt deine erklärung mit der von meiner lehrerin vermische, macht es irgendwie sinn :) langsam scheine ich es zu verstehen

ja, a% soll modulo sein :D
oder moment ...
kann es sein, dass es eigentlich:
b -= c++;
a *= b;
c += --b;
a %= 5;
heißen müsste?
müsste^^
aber ich hab das so von der tafel abgeschrieben, da hab ich nicht auf die leerzeichen geachtet


übrigens hab ich es einfach mal versucht: am ende kommt für:

a= -56
b= -14 und für
c= 4 raus

denk aber nich dass das richtig is... :?
Benutzeravatar
Levi 
Beiträge: 44988
Registriert: 18.03.2009 15:38
Persönliche Nachricht:

Re: Hilfe zu der C-Syntax

Beitrag von Levi  »

a= 5;
b= 10;
c= 15;
b -= c++; ... b=b-c ... macht = b=-5 c+1 -> c=16
a *= b; a= a*b ...macht -> a=-25
c += --b; .. b-1 -> b=-6 ... c=c+b ... 16-6 -> c=10
a %= 5; a= a%5 ... -25/5=5 rest 0 ... -> a=0
b -= a++ + --c; .... c=c-1 c-> 9 ... a+c = 9 ... b = b-9 -> b= -15 ... a=a+1 ... -> a=1
c -= 6; c = c-6 ... c -> 3


a=1
b=-15
c=3

a = (a+ --b) * (3+ c++);
--b --> b=-16

a-16 -> -15
a=-15*(3+3)
a=-135
c++
c=4 ...


also irgendwo hab entweder ich mich, oder du dich verrechnet :D

PS: lehrer haben meine "randnotizen" gehasst :D ...
PPS: am besten, man tippt es einfach in c ein ... und denk an die falschen leerzeichen ;)
Benutzeravatar
Scorcher24_
Beiträge: 15527
Registriert: 11.11.2004 14:31
Persönliche Nachricht:

Beitrag von Scorcher24_ »

Jetzt weiss ich wieder warum C lange Zeit als unwartbarer Code galt :D
Behold the beauty of C++:

Code: Alles auswählen

void NLApplication::run()
{
    m_window = new NLWindow(NLWindowSettings());
    m_window->connectSignal(NLBindKeySlot(NLApplication, onKey));
    m_window->connectSignal(NLBindRenderSlot(NLApplication, onRender));
    m_window->connectSignal(NLBindQuitSlot(NLApplication, onQuit));
    m_window->connectSignal(NLBindMouseSlot(NLApplication, onMouseMove));
    m_quad = NLQuad(NLVector2f(250,200), NLVector2f(100, 100),
                    NLVector2f(125,100), NULL);
    m_quad2 = m_quad;
    m_quad2.move(200,200);
    m_quad2.setZOrder(-0.2f);

    NLColor4f bgcolor(0.0f, 0.0f, 0.8f, 1.0f);
    m_window->setClearColor(bgcolor);

    m_handle = m_texLoader.loadTexture("./data/textures/layingrock.tga");

    if ( m_handle )
    {
        m_log->printToLog(LL_MESSAGE, "Texture sucessfully loaded.");
    }

    m_handle->attachTexture();
    m_window->enterLoop();
}
Hatte ich grad im Zwischenspeicher... :P Und sorry für OT.
rya.
omg-its-style
Beiträge: 918
Registriert: 10.07.2004 18:20
Persönliche Nachricht:

Beitrag von omg-its-style »

die obige aufgabe ist absichtlich komplex gehalten, damit die grundprinzipien geprüft werden können, das hat nichts mit c-syntax vs. c++ syntax zu tun, derartigen code kannst du in jeder sprache produzieren.
Aron_dc
Beiträge: 238
Registriert: 02.12.2008 11:10
Persönliche Nachricht:

Re: Hilfe zu der C-Syntax

Beitrag von Aron_dc »

Je nachdem wo das ++ oder das -- steht wird die Operation zuerst oder erst am Ende der Anweisung auf die Variable an der das ++ oder -- steht ausgeführt.

+= -= *= /= %= heisst, dass die Variable vor dem Operator die Operation vor dem = mit dem Ergebnis hinter dem Operator ausführt

a+=b --> a=a+b
a+=b+12 --> a+(b+12)
Mr.Chips hat geschrieben: a= 5;
b= 10;
c= 15;
b- = c++;
a* = b;
c+ = --b;
a% = 5;
b- = a++ + --c;
c- = 6;
a= (a+ --b) * (3+ c++);
So ich versuch mich auch mal dran (mache die neuen Werte der Variablen immer fett)

a=5 b=10 c=15
b -= c++ -> b=b-c = b=-5 (10-15) sowie danach c=16 (15+1)
a *= b -> a=a*b = a=-25 (5*-5)
c += --b --> b=-6 (-5-1) c=10
a %= 5 --> a=0 (Rest von -25 / 5)
b -= a++ + --c --> c=9 (10-1) b=-15 -5-(0+10) a=1 (0+1)
c -= 6 --> c=3 (9-6)
a = (a+ --b) * (3+ c++) --> b=-16 (15-1) a=-90 ((1 + -16)*(3 + 3)) c=4 (3+1)

Am Ende hast du dann:
a = -90
b = -16
c = 4

Habs mal unter Windows im gcc (MinGW) compiliert (mit korrigierten Zuweisungen)
Code:

Code: Alles auswählen

#include <stdio.h>
int main() {
	int a = 5;
	int b = 10;
	int c = 15;
	b -= c++;
	a *= b;
	c += --b;
	a %= 5;
	b -= a++ + --c;
	c -= 6;
	a = (a+ --b) * (3+ c++);
	printf("a = %d\n",a);
	printf("b = %d\n",b);
	printf("c = %d\n",c);

	return 0;
}

und bekomme auch
a = -90
b = -16
c = 4

Mit Ausgabe der Zwischenergebnisse siehts so aus

// Anfangswerte
a = 5
b = 10
c = 15

b -= c++
a = 5
b = -5
c = 16

a *= b
a = -25
b = -5
c = 16

c += --b
a = -25
b = -6
c = 10

a %= 5a = 0
b = -6
c = 10

b -= a++ + --c
a = 1
b = -15
c = 9

c -= 6
a = 1
b = -15
c = 3

a = (a+ --b) * (3+ c++)
a = -90
b = -16
c = 4

Edit: Nen rechenfehler von mir entdeckt. Jetzt deckt sich auch mein Kopfrechenergebnis mit dem Compilerergebnis.
@-levi-: Du hast den gleichen Rechenfehler -15*(3+3) ist -90 und nicht -135. Du hast im Kopf wahrscheinlich wie ich 3*3 gerechnet und das dann mal -15 genommen ^^.
Sylarx
Beiträge: 489
Registriert: 29.06.2009 10:16
Persönliche Nachricht:

Beitrag von Sylarx »

das geht noch viel lustiger wenn man sowas mit Assembler machen muss :P
und ich meine oldschool nich mim C-Compiler und ner schicken Entwicklungsumgebung

Deine Lehrerin übrigens sollte sich vielleicht doch mal Übungsaufgaben ausdenken die ansatzweise ne sinnvolle Anwendung haben, mMn das ganze am besten gleich in objektorientierter Kombination(das hilft immens beim Verstehen)
anstatt Übungsaufgaben aus irgendner schlechten Schul Literatur abzuschreiben, Programmieren lernen kann sehr viel Spass machen wenn man mit sinnvollen Übungen eingeführt wird.
Vielleicht auch mal mit Java beginnen , da ises auch gleich leichter sich mit Oberflächen auseinanderzusetzen , was widerum Spass fördernder ist wenn man Basics behandelt, da man nicht auf ner Konsole sondern in nem Fenster Ausgaben macht, die zusätzliche Code Menge ist relativ gering und man lernt nebenbei noch ein bisschen was über Fenster Komponenten.

C++ empfehl ich ohnehin nich als Einsteiger Sprache , freu dich schon mal auf Pointer :p

gut in dem beispiel hier gehts wohl um den Umgang mit Operatoren
allerdings wundert mich das man so ne Übungsaufgabe gibt wo ein Anfänger ziemlich überfordert sein dürfte wenns zum Part des Verstehens kommt , sowas ist eher Folgestunde um das Verstandene zu vertiefen

http://www.a-sichau.de

die Seite meines alten Informatik Lehrers

@Levi , meine Lehrer haben noch wesentlich mehr gehasst als meine Randnotizen :p
Benutzeravatar
Levi 
Beiträge: 44988
Registriert: 18.03.2009 15:38
Persönliche Nachricht:

Re: Hilfe zu der C-Syntax

Beitrag von Levi  »

Aron_dc hat geschrieben: @-levi-: Du hast den gleichen Rechenfehler -15*(3+3) ist -90 und nicht -135. Du hast im Kopf wahrscheinlich wie ich 3*3 gerechnet und das dann mal -15 genommen ^^.
:wink: ... manch mal sinds die einfachsten sachen, an denen man scheitert :D ... aber jep, das war wohl mein fehler X)

verdammt ... da sieht man mal, wo einen kopfrechnung hinbringt :D
Aron_dc
Beiträge: 238
Registriert: 02.12.2008 11:10
Persönliche Nachricht:

Beitrag von Aron_dc »

Naja bin der Meinung, dass man Leute die Programmiersprachen lernen wollen immer nur in sinnvollen Häppchen lehren sollte. Zum verständnis der Operatoren, ist die Aufgabe da oben völlig in Ordnung. Vielleicht etwas sehr komplex, aber wenn man das durch hat, hat mans denke ich auch verstanden.

Auf welcher Sprache man Programmieren lernt ist ihmo völlig wurscht, solangs nur (erstmal) ne Hochsprache ist (einfach der besseren verständlichkeit wegen), denn im Endeffekt sind die grundlegenden Elemente und ihre Anwendungen bei vielen Sprachen (nahezu) identisch.
Benutzeravatar
Mr.Chips
Beiträge: 4936
Registriert: 02.09.2007 12:18
Persönliche Nachricht:

Beitrag von Mr.Chips »

mit prgrammieren komm ich gar nicht mehr klar...
jetzt haben wir mit if und else angefangen und ich raff gaar nix mehr
zum beispiel diese aufgabe:

Es ist ein programm zu erstellen, mit dem man den Bruttoarbeitslohn für einen mitarbeiter berechnen kann. für diese berechnung des bruttolohnes bei überstunden gilt folgende Regelung: Solange die überstunden bis zu 10% der monatlichen sollstunden betragen, wird dem mitarbeiter für jede überstunde ein überstundenzuschlag von 25% seines stundenlohnes zusätzlich vergütet. übersteigen die überstunden die 10% grenze, so soll dem Mitarbeiter für jede überstunde ein zuschlag von 30% gezahlt werden. einzugebene daten sind die monatssollstunden, die Iststunden und der Stundenlohn

ich hatte zwar ein paar gute ansätze bei der aufgabe aber irgendwann haben die mich auch nich mehr weitergebracht -.-
Benutzeravatar
Scorcher24_
Beiträge: 15527
Registriert: 11.11.2004 14:31
Persönliche Nachricht:

Beitrag von Scorcher24_ »

Mr.Chips hat geschrieben:mit prgrammieren komm ich gar nicht mehr klar...
jetzt haben wir mit if und else angefangen und ich raff gaar nix mehr
zum beispiel diese aufgabe:

Es ist ein programm zu erstellen, mit dem man den Bruttoarbeitslohn für einen mitarbeiter berechnen kann. für diese berechnung des bruttolohnes bei überstunden gilt folgende Regelung: Solange die überstunden bis zu 10% der monatlichen sollstunden betragen, wird dem mitarbeiter für jede überstunde ein überstundenzuschlag von 25% seines stundenlohnes zusätzlich vergütet. übersteigen die überstunden die 10% grenze, so soll dem Mitarbeiter für jede überstunde ein zuschlag von 30% gezahlt werden. einzugebene daten sind die monatssollstunden, die Iststunden und der Stundenlohn

ich hatte zwar ein paar gute ansätze bei der aufgabe aber irgendwann haben die mich auch nich mehr weitergebracht -.-
Was ist an if...else schwer?

Code: Alles auswählen

if ( a == b  )
{
}
Übersetzt: Wenn a gleich b ist, dann wird das gemacht, was in den Klammern steht.
In deinem Fall also:

Code: Alles auswählen

// Berechnet die Überstunden in prozent, parameter stunden sind die stunden die geleistet wurden
unsigned int getUeberstunden(const unsigned int sollstunden, const unsigned int stunden)
{
     if ( stunden > sollstunden )
    {
          int prozent = ((stunden*100) / sollstunden) - 100;
          return prozent;
    }
    return 0;   
}

// Berechnet den Zuschlag auf basis der überstunden und des stundenlohnes
float berechneZuschlag(const unsigned int percent, const unsigned int stundenlohn)
{
    if ( percent >= 10 )
    {
         return(float) (( stundenlohn / 100.0f ) * 25.0f);
    }
    else if ( percent >= 25 ) 
    {
         return (float)((stundenlohn / 100.0f ) * 30.0f);
    }
}
Und so muss man beim programmieren vorgehen:
Das eigentliche Problem in viele kleine aufteilen und diese Probleme nach und nach lösen. Mehr werde ich Dir nicht schreiben, eigentlich ist damit deine Aufgabe bereits gelöst, aber ein lauffähiges Programm musst Du selbst draus machen. Ich habs jetzt nicht kompiliert, der Code ist hier fix zusammengehackt, aber er sollte funktionieren.
rya.
Aron_dc
Beiträge: 238
Registriert: 02.12.2008 11:10
Persönliche Nachricht:

Beitrag von Aron_dc »

Ich werde dir auch kein Programm schreiben, da ich denke, dass man am besten lernt, wenn man die Werkzeuge bekommt und damit rumprobiert.

Das Wichtige ist, dass du die von Scorcher24 genannte Methodik zum Zerlegen der Probleme beherrschst und lernst, was du mit den Werkzeugen die dir zur Verfügung stehen eigentlich tun kannst.

Mit Werkzeugen meine ich in deinem Fall die verschiedenen Befehle, Schleifen, Verzweigungen.

Ein if funktioniert im Grundlegenden folgendermaßen:

Code: Alles auswählen

if(Bedingung)
{
   ... Befehle
}
else
{
   ... Befehle
}
Der else { ... } Teil ist dabei optional.

Eine Bedingung kann dabei verschiedene Formen haben. In C wird meines Wissens nach alles was nicht den Wert 0 hat als wahr angenommen.

gültige Bedingungen sind also zum Beispiel:
  • 5 - ist eine Zahl, Zahlen werden als wahr gewertet wenn sie != 0 sind
  • Variablen - Dabei wird geguckt, was in der Variable gespeichert ist. Ist der Wert der Variablen != 0 ist die Bedingung erfüllt
  • Vergleiche wie z.b. Variable1==Variable2 oder Variable1>Variable2 - diese sind dann wahr, wenn eben der vergleich stimmt
(Achtung das ist keine vollständige Aufzählung von Bedingungen, man kann noch wesentlich mehr angeben, als grober Überblick für einen Neuling reicht das aber)

Wenn du nun also deine if(Bedingung) hast, wird das was in den ersten geschweiften Klammern steht ausgeführt, wenn die Bedingung vom if einen wahren Wert hat.
Wenn du einen else Teil an die "}" schreibst wird dieser ausgeführt, wenn die Bedingung eben nicht zutrifft.

So kannst du bestimmte Programmteile nur ausführen lassen, wenn bestimmte Bedinungen gegeben sind.

[Achtung: Ich plädiere hier nicht auf 100%ige Richtigkeit, wenn ich etwas falsch erzählt habe, korrigiert mich einfach]
Benutzeravatar
Levi 
Beiträge: 44988
Registriert: 18.03.2009 15:38
Persönliche Nachricht:

Beitrag von Levi  »

Aron_dc hat geschrieben: gültige Bedingungen sind also zum Beispiel:
  • 5 - ist eine Zahl, Zahlen werden als wahr gewertet wenn sie != 0 sind
  • Variablen - Dabei wird geguckt, was in der Variable gespeichert ist. Ist der Wert der Variablen != 0 ist die Bedingung erfüllt
  • Vergleiche wie z.b. Variable1==Variable2 oder Variable1>Variable2 - diese sind dann wahr, wenn eben der vergleich stimmt

[....]
[Achtung: Ich plädiere hier nicht auf 100%ige Richtigkeit, wenn ich etwas falsch erzählt habe, korrigiert mich einfach]


gerade deswegen möchte ich mal einschreiten:

bis auf ausnahmen (boolsche Variablen) .. sollte man aufgrund der Verständlichkeit darauf verzichten, ohne Vergleiche zu arbeiten!

also immer schon mit == <= >= != ... arbeiten! ...
(nicht jede Sprache verhält sich bei anderen Datentypen als bool gleich.)
Benutzeravatar
Scorcher24_
Beiträge: 15527
Registriert: 11.11.2004 14:31
Persönliche Nachricht:

Beitrag von Scorcher24_ »

-Levi- hat geschrieben:
Aron_dc hat geschrieben: gültige Bedingungen sind also zum Beispiel:
  • 5 - ist eine Zahl, Zahlen werden als wahr gewertet wenn sie != 0 sind
  • Variablen - Dabei wird geguckt, was in der Variable gespeichert ist. Ist der Wert der Variablen != 0 ist die Bedingung erfüllt
  • Vergleiche wie z.b. Variable1==Variable2 oder Variable1>Variable2 - diese sind dann wahr, wenn eben der vergleich stimmt

[....]
[Achtung: Ich plädiere hier nicht auf 100%ige Richtigkeit, wenn ich etwas falsch erzählt habe, korrigiert mich einfach]


gerade deswegen möchte ich mal einschreiten:

bis auf ausnahmen (boolsche Variablen) .. sollte man aufgrund der Verständlichkeit darauf verzichten, ohne Vergleiche zu arbeiten!

also immer schon mit == <= >= != ... arbeiten! ...
(nicht jede Sprache verhält sich bei anderen Datentypen als bool gleich.)


Genaugenommen kennt C-98 kein bool. Diesen Datentyp gibt es nur in C++.
BOOL ist in C nur:

Code: Alles auswählen

typedef unsigned int BOOL;
#define TRUE 1
#define FALSE 0
// oder auch gerne genommen:
enum BOOL
{
    FALSE = 0,
    TRUE,
};
Erst mit C-99 wurde mit stdbool.h ein BOOL-Typ eingeführt.
Aber ich möchte deine Aussage unterstreichen: Immer mit den Operatoren arbeiten. Denn spätestens in C++ kann die Abfrage ob ein Zeiger NULL ist ohne "== NULL" dazu führen, dass es Zugriffsfehler gibt, wenn diese Klasse den operator bool() definiert.
rya.