Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung

Programmierthread

22 Beiträge, Schlüsselwörter: Programmierung Java C
BP1033
Diskussionsleiter
ehemaliges Mitglied

Lesezeichen setzen

Programmierthread

07.07.2018 um 13:39
Nachdem ich mir einen Knoten ins Hirn gedacht habe, ist es mir gelungen, ein Computerprogramm zusammenzuklamösern, mit welchem es 1. Möglich ist, zahlen in ihre Primfaktoren zu zerlegen (siehe die Methode factorize(), 2. den größten gemeinsamen Nenner (siehe findGCD(...)) und das kleinste gemeinsame Vielfach (siehe findLCM(...)) zu berechnen. Ich habe das in C# gemacht:

using System;
using System.Collections;

namespace ConsoleApp1
{
class Program
{
private static ArrayList primeFactorStrings = new ArrayList();

private static ArrayList primes = new ArrayList();
private static ArrayList primes2 = new ArrayList();
private static ArrayList nonPrimes = new ArrayList();
private static ArrayList numbersToRemove = new ArrayList();

static void Main(string[] args)
{

factorize();

findGCD("2 2 2", "2 2");

findLCM("2 2 2", "2 2");

Console.ReadLine();

}

private static string findLCM(string num1, string num2)
{
ArrayList divWithoutExponents = new ArrayList();
int a = convertPrimeFactorStringToInt(num1);
int b = convertPrimeFactorStringToInt(num2);
Console.WriteLine(a);
int res = (a*b)/(Int32.Parse(findGCD(num1, num2)));
Console.WriteLine("lcm: " + res);
return res.ToString();
}

private static int convertPrimeFactorStringToInt(string numberStr)
{
int res = 1;

for(int i=0;i<numberStr.Split(' ').Length;i++){
res *= Int32.Parse(numberStr.Split(' ')[i].Trim());
}

return res;
}

private static string findGCD(string num1, string num2)
{
ArrayList divWithoutExponents = new ArrayList();
ArrayList exponents = new ArrayList();

foreach (string v in num1.Split(' '))
{
double d = Double.Parse(v);

if (num2.Contains(v.Trim()) && !divWithoutExponents.Contains(d))
{

divWithoutExponents.Add(d);

}
}

foreach (double v in divWithoutExponents)
{
exponents.Add(minNumberOfOccurrences((int)v, num1, num2));
}

double res = 1;
try
{
for (int i = 0; i < divWithoutExponents.Count; i++)
{
res *= Math.Pow((double)divWithoutExponents[i], (double)exponents[i]);
}
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Exponents could not be found properly.");
}
Console.WriteLine("gcd: " + res);
return res.ToString();
}

private static double minNumberOfOccurrences(int v, string num1, string num2)
{
int a = 0;
int b = 0;

foreach (string exp in num1.Split(' '))
{
if (Int32.Parse(exp.Trim()) == v)
{
a++;
}
}

foreach (string exp in num2.Split(' '))
{
if (Int32.Parse(exp.Trim()) == v)
{
b++;
}
}
double res = a < b ? a : b;
return res;
}

private static void factorize()
{
Console.WriteLine("I want to do prime factorization with the natural number you enter.");
Console.WriteLine("Enter e to exit.");
Console.WriteLine("");

var input = Console.ReadLine();
int number = 0;
try
{
if (input.Equals("e"))
{
Environment.Exit(0);

}

if (input.Equals("gcd"))
{
/**
* Here and in the following if: IprimeFactorStrings.Count == 0 -> findGCD("2 2 2", "2 2");
*
* else: I can only compute the gcd of TWO numbers.
*
*/
Environment.Exit(0);

}

if (input.Equals("lcm"))
{
/**
* Here and in the following if: IprimeFactorStrings.Count == 0 -> findLCM("2 2 2", "2 2");
*
* else: I can only compute the lcm of TWO numbers.
*
*/
Environment.Exit(0);

}

else {

number = Int32.Parse(input);

}
}
catch (System.FormatException)
{
Console.WriteLine("Please write a natural number, don't write a decimal or any gibberish.");
}
catch (System.OverflowException)
{
Console.WriteLine("The number you entered is so big that I cannot parse it.");
}

if (number == 0)
{
Console.WriteLine("Not yet implemented, see methods LCM() and GCD()!");
}

if (isPrime(number))
{
primes.Add(number);
Console.WriteLine("The result is: " + string.Join(" ", primes.ToArray()));
//Cleanup
primes.Clear();
primes2.Clear();
nonPrimes.Clear();
numbersToRemove.Clear();
factorize();
}

for (double i = 2; i < number; i++)
{

if (isNatural((double)number / i) && !isPrime((int)(number / i)))
{
nonPrimes.Add((double)number / i);
}
if (isNatural((double)number / i) && isPrime((int)(number / i)))
{
primes.Add((double)number / i);
}
}

foreach (double n in nonPrimes)
{
foreach (double p in primes)
{
if (!isNatural(n / p))
{
numbersToRemove.Add(p);//Add these numbers to a List numbersToRemove,
}
}
}

foreach (double v in primes)
{
primes2.Add(v);
}

foreach (double r in numbersToRemove)
{//And remove them from the original list.
primes2.Remove(r);
}

string result = string.Join(" ", primes.ToArray()) + " " + string.Join(" ", primes2.ToArray());
Console.WriteLine("The result is: " + result);
//Add it to primeFactorStrings
primeFactorStrings.Add(result);
//Cleanup
primes.Clear();
primes2.Clear();
nonPrimes.Clear();
numbersToRemove.Clear();
factorize();

}



private static bool isNatural(double v)
{
return (v % 1) == 0;
}

private static bool isPrime(int numberToTest)
{
if (numberToTest == 1 && numberToTest == 2)
{
return true;
}
for (double d = 2.0; d < numberToTest; d++)
{
if (numberToTest % d == 0)
{
return false;
}
}
return true;
}


/*
internal class ReverseSort : IComparer
{
public int Compare(object x, object y)
{
return Comparer.Default.Compare(y, x);
}
}
*/
}
}


Wenn sonst noch jemand Bock auf Programmierung und so hat, dann nur her mit Ideen, Fragen, Code-Snippets ;)


melden
Anzeige

Programmierthread

07.07.2018 um 21:25
Sorry ich bin ja normal ein Freund von jeglicher Art Coding Firlefanz, aber so ist das eine absolute Zumutung.
Nutz doch für das Posten von Code sowas wie https://pastebin.com/ und poste dann den Link dazu, dann bleibt das Ganze formatiert und man kann es lesen ohne Kopfweh zu bekommen.

Abgesehen davon, was genau ist jetzt die Diskussionsgrundlage ? Willst du was zu dem Code wissen ?
Klar kann jetzt jeder irgendwelche Code-Snippets hier hin knallen, aber was genau soll das ?

Btw. schön ist der Code auch nicht, du vermischst Eingabe, Verarbeitung und Ausgabe. Außerdem nutzt du die static Variablen als globale Variablen. Wieso nutzt die eine komplett objekt-orientierte Sprache wie C#, wenn du klassischen C-Code damit schreibst :)


melden

Programmierthread

07.07.2018 um 21:47
if (numberToTest == 1 && numberToTest == 2)
{
return true;
}


Das ist btw. immer false, weil die Zahl niemals 1 und 2 gleichzeitig sein kann. Dadurch kommst du nie zum

return true;

, eventuell Oder (||) statt Und ?

Und vielleicht noch was, dass für den GCD von Interesse sein könnte, auch wenn ich nicht beurteilen kann ob du Euklid nutzt, weil der Code, wie gesagt, ohne Formatierung nahezu unlesbar ist => Euklidischer Algorithmus.
Lässt sich normal in ein paar Zeilen runter schreiben, siehe Pseudo-Code im Artikel.


melden
BP1033
Diskussionsleiter
ehemaliges Mitglied

Lesezeichen setzen

Programmierthread

08.07.2018 um 10:55
ArnoNyhm schrieb:numberToTest == 1 && numberT
Okay, das habe ich jetzt auskommentiert, scheint noch zu funktionieren, danke für den Hinweis.


melden

Programmierthread

08.07.2018 um 14:45
Also ich fand für die Ermittlung des grössten gemeinsamen Teilers die rekursive Methode immer am elegantesten. Hier mal ein Beispiel in C.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

long gcd(long x, long y);

int main(int argc, char **argv) {
    if (3 != argc) {
        printf("\nFalsche Anzahl Argumente\n");
        return 1;
    }
    
    long x, y, temp;

    x=atol(argv[1]);
    y=atol(argv[2]);

    if (x == y) {
        printf("\nx(%ld) und y(%ld) sind gleich gross\n", x, y);
        return 0;
    }

    if (y > x) {
        temp=x;
        x=y;
        y=temp;
    }

    printf("\nGroesster Teiler von %ld und %ld: %ld\n", x, y, gcd(x,y));
    
    return 0;
}

long gcd (long x, long y) {
    if (0 == y)
        return x;
    return gcd(y, x % y);
}


melden

Programmierthread

14.07.2018 um 14:42
Hat schon mal wer von euch einen Docker Container bei irgend einer der großen Cloud-Platformen deployed ?

Ich hätte da großes Interesse daran, allerdings finde ich die Preisauflistung ziemlich nutzlos. Diese ist meist abhängig von der CPU und Ram-Auslastung (gemessen in irgendwelchen Pseudo-Größen) die der Container hat. Daher kann ich kaum abschätzen was mich das am Ende des Monat kosten wird -.-


melden

Programmierthread

10.08.2018 um 06:40
@emodul: Wie hast Du die No-Break-Spaces in Deinen Code oben hineinbekommen?


melden

Programmierthread

10.08.2018 um 21:53
uatu schrieb:Wie hast Du die No-Break-Spaces in Deinen Code oben hineinbekommen?
Du hast die Lösung eigentlich schon in der Fragestellung drin. Es handelt sich tatsächlich um "Non-breaking space". Vom Vorgehen her sieht das so aus:
-Quellcode formatieren (in externem Editor oder IDE)
-Tabulatoren durch Leerzeichen ersetzen
-Sämtliche Leerzeichen durch "non-breaking space" ersetzen (Unicode: U+00A0)

Verwendet habe ich dafür GNU/Emacs, aber vermutlich geht das mit jedem beliebigen Editor, sofern er Unicode unterstützt.

emodul


melden

Programmierthread

10.08.2018 um 22:46
emodul schrieb: GNU/Emacs
Er nutzt nicht nur Emacs, er nennt es auch noch GNU/Emacs.

Stallman würde dir das sicher hoch anrechnen ... obwohl er würde das wohl eher für Selbstverständlichkeit verstehen :P


melden

Programmierthread

10.08.2018 um 23:02
@emodul: Danke.
emodul schrieb:... (in externem Editor oder IDE) ...
Das setzt voraus, dass man No-Break-Spaces über Paste in den Allmystery-Editor bekommt. Das funktioniert -- vermutlich Betriebssystem- und/oder Browser-abhängig -- nicht überall. Z.B. bei mir (Linux-artiges Betriebssystem und Firefox-artiger Browser) funktioniert es nicht. Ich habe inzwischen einen kruden Workaround gefunden, den ich für diejenigen, die das gleiche Problem haben, hier kurz beschreiben möchte:

- Text in externem Editor vorbereiten
- Tabulatoren durch Leerzeichen ersetzen
- Leerzeichen durch den html-Code &nbsp; ersetzen
- Copy&Paste in den Allmystery-Editor
- Einmal Vorschau und zurück (zwingend erforderlich, dabei werden die &nbsp;-Codes durch tatsächliche No-Break-Spaces ersetzt)
- Beitrag absenden

Ich habe mir mal angesehen, wie phpBB das Problem löst: Die setzen das [code]-Tag in die html-Tag-Kombination <pre><code> um. Dann klappt's auch mit den Leerzeichen. Das <pre>-Tag konnte man früher bei Allmystery manuell eingeben, mit dem neuen Editor funktioniert das allerdings nicht mehr. Ich werde an geeigneter Stelle mal vorschlagen, das [code]-Tag hier so wie bei phpBB umzusetzen, damit so Formatierungs-Unglücke wie im Eingangsbeitrag vermieden werden.


melden

Programmierthread

11.08.2018 um 10:15
Gerade noch mal durchgespielt, weil es schon eine kleine Weile her ist und ich auch eine ganze Weile rumexperimentiert habe, bis das dann klappte. Mit &nbsp; habe ich auch lange rumprobiert.

#include <stdio.h>

int main(void) {
    printf("huhu\n");
    return 0;
}
uatu schrieb:Das setzt voraus, dass man No-Break-Spaces über Paste in den Allmystery-Editor bekommt. Das funktioniert -- vermutlich Betriebssystem- und/oder Browser-abhängig -- nicht überall. Z.B. bei mir (Linux-artiges Betriebssystem und Firefox-artiger Browser) funktioniert es nicht.
Bei mir sieht die Ausgangslage ähnlich aus. Bei mir läuft ein GNU/Linux, Debian Version 9.5 um genau zu sein und der Browser ist Firefox (52.9.0).

Mein "Verfahren" mit GNU/Emacs ist vermutlich etwas einfacher, setzt aber voraus, dass man das richtige Unicode-Zeichen (U+00A0) in die Zwischenablage bekommt und weiss, wie man Emacs nutzt.
* Code normal formatieren in Editor oder IDE
* Code markieren mit C-x h
* M-x untabify
* M-x replace-string SPACE RET (U+00A0 einfügen) RET
* Zu kopierenden Code markieren und mit M-w in Zwischenablage bringen
* In Beitragsfenster im Browser einfügen


Sieht nach Arbeit aus, dauert aber nur ein paar Sekunden.
ArnoNyhm schrieb:Er nutzt nicht nur Emacs, er nennt es auch noch GNU/Emacs.
Ohne GNU könnte man mit Linux nicht so viel anfangen und von daher bin ich da schon fair und erwähne ab und zu, dass ich nicht Linux, sondern eben GNU/Linux nutze.

emodul


melden

Programmierthread

23.02.2019 um 09:58
Ich hab jetzt angefangen VIM zu nutzen bzw. ein VIM-Plugin mit meinem normalen Editor.
Irgendwie gefällt mir dieses 3-Mod Idee von VIM und ich kann mir gut vorstellen, dass man damit
verdammt fix werden kann wenn man etwas geübter damit ist :)

Ironischerweise musste ich erst indirekt dazu gezwungen werden damit zu arbeiten (musste letzte Zeit
auf der Arbeit viel auf nehzu blanken Vms arbeiten, auf denen der beste Editor noch VIM war), um
zu verstehen wieso so viele Leute VIM-Fans sind xD


melden

Programmierthread

23.02.2019 um 17:29
BP1033 schrieb am 07.07.2018:C# gemacht:
Sieht ganz nach Python aus.
Habe ich auch als EinstiegsProgramm gewählt um das Programmieren zu erlernen.
Später bei meiner Ausbildung dann aber nicht ganz so hilfreich ):

Aber cooler Thread !


melden

Programmierthread

23.02.2019 um 19:29
BossMeng schrieb:Sieht ganz nach Python aus.
Wo bitte siehst du da Python ?


melden

Programmierthread

23.02.2019 um 19:56
@BossMeng

Also das obere Programm ist ganz klar C#

(von einem FIAE)

:D


melden

Programmierthread

23.02.2019 um 21:15
ArnoNyhm schrieb:Ironischerweise musste ich erst indirekt dazu gezwungen werden damit zu arbeiten (musste letzte Zeit
auf der Arbeit viel auf nehzu blanken Vms arbeiten, auf denen der beste Editor noch VIM war), um
zu verstehen wieso so viele Leute VIM-Fans sind xD
Jetzt fehlt nur noch der finale, aber wichtige Schritt zu Emacs.
ArnoNyhm schrieb:Wo bitte siehst du da Python ?
knopper schrieb:Also das obere Programm ist ganz klar C#
Liegt wohl am Einschub von 4 Chars, dass das fälschlicherweise als Python "erkannt" wurde. Und viel mehr muss man über Python ja auch nicht wissen ;)

emodul


melden

Programmierthread

24.02.2019 um 09:25
ArnoNyhm schrieb:Wo bitte siehst du da Python ?
knopper schrieb:Also das obere Programm ist ganz klar C#

(von einem FIAE)
Sry Leute, hatte gerade noch in einem anderen Thread geschaut gehabt und beim falschen geantwortet ^^


melden

Programmierthread

26.02.2019 um 00:32
emodul schrieb:Liegt wohl am Einschub von 4 Chars, dass das fälschlicherweise als Python "erkannt" wurde
Naja, aber alleine schon an den Klammern sollte man erkennen, dass es KEIN Python ist.
emodul schrieb:Und viel mehr muss man über Python ja auch nicht wissen
Klingt so, als ob Du von Python nicht überzeugt bist. Wenn ja, wieso? Ist doch eine schöne Programmiersprache.


melden

Programmierthread

26.02.2019 um 07:06
emodul schrieb:Jetzt fehlt nur noch der finale, aber wichtige Schritt zu Emacs.
Dieser Krieg ist sehr viel älter als ich, damit möchte ich nichts zu tun haben :P

Emcas hatte ich auch schon genutzt, als ich ein wenig mit Common Lisp gespielt habe.
Hat mich aber nicht so überzeugt :) Auch wenn Emacs VIM in nichts nachsteht.
cromm schrieb:Klingt so, als ob Du von Python nicht überzeugt bist. Wenn ja, wieso? Ist doch eine schöne Programmiersprache.
Sie ist auch vom Tiboe Index zur Sprache des Jahres 2018 gewählt worden. Gut denke der Index ist vielleicht nicht der beste Indikator für die Popularität einer Sprache, aber es bleibt ein Indikator :)
Werde dieses Jahr vielleicht auch einen Python-Kurs an der örtlich VHS halten, bin mal gespannt :)


melden
Anzeige

Programmierthread

26.02.2019 um 10:05
cromm schrieb:Wenn ja, wieso? Ist doch eine schöne Programmiersprache.
Ich finde Python ist wirklich eine schöne Sprache bzw leicht zu erlernen. Da geratet man weniger in Abstand, Klammern etc Fallen als bei XML und HTM, CCS etc
cromm schrieb:Naja, aber alleine schon an den Klammern sollte man erkennen, dass es KEIN Python ist.
Jo, hab schon selbst gerafft, dass ich da was verwechselt habe ;)


melden
576 Mitglieder anwesend
Konto erstellen
Allmystery Newsletter
Alle zwei Wochen
die beliebtesten
Diskussionen per E-Mail.

Themenverwandt