Initially, the task was to find out certain values from the input data stream and transfer them from Celsius to Fahrenheit. The goal was still achieved, but there was a problem. If the number of characters in a number exceeds 7, then the number is translated completely wrong. For example, when translating the number 44586487, 80255709 should be displayed, but output 80255712, as if the original number was 44586489. They dropped articles on limits.h and additional code, but I cannot understand how the problem is connected with this.
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <math.h> int all(char c) { return !(isdigit(c) || c == ' ' || c == 'C' || c == '\n' || c == '-' || c == '+'); } float c_f(double c) { return (c * 9) / 5 + 32; } int tabn(char c) { return !(c == ' ' || c == '\n' || c == '\t' || c == '-' || c == '+'); } int main(void) { int symbol; float m = 0.0; float s = 0.0; int state = 0; float f = 0.0; float r = 0.0; long int l = 0; long int k = 0; while ((symbol = getchar()) != EOF) { switch (state) { case 0: if (symbol == ' ' || symbol == '\n' || symbol == '\t') { state = 0; } else if (symbol >= 'a' && symbol <= 'z') { state = 9; } else if (symbol == 'C') { state = 1; } else if (symbol >= 'A' && symbol <= 'Z') { state = 9; } else if (symbol >= '0' && symbol <= '9') { m = (s * 10) + (symbol - '0'); s = m; state = 1; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 1: if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 12; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 7; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 2: if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; printf("\n"); state = 7; } break; case 3: if (symbol == ' ' || symbol == '\t') { printf("%ld%s", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (tabn(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == '\n') { printf("%ld%s\n", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 7; } else if (symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } break; case 4: if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 5; } else if (all(symbol)) { state = 2; } else if (symbol == ' ' || symbol == '\t') { state = 12; } else if (symbol == '\n') { state = 7; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 5: if (symbol == ' ' || symbol == '\t') { printf("%ld%s", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (tabn(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == '\n') { printf("%ld%s\n", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 7; } else if (symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } break; case 6: if (isdigit(symbol)) { m = (s * 10) - (symbol - '0'); s = m; state = 10; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { state = 2; } else if (symbol == ' ' || symbol == '\t') { state = 13; } else if (symbol == '\n') { state = 4; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 7: if (symbol == ' ' || symbol == '\n' || symbol == '\t') { state = 7; } else if (symbol >= 'a' && symbol <= 'z') { state = 9; } else if (symbol == 'C') { state = 4; } else if (symbol >= 'A' && symbol <= 'Z') { state = 9; } else if (symbol >= '0' && symbol <= '9') { m = (s * 10) + (symbol - '0'); s = m; state = 4; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 8: if (symbol >= '0' && symbol <= '9') { m = (s * 10) - (symbol - '0'); s = m; state = 6; } else if (symbol == ' ' || symbol == '\n' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 8; } else if (symbol >= 'a' && symbol <= 'z') { state = 9; } else if (symbol == 'C') { state = 8; } else if (symbol >= 'A' && symbol <= 'Z') { state = 9; } else if (symbol == '-') { state = 9; } else if (symbol == '+') { state = 0; } break; case 9: if (symbol == ' ' || symbol == '\n' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (symbol >= 'a' && symbol <= 'z') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol == 'C') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol >= 'A' && symbol <= 'Z') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol >= '0' && symbol <= '9') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } break; case 10: if (isdigit(symbol)) { m = (s * 10) - (symbol - '0'); s = m; state = 10; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } break; case 11: if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } break; case 12: if (symbol == 'C') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } break; case 13: if (symbol == 'C') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 8; } else if (isdigit(symbol)) { m = (s * 10) - (symbol - '0'); s = m; state = 10; } else if (symbol == '+') { state = 0; } break; } } if (r != 0) { k = floor(round(r)); r = k; printf("%ld%s", k, "F\n"); } return 0; }
%dto change%lf, no? - Qwertiy ♦floatanddoubleand answer it yourself? I think this would be very useful and instructive, especially since universities often provide false information. Personally, I would read with great interest ... - Harry