Учусь в инсте, сейчас выполняю практику по программированию на платформе .NET Framework.
Теоретического материала не предоставлено вообще, ищу по форумам и справочникам майкрософта.
Столкнулся с задачей:
"1.С помощью массива задать статистику посещения магазина. Магазин работал 10 недель, на каждой неделе было от 4 до 7 рабочих дней. Часть покупателей совершала покупки используя наличные деньги, часть покупателей расплачивалась с помощью пластиковой карты.
Посчитать:
•общее число покупателей
•сколько покупателей расплатились наличными
•сколько покупателей расплатились с помощью пластиковой карты
•в какие недели была ситуация, когда наличными платили больше, чем картой."
Сначала немного был ошарашен, ведь входных данных практически нет, но потом вспомнил, что это не математическая задача, а программирование и она вполне решаема.
Как я вижу решение:
1 - Нужно объявить массив массивов размерностью 10 строк на 7 столбцов (основной массив) - уже сутки мучаюсь, по массивам вообще никакого понятного для себя материала не нашёл.
2 - Ячейки основного массива заполнены одномерным массивом (матрицей-строкой) из двух элементов каждый (нал - безнал), который задан рандомом.
3 - Некоторые ячейки основного массива должны быть равны [0 0] (не более 3-х в строке), поскольку на каждой неделе от 4 до 7 рабочих дней. - Как вообще реализовать этот пункт?
4 - общее число покупателей это просто сумма всех элементов итогового массива
5 - сколько расплатились картами - сумма, предположим, всех первых ячеек массивов массива.
6 - соответственно, просто разница между вышеперечисленными суммами
7 - ситуация, когда наличными платили больше, чем картой это выборка сумм элементов построчно?
Помогите новичку разобраться и укажите на недочёты в предложенном мной решении.
Другие языки программирования и технологии
Как решить задачу в C#
using System;
using System.Linq;
namespace Example {
internal static class Program {
private static void Main() {
var payments = Create(10, 4);
Print(ref payments);
Console.WriteLine($"Общее число покупателей: {CountAll(ref payments)}");
Console.WriteLine($"Расплатились наличными: {CountCash(ref payments)}");
Console.WriteLine($"Расплатились картами: {CountCard(ref payments)}");
Info(ref payments);
Console.ReadKey();
}
private struct Payment {
public int Cash;
public int Card;
public override string ToString() { return Cash.ToString() + " : " + Card.ToString(); }
}
private static void Print(ref Payment[] payments) { foreach (var payment in payments) Console.Write(payment + " | "); }
private static void Print(ref Payment[][] payments) {
var line = new string('-', 55);
for (var i = 0; i != payments.Length; ++i) {
Print(ref payments[i]);
Console.WriteLine("\n" + line);
}
}
private static Payment[][] Create(int week, int day, int min = 4, int max = 9) {
var payments = new Payment[week][];
var rand = new Random();
const int n = 7;
for (var i = 0; i != week; ++i) {
var limit = rand.Next(day, n + 1);
payments[i] = new Payment[n];
var j = 0;
Payment payment;
while (j < limit) {
payment.Cash = rand.Next(min, max);
payment.Card = rand.Next(min, max);
payments[i][j] = payment;
++j;
}
while (j < n) {
payment.Cash = payment.Card = 0;
payments[i][j] = payment;
++j;
}
}
return payments;
}
private static int CountCash(ref Payment[] payments) { return payments.Sum(n => n.Cash); }
private static int CountCash(ref Payment[][] payments) { return payments.Sum(n => CountCash(ref n)); }
private static int CountCard(ref Payment[] payments) { return payments.Sum(n => n.Card); }
private static int CountCard(ref Payment[][] payments) { return payments.Sum(n => CountCard(ref n)); }
private static int CountAll(ref Payment[] payments) { return CountCash(ref payments) + CountCard(ref payments); }
private static int CountAll(ref Payment[][] payments) { return payments.Sum(n => CountAll(ref n)); }
private static bool MainlyInCash(ref Payment[] payments) { return CountCash(ref payments) > CountCard(ref payments); }
private static void Info(ref Payment[][] payments) {
for (var i = 0; i != payments.Length; ++i) {
var result = MainlyInCash(ref payments[i]) ? "Наличными" : "Картой";
Console.WriteLine($"{i + 1}. {result}");
}
}
}
}
using System.Linq;
namespace Example {
internal static class Program {
private static void Main() {
var payments = Create(10, 4);
Print(ref payments);
Console.WriteLine($"Общее число покупателей: {CountAll(ref payments)}");
Console.WriteLine($"Расплатились наличными: {CountCash(ref payments)}");
Console.WriteLine($"Расплатились картами: {CountCard(ref payments)}");
Info(ref payments);
Console.ReadKey();
}
private struct Payment {
public int Cash;
public int Card;
public override string ToString() { return Cash.ToString() + " : " + Card.ToString(); }
}
private static void Print(ref Payment[] payments) { foreach (var payment in payments) Console.Write(payment + " | "); }
private static void Print(ref Payment[][] payments) {
var line = new string('-', 55);
for (var i = 0; i != payments.Length; ++i) {
Print(ref payments[i]);
Console.WriteLine("\n" + line);
}
}
private static Payment[][] Create(int week, int day, int min = 4, int max = 9) {
var payments = new Payment[week][];
var rand = new Random();
const int n = 7;
for (var i = 0; i != week; ++i) {
var limit = rand.Next(day, n + 1);
payments[i] = new Payment[n];
var j = 0;
Payment payment;
while (j < limit) {
payment.Cash = rand.Next(min, max);
payment.Card = rand.Next(min, max);
payments[i][j] = payment;
++j;
}
while (j < n) {
payment.Cash = payment.Card = 0;
payments[i][j] = payment;
++j;
}
}
return payments;
}
private static int CountCash(ref Payment[] payments) { return payments.Sum(n => n.Cash); }
private static int CountCash(ref Payment[][] payments) { return payments.Sum(n => CountCash(ref n)); }
private static int CountCard(ref Payment[] payments) { return payments.Sum(n => n.Card); }
private static int CountCard(ref Payment[][] payments) { return payments.Sum(n => CountCard(ref n)); }
private static int CountAll(ref Payment[] payments) { return CountCash(ref payments) + CountCard(ref payments); }
private static int CountAll(ref Payment[][] payments) { return payments.Sum(n => CountAll(ref n)); }
private static bool MainlyInCash(ref Payment[] payments) { return CountCash(ref payments) > CountCard(ref payments); }
private static void Info(ref Payment[][] payments) {
for (var i = 0; i != payments.Length; ++i) {
var result = MainlyInCash(ref payments[i]) ? "Наличными" : "Картой";
Console.WriteLine($"{i + 1}. {result}");
}
}
}
}
Аблай Рустемов
Ого! Спасибо! Конечно, полного решения я вообще не ожидал! Пойду разбираться в коде, чтобы усвоить материал. Не подкинете комментариев?
для реального календаря и создаёшь для каждой даты массивчик работал/не работал руками.
для каждого рабочего дня генеришь список чеков. Можно расположить отдельно пофайлово или в одной куче
Программа последовательно читает инфу и раскладывает по выходным данным. Никаких массивов, всё тупо-примитивно.
для каждого рабочего дня генеришь список чеков. Можно расположить отдельно пофайлово или в одной куче
Программа последовательно читает инфу и раскладывает по выходным данным. Никаких массивов, всё тупо-примитивно.
Аблай Рустемов
Не подходит. Тема лабораторной и задание в задаче - массивы
Не вижу смысла делать массив по-недельно
делай просто массив данных, заполняй случайными данными а далее (приняв 0-й элемент за понедельник)
for(i=0;i<N;i+=7){arr[5]=0;arr[6]=0;} // обнуляем субботу+воскресенье
делай просто массив данных, заполняй случайными данными а далее (приняв 0-й элемент за понедельник)
for(i=0;i<N;i+=7){arr[5]=0;arr[6]=0;} // обнуляем субботу+воскресенье
Почему в объектно-ориентированном языке не используете объекты?
class Trade
{
public DateTime date;
public bool cash;//true - за наличный расчет, false - безналичный
public Trade(DateTime date, bool cash)
{
this.date = date;
this.cash = cash;
}
}
static void Main(string[] args)
{
List sdelki = new List();
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 08:22"), true));
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 09:02"), true));
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 09:28"), false));
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 12:00"), true));
sdelki.Add(new Trade(DateTime.Parse("15.06.2017 08:22"), true));
Console.WriteLine("Всего покупателей было {0}", sdelki.Count);
int nal = 0, plastic = 0;
for (int i = 0; i < sdelki.Count; i++) if (sdelki[i].cash) nal++; else plastic++;
}
| добавлено sdelki[i].date.DayOfWeek; возвращает день недели.
class Trade
{
public DateTime date;
public bool cash;//true - за наличный расчет, false - безналичный
public Trade(DateTime date, bool cash)
{
this.date = date;
this.cash = cash;
}
}
static void Main(string[] args)
{
List sdelki = new List();
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 08:22"), true));
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 09:02"), true));
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 09:28"), false));
sdelki.Add(new Trade(DateTime.Parse("14.06.2017 12:00"), true));
sdelki.Add(new Trade(DateTime.Parse("15.06.2017 08:22"), true));
Console.WriteLine("Всего покупателей было {0}", sdelki.Count);
int nal = 0, plastic = 0;
for (int i = 0; i < sdelki.Count; i++) if (sdelki[i].cash) nal++; else plastic++;
}
| добавлено sdelki[i].date.DayOfWeek; возвращает день недели.
Такую задачу можно решить путем кропотливого труда, углубления в тему задачи, алгоритмов и программирования в целом. Иначе никак :)
Данные можно забивать с текстового файла, так будет проще отлаживать, ведь каждый раз программе будут подаваться одни и те же данные, а не сгенерированные случайным образом. Это решит проблему 3 пункта.
Массив тут очень просто создать
int[][][] data = new int[2][][];
for (int i = 0; i < data.Length; i++)
{
data[i] = new int[7][];
for (int j = 0; j < data[i].Length; j++) data[i][j] = new int[10];
}
Хочу заметить, что размерности массива должны идти по возрастанию, то есть 2, 7, 10. С целью экономии оперативной памяти (Не буду углубляться, лучше почитать об этом).
Данные можно забивать с текстового файла, так будет проще отлаживать, ведь каждый раз программе будут подаваться одни и те же данные, а не сгенерированные случайным образом. Это решит проблему 3 пункта.
Массив тут очень просто создать
int[][][] data = new int[2][][];
for (int i = 0; i < data.Length; i++)
{
data[i] = new int[7][];
for (int j = 0; j < data[i].Length; j++) data[i][j] = new int[10];
}
Хочу заметить, что размерности массива должны идти по возрастанию, то есть 2, 7, 10. С целью экономии оперативной памяти (Не буду углубляться, лучше почитать об этом).
Аблай Рустемов
С текстового файла не катит у меня до этой задачи было 2 получасовых лекции - вводная, на которой hello world на экран выводили и по переменным, где тупо показана конвертация int в double и обратно ...потом сразу массивы на 20 минут, где разбиралась простейшая сортировка и всё....я вообще не знаю как по этим учебным материалам хоть что-то из этого сделать. Проблему пунка 3 можно решить проще - самостоятельно объявить, в какие дни были выходные, этого условия задачи не поясняют ведь. Если начну ещё в начале изучения языка добавлять работу с файлами и другие не пройденные темы, то буду месяц прыгать от темы к теме на одной задачке. Ещё как вариант заполнение элементов в процессе выполнения с клавиатуры...
Похожие вопросы
- Помогите решить задачи на C#
- Помогите решить задачу на C или C++, пожалуйста.
- Помогите решить задачу по C++
- Помогите решить задачу (Visual c++)
- Помогите решить задачи по C++
- помогите решить задачу математически. C++
- Помогите, пожалуйста, решить задачу в c++!!
- Помогите решить задачу на C++
- Помогите решить задачу на C++. Двумерные массивы.
- помогите решить задачу на c++