diff --git a/a1/prog b/a1/prog index 98ec133..5ad5437 100755 Binary files a/a1/prog and b/a1/prog differ diff --git a/a1/program.c b/a1/program.c index c31ca05..4662f47 100644 --- a/a1/program.c +++ b/a1/program.c @@ -4,57 +4,94 @@ #define MAX_SIZE 1000 -bool is_valid_brackets(const char* s, int* err) { +int is_valid_brackets(const char* s, int* err) { char stack[MAX_SIZE]; - int top = -1; + int top = -1; for (int i = 0; s[i] != '\0'; i++) { char c = s[i]; - if (c == '(' || c == '[' || c == '{') { + if (c == '(' || c == '[' || c == '{' || c == '<') { if (top < MAX_SIZE - 1) { stack[++top] = c; } else { - *err= i + 1; - return false; + *err = i +1; + return 0; } } - else if (c == ')' || c == ']' || c == '}') { + else if (c == ')' || c == ']' || c == '}' || c == '>') { if (top == -1) { - *err= i + 1; - return false; + *err = i +1; + return 0; } - char last = stack[top--]; + char last = stack[top--]; if ((c == ')' && last != '(') || (c == ']' && last != '[') || - (c == '}' && last != '{')) { - *err - = i + 1; - return false; + (c == '}' && last != '{') || + (c == '>' && last != '<')) { + *err = i+1; + return 0; } } } if (top != -1) { - *err = strlen(s) + 1; - return false; + // Знаходимо позицію незакритої дужки + char lastOpen = stack[top]; + for (int i = 0; s[i] != '\0'; i++) { + if (s[i] == lastOpen) { + *err = i +1; + return 0; + } + } + } + return 1; +} + + +char getExpectedClosing(char open) { + switch (open) { + case '(': return ')'; + case '[': return ']'; + case '{': return '}'; + case '<': return '>'; + default: return '?'; } - return true; } int main() { char input[MAX_SIZE]; - + if (fgets(input, MAX_SIZE, stdin) != NULL) { input[strcspn(input, "\n")] = '\0'; - + printf("Read: %s\n", input); // Додано "Read: " + int err = 0; if (is_valid_brackets(input, &err)) { - printf("True\n"); + printf("All brackets OK\n"); // Змінено з "True" } else { - printf("False at position %d\n", err -); + char stack[MAX_SIZE]; + int top = -1; + for (int i = 0; i < err ; i++) { + char c = input[i]; + if (c == '(' || c == '[' || c == '{' || c == '<') { + stack[++top] = c; + } else if (c == ')' || c == ']' || c == '}' || c == '>') { + top--; + } + } + char c = input[err - 1]; + if (c == ')' || c == ']' || c == '}' || c == '>') { + if (top == -1) { + printf("Unexpected closing bracket %c in %d\n", c, err-1); + } else { + printf("Crossed bracket %c in %d, expected %c\n", c, err-1, getExpectedClosing(stack[top])); + } + } else { + printf("Unclosed bracket %c in %d\n", stack[top], err-1); + } } + } else { + printf("Error reading input\n"); } - + return 0; } -