Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:15

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



zahlenwandler Consolenprogramm

Discussion on zahlenwandler Consolenprogramm within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
theo1990's Avatar
 
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
theo1990 is offline  
Old 04/12/2013, 20:45   #2

 
snow's Avatar
 
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)
snow is offline  
Thanks
1 User
Old 04/12/2013, 21:57   #3

 
Delinquenz's Avatar
 
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.
Delinquenz is offline  
Thanks
1 User
Old 04/13/2013, 22:14   #4
 
theo1990's Avatar
 
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.
theo1990 is offline  
Old 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++
Twist' is offline  
Old 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!
.Infinite is offline  
Thanks
2 Users
Old 04/15/2013, 10:33   #7
 
theo1990's Avatar
 
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
Quote:
Originally Posted by Twist' View Post
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?
theo1990 is offline  
Old 04/15/2013, 17:16   #8

 
Delinquenz's Avatar
 
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.
Delinquenz is offline  
Thanks
1 User
Old 04/15/2013, 18:58   #9
 
Schlüsselbein's Avatar
 
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.
Schlüsselbein is offline  
Thanks
2 Users
Old 04/15/2013, 19:58   #10
 
theo1990's Avatar
 
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 ;-)
theo1990 is offline  
Old 04/15/2013, 20:17   #11
 
Schlüsselbein's Avatar
 
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ß
Schlüsselbein is offline  
Thanks
1 User
Old 04/16/2013, 07:58   #12
 
theo1990's Avatar
 
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?
theo1990 is offline  
Old 04/16/2013, 10:17   #13
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
MoepMeep is offline  
Old 04/16/2013, 13:48   #14
 
theo1990's Avatar
 
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
theo1990 is offline  
Old 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.
Nightblizard is offline  
Thanks
1 User
Reply




All times are GMT +1. The time now is 16:16.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.