fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <math.h>
  5.  
  6. typedef struct {
  7. void *elements;
  8. size_t element_size;
  9. size_t size;
  10. } array_t;
  11.  
  12. void *get_array_element(array_t array, size_t idx) {
  13. assert(idx < array.size);
  14. return array.elements + idx*array.element_size;
  15. }
  16.  
  17. array_t create_array(size_t size_of_array, size_t size_of_element) {
  18. assert(size_of_array > 0);
  19. assert(size_of_element > 0);
  20.  
  21. array_t result = {
  22. malloc(size_of_array*size_of_element),
  23. size_of_element,
  24. size_of_array
  25. };
  26.  
  27. return result;
  28. }
  29.  
  30. void free_array_mem(array_t array) {
  31. free(array.elements);
  32. }
  33.  
  34. typedef struct {
  35. float x, y;
  36. } point_t;
  37.  
  38. float calc_point_length(point_t point) {
  39. return sqrt(point.x*point.x + point.y*point.y);
  40. }
  41.  
  42. array_t transform_points_to_lengths(array_t points) {
  43. assert(points.element_size == sizeof(point_t));
  44. array_t result = create_array(points.size, sizeof(float));
  45. int i = 0;
  46. for(; i < points.size; i += 1) {
  47. float *result_el = get_array_element(result, i);
  48. point_t *point_el = get_array_element(points, i);
  49. *result_el = calc_point_length(*point_el);
  50. }
  51. return result;
  52. }
  53.  
  54. array_t read_points(FILE *file) {
  55. int size = 0;
  56. fscanf(file, "%d", &size);
  57. array_t result = create_array(size, sizeof(point_t));
  58. int i = 0;
  59. for(; i < size; i += 1) {
  60. point_t *el = get_array_element(result, i);
  61. fscanf(file, "%f %f", &el->x, &el->y);
  62. }
  63. return result;
  64. }
  65.  
  66. int main(void) {
  67. array_t points = read_points(stdin);
  68. array_t lengths = transform_points_to_lengths(points);
  69.  
  70. int i = 0;
  71. for(; i < lengths.size; i += 1) {
  72. point_t *point = get_array_element(points, i);
  73. float *length = get_array_element(lengths, i);
  74. printf("[%f, %f] = %f\n", point->x, point->y, *length);
  75. }
  76.  
  77. free_array_mem(points);
  78. free_array_mem(lengths);
  79. return 0;
  80. }
  81.  
Success #stdin #stdout 0s 2304KB
stdin
3
1 1
2 2
3 -3.5
stdout
[1.000000, 1.000000] = 1.414214
[2.000000, 2.000000] = 2.828427
[3.000000, -3.500000] = 4.609772