UE am DI 21.11.2006 - Aufgabe

Antworten
m0tzerl
Beiträge: 89
Registriert: 06.11.2006, 00:16

UE am DI 21.11.2006 - Aufgabe

Beitrag von m0tzerl »

sooooo - nicht, dass ich an übermotivation leide oder so, aber da ich sowieso nicht schlafen kann, mechanik nicht lernen wollte, habe ich mich an das prog gesetzt und es schlussendlich doch geschafft, dass es funkt.

ich poste es euch. wie beim letzten mal, ist das nur als hilfestellung bzw. syntaxhilfe gedacht. bitte nicht alles übernehmen.

nachdem letztes mal so viel gemeckert wurde, hab ichs sogar auskommentiert. wer fehler findet, bitte melden ;)

Code: Alles auswählen

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

struct Elem
{
int Z;
char Name[3];
double W;
};

struct Elem * Read(char * FileName, int * length)
{
	int i=0,j=0;
	struct Elem *Eles;

	/* Anlegen des File-Pointers, Öffnen des Files*/ 
	FILE *infile;
	infile=fopen(FileName,"r");

	/* Überprüfung der Länge des Files */
	while(fscanf(infile,"%i  %s      %lf\n")!=EOF)
	{
		j++;
	}

	/* Reservieren des Speichers und vorläufiges Schließen des Files */
	Eles=(struct Elem *) malloc(j*sizeof(struct Elem));
	fclose(infile);

	/* Erneutes Öffnen und Einlesen in 'struct Elem *Eles' */	
	FILE *infile2;
	infile2=fopen(FileName,"r");
	for(i=0;i<j;i++)
	{
		fscanf(infile2,"%i  %s      %lf\n",&(Eles[i].Z),Eles[i].Name,&Eles[i].W));
	}   

	/* Angabe der Länge über den int * length, Erneutes Schließen des Files und Rückgabe des 'struct Elem *' */
	*length=j;
	fclose(infile2);
	return Eles;
}

/* Zusatzfunktion (nicht in Angabe enthalten) zur Ausgabe eines 'struct Elem *' mit Länge 'int length' */
void Print(struct Elem *tabelle, int laenge)
{
	int i;
	for(i=0;i<laenge;i++)
	{
		printf("Z: %2i Name: %3s Gewicht: %9.5lf\n",tabelle[i].Z,tabelle[i].Name,tabelle[i].W);
	}
	printf("\n");
}

void Sort(struct Elem *p, int length)
{
	int i,j;
	
	/* Anlegen des "Zwischen-Speichers" für spätere Vertauschung der struct Elemente */
	struct Elem zwischen;

	/* Sortieralgorithmus wie gehabt */
	for(j=length-1;j>0;j--)
	{
		for(i=0;i<=j;i++)
		{
			if(p[i].Z>p[i+1].Z)
			{
				zwischen=p[i];
				p[i]=p[i+1];
				p[i+1]=zwischen;
			}
		}
	}
}

int SearchWeight(struct Elem *p, int length, double we1, double we2)
{
	int i,j=0,k,j2=0;

	/* Anlegen eines neuen 'struct Elem *' - für aussortierte Werte des Gewichts zwischen we1 und we2 */
	struct Elem *found_E;

	/* Vorher noch sortieren, damit es auch was gleichschaut */
	Sort(p,length);

	/* Ermitteln der Anzahl j der gefundenen Elemente */
	for(i=0;i<length;i++)
	{
		if(p[i].W>=we1 && p[i].W<=we2) 
			j++;
	}

	/* Reservieren des Speichers */
	found_E=(struct Elem *) malloc(j*sizeof(struct Elem));

	/* Speichern der betreffenden Elemente in neuem struct Elem * found_E */
	for(k=0;k<length;k++)
	{
		if(p[k].W>=we1 && p[k].W<=we2)
		{
			found_E[j2]=p[k];
			j2++;
		}	
	}
	
	/* Ausgabe */
	printf("\nZwischen den Atomgewichten w1 = %lf und w2 = %lf wurden folgende Elemente gefunden:\n",we1,we2);
	Print(found_E,j);
	
	/* Rückgabe der Anzahl der gefundenen Elemente */
	return j; 
}

/* Funktion laut Angabe mit zusätzlichen Parameter 'int *j' für die spätere Überprüfung, ob überhaupt ein Element gefunden wurde */
struct Elem SearchElem(struct Elem *p, int length, char *e, int *j)
{
	int i;
	*j=0;

	/* Anlegen des später zu übergebenden 'struct Elem ele' */
	struct Elem ele;

	/* Vergleichen aller Namen der Elemente mit dem übergebenem Parameter 'char *e' mittels der Funktion 'strcmp' und Abspeichern
	   Außerdem durch die Anweisung '*j=1' wird deklariert, dass ein Element gefunden wurde.                                        */
	for(i=0;i<length;i++)
	{
		if(strcmp(e,p[i].Name)==0) 
		{
			ele=p[i];
			*j=1;
		}
	}

	/* Rückgabe des 'struct Elem ele' */
	return ele;
}

int main(int argc, char ** argv)
{

	struct Elem * table;
     	char *ElemFile="elem.dat";

	int nElem;

     	/* Pruefen der Anzahl derKommandozeilenparameter */
 	if (argc > 3)
        {
		printf("Usage: %s [w1 w2] or [name] or [none]\n",argv[0]);
        	exit(1);
        }
     
        /* Einlesen der Tabelle */
     	table=Read(ElemFile,&nElem);
     	if(!table)
        {
		printf("Illegal table\n");
         	exit(1);
        }

     	if (argc==3)
        { 
		/* Suchen: 
           	   Kommandozeilenparameter sind 2 Zahlen */
         	double w1=atof(argv[1]);
         	double w2=atof(argv[2]);
         	int n;
         	n=SearchWeight(table,nElem,w1,w2);
         	printf("%i Elemente gefunden\n",n);
        }

	if (argc==2)
        { 
		/* Suchen:
            	   Kommandozeilenparameter ist ein String */
         	struct Elem result;
	 	int gefunden;
         	result=SearchElem(table,nElem,argv[1],&gefunden);

		/* Mittels zusätzlichem Parameter 'int * j' der Funktion 'SearchElem' überprüfung ob ein Element gefunden wurde; entsprechende Ausgabe */
	 	if(gefunden==0)
	 	{ 
	 		printf("Kein Element mit dem Namen %s gefunden!",argv[1]);
	 		exit(1);
	 	}
	 	else
  	 	{
         		printf("Gefunden:\n");
         		printf("Z: %i Name: %s Gewicht: %lf\n",result.Z,result.Name,result.W);
	 	}
        }

     	if (argc==1)
        { 
		/* Sortierte Ausgabe: */
         	Sort(table,nElem);
         	Print(table,nElem);
        }

     	/* Freigabe des zuvor in Read(..) reservierten Speichers */
     	free(table); 
     	exit(0);   
}


Benutzeravatar
ibi
Dr. h.c.
Beiträge: 443
Registriert: 12.10.2006, 20:34
Wohnort: Kagran / Donaustadt

Beitrag von ibi »

Wenn Du einen filepointer geschlossen hast, kannst Du ihn ruhig nocheinmal öffnen, d.h. FILE *infile 2 ist nicht nötig.
man 3 rewind wär auch eine gute Idee. ;)

m0tzerl
Beiträge: 89
Registriert: 06.11.2006, 00:16

Beitrag von m0tzerl »

noe, das mit dem filepointer funktioniert nicht. habs jetzt nochmal ausprobiert. vielleicht liegts auch an meinem compiler.
weißt wie lang ich da gebraucht hab, weil noch dazu das file modifiziert wird auf meinem windows-betriebssystem. bis das mal gscheit einglesen wurde hats gedauert.

Benutzeravatar
ibi
Dr. h.c.
Beiträge: 443
Registriert: 12.10.2006, 20:34
Wohnort: Kagran / Donaustadt

Beitrag von ibi »

Seltsam.
rewind(infile) geht aa ned?
Bei Visual Studiuo.NET hab ich jedenfalls andere Headerfiles (include) einbinden müssen.
Aber ich hab dann einfach alles am Prakserver programmiert, mit ssh ja kein Problem.

m0tzerl
Beiträge: 89
Registriert: 06.11.2006, 00:16

Beitrag von m0tzerl »

tja, ka. hauptsache es funktioniert. die 1 zeile mehr stört ja auch nicht wirklich. ob 160 oder 161 zeilen - wayne ;) hauptsache es funzt und diesmal fand ichs gar nicht soooo einfach, zumindest wenn man noch nicht wirklich viel geproggt hat. in unserer gruppe seh ich überhaupt die fragezeichen ziemlich blinken über den köpfen der leute...

Benutzeravatar
ibi
Dr. h.c.
Beiträge: 443
Registriert: 12.10.2006, 20:34
Wohnort: Kagran / Donaustadt

Beitrag von ibi »

Kann ich verstehn, ich hab in den letzten Tagen genug davon gelesen. Die beiden Prof sind auch etwas chaotisch. ;)
Da ist es in der Donnerstagsgruppe wirklich um einiges gemütlicher.

Gal Martin
Beiträge: 194
Registriert: 11.10.2006, 14:53

Beitrag von Gal Martin »

raucht ihr am donnerstag auch joints? :P
WO IS DA GAL?!?! :twisted:
© Wiesinger

Benutzeravatar
ibi
Dr. h.c.
Beiträge: 443
Registriert: 12.10.2006, 20:34
Wohnort: Kagran / Donaustadt

Beitrag von ibi »

Nö, soo weit sind wir leider no ned. Aber ich kanns ja mal vorschlagen. ;)
I glaub die Fachschaft zieht aber Bier vor.

Antworten

Zurück zu „Datenverarbeitung für Physiker I“