H
Hexer1985
Bekanntes Mitglied
Stimmt die is kompliziert Wie könnte ich denn mit dem Ansatz meiner Lösung weiterkommen? Wo/Wie bau ich den Check nach Größe ein?
using System;
using System.IO;
class App
{
public static void hilfsfunktion()
{
int i = 0;
FileStream fshf = new FileStream("C:\\GEMDAT54A.txt", FileMode.Open);
StreamReader readerhf = new StreamReader(fshf);
string hf;
while ((hf = readerhf.ReadLine()) != null)
{
Console.Write(hf + " * ");
++i;
if (i % 4 == 0)
{
Console.WriteLine(" \n");
}
}
}
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);
int zähler = 0;
while ((zeile1 = reader1.ReadLine()) != null && (zeile2 = reader2.ReadLine())!=null)
{
double zahl1 = Convert.ToDouble(zeile1);
double zahl2 = Convert.ToDouble(zeile2);
if (zahl1 < zahl2)
{
sw.WriteLine(zahl1);
sw.WriteLine(zahl2);
}
else
{
sw.WriteLine(zahl2);
sw.WriteLine(zahl1);
}
zähler+=2;
}
sw.Close();
//FELD
FileStream fs4 = new FileStream("C:\\GEMDAT54A.txt", FileMode.Open);
StreamReader readersort = new StreamReader(fs4);
string zeilesort;
double [] feld = new double[zähler];
double xyz = Convert.ToDouble(zeilesort = readersort.ReadLine());
for (int no = 0; no < zähler; no++)
{
feld[no] = xyz;
if (feld[no - 1] < feld[no])
{
sw.WriteLine(feld[no - 1]);
}
}
sw.Close();
hilfsfunktion();
Console.WriteLine(zähler);
}
}
static void Main(string[] args)
{
string val1Str = null;
string val2Str = null;
double val1 = 0;
double val2 = 0;
StreamReader reader1 = new StreamReader(new FileStream("DAT54A1.txt", FileMode.Open));
StreamReader reader2 = new StreamReader(new FileStream("DAT54A2.txt", FileMode.Open));
StreamWriter writer = new StreamWriter(new FileStream("GEMDAT54A.txt", FileMode.Create));
do
{
// Einlesen
if (val1Str == null)
{
val1Str = reader1.ReadLine();
val1 = Convert.ToDouble(val1Str);
}
if (val2Str == null)
{
val2Str = reader2.ReadLine();
val2 = Convert.ToDouble(val2Str);
}
// Vergleichen
if (val1Str == null)
{
writer.WriteLine(val2);
val2Str = null;
}
else if (val2Str == null)
{
writer.WriteLine(val1);
val1Str = null;
}
else if (val1 <= val2)
{
writer.WriteLine(val1);
val1Str = null;
}
else if (val1 > val2)
{
writer.WriteLine(val2);
val2Str = null;
}
} while (val1Str != null || val2Str != null);
reader1.Close();
reader2.Close();
writer.Close();
hilfsfunktion();
}
Negative Zahlen werden korrekt behandelt. Bei Fließkommazahlen mußt Du nur aufpassen, daß Du keinen "." sondern ein "," schreibst, da das Programm automatisch das hierzulande übliche Format benutzt.Hexer1985 schrieb:Vielen Dank das du dich nochmal drum gekümmert hast Habs mal laufen lassen und es funktionert fast. Kann man irgendwie einbauen, dass es auch negative Zahlen korrekt behandelt? Ausserdem wenn die eine Datei länger ist als die andere ignoriert er einfach die zahlen die in der zweiten datei noch kommen würden.
while (!reader1.EndOfStream || !reader2.EndOfStream);
Beispiel:
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+2+2
6 = 2+2+2
6 = 1+1+1+3
6 = 1+2+3
6 = 3+3
6 = 1+1+4
6 = 2+4
6 = 1+5
Im Beispiel wäre 11 die Antwort (wenn ich richtig gezählt habe).
Schreiben Sie ein Testprogramm, das Ihre Funktion prüft.
(Eingabe -1)
static void Main()
{
Console.Write("Geben Sie einen Wert ein: ");
int eingabe = Convert.ToInt32(Console.ReadLine());
int grenze = (eingabe - 1);
anz_summen(grenze, eingabe);
}
static void Main(string[] args)
{
int summe = 6;
int grenze = summe - 1;
int anz_summen = count("", summe, grenze);
Console.WriteLine("Anzahl: " + anz_summen);
}
static int count(string ausgabe, int summe, int grenze)
{
if ...
else if ...
else
{
return count(ausgabe, summe, grenze - 1);
}
}
if(summe%grenze==0)
{
Console.Write(grenze + " ");
if (summe % grenze == 0)
{
Console.Write(grenze + " ");
}
else
{
while(grenze >= 0)
{
--grenze;
if(summe % grenze == 0)
{
Console.Write(grenze + " ");
}
}
}
Nene, das war nix. Überleg Dir einfach mal anhand meines (oder Deines) Beispiels, wie die Sache abläuft. Dann wird Dir auch klar, wie man die Anzahl der Summen suchen lassen kann. Der Algorithmus tut nichts anderes als stur durchzuzählen. Dabei zählt er die Summe jedesmal auf 0 runter.Hexer1985 schrieb:Das g8bt vielleicht wieder nen Extrapunkt Also ich hab mal versucht an Hand deines Ansatzes die If-Schleife zu füllen, meiner Ansicht nach schreibt er immer wenn Modulo 0 ist die Grenze auf solang bis grenze 0 ist
Durch die Rekursion werden die einzelnen Möglichkeiten nicht der Reihe nach zusammengesetzt. Deshalb funktioniert die direkte Ausgabe nicht bzw. liefert ein Durcheinander.Ich hab bloss no net verstandne für was du den String übergibst
count() ruft sich ja immer selbst auf. Irgendwann muß sie auch ein Ergebnis zurückliefern ;-)Hexer1985 schrieb:Ok, ich versuch mich nochmal, aber warum 1 zurückgeben? beim if
Dazu suchst Du den größten gemeinsamen Teiler (ggT) aller Zahlen von n und n-1, n-2,...,1, und machst immer einen Strich wenn 1 als ggT rauskommt. Das machst Du am besten mit dem Algorithmus von Euklid. Ist in ~ 4 Zeilen zu programmieren.Hexer1985 schrieb:Für jede ganze Zahl untersuchen wir jetzt alle kleineren ganzen Zahlen bis zur 1 einschließlich und machen jedes Mal einen Strich, wenn eine Zahl mit n keinen Teiler gemeinsam hat außer der 1.
using System;
class App
{
static int anz_summen(string ausgabe, int summe, int grenze)
{
if (summe == 0)
{
Console.Write(ausgabe);
return 1;
}
else if (summe >= grenze)
{
int note = grenze;
int erg = summe - note;
summe += erg;
return anz_summen(ausgabe, summe, grenze -1);
}
else
{
return anz_summen(ausgabe, summe, grenze - 1);
}
}
static void Main()
{
int summe = Convert.ToInt32(Console.Read());
int grenze = summe - 1;
int erg = anz_summen("", summe, grenze);
Console.WriteLine("Anzahl: " + erg);
}
}
static int count(string ausgabe, int summe, int grenze)
{
if (summe == 0)
{
// Wir haben eine Lösung gefunden
Console.WriteLine(ausgabe); // ausgeben
return 1; // und zählen
}
else if (summe >= grenze)
{
// grenze paßt in summe
// -> alle Möglichkeiten [1..grenze] durchprobieren und zusammenzählen
int anz_summen = 0;
for (int i = grenze; i > 0; i--)
anz_summen += count(ausgabe + i + " ", summe - i, i);
return anz_summen;
}
else
{
// grenze ist zu groß
// -> nächstkleinere Grenze probieren
return count(ausgabe, summe, grenze - 1);
}
}