www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Vorhilfe
  Status Geisteswiss.
    Status Erdkunde
    Status Geschichte
    Status Jura
    Status Musik/Kunst
    Status Pädagogik
    Status Philosophie
    Status Politik/Wirtschaft
    Status Psychologie
    Status Religion
    Status Sozialwissenschaften
  Status Informatik
    Status Schule
    Status Hochschule
    Status Info-Training
    Status Wettbewerbe
    Status Praxis
    Status Internes IR
  Status Ingenieurwiss.
    Status Bauingenieurwesen
    Status Elektrotechnik
    Status Maschinenbau
    Status Materialwissenschaft
    Status Regelungstechnik
    Status Signaltheorie
    Status Sonstiges
    Status Technik
  Status Mathe
    Status Schulmathe
    Status Hochschulmathe
    Status Mathe-Vorkurse
    Status Mathe-Software
  Status Naturwiss.
    Status Astronomie
    Status Biologie
    Status Chemie
    Status Geowissenschaften
    Status Medizin
    Status Physik
    Status Sport
  Status Sonstiges / Diverses
  Status Sprachen
    Status Deutsch
    Status Englisch
    Status Französisch
    Status Griechisch
    Status Latein
    Status Russisch
    Status Spanisch
    Status Vorkurse
    Status Sonstiges (Sprachen)
  Status Neuerdings
  Status Internes VH
    Status Café VH
    Status Verbesserungen
    Status Benutzerbetreuung
    Status Plenum
    Status Datenbank-Forum
    Status Test-Forum
    Status Fragwürdige Inhalte
    Status VH e.V.

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:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
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.vorhilfe.de