Advertisement
Guest User

ematematikas.lt_2017_11_11

a guest
Nov 11th, 2017
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. //---------------------------------------------------------------------------------
  5. #define MAX 100
  6. #define FILE_NAME "input.txt"
  7. //---------------------------------------------------------------------------------
  8. // Funkciju prototipai
  9. void duomenuNuskaitymas(int *sk, double x[], double y[], double s[]);
  10. double distanceBetweenTwoPoints(int x0, int y0, int x1, int y1);
  11. int searchForIntersects(int sk, double x[], double y[], double s[]);
  12. int theMostIntersects(int arr[], int n);
  13. //---------------------------------------------------------------------------------
  14. int main()
  15. {
  16.     int sk;                        // apskritimu skaicius
  17.     double x[MAX], y[MAX], s[MAX]; // apskritimu parametrai
  18.  
  19.     duomenuNuskaitymas(&sk, x, y, s);
  20.    
  21.     printf("Daugiausiai kartu kerta %d-asis apskritimas\n", searchForIntersects(sk, x, y, s)+1);
  22.     return 0;
  23. }
  24. //---------------------------------------------------------------------------------
  25. // grazinamas indeksas apskritimo, kuris kertasi daugiasiai kartu
  26. int theMostIntersects(int arr[], int n)
  27. {
  28.     int index = 0, max = 0;
  29.     for(int i = 0; i<n; i++)
  30.         if(arr[i] > max){
  31.             max = arr[i];
  32.             index = i;
  33.         }
  34.     return index;
  35. }
  36. //---------------------------------------------------------------------------------
  37. // Blogi atvejai:
  38. // d > s1 + s0 (isvis nekerta)
  39. // d < |s1 - s0| (vienas apskritimas kitame)
  40. // d = 0 ir s1 = s0 (tie patys apskritimai)
  41. //
  42. // Geri atvejai:
  43. // d < s1 + s0 (apskritimai kertami du kartus)
  44. // d = s1 + s0 (apskritimai lieciasi)
  45. //
  46. // funkcija grazins to apskritimo, kuris daugiausiai kerta kitu, indeksa.
  47. // Jeigu yra keli tokie apskritimai, bus grazinamas pirmiau duomenu faile
  48. // pateikto apskritimo indeksas
  49. int searchForIntersects(int sk, double x[], double y[], double s[])
  50. {
  51.     int howManyIntersects[sk];    // kiek kiekvienas apskritimas kerta kitu
  52.     double d;                       // atstumas tarp dvieju tasku
  53.  
  54.     // apnulinamos reiksmes kad galetume sumuoti susikirtimus:
  55.     for(int i = 0; i<sk; i++)
  56.         howManyIntersects[i] = 0;
  57.  
  58.     for(int i = 0; i<sk; i++){ // einame per pradini apskritima
  59.         for(int j = 0; j<sk; j++){ // i-tasis apskritimas lyginamas su j-tuoju apskritimu
  60.             if(i != j){ // praleidziame vienodus apskritimus
  61.                 d = distanceBetweenTwoPoints(x[i], y[i], x[j], y[j]);
  62.                 if(d > s[i] + s[j] || d < fabs(s[i] - s[j]) || (d == 0 && s[i] == s[j]))
  63.                     ; // do nothing as those cases are wrong
  64.                 else if(d < s[i] + s[j] || d == s[i] + s[j])
  65.                     howManyIntersects[i]++; // vadinasi i-tasis apskritimas kerta j-taji apskritima
  66.             }
  67.         }
  68.     }
  69.     return theMostIntersects(howManyIntersects, sk);
  70. }
  71. //---------------------------------------------------------------------------------
  72. // funkcija randa ir grazina atstuma tarp dvieju tasku
  73. double distanceBetweenTwoPoints(int x0, int y0, int x1, int y1)
  74. {
  75.     return sqrt(pow((x1-x0),2)+pow((y1-y0),2));
  76. }
  77. //---------------------------------------------------------------------------------
  78. void duomenuNuskaitymas(int *sk, double x[], double y[], double s[])
  79. {
  80.     FILE *fp = fopen(FILE_NAME, "r");
  81.  
  82.     if(fp != NULL){
  83.         fscanf(fp, "%d", &*sk);
  84.         if(*sk > 0){
  85.             for(int i = 0; i<*sk; i++)
  86.                 fscanf(fp, "%lf%lf%lf", &x[i], &y[i], &s[i]);
  87.         }else{
  88.             printf("Nekorektiska ivestis..\n");
  89.             exit(EXIT_FAILURE);
  90.         }
  91.         fclose(fp);
  92.     }else{
  93.         printf("Toks failas pavadinimu %s nerastas\n", FILE_NAME);
  94.         exit(EXIT_FAILURE);
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement