C Fehler im Quelltext ~ Programm bricht ab.

Eddie0150

Cadet 2nd Year
Registriert
Feb. 2014
Beiträge
29
Hey Leute, ich bin wieder gut vorran gekommen und soll nun ein Programm schreiben, das die Stimmen für 3 Parteien Ausliest und die dadurch erlangen Sitze wiedergibt. Der Harken an der sache ist, das ich hier nur nur vorgegeben bekommen habe und momentan nicht durchsehe was mir fehlt damit er die Sitze ausspuckt. Programm bricht ab sobald ich die 4 Variablen angegeben habe.

Code:
#include <stdio.h>
#include <stdlib.h>

void main(){
	
	int StimmenA, StimmenB, StimmenC;
	int sitze;
	int SitzeA, SitzeB, SitzeC;
	int teilerA, teilerB, teilerC;
	int QuotientA, QuotientB, QuotientC;
	int max;
	
	printf("Geben sie die Stimmen fuer Partei A ein: ");
	scanf("%d", &StimmenA);
	printf("Geben sie die Stimmen fuer Partei B ein: ");
	scanf("%d", &StimmenB);
	printf("Geben sie die Stimmen fuer Partei C ein: ");
	scanf("%d", &StimmenC);
	printf("Wie viele Sitze gibt es Ingesamt: ");
	scanf("%d", &sitze);
	
	
	printf("Sitzverteilung: \n");
	printf("Partei A   |   Partei B   |   Partei C\n");
	printf("-----------+--------------+------------\n");
	
	
	for( ; sitze; sitze = sitze-1)
	{
		if (QuotientA > QuotientB)
		{
			if (QuotientA > QuotientC)
			max = 1;
			
			else 
			max = 3;
			
		}
		else 
		{
			if (QuotientB > QuotientC)
			max = 2;
			else 
			max = 3;
			
		}
		if (max == 1)
		{
			SitzeA = SitzeA+1;
			QuotientA = StimmenA / teilerA;
			teilerA = teilerA +1;
						
		}
		if (max == 2)
		{
			SitzeB = SitzeB+1;
			QuotientB = StimmenB / teilerB;
			teilerB = teilerB +1;
						
		}
		if (max == 3)
		{
			{
			SitzeC = SitzeC+1;
			QuotientC = StimmenC / teilerC;
			teilerC = teilerC +1;
						
		}
		}
	}
	printf("\n%d   |  %d   |   %d", SitzeA, SitzeB, SitzeC);
	printf("\n");
}

Nachdem ich aber den Quotienten Betitelt habe mit

Code:
	QuotientA = 0;
	QuotientB = 0;
	QuotientC = 0;

kam dann das hier raus was ja schonmal ein Fortschritt ist aber immernoch falsch. Fehler3.jpg
Hab ich noch eine Variable nicht Betitelt oder liegt der fehler woanders :o ?
 
Ich hab zwar nie C geschrieben, aber ich bezweifle schon stark dass das hier funktioniert:
Code:
for( ; sitze; sitze = sitze-1)

Wenn ich recht habe, dann sieh dir bitte nochmal die Basics an, bevor du sie implementierst.
 
Du initialisierst die teiler-Variablen nicht, das dürfte eine Division durch 0 sein.

@max: Doch, das geht :)
 
NullPointer schrieb:
Du initialisierst die teiler-Variablen nicht, das dürfte eine Division durch 0 sein.

Genau das wollte ich auch gerade schreiben. Kann auch sein das irgendwelche Randomwerte drin sind, aber irgendwo muss ja ein Wert für die Quotient-Variablen kommen.
 
NullPointer schrieb:
@max: Doch, das geht :)

Wieder was gelernt, da bleibt ich lieber bei meinen Hochsprachen :)
Btw, durch null!
 
Klar funktioniert die for Schleife so: Sitze wird bei jedem Schleifendurchlauf dekrementiert bis zum Abbruchkriterium sitze = 0

@TE: Du deklarierst wahnsinnig viele Variablen aber Initialisierst diese nicht. Was du mit der for Schleife bezwecken willst ist mir auch nicht so ganz klar
 
Das funktioniert wunderbar. sitze wurde bereits initialisiert, läuft so lange sitze == true ist (sitze == 0 == false) und das Dekrementieren ist auch drin. Nicht sonderlich schön und auch dumm die originale Variable zu ändern, aber vollkommen ok.

@ TE: Es heißt Haken, ohne r, außer du arbeitest im Garten. Geh doch mal per Debugger oder per Hand durch, was wann passieren soll. Bei "geht nicht, seht mal drüber", will dir hier glaub ich keiner soweit helfen.
 
Also ich vertrete immer die Auffassung: wenn man Variablen deklariert sie auch gleich initialisieren sollte. Somit ist klar, welchen Wert welche Variable hat.

In deinem Fall ist es wichtig: SitzeA, SitzeB, SitzeC, teilerA, teilerB, teilerC, QuotientA, QuotientB, QuotientC zu richtig initialisieren.
 
Hi,

Division führt im Normalfall nicht zu einem int. Quotienten sollten daher mal floats oder doubles sein. Deine Berechnung versteh ich trotzdem nicht. Erster Durchlauf ist immer max == 3. In der if versuchst du dann den Quotienten (=0) durch einen nicht zugewiesenen teilerC zu teilen und das ganze wieder in einen int zu kacheln :(. Vielleicht ist deine Vorgehensweise nicht ganz optimal.
Grüße
 
Zuletzt bearbeitet:
Du machst das ziemlich umständlich, und wie andere bereits gesagt haben kannst du in der for-Schleife ja nicht einfach Werte benutzen, welche es zu diesem Zeitpunkt noch garnicht gibt (z.B. if (QuotientA > QuotientB)). Dir muss immer bewusst sein dass C sequentiell, also "von oben nach unten" ausgeführt wird.
Ich würde einfach folgendes machen (anstatt der for-schleife):

int gesamte_stimmen = stimmen_a + stimmen_b + stimmen_c;
QuotientA = stimmen_a / gesamte_stimmen;
QuotientB = stimmen_b / gesamte_stimmen;
QuotientC = stimmen_c / gesamte_stimmen;

sitze_a = sitze * QuotientA;
sitze_b = sitze * QuotientB;
sitze_c = sitze * QuotientC;
 
Zwar verstehe ich hier auch wieder nicht den Sinn deiner Aufgabe. Aber ich würde den Hinweis geben wollen, erspart dir eine Menge arbeit, indem du Benutzereingaben in eine Schleife setzt, dadurch könntest du deine Variable Stimmena-A-C auf eine kürzen. Und die printf und scann funktionen ebenfalls auf eins verkürzen.

PHP:
int Stimmen;
int StimmenAlle=0;
int AnzahlParteien;

for(AnzahlParteien=3;AnzahlParteien>0;AnzahlParteien--){
    printf("Geben sie die Stimmen fuer Partei A ein: ");
    scanf("%d", &Stimmen);
    StimmenAlle=Stimmen+StimmenAlle
}

Wenn du den Buchstaben der Partei ändern willst, also durchlaufen willst von A nach C, dann legst du entweder noch ein char array an oder machst in der For schleife noch eine if Bedingung die den Buchstaben ändert wenn ein Wert erreicht wurde.

Das array ist natürlich kürzer, aber ich bin nicht sicher ob du das Thema schon in angriff genommen hast.
 
Zuletzt bearbeitet:
Ronin100 schrieb:
Du machst das ziemlich umständlich, ...

Wollt schon sagen, das Teil könnte schon fast ein Eintrag für einen obfuscated C Bewerb sein :)

Die Lösung von Ronin100 ist schonmal besser, nimmt aber keine Rücksicht auf evtl. Rundungsfehler. C macht meines Wissens bei Integer-Divisionen einfach ein Truncate, also eine Abrundung. Insgesamt werden bei dem Programm also Stimmen fehlen.
Das wichtigste ist: Variablen IMMER initialisieren. Sonst kann sonstwas passieren, zumindest in C. Wenn du die Variable einfach nimmst wie sie ist, dann kommt jedes Mal was anderes raus, je nachdem was vorher in dem Speicherbereich stand, in dem die Variable dieses Mal gelandet ist.

@Hades: Bei deiner Variante kann er nachher aber nicht mehr sagen, wer die Stimmen bekommen hat :) Außerdem wird man drei Mal aufgefordert, die Stimmen für Partei A anzugeben.

mfg
 
Zuletzt bearbeitet:
max_1234 schrieb:
Wieder was gelernt, da bleibt ich lieber bei meinen Hochsprachen :)
Btw, durch null!

Also in Java geht das auch, und das ist auch ne Hochsprache^^
Ergänzung ()

KainerM schrieb:
@Hades: Bei deiner Variante kann er nachher aber nicht mehr sagen, wer die Stimmen bekommen hat :) Außerdem wird man drei Mal aufgefordert, die Stimmen für Partei A anzugeben.

mfg

Daran habe ich gar nicht gedacht, dann müsste er ein int array erstellen um das zu differenzieren.

Zum zweiten Punkt habe ich ihm auch geschrieben wie das gehen würde, ich weiß nicht ob er schon mit arrays arbeitet.
 
Also die Aufgabe steht auf Seite 1118.
http://www.galileocomputing.de/download/dateien/328/galileocomputing_cpp2_loesungen.pdf
Das Problem ist halt das bei den Part "Einlesen der Variablen... Initialisieren der Variablen" anscheinend ein Fehler passiert ist den ich momentan noch nicht ganz erspäht habe.

Also wenn ich die Kommentare nun anschaue hab ich sitze, Teiler und Quotient nicht richtig Initialisiert ? ist der Teiler 3 ? Und woher weiss ich wie viel der Quotient ist... ? +.+ uff
 
Eddie0150 schrieb:
Das Problem ist halt das bei den Part "Einlesen der Variablen... Initialisieren der Variablen" anscheinend ein Fehler passiert ist den ich momentan noch nicht ganz erspäht habe.
Ja der Fehler ist, wie schon geschrieben, dass du den Part "Initialisieren der Variablen" nicht vollendest. Ein paar Variablen teilst du Werte zu, aber einige initialisierst du nicht. Dadurch stehen dort irgendwelche Werte drin und das Programm macht Murks. Der Anfangswert für Teiler und Quotient ergeben sich aus der Aufgabenstellung.
 
Eddie0150 schrieb:
Also die Aufgabe steht auf Seite 1118.
http://www.galileocomputing.de/download/dateien/328/galileocomputing_cpp2_loesungen.pdf
Das Problem ist halt das bei den Part "Einlesen der Variablen... Initialisieren der Variablen" anscheinend ein Fehler passiert ist den ich momentan noch nicht ganz erspäht habe.

Also wenn ich die Kommentare nun anschaue hab ich sitze, Teiler und Quotient nicht richtig Initialisiert ? ist der Teiler 3 ? Und woher weiss ich wie viel der Quotient ist... ? +.+ uff

Also wenn ich mir das PDF-Dokument anschaue und du bei Seite 1000 anfängst, bringt dir das gar nichts. Außerdem halte ich persönlich überhaupt nichts von vorgebene Programmcodes direkt in deine Entwicklungsumgebung einzugeben und du sollst dann im "fremden" Code dich austoben. Sonst verstehe ich auch nicht warum etliche Beispiele dort ohne Arrays vollzogen werden, das ist eine Schreibarbeit für "Idioten".

Eigentlich sind die Bücher von Galileo gut bis klasse, nur das irritiert mich gerade. Ich besitze dieses hier http://www.amazon.de/Grundkurs-C-Pr...F8&qid=1392124744&sr=8-1&keywords=C+grundkurs

Ich habe mir erst mal nur eine kompakte Version gekauft, weil ich durch Java das meiste sowieso kenne und C nicht unbedingt meine Sprache ist, wegen der Zeiger und sonstiger Sachen. Aber die Version ist günstig und die Grundlagen werden hier wirklich sehr gut und einfach erklärt und es gibt auch Beispiele. Zwar ohne Lösungen aber du hast hier freie Hand und kannst an die Sache heran gehen wie die es dir am besten liegt.



EDIT: Soweit ich mich erinnere, ist es sogar Compiler abhängig welche Initialwerte vergeben werden, manche vergeben direkt null andere etwas anderes(Default). Daher ist es schon wichtig, wie anderen es schon gesagt haben, nicht nur die Variablen deklarieren sondern auch direkt initalisieren(Also einen Wert vergeben)!



Edit2: Sehe gerade , das PDF beinhaltet nur Lösungen.
 
Zuletzt bearbeitet:
Ne bin eig auf Seite 90, nur das hinten sind die Lösungen zu den Aufgaben zum Jeweiligen Kapitel.
ist der Quotient nun 3 o.o weil es 3 Parteien sind ?

Ich wollte generell mit C Anfangen zu Programmieren daher kann ich von nichts anderem Ableiten. Wenn Quotient 3 sein sollte was ist dann teiler :o und woran leitet ihr das ab ?
 
Am Anfang besitzen die Qoutienten wahrscheinlich alle den Wert 0.

int QuotientA, QuotientB, QuotientC;

das ist aber Compiler abhängig.

EDIT:

...
Einlesen der Variablen
...
...
Initialisieren der Variablen
...

was du machen sollst, steht sogar in der Aufgabe,aber initialwerte hast du nicht vergeben.
 
Zuletzt bearbeitet:
Hades85 schrieb:
Also wenn ich mir das PDF-Dokument anschaue und du bei Seite 1000 anfängst, bringt dir das gar nichts. Außerdem halte ich persönlich überhaupt nichts von vorgebene Programmcodes direkt in deine Entwicklungsumgebung einzugeben und du sollst dann im "fremden" Code dich austoben. Sonst verstehe ich auch nicht warum etliche Beispiele dort ohne Arrays vollzogen werden, das ist eine Schreibarbeit für "Idioten".

Eigentlich sind die Bücher von Galileo gut bis klasse, nur das irritiert mich gerade. Ich besitze dieses hier http://www.amazon.de/Grundkurs-C-Pr...F8&qid=1392124744&sr=8-1&keywords=C+grundkurs

Ich habe mir erst mal nur eine kompakte Version gekauft, weil ich durch Java das meiste sowieso kenne und C nicht unbedingt meine Sprache ist, wegen der Zeiger und sonstiger Sachen. Aber die Version ist günstig und die Grundlagen werden hier wirklich sehr gut und einfach erklärt und es gibt auch Beispiele. Zwar ohne Lösungen aber du hast hier freie Hand und kannst an die Sache heran gehen wie die es dir am besten liegt.



EDIT: Soweit ich mich erinnere, ist es sogar Compiler abhängig welche Initialwerte vergeben werden, manche vergeben direkt null andere etwas anderes(Default). Daher ist es schon wichtig, wie anderen es schon gesagt haben, nicht nur die Variablen deklarieren sondern auch direkt initalisieren(Also einen Wert vergeben)!



Edit2: Sehe gerade , das PDF beinhaltet nur Lösungen.

Ansonsten hab ich hier noch C für Dummies und C++ für Dummies
sowie C - Programmieren von Anfang an von rororo.

Meinst du ich sollte erstmal für C für Dummies anfangen ?

Hab mir aus der Biblio erstmal 4 Ausgeliehen weil ich kA habe wo ich anfangen soll, kenne auch niemanden der mir erklären kann wo man am cleversten anfängt um das wirklich effektiv zu lernen.

Daher dachte ich mir, ich nehm mir das dickste Buch und klapper das einfach durch :0
 
Eddie0150 schrieb:
Wenn Quotient 3 sein sollte was ist dann teiler :o und woran leitet ihr das ab ?

Lies die Aufgabenstellung nochmal genau durch. Ignorier erstmal komplett das Programm sondern versuch einfach nur zu verstehen, was genau gemacht werden soll. Wenn du die Aufgabenstellung wirklich nicht nachvollziehen kannst lies dir die Vorüberlegungen durch, die das nochmal genauer erklären.
Es bringt nichts, irgendetwas zu programmieren wenn du gar nicht weißt was du eigentlich programmieren sollst. Erst wenn du das Problem auf Papier berechnen kannst macht es überhaupt Sinn, es in Programmcode zu schreiben.


Edit: Und um zu lernen solltest du dir nicht zuerst die Lösung angucken ;)
 
Zurück
Oben