Jump to content
EUROPAS GROßE
SPORTWAGEN COMMUNITY

C++-Newbie erbittet Eure Hilfe (Kleinigkeit)


Lambo-Benni

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich habe mich entschlossen endlich die C++-Programmierung zu lernen. Jetzt arbeite ich mit Hilfe des WWW und eines dicken "Wälzers", der mir sehr weiter hilft. Allerdings sehe ich da jetzt einen Widerspruch in einem Beispielcode. Kann mir vlt. jemand erklären, warum das richtig ist, oder - noch besser - mir recht geben, dass es im Buch falsch ist? :wink:

Hier der Code:

bool erg = false;

int y = 5;

erg = 7 || (y=0);

cout << "Wert von y: " << y << endl;
Laut Buch ist die Ausgabe:
Wert von y: 5
Aber wurde y nicht auf 0 gesetzt nachdem die 5 zugewiesen wurde?
erg = 7 || (y=0);

Danke im Vorraus für jede Hilfestellung.

Jetzt registrieren, um Themenwerbung zu deaktivieren »
Geschrieben

Meine C++ Kenntnisse sind zwar nicht mehr die besten, aber ich würde sagen,

das Buch hat Recht.

Denn y wird der Wert 5 zugewiesen, danach erfolgt die Abfrage

erg = logischer ODER-Vergleich zwischen 7 und y=0

Hierbei wird aber y nicht der Wert 0 zugewiesen und somit

bleibt y der Wert 5.

Angabe ohne Gewähr :wink:

Geschrieben

Danke Dir, MasterM, Du hast mich auf die Lösung gebracht.

Das Buch hat recht!

Wäre es ein &&-Vergleich hätte ich recht, aber beim ||-Vergleich bricht der Compiler die Vergleichsoperation ab, sobald erg == true - was durch die "7" der Fall ist - und ignoriert den 2. Teil (y = 5).

Also vielen Dank, Du hast mich drauf gebracht. :-))!

edit: also y würde der Wert 0 schon zugewiesen (auch innerhalb eines Vergleiches), nur hier nicht, weil der Compiler den Teil ignoriert.

Geschrieben
was für ein Editor benutzt du?

devc++ LINK ist super.

Danke für den Tipp. Bisher schreibe ich alles im Notepad, weil ich mir zum Lernen kein Stückchen Arbeit abnehmen lassen will. aber ich werde den mal testen :-))!

Gast -Anonym10-
Geschrieben

hmm naja also ich hatte mit c++ noch nichts zu tun, nur mit Java und anderen. Was ich mich frage für was ist denn die boolsche Variable erg da?

Sie macht doch eigentlich nichts. Geht das Beispiel noch weiter?

Er gibt ja immer cout << "Wert von y: " << y << von daher ist der Vergleich ja völlig unnötig. Oder sehe ich das falsch.

Geschrieben
hmm naja also ich hatte mit c++ noch nichts zu tun, nur mit Java und anderen. Was ich mich frage für was ist denn die boolsche Variable erg da?

Sie macht doch eigentlich nichts. Geht das Beispiel noch weiter?

Er gibt ja immer cout << "Wert von y: " << y << von daher ist der Vergleich ja völlig unnötig. Oder sehe ich das falsch.

Ich hatte nur den entscheidenden Teil abgeschrieben. War aber nur eine kleine Übungsaufgabe, also ein Sinnlose-Programm. :wink:
Gast -Anonym10-
Geschrieben

gut dann will ich nichts gesagt haben :wink:

Geschrieben

mach mal der compiliert und führt aus auf knopf druck

musst vor der letzten Klammer nur ein System("pause"); einbaun sonst geht die dos box sofort wieder zu.

lohnt sich wirklich

Geschrieben

ich satarte die .exe-Datei sowieso im "Dos-Mode", da compilier ich die .cpp-Datei auch (mit g++) :lol:

  • 3 Wochen später...
Anzeige eBay
Geschrieben
Geschrieben

Hallo Lambo-Benni,

 

schau doch mal hier zum Thema Zubehör für Aus dem Alltag (Anzeige)? Eventuell gibt es dort etwas Passendes.

  • Gefällt Carpassion.com 1
Jetzt registrieren, um Themenwerbung zu deaktivieren »
Geschrieben

ich muss Euch nochmal um Hilfe bitten, google hat mir nicht konkret weitergeholfen...

Situation:

ich lese aus einer .txt-Datei Koordinaten in einen string. Aus diesem string will ich einen float machen, quasi StringTofloat, finde dazu aber leide keine eindeutigen, kurzen Beispiele oder Erklärungen.

Im Code:


float koord[x][y] = string[x][y];

// da fehlt noch irgendwie die Umwandlung, habe aber keinen Plan wie...

Bin für jeden Tipp dankbar. Hier mal der gesamte Code mit Includes, etc. - funktioniert bisher einwandfrei, nur will ich eben "string koord" in "float" convertieren:
#include <iostream>

#include <fstream>

using namespace std;


int main() 

{

ifstream file;


file.open ("tour_2098.txt", ifstream::in);


char ch;

string filter[100];

string koord[100][3];

int i, anz = 0, z;


for (i=0;i<1020;++i) 			// auslesen der Datei

  {			


  if (file.eof())				// Abbruch bei Dateiende

    {

    i = 1024;

    }


  ch = file.get();

  cout << ch;


  if (ch!=' ') 					// einlesen bis Leerzeichen

    {

    if (ch!=',') 				// einlesen bis Komma

	  {	

      filter[anz] += ch;

      }

    else

      {

    ++anz;

      }    

    }

  else { ++anz; }


  }


cout << endl << endl << endl;


for (z=0;z<=anz;++z)				// Ausgabe der ausgelesenen Koordinaten

  {

  cout << filter[z] << endl;

  }


cout << endl << endl << endl;


int y;

i = 0;

for (z=0;i<=anz;++z)				// zuordnen der Koordinaten im Array

  {

  for (y=0;y<3;++y)

    {

    koord[z][y] = filter[i];

	++i;

	}

  }  


for (i=0;i<z;++i)				// Ausgabe der sortierten Koordinaten

  {

  for (y=0;y<3;++y)

    {

    cout << koord[i][y] << endl;

    }

  cout << endl;

  } 


/*

string s = "123.456";                       Das hier habe ich aus dem www,

double d = atof( s );                        funktioniert aber nicht. Fehlt ein 

                                                     include?

*/                                                    


cout << d;


file.close();


}

Danke

Benni

Geschrieben

probiers mal mit

strtof (stringtofloat) oder strtod wenns ersteres net gibt und dann mit (float) umwandeln.

Geschrieben

vielen Dank, aber es hilft nichts, fehlt vlt. irgendein "include"?

Fehlermeldung:

cannot convert `std::string´ to `const char*´ for argument `1´ to float strtof<const char*, char**>´

edit mit strtod zu double geht genausowenig... :(

Geschrieben
schreib mal genau die code zeilen wo der fehler kommt

string s = "123.456";

float d = strtof (s);

Der Fehler wird nur für die Zeile 72 gemeldet, das wäre hier die untere.

Geschrieben

ok, habe die Lösung. folgender code erledigt die Arbeit:

#include <sstream>
for (z=0;i<=anz;++z)				// zuordnen der Koordinaten im Array

  {

  for (y=0;y<3;++y)

            {

	istringstream strtofl(filter[i]);	// Umwandlung in Float/Double

	strtofl >> koord[z][y];

             // koord[z][y] = filter[i];

	++i;

	}

  } 

nochmal vielen Dank Euch allen.

  • 3 Wochen später...
Geschrieben

"and the show must go on"...

ich häng mal wieder an einem C++-Stück. Wäre nett, wenn sich jemand die Zeit nimmt und sich Folgendes mal ansieht:

(der gesamte Code steht ganz unten)

mein Problem:

der Compiler scheint ein "IF" immer als "true" zu verstehen.

if (ch == '0'||'1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9')
"ch" ist eine Variable vom Typ "char". Der Inhalt von "ch" wird mit einer "for"-Schleife aus einer Datei ausgelesen (Zeichen für Zeichen). Wenn "ch" ein im Code genanntes Zeichen ist, soll der "IF"-Block ausgeführt werden. Bisher wird der "IF"-Block allerdings immer ausgeführt. (die '0' hatte ich auch schon mal rausgenommen, da evtl. ein Leerzeichen als '0' interpretiert werden könnte, was allerdings unlogisch wäre) Hier der gesamte Code:

#include <iostream>

#include <fstream>

#include <sstream>

#include <iomanip>

using namespace std;


int main()

{

ifstream file;


file.open ("2509.kml", ifstream::in);


char ch;

int ko = 500;

string filter[ko*3];

long double koord[ko][3];

int anz = 0, z, su;

unsigned int i;

char suche[32000];

string ls;


for (i=0;i<32000;++i) 			// einlesen der gesamten Datei bis "LineString"

{			


  if (file.eof())				// Abbruch bei Dateiende

    {

    i = 32000;

    }


  ch = file.get();


  suche[i] = ch;


  if (suche[i] == 'g')

  {

    for (su=0;su<10;++su)

	{

	  ls += suche[i-9+su];

	  cout << ls << endl;

	}


	if (ls == "LineString")

	{

	  cin.get();

      for (;i<32000;++i) 			// einlesen der gesamten Datei bis Anfang der Koordinaten

      {			    

        ch = file.get();

    //    suche[i] = ch;


	    if (ch == '0'||'1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9')

	    {

		  cin.get();

		  for (;i<32000;++i) 			// einlesen der  Koordinaten

   		  {

		    ch = file.get();  

		    if (ch!=' ') 				// einlesen bis Leerzeichen

		    {

			  if (ch!=',') 				// einlesen bis Komma

	   		  {	

			    filter[anz] += ch;

			  }

			  else

			  {

			    ++anz;

			  }    

		    }

		      else { ++anz; }

	/*		if (ch == '<')

			{

			  i = 32000;

			}   */

	      }


		}


	  }

	} 

	else 

	{

	  ls = "";

	}


  }

}


  for (z=0;z<=anz;++z)				// Ausgabe der ausgelesenen Koordinaten

  {

	cout << filter[z] << endl;

  }


  cout << endl << endl << endl;


  int y;

  i = 0;

  for (z=0;i<=anz;++z)				// zuordnen der Koordinaten im Array

  {

	for (y=0;y<2;++y)

    {

	  istringstream strtofl(filter[i]);	// Umwandlung in Double

	  strtofl >> koord[z][y];

	  ++i;

	}

  }  


  for (i=0;i<z;++i)					// Ausgabe der sortierten Koordinaten

  {

	for (y=0;y<2;++y)

	{

	  cout << setprecision(17) << koord[i][y] << endl;

	}

   cout << endl;

  }   


file.close();


}

Schon im Vorraus vielen Dank für jede Hilfe!

Achso: Der Compiler meldete weder Fehler noch Warnungen! - und die Klammern und Semikolons sind richtig gesetzt - habe ich mehrfach überprüft.

Hab's gelöst, war ein kleiner Fehler in der "IF"-Bedingung.

  • 3 Monate später...
Geschrieben

Servus zusammen,

vielleicht gibt es ja doch den einen oder anderen C++-Profi, der das hier liest...

Ich hänge mal wieder und verzweifel fast an meinem Code.

Ohne viele Worte, dafür mit Code und Endprodukt...

erst der Codeschnipsel:


for (j=0;j<count;j++)

  {

    datei1 = svg[j];

    file.open (datei1.c_str(), ifstream::in);

	cout << endl << "Welche Datei wird durchsucht?  " << datei1 << "   j = " << j << "   z = " << z << endl << endl;

	for (i=0;i<anzch;i++) 			// Datei durchsuchen

	  {			                         // nach Umlauten

	    ch = file.get();

	    suche[i] = ch;

	    if (suche[i] == 'Ã' )                                 // Ã = Umlaut

	      {

	        i = anzch;

			convert[z] = datei1;

	        z++;

	        cout << endl << "Es ist ein Umlaut enthalten." << endl << endl;

	      }

	    if (file.eof())				// Abbruch bei Dateiende

	      {

	        i = anzch;

	      }

		if (i == 1000)

		  {

		    i = 1;

	//		t++;

	// (91 mal das t)	cout << suche[i] << " " << t << " ";

		  }

	  }

	file.close();

  }

Nund die Ausgabe der Konsole:

Welche Datei wird durchsucht? s650s1.svg  j = 0 z = 0


Welche Datei wird durchsucht? s651s2.svg  j = 1 z = 0


Welche Datei wird durchsucht? s660s3.svg  j = 2 z = 0


Welche Datei wird durchsucht? test.svg  j = 3 z = 0


Welche Datei wird durchsucht? test3.svg  j = 4 z = 0

Wichtige Infos: Umlaute (Ã) enthalten sind in allen Dateien außer der 1. (s650s1.svg). Problem: Die Schleife läuft nur einmal korrekt durch (z wird nicht hochgezählt - müsste es eigentlich, weil ja Umlaute enthalten sind) - kleine Fehlermeldung. Könnt ohr mir vielleicht helfen? Ich feinde den Fehler einfach nicht. Evtl. könnte ich den Teil

		if (i == 1000)

		  {

		    i = 1;

	//		t++;

	// (91 mal das t)	cout << suche[i] << " " << t << " ";

		  }

weglassen, aber dann müsste ich "anzch" höher setzen, was seltsamerweise nicht geht (ist bei mir integer). Wie könnte ich "anzch" denn noch höhere Zahlen zuweisen (bisher 52.000 - müsste allerdings in die Millionen gehen)?

Vielen Dankim Voraus für jede Hilfe.

edit: Hat sich erledigt!

Archiviert

Dieses Thema ist archiviert und für weitere Antworten gesperrt. Erstelle doch dein eigenes Thema im passenden Forum.


×
×
  • Neu erstellen...