Return true om parantesterna matchar
Hej!
Detta är en bool funktion så då vet jag inte hur jag trycker ut arrayen med printf för att själv leta efter fel.
Jag får true false true false true exit code 0.
Var snälla och kommentera min kod först innan ni föreslår en bättre lösning för annars förbättras ju inte min problemlösningsförmåga (om jag måste börja om i varje försök).
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define EQUALS(v1, v2) printf((v1) == (v2) ? "true\n" : "false\n")
bool is_closing(char open, char close);
// Return index of ch in str. If not found return -1.
int index_of(const char *str, char ch);
// True if parentheses match
bool matches(const char *str);
int main(void) {
EQUALS(matches("((()))"), true);
EQUALS(matches("((())"), false);
EQUALS(matches("(<({})>)"), true);
EQUALS(matches("(<({)}>)"), false);
EQUALS(matches("()<[]>{}"), true);
return 0;
}
bool matches(const char *str) {
//TODO
int i = 0; int a = 0; bool z = 0; int x = 0;
char arr[] = {0,0,0,0,0,0,0,0,0,'\0'};
while(str[i] != '\0'){
if(str[i] == '(' || str[i] == '{' || str[i] == '<' || str[i] == '['){
arr[a] = str[i];
a++;
}
i++;
}
i = 0;
x = a;
while(str[i] != '\0'){
if(str[i] == ')' || str[i] == '}' || str[i] == '>' || str[i] == ']'){
arr[x] = str[i];
x++;
}
i++;
}
while(a >= 0) {
z = is_closing(str[a], str[x]);
if (z == false) {
return -1;
}
if (z == true) {
arr[a] = '0';
arr[x] = '0';
a--;
for( int p = 2; p > 0; p--){
arr[x] = arr[x + 1];
}
}
}
printf("%s", arr);
return true;
}
int index_of(const char *str, char ch) {
// TODO
int i = 0;
while ( str[i] != '\0'){
if(str[i] == ch){
return i;
}
i++;
}
return -1; // Not found
}
bool is_closing(char open, char close) {
return (open == '(' && close == ')') ||
(open == '<' && close == '>') ||
(open == '[' && close == ']') ||
(open == '{' && close == '}');
}
Jag har hittat ett fel, ska stå return 0, inte return -1. Nu lyckades jag trycka arrayen med printf så jag kan se vad jag gör.Men jag får nog börja om är jag rädd.
Gör programmet fel eller vill du bara ha kommentarer på koden?
det gör fel. Det verkar inte som om is_closing funkar som jag tror för om jag ändrar z = is_closing(str[a], str[x]);
if (z == false) {
return -1;
}
till z = is_closing(str[a], str[x]);
if (z == false) {
return 0;
}
får jag alltid return false.
det ska stå true på skärmen
Med ditt originalprogram får jag true, false, true, false, true.
Med din ändring ovan får jag false, true, false, true, false.
Ja precis. Jag fick hjälp av en professor med det följande morgon.