2010-10-20 4 views
0

Pour une raison quelconque, je ne peux pas comprendre la logique d'un programme qui:programme de comparaison numérique très basique

  1. Prend une liste des numéros
  2. les traverse (via une pour chaque boucle) à trouver le moins
  3. affiche le moins via WriteLine

Si leastNumber doit être initialisé à 0, ne sera pas le leastNumber TOUJOURS 0? (j'ai fourni un fichier txt de base contenant une liste de divers entiers, c'est ce que TwoNumbers.txt est)


string[] lines = File.ReadAllLines ("TwoNumbers.txt"); 

int leastNumber = 999; 
int previousNumber = 0; 

foreach (string line in lines) 
{ 
    int currentNumber = int.Parse (line); 
    currentNumber = leastNumber; 
    if (currentNumber < previousNumber) 
    { 
    leastNumber = currentNumber; 
    } 
} 

Console.WriteLine ("The least number is: " + leastNumber); 
Console.ReadLine(); 

+0

Où est le problème, quelle est exactement votre question? –

+0

C'est la «fonctionnalité» que vous ne pouvez pas comprendre et à juste titre. – Viv

Répondre

2

Dans votre programme , vous remplacez le numéro actuel:

int currentNumber = int.Parse (line); 
currentNumber = leastNumber; 

La deuxième ligne provoquera le nombre actuel à 999 lors de la première itération, ce qui entraînera la mise à 0 de leastNumber après votre vérification.

Après ce point, currentNumber sera toujours défini sur 0 et restera ainsi.

Vous n'avez pas vraiment besoin du numéro précédent. Faites simplement:

string[] lines = File.ReadAllLines ("TwoNumbers.txt"); 

int leastNumber = int.MaxValue; 

foreach (string line in lines) 
{ 
    int currentNumber = int.Parse (line); 
    if (currentNumber < leastNumber) 
    { 
    leastNumber = currentNumber; 
    } 
} 

Console.WriteLine ("The least number is: " + leastNumber); 
Console.ReadLine(); 
+0

Merci, Reed. C'est exactement la solution que mon cerveau fatigué m'a montré tout à l'heure. – DonG

2

Essayez ceci:

string[] lines = File.ReadAllLines("TwoNumbers.txt"); 

int leastNumber = int.MaxValue; 

foreach (string line in lines) 
{ 
    int currentNumber = int.Parse(line); 

    if (currentNumber < leastNumber) 
    { 
     leastNumber = currentNumber; 
    } 
} 

Console.WriteLine("The least number is: " + leastNumber); 
Console.ReadLine(); 
+0

Merci Pieter. Mon vieux cerveau fatigué a vu ce problème quelques minutes avant que je revienne. – DonG

0

Votre problème est dans la comparaison.

Vous comparez currentNumber < previousNumber mais est toujours égal à 0 car vous ne lui avez affecté aucun élément.

0

Il existe des entiers NÉGATIFS, qui sont inférieurs à 0. Est-ce que quelque chose empêche les entiers négatifs d'être dans votre fichier texte?

+0

Excellent point. Non, il n'y a que des entiers positifs dans ma liste. Merci! – DonG

0

Bah. Je vois ce que j'ai fait.

string[] lines = File.ReadAllLines ("TwoNumbers.txt"); 

     int leastNumber = 0; 
     int previousNumber = 0; 

     foreach (string line in lines) 
      { 
      int currentNumber = int.Parse (line); 
      **currentNumber = leastNumber;** 

      if (leastNumber == 0 || currentNumber < leastNumber) 
       { 
       leastNumber = currentNumber; 
       } 
      previousNumber = currentNumber; 
      } 
     Console.WriteLine ("The least number is: " + leastNumber); 
     Console.ReadLine(); 

Il n'y a pas besoin de l'affectation currentNumber = leastNumber;

0

Si vous supposez que la liste des chaînes ints sont seulement à cause de votre méthode d'essai (en utilisant un fichier texte pour stocker vos données de test) et distillent cela à le problème à la main qui semble trouver la valeur entière la plus faible dans un jeu, vous pouvez utiliser LINQ pour le faire pour vous:

int[] listOfPositiveInts = new int[]{2,3,4,5,1,67}; 
var minInt = listOfPositiveInts.Min(); 
Console.WriteLine(minInt); 

Si votre problème d'affaires est de convertir un fichier texte intégral des chaînes représentant des nombres, vous devriez boeuf y notre solution un peu plus.

Si vous voulez comprendre l'algorithme, alors vous devriez essayer de penser en code pseudo

create variable to track current lowest number 
initialize tracking Variable to the first number in my array 
loop through the array of numbers to inspect 
if the number I'm inspecting is lower than my current lowest number 
    replace my current lowest number with the number I'm inspecting 
end loop 
Display lowest value found 

qui ressemble à ceci lorsque vous utilisez une boucle foreach

// test data 
int[] arrayOfNumbers= new int[]{2,3,4,5,1,67}; 

// search algorithm 
int lowestValueFound = arrayOfNumbers[0]; 
foreach(int i in arrayOfNumbers) 
{ 
    if (i < lowestValueFound) 
     lowestValueFound = i; 
} 
Console.WriteLine("Lowest value found is {0}", lowestValueFound); 

La conversion de chaîne là-dedans peut soyez juste du bruit si vous essayez de comprendre l'algorithme. Si vous essayez simplement de le faire, essayez d'utiliser le tableau des ints et d'utiliser LINQ à la place.

Questions connexes