Fakultätsberechnung finden den Fehler nicht

Nexon91

Grünschnabel
Hey Leute
Ich muss eine Fakultätsberechnung programmieren und finde meinen Fehler nicht. Der Fehlercode sagt mir leider nichts.
C++:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> 
#include <conio.h>
//................................................
//Hauptfunktion <- Einstiegspunkt 
void main()
{
//Variablendeklaration
	int n=0;
	int fak=1;
	
	while(1) // Endlosschleife 
	{
			system("cls"); //Bildschirm löschen
			printf("\n\n\tNatuerliche Zahl eingeben\n");
			printf("\t...................................................");
			printf("\n\t: ");scanf("%d",&Zahl);
			if (n>=0) // if= Falls wenn
				{
					if fak=fak*n(n-1);
			}
			printf("\n\n\tDie Fakultaet betraegt: %d ",); 
			printf("\n\n\t.............................");
			getch();//Programmhalt, weiter mit bel. Taste
		}//while(1)
	}//main

Fehlercode:
1>------ Erstellen gestartet: Projekt: uf, Konfiguration: Debug Win32 ------
1> uf.cpp
1>uf.cpp(25): error C2065: 'Zahl': nichtdeklarierter Bezeichner
1>uf.cpp(28): error C2061: Syntaxfehler: Bezeichner 'fak'
1>uf.cpp(30): error C2059: Syntaxfehler: ')'
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
 
Zuletzt bearbeitet von einem Moderator:
Hallo Nexon91

In deinem Code gibt es gar keine Zeile 30 und auf Zeile 25 kommt Zahl nicht vor. Was allerdings nicht so optimal ist ist hier:
C:
if fak=fak*n(n-1);

Warum if?

Hier:
C:
printf("\n\n\tDie Fakultaet betraegt: %d ",);

Fehlt was du ausgeben willst

Hier:
C:
printf("\n\t: ");scanf("%d",&Zahl);

Verwendest du 'Zahl', meinst aber wohl 'n'.

C:
fak*n(n-1)

Hier verwendest du n(n-1), das ist mathematisch korrekt, aber in C ist <bezeichner>(<parameter>) ein Funktionsaufruf, was du willst ist n * (n - 1).

Zum Schluss: mit Syntaxfehlern behoben hast du aber auch noch semantische Fehler. Alles was du berechnest ist n * (n - 1).

Grüsse
Cromon
 
Hallo Nexon91,
es tut mir leid dass ich dir das jetzt sagen muss, aber dein Code ist eine totale Katastrophe.
Gehen wir ihn mal Schritt für Schritt durch, dann lernst du es in Zukunft besser zu machen:

1) Für dein Vorhaben brauchst du "stdafx.h" und <conio.h> nicht includen. Man included immer nur was man wirklich braucht.

2) Das Hauptprogramm steht in main() und ist vom Typ int ! Das muss so sein, damit du nach Programmende einen ganzzahligen Wert zurückgeben kannst (der steht für den jeweiligen ERROR-Code bzw. einfach ne 0 für alles ok). Das Programm sollte immer mit einem return WERT; beendet werden.

3) Achte bitte unbedingt auf Zeilenumbrüche und Einrückungen in deinem Code; auch wenn die C-Compiler das lesen können wird es in Zukunft sehr schwer sein solchen Code gedanklich durchzugehen.

4) Was die Kommentare angeht: Gut so! Behalte das unbedingt so bei; man sollte Programmcode immer gut auskommentieren damit man selbst und andere Programmierer in Zukunft verstehen können was man sich dabei gedacht hat.

5) Dein Algorithmus ist leider komplett falsch. Wir entwickeln ihn jetzt aber zusammen:

Zuerst brauchst du das Grundgerüst für ein Konsolenprogramm:
C++:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    return 0; //beende ordnungsgemäß
}
Du möchtest gerne unbegrenzt viele Durchgänge ermöglichen, aber eine Endlosschleife ala while(1) würde niemals aufhören. Das ist Gift für dein System wenn du so etwas schreibst, weil es nicht kontrolliert beendet werden kann.
Deshalb benutzen wir eine do - while Schleife die die Eingabe prüft:
C++:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int Eingabe;
    do {
        //tue etwas
    } while(Eingabe > 1); //sobald eingegebene Zahl 'unlogisch' -> beende Schleife
    return 0; //beende ordnungsgemäß
}
Jetzt gehen wir an den eigentlichen Algorithmus. Die Fakultät einer Zahl n ist das Produkt aller natürlichen Zahlen bis n. Wir müssen also die eingegebene Zahl herausfinden und dann alle Zahlen von 2 bis zur eingegebenen Zahl multiplizieren. Da ich nicht weiß wie fortgeschritten du bist, verzichte ich hier auf rekursive Programmierung und auf Funktionen, wir werden das also innerhalb von main(...) lösen.
Das Programm sieht dann in etwa so aus:
C++:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int Eingabe;
    int Fakultaet;
    do {
        Fakultaet = 1; //setze Fakultät für neue Berechnung auf Startwert
        printf("Bitte geben Sie neuen Wert ein (0 zum Beenden): ");
        scanf("%i", &Eingabe);
        for(int i = 2; i <= Eingabe; i++) //laufe von der Zahl 2 bis zur eingegebenen Zahl
            Fakultaet *= i; //multipliziere Fakultät mit Laufvariable
        printf("Ergebnis: %i\n", Fakultaet);
    } while(Eingabe > 1); //sobald eingegebene Zahl 'unlogisch' -> beende Schleife
    printf("Programm ordentlich beendet.\n");
    return 0; //beende ordnungsgemäß
}
Ich denke die Kommentare sind selbsterklärend. Dieser Algorithmus ist natürlich langsam; außerdem muss man zum Beenden des Programms irgendetwas eingeben, was nicht gerade eine Zahl größer als 1 ist (also z.B. 0). Die Variablen sind alle vom Typ int, da die Fakultät aber schnell wächst ist bereits bei Fakultät 15 Schluss.

Das Programm lässt sich also noch vielfältig erweitern und verbessern. Sobald du meinen Programmcode verstanden hast kannste dich ja melden :D

Gruß Technipion
 
Erstmal vielen Dank für deine Antwort :)
Hab soweit alles geändert,wenn ich es richtig verstanden habe.
Das ist erst mein zweiter algorithmus mit c++, habe zu vor nur mit Struktogrammen gearbeitet.
Und kenne mich daher mit denn Befehlen (if=Bedienung) nicht so aus. Was wäre denn zu empfelen in diesem fall ? (for ? wobei ich nicht weis für was es genau steht)
C++:
//Variablendeklaration
	int n=0;
	int fak=1;
	
	while(1) // Endloschleife 
	{
			system("cls"); //Bildschirm löschen
			printf("\n\n\tNatuerliche Zahl eingeben\n");
			printf("\t.....................................");
			printf("\n\t:n ");scanf("%d",&n);
Zeile26			for (n>=0)
				{
					if fak=fak*n*(n-1);
			}
			printf("\n\n\tDie Fakultaet betraegt: %d ",fak); 
			printf("\n\n\t............................."); 

1>uf.cpp(26): warning C4552: '>=': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
1>uf.cpp(26): error C2143: Syntaxfehler: Es fehlt ';' vor ')'
1>uf.cpp(26): error C2143: Syntaxfehler: Es fehlt ';' vor ')'
1>uf.cpp(28): error C2061: Syntaxfehler: Bezeichner 'fak'
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
So warum soll bei Zeile 26 ein ";" fehlen, habe eines dahinter gemacht aber geändert hat sich nichts.
Zeile 28 Was ist dan dem Bezeicher fak falsch ? Müsste ich dort Fakultaet schreiben ?
Zuletzt denn Semantikfeher wo sie erwähnen, welcher Aufbau wenn ich das richtig verstehe soll falsch sein ?

Vielen Dank auch Technipion werde erstmal schlafen gehen und mir das morgen erstmal genauer ansehen :)
 
Zuletzt bearbeitet von einem Moderator:
2) Das Hauptprogramm steht in main() und ist vom Typ int ! Das muss so sein, damit du nach Programmende einen ganzzahligen Wert zurückgeben kannst (der steht für den jeweiligen ERROR-Code bzw. einfach ne 0 für alles ok). Das Programm sollte immer mit einem return WERT; beendet werden.

Hallo Technipion

FYI: Der C-Standard sieht vor: Irgendwas main(irgendwas). Die einzige Vorschrift ist, dass die Funktion main heissen muss sowie Bedingungen 'falls', im Sinne von:
Falls ein Argument argc existiert soll es die Anzahl Kommandozeilenargs sein
Falls ein Argument argv existiert beinhält das die Kommandozeilenargs
argv[argc] muss nullptr sein
argv[0] bis argv[argc - 1] müssen auf strings zeigen
argv[0] falls vorhanden muss Programmname sein oder argv[0][0] muss 0 sein, wenn der nicht verfügbar ist
argc, argv und alle Inhalte von argv sollen alle änderbar sein.
Wenn der Rückgabetyp kompatibel mit int ist wird bei } automatisch 0 zurückgegeben und der Rückgabewert ist das gleiche wie der Parameter bei exit. Falls nicht kompatibel mit int ist es nicht weiter definiert, was die Rückgabe ist, aber dennoch erlaubt.

Wie gesagt, FYI.

In C++ hast du recht, da gelten mehr oder weniger die gleichen Anforderungen aber 'int main(irgendwas)'. Zudem gibt es Ausnahmen in denen main nicht existieren muss, nachzulesen bei:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf Abschnitt: 3.6.1

@Nexon91:
Wenn du in C++ programmierst solltest du auch die C++-STL verwenden (std::cin, std::cout)

Des weiteren:
C:
if fak=fak*n*(n-1);

Was soll das if da?

C:
for (n>=0)

Die Struktur von for ist folgendermassen: for (start; abbruchbedingung; iteration). Also zum Beispiel: for( ; n >= 0; --n)

Viele Grüsse
Cromon
 
Zurück