1 Востаннє редагувалося 0xDADA11C7 (04.09.2021 19:11:15)

Тема: тестове завдання C#

Хто що може підказати, порадити по виконанню даного тестового завдання?
Не знаю з чого почати. І як логічно вибудовувати код, підбирати структуру коду. Що і де описувати?

російська

Наверное нужно создать клас - Бригада і в нем трьох людей і щоб у кожному був метод - обробляти фото?

Також не знаю, як робити модульне тестування

A job of 1000 images is going to be edited by a crew of 3 people:

·         P1: 1 image per 2 minutes

·         P2: 1 image per 3 minutes

·         P3: 1 image per 4 minutes

How long will this job take in total?

How many images will be edited by every person?



Scoring:

•  Correct answer and explain the necessary steps

•  Working code

•  It should work for any situation (amount of images, amount of people, individual speed)



Please focus on:

OOP implementation;
N-tier architecture implementation;
Unit testing  implementation;
General programing rules and standards usage.

2

Re: тестове завдання C#

На папері спочатку розв'яжіть, це варіація шкільної задачі про труби.

3 Востаннє редагувалося ch0r_t (02.09.2021 18:53:14)

Re: тестове завдання C#

Please focus on:
OOP implementation;
N-tier architecture implementation;
Unit testing  implementation;
General programing rules and standards usage.

Якого сенсу роблять ці побажання? - там буквально одна функція.

І чого ви пишете російською, Bing-Перекладач зламався?

Подякували: koala, leofun012

4

Re: тестове завдання C#

Якого сенсу роблять ці побажання?

Вочевидь, для демонстрації знайомства із цими концепціями.

Подякували: ch0r_t1

5

Re: тестове завдання C#

є таке завдання:

Case

A job of 1000 images is going to be edited by a crew of 3 people:

·         P1: 1 image per 2 minutes

·         P2: 1 image per 3 minutes

·         P3: 1 image per 4 minutes

How long will this job take in total?

How many images will be edited by every person?



Scoring:

•  Correct answer and explain the necessary steps

•  Working code

•  It should work for any situation (amount of images, amount of people, individual speed)

Please focus on:

OOP implementation;
N-tier architecture implementation;
Unit testing  implementation;
General programing rules and standards usage.

Розв'язок:
Завдання дали на співбесіді.

Підкажіть будь-ласка як його правильно оформити для взаємодії з користувачем, що переробити, можливо щось додати,щось поміняти?

namespace ImageMontageWorkers
{
    public class Image
    {
        public int Id { get; }
        public string Title { get; }
 
        public Image(int id, string title)
        {
            Id = id;
            Title = title;
        }
    }
}
using System;
using System.Collections.Generic;
 
namespace ImageMontageWorkers
{
    /// <summary>створення класу Працівник.</summary>
    public class Worker
    {
        /// <summary>ім'я працівника.</summary>
        public string Name { get; }
 
        /// <summary>Вертає фото, яке обробляє працівник.
        /// Если <see langword="null"/>,Це значить, що у працівника був простій . </summary>
        public Image CurrentImage { get; private set; }
 
        /// <summary>делегування методу для отримання працівником фото для обробки</summary>
        private readonly List<Image> getCurrentImage;
 
        /// <summary>Необхідний час для обробки.</summary>
        public int ProcessTime { get; }
 
        /// <summary>Час витрачений на обробку поточної картинки.</summary>
        public int ProcessingTime { get; private set; }
 
        // Список картинок оброблених працівником.
        private readonly List<Image> processedImages = new List<Image>();
 
        /// <summary>Іммутабельний список фото, оброблених працівником.</summary>
        public IReadOnlyList<Image> ProcessedImages;
 
        public Worker(string name, Func<Image> getCurrentImage, int processTime)
        {
            Name = name;
            this.getCurrentImage = getCurrentImage;
            ProcessTime = processTime;
            ProcessedImages = processedImages.AsReadOnly();
        }
 
        /// <summary>періоди часу, коли працівник працював</summary>
        public int CountWorkingInterval { get; private set; }
 
        /// <summary>Метод для виконання наступного інтервалу.</summary>
        public void NextWorkingInterval()
        {
            if (CurrentImage != null)
            {
                ProcessingTime--;
                CountWorkingInterval++;
            }
 
            if (ProcessingTime == 0)
            {
                if (CurrentImage != null)
                    processedImages.Add(CurrentImage);
 
                CurrentImage = getCurrentImage();
                if (CurrentImage != null)
                    ProcessingTime = ProcessTime;
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ImageMontageWorkers
{
    public class Brigade
    {
        private readonly Queue<Image> images = new Queue<Image>();
        private readonly List<Worker> workers = new List<Worker>();
 
        private Image GetNextImage()
        {
            if (images.Count == 0)
                return null;
 
            return images.Dequeue();
        }
        public Brigade()
        {
            for (int i = 0; i < 1000; i++)
            {
                images.Enqueue(new Image(i, $"картинка №{i + 1}"));
            }
 
            workers.Add(new Worker("Перший", GetNextImage, 2));
            workers.Add(new Worker("Другий", GetNextImage, 3));
            workers.Add(new Worker("Третій", GetNextImage, 4));
        }
 
        public bool NextWorkingInterval()
        {
            workers.ForEach(w => w.NextWorkingInterval());
 
            return images.Count != 0 ||
                workers.Any(w => w.CurrentImage != null);
        }
 
        public void WorkStart()
        {
            while (NextWorkingInterval())
            {
                Console.WriteLine($"Картинок в черзі: {images.Count}");
            }
 
            foreach (var worker in workers)
            {
                Console.WriteLine($"{worker.Name}: {worker.CountWorkingInterval} - {worker.ProcessedImages.Count}");
            }
        }
    }
}
        static void Main(string[] args)
        {
 
            Brigade brigade = new Brigade();
            brigade.WorkStart();

6

Re: тестове завдання C#

Шановний, ви серйозно хочете, щоб ми за вас завдання читали, чи що? Якщо ви не знаєте термінів з умови - почитайте літературу. Якщо знаєте - то ви ж здатні співставити умову з власним кодом, чи ні?

sasha87 написав:

Підкажіть будь-ласка як його правильно оформити для взаємодії з користувачем,

У вас же в умові:

N-tier architecture implementation;

sasha87 написав:

що переробити,

Ви задачу про труби в школі розв'язували? У басейні є 1000 літрів води, через першу трубу виливається літр за 2 хвилини, через другу за 3, через третю за 4, як швидко басейн спорожніє? Це на аркуші в три рядки розв'язується, а не кожен літр відстежується, куди тече.

sasha87 написав:

  можливо щось додати,щось поміняти?

У вас же в умові:

Unit testing  implementation;

7

Re: тестове завдання C#

Пан koala вже готовий влаштуватися на ту вакансію, а от з вами питання відкрите чи готові ви.

8

Re: тестове завдання C#

Кент Бек, "Розробка через тестування" (Kent Beck, Test-Driven Development)
Роберт Мартін, "Чиста архітектура" (Robert Martin, Clean Architecture)
Від вас очікують, що ви читали ці книжки. Або аналоги. Але без цього вас на цю роботу можуть не взяти.

9

Re: тестове завдання C#

код на c++. допоможіть переписати на C#

#include <iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
class IMG_Edit{
public:
    IMG_Edit()
    {
        int img=1000;
    int time=0;
    int group_quantity=3;
    Person = new double[group_quantity];
    for (int i=0;i<group_quantity;i++)
    {
        Person[i]=i+2;
    }
    
    };
IMG_Edit(int img,int group){
    this -> img=img;
    time=0;
    group_quantity=group;
    Person=new double[group_quantity];
    for (int i=0;i<group_quantity;i++)
    {
        Person[i]=i+2;
    }
    
};
    void set_speed(int p_num,int speed){
        Person[p_num-1]=speed;
    }
void set_img(int i)
    {
    img=i;
};
    void set_group(int group){
        group_quantity=group;
        delete[]Person;
        Person=new double [group_quantity];
        for(int i=0;i<group_quantity;i++){
            Person[i]=i+2;
        }
        
    };
    void show_info()
    {
        double temp_img=img;
        double img_per_min=0;
        for(int i=0;i<group_quantity;i++){
            img_per_min+=(1/Person[i]);
        }
        while(temp_img>=0)
        {
            temp_img=img_per_min;
            time++;
        }
    };
    double temp;
    if (time>60)
    {
        cout<<"this job will take in total:"<<time/60<<"hours"<<time%60<<"minutes"<<endl;
    }
    else{
        cout<<"this job will take in total:"<<time<<"minutes"<<endl;
    }
    for (int i=0;i<group_quantity;i++)
    {
        cout<<"Person"<<i+1<<"edited:"<<temp<<"images"<<endl;
    }
    time=0;
    cout<<endl;
};
    ~ IMG_Edit(){
        delete []Person;
    }
private:
    double img;
    double*Person;
    int group_quantity;
    int time;
};
void Menu()
{
    cout<<"choose option"<<endl;
    cout<<"1. Calculate & display the result"<<endl;
    cout<<"2. set images quantity"<<endl;
    cout<<"3. set amount of people in the group"<<endl;
    cout<<"4. set individual speed"<<endl;
    cout<<"0. Quit"<<endl;
};

    
int main()
{
    int answer=0;
    system("cls");
    IMG_Edit obj;
    cout<<"\n result of the task"<<endl;
    cout<<"Conditions: 100 images, 3 persons, default speed"<<endl;
    obj.show_info();
    cout<<endl;
    cout<<"choose option"<<endl;
    cout<<"1. change conditions"<<endl;
    cout<<"2. explanation to the answer"<<endl;
    cout<<"0. Quit"<<endl;
    cin>>answer;
    while(answer<0||answer>2)
    {
        cout<<"you entered an invalid value! try again..."<<endl;
        cin>>answer;
        
    }
    if (answer==2)
    {
        system("cls");
        cout<<"\n 2. explanation to the answer"<<endl;
        cout<<"first the number of processed images in 1 minute"<<endl;
        cout<<"s=1/p(s-speed of one person in one minute, p - speed of editing one picture by one person)"<<endl;
        cout<<"then summarize the value of the speed of all people in one minute"<<endl;
        cout<<"Next, create a cycle, the condition of wich is the presence of unprocessed images"<<endl;
        cout<<"each iterations of the cycle, substract from the number of unprocessed images the value"<<endl;
        cout<<"of the number of edited images in one minute by all people and increase the value of time by one minute"<<endl;
        cout<<"after the end of cycle, show the time in a readable form(hh,mm)"<<endl;
        cout<<"\n and display the number of edited images by each person"<<endl;
        cout<<"change conditions"<<endl;
        cout<<"0. Quit"<<endl;
        cin>>answer;
    }
    if(answer==1)
    {
        int img, group, speed, person;
        system("cls");
        cout<<"\n 2. input conditions"<<endl;
        cout<<"amount of images - \b\b"<<endl;
        cin>>img;
        cout<<"amount of people - \b\b"<<endl;
        cin>>group;
        IMG_Edit obj(img,group);
        do
        {system("cls");
            Menu();
            cin>>answer;
            while(answer<0||answer>4)
            {
                cout<<"you entered an invalid value! try again..."<<endl;
                cin>>answer;
            }
            switch(answer)
            {case 1:
                {
                    system("cls");
                    cout<<"\n1. calculate and display result\n\n"<<endl;
                    obj.show_info();
                    cout<<endl;
                    system("pause");
                    break;
                }
                case 2:
                {
                    system("cls");
                    cout<<"\n2. set images quantity\n\n"<<endl;
                    cout<<"amount of images - \b\b"<<endl;
                    cin>>img;
                    system("cls");
                    obj.set_img(img);
                    cout<<"\nnumber of images changed \n\n"<<endl;
                    system("pause");
                    break;
                }
                case 3:{
                    system("cls");
                    cout<<"\n3. set amount of people in the group \n\n"<<endl;
                    cout<<"amount of people - \b\b"<<endl;
                    cin>>img;
                    system("cls");
                    obj.set_group(group);
                    cout<<"\nnumber of people changed \n\n"<<endl;
                    system("pause");
                    break;                }
                case 4:{
                    system("cls");
                    cout<<"\n4. set individual speed\n\n"<<endl;
                    cout<<"amount of images - \b\b"<<endl;
                    cout<<"input number of people in the group\b\b"<<endl;
                    cin>>person;
            }
                    system("cls");
                    cout<<"\n\n how many minutes person needs for editing one image - \b\b"<<endl;
                    cin>>speed;
                    system("cls");
                    obj.set_speed(person, speed);
                    cout<<"\n\n individual speed of "<<person<<"person changed \n\n"<<endl;
                    system("pause");
                    break;

            }
        default;
            break;
                    
    }
    }while
        (answer!=0);
}
system("pause");
return 0;
    }

10

Re: тестове завдання C#

Я правильно зрозумів, що це тестове завдання при прийомі на роботу?

11

Re: тестове завдання C#

правильно

12

Re: тестове завдання C#

Спробував скомпілювати. Можете взяти будь-яку робочу програму на C# і щось там зіпсувати, це буде адекватний переклад.

13

Re: тестове завдання C#

sasha87 написав:

правильно

І тут постає питання. Тестове завдання дають, щоб побачити, чи впораєтеся ви із завданнями, які вам будуть кожного дня давати на роботі. Ви плануєте кожне завдання на роботі так само викладати на форум і просити, щоб його доробили за вас?

Подякували: 0xDADA11C7, leofun012

14

Re: тестове завдання C#

koala написав:
sasha87 написав:

правильно

І тут постає питання. Тестове завдання дають, щоб побачити, чи впораєтеся ви із завданнями, які вам будуть кожного дня давати на роботі. Ви плануєте кожне завдання на роботі так само викладати на форум і просити, щоб його доробили за вас?

Чого ж ні? Спочатку людина так "навчалася" і все прокатило, тому чому б їй так не "працювати"?

Подякували: leofun011

15

Re: тестове завдання C#

ні звичайно.

16

Re: тестове завдання C#

Тоді, будь ласка, виконайте, нарешті, завдання, яке вам задали. Не на абияк, а наскільки ви реально здатні. Літературу я вам порадив, і я не вірю, що ви не здатні її опанувати. Бо якщо це - ваша межа, то вам треба шукати іншу роботу.

17

Re: тестове завдання C#

іншу роботу в іншій сфері*

18

Re: тестове завдання C#

koala написав:

Ви задачу про труби в школі розв'язували? У басейні є 1000 літрів води, через першу трубу виливається літр за 2 хвилини, через другу за 3, через третю за 4, як швидко басейн спорожніє? Це на аркуші в три рядки розв'язується, а не кожен літр відстежується, куди тече.

я дурний і не шарю в математиці, але дайте ризикну:
це виходе 1л / 2хв + 1л / 3хв + 1л / 4хв  = 13л /12хв, тобто 13 літрів за 12 хвилин.
Ну а потім просто перетворюємо 13 літрів на 1000, і рахуємо кількість хвилин
13 / 12 = 1000 / X
(13 / 12) * x = 1000
x = 1000 * (12 / 13)
x = 12000 / 13 хвилин

Подякували: mamkin haker1

19

Re: тестове завдання C#

Код працює.
Це результат з дефолтними значеннями.
Person1edited:461.5images
Person2edited:307.7images
Person3edited:230.8images
Виходить що останнє фото обробляють три працівника одночасно. Як виправити цю помилку?

#include <iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
class IMG_Edit {
public:
    IMG_Edit()
    {
        img = 1000;
        time = 0;
        group_quantity = 3;
        Person = new double[group_quantity];
        for (int i = 0; i < group_quantity; i++)
        {
            Person[i] = i + 2;
        }
    };
    IMG_Edit(int img, int group) {
        this->img = img;
        time = 0;
        group_quantity = group;
        Person = new double[group_quantity];
        for (int i = 0; i < group_quantity; i++)
        {
            Person[i] = i + 2;
        }
        
    };
    void set_speed(int p_num, int speed) {
        Person[p_num - 1] = speed;
    };
    void set_img(int i)
    {
        
        img = i;
    };
    void set_group(int group) {
        group_quantity = group;
        delete[]Person;
        Person = new double[group_quantity];
        for (int i = 0; i < group_quantity; i++) {
            Person[i] = i + 2;
        }
        
    };
    void show_info()
    {
        double temp_img = img;
        double img_per_min = 0;
        for (int i = 0; i < group_quantity; i++) {
            img_per_min += (1 / Person[i]);
        }
        while (temp_img >= 0)
        {
            temp_img -= img_per_min;
            if (temp_img <= 0)continue;
            time++;
        }
        
        double temp = 0;
        if (time > 60)
        {
            cout << "this job will take in total:" << time / 60 << "hours" << time % 60 << "minutes" << endl;
        }
        else {
            cout << "this job will take in total:" << time << "minutes" << endl;
        }
        for (int i = 0; i < group_quantity; i++)
        {
            temp=(round(time/Person[i]*10))/10;
            cout << "Person" << i + 1 << "edited:" << temp << "images" << endl;
        }
        time = 0;
        cout << endl<<endl;
    };
    ~IMG_Edit() {
        delete[]Person;
    }
private:
    double img;
    double* Person;
    int group_quantity;
    int time;
};
void Menu()
{
    cout << "choose option" << endl;
    cout << "1. Calculate & display the result" << endl;
    cout << "2. set images quantity" << endl;
    cout << "3. set amount of people in the group" << endl;
    cout << "4. set individual speed" << endl;
    cout << "0. Quit" << endl;
};


int main()
{
    int answer = 0;
    system("cls");
    IMG_Edit obj;
    cout << "\n result of the task" << endl;
    cout << "Conditions: 100 images, 3 persons, default speed" << endl;
    obj.show_info();
    cout << endl;
    cout << "choose option" << endl;
    cout << "1. change conditions" << endl;
    cout << "2. explanation to the answer" << endl;
    cout << "0. Quit" << endl;
    cin >> answer;
    while (answer < 0 || answer>2)
    {
        cout << "you entered an invalid value! try again..." << endl;
        cin >> answer;
        
    }
    if (answer == 2)
    {
        system("cls");
        cout << "\n 2. explanation to the answer" << endl;
        cout << "first the number of processed images in 1 minute" << endl;
        cout << "s=1/p(s-speed of one person in one minute, p - speed of editing one picture by one person)" << endl;
        cout << "then summarize the value of the speed of all people in one minute" << endl;
        cout << "Next, create a cycle, the condition of wich is the presence of unprocessed images" << endl;
        cout << "each iterations of the cycle, substract from the number of unprocessed images the value" << endl;
        cout << "of the number of edited images in one minute by all people and increase the value of time by one minute" << endl;
        cout << "after the end of cycle, show the time in a readable form(hh,mm)" << endl;
        cout << "\n and display the number of edited images by each person" << endl;
        cout << "change conditions" << endl;
        cout << "0. Quit" << endl;
        cin >> answer;
    }
    if (answer == 1)
    {
        int img, group, speed, person;
        system("cls");
        cout << "\n 2. input conditions" << endl;
        cout << "amount of images - \b\b" << endl;
        cin >> img;
        cout << "amount of people - \b\b" << endl;
        cin >> group;
        IMG_Edit obj(img, group);
        do
        {
            system("cls");
            Menu();
            cin >> answer;
            while (answer < 0 || answer>4)
            {
                cout << "you entered an invalid value! try again..." << endl;
                cin >> answer;
            }
            switch (answer)
            {
                case 1:
                    system("cls");
                    cout << "\n1. calculate and display result\n\n" << endl;
                    obj.show_info();
                    cout << endl;
                    system("pause");
                    break;
                case 2:
                    system("cls");
                    cout << "\n2. set images quantity\n\n" << endl;
                    cout << "amount of images - \b\b" << endl;
                    cin >> img;
                    system("cls");
                    obj.set_img(img);
                    cout << "\nnumber of images changed \n\n" << endl;
                    system("pause");
                    break;
                case 3:
                    system("cls");
                    cout << "\n3. set amount of people in the group \n\n" << endl;
                    cout << "amount of people - \b\b" << endl;
                    cin >> img;
                    system("cls");
                    obj.set_group(group);
                    cout << "\nnumber of people changed \n\n" << endl;
                    system("pause");
                    break;
                case 4:
                {
                    system("cls");
                    cout << "\n4. set individual speed - \n\n" << endl;
                    cout << "amount of images - \b\b" << endl;
                    cout << "input number of people in the group - \b\b" << endl;
                    cin >> person;
                    while(person<1||person>group)
                    {
                        system("cls");
                        cout<<"\n You entered an invalid value!"<<endl;
                        cout<<"there are"<<group<<"persons in group..."<<endl;
                        cout<<"input correct number of person - \b\b"<<endl;
                        cin>>person;
                    }
                    system("cls");
                    cout << "\n\n how many minutes person needs for editing one image - \b\b" << endl;
                    cin >> speed;
                    system("cls");
                    obj.set_speed(person, speed);
                    cout << "\n\n individual speed of " << person << "person changed \n\n" << endl;
                    system("pause");
                    break;
                }
                default:
                    break;
            }
            
        } while (answer != 0);
    }
    system("pause");
    return 0;
}
Подякували: koala, FakiNyan2

20

Re: тестове завдання C#

О, нарешті ви знайшли єдине цікаве місце в завданні.
Не останнє фото, а останні 0.5+0.7+0.8 = 2 фото.
Я б запропонував так:
1. Всі числа оброблених фото округлюємо вниз і зберігаємо в масиві edited (замість одного числа temp); знаходимо суму і, відповідно, кількість недооброблених, які треба розподілити.
2. Для кожного недообробленого фото знаходимо час виконання (edited[i]+1)*person[i]; тому, в кого час мінімальний, збільшуємо edited[i] на 1.
Далі можна буде поговорити про можливу оптимізацію.

А тепер, будь ласка, все це на C#, з модульними тестами і багатошаровою архітектурою. Завдання досить конкретне, а ви невідомо чим займаєтеся.

Подякували: leofun011