Advertisement
Guest User

Untitled

a guest
May 21st, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.79 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. #define FAIL(str) \
  7. { \
  8. puts(str); \
  9. return 1; \
  10. }
  11.  
  12. #define SCORE_NUM 5
  13. #define GROUP_TO_DELETE "BIV180"
  14. #define NEEDS_AVG_SCORE
  15.  
  16. // Why is it so bad? Read more about data aligment
  17. struct person {
  18. char *familia;
  19. char *name;
  20. char *otchestvo;
  21. };
  22.  
  23. struct scores {
  24. unsigned char B[SCORE_NUM];
  25. #ifdef NEEDS_AVG_SCORE
  26. float average;
  27. #endif
  28. };
  29.  
  30. struct stud{
  31. person fio;
  32. char *group;
  33. scores uspevaemost;
  34. } student;
  35.  
  36. struct element {
  37. element *next;
  38. element *prev;
  39. stud student;
  40. };
  41.  
  42. bool nendof(FILE *fl) {
  43. size_t addr = ftell(fl);
  44. bool res = (fgetc(fl) != EOF) && (fgetc(fl) != EOF);
  45. fseek(fl, addr, 0);
  46. return res;
  47. }
  48.  
  49. element *input() {
  50. puts("Input file name:");
  51. char *file_name;
  52. scanf("%ms", &file_name);
  53. FILE *fl = fopen(file_name, "r");
  54. delete (file_name);
  55. if (fl == NULL) {
  56. perror("Failed: couldn't open the file");
  57. return NULL;
  58. }
  59. element *current;
  60. element *prev = NULL;
  61. do {
  62. current = new element();
  63. current->prev = prev;
  64. // Read fio
  65. fscanf(fl, "%ms", &current->student.fio.familia);
  66. fscanf(fl, "%ms", &current->student.fio.name);
  67. fscanf(fl, "%ms", &current->student.fio.otchestvo);
  68. // Read group (most important in my case)
  69. fscanf(fl, "%ms", &current->student.group);
  70. // Read scores and sum them up
  71. #ifdef NEEDS_AVG_SCORE
  72. float sum = 0;
  73. #endif
  74. for (unsigned char i = 0; i < SCORE_NUM; i++) {
  75. fscanf(fl, "%hhu", &current->student.uspevaemost.B[i]);
  76. #ifdef NEEDS_AVG_SCORE
  77. sum += current->student.uspevaemost.B[i];
  78. #endif
  79. }
  80. #ifdef NEEDS_AVG_SCORE
  81. // Find an average(mean) value
  82. current->student.uspevaemost.average = sum / SCORE_NUM;
  83. #endif
  84. // Set the next element for the previous one
  85. if (prev)
  86. prev->next = current;
  87. prev = current;
  88. } while (nendof(fl));
  89. fclose(fl);
  90. return current;
  91. }
  92.  
  93. void element_destructor(element *el) {
  94. delete (el->student.fio.familia);
  95. delete (el->student.fio.name);
  96. delete (el->student.fio.otchestvo);
  97. delete (el->student.group);
  98. delete (el);
  99. }
  100.  
  101. void output(element *head) {
  102. const char file_name[] = "out.txt"; // Output file
  103. FILE *fl = fopen(file_name, "w");
  104. // find the first element
  105. element *first;
  106. for (first = head; first->prev; first = first->prev)
  107. ;
  108. // Print elements one by one
  109. for (element *cur = first; cur; cur = cur->next) {
  110. fprintf(fl, "%s\n", cur->student.fio.familia);
  111. fprintf(fl, "%s\n", cur->student.fio.name);
  112. fprintf(fl, "%s\n", cur->student.fio.otchestvo);
  113. fprintf(fl, "%s\n", cur->student.group);
  114. for (unsigned char i = 0; i < SCORE_NUM; i++)
  115. fprintf(fl, " %hhu", cur->student.uspevaemost.B[i]);
  116. fputc('\n', fl);
  117. };
  118. fclose(fl);
  119. }
  120.  
  121. #if 0
  122. unsigned char process(element *&head) {
  123. // The function returns amount of deleted elements (not more then 255)
  124. unsigned char elements = 0;
  125. element *el = head;
  126. while (el) {
  127. if (strcmp(el->student.group, GROUP_TO_DELETE)) {
  128. el = el->prev;
  129. } else { // delete element
  130. if (el->prev)
  131. el->prev->next = el->next; // Previous element to point on the next one
  132. if (el->next)
  133. el->next->prev = el->prev; // Next element to point on the previous one
  134. if (el == head)
  135. head = el->prev;
  136. element *tmp_ptr;
  137. tmp_ptr = el;
  138. el = el->prev;
  139. element_destructor(tmp_ptr);
  140. elements++;
  141. }
  142. }
  143. return elements;
  144. }
  145. #endif
  146.  
  147. unsigned char countten(element *el){
  148. //WORKS FOR SURE
  149. int n = 0;
  150. for (int i = 0; i < SCORE_NUM; i++)
  151. if (el->student.uspevaemost.B[i] == 10) n++;
  152. return n;
  153. }
  154.  
  155. inline void swap(element*& r, element* &i){
  156. stud tmp = r->student;
  157. r->student = i->student;
  158. i->student = tmp;
  159. }
  160.  
  161. bool process(element *&head) {
  162. bool res = false;
  163. for(element *i = head; i; i=i->prev)
  164. {
  165. for(element *r = head; r->prev && r->prev != i; r = r->prev)
  166. {
  167. if(countten(r) < countten(r->prev))
  168. {
  169. // Обмен местами
  170. swap(r, r->prev);
  171. res = true;
  172. }
  173. }
  174. }
  175. return res;
  176. //swap(head->prev,head->prev->prev);
  177.  
  178. return 1;
  179. }
  180.  
  181. int main() {
  182. element *data = input();
  183. if (!data)
  184. FAIL("Quiting now.");
  185. if (!process(data))
  186. FAIL("Nothing to delete");
  187. if (data)
  188. output(data);
  189. else
  190. FAIL("Nothing left");
  191. return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement