Funktionen werden nicht ausgeführt
-
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.