Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct employee //структура за служители
- {
- char fname[21]; //собствено име-стринг //задавам ги 21 симовла, тъй като последния е /0, което е
- char sname[21]; //башино //за край на низа, тоест за име си остават плътно 20, не е
- char lname[21]; //фамилно //задължително, но лично на мен така ми харесва повече
- long egn; //егн, защо лонг, а не инт? егнто е 10 символа, инт не ги побира, лонг ги побира(чисто информативно можеш да чукнеш в нета C data types за да схванеш за кво говоря)
- int exp; //стаж
- int wdpm; //работни дни в месеца(working days per month)
- float dw[30]; //масив за дейли уейдж, дневен надник, не знам защо искат за всеки по отделно, но...:/. Флоат, понеже инт е цяло число, може да е 10 лв, ама може да е и 10.50 примерно
- float mw; //месечна заплата, monthlywage
- };
- struct company //структура за компания
- {
- char name[21]; //име на компанията
- struct employee emp[50]; //масив от структури за служители(emp-employee)
- int empnum; //брой служители(empnum-employee number)
- };
- void input(struct company *comp) //функция за въвеждане на данните на служителите, параметъра е поинтер към структурата comp
- {
- printf("Vuvedi broi na slujitelite:");
- scanf_s("%d", &comp->empnum); //въвеждаме броя на служителите,при поинтери достъпа до елементите става с ->
- getchar(); //това пък защо? виж 1. под кода
- system("cls"); //2. под кода
- for (int i = 0; i < comp->empnum; i++) //обхождаме масива от служители
- {
- printf("Vuvedi sobstveno ime na slujitel %d:", i + 1); //Защо и+1? масива започва от 0, малко грозно изгледжа да принти първия служител като 0
- gets_s(comp->emp[i].fname, 21); //emp[i], хващаме и-тия подред служител
- printf("Vuvedi bashtino ime na slujitel %d:", i + 1);
- gets_s(comp->emp[i].sname, 21); //защо гетс_с а не просто гетс? Вижуал студио не се разбира с гетс(), гетс_с работи дори по-добре, тъй като задаваш и размера за въвеждане: gets_s(string, razmer na stringa),може да послужи ако стринга ти е 20, ма ти искаш да ограничиш до 10, ако се налага
- printf("Vuvedi familno ime na slujitel %d:", i + 1);
- gets_s(comp->emp[i].lname, 21);
- printf("Vuvedi EGN na slujitel %d:", i + 1);
- scanf_s("%ld", &comp->emp[i].egn); //%ld-формат за long
- getchar();
- printf("Vuvedi trudov staj na slujitel %d:", i + 1);
- scanf_s("%d", &comp->emp[i].exp); //дам, и със сканф() не се разбира вижуала, тук единствената разлика е _s
- getchar();
- printf("Vuvedi broi na rabotni dni v tekushtiq mesec na slujitel %d:", i + 1);
- scanf_s("%d", &comp->emp[i].wdpm);
- for (int j = 0; j < comp->emp[i].wdpm; j++) //за всеки отделен служител-обхождаме масива от дневни надници, тук слагаме dw[j]
- {
- printf("Vuvedi nadnik za den %d na slujitel %d:", j + 1, i + 1);
- scanf_s("%f", &comp->emp[i].dw[j]);
- getchar();
- }
- system("cls");
- }
- }
- void monthlywagecalc(struct company *comp) //функция за калкулиране на месечната заплата
- {
- float sum; //работим все с флоат, тъй като работим само с пари(10.50)
- for (int i = 0; i < comp->empnum; i++) //обхождаме служителите
- {
- sum = 0;
- for (int j = 0; j < comp->emp[i].wdpm; j++) //обхождаме дневния надник и го сумираме, за да го сметнем
- {
- (float)sum = (float)sum + (float)comp->emp[i].dw[j]; //Защо има тип преди всеки елемент на тва просто събиране на 2 числа? Практиката ми показва, че при работа с числа различни от инт, се случва да се губят данни, компилатора се чуди къв тип е, за тва му го изясняваме с тия флоутове в скобите(в противен случай може да стане нещо като 1.5+2 да даде само 3, не 3,5)
- }
- (float)comp->emp[i].mw = (float)sum + ((int)comp->emp[i].exp * 0.015 * (float)sum); //предполагам е видно кви сметки се случват тука, малко е тъпо да са поотделно, но иначе няма как да стане, сумирането трябва да е предварително готово, а данъка го вадим чак след като имаме останалите калкулации готови
- (float)comp->emp[i].mw = (float)comp->emp[i].mw - ((float)comp->emp[i].mw * 0.25); //крайния резултат си остава в mw
- }
- }
- void output(struct company *comp) //функция за принтене на данните(има шанс да ти поискат функцията да е само за един служител, виж 3. под кода
- { //по условия иска само име и месечна за принтене, като цяло тва ЕГН за кво го искат не зная...да не решиш, че съм те ощетил с принтене, само име и месечна е по условие
- for (int i = 0; i < comp->empnum; i++)
- {
- printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname); //тия %д. са малко излишни, но за красота има известни бонус точки
- printf("Monthly wage:%.2f\n\n", comp->emp[i].mw); //Защо %.2f? f е формат за флоут, предполагам знаеш, но флоут е с цифри-00.000000-6 нули след запетаята, малко е излишно, %.2 ограничава броя на цифрите слез десетичната запетая(точка)
- }
- printf("Press Enter to go back to the menu."); //Прочети след 2. под кода!
- getchar(); // Тък като клс чисти директно, реално няма да видим изобщо кви са данните, пък ако няма клс, ще стоят грозно над менюто :)
- system("cls"); //за туй слагаме един гетчар да поглъща някъв символ, той ще чака въвеждане докато не се натисне нещо(избрах ентер за стил :Д), така данните ще са видими докато не натиснем ентера
- void main()
- {
- struct company comp; //главната структура, структурата на компанията, кръстил съм я комп, мързелив съм да пиша цели имена
- printf("Vuvedi ime na firmata:");
- gets_s(comp.name, 20);
- system("cls");
- int choice = 0; //тва ни е оръжието при менюто, спямо тва кво число му даваме, ще избира съответната опция, чрез суич/кейс в уайл
- while (choice!=4) // да върти цикъла, дока е различно от 4, дали сме че 4 е екзит, съответно край на програмата
- {
- printf("\\------MENU------/\n\n"); //(тука слагам 2 /н тъй като искам опциите да са на 1 ред след меню надписа)
- printf("1.Input\n"); //
- printf("2.Output\n"); //Прекрасното ми меню
- printf("3.Calculate monthly wage\n"); //
- printf("4.Exit\n"); //
- printf("Chose an option(number):");
- scanf_s("%d", &choice); //от тук избираме опциите
- getchar();
- system("cls");
- switch (choice) //тук се случва магията на менюто и опциите със съответните функции
- {
- case 1: input(&comp); break;
- case 2: output(&comp); break;
- case 3: monthlywagecalc(&comp); break;
- }
- }
- }
- /*
- 1.Гетчар е функция, която поглъща някъв символ, ако имаме няква променлива чар, примерно:
- char ch;
- можем да въведем символа освен със сканф, със гетчар:
- getchar(ch);
- не работи при стрингов :)!
- За кво обаче я ползваме тая функция празна? Може би си забелязал, че при сканф не слагаме /н, обаче пак си отива на нов ред след сканф.
- Тва става щото сканф има така да го наречем вграден /н и често ако след тва имаме въвеждане на низ, низа поглъща тоя /н и после човек
- се чуди що някъв низ му е празен :), ето за това,
- Гетчара ни полгъща тоя /н и не се занимаваме с глупости :)
- */
- /*
- 2.Надявам се тва да ти изкара бонус точки, system("cls") е функция на stdlib.h, която чисти конзолата. Тоест...
- Виждаш колко данни имаш за един служител, 5 служителя да тря да въвеждаш и конзолата стана 5 километра-кофти тръпка. Та...
- тая функция чисти квото има принтено преди нея, сложил съм ги където е редно, така примерно като въведеш данните за първия служител,
- конзолата ще ги изтрие тия редове и ще въвеждаш данни за втория на чисто :)
- */
- /*
- 3.Съмнявам се да се заяде, ама нека го имаш предвид.
- В случая функцията въвежда всички служители, възможно е да ти поиска функцията да въвежда само 1 служител.
- Текущо кода ти е така(функцията въвежда всички служители):
- void output(struct company *comp)
- {
- for (int i = 0; i < comp->empnum; i++)
- {
- printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname);
- printf("Monthly wage:%.2f\n\n", comp->emp[i].mw);
- }
- printf("Press Enter to go back to the menu.");
- getchar();
- system("cls");
- }
- ...
- ...
- ...
- ...
- case 2: output(&comp); break;
- Реално разликата е в самото обхождане, тоест или ще обхождаш всички елементи на масива във функцията,
- или ще обхождаш самата функция, като й задаваш конкретен елемент. Ако ти поиска втория случай, ето кво променяш:
- махаме фор-а, така ще функицята ше работи само с 1 елемент. Слагаме параметър i,
- тъй като чрез него ще кажем на функицятакой точно служител да принти, ето как изглежда:
- void output(int i, struct company *comp)
- {
- printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname);
- printf("Monthly wage:%.2f\n\n", comp->emp[i].mw);
- printf("Press Enter to go back to the menu.");
- getchar();
- system("cls");
- }
- Ся тъпото е, че трябва да махнем връщането на менюто с ентер, махаме го и финално изглежда така:
- void output(int i, struct company *comp)
- {
- printf("%d.%s %s %s\n", i+1, comp->emp[i].fname, comp->emp[i].sname, comp->emp[i].lname);
- printf("Monthly wage:%.2f\n\n", comp->emp[i].mw);
- }
- Ся обаче тря опрайм и кейса, текущо е тъй:
- case 2: output(&comp); break;
- тря сложим едно обхождане и да вкараме i във функцията и сме готови:
- case 2:
- for(int i=0;i<comp->empnum;i++)
- {
- output(i, &comp); break;
- }
- И си готов! Успех!
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement