Hilfe bei einer Funktion
-
anscheinend weiß keiner eine Lösung für mein Problem. Ich selbst finde keins.
Falls doch noch einer was weiß dann schreib BITTE
-
Problem mit der Eingabe ist beseitigt. Funktioniert aber immer noch nicht
schaut euch ihn bitte mal an und sagt mir was falsch daran is. Laut BorlandBuilder ist irgendwo einfehler in den If schleifen die geht nicht ins erste else rein//subtraktion void sub(void) { int z1; int z2; int summe; int uebertrag=0; int i=strlen(zeichen[1]); if(zeichen[1][0]=='-') { add(); } else { if(zeichen[0]>=zeichen[1]) { for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; z2=zeichen[1][i]-'0'; summe=z1-z2+uebertrag; uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout << ergebnis; } else { for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; z2=zeichen[1][i]-'0'; summe=z2-z1+uebertrag; uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout << "-" << ergebnis; } } getchar(); }
-
Da du uns nicht mehr info geben willst werde ich mal etwas raten.
void sub(void) { int z1; int z2; int summe; int uebertrag=0; int i=strlen(zeichen[1]); // aha zeichen ist also ein array von strings if(zeichen[1][0]=='-') { add(); // aha ein Vorzeichen } else { // wirklich subtrahieren if(zeichen[0]>=zeichen[1]) { // da stimmt was nicht // zeichen[0] und zeichen[1] sind ja strings // kann mann die so einfach auf >= abfragen ? // eher nicht. // vielleicht sind's aber doch std::string und das strlen() oben war falsch ? for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; // aha aus char mach int z2=zeichen[1][i]-'0'; summe=z1-z2+uebertrag; uebertrag=summe/10; ergebnis[i]=summe%10+'0'; // jetzt verstehe ich da werden // strings subtrahiert // ich geb auf das hätte er auch gleich sagen können // der fehler liegt wahrscheinlich sowieso am stringvergleich ..... }
-
Ihr müsst mir nur sagen was ich machen soll. Da ja keiner geantwortet hab wusste ich nicht was ich noch machen soll.
//subtraktion void sub(void) { int z1; //int aller benötigten Sachen int z2; int summe; int uebertrag=0; int i=strlen(zeichen[1]); if(zeichen[1][0]=='-') //schaut ob im zweiten Array Zeichen ein Minus ist { add(); //wenn ja benutze die Additionsfunktion } else //falls nicht { if(zeichen[0]>=zeichen[1]) //sollte die 1te Zahl größer sein als die 2te { for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //dient zur berechnung ist eine // additionsfunk die Funktioniert z2=zeichen[1][i]-'0'; //nur umgeschrieben laut tipp eines //ehemaltigen TAI´ler summe=z1-z2+uebertrag; //dann Zahl1-Zahl2 in SUmme speichern uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout << ergebnis; //ergebnis } else //wenn2te größer 1st { //das funktioniert for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //Hier das gleiche wie oben z2=zeichen[1][i]-'0'; summe=z2-z1+uebertrag; //Zahl2-Zahle1 uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout << "-" << ergebnis; //ergebnis mit Minus davor } } getchar(); }Für mehr Info´s einfach fragen. auf wunsch kann ich euch auch den ganzen code schicken
-
der ganze code wär cool :xmas1:
-
//--------------------------------------------------------------------------- #include <iostream.h> #include <conio.h> char zeichen[2][21]; char ergebnis[100]; void auswahl(void); void eingabe(void); void add(void); void sub(void); void mult(void); void div(void); void ausgabe(void); int main() { auswahl(); return 0; } //FUNKTIONEN //Auswahl void auswahl(void) { int i; cout << "1.Addition\n\n2.Subtraktion\n\n3.Multiplikation\n\n4.Division"; cin >>i; switch (i) { case 1 : eingabe(); add(); break; case 2 : eingabe(); sub(); break; case 3 : eingabe(); mult(); break; case 4 : eingabe(); div(); break; default:cout << "unknown command" ; } } //Eingabe void eingabe (void) { cout<< "zahl1: "; gets(zeichen[0]); cout << "\nzahl2: "; gets(zeichen[1]); return; } //addition void add(void) //additionsfunkton { int z1; int z2; int summe; int uebertrag=0; int p=strlen(zeichen[0]); int q=strlen(zeichen[1]); p--; q--; for (int i=19;i>=0;i--) { if (p>=0) { z1=zeichen[0][p]-'0'; } else { z1=0; } if (q>=0) { z2=zeichen[1][q]-'0'; } else { z2=0; } summe=z1+z2+uebertrag; uebertrag=summe/10; ergebnis[i]=summe%10+'0'; p--; q--; } cout << ergebnis; getchar(); } //subtraktion void sub(void) { int z1; //int aller benötigten Sachen int z2; int summe; int uebertrag=0; int i=strlen(zeichen[1]); if(zeichen[1][0]=='-') //schaut ob im zweiten Array Zeichen ein Minus ist { add(); //wenn ja benutze die Additionsfunktion } else //falls nicht { if(zeichen[0]>=zeichen[1]) //sollte die 1te Zahl größer sein als die 2te { for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //dient zur berechnung ist eine additionsfunk z2=zeichen[1][i]-'0'; //nur umgeschrieben summe=z1-z2+uebertrag; //dann Zahl1-Zahl2 in SUmme speichern uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout << ergebnis; //ergebnis } else //wenn2te größer 1st { //das funktioniert for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //Hier das gleiche wie oben z2=zeichen[1][i]-'0'; summe=z2-z1+uebertrag; //Zahl2-Zahle1 uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout << "-" << ergebnis; //ergebnis mit Minus davor } } getchar(); } void mult(void) { eingabe(); } void div(void) { eingabe(); } void ausgabe (void) { }
-
Ok jetzt ist es klar. zeichen sind char **.
es muss heissenif( strcmp(zeichen[0],zeichen[1])>= 1 ){ //sollte die 1te Zahl größer sein als die 2te // funktioniert wahrscheinlich nur wenn die strings gleich lang sindKurt
-
gute danke funktioniert. Etz weis ich nur net wie ich des anstellen soll das man verschieden lange zahlen subrahieren kann. Hat da jemand eine Idee und kann mir da weng helfen?
//############################################################## //## Subtraktionsfunktion ## //############################################################## void sub(void) { int z1; //int aller benötigten Sachen int z2; int summe; int uebertrag=0; int i=strlen(zeichen[1]); if(zeichen[1][0]=='-') //schaut ob im zweiten Array Zeichen ein Minus ist { add(); //wenn ja benutze die Additionsfunktion } else //falls nicht { if(strcmp(zeichen[0],zeichen[1])>=1) //sollte die 1te Zahl größer sein als die 2te { for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //dient zur berechnung ist eine additionsfunk z2=zeichen[1][i]-'0'; //wandelt char in int variablen um summe=z1-z2+uebertrag; //dann Zahl1-Zahl2 in SUmme speichern uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout <<"\n\nIhr Ergebnis lautet: " << ergebnis; //ergebnis } else //wenn2te größer 1st { //das funktioniert for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //Hier das gleiche wie oben z2=zeichen[1][i]-'0'; summe=z2-z1+uebertrag; //Zahl2-Zahl1 uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout <<"\n\nIhr Ergebnis lautet: " << "-" << ergebnis; //ergebnis mit Minus davor } } getchar(); }
-
Du kannst die zu kurzen Zahlen vor der Rechnung ans Ende des Arrays schieben und vorne mit Nullen auffüllen - danach ist wieder die feste-Länge-Version anwendbar.
(übrigens wäre es eine gute Idee, vor dem Aufruf der add()-Funktion das Minus wegzustreichen)
-
und wie mach ich des?
Du kannst die zu kurzen Zahlen vor der Rechnung ans Ende des Arrays schieben und vorne mit Nullen auffüllen - danach ist wieder die feste-Länge-Version anwendbar
des mit den Minus des woll ma machen. schauen aber erstmal das wir das programm zum laufen bringen. Haben bei der additions funktion auch noch die 0´ln vorm ergebnis
-
int l=strlen(zahlen[0]); //Länge bestimmt memmove(zahlen[0]+20-l,zahlen[0],l); //Verschieben memset(zahlen[0],'0',20-l); //Auffüllen(Ob die Indizes alle korrekt sind, kann ich nicht garantieren)
-
memmove(zeichen[0]+20-l,zeichen[0],l); //Verschieben memset(zeichen[0],'0',20-l); //Auffüllendie memmove und memset befehle hatten wir noch nicht daher verstehe ich nicht ganz wo ich die reinsetzen soll.(habe aus deinen zahlen mal zeichen gemacht weil so unsere arrays heißen
erklärung wäre evtl hilfreich damit ich versteh wo ich das reinsetzen soll iin meine sub funktion
-
Ich würde das dort machen wo zeichen[0] und zeichen[1] ihre werte erhalten.
-
also bei der eingabe funkt des schaut etza so aus
void eingabe (void) { cout<< "\nGeben Sie bitte Ihre erste Zahl ein: "; gets(zeichen[0]); cout << "\nGeben Sie bitte Ihre zweite Zahl ein: "; gets(zeichen[1]); int l=strlen(zeichen[0]); //Länge bestimmt int k=strlen(zeichen[1]); memmove(zeichen[0]+20-l,zeichen[0],l); //Verschieben memset(zeichen[0],'0',20-l); //Auffüllen memmove(zeichen[1]+20-l,zeichen[0],l); //Verschieben memset(zeichen[1],'0',20-l); //Auffüllenmuss ich ja mit beiden machen da ja auch evtl mal die zweite größer sein kann. aba das funktioniert nich so richtig.
hier mal komplet//--------------------------------------------------------------------------- #include <iostream.h> #include <conio.h> #include <string.h> #include <mem.h> int x; char zeichen[2][21]; char ergebnis[100]; void auswahl(void); void eingabe(void); void add(void); void sub(void); void mult(void); void div(void); void kopf(void); int main() { for(x=0;x==0;) { clrscr(); kopf(); auswahl(); } return 0; } //FUNKTIONEN //Auswahl void auswahl(void) { int i; cout << "\n\n1.Addition\n\n2.Subtraktion\n\n3.Multiplikation\n\n4.Division\n\n5.Ausgang"; cout << endl <<endl <<"Bitte waehlen Sie die gewuenschte Rechenoperation aus: "; cin >>i; switch (i) { case 1 :clrscr(); kopf(); cout << "\n\tSie haben sich fuer die Addition entschieden\n\n"; eingabe(); add(); break; case 2 :clrscr(); kopf(); cout << "\n\tSie haben sich fuer die Subtraktion entschieden\n\n"; eingabe(); sub(); break; case 3 :clrscr(); kopf(); cout << "\n\tSie haben sich fuer die Multiplikation entschieden\n\n"; eingabe(); mult(); break; case 4 :clrscr(); kopf(); cout << "\n\tSie haben sich fuer die Division entschieden\n\n"; eingabe(); div(); break; case 5 :clrscr(); kopf(); cout << "\n\tVielen dank das Sie unseren Grundlagen-Rechner benutzt haben." << "\n\n\t\t\tAuf Wiedersehen"; getchar(); x=1; break; default:cout << "\nunbekannter Befehl"; getchar(); } } //Eingabe void eingabe (void) { cout<< "\nGeben Sie bitte Ihre erste Zahl ein: "; gets(zeichen[0]); cout << "\nGeben Sie bitte Ihre zweite Zahl ein: "; gets(zeichen[1]); int l=strlen(zeichen[0]); //Länge bestimmt int k=strlen(zeichen[1]); memmove(zeichen[0]+20-l,zeichen[0],l); //Verschieben memset(zeichen[0],'0',20-l); //Auffüllen memmove(zeichen[1]+20-l,zeichen[0],l); //Verschieben memset(zeichen[1],'0',20-l); //Auffüllen return; } //addition void add(void) //additionsfunkton { int z1; int z2; int summe; int uebertrag=0; int p=strlen(zeichen[0]); int q=strlen(zeichen[1]); p--; q--; for (int i=19;i>=0;i--) { if (p>=0) { z1=zeichen[0][p]-'0'; } else { z1=0; } if (q>=0) { z2=zeichen[1][q]-'0'; } else { z2=0; } summe=z1+z2+uebertrag; uebertrag=summe/10; ergebnis[i]=summe%10+'0'; p--; q--; } cout <<"\n\nIhr Ergebnis lautet: " <<ergebnis; getchar(); } //############################################################## //## Subtraktionsfunktion ## //############################################################## void sub(void) { int z1; //int aller benötigten Sachen int z2; int summe; int uebertrag=0; int i=strlen(zeichen[1]); // int l=strlen(zeichen[0]); //Länge bestimmt // memmove(zeichen[0]+20-l,zeichen[0],l); //Verschieben // memset(zeichen[0],'0',20-l); //Auffüllen if(zeichen[1][0]=='-') //schaut ob im zweiten Array Zeichen ein Minus ist { add(); //wenn ja benutze die Additionsfunktion } else //falls nicht { if(strcmp(zeichen[0],zeichen[1])>=1) //sollte die 1te Zahl größer sein als die 2te { for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //dient zur berechnung ist eine additionsfunk z2=zeichen[1][i]-'0'; //wandelt char in int variablen um summe=z1-z2+uebertrag; //dann Zahl1-Zahl2 in SUmme speichern uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout <<"\n\nIhr Ergebnis lautet: " << ergebnis; //ergebnis } else //wenn2te größer 1st { //das funktioniert for (i-=1;i>=0;i--) { z1=zeichen[0][i]-'0'; //Hier das gleiche wie oben z2=zeichen[1][i]-'0'; summe=z2-z1+uebertrag; //Zahl2-Zahl1 uebertrag=summe/10; ergebnis[i]=summe%10+'0'; } cout <<"\n\nIhr Ergebnis lautet: " << "-" << ergebnis; //ergebnis mit Minus davor } } getchar(); } void mult(void) { eingabe(); } void div(void) { eingabe(); } void kopf(void) { int i=79; cout << "\t\t Der Grundlagentaschenrechner" << "\n\t Copyright by xxx"<<endl; for(i; i >=0;i--) { cout<< "_"; } }
-
besser gesagt jetzt funktioniert nichts mehr
-
Für das Verschieben von zahlen[1] mußt du auch dessen Länge (k) nutzen
(ansonsten bin ich wie gesagt nicht ganz sicher, ob die Indizes stimmen - jag da mal lieber durch den Debugger und beobachte, was wohin geschoben wird).
-
mit den richtigen idizes funktioniert's einwandfrei
int l=strlen(zeichen[0]); //Länge bestimmt int k=strlen(zeichen[1]); memmove(zeichen[0]+20-l,zeichen[0],l); //Verschieben memset(zeichen[0],'0',20-l); //Auffüllen memmove(zeichen[1]+20-k,zeichen[1],k); //Verschieben memset(zeichen[1],'0',20-k); //AuffüllenNaj bei neagativen zahlen dürfte es trotzdem noch probleme geben.
KurtBTW nach solchen operationen wirkt ein einfaches
cout << zeichen[0] << endl;wunder wenn du sehen willst ob du es auch richtig gemacht hast.
-
Joa so geht die NORMALE subtraktion mit unterschiedlichen langen zahlen
und des minus geht auch außer du hast vorher die addition mal aufgerufen dann geht sie nicht mehr
und mit - - gehts auch noch nicht.Trotzdem thx die restlichen probs werd ma shco irgendwie lösen falls doch noch jemand was weiß bitte posted es