Benchmarkprogramm in C#

Knieto

Cadet 1st Year
Registriert
Sep. 2012
Beiträge
13
Hallo zusammen,

ich sitze hier gerade an einer Aufgabe bei der ich Hilfe bräuchte, da ich noch ein ziemlicher Neuling auf dem Gebiet bin!

Aufgabe:

Ich soll in C# ein Programm erstellen.

Zur Leistungsbewertung von Computern werden sogenannte Benchmarkprogramme
verwendet. Eine Möglichkeit für ein solches Benchmarkprogramm die
Rechengeschwindigkeit eines Systems zu ermitteln ist es, das System alle Primzahlen in
einem vorgegebenen Wertebereich (z.B. 0 - 50E6) berechnen zu lassen.


Entwerfen Sie ein menügesteuertes Konsolenprogramm für ein einfaches Benchmark-
Programm, das mithilfe der Primzahlenberechnung arbeitet. Das Menü des
Konsolenprogramms soll dabei wie folgt aussehen:

1. Eingabe der unteren Grenze für den Test. (min 0)
2. Eingabe der oberen Grenze für den Test. (max 50000000)
3. Berechnung aller Primzahlen und Ausgabe der aktuellen Zeit vor und
nach der Berechnung. (Aufgabe b)


Zur Überprüfung, ob eine Zahl eine Primzahl ist, steht Ihnen der folgende Algorithmus
IsPrime als Struktogramm zur Verfügung:

result := true
dieWurzel :=sqrt(A := zahl)
für i := 2 bis dieWurzel
zahl mod i = 0
true
result := false
break
oder false




Programmieren Sie das Benchmark Programm am PC als C# Konsolenanwendung.
Die Ausgabe der aktuellen Uhrzeit vor und nach der Berechnung mit Hilfe des Befehls
Sytem.DateTime.Now soll dabei zunächst als Ausgabe ausreichen.

HINWEIS: Wenn Sie IsPrime als Methode programmieren möchten, verwenden Sie bitte
die folgende Deklaration:
private static bool IsPrime(int zahl)
{

}



Meine Frage:

ich habe bis jetzt noch keinen Schimmer, wie ich beginnen soll, da ich bisher noch nie eine Funktion programmiert habe!
Den variablen Wertebereich zu programmieren ist ja kein Thema. (Also obere und untere Grenzwerte festlegen)

Wie muss ich am besten weiter vorgehen! Habe auch schon mal im Netz geschaut, finde allerdings ein paar Lösungsansätze mit array, da wir dies noch nicht behandelt haben, kann ich es mir nur schwer vorstellen, das wir es benutzen sollen!

Ich erbitte keine Komplettlösung, sondern eher Hinweise wie ich weiter vorgehen soll! Also Step bei Step!


Danke
 
Es ist im Prinzip ganz einfach. Du programmierst als erstes die angegebene IsPrime()-Methode. Die steht schon fast komplett im Aufgabentext.

Und dann bastelst du eine Schleife (zB For-Schleife), die den angegebenen Definitionsbereich durchläuft. Und bei jedem Schleifendurchgang rufst du die IsPrime()-Methode mit der aktuellen Zahl aus dem Definitionsbereich auf. Die Rückgabe der Methode überprüfst du dann mit einem If-Konstrukt. Bei true lässt du dann die Zahl mit etwas Text ausgeben (zB "Die Zahl bla ist eine Primzahl.").
Ein Array ist nicht nötig, es sei denn, du willst die erkannten Primzahlen irgendwo später wiederverwenden (und da würde ich eher ne Liste oder nen HashSet nehmen).

Hast du das alles, fehlt nur noch das Menü, aber das ist das einfachste.
 
Zuletzt bearbeitet:
"Den variablen Wertebereich zu programmieren ist ja kein Thema. (Also obere und untere Grenzwerte festlegen)" <- dafür eignet sich ja sehr gut eine for-Schleife, mit Startwert untere Grenze, Endwert obere Grenze.

In dieser for-Schleife wird im Grunde ja immer nur mit dem aktuellen Zählwert der Schleife die Methode isPrime() aufgerufen.

Zuallererst würde ich also mal den entsprechenden isPrime()-Algorithmus implementieren.
 
Oder du benutzt eine Suchmaschine und gibst da ein: c# IsPrime
Unter den dann gefundenen Seiten wird schon was passendes dabei sein.
 
Mein vorschlag dazu:

Methode schreiben, die alle Zahlen innerhalb des Wertebereiches berechnet (z. B. findPrimes(lowerBound, upperbound) nennen):
- bekommt zwei Parameter (untere und obere Grenze)
- for-Schleifevon untere Grenze bis obere Grenze
- in der Schleife dann immer isPrime aufrufen

Dann in die Main-Methode den Konsoleninput schreiben und dort dann findPrimes(lowerBound, upperbound) aufrufen.
Vorher aktuelle Zeit speichern, danach aktuelle Zeit speichern und dann beides ausgeben (bzw. nicht vorher speichern, sondern direkt ausgeben).

Edit:
zu langsam ^^
 
r0b0t schrieb:
Oder du benutzt eine Suchmaschine und gibst da ein: c# IsPrime
Unter den dann gefundenen Seiten wird schon was passendes dabei sein.
... er hat doch extra geschrieben, dass er keine Komplettlösung will!
 
in der schule/ausbildung/hochschule/universität aufpassen soll auch ab und an helfen :)
das sind ja wirklich absolute grundlagen, die man dir/euch auch sicher vermittelt hat und nun zusammenhängend prüfen möchte.
wie man bei der aufgabenstellung nicht weiß "wo man anfangen soll" ist mir ein rätsel. klingt nach faulheit ;)

[EDIT]
ansonsten ist diese aufgabe nach dem lesen der grundlagenkapitel von fast jedem .net buch ohne mühe zu bewältigen!
 
Also muss ich den isPrime Algorithmus als erste Programmieren?
Vorher doch bestimmt die dazugehörigen Variablen?!

Wie sieht das denn aus, was muss ich denn genau schreiben?
Und was für Datentypen brauche ich denn? INT oder Bool?

result := true ;
dieWurzel := sqrt(A := zahl)

Also ich würde jetzt sagen, dass ich erstmal eine Variable "dieWurzel" in INT anlegen muss?!
der meckert bei mir schon, wenn ich sqrt eingebe, da sagt er immer im aktuellen Kontext nicht möglich!
Muss ich A auch als Variable deklarieren?
 
weiter verweisen ist nicht so toll, daher meine tipps:

* pseudocode kann nicht 1:1 als programm-code abgeschrieben werden!

* wenn man es von früher her betrachtet, deklairere zu beginn deiner funktion erst alle variablen mit typ die benögtist; also bool result und int dieWurzel (achtung akzeptiert nur ganzzahlige werte!)

* für c# programmierer kann der typ "var" ganz interssant sein der statisch vom compiler ausgewertet wird und den richtigen typ verwendet; für beginner aber nicht zum empfehlen, weil die übersichtlichkeit im code schnell verschwindet und man nicht mehr weiss mit welchen objekten man umgeht; zu beginn gemerkt!

* übergabe der paramater an funktionen sind auch wichtig, call-by-reference / call-by-value sollte hier ein begriff sein die man verstehen sollte; wobei in c# alle objekte als reference übergeben werden und einfache typen (int, bool) bei value;


// Anmerkung - Vorgehen
1) Überlege was benötigt wird

+ Menü Aufbau: 1, 2, 3

+ Methoden für Aufgabe: Benchmark, Berechnung, Ausgaben und Eingaben

+ Fehlerfälle verhindern


2) Programm

+ Menü sollte in einer Endlosschleife laufen und immer wieder auf eine Eingabe reagieren: bool exit = true; while (exit != true) { ... if (value == 0) { exit = true; }
+-- Mit if oder switch case die gewünschten Funktionen aufrufen die von der Einlesefunktion kommen

+ Funktion zum Werte einlesen, kann man wiederverwenden für upperBound und LowerBound; var x = System.ConsoleReadLine(); return int.parse(x);

+ Dann Funktion zum Benchmark schreiben
+-- Ausgabe der Zeit in als Methode: void PrintTimeOnConsole() { System.ConsoleWriteLine(System.DateTime.Now()); }
+-- Vorraussetzungen schaffen, das Algorithmus arbeiten kann; var y = System.Console.Readline();
+-- Abfrage ob untere grenze kleiner 0 ist, wenn ja 0 setzten; if (z < 0) { z = 0;}
+-- dann for-schleifen von unterer bis oberer grenze: for (int i = z; i <= z2_upperbound; z++) {... var result = isPrime(i); ... }
+-- wenn result == true zähler hochsezten oder so, wenn du mit zählen willst;
+-- Ausgabe der Zeit am Ende --> Achtung danach kommst du wieder in die Endlosschleife

+ methode "isPrime(int x) umsetzen die im pseudocode (was bei dir struktogramm ist) umsetzten;


3) Absichern

+ Überlegen ob Abhängigkeiten exisiteren, also Upper muss zuerst gesetzt werden nur dann kann Benchmark laufen
+ Fehleingaben bei der Eingabe

4) Testen und Debuggen
 
Zuletzt bearbeitet:
M0rpHeU5 schrieb:
übergabe der paramater an funktionen sind auch wichtig, call-by-reference / call-by-value sollte hier ein begriff sein die man verstehen sollte; wobei in c# alle objekte als reference übergeben werden und einfache typen (int, bool) bei value;

In C#, wie auch in Java, werden Objektreferenzen anders als häufig angenommen stets call-by-value übergeben, und der Grund liegt auch auf der Hand. Bei einfachen Typen hast du recht, es sei denn man verwendet die Schlüsselwörter out/ref.
 
Zuletzt bearbeitet:
@canrom :: danke für die schöne ausformulierung, ich hab mich hier ein bisschen flappsig ausgedrückt; (genau das wollte ich damit auch zum ausdruck bringen)
 
Also ich schicke euch mal meine Funktion die ich bisher gebastelt habe, wäre cool, wenn ihr mal drüber schauen könntet!

meine Variablen:

int num;
bool prime;

01. public bool IsPrime(int num)
02.{
03.bool _isPrime = true;
04.
05.if (num % 2 == 0) return false;
06.
07.for (int i = 3; i <= Convert.ToInt32(Math.Sqrt(num)); i = i + 2)
08.{
09.if (num % i == 0)
10.{
11._isPrime = false;
12.break;
13.}
14.}
15.return _isPrime;
16.}

Ist der Algorithmus so richtig?
 
Hast du von Hand die Zeilennummern reingeschrieben? For sowas gibt's
Code:
-Tags.
 
Nein das Programm ins Notepad ++kopiert, der macht da automatisch die Zahlen daneben?
Warum? Ist das von Bedeutung?
 
Bei jedem Durchlauf der Schleife die Wurzel neu zu berechnen ist eine schlechte Idee und außerdem entspricht die Funktion überhaupt nicht dem Pseudocode.

Wo hast du das abgeschrieben?
 
Im Forum gibt es die Möglichkeit Code entsprechend Formatieren zu lassen. (Das Rautensymbol) Beim nächsten mal dann :-) .

Grundsätzlich ist zu beachten, dass 2 auch eine Primzahl ist. Meines Wissens ist int in C# nicht in der Lage die Beispielzahl aus dem ersten Post darzustellen, ka. ob das relevant ist. Unsigned int wäre also so oder so angebracht. Und ob es funktioniert, solltest du am besten selbst Testen, hier ist keiner für deine Hausaufgaben zuständig. Natürlich darfst du aber Fragen, wenn du etwas nicht verstehst oder den Fehler nicht findest.

Lass das Programm einfach mal in Einzelschritten durchlaufen, dann weißt du mehr.

@asdfman: Korrekt, hatte wohl was falsch im Kopf, allerdings wären, nicht alle anderen automatisch Primzahlen. Trotzdem ist die Zwei eine :-)
 
Zuletzt bearbeitet: (Korrektur)
Lüg nicht! Wenn 1 eine Primzahl wäre, wäre keine andere eine Primzahl.

€: Vorher schrieb ich Mist. Sorry.
 
Zuletzt bearbeitet:
Knieto schrieb:
Nein das Programm ins Notepad ++kopiert, der macht da automatisch die Zahlen daneben?
Warum? Ist das von Bedeutung?
Nein, ich dachte du wolltest die Code-Boxen "per Hand" nachahmen.

Zur Korrektheit: Wenn die ersten 10 Primzahlen korrekt ausgegeben werden, würde ich behaupten, dass das Programm korrekt ist.
 
Zurück
Oben