6 svar
199 visningar
Elias93 behöver inte mer hjälp
Elias93 130
Postad: 27 maj 2019 12:11

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 == '}');
}

Elias93 130
Postad: 27 maj 2019 15:32

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.

Laguna Online 30711
Postad: 27 maj 2019 15:38

Gör programmet fel eller vill du bara ha kommentarer på koden? 

Elias93 130
Postad: 27 maj 2019 16:40 Redigerad: 27 maj 2019 16:42

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.

Elias93 130
Postad: 27 maj 2019 16:43

det ska stå true på skärmen

Laguna Online 30711
Postad: 27 maj 2019 18:21

Med ditt originalprogram får jag true, false, true, false, true.

Med din ändring ovan får jag false, true, false, true, false.

Elias93 130
Postad: 3 jun 2019 10:56

Ja precis. Jag fick hjälp av en professor med det följande morgon.

Svara
Close