matheraum.de
Raum für Mathematik
Offene Informations- und Nachhilfegemeinschaft

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Dt. Schulen im Ausland: Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenC/C++Funktionen
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Geschichte • Erdkunde • Sozialwissenschaften • Politik/Wirtschaft
Forum "C/C++" - Funktionen
Funktionen < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Funktionen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 22:47 Di 04.02.2014
Autor: rollroll

Aufgabe
Welche Ausgabe liefert das Programm:
#include<stdio.h>

int a=4;

int func(int a)
{
return(--a);
}

void proc()
{
++a;
}

int main () {
proc();
proc();
func(a);
printf(''a = % i [mm] \n'',a); [/mm]

return 0;
}


Hallo,

die Lösung lautet a=6. Mir ist aber nicht klar weshalb...
Der Rückgabewert void bedeutet doch, dass die Funktion nichts zurück  gibt. Aber anscheinend tut sie das doch. Obwohl void davor steht, bewirkt die Funktion proc, dass die Variable um 1 erhöht wird. Und warum bewirkt die Funktion func(a) nicht, dass a um 1 verringert wird?

        
Bezug
Funktionen: Antwort
Status: (Antwort) fertig Status 
Datum: 23:10 Di 04.02.2014
Autor: DieAcht

Hallo,


Die Variable $a$ ist global definiert, sodass zwar nichts
zurückgegeben, aber der Wert global verändert wird. Zu deinem
zweiten Problem kannst du dir folgendes Beispiel überlegen:

1: a=2;
2: s=a++;


Hier gilt: $a=2$.

1: a=2;
2: s=++a;


Hier gilt: $a=3$.

Soweit sollte es klar sein. In deinem Fall erhältst du nach
zweifacher Anwendung von proc() $a=6$. Ab hier
siehe Antwort von Felix.


Gruß
DieAcht

Bezug
                
Bezug
Funktionen: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:44 Di 04.02.2014
Autor: felixf

Moin,

> Die Variable [mm]a[/mm] ist global definiert, sodass zwar nichts
> zurückgegeben, aber der Wert global verändert wird.

genau.

> Zu
> deinem
>  zweiten Problem kannst du dir folgendes Beispiel
> überlegen:
>  
>
1: a=2;
2: >  s=a++;


>  
> Hier gilt: [mm]a=2[/mm].
>  
>
1: a=2;
2: >  s=++a;


>  
> Hier gilt: [mm]a=3[/mm].
>  
> Soweit sollte es klar sein. In deinem Fall erhältst du
> nach
>  zweifacher Anwendung von proc() [mm]a=6[/mm].

[ok]

> Nun  wird
>  mit func(a) [mm]a[/mm] direkt um [mm]1[/mm] verringert und
>  zurückgegeben, sodass [mm]a=5[/mm] gilt.

Das stimmt nicht: a ist in func() eine lokale Kopie des Arguments (welches im Funktionsaufruf in main() gleich a ist). Somit wird diese lokale Kopie veraendert, aber nicht die globale Variable gleichen Namens. Der Rueckgabewert von func() wird in main() ignoriert, weshalb die 5 weggeworfen wird. Ausgegeben wird 6.

> Was am Ende auf deiner
>  Konsole ausgegeben wird kann ich nicht beurteilen, weil
> es
>  unvollständig kopiert ist.

Es sollte "a =  6 " dort stehen (mit zwei Leerzeichen vor der 6 und einem hinter der 6), wenn man die '' als " interpretiert.

LG Felix


Bezug
                        
Bezug
Funktionen: Danke
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:53 Di 04.02.2014
Autor: DieAcht

Hallo Felix,

Danke, dass du aufgepasst hast.

Gruß
DieAcht


Bezug
        
Bezug
Funktionen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 10:19 Mi 05.02.2014
Autor: rollroll

Hallo nochmal, danke für eure Erklärungen!!

Aber leider ist es mir noch nicht ganz klar geworden.
1. Was ganz konkret bedeutet / bewirkt denn das void vor der Funktion?
2. Dass durch die Funktion proc die globale Variable a=4 jeweils um 1 erhöht wird, ist klar. Aber ich habe immer noch nicht ganz verstanden weshalb nicht nach dem selben Schema a durch die Funktion func(a) um 1 verringert wird. Woran liegt das genau?
3. Habe ich es richtig verstanden, dass das Programm a= 4 ausgeben würde, wenn da a++ statt ++a gestanden hätte?

Bezug
                
Bezug
Funktionen: Antwort
Status: (Antwort) fertig Status 
Datum: 12:26 Mi 05.02.2014
Autor: felixf

Moin!

> Hallo nochmal, danke für eure Erklärungen!!
>  
> Aber leider ist es mir noch nicht ganz klar geworden.
> 1. Was ganz konkret bedeutet / bewirkt denn das void vor
> der Funktion?

Es sagt, dass die Funktion nichts zurueck gibt. Du kannst also nicht sowas wie
    x = proc()
schreiben, der Compiler meckert dann.

> 2. Dass durch die Funktion proc die globale Variable a=4
> jeweils um 1 erhöht wird, ist klar. Aber ich habe immer
> noch nicht ganz verstanden weshalb nicht nach dem selben
> Schema a durch die Funktion func(a) um 1 verringert wird.
> Woran liegt das genau?

Weil a in func() der Name einer lokalen Variable ist. Dies liegt daran, wie die Funktion func() definiert ist:

1: int func(int a)
2: {
3: return(--a);
4: }


Wenn du die Funktion zu

1: int func(int y)
2: {
3: return(--y);
4: }


aenderst tut sie genau das gleiche wie vorher, dafuer ist dann jetzt klarer warum die globale Variable a nicht veraendert wird: weil sie in der Funktion nicht vorkommt.

>  3. Habe ich es richtig verstanden, dass das Programm a= 4
> ausgeben würde, wenn da a++ statt ++a gestanden hätte?

Nein. Die Anweisungen (!) a++ bzw. ++a haben (fuer int-Variablen a) die gleiche Semantik: der Wert von a wird um 1 erhoeht.

Einen Unterschied bekommst du erst, wenn du den Wert von den Ausdruecken (!) a++ bzw. ++a anschaust: dieser ist bei der ersten Variante der alte Wert von a (vor dem Erhoehen), und bei der zweiten Variante der neue Wert von a (nach dem Erhoehen).

Hier ist es also voellig egal, ob du ++a oder a++ machst, der Endwert von a im Programm ist dann immer 6.

(In func() dagegen wuerde es einen Unterschied machen, aber nur wenn man den Rueckgabewert von func() auch beachten wuerde. Da er hier ignoriert wird ist der Unterschied nicht sichtbar.)

LG Felix



Bezug
                        
Bezug
Funktionen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 13:53 Do 06.02.2014
Autor: rollroll

Hallo, noch eine Frage in diesem Rahmen. Wie lautet die Ausgabe des Programms?

1 #include <stdio.h>
2
3 int a_ = 10;
4
5 int funktion(int);
6 void prozedur(void);
7
8 int main(void)
9 {
10 prozedur();
11 prozedur();
12 funktion(a_);
13 printf("a_ = [mm] %d\n", [/mm] a_);
14 return 0;
15 }
16
17 void prozedur(void)
18 {
19 a_ *= a_;
20 return;
21 }
22
23 int funktion(int d_)
24 {
25 return(--d_);
26 }
Ausgabe: a_ =

Ich denke, a müsste dann 10000 sein, oder?

Bezug
                                
Bezug
Funktionen: Antwort
Status: (Antwort) fertig Status 
Datum: 16:22 Do 06.02.2014
Autor: MathePower

Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)

Hallo rollroll,

> Hallo, noch eine Frage in diesem Rahmen. Wie lautet die
> Ausgabe des Programms?
>  
> 1 #include <stdio.h>
>  2
>  3 int a_ = 10;
> 4
>  5 int funktion(int);
>  6 void prozedur(void);
>  7
>  8 int main(void)
>  9 {
>  10 prozedur();
>  11 prozedur();
>  12 funktion(a_);
>  13 printf("a_ = [mm]%d\n",[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)

a_);

>  14 return 0;
>  15 }
>  16
>  17 void prozedur(void)
>  18 {
>  19 a_ *= a_;
>  20 return;
>  21 }
>  22
>  23 int funktion(int d_)
> 24 {
>  25 return(--d_);
>  26 }
>  Ausgabe: a_ =
>  
> Ich denke, a müsste dann 10000 sein, oder?


Ist es auch. [ok]


Gruss
MathePower

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.matheraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]