# Konvertierung von txt in eine array funktioniert nicht



## reinholdweihs (12. Dezember 2013)

*Einlesen aus txt in ein array c++/ Array wird nicht angezeigt*

Hallo,
ich habe folgenden Code mit dem ich aus einer TXT datei daten einlese und dann in ein Array abspeichern möchte, das problem ist das das porgramm zwar läuft aber das Array nicht ausgeführt wird

```
#include<iostream>
#include<fstream>
using namespace std;

int main()
{

    ifstream datei;
    datei.open("vrpnc01.txt");
    char c= datei.get();
    while(datei.good()){std::cout<<c;
    c=datei.get();}

    {
          int a[400][400];
        int i;
        int j;
        for ( int i=0;i<100;i++)
        {
            for ( int j=0;j<100;j++)
            a[i][j]=0;
            cout<<a[i][j]<<'\n';
      }
          return 0;

            }
    datei.close();

    return 0;
}
```


----------



## deepthroat (12. Dezember 2013)

Hi.





reinholdweihs hat gesagt.:


> Hallo,
> ich habe folgenden Code mit dem ich aus einer TXT datei daten einlese und dann in ein Array abspeichern möchte, das problem ist das das porgramm zwar läuft aber das Array nicht ausgeführt wird


Dein Programm liest die Datei aus, Zeichen für Zeichen. Und macht mit dem Zeichen... NICHTS. Du müßtest das Zeichen auch in das Array speichern usw.

Gewöhne dir einen besseren Stil an. Dein Programm ist unleserlich - was dazu führt das es sich keiner durchliest. Eine Anweisung pro Zeile, rücke ordentlich ein, verwende Leerzeichen; das erhöht die Lesbarkeit.

Dann gibt die .get() Funktion einen int zurück, keinen char. Wenn nichts eingelesen werden konnte, gibt die Funktion fstream::traits_type::eof() zurück.


----------



## reinholdweihs (12. Dezember 2013)

```
cout<<a[i][j]<<'\n';
```
  im Code wäre an sich dazu gedacht das Array auszugeben, meine Frage ist warum 
	
	
	



```
cout<<a[i][j]<<'\n';
```
  im Ausgabe Bildschirm kein Array sondern nur eingelesenen Zahlen ausgibt!zu den Zeilen

```
for ( int j=0;j<100;j++);
             matrix[i][j];
            cout<< matrix[i][j];
```

gibt er ein Warning aus, dass diese Zeilen ohne Wirkung sind. Und genau das verstehe ich nicht und wie kann man dieses ändern******

Was ich gerne möchte ist das hier

```
for ( int j=0;j<100;j++);
             matrix[i][j];
            cout<< matrix[i][j]=datei;
      }
```

also das  er datei , den datenstrom direkt in die Matrix schreibt


----------



## vfl_freak (13. Dezember 2013)

Moin,



reinholdweihs hat gesagt.:


> ```
> cout<<a[i][j]<<'\n';
> ```
> im Code wäre an sich dazu gedacht das Array auszugeben, meine Frage ist warum
> ...


a[i][j] ist halt der Wert an der Stelle "i,j" ... was sollte da sonst ausgegeben werden ?



reinholdweihs hat gesagt.:


> ```
> for ( int j=0;j<100;j++);
> matrix[i][j];
> cout<< matrix[i][j];
> ...


Richtig .... Du darfst die erste Zeile NICHT mit einem Semikolon abschließen, weil dies den Befehl beendet !!

```
for ( int j=0;j<100;j++)
{
     matrix[i][j];  // wobei dies hier auch keine Sinn macht - willst Du hier die Matrix füllen ****?
}
cout<< matrix[i][j];
```



reinholdweihs hat gesagt.:


> Was ich gerne möchte ist das hier
> 
> ```
> for ( int j=0;j<100;j++);
> ...


Dein matrix[i][j] bezeichnet genau einen Wert des Arrays (eben an der Stelle i,j). 
Da kannst Du wohl kaum die gesamte Datei rein schrieben ....
Was steht denn überhaupt in der Datei drin ?

Gruß
Klaus


----------



## reinholdweihs (15. Dezember 2013)

Der inhalt der Datei sind Zahlen

```
30 40
 37 52 7
 49 49 30
 52 64 16
 20 26 9
 40 30 21
 21 47 15
 17 63 19
 31 62 23
 52 33 11
 51 21 5
 42 41 19
 31 32 29
 5 25 23
 12 42 21
 36 16 10
 52 41 15
 27 23 3
 17 33 41
 13 13 9
 57 58 28
 62 42 8
 42 57 8
 16 57 16
```
mit Matrix [i][j] würde ich gerne die Matrix füllen, bin aber mittlerweile eher in der Richtung unterwegs das ganze direkt mit datei.get zu machen, nur was müsste ich dann in die klammer bei datei,get schreiben damit der das ganze direkt einliest? brauch ich da eine schleife ****

Die aktuelle Version meines programms sieht so aus

```
#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    int array [6][70];

    ifstream datei;
    datei.open("vrpnc01.txt");
    char c= datei.get(array,6,70);

    while(datei.good())
    {std::cout<<c;
    c=datei.get();

    }

    datei.close();

    return 0;
}
```
nur funktioniert zeile char c=datei.get(array,6,70) nicht da produziert er einen fehler no matching  found


edit:
problem mittlerweile offline gelöst.... habe die werte in einen Vektor gegeben mit einem code den ich gefunden habe
DANKE AN ALLE FÜR DIE MITHILFE!


edit2: Die Werte will ich jetzt in ein Array abspeichern und das Array dann anzeigen ,das sind dann die x werte , dann will ich nachher die y werte einlesen und diese in ein zweites Array abspeichern oder was noch besser wäre erst x werte einlesen, dann y werte einlesen und das ganze in einer matrix speichern... wie muss ich meinen code dafür weiterschreiben... kriege es nicht hin dass er mit die eingelesenen werte in ein Array speichert . wenn geht bitte direkt in den Code schreiben und Code reposten DANKE und schönen Sonntag

```
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main()

{
   // Endlosschleife

   for(;;)
   {
      // eine weitere Zahl einlesen
      int nValue = 0;
      cout << "Geben Sie die naechste Zahl ein: ";
      cin  >> nValue;


      // wenn sie negativ ist ...
      if (nValue <0)

      {
         // ... dann Schleife abbrechen
         break;
         return 0;
}

}
 }
```


----------



## ComFreek (15. Dezember 2013)

reinholdweihs hat gesagt.:


> wenn geht bitte direkt in den Code schreiben und Code reposten



Du willst also, dass wir die Arbeit für dich machen? Dann empfehle ich dir, mich das Thema ins Job-Forum verschieben zu lassen.

Ansonsten solltest du erstmal ein Array anlegen bzw. einen std::vector, welcher für deinen Fall besser geeignet scheint.


----------



## reinholdweihs (15. Dezember 2013)

ich arbeite,das mit dem array haut schon hin

```
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;



int main()

{
   // Endlosschleife

   for(int i=0;i<200;i++)
   {
      // eine weitere Zahl einlesen
      int nValue = 0;
      int Array[200];
      cout << "Geben Sie die naechste Zahl ein: ";
      cin  >> nValue;


      // wenn sie negativ ist ...
      if (nValue <0)

      {
         // ... dann Schleife abbrechen
         break;

}
Array[i]=nValue;
for (int i=0;i<200;i++)
{
    cout<<i<<":"<<Array[i]<<endl;
}
}
 }
```
nur wie mache ich es dass er das ganze nochmal für zweite werte macht****?
kann ich dann auch etwa die differenz zwischen wert 7 und wert 3 bilden und anzeigen****?was ich probiert habe war copy and paste und die eingabeschleife mit k nochmal laufen lassen und k ausgeben ... geht aber nicht


----------



## ibafluss (15. Dezember 2013)

Du musst deinen Code besser einrücken, dann fällt es uns beim Lesen leichter und vor allem auch dir beim Schreiben.
Das Array musst du auserhalb der Schleife erstellen. Sonst wird es für jeden Schleifendurchlauf neu erstellt. 

Für die X- und Y-Werte würde ich dir ein 2-dimensionales Array vorschlagen. Falls du  nicht weißt wie das funktioniert, einfach schnell mal googlen.

Pseudobeispiel:

```
#include <iostream>

using namespace std;

int main()
{
    const int MAX = 200;
    const int X = 0;    // Konstanten um den Arrayzugriff lesbarer zu machen
    const int Y = 1;
    int values[2][MAX];
    int numOfValues = 0;

    for (int i = 0; i < MAX; i++)
    {
        // x eingeben
        values[X][i] = eingabeX;
        // y eingeben
        values[Y][i] = eingabeY;
    }

    //differenz zwischen 3. und 7. X-Wert
    int diff = values[X][3] - values[X][7];

    return 0;
}
```


----------



## reinholdweihs (17. Dezember 2013)

*Probleme beim Anzeigen eines Vekors*

hallo,
 Wie bringe ich das programm dazu nach 5 werten eine neue spalte zu beginnen**** lg grüsse

```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;

 int main()
 {
     double xPoint[6];
     double yPoint[6];
       std::vector<float> v;


     for (int i=0;i<5;i++)
     {
         cout<<"Enter the x coordinate for position"<<i<<":"<<endl;
         cin>>xPoint[i];
         cout<<"Enter the y coordinate for position"<<i<<":"<<endl;
         cin>>yPoint[i];
     }
       for (int k=0;k<5;k++)
      {


      for (int i=0;i<6;i++)

         {
              double X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));




             cout<<X<<" ";

             cout<<endl;
         }
for (i=0; i<1; ++i) {
    for( int j=0; j<5;++j)
        v.push_back(i); 
    }
}
     }
```


----------



## Endurion (17. Dezember 2013)

Überlege mal. Wenn du (std:endl in cout schiebst, wird ein Zeilenumbruch eingesetzt. Im Moment setzt du den nach jedem einzelnen Wert ein.

Wo müsste das stehen, damit das nur alle 5 Zeichen einen Zeilenumbruch einsetzt?


BTW, du hast da noch einen Fehler in der For-Schleife mit I, das sollte wahrscheinlich auch 5 als oberer Wert sein (wie bei k).

Die xPoint und yPoint-Arrays sind auch eins zu groß. Wenn du 5 Koordinaten angibst, dann sind die über die Indizes 0 bis 4 erreichbar.


----------



## reinholdweihs (17. Dezember 2013)

ja wenn ich das wüsste hätte ich kein Forum gebraucht.....

dieses meine aktuelle variante, die läuft aber nicht


```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;

 int main()
 {
     double xPoint[6];
     double yPoint[6];
     ;std::vector<float> v;


     for (int i=0;i<5;i++)
     {
         cout<<"Enter the x coordinate for position"<<i<<":"<<endl;
         cin>>xPoint[i];
         cout<<"Enter the y coordinate for position"<<i<<":"<<endl;
         cin>>yPoint[i];
     }
       for (int k=0;k<5;k++)
      {


      for (int i=0;i<6;i++)

         {
              double X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));

               {
    std::vector<int> v;
    int i;
     vector=X;

    for (i=0; i<100; ++i)
    {for(k=0;k<5;++k)

        v.push_back(i); // Fügt i ans Ende von v an.
        ++v[i];

      cout<<vector<<" ";


}
cout<<endl;

         }

         }
     }
 }
```


----------



## Der Wolf (17. Dezember 2013)

Hallo und guten Morgen,

"... , die läuft aber nicht" ist aber eine sehr dürftige Fehler-Beschreibung.  Davon abgesehen, wäre es hilfreich, wenn du deinen Code in die entsprechenden Code Tags packen würdest, dass macht es leichter ihn zu lesen.

Was mir bisher so auffällt, ist 


```
;std::vector<float> v;
```

in der dritten Zeile nach dem main(...). Da ist wohl ein Semikolon zuviel am Zeilenanfang. Zusätzlich sehe ich die Deklaration/Definition der Variablen vector nicht, die du ausgeben willst. Und wofür dient der Vektor v in den du immer den aktuellen Wert deiner Lauf-Variablen i hineinschreibst?

Viele Grüße,
Wolf


----------



## vfl_freak (17. Dezember 2013)

Moin,

außerdem scheinst Du ein Klammerungsproblem zu haben .....

Habe den Code mal versucht, zu formatieren, damit es deutlich wird :

```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;

int main()
{
	double xPoint[6];
	double yPoint[6];
	std::vector<float> v;

	for (int i=0;i<5;i++)
	{
		cout<<"Enter the x coordinate for position"<<i<<":"<<endl;
		cin>>xPoint[i];
		cout<<"Enter the y coordinate for position"<<i<<":"<<endl;
		cin>>yPoint[i];
	}

	for (int k=0;k<5;k++)
	{
		for (int i=0;i<6;i++)
		{
			double X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));

		{  // ********?
			std::vector<int> v;
			int i;
			vector=X;

			for (i=0; i<100; ++i)
			{
				for(k=0;k<5;++k)
					v.push_back(i);   // ACHTUNG: nur diese Zeile wird hier behandelt ******

				++v[i];
				cout<<vector<<" ";
			}
			cout<<endl;
		}  // ********?

	}  // schießt diese Scheife: for (int k=0;k<5;k++)
	}  // ********?
}
```

gruß
Klaus


----------



## reinholdweihs (17. Dezember 2013)

Der Vektor ist die Distanzmatrix für jede entfernung zwischen 5 punkten und X ist immer jeweils eine entfernung zwischen 2 punkten , nennen wir mal die punkte ABCDE


  ABCDE
A  01111
B  10111
C  11011
D  11101
E   11110

jede 1 steht symbolisch für einen X wert. Im code oben im tread hatte ich diese werte bereitsn nur standen die Spalten untereinander...


----------



## vfl_freak (17. Dezember 2013)

Moin,

aha ....................

Hast Du denn meine Kommentare im Code (bzgl. Llammerung und FOR-Schleife) gelesen - und ggf. bereinigt ?

Gruß
Klaus


----------



## reinholdweihs (17. Dezember 2013)

Danke schon mal für das formatieren, Klaus!!

Ja habei ich habe ich, rennt aber nicht 

mittlerweile habe ich meinen code so modifiziert, der läuft nur was hier nicht klappt ist das er X updated und an die richtige stelle der matrix einsetzt das geht an sich mit dem push back befehl, nur wie genau****
bekomme dabei die fehlermeldung request for member "push back in "vector" which is of non class type double

```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;


 int main()
 {
     double xPoint[6];
     double yPoint[6];



     for (int i=0;i<5;i++)
     {
         cout<<"Enter the x coordinate for position"<<i<<":"<<endl;
         cin>>xPoint[i];
         cout<<"Enter the y coordinate for position"<<i<<":"<<endl;
         cin>>yPoint[i];
     }
       for (int k=0;k<5;k++)
      {


      for (int i=0;i<6;i++)

         {
              double X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));
{

	vector double[100][100];
	for(int i=0; i<6; i++)
	{
		for(int j=0; j<6; j++)
		{
			vector.push_back(*X);
					}
	}

	for(int i=0; i<5; i++)//Anzahl der Zeilen
	{
for(int j=0; j<5; j++)//Anzahl der Spalten
		{
			cout <<vector[i][j]  << "  ";//iZeilen j Spalten

		}
		cout << endl;
	}
}
         }
      }
 }
```


----------



## deepthroat (17. Dezember 2013)

Hi.

[Bitte verwende Code-Tags!]



reinholdweihs hat gesagt.:


> Hallo,
> mein problem ist folgendes ich möchte gerne die Werte X im Code per Push back in einen vektor schieben und bekomme dabei die fehlermeldung request for member "push back in "vector" which is of non class type double


Dein Vektor ist keine Vektor, sondern ein double.

Entweder hast du die falsche Variable erwischt, oder die Variable wurde von einer zweiten überschattet.


----------



## reinholdweihs (17. Dezember 2013)

genau bei der double vector [100][100]Zeile ist der Fehler, dachte erst das ich es umgekehrt schreiben muss vector double[100][100] funktioniert auch nicht sowie vector<int> vector; funktioniert ebenfalls nicht :[. Was ich gerne möchte ist X in die Matrix hineinschiebe damit ich dann eine Matrix  der from

XXXX
XXXX
XXXX
XXXX   erhalte, mit dem jeweils aktuellen werten der schleife für X!!


----------



## Der Wolf (17. Dezember 2013)

Hallo,

der eine Fehler liegt wohl schon bei der Deklaration deines Vektors double. Das müsste nicht


```
vector double[100][100];
```

heissen, sondern zum Beispiel:


```
vector<double> matrix;
```

Dann kannst du mit 


```
matrix.push_back(X);
```

die Werte in den Vektor schreiben. Du musst dir dann aber irgendwo merken, wieviele Spalten eine Zeile hat, damit du die Werte passend aus dem vektor herauslesen und auf die Konsole schreiben kannst.

Insgesamt würde ich sagen, du würfelst da einiges durcheinander und solltest dir vielleicht die Klasse "std::vector" mal genauer angucken. Und bitte versuch mal den Code etwas lesbarer zu formatieren, so dass man leichter erkennen kann, welche Klammern zusammen gehören.

Gruß,
Wolf


----------



## cwriter (17. Dezember 2013)

Zum vector: Da du wohl std::vector verwenden willst:
Warum zweidimensional? Vektoren sind als eindimensionaler Speicher gedacht.

```
std::vector<double> vec; //vector darf die Variable nicht heissen, da sonst variable==typ
```
Ansonsten: Sicher, dass du dafür Vektoren verwenden willst? Wäre ein Array nicht besser geeignet?
Und warum willst du ein 100*100-Feld für Max. 6*6?

Gruss
cwriter


----------



## reinholdweihs (17. Dezember 2013)

Habe jetzt den Code wie vorgeschlagen modifiziert nurverteilt er die werte auf verschiedene matrizen******!!

```
{
double X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));
{

 vector<double> matrix;
for(int i=0; i<6; i++)
{
for(int j=0; j<6; j++)
{
matrix.push_back(X);
}
}

for(int i=0; i<5; i++)//Anzahl der Zeilen
{
for(int j=0; j<5; j++)//Anzahl der Spalten
{
cout <<X << " ";//iZeilen j Spalten

}
```
cwriter Arrays haben eine feste grösste, die manuelle eingabe ist nur für Testzwecke, später werden dann die Daten aus einem txt file kommen und dann muss er mit 15 verschiedenen matrizen aus 15 txt files jede andere grösse arbeiten dann reden wir über 1000*1000 Matrizen... deswegen Vektor und später kommt ein teil 2 zum thema metaheuristik und dafür sind vektoren voraussetzung damit er später elemente zufällig aus einem container löschen und in einen anderen einfügen kann...

edit:
Dieses die aktuelle version, er liest alle zahlen ein aber er liest die spalten untereinander statt nebeneinander ein er sollte bei jedem 4 ten werte eine neue spalte beginnen und die zeilen und spalten sind verdreht.

```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;


int main()
{
double xPoint[6];
double yPoint[6];



for (int i=0;i<5;i++)
{
cout<<"Enter the x coordinate for position"<<i<<":"<<endl;
cin>>xPoint[i];
cout<<"Enter the y coordinate for position"<<i<<":"<<endl;
cin>>yPoint[i];
}
for (int k=0;k<5;k++)
{


for (int i=0;i<5;i++)

{
double X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));
{

 vector<double> matrix;
for(int i=0; i<5; i++)

{
matrix.push_back(X);
}
cout<<X<<" ";
}
cout<<endl;

}
}
}
```


----------



## vfl_freak (17. Dezember 2013)

Moin,

benutze doch die Code-Tags ... so bekommt man ja Augenkrebs 

Wie weiter oben schon gesagt wurde, sind Vektoren als eindimensionale Speicher.
Du fügst dort eine Reihe von einzelnen Werten ein - und Schluß!
Sollte es eine 'echte' Matrix sein wäre ein Vector vlt. nur bedingt geeignet ...

Erkläre doch mal genau, was Du eigentlich erreichen willst!


Gruß
Klaus


----------



## reinholdweihs (17. Dezember 2013)

was ich genau brauche ist das die derzeitigen richtigen werte nicht in einer spalte wiedergegeben werden sondern in 4 spalten also als beispiel;

aktuelle Ausgabe: alle Zahlen in einer Spalte

```
1
2              
3
4
5
6
```
 
was ich gerne hätte wäre

```
1    2
3    4
5    6
```

PS: versuche als Codetag c und /c zu verwenden geht aber nicht..


----------



## vfl_freak (17. Dezember 2013)

Moin,



			
				reinholdweihs hat gesagt.:
			
		

> 1
> 2              was ich gerne hätte wäre dieses;   1    4
> 3                                                                      2    5
> 4                                                                      3    6
> ...


ääh, was 
1 - 3 in die erste Spalte und 4 - 6 in eine Zweite ****

Das geht eben wir bereits geschrieben mit einem eindimensionalen Vektor kaum ... 
Höchstens

```
vector< vector<int> >
```
und dann die 'inneren' Vektoren' als Spalten interpretieren! Ist aber von den Zugriffen komplexer ...

Warum kein zweidimensionales Array?

```
int myArray = new int[3][3];
```

Gruß
Klaus


----------



## reinholdweihs (17. Dezember 2013)

Ich habe es zuerst mit genau der schreibweise porbiert die du vorgeschlagen hast, das ging aber nicht und hat einen error produziert, dann haben ich ein float array definiert nut leider kommt die ausgabe überhaupt nicht hin( siehe Anhang), jede der werte wird eine komplette zeile lang eingelesen! LG Reinhold

```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;


int main()
{
double xPoint[6];
double yPoint[6];



for (int i=0;i<5;i++)
{
cout<<"Enter the x coordinate for position"<<i<<":"<<endl;
cin>>xPoint[i];
cout<<"Enter the y coordinate for position"<<i<<":"<<endl;
cin>>yPoint[i];
}
for (int k=0;k<5;k++)
{


for (int i=0;i<5;i++)

{
double X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));
{float myArray[5][5];
for(int i=0; i<5; i++)
{
    for(int y=0;y<5;y++)
    {
        myArray[i][y]=X;
    }
}
for(int i=0;i<5;i++)

cout<<myArray[0][0]<<" ";
}
cout<<endl;

}
}
}
```


----------



## Der Wolf (17. Dezember 2013)

vfl_freak hat gesagt.:


> Das geht eben wir bereits geschrieben mit einem eindimensionalen Vektor kaum ...



Das würde ich so nicht unterschreiben. Man kann ja die Werte auch alle hintereinander ablegen und merkt sich in einer zusätzlichen Variable noch, wieviele Spalten eine Zeile hat. Dann geht das auch mit einem eindimensionalem Vektor.

@reinholdweihs: Was hast du gegen die Code Tags?

Gruß,
Wolf


----------



## vfl_freak (17. Dezember 2013)

Moin,

zur Verwendung der Tags:
klicke im Editor auf den Button mit # und ändere dann die Worte CODE zu CPP !!
Und Du brauchst BEIDE Tags - den Öffnenden und den Schließenden !!



Der Wolf hat gesagt.:


> Das würde ich so nicht unterschreiben. Man kann ja die Werte auch alle hintereinander ablegen und merkt sich in einer zusätzlichen Variable noch, wieviele Spalten eine Zeile hat. Dann geht das auch mit einem eindimensionalem Vektor.


eben ... kaum 
Ist aber für Anfänger und bei großen Wertemengen schlecht zu handeln ...



Der Wolf hat gesagt.:


> @reinholdweihs: Was hast du gegen die Code Tags?


hat er nicht ... erhat nur den schließenden Tag vergessen

Gruß
Klaus


----------



## reinholdweihs (17. Dezember 2013)

zum code tag problem.. bei der Raute oben #15 öffnet sich leider nichts:

Bin ein wenig weitergekommen wenn mann bei cout [5][5]reingibt ändert sich die matrix nimmt allerdings dann nur einen Wert...


```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;


int main()
{
double xPoint[6];
double yPoint[6];



for (int i=0;i<5;i++)
{
cout<<"Enter the x coordinate for position"<<i<<":"<<endl;
cin>>xPoint[i];
cout<<"Enter the y coordinate for position"<<i<<":"<<endl;
cin>>yPoint[i];
}
for (int k=0;k<5;k++)
{


for (int i=0;i<5;i++)

{
float X =sqrt(pow(xPoint[0+k]-xPoint[i],2)+pow(yPoint[0+k]-yPoint[i],2));
{float myArray[5][5];
for(int i=0; i<5; i++)
{
    for(int y=0;y<5;y++)
    {
        myArray[i][y]=X;
    }
}
for(int i=0;i<5;i++)

cout<<myArray[5][5]<<" ";
}
cout<<endl;

}
}
}
```

edit:
Das Rätsel ist gelöst******!! einfach einen String hinter der Eingabe einfügen und alles wird Zuckerwatte  schönen Abend .... 

```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;


int main()
{
    double xPoint[6];
    double yPoint[6];



    for (int i = 0; i < 5; i++)
    {
        cout << "Enter the x coordinate for position" << i << ": ";
        cin >> xPoint[i];
        cout << "Enter the y coordinate for position" << i << ": ";
        cin >> yPoint[i];
        cout << string(50, '\n');
    }

    double myArray[5][5];

    for (int k = 0; k < 5; k++)
    {
        for (int j = 0; j < 5; j++)
        {
            double X = sqrt(pow(xPoint[k] - xPoint[j], 2) + pow(yPoint[k] - yPoint[j], 2));
            myArray[k][j] = X;
            cout << X << " ";
        }
        cout << endl;
    }
}
```


----------



## Jennesta (17. Dezember 2013)

Du musst bei den Code-Tags auch ein Slash "/" statt einem Backslash "\" nehmen. Dann wird es auch funktionieren.

Auch wäre es empfehlenswert deinen Beitrag zu editieren, als einen neuen zu schreiben. Damit bleibt dein Beitrag etwas übersichtlicher.


----------



## Der Wolf (17. Dezember 2013)

Hoppala,

da habe ich den einleitenden Code-Tag übersehen. Sorry, reinholdweihs. 

Gruß,
Wolf


----------



## reinholdweihs (18. Dezember 2013)

*Minimum in der ersten Zeile einer Matrix finden aber 0 ignorieren*


```
//Travelling salesmen


    double min[12];






    for (int k=0;k<5;k++)
    {
        for(int j=0;j<5;j++)
        {
            if (min[j]>myArray[0][j]) {
            min[j]=myArray[0][j];}
    }
}
for (int j=0;j<1;j++)
{
    cout<<"Minimum der ersten Zeile :min["<<j<<"]"<<endl;
    cout<<min[j]<<endl;
}
}
```


----------



## cwriter (18. Dezember 2013)

```
if (min[j]>myArray[0][j] && myArray[0][j] != 0) {
//...
min[j] = myArray[0][j];
}
```

Dein Code ist seltsam. So bräuchtest du z.B. die for(k)-Schlaufe gar nicht. Oder hast du den Code gekürzt?
Und warum greifst du nur auf die myArray[0]-Dimension zu?
/Edit:
Meinst du vielleicht myArray[k][j] statt myArray[0][j]?

Gruss
cwriter


----------



## reinholdweihs (18. Dezember 2013)

problem ist das er das minimum nicht korrekt anzeigtgenauer gesagt nimmt er immer dasselbe element als minimum egal was man eingibt

```
#include <iostream>
#include<cmath>
#include<vector>
using namespace std;


int main()
{
    double xPoint[6];
    double yPoint[6];



    for (int i = 0; i < 5; i++)
    {
        cout << "Enter the x coordinate for position" << i << ": ";
        cin >> xPoint[i];
        cout << "Enter the y coordinate for position" << i << ": ";
        cin >> yPoint[i];
        cout << string(50, '\n');
    }

    double myArray[5][5];

    for (int k = 0; k < 5; k++)
    {
        for (int j = 0; j < 5; j++)
        {
            double X = sqrt(pow(xPoint[k] - xPoint[j], 2) + pow(yPoint[k] - yPoint[j], 2));
            if (X==0)
                {
                X=100;
                }
            myArray[k][j] = X;
            cout << X << " ";
        }
        cout << endl;
    }
    //Travelling salesmen
     double min[12];
min[0]=myArray[0][0];
    float Y;
      int Z;




    {
        for(int j=0;j<5;j++)
        {
            if (min[j]>myArray[0][j]) {
            min[j]=myArray[0][j];;
             Y= min[j];Z=j;}
    }
}
for (int j=0;j<1;j++)
{
    cout<<"Minimum der ersten Zeile :min["<<Z<<"]"<<endl;
    cout<<Y<<endl;
}
}
```


----------



## Jennesta (18. Dezember 2013)

Hallo,

also also deine Formatierung ist immer noch etwas dürftig, dass solltest du besser früh in den Griff bekommen. Denn du wirst nie selbst Fehler finden, wenn du nicht etwas Ordentlichkeit mit einbringst.

Die Code-Tags hast du inzwischen gefunden. Das ist soweit gut, aber wenn du CODE durch CPP ersetzt, dann bekommen wir noch etwas Farbe in den Quelltext.

Zu deinem Programm. Die 0 kommt in deinem Programm nur zu stande, wenn  k == j.
Daher mein Vorschlag:


```
if(j == k) {
	X = 100;
} else {
	X = sqrt(...);
}
```
 

Deine Minimumsberechnung verstehe ich nicht. Aber ist eigentlich auch nicht schwer, wenn du wie in meinem Beispiel den Wert auf 100 setzt. Am besten setzt du ihn aber direkt auf das Maximum, dann bist du auch bei großen Werten auf der sicheren Seite.

Pseudocode vom Minimum:

- Iteriere über Zeilen
- setze minimum als Maximalwert (oder sehr hoch)
- Iteriere über Spalten und vergleiche mit Minimum. Falls kleiner nehmen, sonst weiter. ->nächste Spalte
- speichere minimum ins array -> nächste Zeile


Grüße,
Jennesta


----------



## reinholdweihs (18. Dezember 2013)

ja das ist schon klar  aber ich suche nur das minimum in der ERSTEN ZEILE da mein Algortihmus folgendermassen lautet daher habe ich die zeile auf 0 gesetzt und iteriere über alle spalten da mein algo dann in weiterer folge so lautet;

Suche das Minimum in der ersten Zeilen
speichere den wert und den spaltenindex wo das minimum gefunden wurde
gehe dann in die zeile == spaltenindex des minimum hat und suche dort wieder das minimum
mach das solange bis alle zeilen durch sind

das problem ist das das minimum der ersten zeile einfach nicht korrekt angezeigt wird er vermutet es immer in der 3 spalte wo es aber nicht ist ..


----------



## cwriter (18. Dezember 2013)

```
min[0]=myArray[0][0];
```
Was ist das? Warum setzt du den Wert von min[0] auf den von myArray(0|0)? (Ich mag die Koordinatenschreibweise in diesem Beispiel einfach ;-) )
Alle anderen mins (also min[1], min[2], usw.) sind undefined values. Setze sie zuerst auf den höchsten zu erwartenden Wert+1.

Gruss
cwriter


----------



## Jennesta (18. Dezember 2013)

Hallo,

ich habe nun deinen Code gedebugged. Ich bitte dich den Code nicht einfach zu übernehmen, sondern dich damit auseinanderzusetzen.

Der Fehler tritt in dem Teil des Codes auf, den du schlecht formatiert hast. Mach dir darüber Gedanken. Leerzeichen sind übrigens da um sie zu nutzen.


```
//Travelling salesmen
	double min[6];
	int spalte = 0;

	for(int j = 0; j < 5; j++) {
        int minimum = 10000;
		if(minimum > myArray[0][j]) {
			minimum = myArray[0][j];
			spalte = j;
		}
		min[0] = minimum;
	}
	for (int j=0;j<1;j++)
	{
		cout << "Minimum der ersten Zeile :min[" << spalte <<"]" << endl;
		cout << min[0] <<endl;
	}

	fflush(stdin);
	getchar();
	return 0;
```

Außerdem sollte deine main-Funktion einen Rückgabewert haben, da du sie auch mit "int" definiert hast.

Grüße,
Jennesta


----------



## reinholdweihs (18. Dezember 2013)

Hallo Jennester;

Ich habe mir deinen Ansatz durchgesehen, du hast das minimum für die Startlösung auf 1000 gelegt und rechnest dann in der Schleife mit einem Startwert von 10000, hätte ich auc gedacht das das die lösung bringt nur leider... Nein das minimum bleibt leider and der falschen stelle ABER VIELEN DANK FÜR DAS AUSBESSERN; WAR SICHER EIN STEP ZUM ZIEL************ das mit dem minimum stimmt mal 100 prozentig******

```
#include <iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;


int main()
{
    double xPoint[6];
    double yPoint[6];



    for (int i = 0; i < 5; i++)
    {
        cout << "Enter the x coordinate for position" << i << ": ";
        cin >> xPoint[i];
        cout << "Enter the y coordinate for position" << i << ": ";
        cin >> yPoint[i];
        cout << string(50, '\n');
    }

    double myArray[5][5];

    for (int k = 0; k < 5; k++)
    {
        for (int j = 0; j < 5; j++)
        {
            double X = sqrt(pow(xPoint[k] - xPoint[j], 2) + pow(yPoint[k] - yPoint[j], 2));
            if (X==0)
                {
                X=100;
                }
            myArray[k][j] = X;
            cout << X << " ";
        }
        cout << endl;
    }
    //Travelling salesmen
    double min[6];
    int spalte = 0;

    for(int j = 0; j < 5; j++) {
        float minimum = 10000;
        if(minimum > myArray[0][j]) {
            minimum = myArray[0][j];
            spalte = j;
        }
        min[0] = minimum;
    }
    for (int j=0;j<1;j++)
    {
        cout << "Minimum der ersten Zeile :min[" << spalte <<"]" << endl;
        cout << min[0] <<endl;
    }


    return 0;

}
```


----------



## Jennesta (18. Dezember 2013)

Da der Code bei mir funktioniert, kann ich da schlecht sagen was du falsch machst. 
Es wäre auch interessant zu wissen welche Zahlen du eingibst. 50 newlines sind da ein bisschen unnötig, meinst du nicht?

Auch drängt sich mir der Verdacht auf, dass du einfach nur Copy+Paste gemacht hast und hoffst das wir dir dein Problem lösen.


----------



## cwriter (18. Dezember 2013)

Hallo

Zudem sieht die Ausgabe nicht wirklich nach einem Minimum aus.

```
float minimum = 10000;
//Korrekter wäre
 float minimum = 10000.0f;
```

Und das ist mal ein riesiger overhead:

```
for (int j=0;j<1;j++)
```

Ansonsten: Warum mischst du double und float?

/EDIT: Und warum brauchst du bei min einen double array, wenn du sowieso nur min[0] benutzt?

Gruss
cwriter


----------



## reinholdweihs (18. Dezember 2013)

nun das problem mit dem minimum habe ich soweit im griff indem ich die erste zeile per boolscher variable auf true gesetzt habe , und mit dem zählen einfach bei der zweiten spalte beginne, aber sonst probleme über probleme.... auch der nächste schritt klappt nicht wo er dann in der zeile mit dem spaltenvektor weiter nach einem minimum suchen sollte und die indizes dann als array asugeben sollte hier einfach mal der fertige code wie das fertige programm laufen sollte

```
#include <iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;


int main()
{
    double xPoint[6];
    double yPoint[6];



    for (int i = 0; i < 5; i++)
    {
        cout << "Enter the x coordinate for position" << i << ": ";
        cin >> xPoint[i];
        cout << "Enter the y coordinate for position" << i << ": ";
        cin >> yPoint[i];
        cout << string(50, '\n');
    }

    double myArray[5][5];

    for (int k = 0; k < 5; k++)
    {
        for (int j = 0; j < 5; j++)
        {
            double X = sqrt(pow(xPoint[k] - xPoint[j], 2) + pow(yPoint[k] - yPoint[j], 2));
            if (X==0)
                {
                X=100;
                }
            myArray[k][j] = X;
            cout << X << " ";
        }
        cout << endl;
    }
    //Travelling salesmen
    float min[6];
    int spalte = 0;


     bool zeile=true;
     zeile= k==0;

    for(int j = 1; j < 5; j++) {
       double minimum =2;
        if(minimum > myArray[0][j]) {
            minimum = myArray[0][j];
            spalte = j;
        }
        min[0] = minimum;
    }
    for (int j=0;j<1;j++)
    {
        cout << "Minimum der ersten Zeile :min[" << spalte <<"]" << endl;
        cout << min[0] <<endl;

    }

{
for (n=1;n<5;n++)
{
    
}

bool zwei=true;
      zwei= k==spalte;
      for(int j = 1; j < 5; j++) {
       double minimum =2;
        if(minimum > myArray[0][j]) {
            minimum = myArray[0][j];
            spalte = j;
        }
        min[2] = minimum;
    }
    for (int j=0;j<1;j++)
    {
        cout << "Minimum der ersten Zeile :min[" << spalte <<"]" << endl;
        cout << min[2] <<endl;
    }

}
}
```


----------



## cwriter (19. Dezember 2013)

Nein, das Problem ist, dass du minimum immer wieder auf 10000 gesetzt hast, sodass du min[0] immer überschrieben hast.
Nimm die Deklaration von minimum aus der Schlaufe raus (setze es vor die Schlaufe) und es sollte gehen.

Gruss
cwriter


----------



## reinholdweihs (19. Dezember 2013)

DANKE CWRITER...... das war der Stein des Weisen.... jetzt läuft das programm!! DANKE!!


----------



## Jennesta (19. Dezember 2013)

cwriter hat gesagt.:


> Nein, das Problem ist, dass du minimum immer wieder auf 10000 gesetzt hast, sodass du min[0] immer überschrieben hast.



Mist, ich glaube der Fehler ist auf meinem Mist gewachsen. Einmal testen ist halt zu wenig ;-)


----------



## reinholdweihs (19. Dezember 2013)

*Einlesen von Zahlen aus TXT und konvertieren - Programm bricht nach erster Spalte ab*

Hallo,

ich lesen mir Zahlen aus einer TXT Datei ein und konvertiere sie mir dann mit Integer da ich diese Werte als Input für eine Matrix brauche.... problem : wenn ich das file als string einlese werden alle drei spalten der TXT datei wiedergegeben, sobald ich allerdings ATOI  anwende nur mehr eine spalte  


```
#include <iostream>
#include <fstream>
#include<cstdlib>


using namespace std;


int main(int argc, char *argv[])
{
    char     filename[128];
    ifstream file;
    char     zeile[1024];


    // Dateinamen einlesen
    cout << "Dateinamen eingeben: " << flush;
    cin.getline(filename, 127);


    
    file.open(filename, ios::in);


    if (file.good())
    {
        


        
        file.seekg(0L, ios::beg);


        while (! file.eof())
        {
            
            file.getline(zeile, 10000);
            int value =atoi(zeile);
            cout << value << endl;
        }
    }
    else
    {
        
        
        cout << "Datei nicht gefunden." << endl;
    }


    return 0;
}
```


----------



## Der Wolf (19. Dezember 2013)

Hallo,

"atoi" wird dir auch nur immer die erste Zahl aus jeder Zeile konvertieren. Wenn du alle haben willst musst du jede Zeile noch einmal anhand ihrer Leerzeichen auf einzelne Spalten auftrennen und dann für jede Spalte jeder Zeile atoi aufrufen.

Gruß,
Wolf


----------



## deepthroat (19. Dezember 2013)

Der Wolf hat gesagt.:


> "atoi" wird dir auch nur immer die erste Zahl aus jeder Zeile konvertieren. Wenn du alle haben willst musst du jede Zeile noch einmal anhand ihrer Leerzeichen auf einzelne Spalten auftrennen und dann für jede Spalte jeder Zeile atoi aufrufen.


Genau. Und das Auftrennen kannst du mit einem istringstream bewerkstelligen.

Und du solltest (fast) nie die good, eof, bad, fail Methoden eines Streams aufrufen. [das funktioniert nämlich nicht so einfach]

Und verwende lieber die getline Funktion für std::strings (ist einfacher).

Und atoi ist auch schlecht, da diese Funktion keine Fehler prüfen kann, sondern einfach 0 zurückgibt - ob da nun 0 stand oder nicht.

```
file.open(...);

if (file.is_open()) {
  string zeile;
  while (getline(file, zeile)) {
    istringstream row(zeile);
    int wert;
    while (row >> wert) {
       ... // Hurra! Wert eingelesen...

    }
  } else {
    // datei nicht gefunden / keine Berechtigung zum Öffnen etc.
  }
}
```


----------



## reinholdweihs (19. Dezember 2013)

Das problem ist das ich mit diesen Daten weiterrechnen muss und daher auf ATOI angewiesen bin , da ich mit strings keine Rechnungen machen kann sondern nur mit Integer zahlen in meinem Fall!! Daher muss ich mit ATOI den Input von char auf int konvertieren!!


----------



## deepthroat (19. Dezember 2013)

reinholdweihs hat gesagt.:


> Das problem ist das ich mit diesen Daten weiterrechnen muss und daher auf ATOI angewiesen bin , da ich mit strings keine Rechnungen machen kann sondern nur mit Integer zahlen in meinem Fall!! Daher muss ich mit ATOI den Input von char auf int konvertieren!!


Wie du unschwer erkennen kannst, ist in meinem Code kein atoi drin... ;-]


----------



## reinholdweihs (19. Dezember 2013)

anyway habe stringstream in meinen code eingebaut, problem bleibt aber gleich, er liest nur eine spalte

```
#include <iostream>
#include <fstream>
#include<cstdlib>
#include<sstream>
using namespace std;

int main(int argc, char *argv[])
{
    char     filename[128];
    ifstream file;
    char     zeile[1024];

    // Dateinamen einlesen
    cout << "Dateinamen eingeben: " << flush;
    cin.getline(filename, 127);

    // Datei öffnen
    file.open(filename, ios::in);

    if (file.good())
    {
        // Wenn die Datei geoeffnet werden konnte...

        // An den Anfang der Datei springen
        file.seekg(0L, ios::beg);

        while (! file.eof())
        {
            // Die Datei zeilenweise auslesen
            file.getline(zeile, 10000);
             istringstream row(zeile);
            int value =atoi(zeile);
            cout << value << endl;
        }
    }
    else
    {
        // Wenn die Datei nicht geoeffnet werden konnte,
        // aus welchen Gruenden auch immer...
        cout << "Datei nicht gefunden." << endl;
    }

    return 0;
}
```


----------



## deepthroat (19. Dezember 2013)

reinholdweihs hat gesagt.:


> anyway habe stringstream in meinen code eingebaut, problem bleibt aber gleich, er liest nur eine spalte


Evlt. solltest du dir einfach mal meinen Code nochmal ankucken. Ich hab dir schon alles hingeschrieben....


----------



## reinholdweihs (19. Dezember 2013)

Hallo,
habe jetzt folgenden Code der einen TXT Input in ein Int Array verwandelt, schon einigiges korrigiert aber er will nicht laufen..... Dieses Programm soll Zeilen und Spalten einlesen und den String in Integer verwandeln, leider kompiliert er das programm aber führt es dann nicht aus!

```
#include<iostream>
#include<sstream>
#include<fstream>
#include <cstdlib>
using namespace std;
double X;
double row;
double col;
double buff;
double array[100][100];


int main()
{


ifstream infile("vrpnc01.txt");
stringstream ss;
row=0;
while (infile.getline(row, 80)&&row<100){
ss<<buff;
col=0;
while(ss.getline(col,100)&&col<80)
{array[row][col]= atoi(buff);++col;}


array[row][col]=X;
ss<<"";
ss.clear();
++row;}
for (row=0;row<10;++row){cout<<"X"<<endl;}


infile.close();
}
```


----------



## sheel (19. Dezember 2013)

Hallo Reinhold,

bitte beachte die Netiquette, der du bei der Anmeldung zugestimmt hast.

@alle: Dieser Thread ist gerade etwas Chaos, aber wird schon wieder hingebogen.
...Ok, besser.


----------



## cwriter (19. Dezember 2013)

reinholdweihs hat gesagt.:


> Hallo,
> [...], schon einigiges korrigiert aber er will nicht laufen.....


Bitte konkreter.

atoi(): Du kannst doch nicht ein double als Argument für atoi übergeben!?
Auf einen Array mit double-Indizes zuzugreifen ist auch sehr mutig...
col: Warum ist denn das ein double?
array[row][col] = X; -> Wieso überschreibst du den alten Wert denn? Und das noch mit einem undefined value. Was ist denn das für eine Seuche in letzter Zeit?
Bei ss<<buff: Du meinst: ss>>buf.

Und formatiere bitte deinen Code. Womit schreibst du?

Gruss
cwriter


----------



## reinholdweihs (19. Dezember 2013)

den Namen meines porgramms will ich hier mal nicht herschreiben, das mit den doubles kam daher das der Input strings sind daher habe ich versucht alles auf double zu stellen um einheitlichen datentyp zu haben,das mit dem X war nur ein versuch weil er bei der ausgabe einen fehler hingschrieben hat der so verschwunden ist


----------



## cwriter (19. Dezember 2013)

reinholdweihs hat gesagt.:


> den Namen meines porgramms will ich hier mal nicht herschreiben, das mit den doubles kam daher das der Input strings sind daher habe ich versucht alles auf double zu stellen um einheitlichen datentyp zu haben,das mit dem X war nur ein versuch weil er bei der ausgabe einen fehler hingschrieben hat der so verschwunden ist



Und jetzt? Funktioniert das ominöse, geheime Programm?
Sieh's mal so: Wir versuchen, zu helfen, und du gibst weder ein konkretes Problem noch nimmst du an, was wir sagen.
Der Input ist - einfach gesagt - ein String, ja. Erklärt das, warum du bei einer Funktion ein double einfügst, obwohl ein char* erwartet wird?

Gruss
cwriter


----------



## reinholdweihs (19. Dezember 2013)

Ich verfolge hier einfach die falsche Strategie, dahinter steckt ein grosses projekt das nicht funktioniert....Danke für eure Hilfe aber das was hier nicht passt muss ich offline lösen...DANKE JEDENFALLS FÜR EURE HILFE ,aber das muss ich offline lösen . DANKE******!


----------

