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

как посчитать кол-во человек по нескольким признакам - C++

Восстановить пароль Регистрация
 
xym4uk
0 / 0 / 0
Регистрация: 25.06.2012
Сообщений: 26
24.01.2013, 22:13     как посчитать кол-во человек по нескольким признакам #1
почти все сделал, осталось только посчитать количество человек по цеху.
как посчитать кол-во человек по нескольким признакам - таблица
сейчас считает подряд. как сделать, чтобы выводило номер цеха и кол-во работников в нем? в каждой строке -свой цех

int koli4estvo(elist *beg,count &cnt); //объявление функции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*----------Подсчет количества работников, в том числе мужского и женского пола---------------*/
int koli4estvo(elist *beg,count &cnt)
{
//int m=0,f=0,
float s=0;                  //м - муж, f - жен, s - общее кол-во
//float procm=0,procf=0;        //procm - муж, procf - жен процент
 p=beg;
 while(p)
  {
   if (p->data.sex) ++cnt.f ;       //Если 1 - увеличиваем счетчик женщин
   else ++cnt.m;                //Иначе +1 мужчин
   s++;                 //общее количество работников
   p=p->right;
  }
   cnt.procm=cnt.m/s*100;           //процент мужчин
   cnt.procf=100-cnt.procm;
 
  return 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
/*---------------Вывод одной страницы-----------------*/
elist* showpage(elist *p)
{
//  int koli4estvo(elist *beg,count cnt);
    int i;          //nomer stroki vivoda
    clrscr();
    /*---vivesti  pervuyu stroku okna zagolovok tablici---*/
    gotoxy(1,1);
    cprintf("+--------------+----------------------------+----------------------------+");
    cprintf("|              |        Кол-во рабочих      |       Кол-во рабочих,%    |");
    cprintf("|    № цеха     +----------------------------+-----------------------------+");
    cprintf("|              |     муж       |      жен    |      муж     |    жен     |");
    cprintf("+--------------+------------------+--------+---------------+--------------+");
    /*---na4inaya so 2  stroki, vivodit elementi spiska(bazu)---*/
    gotoxy(1,6);
    i=6;
    while(p)
       {
        cprintf("|      %d       |        %d      |       %d     |        %.2f      |       %.2f     |",p->data.nomer_ceha, cnt.m, cnt.f, cnt.procm, cnt.procf);
        p=p->right;     //perehod k sled. elementu
        i++;
        gotoxy(1,i);
        /*---viyti iz funkcii, esli vivedena odna stranica---*/
        if (i>STEP) return p;   //i vernut ukazatel tekushego elementa spiska
       }
    cprintf("+--------------+--------------+------------+---------------+--------------+");
return p;
}

а это целиком
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream.h>
#include <iostream.h>
 
/*---------------konstanti--------------*/
const int len_fio=30;       //dlina fio
const int len_job=10;       //professia
const int STEP=18;      //koli4estvo strok na stranice
const int N_ITEMS=7;        //koli4estvo punktov menu
/*----------tipi i globalnie peremennie----------*/
 
struct rab{         //struktura dlya hranenia dannih o rabotnike
    int ID;         //tabelniy nomer
    char fio[len_fio];  //fio
    int birth;      //data rojdenia
    int sex;        //pol
    char job[len_job];  //professia
    float expirience;   //staj raboti
    int razryad;        //razryad rabo4ego
    int nomer_ceha;     //nomer ceha
    int nomer_u4astka;  //nomer uchastka
    float zp;       //zarplata
};
 
struct elist{           //element 2-napravlennogo spiska
    rab data;       //dannie o rabotnike
    elist *left;        //ukazatel na leviy element
    elist *right;       //ukazatel na praviy element
};
 
struct count{
    int m;          //кол-во мужчин
    int f;          //кол-во женщин
    float procm;        //процент мужчин
    float procf;        //% женщин
};
 
unsigned int defaultmode,   //tekushiy rejim ekrana
    activecolor,        //cvet activnogo punkta menu
    inactivecolor;      //cvet neactivnogo punkta menu
elist *beg,         //ukazatel na 1 element
      *fin,         //ukazatel na posledniy element
      *p;           //ukazatel na tekushiy element
char name[len_fio];     //familiya rabotnika
rab rabotnik;           //dannie rabochego
count cnt;          //кол-во рабочих
 
 
int key;            //kod klavishi
unsigned int item;      //nomer punkta menu
unsigned int prev;      //nomer predidushego punkta menu
//int m,f,s;                //количество работников, (м,ж,общ)
//float procm,procf;              //процент работников (м,ж)
/*----------prototipi funkciy----------*/
 
void add(elist* &beg,elist* &fin,rab rabotnik);             //dobavlenie elementa
void error(char message[]);                     //vivod oshibki
int readfile(elist* &beg,elist* &fin);                  //vvod bazi iz faila
int showbase(elist *beg);                       //vivod bazi na ekran
void drawitem(unsigned int item, unsigned int color);           //vivod punkta menu
void initmenu(unsigned int activecolor, unsigned int inactivecolor);    //inicializaciya menu
void clear(void);                           //o4istka textovogo okna
void stub(unsigned int item);                       //zaglushka
void dlgwindow(void);                           //otobrajenie okna dialoga
void message(char *message);                        //vivod soobshenia
rab query();                                //zapros svedeniy o rabotnike
void queryname(char *s);                        //zapros familii
void edit(elist* beg, rab rabotnik);                    //ispravlenie zapisi o rabotnike
elist *find(elist *p, char *s);                     //poisk el-ta v spiske po FIO
void del(elist* &beg, elist* &fin, elist *p);               //udalenie el-ta iz spiska
void info(rab rabotnik);                        //vivod svedeniy o rabotnike
void queryzp(float &startzp, float &endzp);             //vvod kriteriev otbora
void select(elist *beg);                        //viborka iz bazi
int write_file(char* filename,elist *beg);              //zapis v file
int koli4estvo(elist *beg,count &cnt);
/*====================glavnaya funkciya====================*/
int main()
{
    int n;
    defaultmode=LASTMODE;       //zapomnit tekushiy tekstoviy rejim ekrana
    textmode(C80);          //ustanovit rejim 80x25 cvetnoy
 
    char *filename="base.txt";
    beg=0;
    fin=0;              //obnulit ukazateli na na4alo i konec
    n=readfile(beg,fin);        //vvesti bazu iz faila
    clrscr();
 
    activecolor=LIGHTGREEN;     //cvet activnogo punkta menu
    inactivecolor=GREEN;        //neactivniy punkt
    initmenu(activecolor,inactivecolor);    //inicializaciya menu
 
    item=0;prev=0;      //obnulit nomera predidushego i tekushego punktov menu
 
    /*---cikl vibora punkta menu---*/
    while(1)
    {
//      key=getch();        //vvesti kod najatoi klavishi
//      if(key==0) key==getch();    //esli vveden rashirenniy kod
        switch(getch())
             {
              /*----vipolnenie punkta menu----*/
              case 13:
              switch (item)     //najata ENTER
                  {
                   case 0:koli4estvo(beg,cnt);
                   showbase(beg);
                   break;
                   case 1:rabotnik=query();     //dobavlenie v bazu
                   add(beg,fin,rabotnik);
                   break;
                   case 2:rabotnik=query();     //ispravlenie zapisi
                   edit(beg,rabotnik);
                   break;
                   case 3:queryname(name);      //udalenie zapisi
                   p=find(beg,name);
                   if (p) del(beg,fin,p);
                   break;
                   case 4:queryname(name);      //poisk v baze
                   p=find(beg,name);
                   if (p) info(p->data);
                   break;
                   case 5:select(beg);      //viborka iz bazi po zp
                   item=5;
                   break;
                   default:textmode(defaultmode);
                   write_file(filename,beg);
                   exit(1);         //vihod iz programmi
                  };
                  break;
              /*---peremeshenie kursora vlevo---*/
              case 15: case 75:     //najati Shift+Tab ili Left
               prev=item;
               if (item==0)
                  item=N_ITEMS-1;
               else item--;
               break;
              /*---peremeshenie vpravo---*/
              case 9: case 77:      //najati Tab ili Right
              prev=item;
              if(item==N_ITEMS-1)
              item=0;
              else item++;
              break;
             }
             clear();
             drawitem(prev,inactivecolor);  //vivod predidushego punkta
             drawitem(item,activecolor);    //vivod vibrannogo punkta
    }
 
    n=showbase(beg);        //vivod bazi na ekran
    cprintf("n=%d",n);
    textmode(defaultmode);
    return 0;
}
 
/*----------Подсчет количества работников, в том числе мужского и женского пола---------------*/
int koli4estvo(elist *beg,count &cnt)
{
//int m=0,f=0,
float s=0;                  //м - муж, f - жен, s - общее кол-во
//float procm=0,procf=0;        //procm - муж, procf - жен процент
 p=beg;
 while(p)
  {
   if (p->data.sex) ++cnt.f ;       //Если 1 - увеличиваем счетчик женщин
   else ++cnt.m;                //Иначе +1 мужчин
   s++;                 //общее количество работников
   p=p->right;
  }
   cnt.procm=cnt.m/s*100;           //процент мужчин
   cnt.procf=100-cnt.procm;
 
  return 0;
}
 
 
/*----------Vibor iz bazi rabotnikov v zadannom diapazone zarplati----------*/
void select(elist *beg)
{
    float startzp,          //na4alnaya zp
          endzp;            //kone4naya zp
    elist *begs,*fins;      //ukazateli na 1 i posledniy elementi formiruemogo spiska
    elist *p;           //tekushiy element ishodnogo spiska
    queryzp(startzp,endzp);     //vvod na4alnoy i kone4noy zp
 
    /*---inicializaciya ukazateley---*/
    begs=0;
    fins=0;
    p=beg;
 
    /*---cikl po elementam ishodnogo spiska i formirovanie novogo spiska---*/
    while(p)
        {
         if ((p->data.zp>=startzp)&&(p->data.zp<=endzp))    //esli zp v zadannom diapazone
         add (begs,fins,p->data);       //to dobavit element v noviy spisok
         p=p->right;            //perehod k sleduyushemu elementu
        }
    showbase(begs);             //vivod viborki na ekran
}
 
/*----------------vvod kriteriev otbora-----------------*/
void queryzp(float &startzp, float &endzp)
{
    char *s;            //vspomogatelnaya stroka dlya vvoda 4isla
    dlgwindow();            //otobrazit okno dialoga
    do
      {
       /*---vvod na4alnoy zp---*/
       do
         {
          gotoxy(2,2);
          cprintf("minimum: ");
          gotoxy(2,3);
          clreol();
          cscanf("%s",s);
          startzp=atof(s);
         }
       while (!startzp);
 
       /*---vvod kone4noy zp---*/
       do
         {
          gotoxy(2,4);
          cprintf("Maximum: ");
          gotoxy(2,5);
          clreol();
          cscanf("%s",s);
          endzp=atof(s);
         }
       while (!endzp);
      }
    while (startzp>endzp);      //povtoryat poka startzp>endzp
    getch();            //o4istka bufera vvoda
}
 
/*----------------zapros svedeniy-----------------*/
rab query()
{
    char s[len_fio];        //fio rabotnika
    rab rabotnik;           //dannie o rabotnike
    int i;              //index stroki
    int len;            //dlina stroki s fio
    dlgwindow();            //otobrazit okno dialoga
 
    /*---vvod fio---*/
    do
      {
       gotoxy(2,1);
       cputs("FIO?");
       gotoxy(2,2);
       clreol();
       cscanf("%s",s);
       len=strlen(s);
       for(i=len;i<len_fio-1;i++)
       s[i]=' ';            //dopolnenie probelami
       s[len_fio-1]='\0';
      }
    while(!len);
    strcpy(rabotnik.fio,s);
 
    /*---vvod tabelnogo nomera---*/
    do
      {
       gotoxy(2,3);
       cputs("Tabelniy nomer?");
       gotoxy(2,4);
       clreol();
       cscanf("%s",s);
       rabotnik.ID=atoi(s);
      }
    while (!rabotnik.ID);
 
    /*---vvod dati rojdeniya---*/
    do
      {
       gotoxy(2,5);
       cputs("Data rojdeniya?");
       gotoxy(2,6);
       clreol();
       cscanf("%s",s);
       rabotnik.birth=atoi(s);
      }
    while (!rabotnik.birth);
 
    /*---vvod pola---*/
    do
      {
       gotoxy(2,7);
       cputs("Pol? 0-male, 1-female");
       gotoxy(2,8);
       clreol();
       cscanf("%s",s);
       rabotnik.sex=atoi(s);
      }
    while (!rabotnik.sex);
 
    /*---vvod doljnosti---*/
    do
      {
       gotoxy(2,9);
       cputs("Doljnost?");
       gotoxy(2,10);
       clreol();
       cscanf("%s",s);
       len=strlen(s);
       for (i=len;i<len_job;i++)
       s[i]=' ';
       s[len_job-1]='\0';
      }
    while (!len);
    strcpy(rabotnik.job,s);
 
    /*---vvod staja raboti---*/
    do
      {
       gotoxy(2,11);
       cputs("Staj raboti?");
       gotoxy(2,12);
       clreol;
       cscanf("%s",s);
       rabotnik.expirience=atof(s);
      }
    while (!rabotnik.expirience);
 
    /*---vvod razryada---*/
    do
      {
       gotoxy(2,13);
       cputs("Razryad?");
       gotoxy(2,14);
       clreol();
       cscanf("%s",s);
       rabotnik.razryad=atoi(s);
      }
    while (!rabotnik.razryad);
 
    /*---vvod nomera ceha---*/
    do
      {
       gotoxy(2,15);
       cputs("Nomer ceha?");
       gotoxy(2,16);
       clreol();
       cscanf("%s",s);
       rabotnik.nomer_ceha=atoi(s);
      }
    while (!rabotnik.nomer_ceha);
 
    /*---vvod nomera u4astka---*/
    do
      {
       gotoxy(2,17);
       cputs("Nomer u4astka?");
       gotoxy(2,18);
       clreol();
       cscanf("%s",s);
       rabotnik.nomer_u4astka=atoi(s);
      }
    while (!rabotnik.nomer_u4astka);
 
    /*---vvod zarplati---*/
    do
      {
       gotoxy(2,19);
       cputs("Zarplata?");
       gotoxy(2,20);
       clreol();
       cscanf("%s",s);
       rabotnik.zp=atof(s);
      }
    while (!rabotnik.zp);
 
    getch();
        return rabotnik;
}
 
 
/*----------ispravlenie zapisi----------*/
void edit(elist* beg, rab rabotnik)
{
    elist *p;           //ukazatel na naidenniy element
    p=find(beg,rabotnik.fio);   //poisk rabotnika v spiske
    if (p)
       {
        p->data.ID;         //izmenit tabelniy nomer
        p->data.birth;
        p->data.sex;
        p->data.job;
        p->data.expirience;
        p->data.razryad;
        p->data.nomer_ceha;
        p->data.nomer_u4astka;
        p->data.zp;
       }
}
 
/*----------poisk elementa v spiske(po FIO)----------*/
elist *find(elist *p,char *s)
{
    /*---cikl po elementam spiska---*/
    while (p)
          {
           if (strcmp(s,p->data.fio)==0)    //esli fio naideno
           return p;            //to vernut ukazatel
           p=p->right;          //perehod k sled. el-tu spiska
          }
 
    /*---esli fio ne naideno---*/
    gotoxy(2,6);
    message("Takogo rabotnika v spiske net");
    p=0;
    return p;
}
 
/*----------Zapros familii----------*/
void queryname(char *name)
{
 int i;         //index stroki
 int len;       //dlina stroki FIO
 char s[len_fio];   //FIO
 dlgwindow();       //otobrazit okno dialoga
 
 /*---vvod familii---*/
 do
   {
    gotoxy(2,2);
    cputs("Familiya?");
    gotoxy(2,3);
    clreol();
    cscanf("%s",s);
    len=strlen(s);
    for (i=len;i<len_fio-1;i++)
    s[i]=' ';       //dopolnenie probelami
    s[len_fio-1]='\0';
   }
 while (!len);
 strcpy(name,s);
 getch();           //o4istka bufera vvoda
}
 
/*----------udalenie elementa iz spiska----------*/
void del(elist* &beg,elist* &fin,elist *p)
{
    if ((p==beg)&&(p==fin))     //udalenie edinstvennogo elementa
       {
        beg=0;
        fin=0;
       }
    else
    if (p==beg)             //udalenie iz na4ala spiska
       {
        beg=beg->right;
        beg->left=0;
       }
    else
    if (p==fin)         //udalenie s konca
       {
        fin=fin->left;
        fin->right=0;
       }
    else                //udalenie iz seredini
       {
        p->left->right=p->right;    //svyazat predidushiy so sleduyushim
        p->right->left=p->left; //svyazat sleduyushiy s predidushim
       }
    free(p);            //osvobojdenie pamyati iz pod elemennta
}
 
/*----------Vivod svedeniy o rabotnike----------*/
void info(rab rabotnik)
{
    dlgwindow();                //otobrazit okno dialoga
    gotoxy(2,2);
    cprintf("Familiya %s",rabotnik.fio);
    gotoxy(2,4);
    cprintf("Tabelniy nomer %d",rabotnik.ID);
    gotoxy(2,6);
    cprintf("Data rojdeniya %d",rabotnik.birth);
    gotoxy(2,8);
    cprintf("Professiya %s",rabotnik.job);
    cprintf("Staj raboti %5.2f",rabotnik.expirience);
    gotoxy(2,10);
    cprintf("Razryad %d",rabotnik.razryad);
    gotoxy(2,12);
    cprintf("Nomer ceha %d",rabotnik.nomer_ceha);
    gotoxy(2,14);
    cprintf("Nomer u4astka %d",rabotnik.nomer_u4astka);
    gotoxy(2,16);
    cprintf("Zarplata %6.2f",rabotnik.zp);
    getch();                //ojidat najatiya klavishi
}
/*----------otobrajenie okna dialoga----------*/
void dlgwindow()
{
    window(10,4,70,24);
    textattr(GREEN+LIGHTGRAY*16);
    clrscr();
}
 
/*----------vivod soobsheniya----------*/
void message(char message[])
{
    dlgwindow();
    gotoxy(20,4);
    cputs(message);
    getch();
}
/*----------o4istka rabo4ego okna----------*/
void clear()
{
    window(1,3,80,25);
    textattr(WHITE);
    clrscr();
}
 
/*----------zaglushka----------*/
void stub(unsigned int item)
{
    window(1,4,80,24);
    textbackground(LIGHTGRAY);
    textcolor(WHITE);
    clrscr();
    cprintf("Vizvan punkt menu %d",item);
    getch();
}
 
/*----------vivod oshibki----------*/
 
void error(char message[])
{
    window(10,6,70,12);
    textbackground(LIGHTGRAY);
    textcolor(RED);
    clrscr();
    gotoxy(15,4);
    cputs(message);
    getch();
    textmode(defaultmode);
}
 
/*----------dobavlenie elementa v konec spiska----------*/
void add(elist* &beg,elist* &fin,rab rabotnik)
{
    elist *p;       //ukazatel na sozdavaemiy element
    p=new elist;        //sozdanie novogo elementa
    p->data=rabotnik;   //zapolnenie informativnoy 4asti
    p->right=0;
    p->left=fin;
    if (!beg) beg=p;    //esli spisok bil pustim
      else fin->right=p;    //privyazka novogo elementa k poslednemu
    fin=p;          //obnovlenie ukazatelya na konec
}
 
/*----------vvod bazi iz faila----------*/
 
 
 
 
/*int read_file(char* filename,elist* &beg, elist* &fin)
    {
     ifstream in(filename,ios::in | ios::nocreate);
     if (!in)
      {
       cout<<"No file"<<filename<<endl;
       return 1;
      }
     rab rabotnik;
     *beg=0;
     while(in.getline(rabotnik.fio,len_fio))
        {
         in>>rabotnik.ID>>rabotnik.birth>>rabotnik.sex;
         in.getline(rabotnik.job,len_job);
         in>>rabotnik.expirience>>rabotnik.razryad>>rabotnik.nomer_ceha;
         in>>rabotnik.nomer_u4astka>>rabotnik.zp;
         in.get();
         add(beg,fin,rabotnik);
        }
     return 0;
    }
*/
 
 
 
 
 
 
int readfile(elist* &beg,elist* &fin)
{
    FILE *f;
    rab rabotnik;
 
    /*---proverka otkritiya---*/
    f=fopen("base.txt","r");
    if(!f)
      {
       error("File base.txt not found");
       exit(1);
      }
    /*---4tenie zapisey iz faila---*/
    while (!feof(f))
       {
 
        fgets(rabotnik.fio,len_fio,f);  //4tenie familii
        fgets(rabotnik.job,len_job,f);
        fscanf(f,"%d\n%d\n%d\n%f\n%d\n%d\n%d\n%f\n",&rabotnik.ID,&rabotnik.birth,&rabotnik.sex,
        &rabotnik.expirience,&rabotnik.razryad,&rabotnik.nomer_ceha,&rabotnik.nomer_u4astka,&rabotnik.zp);
        add(beg,fin,rabotnik);      //dobavlenie v spisok
       }
    fclose(f);
    return 0;
}
 
/*----------vivod bazi na ekran----------*/
int showbase(elist *beg)
{
    int i;      //s4et4ik koli4estva strok
    elist *p,   //ukazatel na tekushiy element stranici
          *pn;  //ukazatel na 1 element stranici
    int key;    //kod najatoi klavishi
    elist *showpage(elist *p);  //prototip funkcii vivoda odnoy stranici
 
    if (!beg)
      {
       message("Spisok pustoy");    //vivesti soobshenie esli pusto
       return -1;
      }
 
    /*--zadat parametri rabo4ego okna--*/
    window(1,4,80,24);
    textbackground(LIGHTGRAY);
    textcolor(WHITE);
 
    p=beg;      //ukazatel v na4alo spiska
    while(1)
       {
        pn=p;   //zapomnit ukazatel 1 elementa stranici
 
        /*vivesti stranicu i polu4it novoe zna4enie ukazatelya
        tekushego elementa*/
        p=showpage(p);
 
        /*opredelit kod najatoi klavishi*/
 
//      key=getch();
//      if (key==0) key=getch();    //esli rashirenniy kod
 
        /*upravlenie prokrutkoi*/
        switch (getch())
         {
          case 27:          //najata Esc
            return 0;   //vihod iz prosmotra
          case 13: case 80: case 81:    //najati Enter||Down||PgDn
            if (!p) p=pn;       //i spisok is4erpan,to
            break;          //otobrajat tuje stranicu
          case 72: case 73:     //Up ili PgUp
            p=pn;           //ukazatel v na4alo stranici
            for(i=1;(i<=STEP)&&(p);i++)
                 p=p->left;     //na STEP zapisey vverh
            if (!p) p=beg;      //esli 1 zapis
            break;
         }
       }
}
 
/*---vivod odnoy stranici---*/
elist* showpage(elist *p)
{
//  int koli4estvo(elist *beg,count cnt);
    int i;          //nomer stroki vivoda
    clrscr();
    /*---vivesti  pervuyu stroku okna zagolovok tablici---*/
    gotoxy(1,1);
    cprintf("╔══════════════╦═══════════════════════════════╦═══════════════════════════════╗");
    cprintf("в•‘              в•‘          Кол-во рабочих       в•‘          Кол-во рабочих,%     в•‘");
    cprintf("в•‘    № цеха    в•*════════════════╦══════════════╬════════════════╦══════════════╣");
    cprintf("в•‘              в•‘      муж       в•‘      жен     в•‘       муж      в•‘     жен      в•‘");
    cprintf("в•*══════════════╬════════════════╬══════════════╬════════════════╬══════════════╣");
    /*---na4inaya so 2  stroki, vivodit elementi spiska(bazu)---*/
    gotoxy(1,6);
    i=6;
    while(p)
       {
        cprintf("в•‘      %d       в•‘        %d      в•‘       %d     в•‘        %.2f      в•‘       %.2f     в•‘",p->data.nomer_ceha,cnt.m,cnt.f,cnt.procm,cnt.procf);
        p=p->right;     //perehod k sled. elementu
        i++;
        gotoxy(1,i);
        /*---viyti iz funkcii, esli vivedena odna stranica---*/
        if (i>STEP) return p;   //i vernut ukazatel tekushego elementa spiska
       }
    cprintf("в•љв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•©в•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•©в•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•©в•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•©в•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ќ");
return p;
}
 
/*----------vivod punkta menu----------*/
void drawitem(unsigned int item, unsigned int color)
{
    const d=12;             //dlina polya punkta menu
    const char *items[N_ITEMS]=     //nazvania punktov menu
        {"View","Add","Edit","Delete","Find","Select","Exit"};
    const int pos[N_ITEMS]={1,d,2*d,3*d,4*d,5*d,6*d};   //pozicii na4ala poley punktov
    window(1,1,80,2);           //okno dlya otobrajenia punktov
    textbackground(LIGHTGRAY);      //cvet fona
    textcolor(color);           //cvet bukv
    gotoxy(pos[item],1);            //poziciya na4ala punkta menu
    cprintf("%s",items[item]);      //otobrazit nazvanie punkta
}
 
/*----------inicializaciya menu----------*/
 
void initmenu(unsigned int activecolor, unsigned int inactivecolor)
{
    unsigned int item;      //nomer punkta menu
    window(1,1,80,2);       //okno iz 2 strok dlya vivoda punktov
    textbackground(LIGHTGRAY);  //cvet fona
    clrscr();
 
    /*-----otobrazit nazvania punktov menu-----*/
    drawitem(0,activecolor);
    for (item=1;item<N_ITEMS;item++)
        drawitem(item,inactivecolor);
 
    /*otobrazit granicu okna menu, pod4erknuv ego snizu*/
    gotoxy(1,2);
    textcolor(inactivecolor);
    cputs("_______________________________________________________________________________");
    gotoxy(1,1);        //kursor na "View"
}
 
 
/*----------zapis v file----------*/
 
int write_file(char* filename, elist *beg)
    {
     p=beg;
     ofstream fout(filename);
     if (!fout){cout<<"Невозможно открыть файл для записи"<<endl;return 1;}
     while(p)
        {
         fout<<p->data.job<<endl;
         fout<<p->data.fio<<endl;
         fout<<p->data.ID<<endl;
         fout<<p->data.birth<<endl;
         fout<<p->data.sex<<endl;
         fout<<p->data.expirience<<endl;
         fout<<p->data.razryad<<endl;
         fout<<p->data.nomer_ceha<<endl;
         fout<<p->data.nomer_u4astka<<endl;
         fout<<p->data.zp<<endl;
         p=p->right;
        }
        cout<<"Данные сохранены в файле: "<<filename<<endl;
        cout<<"====================================="<<endl;
        cout<<"press any key"<<endl;
        cin.get();
        return 0;
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
24.01.2013, 22:19     как посчитать кол-во человек по нескольким признакам #2
через массив
xym4uk
0 / 0 / 0
Регистрация: 25.06.2012
Сообщений: 26
24.01.2013, 22:43  [ТС]     как посчитать кол-во человек по нескольким признакам #3
сделал через массив, но чет не пойму, как вызвать функцию из основной программы?

int koli4estvo(elist *beg,count *cnt); - объявление

вызов из основной программы такой, но vc пишет, что "требуется выражение в cnt[]"
C++
1
2
case 0: koli4estvo(beg,cnt[]);       
showbase(beg);
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
/*----------Подсчет количества работников, в том числе мужского и женского пола---------------*/
int koli4estvo(elist *beg,count cnt[])
{
//муж - 0, жен - 1
float s=0;                  //м - муж, f - жен, s - общее кол-во
//float procm=0,procf=0;        //procm - муж, procf - жен процент
 for (int i=0;i<10;i++)
  {
    cnt[i].m=0;
    cnt[i].f=0;
    cnt[i].procm=0;
        cnt[i].procf=0;
  }
 p=beg;
 while(p)
  {
   switch (p->data.nomer_ceha)
    {
    case 1:  if(p->data.sex) cnt[1].f++; else cnt[1].m++; break;
    case 2:  if(p->data.sex) cnt[2].f++; else cnt[2].m++; break;
    case 3:  if(p->data.sex) cnt[3].f++; else cnt[3].m++; break;
    case 4:  if(p->data.sex) cnt[4].f++; else cnt[4].m++; break;
    case 5:  if(p->data.sex) cnt[5].f++; else cnt[5].m++; break;
    case 6:  if(p->data.sex) cnt[6].f++; else cnt[6].m++; break;
    case 7:  if(p->data.sex) cnt[7].f++; else cnt[7].m++; break;
    case 8:  if(p->data.sex) cnt[8].f++; else cnt[8].m++; break;
    case 9:  if(p->data.sex) cnt[9].f++; else cnt[9].m++; break;
    case 10: if(p->data.sex) cnt[10].f++; else cnt[10].m++; break;
    }
   s++;                 //общее количество работников
   p=p->right;
  }
   for (int i=1;i<10;i++)
   {
   cnt[i].procm=cnt[i].m/s*100;         //процент мужчин 1 цеха
   cnt[i].procf=100-cnt[i].procm;
   }
  return 0;
}
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
24.01.2013, 22:47     как посчитать кол-во человек по нескольким признакам #4
вам на несколько цехов нужно?
xym4uk
0 / 0 / 0
Регистрация: 25.06.2012
Сообщений: 26
24.01.2013, 22:50  [ТС]     как посчитать кол-во человек по нескольким признакам #5
я поставил 10. хоть на сколько бы сделать )))
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
24.01.2013, 22:50     как посчитать кол-во человек по нескольким признакам #6
если будет много цехов тогда наверно проще сделать функцию которая будет считать общее кол-во чел в цехе
и вызывать когда ее нужно применить
допустим цех 1 столько то человек
цех 3 столько то чел
то есть через switch() забиваешь цеха и применяешь функцию
xym4uk
0 / 0 / 0
Регистрация: 25.06.2012
Сообщений: 26
24.01.2013, 22:51  [ТС]     как посчитать кол-во человек по нескольким признакам #7
ну а в данном случае что я не правильно сделал в главной функции? почему оно ошибку пишет?
сейчас через switch и забиваю цеха. проблема в том, что функцию не могу вызвать. не понимаю ошибку
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
24.01.2013, 22:53     как посчитать кол-во человек по нескольким признакам #8
или сделай массив структур ну эт мое мнение может можно и проще
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.01.2013, 22:55     как посчитать кол-во человек по нескольким признакам #9
хрень какая-то. cnt - это какой тип. похоже массив маких-то объектов. чтобы функция меняла в переданном массиве что-то, нужно передать в функцию указатель на начало массива и количество элементов в нем:
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
#include <iostream>
 
struct Obj
{
    int member;
 
    Obj()
        : member(0)
    {
    }
};
 
 
void f(Obj* arr, int count)
{
    for (int i = 0; i < count; ++i)
    {
        arr[i].member = i;
    }
}
 
void print(const Obj* arr, int count)
{
    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i].member << std::endl;
    }
}
 
int main()
{
    Obj arr[10];
    print(arr, 10);
    std::cout << "-----------" << std::endl;
    f(arr, 10);
    print(arr, 10);
    return 0;
}
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
24.01.2013, 22:56     как посчитать кол-во человек по нескольким признакам #10
у тебя м и ж отдельно считает тебе надо вместе

примерно так
C++
1
2
s=0;// чтобы записывть туда результат
s+=m+f
xym4uk
0 / 0 / 0
Регистрация: 25.06.2012
Сообщений: 26
24.01.2013, 23:04  [ТС]     как посчитать кол-во человек по нескольким признакам #11
DU, cnt[] - массив структур count.
int koli4estvo(elist *beg,count *cnt[]) - сейчас вызвается так, но эт не правильно
elist *beg - указатель на начало списка, count *cnt[] - указатель на массив. а константу нельзя в вызов ф-ии писать? обязательно переменную?

Евгений89,
мне надо м и ж отдельно считать для таблицы, потом суммируется, чтобы получить % м от ж
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.01.2013, 23:07     как посчитать кол-во человек по нескольким признакам #12
я написал пример с передачей массива структур в фунцкию и модификацией этого массива в функции. ознакомтесь.
xym4uk
0 / 0 / 0
Регистрация: 25.06.2012
Сообщений: 26
24.01.2013, 23:15  [ТС]     как посчитать кол-во человек по нескольким признакам #13
del

Добавлено через 7 минут
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
struct Obj                               //- у меня идет struct count
{
    int member;
 
    Obj()                                   //-  это я не знаю что такое. из ооп наверное что-то
        : member(0)
    {
    }
};
 
 
void f(Obj* arr, int count)                  //-     int koli4estvo(elist *beg,count cnt[]) - если пишу в конец еще переменную или константу - тоже ошибка.
{
    for (int i = 0; i < count; ++i)
    {
        arr[i].member = i;
    }
}
 
void print(const Obj* arr, int count)                               //- печати у меня тут нет
{
    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i].member << std::endl;
    }
}
 
int main()
{
    Obj arr[10];                                                          //-   count cnt[10];
    print(arr, 10);
    std::cout << "-----------" << std::endl;
    f(arr, 10);                                                             //-   koli4estvo(beg,cnt[],10); - опять же не хочет работать
    print(arr, 10);
    return 0;
}
ну как-то так вроде.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.01.2013, 23:25     как посчитать кол-во человек по нескольким признакам #14
count я передавал, чтобы не выйти за пределы массива. у вас же он не нужен, типа все написано так, что не выйдет за пределы. поэтому код такой:
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
просто указатель на count
int koli4estvo(elist *beg,count* cnt)
{
//муж - 0, жен - 1
float s=0;                  //м - муж, f - жен, s - общее кол-во
//float procm=0,procf=0;        //procm - муж, procf - жен процент
 for (int i=0;i<10;i++)
  {
    cnt[i].m=0;
    cnt[i].f=0;
    cnt[i].procm=0;
        cnt[i].procf=0;
  }
 p=beg;
 while(p)
  {
   switch (p->data.nomer_ceha)
    {
    case 1:  if(p->data.sex) cnt[1].f++; else cnt[1].m++; break;
    case 2:  if(p->data.sex) cnt[2].f++; else cnt[2].m++; break;
    case 3:  if(p->data.sex) cnt[3].f++; else cnt[3].m++; break;
    case 4:  if(p->data.sex) cnt[4].f++; else cnt[4].m++; break;
    case 5:  if(p->data.sex) cnt[5].f++; else cnt[5].m++; break;
    case 6:  if(p->data.sex) cnt[6].f++; else cnt[6].m++; break;
    case 7:  if(p->data.sex) cnt[7].f++; else cnt[7].m++; break;
    case 8:  if(p->data.sex) cnt[8].f++; else cnt[8].m++; break;
    case 9:  if(p->data.sex) cnt[9].f++; else cnt[9].m++; break;
    case 10: if(p->data.sex) cnt[10].f++; else cnt[10].m++; break;
    }
   s++;                 //общее количество работников
   p=p->right;
  }
   for (int i=1;i<10;i++)
   {
   cnt[i].procm=cnt[i].m/s*100;         //процент мужчин 1 цеха
   cnt[i].procf=100-cnt[i].procm;
   }
  return 0;
}
 
 
в основной программе как-то так:
count cnt[10];
elist* lst = ...
...
int kol = koli4estvo(lst , cnt);
Если это не работает, то пишите сюда свою функцию
koli4estvo(lst , cnt);
и как объявлен массив cnt
и полностью тексты ошибок


А еще стоит задуматься, почему вы пишете на чем-то борландовсом. этой штуке лет 20 наверно. даже Windows 95 моложе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2013, 23:36     как посчитать кол-во человек по нескольким признакам
Еще ссылки по теме:

Работа со стеком (посчитать кол-во данных) C++
Посчитать кол-во пробелов в тексте C++
Посчитать кол-во символов в файле C++

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

Или воспользуйтесь поиском по форуму:
xym4uk
0 / 0 / 0
Регистрация: 25.06.2012
Сообщений: 26
24.01.2013, 23:36  [ТС]     как посчитать кол-во человек по нескольким признакам #15
пишу на борландовском для универа
все заработало. спасибо
Yandex
Объявления
24.01.2013, 23:36     как посчитать кол-во человек по нескольким признакам
Ответ Создать тему
Опции темы

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