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.
-
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...
-
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.