Как заполнять массив введёнными пользователем числами?
Здравствуйте.
Столкнулся с непростой для себя задачей:
Пользователь вводит числа, и программа их запоминает.
Как только пользователь введёт команду sum, программа выведет сумму всех веденных чисел.
Выход из программы должен происходить только в том случае, если пользователь введет команду exit.
Программа должна работать на основе расширения массива.
Внимание, нельзя использовать List и Array.Resize
Моё решение выглядело как :
int sum = 0;
int[] firstMas = new int[0];
while (true)
{
string userInput = Console.ReadLine();
if (userInput == "exit")
{
break;
}
else if (userInput == "sum")
{
Console.WriteLine("Сумма введённых чисел равна " + sum);
break;
}
int[] secondMas = new int[firstMas.Length + 1];
int number = Convert.ToInt32(userInput);
secondMas[secondMas.Length - 1] = number;
firstMas = secondMas;
sum += number;
Console.WriteLine("Длинна массива: " + firstMas.Length);
Женя Залецкий, Комментарий преподавателя: 1)у нас нет первого и второго массива. Не раскрывает назначение.
2)сумма должна не постоянно считаться, а только когда пользователь это захочет
как я понял, каждое введённое число, должно попадать в массив, и только после ввода пользователем команды "sum", должны складываться все элементы массива и выдаваться их сума.
int[] firstMas = new int[0];
while (true) {
string userInput = Console.ReadLine();
if (userInput == "exit")
{
break;
}
else if (userInput == "sum")
{
int sum = 0;
for (int i = 0; i < firstMas.Length; i++)
sum += firstMas[i];
Console.WriteLine("Сумма введённых чисел равна " + sum);
}
else
{
int[] secondMas = new int[firstMas.Length + 1];
int number = Convert.ToInt32(userInput);
secondMas[secondMas.Length - 1] = number;
for (int i = 0; i < firstMas.Length; i++)
secondMas[i] = firstMas[i];
firstMas = secondMas;
Console.WriteLine("Длинна массива: " + firstMas.Length);
}
Новый вариант
int[] arr = new int[0];
while (true){
string s = Console.ReadLine();
switch (s){
case "exit":
return;
case "sum":
Console.WriteLine(String.Format("Сумма введённых чисел = '{0}'", arr.Sum()));
break;
default:
int result;
if (int.TryParse(s, out result))
arr = arr.Concat(new int[] { result }).ToArray();
break;
}
}
можно компактнее (а значит более читаемо, обычно это предпочтительно)
...
// интерполяция строк тут удобнее
Console.WriteLine($"Сумма введённых чисел = '{arr.Sum()}'");
...
// предварительное объявление result не требуется
if (int.TryParse(s, out var result))
arr = arr.Concat(new int[] { result }).ToArray();
и если вернуть if-ы, только без скобок (тут они реально не нужны, все действия однострочные). то итоговая конструкция будет гораздо компактнее и элегантнее, чем с использованием switch
using System;
using System.Linq;
namespace array_no_list
{
class Program
{
static void Main(string[] args)
{
int[] arr = new int[0];
while (true)
{
string s = Console.ReadLine();
switch (s)
{
case "exit":
return;
case "sum":
Console.WriteLine(String.Format("Сумма введённых чисел = '{0}'", arr.Sum()));
break;
default:
int result;
if (int.TryParse(s, out result))
arr = arr.Concat(new int[] { result }).ToArray();
break;
}
}
}
}
}
мой, опираясь на модерн языка (хотя и не только )) - 19 строк
using System;
using System.Linq;
namespace array_no_list
{
class Program
{
static void Main(string[] args)
{
var arr = Array.Empty<int>();
var s = "";
while ((s = Console.ReadLine()) != "exit")
if (s == "sum")
Console.WriteLine($"Сумма введённых чисел = '{arr.Sum()}'");
else if (int.TryParse(s, out var result))
arr = arr.Concat(new int[] { result }).ToArray();
}
}
}
using System;
using System.Linq;
namespace array_no_list
{
static class Program
{
static void Main(string[] args)
{
var arr = Array.Empty<int>();
var s = "";
while ((s = Console.ReadLine()) != "exit")
if (s == "sum")
Console.WriteLine($"Сумма введённых чисел = '{arr.Sum()}'");
else if (int.TryParse(s, out var result))
arr = arr.Append(result).ToArray();
}
}
}
согласитесь, arr = arr.Append(result).ToArray(); смотрится (да и читается) лучше и проще
int[] arr = new int[0];
for(string s;(s = Console.ReadLine()) != "exit";arr = arr.Concat((int.TryParse(s, out var result)) ? new int[] { result } : new int[0]).ToArray())
Console.Write(s == "sum"?String.Format("Сумма введённых чисел = '{0}'\n", arr.Sum()):"");
или вариант с нарушением условия ТЗ, ну функционал прежний
for (string s,sum = "0"; (s = Console.ReadLine()) != "exit"; sum = int.TryParse(s, out var result) ? (Convert.ToInt32(sum)+result).ToString():sum)
Console.Write(s == "sum" ? String.Format("Сумма введённых чисел = '{0}'\n", sum) : "");
twobomb, си такой си (его фор )))...
1 - читаемость убита
2 - вообще то, действия, тоже можно перечислять через запятую. в смысле оба варианта можно сократить еще на строку ;)))
но п1 станет просто ужасом )))
var arr = Array.Empty<int>();
for (var s = ""; (s = Console.ReadLine()) != "exit"; arr = arr.Append(int.Parse(s)).ToArray(), Console.Write(s == "sum" ? $"Сумма введённых чисел = '{arr.Sum()}'" : "")) ;
// тут for один оператор, по тому имеет право на одну строку
// и да, это ужас тоже работает )))
3 - а еще, кроме int.TryParse есть int.Parse, а еще Convert )))
twobomb, мой крайний вариан, кроме лаконичности, хорош именно читабельностью ))
.. но если вдруг в голову придет какой нить изврат с лямбдами, я напишу ))
#, Ну так то да, ну если не будет никаких действий в внутри цикла, придется {} скобки ставить
int[] arr = new int[0];
for (string s; (s = Console.ReadLine()) != "exit"; arr = arr.Concat((int.TryParse(s, out var result)) ? new int[] {result} : new int[0]).ToArray(),Console.Write(s == "sum" ? String.Format("Сумма введённых чисел = '{0}'\n", arr.Sum()) : ""))
{}
Жаль нельзя по жаваскриптовскому написать типа
for (string s,int[] arr = new int[0]; (s = Console.ReadLine()) != "exit"; arr = arr.Concat((int.TryParse(s, out var result)) ? new int[] {result} : new int[0]).ToArray(),Console.Write(s == "sum" ? String.Format("Сумма введённых чисел = '{0}'\n", arr.Sum()) : ""))
{}
Ну осталось только преподавателю теперь это всё показать, чтобы глаза на лоб полезли :D
Ну так то да, ну если не будет никаких действий в внутри цикла, придется {} скобки ставить
с чего вдруг? ))
внимательнее к каменту выше - он заканчивается ; ;))) .. не поверю что C# 6 этого не допускает. это уже опять же сишное наследие - пустой оператор )))
Ну осталось только преподавателю теперь это всё показать, чтобы глаза на лоб полезли :D
.. ну да, я бы тоже не проч взглянуть на препода, в подобной ситуации )))