2017-09-13 1 views
-1

Ich habe die Aufgabe bekommen, ein Programm neu zu schreiben, das goto Statements verwendet, um zu zeigen, wie frustrierend sie sein können und ich habe gelernt, dass sie sehr frustrierend sind. Nachdem ich mehrere Stunden lang den Debugger durchgeblättert habe, stolpert es immer noch um Probleme. Gibt es jemanden, der das Pseudo-Code für mich schreiben könnte, damit ich es besser verstehen könnte? Abgesehen von der Erstellung von if und else Anweisungen für jeden goto bin ich verloren. C# Sudo Code für GoTo Programm

namespace Assignment_03_Nasty_Code 
{ 
    class Assignment03 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Assignment 03 = " + new Assignment03().Solve()); 
     } 

     public int Solve() 
     { 
      int result = 0; 
      int upperSearchLimit = 1_000_000; 
      Console.WriteLine("Building list of primes..."); 
      ArrayList primes = Utils.BuildListOfPrimes(upperSearchLimit); 
      Console.WriteLine(" Done."); 
      // Step through the odd composite numbers 
      for (int i = 19; i < upperSearchLimit; i+= 2) 
      { 
       Label02: 
       if (primes.Contains(i)) 
        goto Label03; 
       // Is the number divisible by a prime? 
       int j = 0; 
       Boolean match = false; 
       Label01: 
       int tmp; 
       int prime = (int)primes[j]; 
       tmp = i - prime; 
       int half = tmp /= 2; 
       int squareRoot = (int) Math.Sqrt(half); 
       if (tmp != squareRoot * squareRoot) 
        goto Label04; 
       // We got one 
       //System.out.println(i + " is a composite that can be written as the sum of a prime and twice a square"); 
       match = true; 
       Console.WriteLine(i + " = " + (int)primes[j] + " + 2 * " + half); 
       Label04: // Second goto 
       j++; 
       if ((int)primes[j] < i) 
        goto Label01; 
       if (match == false) 
       { 
        Console.WriteLine("No match for " + i); 
        result = i; 
        break; 
       } 
       //goto Label02; 
       Label03: // First goto 
       int x; 
      } 
      return result; 
     } 
    } 
} 
+3

Der erste, was ich würde den Code durch ein Formatierungsprogramm ausgeführt werden tun würde! –

+0

Diese Art von besiegt den Zweck, dann wieder, ich nehme an, der Zweck war es, mich zu lehren, nie eine Anweisung zu verwenden und gut, ich brauche nicht gesagt zu werden, warum danach. – shockemc

+1

Was er meinte, war das Einrücken zu beheben, die "Wand des Textes" ist unnötig hart, da es mehrere Probleme hinsichtlich der Wartbarkeit hat, die "Goto" -Anweisung ist nur eines dieser Probleme. Fixiere zuerst den Einzug und beginne dann mit goto. –

Antwort

0

Ich habe goto im Code ersetzt und das ist Ergebnis

public int Solve() 
{ 
    var result = 0; 
    var upperSearchLimit = 1_000_000; 
    Console.WriteLine("Building list of primes..."); 
    ArrayList primes = Utils.BuildListOfPrimes(upperSearchLimit); 
    Console.WriteLine(" Done."); 

    for (var i = 19; i < upperSearchLimit; i += 2) 
    { 
     if (primes.Contains(i)) 
     { 
      continue; 
     } 

     var j = 0; 
     var match = false; 
     do 
     { 
      int tmp; 
      var prime = (int)primes[j]; 
      tmp = i - prime; 
      var half = tmp /= 2; 
      var squareRoot = (int)Math.Sqrt(half); 
      if (tmp == squareRoot * squareRoot) 
      { 
       match = true; 
       Console.WriteLine(i + " = " + (int)primes[j] + " + 2 * " + half); 
      } 

      j++; 
     } while ((int)primes[j] < i); 

     if (match == false) 
     { 
      Console.WriteLine("No match for " + i); 
      result = i; 
      break; 
     } 
    } 

    return result; 
} 
+0

OP war explizit über ** nicht ** wollen eine "fertige Code" -Lösung. – Fildor

+0

(Ich habe nicht downvote ^^) – Fildor

+0

Ich hoffte wirklich auf einen Überblick über das, was der Code tut, im Gegensatz zu einer hart codierten Antwort, aber das funktioniert, danke. Dies ist jedoch viel einfacher zu verstehen. – shockemc