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
#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);
}