0
votes

Projet C #. Essayer de trouver la moyenne, le plus petit nombre, le plus grand nombre et le nombre de nombres dans un fichier .txt

J'essaie d'écrire une application console C # qui prendra l'entrée d'un fichier texte de nombres. À partir des nombres, j'ai besoin de trouver le nombre de nombres, le plus grand des nombres, le plus petit des nombres et la moyenne des nombres.

int NumberCounter = 0;
string NumberLines;

//Code to Read the file and display Each Line seperately.  
System.IO.StreamReader NumbersFile = new System.IO.StreamReader(@"c:\Numbers.txt");
while ((NumberLines = NumbersFile.ReadLine()) != null)
{
    System.Console.WriteLine(NumberLines);
    NumberCounter++;
}

NumbersFile.Close();
System.Console.WriteLine("There Are {0} lines.", NumberCounter);
Console.ReadLine();

Comme vous pouvez le voir, je n'ai que le décompte pour le moment. Essayer d'utiliser n'importe quelle sorte d'équation pour comparer le Streamreader à autre chose entraîne une erreur d'incompatibilité de type. Je suis un débutant ici, donc je suis un peu perdu.

Merci d'avance.


5 commentaires

Donc, chaque ligne contient un seul numéro?


Vous devez vous renseigner sur les collections, les collections génériques pour commencer.


Si chaque ligne est un seul nombre <2x10 ^ 9, vous pouvez utiliser Int32.Parse ou Int32.TryParse pour le convertir en un entier.


Salut! On dirait que vous cherchez quelqu'un pour résoudre un problème à votre place - le débordement de pile concerne davantage les erreurs spécifiques et la façon de les résoudre, cela a une solution très simple avec un peu de recherche sur Google, vous voudrez peut-être consulter le stackoverflow.com/help/how-to-ask


Veuillez définir le nombre. Est-ce un entier? S'il s'agit d'un nombre réel, veuillez préciser le format.


6 Réponses :


2
votes

vous pouvez faire ceci:

var text = File.ReadAllLines(@"c:\Numbers.txt");
var numbers = text.Where(l=>int.TryParse(l, out int _)).Select(l => int.Parse(l)).ToList();
var max = numbers.Max();
var min = numbers.Min();
var average = numbers.Average();
var total = numbers.Count();


0 commentaires

2
votes

Vous pouvez utiliser File.ReadAllLines avec Int32.Parse , puis utilisez Linq pour calculer Min , Max , Count et Moyenne .

Par exemple,

var lines = File.ReadAllLines(filePath);    
var numbers = lines.Select(x=>Int32.Parse(x)); // Or Double.Parse or... Depending on expected numeric type
var min = numbers.Min();
var max = numbers.Max();
var average = numbers.Average();
var count = numbers.Count();


5 commentaires

Je préférerais un code qui utilise var , comme vous l'avez suggéré, changer le code pour gérer les doubles (ou un autre type de données) serait aussi simple que de changer Int32.Parse en Double.Parse.


@ROBERTMCKEE Mais pour avoir répondu à une question ici, il n'est pas clair que l'une de ces méthodes reviennent.


De plus, je ne suis pas d'accord avec le sentiment; ok dans le contexte de ces 5 lignes de code, vous auriez raison, mais en termes généraux, changer le type de données d'une variable casserait souvent votre code.


@JohnathanBarclay C'est bien que vous soyez en désaccord avec ce sentiment, mais c'est votre opinion. Un que je ne partage pas et que même l'équipe de redéploiement ne partage pas (il vous recommandera de les changer en var par défaut). Si vous vous souciez du type (rare), il est trivial de le déterminer, ou passez votre souris dessus et VS vous le dira. Dans tous les autres cas, le type est juste du bruit et distrait de l'objectif du code.


@JohnathanBarclay L'utilisation de var ou de types explicites est purement des préférences du développeur. Personnellement, je préfère var car pour moi, cela augmente la lisibilité en supprimant les noms de types qui, comme Robert l'a appelé, pourraient être bruyants



4
votes

Vous pouvez lire toutes les valeurs dans une liste, puis les parcourir pour calculer vos différentes valeurs, ou vous pouvez faire quelque chose comme ce qui suit pour traiter facilement des fichiers extrêmement volumineux:

var largest = int.MinValue;
var smallest = int.MaxValue;
var count = 0;
var total = 0;
foreach(var line in File.ReadLines(@"c:\Numbers.txt"))
{
  var value = int.Parse(line);
  count++;
  largest = Math.Max(largest,value);
  smallest = Math.Min(smallest,value);
  total += value;
}
var average = total/count;

Si vous n'êtes pas lié au StreamReader, j'utiliserais ce qui suit:

string NumberLines;
var largest = int.MinValue;
var smallest = int.MaxValue;
var count = 0;
var total = 0;
using(var NumbersFile = new System.IO.StreamReader(@"c:\Numbers.txt"))
{
  while ((NumberLines = NumbersFile.ReadLine()) != null)
  {
    var value = int.Parse(NumberLines);
    count++;
    largest = Math.Max(largest,value);
    smallest = Math.Min(smallest,value);
    total += value;
  }
}
var average = total/count;


2 commentaires

C'est le plus efficace car il n'itère qu'une seule fois, mais certainement moins lisible que LINQ.


Oui, il utilisera beaucoup moins de CPU et une quantité fixe insignifiante de mémoire.



2
votes

Jetez un œil à File.ReadLines qui renvoie une IEnumerable .

Le IEnumerable peut être utilisé avec LINQ qui a des méthodes pratiques d'agrégation:

IEnumerable<string> numberStrings = File.ReadLines(@"c:\Numbers.txt");
IEnumerable<double> numbers = numberStrings.Select(s => double.Parse(s));

double smallest = numbers.Min();
double largest = numbers.Max();
double average = numbers.Average();


0 commentaires

2
votes

Vous devez commencer par déclarer une List avant votre boucle while dans laquelle enregistrer les numéros que vous trouvez dans votre fichier.

int max = numbersInFile.Max();


0 commentaires

-1
votes

Je pense que si vous en aurez besoin dans List, Stack, Queue, massive et m. J'utiliserai massive. Donc, obtenez Number, obtenez les chiffres de Number (en boucle alors que le nombre n'est pas 0: pour cela, obtenez le nombre mod 10, divisez le nombre par 10), écrivez Number en massif, obtenant Max, Average, Min, Count of Massif du même nom les fonctions. )))) SO ceci est mon code:

int NumberCounter = 0;
int[] massive = new int[1000]
string NumberLines;

//Code to Read the file and display Each Line seperately.  
System.IO.StreamReader NumbersFile = new System.IO.StreamReader(@"c:\Numbers.txt");
while ((NumberLines = NumbersFile.ReadLine()) != null)
{
   System.Console.WriteLine(NumberLines);
int number = int.Parse(NumberLines);
int number1 = number;
while(number1!=0)
{
s = number1 %1 0;
number1 /= 10;
Console.WriteLine(s);
}
massive[NumberCounter]=number;
    NumberCounter++;
}
NumbersFile.Close();
Console.WriteLine(massive.Average());
Console.WriteLine(massive.Max());
Console.WriteLine(massive.Min());



System.Console.WriteLine("There Are {0} lines.", NumberCounter);
Console.ReadLine();


3 commentaires

Désolé, je ne comprends pas votre réponse. Qu'est-ce qu'un massif? Et comment le déclarez-vous?


J'ai oublié de l'écrire Désolé. : (((


J'ai supprimé massive.