Modalwert Bestimmung

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Lekkenlu
Beiträge: 3
Registriert: Mo Apr 29, 2013 6:24 pm

Modalwert Bestimmung

Beitrag von Lekkenlu » Mo Apr 29, 2013 6:44 pm

Hallo alle Zusammen,

ich bin auf der verzweifelnden Suche nach einer Lösung für mein Problem auf dieses Forum gestoßen und hoffe nun, hier ein wenig Hilfe,Ratschläge,Tipps oder Lösungen zu finden.

Kurz zu meiner Person:
Ich bin so gesehen ein absoluter Neuling auf dem Gebiet des Programmierens, was heißen soll, dass ich ein Student (Elektrotechnik) im zweiten Semester bin. Ich habe vorher noch nie etwas mit proggen zu tun gehabt und tue mich bei manchen Sachen oder Aufgaben somit sehr schwer, obwohl mir das Proggen Spass macht, wenn es klappt ;-). In der Uni proggen wir in C in der Entwicklungsumgebung "Microsoft Visual Studio 2010".

So nun zu meinem Problem. Wir haben als Semesteraufgabe, die Aufgabe bekommen, dass wir ein Programm schreiben sollen, was den Benutzer eine beliebig gewählte Anzahl von Werten eingeben lässt und diese auswertet. Die Auswertung beinhalten, dass von den eingegebenen Werten das Minimum, Maximum, Mittelwert, Streuung Standardabweichung, Spannweite und der Modalwert ermittelt wird.
Das Problem was ich habe, ist dass ich es nicht hin bekomme den Modalwert anständig zu programmieren. Der Rest läuft eigentlich soweit. Nun hoffe ich, hier Hilfe zu finden, bei der Lösung meines Problems. Damit Ihr eine Ahnung habt, was ich meine, habe ich hier den Quellcode mal eingefügt.

Das Problem tritt ab Zeile:
for(index6=0;index6<dimension;index6++) // Modalwert

auf.

Ich hoffe mir kann jemand helfen. Vielen Dank schonmal im Voraus!

Quellcode:

Code: Alles auswählen

# include <stdio.h>																	
# include <stdlib.h>																
# include <math.h>																	
# include <ctype.h>																	
# include <string.h>																

void eingabe(float*,int);															 
float get_statistikwerte(float*,int,float*);										 
void ausgabe(float*);																

int main (void)																		
{
	float* feld;																	
	float ergebnis[5];																
	int wiederholen=0;																
	
	do																				
	{																	
		int dimension=0;															
		char groeße[80];															
		int laenge;																	
		int index;																	
		int fehler;																	
		int prüfen;																	

		do
		{
			fehler=0;
			prüfen=0;
			printf("Bitte geben Sie die Anzahl der zu berechnenden Werte an!\n");	
			scanf("%s",groeße);
			fflush(stdin);

			laenge=strlen(groeße);													
			for(index=0;index<laenge;index++)
			{
				prüfen=isdigit(groeße[index]);
				if(prüfen==0)
				{
					fehler++;														
				}
			}
			if(fehler!=0)
			{
				printf("Bei der Eingabe ist Ihnen ein Fehler unterlaufen!\n\nBitte wiederholen Sie Ihre Eingabe.\n");									
			}
			else
			{
				dimension=atoi(groeße);												
			}
		}
		while(fehler!=0);
		
		feld=(float*)malloc((int)dimension*sizeof(float));							
		if(feld==NULL)																
		{
			printf("Der Speicherplatz konnte nicht reserviert werden\n");
		}
		else
		{
		printf("____________________________________________________\n");
		eingabe(feld,dimension);													

		get_statistikwerte(feld,dimension,ergebnis);								
		
		ausgabe(ergebnis);															
		}
		
		printf("Moechten Sie eine weitere Berechnung durchfuehren?\n\nDruecken Sie 1 fuer Ja oder 2 fuer Nein\n");										
		scanf("%i",&wiederholen);
		fflush(stdin);
	}
	while(wiederholen==1);															
	printf("Das Programm wird beendet.\n");											
	getchar();
	return(1);
	
}

void eingabe(float *werte,int dimension1)											
{
	int fehler2;																	
	int index2;																		
	int index3;																		
	int index4;																		
	int prüfen2;																	
	char eingaben[80];																
	int laenge2;																	
	double werte_zwischen;															

	for(index2=0;index2<dimension1;index2++)
	{
	do
	{
		fehler2=0;
		prüfen2=0;
		printf("Bitte geben Sie die Werte fuer die Rechnung %i ein\n",index2+1);	
		scanf("%s",eingaben);
		fflush(stdin);
		
		laenge2=strlen(eingaben);													
		for(index3=0;index3<laenge2;index3++)
		{
			prüfen2=isdigit(eingaben[index3]);
			if(prüfen2==0)
			{	
				fehler2++;															
			}
		}
		for(index3=1;index3<laenge2;index3++)
		{
			if(eingaben[index3]=='.')
			{
				fehler2--;
			}
		}
		if(eingaben[0]=='-')														
		{
			fehler2--;
		}
		
		if(fehler2!=0)
		{
			printf("Bei der Eingabe ist Ihnen ein Fehler unterlaufen!\n\nBitte wiederholen Sie Ihre Eingabe.\n");		// Ausgabe Befehl, bei auftreten eines Eingabe Fehlers
		}
	}
		while(fehler2!=0);

		werte_zwischen=atof(eingaben);	
		werte[index2]=(float)werte_zwischen;										
	}
	printf("\nAlle Werte wurden eingelesen. Berechnung wird gestartet:\n\n");
	printf("____________________________________________________________\n");
}																					


float get_statistikwerte(float *werte,int dimension,float *ergebnis)				
{
	int index5;																	
	int index6;

	float zwischen1=0;
	float zwischen2=0;
	float zwischen3=0;
																					
	ergebnis[0]=werte[0];
	ergebnis[1]=werte[0];
	
	for(index5=0;index5<dimension;index5++)
	{
		if(werte[index5]<ergebnis[0])
		{
			ergebnis[0]=werte[index5];										
		}
		if(werte[index5]>ergebnis[1])
		{
			ergebnis[1]=werte[index5];
		}
	}																				
	for(index6=0;index6<dimension;index6++)											
	{
		zwischen1=werte[index6]+zwischen1;
	}
	ergebnis[2]=zwischen1/dimension;												
	
	for(index6=0;index6<dimension;index6++)											
	{
		zwischen2=((werte[index6]-ergebnis[2])*(werte[index6]-ergebnis[2]))+zwischen2;
	}
	ergebnis[3]= zwischen2/(dimension-1);											

	ergebnis[4]=sqrt(ergebnis[3]);													


	/*for(index6=0;index6<dimension;index6++)											// Modalwert
	{
		void sortierfeld(int groesse,int*feld)
		{
			int index;
			int j;
			int temp;

			for(index=0;index<groesse;index++)
			{
				for(j=0;j<groesse-index;j++)
				{
					if(feld[j]>feld[j+1])
					{
						temp=feld[j];
						feld[j]=feld[j+1];
						feld[j+1]=temp;
					}
				}
			}
		}
	

		void modalwert(int groesse,int*feld,feld*ergebnis)
		{
			int index;
			int j=0;
			int zaehler=0;
			int min=0;
			int max=0;
			int position=0;
			int abbrechen=0;
			int hfeld[10]={0};
			int hfeldcpy[10]={0};
			
			for (index=0;index<groesse;index++)
			{
				if(feld[index]==feld[index+1])zaehler++;
				if(feld[index]!=feld[index+1])
				{
					hfeld[j]=zaehler+1;
					j++;
					zaehler=0;
				}
			}
			for(index=0;index<10;index++)
			{
				hfeldcpy[index]=hfeld[index];
			}

			for(index=0;index<10;index++)
			{
				if(hfeld[index]<min)min=hfeld[index];
				if(hfeld[index]>max)max=hfeld[index];
			}
			index=0;

			do
			{
				
				position=position+hfeldcpy[index];
				if(hfeldcpy[index]==max)
				{
					abbrechen=1;
				}
				index++;
			}
			while(abbrechen==0);
		}
		ergebnis[5]=(float)feld[position-1];
	}*/
		


	for(index6=0;index6<dimension;index6++)											
	{
		zwischen2=werte[index5]+zwischen1;
	}
	ergebnis[7]=ergebnis[1]-ergebnis[0];	

	return(1);
}

void ausgabe(float *lösung)																
{
	printf("Das Minimum der eingegebenen Werte betraegt: %f\n\n",lösung[0]);			

	printf("Das Maximum der eingegebenen Werte betraegt: %f\n\n",lösung[1]);			

	printf("Der Mittelwert der eingegebenen Werte betraegt %f\n\n",lösung[2]);			
	printf("Die Streuung ist: %f\n\n",lösung[3]);										

	printf("Die Standartabweichung der eingegebenen Werte betraegt: %f\n\n",lösung[4]);	

	printf("Der Modalwert der eingegebenen Werte ist: %f\n\n",lösung[5]);
	printf("Dieser Wert kam insgesamt %fmal vor\n\n",lösung[6]);

	printf("Die Spannweite der eingegebenen Werte beträgt: %f\n\n",lösung[7]);

}
Edit by cloidnerux: Code-Tags eingefügt

sebix
Beiträge: 82
Registriert: Mo Nov 19, 2012 8:27 pm

Re: Modalwert Bestimmung

Beitrag von sebix » Mo Apr 29, 2013 8:39 pm

Könntest du bitte die Code-Tags verwenden, dann bleibt auch die Einrückung erhalten, was die Lesbarkeit erhöhen sollte.
Bitte lass auch überflüssige Teile weg, auch auskommentierten Code, der offensichtlich falsch ist.

Ich kann mich momentan im Code nicht zurechtfinden, da sind Funktionen in Schleifen?!.. weird

Lekkenlu
Beiträge: 3
Registriert: Mo Apr 29, 2013 6:24 pm

Re: Modalwert Bestimmung

Beitrag von Lekkenlu » Mo Apr 29, 2013 9:15 pm

Hallo,

erstmal vielen Dank schonmal für die Antwort. Das ich den Code in die Nachricht geschrieben habe tut mir leid. Kommt nicht wieder vor. Dann versuche ich es mal als Datei Anhang hochzuladen.

Das mit der Funktion in der Schleife, war meine erste Idee zu dem Thema Modalwert, die aber wie ja schon gesagt wurde, offensichtlich falsch ist. Jedoch fehlt mir die richtige Idee zur Umsetzung und da wäre Eure Hilfe sehr nett.

Datei:
Semester Aufgabe 2.cpp
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Modalwert Bestimmung

Beitrag von cloidnerux » Mo Apr 29, 2013 9:45 pm

Hi und Willkommen im Forum.

Gleich vorweg mal was Stilistisches: Variablen gelten in C und vielen anderen Sprachen nur in ihrem Gültigkeitsbereich ab ihrer Definition, das ist in der Regel aller Code der in den umschließenden Klammern ist:

Code: Alles auswählen

{
int a;
//a ist hier gültig
[...]//viel code
//auch hier ist a noch gültig
}
//a ist hier nicht mehr gültig
Das bedeutet, dass du deine Variablen nicht index 1-6 benennen musst.

Dann solltest du deine Programmteile auslagern. Du kannst das Eingeben von einer Zeile in eine Funktion packen, das Auswerten in eine, das Ausgeben usw. In der Regel sollte eine Funktion nur eine Bildschirmseite lang sein.

Dann kannst in deiner Modalwert-Funktion diese beiden schleifen zusammenlegen:

Code: Alles auswählen

       for(index=0;index<10;index++)
         {
            hfeldcpy[index]=hfeld[index];
         }

         for(index=0;index<10;index++)
         {
            if(hfeld[index]<min)min=hfeld[index];
            if(hfeld[index]>max)max=hfeld[index];
         }
Und das kansnt du auch durch eine For-schleife ausdrücken:

Code: Alles auswählen

 do
         {
            
            position=position+hfeldcpy[index];
            if(hfeldcpy[index]==max)
            {
               abbrechen=1;
            }
            index++;
         }
         while(abbrechen==0);
Und als Tipp: Mit continue und break kannst du den Schleifendurchlauf steuern.

Und wie genau äußert sich dein Problem, das hast du nicht genau gesagt?

MfG cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

Nemo
Beiträge: 37
Registriert: Sa Mär 02, 2013 3:18 pm

Re: Modalwert Bestimmung

Beitrag von Nemo » Mo Apr 29, 2013 9:51 pm

Hallo Lekkenlu!
Lekkenlu hat geschrieben:erstmal vielen Dank schonmal für die Antwort. Das ich den Code in die Nachricht geschrieben habe tut mir leid. Kommt nicht wieder vor.
Es war nicht falsch den Code direkt hier zu posten, du solltest ihn aber das nächste Mal mit

Code: Alles auswählen

[code] einleiten und mit 
[/code] abschließen. (Die bescheuerte Formatierung tut mir leid, aber anders lässt sich das hier nicht posten.)
Lekkenlu hat geschrieben:Das mit der Funktion in der Schleife, war meine erste Idee zu dem Thema Modalwert, die aber wie ja schon gesagt wurde, offensichtlich falsch ist. Jedoch fehlt mir die richtige Idee zur Umsetzung und da wäre Eure Hilfe sehr nett.
Funktionen in Schleifen aufzurufen ist sicher ein guter Ansatz, allerdings müssen Sie natürlich außerhalb anderer Funktionen deklariert und definiert werden. Vielleicht hilft dir das hier weiter um zu verstehen was ich meine:http://www.proggen.org/doku.php?id=c:tutorial:functions

Es ist zu spät um noch das ganze durchzuarbeiten, allerdings kann möchte ich dich noch auf zwei Dinge hinweisen:
1. Du kannst for-Schleifen auch so formulieren:

Code: Alles auswählen

for( int index = 0; index < laenge ; ++index )
{} 
Damit deklarierst du den Index dort wo er hingehört und sparst dir das Durchzählen.

2. Ich weiß nicht, was genau die Aufgabenstellung war, aber dein Programm kann nur mit unimodalen Mengen umgehen. Vielleicht braucht es nicht mehr, aber das ist mir eben aufgefallen.

PS: Willkommen im Forum. Ich hoffe du lässt dir den Spaß am Programmieren nicht von solchen Anfangsschwierigkeiten verderben. ;)

Lekkenlu
Beiträge: 3
Registriert: Mo Apr 29, 2013 6:24 pm

Re: Modalwert Bestimmung

Beitrag von Lekkenlu » Di Apr 30, 2013 8:27 am

Hallo,

ja vielen Dank für die herzliche Begrüßung. Die Spass am proggen, aknn ich mir nicht nehmen lassen, da ich dieses Fach mindestens noch die nächsten 5 Semester habe ;-). Was teilweise die Formatierung und Auslagerung betrifft, kann ich nur sagen, dass wir noch nicht soweit im Stoff sind und es daher auf diese "unschöne" Weise machen.

Mein Problem, was ich habe, ist dass ich kein anständigen funktionierenden Code geschrieben bekomme, für die Bestimmtung des Modalwertes. Die anderen Funktionen laufen so wie sie sollen. Von daher wäre es nett von euch, wenn mir einer unter die Arme greifen könnte und mir mit einem passenden funktionierenden Quellcode helfen könnte, damit ich diesen Modalwert bestimmt kann, sowie bestimmen kann, wie oft dieser Wert eingegeben wurde.

Danke schon mal im Voraus.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Modalwert Bestimmung

Beitrag von Xin » Di Apr 30, 2013 8:57 am

Lekkenlu hat geschrieben:ja vielen Dank für die herzliche Begrüßung. Die Spass am proggen, aknn ich mir nicht nehmen lassen, da ich dieses Fach mindestens noch die nächsten 5 Semester habe ;-). Was teilweise die Formatierung und Auslagerung betrifft, kann ich nur sagen, dass wir noch nicht soweit im Stoff sind und es daher auf diese "unschöne" Weise machen.

Code: Alles auswählen

   /*for(index6=0;index6<dimension;index6++)                                 // Modalwert
   {
      void sortierfeld(int groesse,int*feld)
Du schreibst Funktionen innerhalb von Funktionen... das kann zwar semantisch Sinn ergeben, aber ein C/C++ Compiler sollte das ablehnen.
Schreib die Funktionen in den globalen Namensraum (also als eigenständige Funktionen).

Ansonsten möchte ich Dich auffordern, sauber einzurücken. Du kannst in Visual Studio einen Bereich mit Shift+CursorUp/Down markieren und dann einfach mit Hilfe von Tab weiter einrücken oder mit Shift-Tab "entrücken". Achte darauf, dass die richtigen Klammern untereinander stehen, dann kann man das ganze nämlich auch lesen ;)
Lekkenlu hat geschrieben:Mein Problem, was ich habe, ist dass ich kein anständigen funktionierenden Code geschrieben bekomme, für die Bestimmtung des Modalwertes. Die anderen Funktionen laufen so wie sie sollen. Von daher wäre es nett von euch, wenn mir einer unter die Arme greifen könnte und mir mit einem passenden funktionierenden Quellcode helfen könnte, damit ich diesen Modalwert bestimmt kann, sowie bestimmen kann, wie oft dieser Wert eingegeben wurde.
Dir wird keiner Deine Aufgabe lösen (hoffe ich zumindest), aber wir können ja mal gucken, dass Du das Ding ans Laufen bekommst.

Du fängst mindestens damit an die Funktionen sortierFeld() und modalWert() aus der Funktion get_statistikwerte rauszukopieren.
Dann kompiliere das und versuche Dich anhand der Compilermeldungen weiter zu hangeln.

Bitte nummeriere Variablen nicht.

Du schreibst

Code: Alles auswählen

int index5;                                                   
for(index5=0;index5<dimension;index5++)
Versuch mal das:

Code: Alles auswählen

for( int i = 0; i < dimension; i++ )
Nach der schließenden Klammer von for ist i verschwunden, als hätte es nie existiert. i existiert nur innerhalb der { ... } von for. Du kannst also in der nächsten for-Schleife ein neues i einführen. i, j, k, l, m, n kapiert jeder C-Programmierer als Integerwert zum Durchzählen innerhalb von Schleifen. zwischen1-zwischen3... gib den Dingern Namen, die darauf hinweisen, was drinsteht. Variablen und Funktionsnamen sind Teil der Code-Dokumentation, die einem Leser erklären, was da gerade passiert. Wenn alles index, temp oder zwischen heißt, muss man Schritt für Schritt verstehen, was Du programmiert hast und weiß immernoch nicht, ob das was Du programmiert hast, das ist, was Du programmieren wolltest.

Wenn der Compiler konkrete Probleme meldet, poste bitte die Fehlermeldungen des Compilers mit. Wenn Du Probleme mit dem Modalwert allgemein hast, poste bitte ein kurzes Testprogramm, dass die Modalwert-Funktion aufruft und sonst nichts macht.

Ansonsten: Willkommen im Forum, offenbar liest man sich ja noch die nächsten 5 Semester. ;-)
Viel Spaß und Erfolg hier.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten