Форум программистов, компьютерный форум CyberForum.ru

Составить ежедневные списки посещения медпункта - C++

Восстановить пароль Регистрация
 
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
28.06.2012, 19:25     Составить ежедневные списки посещения медпункта #1
Итак, задачка следующая - N сотрудников (известны фамилии) работают в две смены по индивидуальному графику (1-й день-"утро", 2-й день-"вечер", 3-й день-"выходной"). Все они в свое нерабочее время должны пройти диспансеризацию в медпункте, который работает ежедневно в две смены. В день начала диспансеризации о каждом сотруднике известно, в какую смену он работает, или то, что он выходной. Составить ежедневные списки посещения медпункта с указанием времени посещения ("утро" и "вечер"). Учесть, что в каждой смене медпункта могут быть приняты не более М человек и каждый человек должен посетить медпункт один раз. Числа N и М заданы.
Трудности возникают в самом алгоритме, а также с вводом самих структур.
допустим, если я делаю, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct SOTR
{   char fam[20];
    char smena[5];  
};
 
struct DAYS
{                
  char day[60];  
  SOTR *sotr_ptr;
  int sotr_number; 
  DAYS *Next_day;
 };
 
DAYS *f_d,*h_d,*p_d; 
SOTR *h_s,*p_s; 
void enter_base() { 
int i,j; 
f_d=new DAYS[7];
cout<<"Monday ! Tuesday ! Wednesday !Thursday ! Friday ! Saturday! Sunday !\n";     
h_d=f_d; 
int N=7;
h_d->sotr_ptr=new SOTR[7]; 
h_d->sotr_number=N; 
h_s=h_d->sotr_ptr; 
SOTR list_1_day[100]={"Ivanov","m","Petrov", "e", "Sidorov", "f","Denisov", "m","Pavlov","e","Sizov","f", "Sedov", "m"};
}
"m"- утренняя смена, "e"- вечерняя, "f" - выходной.
т.е. поскольку все данные заданы (фамилии и смена) то нужно лишь вводить каждый раз массив, изменяя лишь смены, тогда смысл самих структур в принципе? взять и вывести все через cout?

но самое веселое, это алгоритм, вывода списков, когда, кто должен проходить диспансеризацию, 2 день мой мозг тщетно пытается понять какой здесь принцип?
можно, конечно попробовать добавить условие, если smena="m", вывести посещение в вечернюю смену медпункта, но как быть с теми, кто выходной, и к тому же к-ый сотрудник должен не более 1 раза, а здесь, выведутся все, кто подходят под условие?

в общем, одни, вопросы, очень надеюсь, что кто-нибудь откликнется на мою просьбу разобраться с задачей...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
28.06.2012, 19:50     Составить ежедневные списки посещения медпункта #2
Не очень конкретная задача. Но у меня вот такие мысли.Структуру лучше организовать вот так
1 поле фамилия
2 смена ( число 0-выходной, 1-утро, 2-вечер)
3 флаг посещения ( тип булиан, изначально ввод всем сотрудникам false, так будет понятно кто посетил кто нет)

Далее вводим информацию о всех сотрудника, заводим переменную день присваиваем значение 1.
Далее вводим количество посещений диспансера за день.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream> 
#include <string>
using namespace std; 
 
struct Worker 
{ 
  string name; 
  int shift;  
  bool flag;
}  
 
// смена 0 выходной, 1 утро, 2 вечер 
 
int main() 
{   
    setlocale(0, "rus");
    const int size = 10; // количество работников
    Worker wok[size]; // массив с работниками
    int i;  
    int day = 1;      // день
    int M = 2;        // ограничение посещений
    for ( i = 0; i < 10; i++) 
    { 
        cout << "Введите фамилию сотрудника " << endl; 
        cin >> wok[i].name; 
        cout << "Введите смену сегодня " << endl; 
        cin >> wok[i].shift; 
        cout << "ВВедите статус посещений " << endl; 
        cin >> wok[i].flag;
    }
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
28.06.2012, 20:46  [ТС]     Составить ежедневные списки посещения медпункта #3
спасибо, за идею с флагом, однако, идея мне все-таки не совсем понятна.
итак, мы ввели 1 день, узнали, кто посещал медпункт, кто-нет, а дальше что?
во-первых, как вывести те ограничения, что может посетить только 2 человека в одну смену? так:
C++
1
for(i=1; i<2; i++)
во-вторых, как эти сведения связать с последующими днями? т.е. как исключить тех людей, которые уже прошли диспансеризацию?

я, к сожалению, так и не могу понять самого алгоритма создания расписания посещений, чисто на логическом уровне
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
28.06.2012, 20:52     Составить ежедневные списки посещения медпункта #4
Чисто на логическом уровне всё просто. Допустим у на есть 10 сотрудников и у всех у них стоит флаг false, что значит они не посещали диспансер. Первый день циклом проходим по всем сотрудникам у кого совпадает выходной, те сотрудники идут в диспансер и мы ставим им true - что значит посетили. Как только мы достигли ограничений по количеству, всем сотрудникам меняем смены и мы переходим к следующему дню и опять проходим циклом по всем сотрудникам.
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
28.06.2012, 21:02  [ТС]     Составить ежедневные списки посещения медпункта #5
значит, в принципе, я могу упростить задачу и не учитывать то, что те, кто работает утром могут пойти вечером и наоборот?
а как осуществлять переход к следующему дню, не можете подсказать?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
28.06.2012, 21:16     Составить ежедневные списки посещения медпункта #6
Сейчас тебе напишу основу программы и сброшу.

Добавлено через 12 минут
Ввод у меня желания делать нет поэтому считываем с файла, сделай в пректе текстовый файл внеси информацию, например такую


Иванов 0 0
Петров 1 0
Сергеев 2 0
Маташков 0 0
Комбаров 1 0
Иванчук 2 0
Лёвин 0 0
Кузьмин 1 0
Самедов 2 0
Шуть 0 0


Программа конечно вышла корявая, но для того чтобы понять суть самое то и в ней нет проверки на утро и вечер думаю что сможешь сделать сам, что не поймёшь пиши.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream> 
#include <string> 
#include <fstream>
using namespace std; 
 
struct Worker 
{ 
  string name; 
  int shift;  
  bool flag;
};  
 
// смена 0 выходной, 1 утро, 2 вечер 
 
int main() 
{   
    setlocale(0, "rus");
    const int size = 10; // количество работников
    Worker wok[size]; // массив с работниками
    int i = 0;  
    int day = 1;      // день
    int M = 2;    
    int count_week = 0; 
    int count = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////////
    ifstream infile; // потоковый объект 
    infile.open("Text.txt"); // открываем файл 
 
    while(!infile.eof()) 
    { 
        infile >> wok[i].name >> wok[i].shift >> wok[i].flag;  // считываем в структуру 
        i++;
    } 
 
    for ( i = 0; i < size; i++) 
    { 
        cout << wok[i].name << " " << wok[i].shift << " " << wok[i].flag << endl; // выводим исходный файл
    }  
    cout << endl << endl;
/////////////////////////////////////////////////////////////////////////////////////////////////////
     start:  // метка начала
     for ( i = 0; i < size; i++) 
     {
         if(wok[i].shift == 0 && wok[i].flag == false)  // если выходной и нужный флаг
         { 
             cout << "День " << day << " " << wok[i].name << endl; // выводим данные
             count++; 
             wok[i].flag = true; // ставим флаг тру
         } 
 
         if( count == 2) // счётчик количества посещений, посещения закончились
         { 
            for ( i = 0; i < size; i++) // меняем всем смены
            { 
                if(wok[i].shift == 0) 
                    wok[i].shift = 1; 
                if(wok[i].shift == 1) 
                    wok[i].shift = 2; 
                if(wok[i].shift == 2) 
                   wok[i].shift = 0; 
            }  
            if(day == 5) // 10 сотрудников, ограничения 2 человека в день, 5 дней выход
                exit(1);
            day++; // увеличиваем день
            count = 0; // счётчик на 0
            goto start;  // метка на начало
         } 
     } 
}
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
28.06.2012, 22:34  [ТС]     Составить ежедневные списки посещения медпункта #7
спасибо, вам огромное, теперь все понятно и наглядно
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
30.06.2012, 20:11  [ТС]     Составить ежедневные списки посещения медпункта #8
эм, можно снова обратиться к вам за помощью?
со сменами медпункта - день/вечер, так и не получилось разобраться, делаю следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream> 
#include <conio.h> 
#include <string> 
#include <fstream>
using namespace std; 
 
struct Worker 
{ 
  string name; 
  int shift;  
  bool flag;
};  
 
// смена 0 выходной, 1 утро, 2 вечер 
 
int main() 
{   
    setlocale(0, "rus");
    const int size = 15; // количество работников
    Worker wok[size]; // массив с работниками
    int i = 0;  
    int day = 1;      // день
    int M = 3;    
    int count_week = 0; 
    int count = 0;
    cout<<"Списки работников и их смена в первый день"<<endl;
///////////////////////////////////////////////////////////////////////////////////////////////////////
    ifstream infile; // потоковый объект 
    infile.open("d:Text.txt"); // открываем файл 
 
    while(!infile.eof()) 
    { 
        infile >> wok[i].name >> wok[i].shift >> wok[i].flag;  // считываем в структуру 
        i++;
    } 
 
    for ( i = 0; i < size; i++) 
    {   cout <<i+1<<"."<<wok[i].name<<"   ";
        switch(wok[i].shift)
    { case 0: cout<<"выходной"<<endl;
     break;
case 1: cout << "утро"<<endl;
    break;
case 2: cout << "вечер"<<endl;
    break;
        }
    }
    
    cout << endl << endl;
    cout<<"Ежедневные списки посещения"<<endl;
    cout<<endl;
    cout<<"День"<<day<<endl;
/////////////////////////////////////////////////////////////////////////////////////////////////////
     start:  // метка начала
     for ( i = 0; i < size; i++) 
     {
         if(wok[i].shift == 0 && wok[i].flag == false||wok[i].shift == 1 && wok[i].flag == false)  // если выходной и нужный флаг
         {  
             cout << "День " << day << " вечер " << wok[i].name << endl; // выводим данные
             count++; 
             wok[i].flag = true; // ставим флаг тру
         } 
         if( count == 3) // счётчик количества посещений, посещения закончились
         { 
            for ( i = 0; i < size; i++) // меняем всем смены
            { 
                if(wok[i].shift == 0) 
                    wok[i].shift = 1; 
                if(wok[i].shift == 1) 
                    wok[i].shift = 2; 
                if(wok[i].shift == 2) 
                   wok[i].shift = 0; 
            }count = 0;}}
         
          for ( i = 0; i < size; i++) {
         if(wok[i].shift == 0 && wok[i].flag == false||wok[i].shift == 2 && wok[i].flag == false)  // если выходной и нужный флаг
         {  
             cout << "День " << day << " утро " << wok[i].name << endl; // выводим данные
             count++; 
             wok[i].flag = true; // ставим флаг тру
         }
          
         if( count == 3) // счётчик количества посещений, посещения закончились
         { 
            for ( i = 0; i < size; i++) // меняем всем смены
            { 
                if(wok[i].shift == 0) 
                    wok[i].shift = 1; 
                if(wok[i].shift == 1) 
                    wok[i].shift = 2; 
                if(wok[i].shift == 2) 
                   wok[i].shift = 0; 
            }
            count = 0; // счётчик на 0
            day++;
            cout<<endl;
            cout<<"День"<<day<<endl;
           goto start;  // метка на начало
         }
          }
system("pause");
}
но в результате смены меняются не только у тех, кто должен прийти на следующий день, но и у тех, кто должен прийти утром, вопрос в следующем:
как сделать так, чтобы смены работников менялись по дням, и при этом посещение в утреннюю и вечернюю смену медпункта оставалось M человек?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.06.2012, 20:28     Составить ежедневные списки посещения медпункта #9
Тут нечего мудрить.Если у на с ограничения 2 человека за день, значит один с утра, второй вечером.
Заводим дополнительный счётчик и всё готово.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream> 
#include <string> 
#include <fstream>
using namespace std; 
 
struct Worker 
{ 
  string name; 
  int shift;  
  bool flag;
};  
 
// смена 0 выходной, 1 утро, 2 вечер 
 
int main() 
{   
    setlocale(0, "rus");
    const int size = 10; // количество работников
    Worker wok[size]; // массив с работниками
    int i = 0;  
    int day = 1;      // день
    int M = 2;    
    int count_week = 0; 
    int count = 0; 
    int smena = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////////
    ifstream infile; // потоковый объект 
    infile.open("Text.txt"); // открываем файл 
 
    while(!infile.eof()) 
    { 
        infile >> wok[i].name >> wok[i].shift >> wok[i].flag;  // считываем в структуру 
        i++;
    } 
 
    for ( i = 0; i < size; i++) 
    { 
        cout << wok[i].name << " " << wok[i].shift << " " << wok[i].flag << endl; // выводим исходный файл
    }  
    cout << endl << endl;
/////////////////////////////////////////////////////////////////////////////////////////////////////
     start:  // метка начала
     for ( i = 0; i < size; i++) 
     {
         if(wok[i].shift == 0 && wok[i].flag == false)  // если выходной и нужный флаг
         { 
             cout << "День " << day << " " << wok[i].name << endl; // выводим данные
             count++; 
             wok[i].flag = true; // ставим флаг тру 
             if(smena == 0) 
                 cout << "Утро " << endl; 
             else 
                 cout << "Вечер " << endl; 
             smena++;
         } 
 
         if( count == 2) // счётчик количества посещений, посещения закончились
         { 
            for ( i = 0; i < size; i++) // меняем всем смены
            { 
                if(wok[i].shift == 0) 
                    wok[i].shift = 1; 
                if(wok[i].shift == 1) 
                    wok[i].shift = 2; 
                if(wok[i].shift == 2) 
                   wok[i].shift = 0; 
            }  
            if(day == 5) // 10 сотрудников, ограничения 2 человека в день, 5 дней выход
                exit(1);
            day++; // увеличиваем день
            count = 0; 
            smena = 0;// счётчик на 0
            goto start;  // метка на начало
         } 
     } 
}
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
30.06.2012, 20:50  [ТС]     Составить ежедневные списки посещения медпункта #10
но по условию у нас в каждую смену M человек, да при условии M=1, а
C++
1
count==2
все выполняется, но, поставим даже 4, уже не выполняется условие, один приходит утром остальные 3 вечером, а вот как сделать, чтобы 4 человека и утром и вечером приходило(причем, тот, кто работает вечером в первый день- приходил в утреннюю смену медпункта и наоборот) я ума не приложу.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.06.2012, 20:58     Составить ежедневные списки посещения медпункта #11
Это понятно, я тебе привёл решение для конкретного случая. Если чётное количество людей можно ставить условие M делить на 2. Понимаешь вывести конкретное условие сложно, потому что в условие нет точного количества работников и за сколько дней они должны пройти обследование. Поэтому всё на глазок.
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
30.06.2012, 21:31  [ТС]     Составить ежедневные списки посещения медпункта #12
печально, значит, выходит мы можем задавать посещение (утреннее или вечернее) только для тех, кто выходной в данный день?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.06.2012, 21:40     Составить ежедневные списки посещения медпункта #13
Да нет, можно что-нибудь придумать можно. Короче ты хочешь чтобы было условие, что когда работник работает в первую смену он может сходить в диспансер вечером?
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
30.06.2012, 21:43  [ТС]     Составить ежедневные списки посещения медпункта #14
ну да, если работает утром (первая смена) - то может пройти диспансеризацию вечером, а если работает вечером - то соответственно может прийти утром, но вот как это сделать идей вообще нет(
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.06.2012, 22:07     Составить ежедневные списки посещения медпункта #15
Вот тебе готовый вариант, только я увеличил файл до 20 для наглядности

Иванов 0 0
Петров 1 0
Сергеев 2 0
Маташков 0 0
Комбаров 1 0
Иванчук 2 0
Лёвин 0 0
Кузьмин 1 0
Самедов 2 0
Шуть 0 0
Никитин 1 0
Сычёв 2 0
Лялин 0 0
Бышовец 1 0
Силкин 2 0
Бердыев 0 0
Слуцкий 1 0
Урюпин 2 0
Карпин 0 0
Фурсенко 1 0

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream> 
#include <string> 
#include <fstream>
using namespace std; 
 
struct Worker 
{ 
  string name; 
  int shift;  
  bool flag;
};  
 
// смена 0 выходной, 1 утро, 2 вечер 
 
int main() 
{   
    setlocale(0, "rus");
    const int size = 20; // количество работников
    Worker wok[size]; // массив с работниками
    int i = 0;  
    int day = 1;      // день
    int M = 4;    
    int count_week = 0; 
    int count = 0;  
    int smena = 1; // смена 1 утро, 2 вечер
    int count_smen = 0; // посещений в смену исходим из того, что 4 человека за день
///////////////////////////////////////////////////////////////////////////////////////////////////////
    ifstream infile; // потоковый объект 
    infile.open("Text.txt"); // открываем файл 
 
    while(!infile.eof()) 
    { 
        infile >> wok[i].name >> wok[i].shift >> wok[i].flag;  // считываем в структуру 
        i++;
    } 
 
    for ( i = 0; i < size; i++) 
    { 
        cout << wok[i].name << " " << wok[i].shift << " " << wok[i].flag << endl; // выводим исходный файл
    }  
    cout << endl << endl;
/////////////////////////////////////////////////////////////////////////////////////////////////////
     start:  // метка начала
     for ( i = 0; i < size; i++) 
     {
         if(wok[i].shift == 0 && wok[i].flag == false || wok[i].shift != smena && wok[i].flag == false )  // если выходной и нужный флаг
         {   
             if(smena == 1) // утро
                 cout << "Утро " << endl; 
             else 
                 cout << "Вечер " << endl;// вечер
             cout << "День " << day << " " << wok[i].name << endl; // выводим данные
             count++;  
             count_smen++; // увеличиваем счётчик
             wok[i].flag = true; // ставим флаг тру  
             if(count_smen == 2) 
                 smena = 2;
             
         } 
 
         if( count == 4) // счётчик количества посещений, посещения закончились
         { 
            for ( i = 0; i < size; i++) // меняем всем смены
            { 
                if(wok[i].shift == 0) 
                    wok[i].shift = 1; 
                if(wok[i].shift == 1) 
                    wok[i].shift = 2; 
                if(wok[i].shift == 2) 
                   wok[i].shift = 0; 
            }  
            if(day == 5) // 10 сотрудников, ограничения 2 человека в день, 5 дней выход
                exit(1);
            day++; // увеличиваем день
            count = 0; 
            count_smen = 0; // сбрасываем счётчик
            smena = 1;      // снова утро
            
            goto start;  // метка на начало
         } 
     } 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2012, 00:42     Составить ежедневные списки посещения медпункта
Еще ссылки по теме:

Списки C++
Списки, как склеить списки между собой? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Astart
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 17
01.07.2012, 00:42  [ТС]     Составить ежедневные списки посещения медпункта #16
бывают же умные, добрые люди на свете, спасибо вам)
Yandex
Объявления
01.07.2012, 00:42     Составить ежедневные списки посещения медпункта
Ответ Создать тему
Опции темы

Текущее время: 23:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru