Advertisement
minilose

Untitled

May 19th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct employee                            //структура за служители
  4. {
  5.     char fname[21];                        //собствено име-стринг    //задавам ги 21 симовла, тъй като последния е /0, което е
  6.     char sname[21];                        //башино                  //за край на низа, тоест за име си остават плътно 20, не е
  7.     char lname[21];                        //фамилно                 //задължително, но лично на мен така ми харесва повече
  8.     long egn;                              //егн, защо лонг, а не инт? егнто е 10 символа, инт не ги побира, лонг ги побира(чисто информативно можеш да чукнеш в нета C data types за да схванеш за кво говоря)
  9.     int exp;                               //стаж
  10.     int wdpm;                              //работни дни в месеца(working days per month)
  11.     float dw[30];                          //масив за дейли уейдж, дневен надник, не знам защо искат за всеки по отделно, но...:/. Флоат, понеже инт е цяло число, може да е 10 лв, ама може да е и 10.50 примерно
  12.     float mw;                              //месечна заплата, monthlywage
  13. };
  14. struct company                             //структура за компания
  15. {
  16.     char name[21];                         //име на компанията
  17.     struct employee emp[50];               //масив от структури за служители(emp-employee)
  18.     int empnum;                            //брой служители(empnum-employee number)
  19. };
  20.  
  21. void input(struct company *comp)          //функция за въвеждане на данните на служителите, параметъра е поинтер към структурата comp
  22. {
  23.     printf("Vuvedi broi na slujitelite:");
  24.     scanf_s("%d", &comp->empnum);         //въвеждаме броя на служителите,при поинтери достъпа до елементите става с ->
  25.     getchar();                            //това пък защо? виж 1. под кода
  26.     system("cls");                        //2. под кода
  27.     for (int i = 0; i < comp->empnum; i++)   //обхождаме масива от служители
  28.     {
  29.         printf("Vuvedi sobstveno ime na slujitel %d:", i + 1); //Защо и+1? масива започва от 0, малко грозно изгледжа да принти първия служител като 0
  30.         gets_s(comp->emp[i].fname, 21);                        //emp[i], хващаме и-тия подред служител
  31.         printf("Vuvedi bashtino ime na slujitel %d:", i + 1);
  32.         gets_s(comp->emp[i].sname, 21);                        //защо гетс_с а не просто гетс? Вижуал студио не се разбира с гетс(), гетс_с работи дори по-добре, тъй като задаваш и размера за въвеждане: gets_s(string, razmer na stringa),може да послужи ако стринга ти е 20, ма ти искаш да ограничиш  до 10, ако се налага
  33.         printf("Vuvedi familno ime na slujitel %d:", i + 1);
  34.         gets_s(comp->emp[i].lname, 21);
  35.         printf("Vuvedi EGN na slujitel %d:", i + 1);
  36.         scanf_s("%ld", &comp->emp[i].egn);                     //%ld-формат за long
  37.         getchar();
  38.         printf("Vuvedi trudov staj na slujitel %d:", i + 1);
  39.         scanf_s("%d", &comp->emp[i].exp);                     //дам, и със сканф() не се разбира вижуала, тук единствената разлика е _s
  40.         getchar();
  41.         printf("Vuvedi broi na rabotni dni v tekushtiq mesec na slujitel %d:", i + 1);
  42.         scanf_s("%d", &comp->emp[i].wdpm);
  43.         for (int j = 0; j < comp->emp[i].wdpm; j++)           //за всеки отделен служител-обхождаме масива от дневни надници, тук слагаме dw[j]
  44.         {
  45.             printf("Vuvedi nadnik za den %d na slujitel %d:", j + 1, i + 1);
  46.             scanf_s("%f", &comp->emp[i].dw[j]);
  47.             getchar();
  48.  
  49.         }
  50.         system("cls");
  51.     }
  52. }
  53. void monthlywagecalc(struct company *comp)    //функция за калкулиране на месечната заплата
  54. {
  55.     float sum;                                //работим все с флоат, тъй като работим само с пари(10.50)
  56.     for (int i = 0; i < comp->empnum; i++)    //обхождаме служителите
  57.     {
  58.         sum = 0;
  59.         for (int j = 0; j < comp->emp[i].wdpm; j++) //обхождаме дневния надник и го сумираме, за да го сметнем
  60.         {
  61.             (float)sum = (float)sum + (float)comp->emp[i].dw[j];  //Защо има тип преди всеки елемент на тва просто събиране на 2 числа? Практиката ми показва, че при работа с числа различни от инт, се случва да се губят данни, компилатора се чуди къв тип е, за тва му го изясняваме с тия флоутове в скобите(в противен случай може да стане нещо като 1.5+2 да даде само 3, не 3,5)
  62.         }
  63.         (float)comp->emp[i].mw = (float)sum + ((int)comp->emp[i].exp * 0.015 * (float)sum); //предполагам е видно кви сметки се случват тука, малко е тъпо да са поотделно, но иначе няма как да стане, сумирането трябва да е предварително готово, а данъка го вадим чак след като имаме останалите калкулации готови
  64.         (float)comp->emp[i].mw = (float)comp->emp[i].mw - ((float)comp->emp[i].mw * 0.25);  //крайния резултат си остава в mw
  65.     }
  66. }
  67. void output(struct company *comp) //функция за принтене на данните(има шанс да ти поискат функцията да е само за един служител, виж 3. под кода
  68. {                                             //по условия иска само име и месечна за принтене, като цяло тва ЕГН за кво го искат не зная...да не решиш, че съм те ощетил с принтене, само име и месечна е по условие
  69.     for (int i = 0; i < comp->empnum; i++)
  70.     {
  71.         printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname); //тия %д. са малко излишни, но за красота има известни бонус точки
  72.         printf("Monthly wage:%.2f\n\n", comp->emp[i].mw); //Защо %.2f? f е формат за флоут, предполагам знаеш, но флоут е с цифри-00.000000-6 нули след запетаята, малко е излишно, %.2 ограничава броя на цифрите слез десетичната запетая(точка)
  73.     }
  74.     printf("Press Enter to go back to the menu."); //Прочети след 2. под кода!
  75.     getchar();                                     // Тък като клс чисти директно, реално няма да видим изобщо кви са данните, пък ако няма клс, ще стоят грозно над менюто :)
  76.     system("cls");                                 //за туй слагаме един гетчар да поглъща някъв символ, той ще чака въвеждане докато не се натисне нещо(избрах ентер за стил :Д), така данните ще са видими докато не натиснем ентера
  77. void main()
  78. {
  79.     struct company comp;                           //главната структура, структурата на компанията, кръстил съм я комп, мързелив съм да пиша цели имена
  80.     printf("Vuvedi ime na firmata:");
  81.     gets_s(comp.name, 20);
  82.     system("cls");
  83.     int choice = 0;                               //тва ни е оръжието при менюто, спямо тва кво число му даваме, ще избира съответната опция, чрез суич/кейс в уайл
  84.     while (choice!=4) // да върти цикъла, дока е различно от 4, дали сме че 4 е екзит, съответно край на програмата
  85.     {
  86.         printf("\\------MENU------/\n\n");           //(тука слагам 2 /н тъй като искам опциите да са на 1 ред след меню надписа)
  87.         printf("1.Input\n");                         //
  88.         printf("2.Output\n");                        //Прекрасното ми меню
  89.         printf("3.Calculate monthly wage\n");        //
  90.         printf("4.Exit\n");                          //
  91.         printf("Chose an option(number):");        
  92.         scanf_s("%d", &choice);                      //от тук избираме опциите
  93.         getchar();
  94.         system("cls");
  95.         switch (choice)                               //тук се случва магията на менюто и опциите със съответните функции
  96.         {
  97.         case 1: input(&comp); break;
  98.         case 2: output(&comp); break;
  99.         case 3: monthlywagecalc(&comp); break;
  100.         }
  101.     }
  102. }
  103.  
  104.  
  105. /*
  106. 1.Гетчар е функция, която поглъща някъв символ, ако имаме няква променлива чар, примерно:
  107. char ch;
  108. можем да въведем символа освен със сканф, със гетчар:
  109. getchar(ch);
  110. не работи при стрингов :)!
  111. За кво обаче я ползваме тая функция празна? Може би си забелязал, че при сканф не слагаме /н, обаче пак си отива на нов ред след сканф.
  112. Тва става щото сканф има така да го наречем вграден /н и често ако след тва имаме въвеждане на низ, низа поглъща тоя /н и после човек
  113. се чуди що някъв низ му е празен :), ето за това,
  114. Гетчара ни полгъща тоя /н и не се занимаваме с глупости :)
  115. */
  116.  
  117. /*
  118. 2.Надявам се тва да ти изкара бонус точки, system("cls") е функция на stdlib.h, която чисти конзолата. Тоест...
  119. Виждаш колко данни имаш за един служител, 5 служителя да тря да въвеждаш и конзолата стана 5 километра-кофти тръпка. Та...
  120. тая функция чисти квото има принтено преди нея, сложил съм ги където е редно, така примерно като въведеш данните за първия служител,
  121. конзолата ще ги изтрие тия редове и ще въвеждаш данни за втория на чисто :)
  122. */
  123.  
  124. /*
  125. 3.Съмнявам се да се заяде, ама нека го имаш предвид.
  126. В случая функцията въвежда всички служители, възможно е да ти поиска функцията да въвежда само 1 служител.
  127. Текущо кода ти е така(функцията въвежда всички служители):
  128.  
  129. void output(struct company *comp)
  130. {
  131.     for (int i = 0; i < comp->empnum; i++)
  132.     {
  133.         printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname);
  134.         printf("Monthly wage:%.2f\n\n", comp->emp[i].mw);
  135.     }
  136.     printf("Press Enter to go back to the menu.");
  137.     getchar();                                    
  138.     system("cls");
  139. }
  140. ...
  141. ...
  142. ...
  143. ...
  144. case 2: output(&comp); break;
  145.  
  146.  
  147. Реално разликата е в самото обхождане, тоест или ще обхождаш всички елементи на масива във функцията,
  148. или ще обхождаш самата функция, като й задаваш конкретен елемент. Ако ти поиска втория случай, ето кво променяш:
  149. махаме фор-а, така ще функицята ше работи само с 1 елемент. Слагаме параметър i,
  150. тъй като чрез него ще кажем на функицятакой точно служител да принти, ето как изглежда:
  151.  
  152. void output(int i, struct company *comp)
  153. {
  154.  
  155.     printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname);
  156.     printf("Monthly wage:%.2f\n\n", comp->emp[i].mw);
  157.     printf("Press Enter to go back to the menu.");
  158.     getchar();
  159.     system("cls");
  160. }
  161. Ся тъпото е, че трябва да махнем връщането на менюто с ентер, махаме го и финално изглежда така:
  162.  
  163. void output(int i, struct company *comp)
  164. {
  165.  
  166.     printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname);
  167.     printf("Monthly wage:%.2f\n\n", comp->emp[i].mw);
  168. }
  169.  
  170. Ся обаче тря опрайм и кейса, текущо е тъй:
  171.  
  172. case 2: output(&comp); break;
  173.  
  174. тря сложим едно обхождане и да вкараме i във функцията и сме готови:
  175.  
  176. case 2:
  177. for(int i=0;i<comp->empnum;i++)
  178. {
  179. output(i, &comp); break;
  180. }
  181.  
  182.  
  183. И си готов! Успех!
  184. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement