C -Problem mit einem Wiederstandsrechner



  • Einen wunderschönen guten Morgen C++ community,

    ich habe als Hausaufgabe die Aufgabe bekommen einen Wiederstandsrechner zu Programmieren, in C, der die Farbkodierung einließt und anschließend den Wiederstandswert ausgibt inkl. Multiplikator und Toleranz.

    So jetzt bin ich soweit, dass das Programm eine Farbe als string einließt und unter einer Variablen speichert.
    Nur will es nicht die strings untereinander Vergleichen.

    Das Programm bis jetzt:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    //Variablen
    char schwarz1[] = { "schwarz" };
    char braun1[] = { "braun" };
    char rot1[] = { "rot" };
    char orange1[] = { "orange" };
    char gelb1[] = { "gelb" };
    char gruen1[] = { "gruen" };
    char blau1[] = { "blau" };
    char violett1[] = { "violett" };
    char grau1[] = { "grau" };
    char weiss1[] = { "weiss" };
    
    int wertschwarz1 = 1;
    int wertbraun1 = 0;
    int wertrot1 = 0;
    int wertorange1 = 0;
    int wertgelb1 = 0;
    int wertgruen1 = 0;
    int wertblau1 = 0;
    int wertviolett1 = 0;
    int wertgrau1 = 0;
    int wertweiss1 = 0;
    
    int main(int argc, char *argv[])
    {
    
    //Lokale Variablen
        char far1[8];
        char far2[8];
        char far3[8];
        char far4[8];
       // char mull[8]; //Den Multiplikator nahm ich erst mal raus
        char tole[8];
    int jn;
    
       //Goto ende  
    //anfang:   
    
     // Mögliche Farben werden angezeigt
       //Zeigt mögliche Farben ein
        printf("Moegliche Farben:\n"
    "schwarz\n"
    "braun\n"
    "rot\n"
    "orange\n"
    "gelb\n"
    "gruen\n"
    "blau\n"
    "violett\n"
    "grau\n"
    "weiss\n"
    "silber\n"
    "gold\n"
    "Bitte beachten sie die !SCHREIBWEISE!\n");
    printf("\n" "\n" "\n");
    
    //Farbring 1 abfragen
    printf("Bitte Farbe Ring 1 eingeben: ");
    fgets(far1, 8, stdin);
    fflush(stdin);
    
    //Farbring 2 abfragen
    printf("Bitte Farbe Ring 2 eingeben: ");
    fgets(far2, 8, stdin);
    
    //Farbring 3 abfragen
    fflush(stdin);
    printf("Bitte Farbe Ring 3 eingeben: ");
    fgets(far3, 8, stdin);
    
    //Farbring 4 abfragen
    fflush(stdin);
    printf("Bitte Farbe Ring 4 eingeben: ");
    fgets(far4, 8, stdin);
    
    //Multiplikator abfragen
    //fflush(stdin);
    //printf("Bitte Farbe Multiplikator eingeben: ");
    //fgets(mull, 8, stdin);
    //fflush(stdin);
    
    //Toleranz abfragen
    printf("Bitte Farbe Toleranz eingeben: ");
    fgets(tole, 8, stdin);
    fflush(stdin);
    
    // Kontrolle der Eingabenmain
    printf("\nFarbe Ring1 %s \n",far1);
    printf("\nFarbe Ring2 %s \n",far2);
    printf("\nFarbe Ring3 %s \n",far3);
    printf("\nFarbe Ring4 %s \n",far4);
    //printf("\nFarbe Multiplikator %s \n",mull);
    printf("\nFarbe Toleranz %s \n",tole);
    printf("\nSind alle Farben richtig eingegeben?(J=0/N=1)");
    scanf("%d", &jn);
    fflush(stdin);
    
    //Wenn falsch erneute Eingabe
    //if (jn==1)
    //goto anfang;
    //else
    
    //Weißt den Wert den Variablen zu
    if((strcmp(schwarz1, far1)) == 0)
    printf("Du hast schwarz gewaehlt\n"), wertschwarz1 = 0;
    else
    if((strcmp(braun1, far1)) == 0)
    printf("Du hast braun gewaehlt\n"), wertbraun1 = 1;
    else
    if((strcmp(rot1, far1)) == 0)
    printf("Du hast rot gewaehlt\n"), wertrot1 = 2;
    else
    if((strcmp(orange1, far1)) == 0)
    printf("Du hast orange gewaehlt\n"), wertorange1 = 3;
    else
    if((strcmp(gelb1, far1)) == 0)
    printf("Du hast gelb gewaehlt\n"), wertgelb1 = 4;
    else
    if((strcmp(gruen1, far1)) == 0)
    printf("Du hast gruen gewaehlt\n"), wertgruen1 = 5;
    else
    if((strcmp(blau1, far1)) == 0)
    printf("Du hast blau gewaehlt\n"), wertblau1 = 6;
    else
    if((strcmp(violett1, far1)) == 0)
    printf("Du hast violett gewaehlt\n"), wertviolett1 = 7;
    else
    if((strcmp(grau1, far1)) == 0)
    printf("Du hast grau gewaehlt\n"), wertgrau1 = 8;
    else
    if((strcmp(weiss1, far1)) == 0)
    printf("Du hast weiss gewaehlt\n"), wertweiss1 = 9;
    
     //Test wegen int Variablen und deren Werte
     printf("Farbe schwarz hat den Wert 0 und unbeschrieben 1. Der ist der Wert:%d\n", wertschwarz1);
     printf("Farbe braun hat den Wert 1 und unbeschrieben 0. Der Wert ist:%d\n", wertbraun1);
     printf("Farbe rot hat den Wert 2 und unbeschrieben 0. Der Wert ist:%d\n", wertrot1);
     printf("Farbe orange hat den Wert 3 und unbeschrieben 0. Der Wert ist:%d\n", wertorange1);
     printf("Farbe gelb hat den Wert 4 unbeschrieben 0. Der Wert ist:%d\n", wertgelb1);
     printf("Farbe guen hat den Wert 5 unbeschrieben 0. Der Wert ist:%d\n", wertgruen1);
     printf("Farbe blau hat den Wert 6 unbeschrieben 0. Der Wert ist:%d\n", wertblau1);
     printf("Farbe violett hat den Wert 7 unbeschrieben 0. Der Wert ist:%d\n", wertviolett1);
     printf("Farbe grau hat den Wert 8 unbeschrieben 0. Der Wert ist:%d\n", wertgrau1);
     printf("Farbe weiss hat den Wert 9 unbeschrieben 0. Der Wert ist:%d\n", wertweiss1); 
      system("PAUSE");
     //Test ende..!
    

    Bei dem Test wird immer der Wert 0 ausgegeben außer bei schwarz da 1, nur sollen die wert von 0-9 zugewiesen werden..? 😕 ?

    Frage 1:
    Zusetzlich wird ich gerne kein "goto" drin haben gibt es auch noch andere
    Möglichkeiten bei einer Falsch eingabe zum Anfang zurück zuspringen?

    Frage 2:
    Wie kann ich die Eingabe mit einem anderen string Vergleichen und wenn der Vergleich richtig ist soll der Verglichenen Variable ein bestimmter Wert zugewiesen werden. Wie mach ich das?



  • Hallo Backpacker,

    mag pedantisch klingen, aber es heißt "Widerstand". Das kommt von "entgegenwirken", nicht von "Stehaufmännchen".

    Du bist im Forum "C# und .NET" gelandet. Deshalb kann ich nur wenig wirklich hilfreiches zu Deiner Frage bezüglich C beitragen. Was mir aber auffällt:

    Θ Der initale Block von Definitionen in char[] und int scheint mir besser in einer einzigen Enumeration aufgehoben.
    Stichwort: enum.
    Θ Bei Anzeige der Möglichkeiten, Eingabe, Kontrolle und Zuweisung sehe ich jeweils mehrfach wiederholten Code. Hier wären Schleifen angebracht.
    Stichworte. for, while.
    Θ Die Zuweisung sieht schon ziemlich umfangreich aus, kümmert sich aber dennoch nur um den ersten Ring. Sollten alle Ringe auf diese Weise bearbeitet werden, wird sie also noch anwachsen.
    Das führt uns mit Nachdruck zurück zu den Schleifen.
    Θ Ich verstehe nicht, was Du mit dem letzten printf-Block aussagen willst.

    Zu Frage1: Ja, üblicherweise benutzt man auch hier wieder eine Schleife.

    Zu Frage2: strcmp hast Du schon benutzt, die bedingte Abarbeitung von Anweisungen mit "if" auch. Das ist genau, was Du brauchst.



  • Also abgesehen davon, dass du im falschen Unterforum bist (das hier ist C# und nicht C), tut fflush(stdin) nicht das tut, was du willst 😉

    Alternative zu fflush(stdin):

    void clearstdin() {
        int c;
        while ((c = getchar()) != EOF && c != '\n');
    }
    

    Bzgl. deiner goto-Vermeidung: Das kannst du mit einer Schleife machen.. also z.B.

    int jn = 1;
    do {
        //Dein Code zum einlesen
    
        scanf_s("%d", &jn);   //Nimm lieber scanf_s
    } while(jn == 1);
    

    Was dein Hauptproblem angeht: ich verstehe nicht so ganz was du vorhast und wie was funktionieren soll. Es scheint Code zu fehlen, da du immer nur 'far1' abprüfst.



  • Erstmal danke für die schnellen Antworten (und der Deutsch lektion 😃 ) zu dieser frühen Stunde.

    -ich entschuldige mich auch dafür das das Thema hier falsch ist nur bin ich seit heute 7:25 angemeldet und hab noch keine Ahnung wie man hier alles richtig macht :p -( Wie verschiebe ich das Thema jetzt?? )-

    Nun zu meiner Frage:

    Der letzte "printf"-Block ist ausschließlich zum test, ob er den Variablen Werte zuweißt. (Ich wüste nicht wie ich es sonst überprüfen sollte..Ideen?)

    Ich bin neu auf dem Programmiergebiet und blick da auch noch nicht richtig durch. Deswegen würde ich gerne wissen wie ich die while schleife beim vergleich einsetzen kann.
    (Ich habe das bereits Probiert nur hat es nicht Funktioniert 😞 )

    #include <stdio.h>
    #include <string.h>
    
    int wertschwarz1 = 1;
    int wertbraun1 = 0;
    
    int main ()
    {
      char schwarz1[] = "schwarz";
      char braun1[] = "braun";
      char Ring1Input[80];
      do {
         printf ("Geben sie die Farbe des ersten Rings ein: ");
         gets (Ring1Input);
         {
         if (strcasecmp (schwarz1,Ring1Input) 
      }
         while (strcmp (schwarz1,Ring1Input) != 0);
      puts ("Sie haben schwarz gewaeht"), wertschwarz1 = 0;
    }
    do {
       {
       if (strcasecmp (braun1,Ring1Input) 
      }
       while (strcasecmp (braun1,Ring1Input) != 0;
          puts ("Sie haben braun gewaehlt"), wertbraun1 = 1;
    

    @GPC : Ja da fehlt Code, da ich bei der Überprüfung der ersten Farbe (far1) nicht weiter komme bzw. Funktioniert es einfach nicht 😃

    So nun habe ich eine neue/weitere Frage und zwar:
    Wie kann ich den Vergleich zwischen den "möglichen Farben" und der Eingabe des Benutzers machen? (Mit möglichst wenig schreib aufwand, den das was ich da gemacht habe war sehr Zeit intensiv)

    PS: Ich habe es grade probiert mit der while-Schleife nur versteh ich nicht wie man wieder zum Anfang springen kann???



  • Den Thread wird ein zuständiger Moderator verschieben, du kannst also nur warten 😉

    Ich habe mir mal die Mühe gemacht und ein Grundgerüst für dich geschrieben, damit du exemplarisch siehst, wie sowas aufgebaut sein könnte. Achtung, das braucht C99, damit es kompiliert (wegen bool und wegen den Variablendeklarationen).
    Ich bin auch selbst nicht mehr so richtig fit in C und man könnte das bestimmt noch besser schreiben.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    
    //Globale Variablen
    const int MAX_FARBE_CHARS = 8;
    const int ANZAHL_RINGE = 4;
    const int ANZAHL_FARBEN = 3;
    
    //Alle Farben in einem Array ablegen
    const char * const alle_farben[ANZAHL_FARBEN] = { "schwarz", "rot", "gold" };
    
    //Alternative, wenn du die Farben auch mal einzeln brauchst:
    //const char * const schwarz = "schwarz";
    //const char * const rot = "rot";
    //const char * const gold = "gold";
    //const char * const alle_farben[ANZAHL_FARBEN] = { schwarz, rot, gold };
    
    //Hilfsfunktionen
    
    //Eingabepuffer von '\n' etc. befreien
    void clear_stdin() {
        int c;
    	while ((c = getchar()) != EOF && c != '\n');
    }
    
    //Überprüfen, ob eine eingegebene Farbe existiert
    bool existiert_farbe(const char * const farbe) {
    	bool existiert = false;
    
    	for (int i = 0; i < ANZAHL_FARBEN; ++i) {
    		if (strcmp(alle_farben[i], farbe) == 0) {	//strncmp wäre hier auch besser
    			existiert = true;
    			break;
    		}
    	}
    
    	return existiert;
    }
    
    //Farbe einlesen
    void lese_farbe(char *farbe) {
    	fgets(farbe, MAX_FARBE_CHARS, stdin);
    
    	int length = strlen(farbe);
    	//Wenn fgets Platz im Buffer hat, dann liest es das '\n' mit
    	//Bei rot ist das z.B. der Fall. Bei Schwarz nicht. Dann müssen wir den Buffer manuell vom '\n' befreien
    	if (farbe[length - 1] == '\n') 
    		farbe[length - 1] = '\0';
    	else
    		clear_stdin();
    }
    
    int main(int argc, char **argv) {
    	puts("Moegliche Farben:");
    	for (int i = 0; i < ANZAHL_FARBEN; ++i) {
    		puts(alle_farben[i]);
    	}
    	puts("Bitte beachten sie die !SCHREIBWEISE!");
    
    	char ring_farben[ANZAHL_RINGE][MAX_FARBE_CHARS] = { '\0' };		//Hier stehen die Benutzereingaben für die Ringfarben drin
    	char toleranz[MAX_FARBE_CHARS] = { '\0' };	//Toleranzfarbe
    
    	int jn = 1;
    	do {
    		for (int i = 0; i < ANZAHL_RINGE; ++i) {
    			do {
    				printf("\nBitte Farbe Ring %d eingeben: ", i + 1);
    				lese_farbe(ring_farben[i]);
    			} while (existiert_farbe(ring_farben[i]) == false);
    
    			printf("Farbe Ring %d: %s \n", i + 1, ring_farben[i]);
    		}
    
    		do {
    			printf("\nBitte Toleranz eingeben: ");
    			lese_farbe(toleranz);
    		} while (existiert_farbe(toleranz) == false);
    		printf("\nFarbe Toleranz %s \n", toleranz);
    
    		puts("\nSind alle Farben richtig eingegeben?(J=0/N=1)");
    		scanf_s("%d", &jn);
    		clear_stdin();
    	} while (jn != 0);
    
    	return 0;
    }
    


  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Funktioniert das auch mit Geany Portable?
    Das ist nämlich das Programm das wir dafür nutzen sollen..



  • Das hängt davon ab, welchen Compiler du bei Geany eingebunden hast.

    Geany ist eigentlich nur der Texteditor.



  • Man kann das ja auch ohne großen Aufwand für C89 umschreiben. Aus bool wird int und Variablen werden eben beim Funktionsanfang deklariert.


Anmelden zum Antworten