Benötige Hilfe



  • Hi!

    Bin per google aufs forum gestossen. Vllt kann mir ja einer helfen.
    Ich bin student und muss was in C++ machen. Habs auch hingekriegt, aber irgendwie krieg ich paar sachen nicht hin.
    wäre nett wenn mir einer behilflich wäre.

    1. (zeile 28)
    ich möchte das, wenn bei der matrikelnummer buchstaben eingegeben werden, die Fehlermeldung "Keine gueltige Matrikelnummer" sofort kommt, ohne das nach eine Prüfziffer verlangt wird.

    2. (zeile 51)
    eigentlicht sollte die fehlermeldung "Keine gueltige Pruefziffer(zeile 71)" erscheinen, aber irgendwie rechnet er trotzdem weiter, auch wenn man buchstaben als prüfziffer eingibt.

    #include<stdio.h>
    #include<stddef.h>
    #include<ctype.h>
    #include<string.h>
    #include<stdlib.h>
    
    int z111111 (const char *matrikelnummer, int *pruefziffer)
    	{
    		int i,a;
    		int n; /*Anzahl der Zeichen*/
    		int matrikelziffer[50];
    		int summeeinzelprodukte=0, modulo10;
    		int gewicht=3;
    	/*Fehlerueberpruefung: Ob die Matrikelnummer kein NULL-Zeiger ist*/
    		if (matrikelnummer == NULL || matrikelnummer == "")
    		{
    		printf("Keine Matrikelnummer eingegeben");
    		return 2;
    
    		}
    		else
    		{
    			n = strlen(matrikelnummer);
    		for(i = 0; i < n; i++)
    		{
    	/*Ueberpruefung ob die eingegebene Matrikelnummer ausschließlich aus Zahlen und keinen Buchstaben besteht*/
    		char mn = matrikelnummer[i];
    			a = isdigit(mn);
    
    			if(a == 0)
    			{
    				printf("Keine gueltige Matrikelnummer\n");
    				return 2;
    
    								}
    		}
    	/*Einlesen der einzelnen Ziffern der Matrikelnummer und Umwandlung von char in int*/
    		if(a != 0)
    		{
    			for(i = 0; i < n; i++)
    			{
    				char mn = matrikelnummer[i];
    				matrikelziffer[i] = atoi(&mn);
    			}
    		}
    	/*Fehlerueberpruefung: Pruefziffer darf nicht NULL, die Anzahl der Zeichen in der Matrikelnummer groeßer als 1 und alle Zeichen muessen Ziffern sein*/
    
    		if(pruefziffer != 0 && n >= 1 && a != 0  )
    		{
    	/*Pruefziffernberechnung*/
    		for(i=n-1;i>=0;i--)
    		{
    			summeeinzelprodukte = summeeinzelprodukte + (matrikelnummer[i]*gewicht);
    			if(gewicht == 3)
    			{
    				gewicht = 1;
    			}
    			else
    			{
    				gewicht = 3;
    			}
    		}
    		modulo10 = summeeinzelprodukte % 10;
    		*pruefziffer = (10 - modulo10) % 10;
    	}
    else
    {
    	printf("Keine gueltige Pruefziffer\n");
    	return 0;
    
    }
    
    	/*Tabelle fuer die grafische Ausgabe*/
    	char zahlen[9] [10] [11]
    	={
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"},
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"},
    {"##      ##","#### #####","##      ##","##      ##","## #######","##      ##","##      ##","##      ##","##      ##","##      ##"},
    {"## #### ##","#### #####","####### ##","####### ##","## ## ####","## #######","## #######","###### ###","## #### ##","## #### ##"},
    {"## #### ##","#### #####","##      ##","##      ##","##      ##","##      ##","##      ##","####    ##","##      ##","##      ##"},
    {"## #### ##","#### #####","## #######","####### ##","##### ####","####### ##","## #### ##","#### #####","## #### ##","####### ##"},
    {"##      ##","#### #####","##      ##","##      ##","##### ####","##      ##","##      ##","### ######","##      ##","##      ##"},
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"},
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"},
    
    	};
    	/*Ueberpruefung ob es die eigene Matrikelnummer ist, wenn ja, dann diese grafisch ausgeben, wenn nein, dann die errechnete Pruefziffer grafisch ausgeben*/
    	if (strcmp(matrikelnummer, "111111")==0)
    	{
    	for (i=0; i<9; i++)
    	{
    		printf("%s %s %s %s %s %s\n",zahlen[i][1],zahlen[i][1],zahlen[i][1],zahlen[i][1],zahlen[i][1],zahlen[i][1]);
    	}
    	}
    	else
    {	
    
    		for (i=0; i<9; i++)
    		{
    			printf("%s\n",zahlen[i][*pruefziffer]);
    		}
    			;
    			return 1;
    
    	}
    
    	}
    	return 0;
    
    }
    
    void main()
    {
    	char matrikelnummer[7];
    	int pruefziffer;
    
    		printf("Eingabe der Matrikelnummer: ");
    		scanf("%s", &matrikelnummer);
    		printf("Eingabe der Pruefziffer: ");
    		scanf("%i", &pruefziffer);
    		z111111(matrikelnummer, &pruefziffer);
    
    }
    

    ich bedanke mich im vorraus.



  • 1. dafür musst du deine funktion "zllllllll" (was auch immer das bedeuten soll... 😕 ) in mindestens zwei teile aufspalten: im ersten teil prüfst du die gültigkeit der matrikelnummer, und erst wenn im ersten teil alles glatt lief, fragst du nach der prüfziffer, und überprüfst erst dann die gültigkeit dieser prüfziffer.
    musst halt bissl das ganze umstrukturieren, mit strg+C strg+v sollte es in 15 sekunden klappen...

    2. habs zwar nie benutzt, in der doku seh ich aber:

    int isdigit( int c );

    da müsste der compiler doch was meckern, wenn du ihn mit "char mn" fütterst oder? ansonsten lass einfach mit cout<<a ausgeben, und shau dir an, was die funktion "isdigit" bei den einzelnen chars deiner zeichenkette da überhaupt zurückgibt, vielleicht hilfts...



  • das als C++ zu bezeichnen ist schon fast ne Frechheit ^^



  • ajinsan schrieb:

    Hi!
    Ich bin student und muss was in C++ machen.

    Der von Dir gepostete Sourcecode ist lupenreines C. Wenn die Aufgabe wirklich C++ erwartet ist diese Lösung falsch.

    C und C++ sind zwei sehr unterschiedliche Sprachen mit der historisch bedingten Besonderheit, daß aktuelle C++-Compiler immer auch noch C compilieren können. Daher kann ein von einem C++-Compiler sauber compilierter Code nach wie vor ebensogut reines C sein (wie in dem Beispiel)



  • beim überfliegen hab ich nur ansi c gesehen -> verschieben

    und so nebenbei

    int main(void) benutzen

    #include <stdio.h> 
    #include <stddef.h> 
    #include <ctype.h> 
    #include <string.h> 
    #include <stdlib.h> 
    
    int z111111 (const char *matrikelnummer, int *pruefziffer) 
        { 
            int i,a; //Bitte eindeutige bezeichnungen
            int n; /*Anzahl der Zeichen*/ 
            int matrikelziffer[50]; //so groß sind eure martrikelnummern oO ?
            /*
                Du solltest mehr kommentare einbauen, ich habe dein programm
                noch nie gesehen und hab kein schimmer was du mit den nächsten
                variablen machen willst
            */
            int summeeinzelprodukte=0, modulo10;
            int gewicht=3; 
    
        /*Fehlerueberpruefung: Ob die Matrikelnummer kein NULL-Zeiger ist*/ 
        //Selbsterklärender Code sollte man nicht Kommentieren
            if (matrikelnummer == NULL || matrikelnummer == ""){ 
                printf("Keine Matrikelnummer eingegeben"); 
                return 2; 
            } else { 
                n = strlen(matrikelnummer); 
                for(i = 0; i < n; i++) { 
        /*Ueberpruefung ob die eingegebene Matrikelnummer ausschließlich aus Zahlen und keinen Buchstaben besteht*/ 
        //siehe oben
                char mn = matrikelnummer[i]; 
                a = isdigit(mn); 
    
                if(a == 0) { 
                    printf("Keine gueltige Matrikelnummer\n"); 
                    return 2; 
               } 
            } 
        /*Einlesen der einzelnen Ziffern der Matrikelnummer und Umwandlung von char in int*/ 
            if(a != 0) 
            { 
                for(i = 0; i < n; i++) 
                { 
                    char mn = matrikelnummer[i]; 
                    matrikelziffer[i] = atoi(&mn); 
                } 
            } 
        /*Fehlerueberpruefung: Pruefziffer darf nicht NULL, die Anzahl der Zeichen in der Matrikelnummer groeßer als 1 und alle Zeichen muessen Ziffern sein*/ 
    
            if(pruefziffer != 0 && n >= 1 && a != 0  ) 
            { 
        /*Pruefziffernberechnung*/ 
            for(i=n-1;i>=0;i--) 
            { 
                summeeinzelprodukte = summeeinzelprodukte + (matrikelnummer[i]*gewicht); 
                if(gewicht == 3) 
                    gewicht = 1; 
                else 
                    gewicht = 3; 
            } 
            modulo10 = summeeinzelprodukte % 10; 
            *pruefziffer = (10 - modulo10) % 10; 
        } 
    else 
    { 
        printf("Keine gueltige Pruefziffer\n"); 
        return 0; 
    
    } 
    
        /*Tabelle fuer die grafische Ausgabe*/ 
        char zahlen[9] [10] [11] 
        ={ 
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"}, 
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"}, 
    {"##      ##","#### #####","##      ##","##      ##","## #######","##      ##","##      ##","##      ##","##      ##","##      ##"}, 
    {"## #### ##","#### #####","####### ##","####### ##","## ## ####","## #######","## #######","###### ###","## #### ##","## #### ##"}, 
    {"## #### ##","#### #####","##      ##","##      ##","##      ##","##      ##","##      ##","####    ##","##      ##","##      ##"}, 
    {"## #### ##","#### #####","## #######","####### ##","##### ####","####### ##","## #### ##","#### #####","## #### ##","####### ##"}, 
    {"##      ##","#### #####","##      ##","##      ##","##### ####","##      ##","##      ##","### ######","##      ##","##      ##"}, 
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"}, 
    {"##########","##########","##########","##########","##########","##########","##########","##########","##########","##########"}, 
    
        }; 
        /*Ueberpruefung ob es die eigene Matrikelnummer ist, wenn ja, dann diese grafisch ausgeben, wenn nein, dann die errechnete Pruefziffer grafisch ausgeben*/ 
        if (strcmp(matrikelnummer, "111111")==0) 
        for (i=0; i<9; i++) 
            printf("%s %s %s %s %s %s\n",zahlen[i][1],zahlen[i][1],zahlen[i][1],zahlen[i][1],zahlen[i][1],zahlen[i][1]); 
        else{         
            for (i=0; i<9; i++) 
                printf("%s\n",zahlen[i][*pruefziffer]); 
    
            return 1; 
    
        } 
    return 0; 
    
    } 
    
    int main(void) 
    { 
        char matrikelnummer[7]; 
        int pruefziffer; 
    
        printf("Eingabe der Matrikelnummer: "); 
        scanf("%s", &matrikelnummer); 
        printf("Eingabe der Pruefziffer: "); 
        scanf("%i", &pruefziffer); 
        z111111(matrikelnummer, &pruefziffer); 
    
        return 0;
    
    }
    

    hab bissel formatiert damits leserlicher wird



  • ...und bei integer werten pointer zu missbrauchen bringts echt nich, der pointer ist genau so gros, wie der wert selbst, warum nich gleich by value passen?



  • (D)Evil schrieb:

    das als C++ zu bezeichnen ist schon fast ne Frechheit ^^

    ajjjj schrieb:

    ajinsan schrieb:

    Hi!
    Ich bin student und muss was in C++ machen.

    Der von Dir gepostete Sourcecode ist lupenreines C. Wenn die Aufgabe wirklich C++ erwartet ist diese Lösung falsch.

    Ich vermute dass es die gleiche Aufgabe ist wie hier, dann fordert sie ANSI C.

    .. und wenn ich das richtig sehe, sind die Fragen (zu 2.)) noch C-lastig. Ich habe keine Ahnung, wie die Fehlerbehandlung bei scanf ist -> C-Forum

    Gruß
    Werner



  • "...die Datei mit dem Quelltext
    Ihrer Funktions-definition in ANSI C und eine Header-Datei mit dem ANSI C
    Funktionsprototyp. Beide Dateien sollen denselben Namen wie Ihre Funktion haben und
    auf der obersten Verzeichnisebene der CD-ROM liegen, wobei die Datei mit der
    Funktionsdefinition die Endung ".cpp" und die Header-Datei die Endung ".h" haben
    muss. Die ".cpp"-Datei kann außer der Definition der Funktion <fname> weitere
    Funktionen enthalten, wenn diese für Ihre Implementierung benötigt werden."

    Ansi-C in *.cpp Datei - richtig zukunftsorientiert! 😃



  • vielen dank an alle antworten.
    ja ist ansi c,
    das fach in unsere uni heisst aber c++, von daher hab ich mich jetzt vertan. sry das ich im falschen forum gepostet hab.

    @Werner Salomon

    lol, ja genau die aufgabe ist es. da war wohl jemand genauso clever wie ich und hat sich hier nach hilfe umgeschauen xD.


Anmelden zum Antworten