struct und Benutzereingaben



  • Hallo, ich bin recht neu was das Programmieren angeht und habe eine Frage:

    z.B. Das Periodensystem:

    Ich habe z.B. eine Struktur ( Elemente ) und dazu verschiedene Objekte von denen das Programm Informationen ausgeben soll.
    (H, He, Li...)
    Und der Benutzer soll eingeben von welchem Element er Informationen haben möchte.

    Aber wie 😕

    #include <stdio.h>
    
    struct Elemente {
        int Protonen;
        float Atommasse;
    }
    
    int main() {
        struct Elemente H = {1, 1.01};
        struct Elemente He = {2, 4};
        struct Elemente Li = {3, 6.94};
        // usw.
    
        char Eingabe[5];
        printf("Von welchem Element wollen sie mehr Informationen? ");
        scanf("%s", &Eingabe);
    
        printf("%s:\n\nProtonen: %d\nAtommasse: %.2f\n", Eingabe, /*Eingabe*/.Protonen, /*Eingabe*/.Atommasse);
    
        return 0;
    }
    

    Habt ihr eine Lösung für mein Problem? 🙂



  • #include <stdio.h>
    
    typedef struct {
    		char symbol[6];
        int protonen;
        double atommasse;
    } Element;
    
    int main() {
    	Element element[] = {
    		{"H", 1, 1.01}, 
        {"He", 2, 4},
    		{"Li", 3, 6.94} },*suche=element;
        char eingabe[6];
        printf("Von welchem Element wollen sie mehr Informationen? ");
        scanf("%5s", &eingabe);
    
    		do {
    			if(!strcmp(suche->symbol,eingabe)){
    				printf("%s:\n\nProtonen: %d\nAtommasse: %.2lf\n", suche->symbol,suche->protonen,suche->atommasse);break;}
    			++suche;
    		} while(1);
    
        return 0;
    }
    

    Es fehlt noch die Abbruchbehandlung bei <nicht gefunden>, aber die kriegst du wohl selbst hin?



  • Danke für die schnelle Antwort...
    werde ich gleich mal ausprobieren 😃



  • Peacemaker 95 schrieb:

    Danke für die schnelle Antwort...
    werde ich gleich mal ausprobieren 😃

    Es muss natürlich

    scanf("%5s", eingabe);
    

    heissen.



  • Peacemaker 95 schrieb:

    Aber wie 😕

    #include <stdio.h>
    #include <string.h>
    #include <locale.h>
    
    typedef struct { 
    	char* symbol;
    	char* name;
        int protonen; 
        double atommasse; 
    }Element;
    
    char* remlf ( char* buf ) // remove linefeed ('\n' Zeichen auf 0 setzen )
    {
    	char* p = strrchr ( buf, '\n' );
    	if ( p != NULL )
    		*p = 0;
    	return p;
    }
    
    int main()
    { 
    	unsigned i, run = 1;
        Element e[] = { 
    					{ "H", "Wasserstoff", 1, 1.01 }, 
    					{ "He", "Helium", 2, 4 }, 
    					{ "Li", "Lithium", 3, 6.94 },
    					{ NULL, NULL, 0, 0 }
    				  };						
    	char buf[512] = {0}; 
    
    	setlocale ( LC_ALL, "German" ); // Wir wollen Umlaute sehen.
    
        puts ( "Über welches Element wollen sie mehr Informationen(Beenden mit Eingabetaste)?" ); // Elemente können nicht reden :D
    	// Beim Drücken der Eingabetaste, ohne weitere Eingaben, speichert fgets das '\n' an
    	// die erste Position im Puffer und bewirkt einen Abbruch der while Schleife,
    	// indem die Variable run = 0 gesetzt wird.
    	do 
    	{
    		printf ( "Ihre Eingabe: " );
    		// buf ist bereits die Adresse des Puffers.
    		fgets ( buf, sizeof ( buf ), stdin );
    		if ( buf[0] == '\n' )
    			run = 0; // Benutzer beendet das Programm.
    	 // fgets speichert ein '\n' am Ende des Puffers, das '\n' wird entfernt.
    		remlf ( buf );
    		for ( i = 0; run != 0 && e[i].symbol != NULL; i++ )
    		{
    			// stricmp: Groß-/ Kleinschreibung nicht beachten.
    			if ( 0 == stricmp ( e[i].symbol, buf ) 
    											|| 0 == stricmp ( e[i].name, buf ))
    			{
    				printf ( "%s\nProtonen: %d\nAtommasse: %.2lf\n",
    					e[i].name, e[i].protonen, e[i].atommasse );
    				break; // Das Element wurde gefunden, Abbruch der for Schleife.
    			} 
    		}
    		if ( e[i].symbol == NULL )
    			printf ( "%s wurde nicht gefunden.\n", buf );
    	}while ( run );
    
    	return 0; 
    }
    


  • Und wie würde ich dann den Code von Wutz
    in drei Modulen schreiben 😕

    Also 1 Header, 1 C für main und 1 C für Unterprogramme

    Ich habe dann nämlich Probleme den Zeiger *suche zu übergeben.



  • Peacemaker 95 schrieb:

    Und wie würde ich dann den Code von Wutz
    in drei Modulen schreiben 😕

    Also 1 Header, 1 C für main und 1 C für Unterprogramme

    Ich habe dann nämlich Probleme den Zeiger *suche zu übergeben.

    Hat denn keiner eine Lösung für mein Problem?
    Wie kann ich den Zeiger (*suche) in andere Funktionen übergeben?

    :schland: :schland:



  • Das Geschenk ist geliefert, einpacken musst du es schon selbst.



  • Wutz schrieb:

    Das Geschenk ist geliefert, einpacken musst du es schon selbst.

    Nö, muß er ja nicht wirklich, solange hier Dödel der Farbe des Geschenkpapiers hinterherhecheln - lila oder silber, wird alles gemacht und frei Haus an die Omi geschmissen. 😃



  • pointercrash() schrieb:

    Wutz schrieb:

    Das Geschenk ist geliefert, einpacken musst du es schon selbst.

    Nö, muß er ja nicht wirklich, solange hier Dödel der Farbe des Geschenkpapiers hinterherhecheln - lila oder silber, wird alles gemacht und frei Haus an die Omi geschmissen. 😃

    ist doch schön, dann freut sich omi
    🙂



  • omafan schrieb:

    pointercrash() schrieb:

    Wutz schrieb:

    Das Geschenk ist geliefert, einpacken musst du es schon selbst.

    Nö, muß er ja nicht wirklich, solange hier Dödel der Farbe des Geschenkpapiers hinterherhecheln - lila oder silber, wird alles gemacht und frei Haus an die Omi geschmissen. 😃

    ist doch schön, dann freut sich omi
    🙂

    eben.
    es gibt hier nun mal leider internethobbydidakten, volldeppen, die nicht mal einer alten oma das geschenkpapier gönnen 👎



  • omafreude schrieb:

    eben.
    es gibt hier nun mal leider internethobbydidakten, volldeppen, die nicht mal einer alten oma das geschenkpapier gönnen 👎

    Wooow !!!
    😃



  • Hallo,

    Ich habe mich jetzt ein bisschen informiert und habe die Lösung gefunden.
    Alerdings habe ich jetzt ein neues Problem:

    Das ist ein kleiner Teil von meinem Code bei dem das Problem auftaucht:

    // main.c
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "Elemente.h"
    #include "Elementeninfo.h"
    
    int main()
    {
        Elementeninfo_ausgeben(&Elemente);
        return 0;
    }
    
    // Elemente.h
    
    #ifndef ELEMENTE_H_INCLUDED
    #define ELEMENTE_H_INCLUDED
    
    typdef struct
    {
        char[3] Symbol;
        char[15] Name;
        // ...
    }struct_Elemente;
    
    struct_Elemente Elemente[] = {
        { "H", "Wasserstoff"},
        { "He", "Helium"},
        // ...
    }
    
    // Elementeninfo.h
    
    #ifndef ELEMENTENINFO_H_INCLUDED
    #define ELEMENTENINFO_H_INCLUDED
    
    #include "Elemente.h"
    
    void Elementeninfo_ausgeben(struct_Elemente*);
    
    #endif
    
    // Elementeninfo.c
    
    #include <stdio.h>
    #include "Elementeninfo.h"
    
    void Elementeninfo_ausgeben(struct_Elemente *Element)
    {
        printf("Symbol: %s\nName: %s", Element[0].Symbol, Element[0].Name);
    }
    

    Und da bekomme ich die Fehlermeldungen:

    ➡ [...]main.c|13|multiple definition of `_Elemente'|
    ➡ [...]Elemente.c|8|first defined here|

    Ich habe bei Google irgendwas über extern gelesen und dann auch ausprobiert.. hat aber nicht geklappt. Vll war mein extern ja auch einfach an der falschen
    Stelle.

    Wenn einer von euch die Lösung kennt wär das echt toll...

    Schonmal danke 😃
    Peacemaker 95



  • Dieser Teil

    struct_Elemente Elemente[] = { 
        { "H", "Wasserstoff"}, 
        { "He", "Helium"}, 
        // ... 
    }
    

    verursacht das Problem. Lager das mal in eine c Datei aus.



  • Danke jetzt geht es 😃


Log in to reply