Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2014
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. #include <string.h>
  6. #define SIZE 65 //тк в дабле максимум 64 символа+закрывающий ноль
  7. void Error(int, char*);
  8. void fprintMatch(FILE*, char*, char*, int, int*);
  9. void searchToken(FILE*, char*, char*);
  10. int gorner(char *num, int base)
  11. void main() {
  12. float f;
  13. double d;
  14. int base, startN, res, rest, i, arrOfErr[12] = { 0 }, arr[] = { 10, 2, 3, 4, 8, 9, 16, 20, 25, 30 }, k = 10, *p, h;
  15. char *sIn = "file.in", *sOut = "file.out", buffer[SIZE], *b = buffer, bufferForNum[SIZE], *bb = bufferForNum, ten[SIZE], *t = ten + SIZE - 1, e[SIZE], *ee = e + SIZE - 1;
  16. FILE *fIn = NULL, *fOut = NULL;
  17. *t-- = 0;
  18. *ee-- = 0;
  19. ee = e;
  20. if (!(fIn = fopen(sIn, "r")))
  21. Error(404, sIn);
  22. if (!(fOut = fopen(sOut, "w"))) {
  23. fclose(fIn);
  24. Error(403, sOut);
  25. };
  26. while (k--) {
  27. bb = bufferForNum;
  28. b = buffer;
  29. t = ten + SIZE - 2;//вся эта ерунда нужна,тк у нас в одном месте получается число,а в другом-строка,а надо привести к 1 типу
  30. res = 0;
  31. searchToken(fIn, bb, b); // находим лексему
  32. bb = bufferForNum;
  33. b = buffer;
  34. base = 0;
  35. while (*b)
  36. base = base * 10 + (isdigit(*b) ? *b - '0' : toupper(*b) - 'A' + 10), b++; // горнер,чтобы из строки в число
  37. b = buffer;
  38. while (*bb)
  39. res = res * base + (isdigit(*bb) ? *bb - '0' : toupper(*bb) - 'A' + 10), bb++; // как выше
  40. bb = bufferForNum;
  41. fprintf(fOut, "The number is %s(%d)\n", bb, base); // изначальное число
  42. searchToken(fIn, bb, b); // находим в 10 системе(есть смысл делать его отдельно,т.к с ним сравнение будет)
  43. bb = bufferForNum;
  44. b = buffer;
  45. startN = res;//res хранит 10 представление
  46. while (startN)
  47. *t-- = ((rest = startN % 10) < 10) ? rest + '0' : rest + 'A' - 10, startN /= 10; //антигорнер
  48. fprintMatch(fOut, ++t, bb, 10, &arrOfErr[0]); // сверяем его с тем, что получилось; заносим в файл инфу о (не)совпадении; увеличиваем счетчик ошибок данного основания при несовпадении
  49. for (i = 0; i < 9; i++) { // проходим все основания
  50. searchToken(fIn, bb, b);
  51. bb = bufferForNum;
  52. b = buffer;
  53. base = 0;
  54. while (*b)
  55. base = base * 10 + (isdigit(*b) ? *b - '0' : toupper(*b) - 'A' + 10), b++;
  56. b = buffer + SIZE - 1;
  57. *b = 0;
  58. startN = res;
  59. while (startN)
  60. *--b = ((rest = startN % base) < 10) ? rest + '0' : rest + 'A' - 10, startN /= base;
  61. fprintMatch(fOut, b, bb, base, &arrOfErr[i + 1]); // сверяем число из файла с тем, что получилось;
  62. b = buffer;
  63. };
  64. ee = e; //буфер для чтения флоата и дабла
  65. searchToken(fIn, bb, ee); // находим представление числа во float
  66. bb = bufferForNum;
  67. f = res;
  68. p = (int*)&f;
  69. b = buffer + SIZE - 1;
  70. while (*p)
  71. *--b = ((rest = *p % 16) < 10) ? rest + '0' : rest + 'A' - 10, *p /= 16;
  72. fprintMatch(fOut, b, bb, 0, &arrOfErr[10]); // сверяем число из файла с тем, что получилось; заносим в файл инфу о (не)совпадении; увеличиваем счетчик ошибок float при несовпадении
  73. ee = e;
  74. searchToken(fIn, bb, ee); // находим представление числа в double
  75. d = res; // полный копипаст костикова и генерации
  76. p = (int*)&d;
  77. p++;
  78. b = buffer + SIZE - 1;
  79. while (*p)
  80. *--b = ((rest = *p % 16) < 10) ? rest + '0' : rest + 'A' - 10, *p /= 16;
  81. ee = e + SIZE - 2;
  82. b = buffer + SIZE - 2;
  83. h = 8;
  84. while (h--)
  85. *ee-- = '0';
  86. h = 8;
  87. while (h--)
  88. *ee-- = *b--;
  89. fprintMatch(fOut, ++ee, bb, 1, &arrOfErr[11]);
  90. };
  91. for (i = 0; i < 10; i++) // выводим кол-во ошибок
  92. if (arrOfErr[i])
  93. fprintf(fOut, "String %d has %d errors\n", arr[i], arrOfErr[i]);
  94. else
  95. fprintf(fOut, "String %d hasn`t errors\n", arr[i]);
  96. if (arrOfErr[i])
  97. fprintf(fOut, "Float has %d errors\n", arrOfErr[i++]);
  98. else
  99. fprintf(fOut, "Float hasn`t errors\n");
  100. if (arrOfErr[i])
  101. fprintf(fOut, "Double has %d errors", arrOfErr[i]);
  102. else
  103. fprintf(fOut, "Double hasn`t errors\n");
  104. fclose(fIn);
  105. fclose(fOut);
  106. }
  107. void Error(int nError, char *sIn) {
  108. printf("Error %d! File \'%s\' don`t exist or can`t be open!\n", nError, sIn);
  109. exit(nError);
  110. }
  111. void fprintMatch(FILE *f, char *rightNum, char *num, int base, int *nErr) {
  112. if (base > 1)
  113. fprintf(f, "%s(%d) is ", num, base);
  114. else if (!base)
  115. fprintf(f, "Float is ");
  116. else
  117. fprintf(f, "Double is ");
  118. if (!strcmp(rightNum, num))
  119. fprintf(f, "True\n");
  120. else
  121. fprintf(f, "False. Correct number is %s\n", rightNum), (*nErr)++;
  122. }
  123. void searchToken(FILE *f, char *s, char *b) {
  124. char c, c_ = ' ';
  125. int first = 1;
  126. while (!feof(f)) {
  127. c = fgetc(f);
  128. if (isalnum(c))
  129. if (first)
  130. *s++ = c;
  131. else
  132. *b++ = c;
  133. else if (isalnum(c_)) {
  134. if (first)
  135. *s = 0, first = 0;
  136. else {
  137. *b = 0;
  138. break;
  139. };
  140. };
  141. c_ = c;
  142. };
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement