Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- #define SIZE 65 //тк в дабле максимум 64 символа+закрывающий ноль
- void Error(int, char*);
- void fprintMatch(FILE*, char*, char*, int, int*);
- void searchToken(FILE*, char*, char*);
- int gorner(char *num, int base)
- void main() {
- float f;
- double d;
- int base, startN, res, rest, i, arrOfErr[12] = { 0 }, arr[] = { 10, 2, 3, 4, 8, 9, 16, 20, 25, 30 }, k = 10, *p, h;
- 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;
- FILE *fIn = NULL, *fOut = NULL;
- *t-- = 0;
- *ee-- = 0;
- ee = e;
- if (!(fIn = fopen(sIn, "r")))
- Error(404, sIn);
- if (!(fOut = fopen(sOut, "w"))) {
- fclose(fIn);
- Error(403, sOut);
- };
- while (k--) {
- bb = bufferForNum;
- b = buffer;
- t = ten + SIZE - 2;//вся эта ерунда нужна,тк у нас в одном месте получается число,а в другом-строка,а надо привести к 1 типу
- res = 0;
- searchToken(fIn, bb, b); // находим лексему
- bb = bufferForNum;
- b = buffer;
- base = 0;
- while (*b)
- base = base * 10 + (isdigit(*b) ? *b - '0' : toupper(*b) - 'A' + 10), b++; // горнер,чтобы из строки в число
- b = buffer;
- while (*bb)
- res = res * base + (isdigit(*bb) ? *bb - '0' : toupper(*bb) - 'A' + 10), bb++; // как выше
- bb = bufferForNum;
- fprintf(fOut, "The number is %s(%d)\n", bb, base); // изначальное число
- searchToken(fIn, bb, b); // находим в 10 системе(есть смысл делать его отдельно,т.к с ним сравнение будет)
- bb = bufferForNum;
- b = buffer;
- startN = res;//res хранит 10 представление
- while (startN)
- *t-- = ((rest = startN % 10) < 10) ? rest + '0' : rest + 'A' - 10, startN /= 10; //антигорнер
- fprintMatch(fOut, ++t, bb, 10, &arrOfErr[0]); // сверяем его с тем, что получилось; заносим в файл инфу о (не)совпадении; увеличиваем счетчик ошибок данного основания при несовпадении
- for (i = 0; i < 9; i++) { // проходим все основания
- searchToken(fIn, bb, b);
- bb = bufferForNum;
- b = buffer;
- base = 0;
- while (*b)
- base = base * 10 + (isdigit(*b) ? *b - '0' : toupper(*b) - 'A' + 10), b++;
- b = buffer + SIZE - 1;
- *b = 0;
- startN = res;
- while (startN)
- *--b = ((rest = startN % base) < 10) ? rest + '0' : rest + 'A' - 10, startN /= base;
- fprintMatch(fOut, b, bb, base, &arrOfErr[i + 1]); // сверяем число из файла с тем, что получилось;
- b = buffer;
- };
- ee = e; //буфер для чтения флоата и дабла
- searchToken(fIn, bb, ee); // находим представление числа во float
- bb = bufferForNum;
- f = res;
- p = (int*)&f;
- b = buffer + SIZE - 1;
- while (*p)
- *--b = ((rest = *p % 16) < 10) ? rest + '0' : rest + 'A' - 10, *p /= 16;
- fprintMatch(fOut, b, bb, 0, &arrOfErr[10]); // сверяем число из файла с тем, что получилось; заносим в файл инфу о (не)совпадении; увеличиваем счетчик ошибок float при несовпадении
- ee = e;
- searchToken(fIn, bb, ee); // находим представление числа в double
- d = res; // полный копипаст костикова и генерации
- p = (int*)&d;
- p++;
- b = buffer + SIZE - 1;
- while (*p)
- *--b = ((rest = *p % 16) < 10) ? rest + '0' : rest + 'A' - 10, *p /= 16;
- ee = e + SIZE - 2;
- b = buffer + SIZE - 2;
- h = 8;
- while (h--)
- *ee-- = '0';
- h = 8;
- while (h--)
- *ee-- = *b--;
- fprintMatch(fOut, ++ee, bb, 1, &arrOfErr[11]);
- };
- for (i = 0; i < 10; i++) // выводим кол-во ошибок
- if (arrOfErr[i])
- fprintf(fOut, "String %d has %d errors\n", arr[i], arrOfErr[i]);
- else
- fprintf(fOut, "String %d hasn`t errors\n", arr[i]);
- if (arrOfErr[i])
- fprintf(fOut, "Float has %d errors\n", arrOfErr[i++]);
- else
- fprintf(fOut, "Float hasn`t errors\n");
- if (arrOfErr[i])
- fprintf(fOut, "Double has %d errors", arrOfErr[i]);
- else
- fprintf(fOut, "Double hasn`t errors\n");
- fclose(fIn);
- fclose(fOut);
- }
- void Error(int nError, char *sIn) {
- printf("Error %d! File \'%s\' don`t exist or can`t be open!\n", nError, sIn);
- exit(nError);
- }
- void fprintMatch(FILE *f, char *rightNum, char *num, int base, int *nErr) {
- if (base > 1)
- fprintf(f, "%s(%d) is ", num, base);
- else if (!base)
- fprintf(f, "Float is ");
- else
- fprintf(f, "Double is ");
- if (!strcmp(rightNum, num))
- fprintf(f, "True\n");
- else
- fprintf(f, "False. Correct number is %s\n", rightNum), (*nErr)++;
- }
- void searchToken(FILE *f, char *s, char *b) {
- char c, c_ = ' ';
- int first = 1;
- while (!feof(f)) {
- c = fgetc(f);
- if (isalnum(c))
- if (first)
- *s++ = c;
- else
- *b++ = c;
- else if (isalnum(c_)) {
- if (first)
- *s = 0, first = 0;
- else {
- *b = 0;
- break;
- };
- };
- c_ = c;
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement