for schleife

thehasso

Erfahrenes Mitglied
Hallo,

Bei mein Programm treten 2 Probleme auf.

Prolem nr 1:

Die Schleife läuft immer weiter und hört nicht auf . Obwohl ich die anweisung gegeben habe das die Schleife bis 12 Laufen soll. Es geht in diesem Programm darum Umsätze 2 Verschiedener Firmen einzulesen. Sitze schon ne ewigkeit dran find nicht den fehler.

Code:
#include <stdlib.h> 
#include <stdio.h> 
#include<math.h>
#include "conio.h"

int main() 
{ 

int min,max;
int const n=11;
int umsatz[12],umsatza[12],m1,m2,i,a; 
int umsatz_summe=0; // char* monate [12]=... 
float mittelwert=0;
char monate[12][12] = {"Januar", "Ferbruar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" }; 
char jahr[12][5] = {"2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007"};

printf("\n\tHandelsfirma A & B GmbH\n"); 

printf("Menue:\n"); 
printf("1: - Umsaetze eingeben\n");
printf("2: - Programm Wiederholen\n");
printf("3: - Ermittlung kleinster Wert\n");
printf("4: - Ermittlung groesster Wert\n");
scanf("%i",&m1); 

if(m1==1) 
{ 

	for(a=0;a<=n;a++){
		for(i=0;i<=n;i++){ 
	 
	printf("\nBitte %i -ten Umsatz fuer %s %s \n",i+1,monate[i],jahr[i]);  // Eingabe
	printf("Eingabe:");scanf("%i",&umsatz[i]);
	printf("Eingabe:");scanf("%i",&umsatza[a]);
													umsatz_summe+=umsatz[i];  // Berechnung Summe
													mittelwert=umsatz_summe/n; // Berechnung Mittelwert
													//standtardabweichung=
}
	}
printf("\n-----------------------------------------------\n");
//printf("\n:Eintrag:\t:Monat:\t:Jahr:\t\t:Umsatz:\n");
	for (i=0;i<=11;i++) 
	{ 
		printf("%5i. %10s %10s %10i",i+1 ,monate[i],jahr[i],umsatz[i]);  //Ausgabe Umsatz, Monat, Jahr
		printf("%5i. %10s %10s %10i",i+1 ,monate[i],jahr[i],umsatza[a]);  //Ausgabe Umsatz, Monat, Jahr
		printf("\n"); 
} 
	printf("\n-----------------------------------------------\n");

printf("\nDie Summe ist:%i Mittelwert:%.2f",umsatz_summe,mittelwert); // Ausgabe Summe


	}

system("pause");

}


Lg thehasso
 
Die for-Schleife-i ist soweit unnötig wie ich es sehe...

Die Schleife läuft immer weiter und hört nicht auf
Die hört schon auf, aber erst nach 12*12*2 eingaben...

Ich verstehe eh nicht wofür du die zweite Eingabe brauchst.

Hier ist der Code bissel aufgeräumter.

Code:
//#include <stdlib.h> // wofür die? 
#include <stdio.h> 
//#include <math.h> // wofür die?
//#include "conio.h" // ...

int main() { 

	int const n = 11; //constante in den for schleifen, geht mit #define find ich besser
	int	umsatz[12],
		//umsatza[12], //wofür?
		m1 = 0, // menuauswahl
		//m2, //wofür
		i, // zweite for schleife
		a, // erste for schleife
		//min, //...
		//max, //...
		umsatz_summe = 0; // char* monate [12]=... //
		
	float mittelwert = 0;

	char monate[12][10] = {"Januar", "Ferbruar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" }; 
	char jahr[12][6] = {"2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007"}; // warum die Jahre als String?

	printf("\n\tHandelsfirma A & B GmbH\n"); //Siemens?

	printf("Menue:\n"); 
	printf("1: - Umsaetze eingeben\n");
	printf("2: - Programm Wiederholen\n");
	printf("3: - Ermittlung kleinster Wert\n");
	printf("4: - Ermittlung groesster Wert\n");

	scanf("%i",&m1);
	switch( m1 ) 
		{
			case 1:
				//for(a=0; a <= n ; a++)
				//	{
						for( i=0; i <= n; i++)
							{ 
								printf("\nBitte %i -ten Umsatz fuer %s %s \n",i+1,monate[i],jahr[i]);  // Eingabe
								printf("Eingabe:");scanf("%i",&umsatz[i]);
								//printf("Eingabe:");scanf("%i",&umsatza[a]); //wofür das wenns net verwendet wird?
								umsatz_summe+=umsatz[i];  // Berechnung Summe
								mittelwert=umsatz_summe/n; // Berechnung Mittelwert
								//standtardabweichung= //
							}
				//	}
			
				printf("\n-----------------------------------------------\n");
				//printf("\n:Eintrag:\t:Monat:\t:Jahr:\t\t:Umsatz:\n");
				
				for ( i=0; i <= 11; i++ ) // hier nicht mehr die constante n?
					{ 
						printf("%5i. %10s %10s %10i", i+1, monate[i], jahr[i], umsatz[i] );  //Ausgabe Umsatz, Monat, Jahr
						//printf("%5i. %10s %10s %10i", i+1, monate[i], jahr[i], umsatza[a] );  //Ausgabe Umsatz, Monat, Jahr //wofür
						printf("\n"); 
					} 
				
				printf("\n-----------------------------------------------\n");
				printf("\nDie Summe ist:%i Mittelwert:%.2f", umsatz_summe, mittelwert ); // Ausgabe Summe
				
				break;
				
			default:
				printf("\nAuswahl ungueltig!\n");
				break;
		}

	
	fflush(stdin); getc(stdin); // finds besser als system("Pause");
	
	return 0;

}

Bitte bissel mehr auf die Äußere Form achten ):
 
Zuletzt bearbeitet:
Hallo , ich glaub du hast mich falsch verstanden..

die Aufgabe heisst:

Für die beiden Filialen der Handelsfirma A & B GmbH sollen die Umsätze von Januar 2007 bis
Dezember 2007 manuell per Tastatur erfasst werden.
Diese Erfassung soll als erster Menüpunkt dem Bediener angeboten werden und von einem
separaten Programm – Modul übernommen werden.
Ein weiterer Menüpunkt soll der tabellarischen Ausgabe aller Umsätze beider Filialen dienen und
ebenfalls von einem separaten Programm – Modul übernommen werden.

Die Module wollt ich im anschluss machen. Erstmal soll das programm so laufen das von 2 Firmen die Umsätze eingegeben werden können.


vielleicht hab ich die klammer falsch gesetzt.

grzß the hasso
 
Wäre echt hilfreich gewesen wenn du das schon vorher gepostet hättest...
Naja, dann brauchst du ja eigentlich nur die for-Schleife mit a Counter zu löschen
und beim array umsatza[] anstatt das a das i im Index zu verwenden.
 
hallo.... endlich 1000 dank!

Ich dachte man müsste dafür ne zweite forSchleife machen :)


Wüsstest du vielleicht wenn man für ein Betrieb den kleinsten Umsatz mit printf(); ausgeben kann ?

Sprich den Niedrigsten Umsatz ermitteln. Ich denke mit einer funktion min();



Lg thehasso
 
hmm, kenne da keine Funktion min(); aber ich würde das lieber auch selber schreiben.
Das einzigste was du dazu brauchst ist wieder nur ein for-Schleife.

Code:
int min = umsatz[0]; // ich starte einfach mit dem ersten Eintrag vom umsatz-Array
int min_a = umsatza[0]; // weil wenn ich das nicht machen würde, wäre min == 0 und die
                         // folgende for-Schleife hätte kein nutzen

int i;
for(i = 1; i <= 11; i++)
	{
		if( min > umsatz[i] ) { min = umsatz[i]; } // wenn derzeitiger Wert kleiner ist als derzeitiger min Wert
		if( min > umsatza[i] ) { min_a = umsatza[i]; } // dann den neuen min Wert eintragen
	}

printf( "Firma 1 min. Umsatz %i im Monat %s, \nFirma 2 min. Umsatz %i im Monat %s", min, monate[min], min_a, monate[min_a] );
// hier wird der erste kleinste Umsatz fund geprintfd und sagt sogar im welchen Monat das war ;P

Du musst halt bedenken was das Programm schreiben soll wenn es 2 gleichniedrige
Umsätze gibt. Ich würde einfach da nen min-Array befüllen und alles ausgeben.
Wie du das aber machst will ich dir diesmal überlassen. Du sollst auch mal üben ^^

edit:

Hab mein Lösungsvorschlag nicht getestet! Falls was nicht stimmt einfach fragen.
 
Zuletzt bearbeitet:
Hallo, hab das so zusammen gebastelt es komplemiert erfolgreich jedoch bei ausführen des programms treten fehler auf, schön wenn du drüber gucken würdest.

Nebenbei hätte ich noch ne verstädnisfrage damit ich das gleiche Programm für max versuche.

Also du sagst
Code:
min = umsatz[0]
if (min > umsatz[i]) 
{
min=umsatz[i]
}
wenn derzeitiger Wert kleiner ist als derzeitiger min Wert
// dann den neuen min Wert eintragen

müsste nicht derPfeil nach links zeigen? Weil wenn min kleiner als umsatz[i] dann ist dass der neue min Wert:suspekt: würd ich mal sagen hehe.

bin ein wenig verwirrt heute bissien zuviel programmiert...



lg thehasso





Code:
#include <stdlib.h> 
#include <stdio.h> 
#include<math.h>
#include "conio.h"




int main() 
{ 

int const n=11;
int umsatz[12],umsatza[12],m1,m2,i; 
int umsatz_summe=0; // char* monate [12]=... 
int min = umsatz[0]; 
int min_a = umsatza[0]; 
float mittelwert=0;
char monate[12][12] = {"Januar", "Ferbruar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" }; 
char jahr[12][5] = {"2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007"};


printf("\n\tHandelsfirma A & B GmbH\n"); 

printf("Menue:\n"); 
printf("1: - Umsaetze eingeben\n");
printf("2: - Programm Wiederholen\n");
printf("3: - Ermittlung kleinster Wert\n");
printf("4: - Ermittlung groesster Wert\n");
scanf("%i",&m1); 

if(m1==1) 
{ 

		for(i=0;i<=n;i++){ 
	 
	printf("\nBitte %i -ten Umsatz fuer %s %s \n",i+1,monate[i],jahr[i]);  // Eingabe
	printf("Eingabe:");scanf("%i",&umsatz[i]);
	printf("Eingabe:");scanf("%i",&umsatza[i]);
													umsatz_summe+=umsatz[i];  // Berechnung Summe
													mittelwert=umsatz_summe/n; // Berechnung Mittelwert
													//standtardabweichung=
}

for(i = 1; i <= 11; i++)
	{
		if( min > umsatz[i] ) { min = umsatz[i]; } // wenn derzeitiger Wert kleiner ist als derzeitiger min Wert
		if( min > umsatza[i] ) { min_a = umsatza[i]; } // dann den neuen min Wert eintragen
	}
printf( "Firma 1 min. Umsatz %i im Monat %s, \nFirma 2 min. Umsatz %i im Monat %s", min, monate[min], min_a, monate[min_a] );
// hier wird der erste kleinste Umsatz fund geprintfd und sagt sogar im welchen Monat das war ;P
	
printf("\n--------------------------------------------------------------------------------\n");
//printf("\n:Eintrag:\t:Monat:\t:Jahr:\t\t:Umsatz:\n");
	for (i=0;i<=11;i++) 
	{ 
		printf("%5i. %10s %10s %10i",i+1 ,monate[i],jahr[i],umsatz[i]);  //Ausgabe Umsatz, Monat, Jahr
		printf("%5i. %10s %10s %10i",i+1 ,monate[i],jahr[i],umsatza[i]);  //Ausgabe Umsatz, Monat, Jahr
		printf("\n"); 
} 
printf("\n--------------------------------------------------------------------------------\n");

printf("\nDie Summe ist:%i Mittelwert:%.2f",umsatz_summe,mittelwert); // Ausgabe Summe
printf( "Firma 1 min. Umsatz %i im Monat %s, \nFirma 2 min. Umsatz %i im Monat %s", min, monate[min], min_a, monate[min_a] );

	}

system("pause");

}
 
int min = umsatz[0];
int min_a = umsatza[0];

müssen direkt vor der for-Schleife sein für die min. Wert berechnung.
Weil wenn du die gleich am Anfang mit umsatz beschreibst haben die
dann den Wert 0 und werden niemals mit der forschleife nen kleineren
Wert erreichen können außer die Firma hätte Minusumsatz.

@deine Verständnisfrage

Ich hoffe du weißt was die for-Schleife macht. Sie geht alle gültigen Array
Einträge durch, also von Februar bis Dezember Umsatzeinträge, vom index [1]
bis index [11]. Warum erst Februar? Weil wir kurz vor der for-Schleife Januar ins
min Variable geschrieben haben (min = umsatz[0]). Im jedem der Arrays ist der Umsatz
gespeichert den du vorher mit scanf und einer for-Schleife vom Benutzer erfragt hast.

Sagen wir mal der umsatz[0] ist 200 Euro und umsatz[5] ist 100 Euro und die
Umsätze dazwischen sind irgendwas mit 2000 Euro. Nun gehen wir langsam durch
was die for-Schleife macht:


Code:
int min = umsatz[0]; 
int min_a = umsatza[0]; 

for(i = 1; i <= 11; i++)
	{
		if( min > umsatz[i] ) { min = umsatz[i]; } // wenn derzeitiger Wert kleiner ist als derzeitiger min Wert
		if( min > umsatza[i] ) { min_a = umsatza[i]; } // dann den neuen min Wert eintragen
	}
printf( "Firma 1 min. Umsatz %i im Monat %s, \nFirma 2 min. Umsatz %i im Monat %s", min, monate[min], min_a, monate[min_a] );

Als erstes wird einfachso ohne jeden erdenklichen Grund gesagt das Januar den
minimalsten Wert hat. Könnte stimmen, muss aber net sein. Der Grund ist wenn
wir das nicht machen ist min Wert 0 und dann müsste die Firma wie gesagt
Minusumsätze haben um als neues min Wert beschrieben zu werden.
Da wir vorher beschlosse haben das Januar 200 Euro Umsatz hat ist unser
min Wert 200 groß.
Nun beginn die forschleife mit dem Wert 1 der als Index für unser Array fungiert.
Index 1 ist Febraur und hat irgendwas mit 2000 Euro Umsatz

if( min > umsatz[1] ) { min = umsatz[1]; }
if( 200 > 2000[Februar] ) { min = 2000[Februar]; }

wie du siehst ist die if-Abfrage nicht erfolgreich weil 200 nicht größer ist als 2000!
also wird der neue min Wert nicht beschrieben.

Nun sagen wir das die for-Schleife beim Index 5 ist wo wir 100 Euro als Umsatz
festgelegt haben. In der Zwischenzeit hat sich der min Wert nicht verändert!

if( 200 > 100[Juli] ) { min = 100[Juli]; }

hier ist die If-Abfrage erfolgreich weil 200 größer ist als 100, darum wird der
Wert 100 ins min Variable beschrieben.

Ich hoffe es war verständlich für dich.

PS.: Achte mal auf deine "Schreibschrift". Guck dir mal die unterschiede
an zwischen meinem Vorschlag Code und deinem Code. Ich meine die
switch-Funktion für Menüpunkte, richtige Tabs und so weiter :)
 
Zuletzt bearbeitet:
hallo,

Das ist sehr ausführlich erklärt danke. Was mich verwirrt :confused:ist das wiedersprüche aufgetaucht sind. so nehme ich es zumindestens an, wobei ich mich auch irren kann.

Meine sicht wie eine if abfrage funktioniert.

If (a > b)
return (a) // Wenn Wahr gebe a zurück

else

return (b) // Wenn Bedingung 1 falsch ist return b

selbe beispiel mit den Umsätze

if( 200 > 2000[Februar] ) { min = 2000[Februar]; }

200 ist nicht größer als 2000 also ist min 2000 O.k stimmt ich dir zu. wobei wenn die schleife hier enden würde , würde 2000 euro der Niedrigste Umsatz sein. Und das wär nicht richtig.


if( 200 > 100[Juli] ) { min = 100[Juli]; }

Wenn 200 größer ist als 100 dann müsste 200 min sein?
Die Bedingung ist Wahr weil 200 größer ist als 100 dann wird das else (100) nicht ausgegeben bzw min = 100 .



Ich hoffe du verstehst was ich meine.

vielleicht könntest du es so einfedeln das die im Programm läuft.

Lg thehasso

:)
 
Sorry, da hast du aber was falsches gelernt oder geübt....
und außerdem benutz ich in meinen Beispielen kein else ):
Lies dir mal das ganze if-Kapitel hier durch http://www.galileo-press.de/openbook/c_von_a_bis_z/c_010_000.htm#Xxx999328

Ersparrt mir Erklärarbeit :)

PS.:

vielleicht könntest du es so einfedeln das die im Programm läuft.

neh, dann würde ich dir fast die ganze Hausi machen ^^ Du sollst hier selber lernen anstatt
alles vorgekaut zu bekommen.

edit:

hier paar Beispiele... einfach kompilieren und angucken!

Code:
#include <stdio.h>

int main() {

	printf("\nif( 200 > 100 )\n");
	if( 200 > 100 ) { printf(" ... ist wahr ... neuer min wert!\n"); } 
	
	printf("\nif( 200 > 2000 )\n");
	if( 200 > 2000 ) { printf(" ... ist wahr ... neuer min wert!\n"); } 
	
	printf("\nif( 200 > 100 ) mit else\n");
	if( 200 > 100 ) { printf(" ... ist wahr ... neuer min wert!\n"); } else { printf(" ... ist nicht wahr ... kein neuer min wert!\n"); }
	
	printf("\nif( 200 > 2000 ) mit else\n");
	if( 200 > 2000 ) { printf(" ... ist wahr ... neuer min wert!\n"); } else { printf(" ... ist nicht wahr ... kein neuer min wert!\n"); }
	
	return 0;
	
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück