# C-Programmdarstellung & Struktur



## jago-x (18. Januar 2006)

Hallo zusammen,
Ich bin neu hier und mein Ziel ist es, C irgendwann so ziimlich gut zu beherrschen *g*. D.h natürlich, dass ich zuerst die Grundlagen lernen muss. Meine Frage bezieht sich auf die Programmdarstellung und Sturktur eines C-Programmes.
Ich habe hier ein Beispiel von mir und wäre dankbar um einige Kommentare oder was ich anders machen sollte.

Programmerklärung: Einen grossen Sinn hat das Programm nicht . Ich wollte einfach einige Sachen ausprobieren. Man muss eine Zahl erraten, die mit rand()%x zufällig generiert wird. Die generierte Zahl wird angezeigt, falls man sie nie erraten sollte .

EDIT: Leider wurde alles Linksbündig reingeschrieben...einfach nicht drauf gucken 

//***********HEADERDATEIEN********************************************************
#include <stdio.h>                                  // printf, scanf                            
#include <iostream>                               // cout, cin                           
#include <time.h>                                  // srand, rand, time                             
//***************DEKLARATION GLOBAL********************************************
using namespace std;
int zeit();
int generator(int x);
int raten_end(int y);

//***************MAIN******************************************************************
int main(int y, int x, int auswahl)
{
srand(time(NULL));                                //Initialisierung von rand
auswahl=1;                                          //Initialisierung auswahl

printf("ZEITAUSGABE & RATESPIEL MIT LOESUNG \n");
printf("**********************************************************\n\n");
 do
 {
    do
    {

      zeit();                                            //Aktuelle Zeit ausgeben
      x=generator(x);                              //Zufallszahl generieren
      y=raten_end;                             //Zahl raten

      if(y!=x)
       {
        printf("\n...::-: FALSCH GERATEN :-::...\n");   
       }
      else
      {
        printf("\n..::-: RICHTIG GERATEN :::...\n");
      }
    } 
    while(y!=x);

 printf("\n\n1 - ENDE\n2 - RATEN\n");
 scanf("%i",&auswahl);
 }
 while(auswahl==2);

return 0;
}

//***************ZUFALLSGENERATOR******************************************
int generator(int u)
{
 u=rand()%4+1;                                    //Bereich 1-5                          
 printf("Generierte Zahl: %i\n",u);            //Zufallszahl ausgeben (kontrolle)
 return u;
}
//***************ZEITFUNKTION**************************************************
int zeit()
{
 time_t Zeit;                                                                  
 tm *nun;
 Zeit = time(0);
 nun = localtime(&Zeit);


    cout << "\nZEIT: "                            // Aktuelle Zeit ausgeben                          
         << nun->tm_mday                                               
         << '.'                                   
         << nun->tm_mon+1                         
         << '.'                                   
         << nun->tm_year+1900                     
         << " - "                                 
         << nun->tm_hour
         << ':' 
         << nun->tm_min 
         << endl;  
}
//***************RATEN_END*****************************************************
int raten_end(int e)
{
printf("Raten: ");
scanf("%i",&e);
return e;  
}

Gruss 
Jago

PS: Div. Fragen, falls ihr grad zu viel Zeit für mich habt ^^.
1. könnte man die Zeitausgabe anstatt mit cout auch mit printf mache?..Habs versucht, jedoch bin ich mit dem "nun->" nicht zurecht gekommen.
2. Schreibt man Programme am besten mit printf/scanf oder cout/cin?..bin mir nicht sicher was üblich ist.


----------



## deepthroat (18. Januar 2006)

Hi.

Ich hab mir mal erlaubt deinen Code (den man so wirklich schlecht lesen konnte) in code-Tags einzuschließen.


			
				jago-x hat gesagt.:
			
		

> ```
> //***********HEADERDATEIEN********************************************************
> #include <stdio.h>                                  // printf, scanf
> #include <iostream>                               // cout, cin
> ...



Zu 1. Ja, könnte man. 
	
	
	



```
printf("%d", nun->tm_mday);
```
Zu 2. Das kommt auf die Sprache an. Du hast gesagt du möchtest C programmieren, benutzt allerdings cout usw. was darauf schließen läßt, das du eigentlich C++ benutzt. In C++ sollte man (meiner Meinung nach) ausschließlich mit den iostreams (cout, cin usw.) arbeiten und nur in Ausnahmefällen auf die C Ein-/Ausgabefunktionen zurückgreifen.

3. In C++ werden die Header der C-Standardbibliothek ohne Endung und mit dem Präfix "c" eingebunden. D.h. aus #include <stdio.h> wird #include <cstdio>

4. Was benutzt du denn für einen Compiler? Normalerweise akzeptiert ein C++ Compiler die beiden Deklarationen
	
	
	



```
int main(void) { ... }

int main(int argc, char* argv[]) { ... }
```
 der Haupteinsprungsroutine. Bist du dir sicher, das dein Compiler deine Definition 





> ```
> int main(int y, int x, int auswahl) { ... }
> ```


unterstützt? Ehrlich gesagt bezweifle ich das da was sinnvolles rauskommt. (Ach, kann es sein, das du die Parameter wieder als lokale Variable benutzt?  Das hab ich ja noch nie gesehen. Siehe Punkt 8.)

5.  Die Zeile 
	
	
	



```
u=rand()%4+1;
```
generiert keine Zufallszahl im Bereich 1-5 sondern 1 bis 4.

6. Zufallszahlen sollte man nicht mit dem %-Operator generieren. (ergibt schlechte Zufallszahlen) Siehe http://www.tutorials.de/forum/showpost.php?p=1174838&postcount=7

7. Irgendwie stimmt dein Beschreibung vom Programm nicht ganz mit dem Programm überein. Du gibst ja die Zufallszahl gleich in der generator Funktion aus - was soll man denn dann noch raten? Außerdem hat man nur eine Chance pro Durchlauf, d.h. wenn man daneben liegt wird eine neue Zahl generiert - ist das Absicht?

8. Du hast einen Parameter für die Funktion generator() (und genauso bei der raten_end Funktion) definiert - den benutzt du als lokale Variable und nicht um einen Wert zu übergeben. So mußt du immer einen Parameter beim Funktionsaufruf übergeben der überhaupt keinen Sinn macht.
	
	
	



```
int generator(void)
{
 int u; 
  ...
}
...
  x = generator();
```

Gruß


----------



## jago-x (18. Januar 2006)

Hallo deepthroat,
erstmal danke für deine sehr ausführliche Hilfe .

-->Compiler: DEV C++ Version 4.9.9.2 (Bloodshed Software)

1. ok
2. jetzt wird mir einiges klar. Da mein Compiler C++ unterstützt meckert der also nicht, wenn ich C++-Code benutze. Muss mir mal eine Liste zutun, die mir zeigt, was zu c++ und c gehört.
3. ok
4.  
Von mir: int main(int y, int x, int auswahl) { ... }
Von dir: int main(int argc, char* argv[]) { ... }
Ich weiss nicht, warum der bei meinen deklarationen von y,x und auswahl meckern sollte. Ich benutze sie nur lokal in main. Meinst du es wäre besser, wenn ich es folgendermassen schreibe?!->>
*int main(void)
{
int y,x,auswahl;
......
}* 
5.6. gut zu wissen ;-)
7. Ja, diese Unschönheit ist mir klar. Der Grund warum ich die "Zufallszahl" ausgebe ist, dass ich schauen wollte, ob der nicht immer die gleiche Reihenfolge der "Zufallszahlen" ausgibt (nur um zu testen). Natürlich sollte man mehr als eine Chancen kriegen, um die Zahl zu erraten =).
8. Ja das weiss ich. Ich wollte die Übergabe der Werte(Parameter) testen, da ich Funktionen zuvor noch nicht benutzt hatte. Ich hätte die Variable auch global deklarieren können und den Wert in der Funktion direkt hineinschreiben könne (falls du das meinst). 

Nochmals danke,

gruss jago-x


----------



## deepthroat (18. Januar 2006)

jago-x hat gesagt.:
			
		

> 2. jetzt wird mir einiges klar. Da mein Compiler C++ unterstützt meckert der also nicht, wenn ich C++-Code benutze. Muss mir mal eine Liste zutun, die mir zeigt, was zu c++ und c gehört.


Dev-C++ benutzt den C und C++ Compiler der GCC (Gnu Compiler Collection). Wenn du den Code in einer .c Datei speicherst sollte Dev-C++ auch nur den C Compiler aufrufen - dann bekommst du bei C++ Code Fehler angezeigt. Wenn du den Code in einer .cpp .c++ oder .cc Datei speicherst wird Dev-C++ den C++ Compiler aufrufen und du wirst Fehler bekommen wenn es sich um C Code handelt der nicht als C++ Code interpretiert werden kann.


			
				jago-x hat gesagt.:
			
		

> Muss mir mal eine Liste zutun, die mir zeigt, was zu c++ und c gehört.


Vielleicht solltest du dich einfach erstmal entscheiden was du überhaupt lernen willst?! C und C++ sind 2 verschiedene (obgleich ähnliche) Sprachen.


			
				jago-x hat gesagt.:
			
		

> Von mir: int main(int y, int x, int auswahl) { ... }
> Von dir: int main(int argc, char* argv[]) { ... }
> Ich weiss nicht, warum der bei meinen deklarationen von y,x und auswahl meckern sollte.


Weil die main Funktion so nicht definiert werden darf. Es sind die 2 Versionen zugelassen die ich genannt habe - nur wenn dein Compiler ausdrücklich weitere Varianten erlaubt kannst du die verwenden. (ich bin mir ziemlich sicher das der GCC keine weiteren Varianten anbietet) Die Parameter der Funktion main werden benutzt um Parameter beim Programmaufruf zu übergeben. Wenn also dein Programm "rate_mal.exe" heißt und die tippst in einer DOS-Box "rate_mal.exe 1 2 3 4 5" ein, dann werden die einzelnen Argumente an den zweiten Parameter als String-Array und die Anzahl der Argumente im ersten Parameter übergeben. D.h. argc wäre dann 6 und argv wäre { "rate_mal.exe", "1", "2", "3, "4", "5" }.



			
				jago-x hat gesagt.:
			
		

> Ich benutze sie nur lokal in main. Meinst du es wäre besser, wenn ich es folgendermassen schreibe?!->>
> 
> ```
> int main(void)
> ...


Ja. Das wäre nicht nur besser sondern auch richtig. Theoretisch könnte dein Programm durch die Benutzung des dritten Parameters sogar abstürzen weil eigentlich nur zwei 4 Byte große Werte auf den Stack gepusht werden. (/edit: jedenfalls auf Architekturen wo ein Pointer und ein int 4 Byte groß sind...)



			
				jago-x hat gesagt.:
			
		

> 8. Ja das weiss ich. Ich wollte die Übergabe der Werte(Parameter) testen, da ich Funktionen zuvor noch nicht benutzt hatte. Ich hätte die Variable auch global deklarieren können und den Wert in der Funktion direkt hineinschreiben könne (falls du das meinst).


Nein, das meine ich auf keinen Fall! Globale Variablen und Funktionen mit Seiteneffekten zu benutzen ist schlechter Programmierstil - globale Variablen solltest du auf jeden Fall vermeiden. Du solltest die Variable einfach lokal (in der Funktion) definieren und den Wert dann mit return zurückgeben. (so wie ich es schon für die generator Funktion angefangen hatte)

Gruß

PS: Benutze doch bitte die Code-Tags!


----------



## FireFlow (18. Januar 2006)

Lass das void bei den Übergabeparametern in C++ weg, das ist schlechter Stil.
Übrigens gibts in C++ auch noch die alten C-Header wie stdlib.h und math.h. 

Gruß


----------

