|
You last visited: Today at 16:15
Advertisement
zahlenwandler Consolenprogramm
Discussion on zahlenwandler Consolenprogramm within the C/C++ forum part of the Coders Den category.
04/12/2013, 19:58
|
#1
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
zahlenwandler Consolenprogramm
Hi Leute,
ich hoffe ich bin jetzt richtig hier. Also ich möchte einen zahlenwandler schreiber jedoch habe ich ein problem mit meinem Programm. Hier ist zuerst mal der code : (er wurde in borland c++ von 1997 erstellt)
Code:
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
char* inDezimal(char zk[], int basis) {
int i,j, ganzZahl, erg_gz, rest_dz;
const int n=100;
char zk1[n];
char buffer;
i = 0;
erg_gz = 0;
while(zk[i] != '\0'){
ganzZahl = zk[i] - 48;
erg_gz = erg_gz * 10 + ganzZahl;
i++;
}
i = 0;
while (erg_gz != 0) {
rest_dz = erg_gz % basis;
cout << "Rest: " << rest_dz << "\n";
erg_gz = erg_gz / basis;
zk1[i] = (char) (rest_dz + 48);
cout << zk1[i] << "\n";
i++;
}
zk1[i] = '\0';
for(j = 0; j < i; j++) {
buffer = zk1[i-1];
zk1[i-1] = zk1[j];
zk1[j] = buffer;
i--;
}
//cout << zk1 << endl;
return zk1;
}
int zaehlen(char zk[]) {
int zeichen, z;
zeichen = 0;
z = 0;
while(zk[z] != '\0'){
zeichen++;
z++;
}
return zeichen;
}
void main() {
const n=100;
char zk[n];
int basis;
cout<<"Bitte geben Sie die Basis der Zahl ein, in die gerechnet werden soll"<<"\n";
cin>>basis;
cout<<"Bitte geben Sie eine ganzahl ein"<<"\n";
gets(zk);
switch (basis) {
case 8:
//erg = ;
cout << "Hier ist das erg: " << inDezimal(zk, basis) << "\n";
break;
}
getch();
}
SO nun mein Problem:
Wenn i h das Programm ausführe und eine zahl umrechnen möchte komme ich nur seltsame Zeichen in der console angezeigt.
jedoch weiß ich absolut nicht mehr weiter wieso das so ist vllt könnt ihr mir einen hilfreichen tipp geben
|
|
|
04/12/2013, 20:45
|
#2
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
char* inDezimal(char zk[], int basis) {
[…]
char zk1[n];
return zk1;
}
[…]
cout << "Hier ist das erg: " << inDezimal(zk, basis) << "\n";
Du erstellst ein Array auf dem Stack (oder auf dem Heap? Weiß es gerade nicht, [] ist in meinen Augen die Erstellung auf dem Stack) und gibst die Adresse, deren Inhalte danach vom Stack entfernt werden, zurück.
Du verweist also auf ungültigen Speicherbereich und das Verhalten ist undefiniert.
(korrigiert mich, falls ich falsch liege :x)
|
|
|
04/12/2013, 21:57
|
#3
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
Quote:
|
(korrigiert mich, falls ich falsch liege :x)
|
Doch, müsste stimmen. Wieso hantierst du mit Chars? Chars sind für Zeichen(ketten) gedacht und nicht für mathematische Operationen. Zudem ist char* ein Pointer, sprich, wie schon mein Vorposter erwähnt hat, returnst du einen Pointer zu einem ungültigem Speicherbereich. Am besten keine Pointer aus Funktionen returnen, da die Gültigkeit nach dem Ende des Gültigkeitsbereiches nicht mehr garantiert ist.
|
|
|
04/13/2013, 22:14
|
#4
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
Hi erstmal danke ! Also dieses Programm ist für meine Ausbildung bzw. Für die Schule die Aufgabenstellung verlangte eine Zeichenkette. Es ist ja auch nicht gut das ich gets() benutze jedoch alles vom Lehrer erwünscht und gefordert. Wieso ich eine Zeichenkette zurück geben möchte liegt daran, dassddie Zahl die ich umrechne von hinten nach vorne umsortiert werden muss. Dies funktioniert ohne eine c eigene Funktion zu nutzen in einem Array . Ich könnte jedoch meine Zeichenkette in ascii Code umwandeln und diese zurückgeben und im hauptprogramm wieder umwandeln. Dies ist sinnvoll da ich jaauch in das hexal System umrechnen möchte.
|
|
|
04/13/2013, 22:17
|
#5
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,354
Received Thanks: 280
|
Hab noch einen Tipp für dich versuch mal C# zu lernen das ist viel einfacher als C++
|
|
|
04/14/2013, 00:07
|
#6
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Quote:
|
Hab noch einen Tipp für dich versuch mal C# zu lernen das ist viel einfacher als C++
|
Genau. Egal was dein Lehrer sagt, geh und programmier in C# oder besser noch AutoIt, weil es einfacher ist. Super Tipp!
|
|
|
04/15/2013, 10:33
|
#7
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
Quote:
Originally Posted by Twist'
Hab noch einen Tipp für dich versuch mal C# zu lernen das ist viel einfacher als C++
|
ähm also ich hab bereits mit c# erfahrung gemacht jedoch ist das nicht relevant für meine Ausbildung. Jedoch hat das jetzt nciht mit der Sprache an sich zutun sondern eher ein technisches Problem. Ich werde heute in meiner Pause das Problem wie oben beschrieben versuchen zu lösen. Für anmerkungen bezüglich HEX Zahlen ausgeben wäre ich Dankbar!
Quote:
|
Genau. Egal was dein Lehrer sagt, geh und programmier in C# oder besser noch AutoIt, weil es einfacher ist. Super Tipp!
|
xD...
€dit:
Hier ist mal der Quellcode wenn es sich nur um eine ganzzahl handelt. Hier fuktioniert mein Code einwandfrei. Ich Wandele die Zeichenkette in eine Intzahl um und gebe Sie zurücke. Das Geht ja nur solange es eine Ganzzahl und wenn die Zeichenkette keine Buchstaben enthält (Hexa Zahl).
Code:
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
int zahlWandler(char zk[]) {
int i, zahl, summe;
i = 0;
summe = 0;
while(zk[i] != '\0') {
zahl = zk[i] - 48;
summe = summe * 10 + zahl;
i++;
}
return summe;
}
int inDezimal(char zk[], int basis) {
int i,j, ganzZahl, erg_gz, rest_dz, intzahl;
const int n=100;
char zk1[n];
char buffer;
i = 0;
erg_gz = 0;
while(zk[i] != '\0'){
ganzZahl = zk[i] - 48;
erg_gz = erg_gz * 10 + ganzZahl;
i++;
}
i = 0;
while (erg_gz != 0) {
rest_dz = erg_gz % basis;
cout << "Rest: " << rest_dz << "\n";
erg_gz = erg_gz / basis;
zk1[i] = (char) (rest_dz + 48);
cout << zk1[i] << "\n";
i++;
}
zk1[i] = '\0';
for(j = 0; j < i; j++) {
buffer = zk1[i-1];
zk1[i-1] = zk1[j];
zk1[j] = buffer;
i--;
}
intzahl = zahlWandler(zk1);
//cout << zk1 << endl;
return intzahl;
}
int zaehlen(char zk[]) {
int zeichen, z;
zeichen = 0;
z = 0;
while(zk[z] != '\0'){
zeichen++;
z++;
}
return zeichen;
}
void main() {
const n=100;
char zk[n];
int basis;
cout<<"Bitte geben Sie die Basis der Zahl ein, in die gerechnet werden soll"<<"\n";
cin>>basis;
cout<<"Bitte geben Sie eine ganzahl ein"<<"\n";
gets(zk);
switch (basis) {
case 8:
//erg = ;
cout << "Hier ist das erg: " << inDezimal(zk, basis) << "\n";
break;
}
getch();
}
Wie könnte ich eine Zeichenkette zurückgeben wie oben versucht?
|
|
|
04/15/2013, 17:16
|
#8
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
Code:
i = 0;
summe = 0;
while(zk[i] != '\0') {
zahl = zk[i] - 48;
summe = summe * 10 + zahl;
i++;
}
Zum einen sind Integer in C++ standardmäßig 0, sofern sie nicht definiert oder initialisiert werden (falsch) und zum anderen könntest du hier eine for-Schleife benutzen.
Code:
for (int i = 0; zk[i] != '\0'; ++i)
HEX Zahlen ausgeben kannst du mit std::cout << std::hex << 1024;
Das gleiche gibts mit dec für dezimal und oct für oktal auch.
Quote:
|
Integer sind in C++ standardmäßg undefiniert, sodern sie nicht definiert oder initialisiert werden.
|
Sorry, hab da was falsch verstanden bzw verwechselt.
|
|
|
04/15/2013, 18:58
|
#9
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Quote:
|
Zum einen sind Integer in C++ standardmäßig 0, sofern sie nicht definiert oder initialisiert werden
|
Integer sind in C++ standardmäßg undefiniert, sofern sie nicht definiert oder initialisiert werden.
|
|
|
04/15/2013, 19:58
|
#10
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
hi danke für eure Anmerkung, jedoch ist es ja die Übung eine Zeichenkette zurückzugeben (als returnwert). Abgesehen von performenz was für vorteile habe ich gegenüber der while schleife. Beide sind doch abweisende Schleifen ?!
Vllt habe ich mich bisschen missverständlich ausgedrückt als ich oben sage "Eine Hexzahl ausgeben" ich meinte eher dass ich nicht genau weiß welchen datentyp ich da benutzen muss außer ein char für die zeichenkette.Irgendwie kann ich ja keine Zeichenkette returnen. Eine Zeichenkette kann ich auch nicht als Referenz angeben oder?
Ich hoffe es ist jetzt klarer was ich möchte ;-)
|
|
|
04/15/2013, 20:17
|
#11
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Also ich hab mir jetzt mal deinen Code genauer angeschaut und puuhh... dein Lehrer gehört geschlagen.
Die Header heißen <cstdio> und <iostream>.
int main() ist standard, void main() nicht.
Das sind Dinge, die einfach falsch sind - egal was euer Lehrer verlangt. Wenn er C++ unterrichtet, soll das auch genau das tun und kein C/C++-Mischmasch benutzen.
Er kann allerdings verlangen, char-arrays als Zeichenkette zu benutzen - ist ja schließlich auch legitim unter C++ (obwohl auch hier std::string in jedem Fall vorzuziehen wäre).
Wie du nun ein char-array zurückgibst?
Dafür gibt es 2 'gute' bzw. korrekte Möglichkeiten. Das Array via new in der Funktion zu allokieren ist _schlecht_.
Möglichkeit 1 (die wohl am häufigsten anuzutreffene):
Code:
#include <iostream>
void fill_array(char* out, size_t size)
{
for(size_t i = 0; i < size; ++i)
{
out[i] = 'x';
}
}
int main()
{
const int size = 64;
char arr[size] = {0};
fill_array(arr, size);
}
Damit überlässt du dem Caller die Verantwortung über das Array und dessen Speicher.
2. Möglichkeit:
Code:
#include <iostream>
struct char_arr
{
char data[64];
};
char_arr get_array()
{
char_arr arr;
for(int i = 0; i < 64; ++i)
{
arr.data[i] = 'x';
}
return arr;
}
int main()
{
auto arr = get_array();
}
Array in ein/e struct/Klasse packen und n value-type daraus machen. Dadurch wird das array kopiert.
Wie gesagt ist beides nicht schön und unter C++ gibts dafür verdammt viele Alternative (std::string oder allgemeiner std::vector und std::array).
Gruß
|
|
|
04/16/2013, 07:58
|
#12
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
Hi! Erstmal zum Thema Leherer:
Der Leher den wir haben hat vor ungefähr 20 Jahren studiert und dann mit C angefangen und später mit C++ weitergemacht bis sagen wir im jahr 2000 dort hat er schlagartig aufgehört sich neu Dinge anzueigenen und ist Leherer geworden. Dort hat er mit der Einstellung Unterrichtet:
Quote:
|
Och jaoh wir bringen den Leuten ja keine Programmiersprache bei, nein das müssen sie selbst tun, wir benutzen nur eine um den Leuten die Logik verständlich zu machen
|
meiner Meinung nach ziemlicher nonsens, da wir diese Ausbildung machen um Porgrammiere zu werden und nicht Gärtner und dem entsprechend können wir schon was mit der Logik anfangen. Aber ich schweife vom Thema ab (ich sehe das genau wie du !)
Nun zum fachlichen. Mir ist bereits gesagt worden , unabhängig von deiner Aussage, dass wir einen unendlichen Mischmasch aus C/C++ machen und mir stinkt es auch solangsam und vorallem was mich noch mehr aufregt das wir einen Borland compiler/editor benutzen sollen, der etwa 16 Jahre alt ist und vieles Borlandspezifisch ist und überhaupt kein standart mehr ist (und das in einer Microsoft Partnerschule die MSDNAA anbietet wo man virtual studio ultimate für fast umsonst bekommet....najach).
Aus diesem Grund hab ich mir auch Aktuelle Liktüre gekauft von Galileo computing (C/C++ für Anfänger) und noch eins. Jedoch sind beide auf wirkliche Anfänger getrimmt und nicht wirklich eine große hilfe. Kann einer ein Buch empfehlen welches bisschen mehr in die Vollen geht?
|
|
|
04/16/2013, 10:17
|
#13
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
|
|
|
04/16/2013, 13:48
|
#14
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
Joah dummerweise gibts keine leseprobe ist das Buch soweit gut verständlich oder muss man schon bisschen erfahrung gehabt haben? denn 50 euro ist doch eine Stange geld für das Buch zu kaufen und später merkt man dass es nciht für einen ist
|
|
|
04/16/2013, 14:55
|
#15
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Er hat die ersten paar Kapitel des Buches hier online gestellt:
Kannst also mal reinschnuppern.
|
|
|
All times are GMT +1. The time now is 16:16.
|
|