Funktionen werden nicht ausgeführt



  • Hi Leute,
    ich soll eine Hausaufgabe machen bei der ich in der main datei die grundlegende routine und eine menuefunktion schreiben soll.
    Desweiteren soll ich die Prüfziffer von ISBN-10, ISBN-13 etc berechnen lassen.
    Habe angefangen zu schrieben, das Programm lässt sich ausführen, jedoch werden die Funktionen nicht ausgeführt die ich bereits implementiert habe.
    Wenn möglich helft mir bitte auch mit den Berechnung( auf Array-Elemente zugreifen und mit ihnen rechnen - siehe Kommentare in der isbn.cpp Datei).

    Ich würde mich freuen wenn ihr mir weiter helfen könnten.
    Vielen Dank schonmal.

    P.S.: mein bisheriger Code sieht wie folgt aus:

    main

    #include <iostream>
    #include <string>
    #include "isbn.h"
    
    using namespace std;
    
    int main()
    {
        unsigned short int wahl;// auswahl des menüpunktes
        cout << "Bitte waehlen Sie aus: " << endl;
        cout << endl;
        cout << "1- ISBN-10 Pruefziffer berechnen" << endl;
        cout << "2- ISBN-13 Pruefziffer berechnen" << endl;
        cout << "3- EAN-8 Pruefziffer berechnen" << endl;
        cout << "4- EAN/GTIN-13 Pruefziffer berechnen" << endl;
        cout << "5- GTIN-14 Pruefziffer berechnen" << endl;
        cout << "6- UIC-7 Pruefziffer berechnen" << endl;
        cout << "7- UIC-8 Pruefziffer berechnen" << endl;
        cout << "8- UIC-12 Pruefziffer berechnen" << endl;
        cin >> wahl;
        if(wahl < 1 || wahl > 8)
            cout << "Error" << endl;
        switch(wahl)
        {
            case 1:
                izehn();
                break;
            case 2:
                idrei();
                break;
            case 3:
                //EAN_8();
                break;
            case 4:
                //EAN_13();
                break;
            case 5:
                //GTIN_14();
                break;
            case 6:
                //UIC_7();
                break;
            case 7:
                //UIC_8();
                break;
            case 8:
                //UIC_12();
                break;
        }
    
        system("PAUSE");
        return 0;
    }
    

    isbn.h

    #ifndef ISBN_H
    #define ISBN_H
    
    std::string i; //isbn-nummer ohne prüfziffer
    std::string ire;    //zwischensumme für berechnung der prüfziffer
    int ipruef;    //prüfziffer
    
    #endif //_ISBN_H_
    

    isbn.cpp

    #include <iostream>
    #include <string>
    #include "isbn.h"
    using namespace std;
    
    void izehn()//isbn-10
    {
    	std::string i;   // isbn-nummer ohne prüfziffer
    	std::string ire; //isbn- zwischensumme
    	int ipruef;      //isbn-nummer mit prüfziffer
            cout << "Bitte geben Sie ISBN-Nummer ohne Leer-und Bindestirche ein:";
            cin.getline(i, sizeof(i));
    	i[8] = i[8] * 9;
    	i[7] = i[7] * 8;
    	i[6] = i[6] * 7;
    	i[5] = i[5] * 6;
    	i[4] = i[4] * 5;
    	i[3] = i[3] * 4;
    	i[2] = i[2] * 3;
    	i[1] = i[1] * 2;
    	i[0] = i[0] * 1;
    
            //Summe der Array-Elemente berechnen und Modulo-Operator anwenden
    	cout << ire;
    	return;
    };
    
    //Berechnung noch ändern
    void idrei()//isbn-13
    {
    	std::string i;
    	std::string ire;
    	int ipruef;
    	cout << "Bitte geben Sie ISBN-Nummer ohne Leer-und Bindestirche ein:";
    	cin.getline(i, sizeof(i));
    	i[11] = i[11] * 3;
    	i[10] = i[10] * 1;
    	i[9] = i[9] * 3;
    	i[8] = i[8] * 1;
    	i[7] = i[7] * 3;
    	i[6] = i[6] * 1;
    	i[5] = i[5] * 3;
    	i[4] = i[4] * 1;
    	i[3] = i[3] * 3;
    	i[2] = i[2] * 1;
    	i[1] = i[1] * 3;
    	i[0] = i[0] * 1;
    
            //Summe der Array-Elemente berechnen und Letzte Zahl des Ergebnisses von
    //10 subtrahieren
    	cout << ire;
    	return;
    };
    


  • Es wundert mich stark ,dass das überhaupt Compiliert.

    In deiner isbn.h fehlen sämtliche Funktionsdeklarationen die du in der Main benutzen willst. Deshalb wird da auch nichts ausgeführt.
    Der Compiler sollte eigentlich eine Meldung ála "Implizite deklaration of ...." geben oder sowas.



  • Ich habe die Funktion erst im nachhinein ausgelagert, und dann funktionierte es auch trotz diesen headers. erst als ich idrei() geschrieben hab gings nicht mehr.
    Aber danke für den hinweis. Könntest du mir sagen wie ich das mit dem Header richtig machen könnte (also was ich da alles reinschreiben müsste)?



  • Naja ein Anfang wäre es wenn du die Deklaration der Funktion mit in die Header Datei packst.



  • @Firefighter schrieb:

    Könntest du mir sagen wie ich das mit dem Header richtig machen könnte (also was ich da alles reinschreiben müsste)?

    Sämtliche Funktionsprototypen, auch bekannt als "Signatur".
    Für dein Beispiel würde das wie folgt aussehen:

    #ifndef ISBN_H
    #define ISBN_H
    
    std::string i; //isbn-nummer ohne prüfziffer
    std::string ire;    //zwischensumme für berechnung der prüfziffer
    int ipruef;    //prüfziffer
    
    //Funktionsprototypen
    void izehn();
    void idrei();
    #endif //_ISBN_H_
    

    Zu beachten gilt, dass wenn sich der Funktionskopf ändert (Name, Rückgabewert, Argumentliste), auch die entsprechende Header-Datei angepasst werden muss.

    Edit: Mal wieder zu spät 😞



  • Danke für die schnellen Antworten.

    Könnt ihr mir auch noch sagen wie ich die einzelnen Array-Elemente addieren kann und von diesem Ergebnis die letzte Zahl von 10 subtrahieren kann und auch den Modulo-Operator beim Ergebnis anwenden kann?

    Bekomme jetzt immer die Fhlermeldung das man die Summe nicht in einem String speichern kann und das Moldulo nur bei int-Typen möglich ist.


  • Mod

    Guck dir Mal Schleifen an. Dringend.

    Kain G. schrieb:

    Bekomme jetzt immer die Fhlermeldung das man die Summe nicht in einem String speichern kann

    Wieso möchtest du auch eine Zahl in einer Zeichhenkette speichern? Das Typensystem bewahrt dich hier vor einem Logikfehler und das ist auch gut so.

    und das Moldulo nur bei int-Typen möglich ist.

    Siehe oben.



  • aVoX schrieb:

    Sämtliche Funktionsprototypen, auch bekannt als "Signatur".

    Signatur und Deklaration sind vollkommen unterschiedliche Sachen. Auffälligester Unterschied: Eine Funktionsdeklaration beinhaltet einen Return-Typ, dieser gehört gerade NICHT zur Signatur (jedenfalls bei C-artigen Sprachen).



  • Und globale Variablen gehören natürlich nicht in die Header-Datei (sondern in genau eine Sourcedatei, s. One-Definition-Rule (ODR)), nur die "extern"-Deklarationen.



  • Ich habe jetzt mal versucht alles neu zu strukturieren und auch die rechnungen über schleifen durchzuführen. allerdings ist noch alles in der main- datei (werde ich später auslagern).

    Hier erstmal der Code:

    #include <iostream>
    
    using namespace std;
    
    void i_13()
    {
        int isbn[12]; //isbn ohne pruefziffer
        int zw[12];   //zwischenspeicher
        int zs;       //zwischensumme
        int i;        //index
        int pruefziffer;
    
    //Beispiele: 1. 978344640744-2 ; 2. 978340756277-7 ; 3. 978340415762-4
    	cout << "ISBN-13 Nummer ohne Pruefziffer, Bindestriche und Leerzeichen: ";
    	std::cin >> isbn[12];
    
    	//erste zahl der isbn bearbeiten...
    	i = 0;
        zw[i] = isbn[i] * 1;
        //und in zw abspeichern
    
    	do //mache folgendes....
    	{
            i++; //index um 1 erhöhen
            zw[i] = isbn[i] * 3; //zweite, vierte ... zahl der isbn bearbeiten und abspeichern
            i++; //index um 1 erhöhen
            zw[i] = isbn[i] * 1; //dritte, fünfte ... zahl der isbn bearbeiten und abspeichern
        }while(i != 12);    //...bis der index 12 ist 
    
        zs = 0;  //zs den wert 0 geben
        for(i = 0; i <= 12; i++) //index auf 0 setzen und je schleifendurschlauf um 1 erhöhen bis index = 12 ist
        {
            zs = zs + zw[i]; //zs den wert von aktuellen zs + zw des aktuellen indexes zuweisen
        }
    
        pruefziffer = (10 - zs % 10) % 10; 
    
        cout << pruefziffer << endl; //pruefziffer ausgeben
    
    	cin.clear();
    };
    
    void i_10()
    {
    	int isbn[9];    //Array zur Speicherung der ISBN-Nummer
    	int i = 0;      //index des Arrays
    	int i2 = 0;	
    	int pruef[9];	//Prüfziffer- Zwischenergebniss, 
    	int mul;        //Multiplikator
    	int zw = 0;     //Zwischensumme
    	int pruefziffer; 
    //Beispiele: 1. 340756227-2 ; 2. 349913599-X ; 3. 312932260-4
    	cout << "ISBN-10 Nummer ohne Pruefziffer, Bindestriche und Leerzeichen: ";
    	std::cin >> isbn[9];
    
    	//
    	//Berechnung überprüfen!!!
    	//
    
    	for(mul = 1; mul <= 9; mul++)//erhöht den multiplikator in jedem durchlauf um 1
    		pruef[i] = isbn[i] * mul;	//multipliziert die jeweilige index-zahl mit dem dazugehörigen multilikator
    		i++;						//erhöht den index in jedem durchlauf
    									//im array pruef werden jeweils die produkte abgespeichert
    
    	for(i = 0; i <= 9; i++)		//in jedem durchlauf wird der index von ruef um 1 erhöht
    		zw = zw + pruef[i];		//die aktuelle index- zahl wird zur derzeitige zwischensumme 
    									//addiert und in zw gespeichert
    
    	pruefziffer = zw % 11;			//zwischensumme modulo 11 wird in pruefziffer gespeichert
    
    	if(pruefziffer == 10)           //wenn pruefziffer == 10 wird bei der ausgabe die pruefziffer durch ein X ersetzt.
    		cout << "X" << endl; //ausgabe der isbn und -X
    	else
    		cout << pruefziffer << endl; //ausgabe der isbn und - prufziffer
    
    	cin.clear();
    };
    
    int main(int argc, char* argv)
    {	
    	int wahl;
    
    	cout << "Ihre Wahl bitte:" << endl;
    	cout << "1- ISBN-10" << endl;
    	cout << "2- ISBN-13" << endl;
    	cout << "3- Programm verlassen" << endl;
    	cin >> wahl;
    
    	switch(wahl)
    	{
    		case 1:
    			i_10();
    			break;
    		case 2:
    			i_13();
    			break;
    		case 3:
    			cout << "Programm wird beendet." << endl;
    	};
    
    	system("PAUSE");
    	return 0;
    }
    

    Nun habe ich folgende 3 probleme:
    1. bei der funktion i_10() kommen bei jeder programmausführung unterschiedliche und falsche ergebniss heraus. was kann ich tun? hae leider keinen fehler entdeckt.
    2. beim aufruf der funktion i_13() kommt es fast immer zu einem abbruch durch die ide.
    3. wenn funktion i_13 mal problemlos läuft kommen je nach verwendeter ide unterschiedliche ergebnisse heraus und sind auch bei fast allen beispielen falsch.
    ich bin wirklich ratlos.
    würde mich sehr freuen wenn ihr mir weiter helfen könnt.

    P.S.: Ich benutze die IDEs VSC++ Professional, DEV-CPP und Code::Blocks

    Ich bedanke mich erneut im vorraus :xmas1:



  • Was macht deiner Meinung nach der folgende Code?

    std::cin >> isbn[9];
    


  • damit ist es mir möglich gleich die gesamte zahlenkette in einem array abzuspeichern...


  • Mod

    Kain G. schrieb:

    damit ist es mir möglich gleich die gesamte zahlenkette in einem array abzuspeichern...

    Ähhhm, vergiss meinen obigen Tipp, dass du dir dringend Schleifen angucken sollst. Fang in deinem Lehrmaterial (hoffentlich nicht von Autor J.W.) noch einmal ganz von Vorne an. Dringend. Ist nicht böse gemeint, aber wir können dir hier nicht solche Grundlagenbeibringen. Da dein Kurs noch nicht so weit fortgeschritten ist, schaffst du das auch in ein paar Stunden alles aufzuarbeiten. Sei dir aber bei jedem Abschnitt ganz sicher, alles verstanden zu haben. Und nicht schummeln. Diese Grundlagen sind wichtig, ohne kommst du nicht weiter. Und mit ihnen ist die Aufgabe ein Klacks, keine Qual.



  • Ein Hinweis, wenn du es zum Laufen bekommst: Eine der ISBN-10 Nummern ist fehlerhaft. Also beim Testen nicht gleich die Flinte wegwerfen.


Anmelden zum Antworten