Microsoft Visual C# 2005

Diskutiere Microsoft Visual C# 2005 im Developer Network Forum im Bereich Hardware & Software Forum; Ich poste jetzt einfach mal meine Lösung, die ich schon seit einiger Zeit auf der Platte liegen habe, da ich morgen nicht dazu komme, Dein...
  • Microsoft Visual C# 2005 Beitrag #21
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Ich poste jetzt einfach mal meine Lösung, die ich schon seit einiger Zeit auf der Platte liegen habe, da ich morgen nicht dazu komme, Dein Programm anzuschauen.

Du bist aber schon nah dran ;-)

Code:
            Console.WriteLine("Geben sie bitte eine positive Zahl ein:");
            int zahl = Convert.ToInt32(Console.ReadLine());
            int phi = 0;

            for (int i = 1; i < zahl; i++) {
                Console.Write(i + ": ");

                bool teilerfremd = true;

                for (int j = 2; teilerfremd && j <= i; j++) {
                    if ((i % j) == 0 && (zahl % j) == 0)
                        teilerfremd = false;
                }

                if (teilerfremd) {
                    Console.Write("-");
                    phi++;
                }

                Console.WriteLine();
            }

            Console.WriteLine("phi: " + phi);
            Console.ReadLine();
 
  • Microsoft Visual C# 2005 Beitrag #22
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Vielen Dank schonmal im Vorraus! Jetzt hab ich bloss kurz eine Frage zum Quelltext an sich.

Code:
       for (int i = 1; i < zahl; i++) {
                Console.Write(i + ": ");

                bool teilerfremd = true;

                for (int j = 2; teilerfremd && j <= i; j++) {
                    if ((i % j) == 0 && (zahl % j) == 0)
                        teilerfremd = false;
                }

Also wenn teilerfremd true ist (logisches) und j<= i, nur dann geht er in die zweite For-Schleife?

Code:
                if (teilerfremd) {
                    Console.Write("-");
                    phi++;
                }

                Console.WriteLine();

Und hier, wenn teilerfremd am Schluss immernoch wahr ist mach einen Strich?
 
  • Microsoft Visual C# 2005 Beitrag #23
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Hexer1985 schrieb:
Vielen Dank schonmal im Vorraus! Jetzt hab ich bloss kurz eine Frage zum Quelltext an sich.

Code:
       for (int i = 1; i < zahl; i++) {
                Console.Write(i + ": ");

                bool teilerfremd = true;

                for (int j = 2; teilerfremd && j <= i; j++) {
                    if ((i % j) == 0 && (zahl % j) == 0)
                        teilerfremd = false;
                }
Also wenn teilerfremd true ist (logisches) und j<= i, nur dann geht er in die zweite For-Schleife?
Ich nehme einfach an, daß die beiden teilerfremd sind. Sobald ich aber einen Teiler gefunden habe, sind sie es nicht mehr und ich muß die restlichen Werte in der inneren Schleife nicht mehr prüfen. Das j<=i ergibt sich daraus, daß ich nur die kleineren Werte prüfen brauche.

Code:
                if (teilerfremd) {
                    Console.Write("-");
                    phi++;
                }

                Console.WriteLine();
Und hier, wenn teilerfremd am Schluss immernoch wahr ist mach einen Strich?
Genau. Zusätzlich zähle ich die Striche noch.
 
  • Microsoft Visual C# 2005 Beitrag #24
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Vielen Dank nochmal :) Jetzt hab ich wieder ne Frage zum Programm :) Wenn ich ne Datei einlesen will, wo muss ich die dann ablegen das das Programm drauf zugreifen kann? Im gleichen Ordner wie das Code-File funktioniert es nicht, warum weiss ich leider nicht
 
  • Microsoft Visual C# 2005 Beitrag #25
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Dort:
Code:
Console.WriteLine(System.Environment.CurrentDirectory);
 
  • Microsoft Visual C# 2005 Beitrag #26
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Dafür schonmal danke und dann hab ich die weiterührende Frage:
kann ich den Pfad verändern?
 
  • Microsoft Visual C# 2005 Beitrag #27
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Hexer1985 schrieb:
Dafür schonmal danke und dann hab ich die weiterührende Frage:
kann ich den Pfad verändern?
Ja. Normalerweise entspricht der Pfad dem Speicherort der EXE. Wenn Du das Programm per Verknüpfung startest, kannst Du dort einen anderen Pfad angeben.
Es ist auch möglich, im Programm selbst der Eigenschaft (s.o.) einen anderen Pfad zuzuweisen. Für Beispiele einfach den Cursor auf den Eigenschaftsnamen setzen und die Hilfe aufrufen.
 
  • Microsoft Visual C# 2005 Beitrag #28
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Guten Abend :) Ich hab heut mal bissle nachgelernt und hab gemerkt das ich einige Fragen hab vielleicht kann mir wer helfen und zwar gehts um Felder, hat jemand ne schlüssige Erklärung wie es funktioniert? Zum Beispiel kann ich die Aufgabe nicht lösen, die ich als PDF angehängt hab. zu 7.1 bräuchte ich eine Erklärung, wie immer ein herzlichs Danke.
 

Anhänge

  • 07_Übung.pdf
    46,5 KB · Aufrufe: 10
  • Microsoft Visual C# 2005 Beitrag #29
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
Halloechen,

ich schreibe mal in java Syntax... sollte aber in C# aehnlich sein:

public void f1(int ganzeZahl, String[] strings)
public String f2(char zeichen)
public String[] f3(float gleitPunktZahl1, float gleitPunktZahl2)
public char[] f4(String string)

Das solltest Du recht einfach auf C# umschreiben koennen. Bei Punkt 4 bin ich mit dem "Die Eingabe soll direkt auch selbst veraendert werden koennen" irgendwie verwirrt.

Gruss, FFNB.
 
  • Microsoft Visual C# 2005 Beitrag #30
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
FerFemNemBem schrieb:
Bei Punkt 4 bin ich mit dem "Die Eingabe soll direkt auch selbst veraendert werden koennen" irgendwie verwirrt.
Ich würde mal sagen, daß damit "ref" (oder "out") gemeint ist. Also "public char[] f4(ref string s)". Damit wird s als Referenz übergeben und Änderungen an s (in f4) sind auch für den Aufrufer sichtbar.


f1 ist aber etwas problematisch. Das Array selbst kann in f1 zwar nicht verändert werden, aber dessen Inhalt, also die Strings. Ich wüßte jetzt auch keine einfach Möglichkeit in C#, das zu verhindern.

Btw.: Eine sehr gute Informationsquelle für C#:
http://www.galileocomputing.de/openbook/csharp/index.htm
 
  • Microsoft Visual C# 2005 Beitrag #31
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Ich brauch dringend eure Hilfe, ich hab nen Termin verschlafenund muss was programmieren und jetzt komm ich net weiter :'( Erstmal die Aufgabenstellung:

Die beiden Dateien DAT54A1 und DAT54A2 enthalten der Größe nach geordnete reelle Zahlen, beginnend mit dem kleinsten Wert.

Vereinigen Sie diese beiden Dateien zu einer einzigen sequentiellen Datei GEMDAT54A, die alle Zahlen der Größe nach geordnet enthält.

Geben Sie den Inhalt dieser Datei in Zeilen zu je 4 Werten mit Hilfe einer Hilfsfunktion aus.

Also ich habs mir so gedacht:

Ich les die beiden Dateien zeilenweise ein (oder wäre es geschickter die Dateien ganz einzulesen, aber wie bzw. wo speichere ich dann die gelesenen Werte ab?), dann prüf ich welcher Wert kleiner ist und den schreib ich als erstes in die neue Datei, anschliessend den zweiten und dann die nächste Zeile einlesen. Wenn dann alle geschrieben sind gebe ich die erstellte Datei wieder zeilenweise aus. Wie komm ich jetzt aber an die Werte in der Datei und das ich mit denen arbeiten kann? Danke im Vorraus für eure Hilfe
 
Zuletzt bearbeitet:
  • Microsoft Visual C# 2005 Beitrag #32
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Hexer1985 schrieb:
Ich brauch dringend eure Hilfe, ich hab nen Termin verschlafenund muss was programmieren und jetzt komm ich net weiter :'( Erstmal die Aufgabenstellung:



Also ich habs mir so gedacht:

Ich les die beiden Dateien zeilenweise ein (oder wäre es geschickter die Dateien ganz einzulesen, aber wie bzw. wo speichere ich dann die gelesenen Werte ab?), dann prüf ich welcher Wert kleiner ist und den schreib ich als erstes in die neue Datei, anschliessend den zweiten und dann die nächste Zeile einlesen. Wenn dann alle geschrieben sind gebe ich die erstellte Datei wieder zeilenweise aus. Wie komm ich jetzt aber an die Werte in der Datei und das ich mit denen arbeiten kann? Danke im Vorraus für eure Hilfe
Klingt doch schon mal ganz gut. Die Dateien komplett einzulesen, ist nicht notwendig. Einfach zeilenweise lesen, in einer Variable zwischenspeichern und die Werte vergleichen und schreiben. Zum zeilenweisen Lesen nimmst Du die Klasse StreamReader und zum Schreiben den StreamWriter. In der Hilfe von VSC# zu diesen beiden Klassen sind Codebeispiele. Die noch richtig kombinieren und Du hast es.
Evtl. kannst Du auch die Fehlerbehandlung mit try und catch weglassen. Dann ist's noch einfacher.
 
  • Microsoft Visual C# 2005 Beitrag #33
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Da hab ich au n gutes Beispiel von meinem Prof, danke.Muss ichs dann so machen?

using System;
using System.IO;

class App
{
public static void Main()

{
FileStream fs1 = new FileStream("DAT54A1.txt", FileMode.Open);
StreamReader reader1= new StreamReader(fs1);
string/int zeile1;
while((zeile1 = reader1.ReadLine()) != null)
{
zahl1=reader1.ReadLine();
}


FileStream fs2 = new FileStream("DAT54A2.txt", FileMode.Open);
StreamReader reader2= new StreamReader(fs2);
string/int zeile2;
while((zeile2 = reader2.ReadLine()) != null)
{
zahl2=reader2.ReadLine();
}

FileStream fs3 = new Filestream(GEMDAT54A, FileMode.Create);
StreamWriter sw1 = new StreamWriter(fs3);

if ( zahl1 < zahl2)
{
sw1.WriteLine(zahl1 + "\n" + zahl2);
}

else
{
sw1.WriteLine(zahl2 + "\n" + zahl1);
}

//hilfsfunktion();
}
}
 
  • Microsoft Visual C# 2005 Beitrag #34
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Ich finds echt schade das es hier keine Löschenfunktion gibt. Hab ne neue Version programmiert, Die funktioniert sogar teilweise :)

- Also was mir fehlt ist die Hilfsfunktion, das zwar die Zahlenpaare geordnet sind aber in der Datei können Fehler auftreten

HTML:
<table>
<tr>
<td>-3</td>
<td>1</td>
</tr>
<tr>
<td>-2</td>
<td>6</td>
</tr>
</table>

Dann steht in der Datei
-3
1
-2
6

Weil immer nur das paar gecheckt wird aber nicht in der Datei. Wie realisiere ich das?
using System;
using System.IO;

class App
{
public static void hilfsfunktion()
{
//Hier muss eine Ausgabe her, die den Inhalt der Datei GEMDAT54A.txt mit 4 Werten pro Zeile ausgibt.
}

public static void Main()
{

//Einlesen der 1. Datei
FileStream fs1 = new FileStream("C:\\DAT54A1.txt", FileMode.Open);
StreamReader reader1 = new StreamReader(fs1);
string zeile1;

//Einlesen der 2. Datei
FileStream fs2 = new FileStream("C:\\DAT54A2.txt", FileMode.Open);
StreamReader reader2 = new StreamReader(fs2);
string zeile2;

//Erstellen der Datei
FileStream fs3 = new FileStream("C:\\GEMDAT54A.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(fs3);

while ((zeile1 = reader1.ReadLine()) != null && (zeile2 = reader2.ReadLine())!=null)
{


double zahl1 = Convert.ToDouble(zeile1);
double zahl2 = Convert.ToDouble(zeile2);

Console.WriteLine("Zahl1: " + zahl1);
Console.WriteLine("Zahl2: " + zahl2);


//Zum Feststellen wann der Zeilenumbruch kommt
sw.WriteLine("----");

if (zahl1 < zahl2)
{
sw.WriteLine(zahl1);
sw.WriteLine(zahl2);
}

else
{
sw.WriteLine(zahl2);
sw.WriteLine(zahl1);
}

}
sw.Close();
//hilfsfunktion();
}
}

- Es funktioniert nur wenn die Dateien gleich viele Zeilen hat

- Wenn die eine Datei länger ist als die andere, dann werden alle nicht belegten zeile mit 0 in die Datei geschrieben. Wie kann ich das verhindern?
 
  • Microsoft Visual C# 2005 Beitrag #35
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Die Hilfsfunktion selbst ist trivial. Du liest einfach die Werte der Reihe nach ein und nach 4 Werten gibst Du einen Zeilenumbruch aus. Etwas komplizierter wird's, wenn Du die Tabelle auch noch schön formatiert haben willst.

Zum Sortieren:
Du liest immer beide Werte gleichzeitig aus. Dann hast Du aber in folgendem Fall ein Problem:

Datei1: 1 5 6
Datei2: 2 3 4

Deshalb solltest Du immer nur lesen, wenn es auch nötig ist. Du bist fertig, wenn Du beide Dateien zuende gelesen hast. Hat den Vorteil, daß die Dateien auch unterschiedlich viele Zeilen haben können und das Ergebnis komplett sortiert ist und nicht nur einzelne Zahlenpaare.
 
  • Microsoft Visual C# 2005 Beitrag #36
R

RIP

Bekanntes Mitglied
Dabei seit
23.12.1999
Beiträge
369
Reaktionspunkte
0
Ort
Sondelfingen
also nach deiner methode wird ja die größere zahl immer gleich danach in die datei geschrieben, was aber wenn in der ersten stand: 1 2 5 und in der zweiten: 3 7? dann schreibt er ja natürlich in die ergebnisdatei: 1 3 2 7... weil du ja net prüfst, ob die zahl in der zweiten datei vielleicht auch größer als die nächste in der ersten datei ist.
würds eher so machen (immer nur die kleinere zahl reinschreiben und dann nur in der datei wo die kleinere war die nächste zahl lesen):
Code:
zeile1 = reader1.ReadLine();
zeile2 = reader2.ReadLine();
while(zeile1 != null || zeile2 != null){[INDENT] if(zeile2 = null || zeile1<zeile2){
[/INDENT][INDENT][INDENT]sw.WriteLine(zahl1);
[/INDENT][/INDENT][INDENT][INDENT] zahl1=reader1.ReadLine();
[/INDENT][/INDENT][INDENT] }
[/INDENT][INDENT] else if (zeile1 = null || zeile2<zeile1){
[/INDENT][INDENT][INDENT]sw.WriteLine(zahl2);[/INDENT][/INDENT][INDENT][INDENT] zahl2=reader2.ReadLine();
[/INDENT][/INDENT][INDENT]}
[/INDENT][INDENT] else
[/INDENT][INDENT] {
[/INDENT][INDENT][INDENT]sw.WriteLine(zahl1);[/INDENT][/INDENT][INDENT][INDENT] zahl1=reader1.ReadLine();
[/INDENT][/INDENT][INDENT][INDENT] sw.WriteLine(zahl2);
[/INDENT][/INDENT][INDENT][INDENT] zahl2=reader2.ReadLine();
[/INDENT][/INDENT][INDENT] }
[/INDENT]}
das mit der typconvertierung hab ich jetzt mal weggelassen, musste dann halt wieder reinbasteln, hab auch keine ahnung, ob des so klappt, is nur mal so ausm kopf runtergeschrieben, ohne zu testen oder so...

edit: war ich wohl etwas langsam, musste aber auch den code erstmal "erfinden" ;)
 
  • Microsoft Visual C# 2005 Beitrag #37
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Das Problem hatte ich erkannt und versucht mit der Table im HTML Darzustellen, war wohl nicht so erfolgreich ;) Aber auf jeden Fall mal herzlich danke für eure Hilfsbereitschaft. Ich hab mal RIPs Vorschlag ausprobiert, ist ein gute Einfall den ich teilweise schon probiert hatte aber leider gehts net weil

- man < net zwischen Strings anwenden kann und
- weil er an der stelle

Code:
                sw.WriteLine(zahl1);

                zahl1 = reader1.ReadLine();

sagt das er string nicht zu double konvertieren kann.

Deshalb solltest Du immer nur lesen, wenn es auch nötig ist. Du bist fertig, wenn Du beide Dateien zuende gelesen hast. Hat den Vorteil, daß die Dateien auch unterschiedlich viele Zeilen haben können und das Ergebnis komplett sortiert ist und nicht nur einzelne Zahlenpaare.

Soll ich dann quasi vor dem Lesen noch einen Check einfügen, der prüft ob schon ne größere Zahl vorhanden ist? Ich hatte mir überlegt, das ich vielleicht in der Hilfsfunktion noch eine Funktion schreibe die die Datei vor der Ausgabe prüft und komplett ordnet. Für nen Ansatz für ne einfache Lösung wär ich dankbar
 
  • Microsoft Visual C# 2005 Beitrag #38
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Hexer1985 schrieb:
Das Problem hatte ich erkannt und versucht mit der Table im HTML Darzustellen, war wohl nicht so erfolgreich ;) Aber auf jeden Fall mal herzlich danke für eure Hilfsbereitschaft.
Das muß schiefgehen, weil die Sortierung davor ja schon nicht paßt.

Ich hab mal RIPs Vorschlag ausprobiert, ist ein gute Einfall den ich teilweise schon probiert hatte aber leider gehts net weil

- man < net zwischen Strings anwenden kann und
- weil er an der stelle

Code:
                sw.WriteLine(zahl1);

                zahl1 = reader1.ReadLine();
sagt das er string nicht zu double konvertieren kann.
Das hat er ja dazugeschrieben, daß er keine Konvertierungen eingebaut hat.

Soll ich dann quasi vor dem Lesen noch einen Check einfügen, der prüft ob schon ne größere Zahl vorhanden ist? Ich hatte mir überlegt, das ich vielleicht in der Hilfsfunktion noch eine Funktion schreibe die die Datei vor der Ausgabe prüft und komplett ordnet. Für nen Ansatz für ne einfache Lösung wär ich dankbar
Nochmal ordnen ist überflüssig. Das sollte ja der erste Teil der Aufgabe schon machen.
Im Prinzip ist diese Lösung schon recht nah dran. Ich kann Dir auch meine Lösung posten. Ich denke allerdings nicht, daß Dein Lehrer Dir abkauft, daß Du die geschrieben hast ;-)
 
  • Microsoft Visual C# 2005 Beitrag #39
H

Hexer1985

Bekanntes Mitglied
Dabei seit
07.02.2006
Beiträge
146
Reaktionspunkte
0
Ort
Stuttgart / Karlsruhe
Oh, so kompliziert? Meinst du ich könnte diese Lösung net als Anhaltspunkt nehmen das ich so auf den Punkt komm der mir fehlt bzw. du könntest mir n Wink mit dem Zaunpfahl geben wo ich noch bissle wie drehen müsst ;)
 
  • Microsoft Visual C# 2005 Beitrag #40
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Meine Lösung hat einen ganz anderen Ansatz. Um das Programm kurz und einfach zu halten, hänge ich die beiden Dateien einfach hintereinander in eine Liste und lasse die dann sortieren. Bei sehr großen Dateien, ist diese Lösung nicht gearde schnell und benötigt auch mehr Speicher, als das zeilenweise Verarbeiten, wie in Deiner Lösung. Ich ignoriere auch die Tatsache, daß die Zahlen in den Dateien selbst schon sortiert sind.

Code:
        static void Ausgabe(List<string> l)
        {
            int i = 0;
            
            foreach(string s in l)
                Console.Write("{0,10:####.##}" + ((++i%4) == 0 ? "\n" : ""), Convert.ToDouble(s));
        }


        static void Main(string[] args)
        {
            List<string> l = new List<string>();
            l.AddRange(File.ReadAllLines("DAT54A1.txt"));
            l.AddRange(File.ReadAllLines("DAT54A2.txt"));

            l.Sort(delegate(string s1, string s2) {
                return Convert.ToDouble(s1).CompareTo(Convert.ToDouble(s2));
            });

            File.WriteAllLines("GEMDAT54A.txt", l.ToArray());
            
            Ausgabe(l);
 
Thema:

Microsoft Visual C# 2005

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben