Advertisement
m4ly

Zaimplementować algorytm generowania zbiorów k-elementowych

Jan 5th, 2014
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.51 KB | None | 0 0
  1. /*
  2. Autor: Dawid Mocek, Oktawian Cirko
  3.  
  4. W Solution -> properties -> configuration properteis -> c/c++ ->preprocessor -> preporcessor definitions trzeba dodać: _CRT_SECURE_NO_WARNINGS dla trybu Release jak i Debug
  5. */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <Windows.h>
  9. #include <time.h>
  10.  
  11. /*
  12. http://gamedev.stackexchange.com/questions/26759/best-way-to-get-elapsed-time-in-miliseconds-in-windows
  13. */
  14. long long milliseconds_now()
  15. {
  16.     static LARGE_INTEGER s_frequency;
  17.     BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
  18.     if (s_use_qpc) {
  19.         LARGE_INTEGER now;
  20.         QueryPerformanceCounter(&now);
  21.         return (1000LL * now.QuadPart) / s_frequency.QuadPart;
  22.     }
  23.     else {
  24.         return GetTickCount();
  25.     }
  26. }
  27.  
  28. /*
  29. Funkcja zwraca wskaźnik na handlera - jeśli nie otworzy pliku program się zamknie
  30. */
  31. FILE * OtworzPlik(const char *nazwa)
  32. {
  33.     FILE *fh = fopen(nazwa, "w");
  34.  
  35.     if (fh == NULL)
  36.     {
  37.         printf("Nie mozna otworzyc pliku: %s - pewnie brak uprawnien lub AVG ;) \n", nazwa);
  38.  
  39.         exit(1);
  40.     }
  41.     return fh;
  42. }
  43.  
  44. /*
  45. Funkcja zapisuje tablice tab do max k-elementów do pliku fh
  46. */
  47. void ZapiszTablice(FILE *fh, int tab[], int k)
  48. {
  49.     int j;
  50.     for (j = 1; j <= k; j++) fprintf(fh, "%d", tab[j]);
  51.     fprintf(fh, "\n");
  52. }
  53.  
  54. /*
  55. Funkcja zamyka handler pliku
  56. */
  57. void ZamknijPlik(FILE *fh)
  58. {
  59.     fclose(fh);
  60.     fh = NULL;
  61. }
  62.  
  63. /*
  64. Funkcja wypisuje na stdout tablice do max k-elementów
  65. */
  66. void Wypisz(int tab[], int k)
  67. {
  68.     int j;
  69.     for (j = 1; j <= k; j++) printf("%d", tab[j]);
  70.     printf("\n");
  71. }
  72.  
  73. /*
  74. Funkcja wczytuje dane z linii komend
  75. */
  76. char * WczytajArg(const int cnt, const char **args, int *k, int *max) // i tu
  77. {
  78.     if (cnt != 4)
  79.     {
  80.         printf("Uzycie(taka sama kolejnosc!): program.exe D:\\nazwa_pliku.txt k n\n");
  81.         printf("\tnp: program.exe D:\\nazwa_pliku.txt 4 6\n");
  82.         exit(1);
  83.     }
  84.     char * plik = (char *)malloc(strlen(args[1]) + 1);
  85.     memset(plik, 0, strlen(args[1]) + 1);
  86.     memcpy(plik, args[1], strlen(args[1]));
  87.  
  88.     if (!plik)
  89.     {
  90.         free(plik);
  91.         printf("Nie mozna zaalkowac pamieci dla %s", args[1]);
  92.         exit(1);
  93.     }
  94.  
  95.     *k = atoi(args[2]); // oo tu
  96.     *max = atoi(args[3]);
  97.  
  98.     if (*k <= 0 || *max <= 0)
  99.     {
  100.         printf("Error: max > k || k <= 0 || max <=0 \n");
  101.         exit(1);
  102.     }
  103.  
  104.     return plik;
  105. }
  106.  
  107. /*
  108. Funkcja alokuje tablice
  109. */
  110. int * AllocZbior(const int size)
  111. {
  112.     int *t = (int*)malloc(sizeof(int)* size);
  113.     if (!t)
  114.     {
  115.         free(t);
  116.         printf("Nie mozna zaalokwoac pamieci dla zbioru o liczbie elmentow: %d", size);
  117.         exit(1);
  118.     }
  119.     return t;
  120. }
  121.  
  122. int main(int argc, char **argv)
  123. {
  124.  
  125.  
  126.     unsigned long int total = 0;
  127.     int i, p;
  128.     int k;
  129.  
  130.     int max;
  131.     int n;
  132.  
  133.     // Wczytujemy dane
  134.     char *nazwa_pliku = WczytajArg(argc, argv, &k, &max);
  135.  
  136.     // Alokumjemy zbior
  137.     int *A = AllocZbior(max);
  138.  
  139.     // Otwieramy plik
  140.     FILE *fh = OtworzPlik(nazwa_pliku);
  141.  
  142.     // Czas start
  143.     long long start = milliseconds_now();
  144.  
  145.     // Wpisujemy dane do zbioru
  146.     for (i = 1; i <= k; i++)
  147.         A[i] = i;
  148.  
  149.     n = max;
  150.     p = k;
  151.  
  152.     while (p >= 1)
  153.     {
  154.         // Wypisujemy tablice
  155.         // Wypisz(A, k);
  156.  
  157.         // Zapisujemy tablice do pliku
  158.         ZapiszTablice(fh, A, k);
  159.  
  160.         /// jescze to trzeba opisac - manual z labek
  161.         if (n == A[k]) --p;  else  p = k;
  162.  
  163.         if (p >= 1)
  164.         for (i = k; i >= p; --i, ++total)
  165.             A[i] = A[p] + i - p + 1;
  166.  
  167.         ++total;
  168.     }
  169.  
  170.     // Czas koniec
  171.     long long elapsed = milliseconds_now() - start;
  172.     printf("Czas: %lld milisekund, dla k = %d, n = %d.\nLiczba iteracji wszystkich petlach: %ld", elapsed, k, max, total);
  173.  
  174.     // Zamykamy plik
  175.     ZamknijPlik(fh);
  176.  
  177.     // Zwalniamy pamiec
  178.     free(nazwa_pliku);
  179.     free(A);
  180.     return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement