#include #include #define SLOUPCE 200 double zatizeni(int Nko, double ztrat); double ztraty(int pocet, double zatizeni); long long int faktorial(int a); double mocnina(double neco, double naco); int main(int argc, char *argv[]) { double ztraty[SLOUPCE]; int N; N = atoi(argv[1]); if (N < 1) { printf("Pocet vedeni musi byt kladne cislo!\n"); return 1; } for (int j = 2; argv[j] != NULL; j++) { ztraty[j - 2] = atof(argv[j]); if (ztraty[j - 2] < 0 || ztraty[j - 2] > 100) { printf("Zadejte prosim normalni ztraty.\n"); return 1; } } printf("z->|"); for (int j = 0; argv[j + 2] != NULL; j++) { printf(" %5.1f%% |", ztraty[j] * 100); } printf("\n"); printf(" N |"); for (int j = 0; argv[j + 2] != NULL; j++) { printf("--------|"); } printf("\n"); for (int k = 1; k <= N; k++) { printf("%2d |", k); for (int j = 0; argv[j + 2] != NULL; j++) { double y = zatizeni(k, ztraty[j]); printf(" %7.3f |", y); } printf("\n"); } return 0; } // Výpočet zatížení double zatizeni(int Nko, double ztrat) { double horni = Nko, dolni = 0, zat = 0; while (1) { zat = (horni + dolni) / 2; double ztraticky = ztraty(Nko, zat); if (ztraticky > ztrat) { horni = zat; } if (ztraticky < ztrat) { dolni = zat; } if (ztraticky >= (ztrat - 0.001) && ztraticky <= (ztrat + 0.001)) { break; } } return zat; } // Výpočet Erlangových ztrát double ztraty(int pocet, double zatizeni) { double suma = 0; for (int i = 0; i <= pocet; i++) { suma += mocnina(zatizeni, i) / faktorial(i); } return mocnina(zatizeni, pocet) / faktorial(pocet) / suma; } // Faktoriál long long int faktorial(int a) { long long int b = 1; for (int c = 1; c <= a; c++) { b *= c; } return b; } // Mocnina double mocnina(double neco, double naco) { double vysl = 1; for (int Nc = 1; Nc <= naco; Nc++) { vysl *= neco; } return vysl; }