6 svar
47 visningar
Elias93 är nöjd med hjälpen!
Elias93 122
Postad: 27 maj 2019

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 122
Postad: 27 maj 2019

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 6055
Postad: 27 maj 2019

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

Elias93 122
Postad: 27 maj 2019 Redigerad: 27 maj 2019

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 122
Postad: 27 maj 2019

det ska stå true på skärmen

Laguna 6055
Postad: 27 maj 2019

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

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

Elias93 122
Postad: 3 jun 2019

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

Svara Avbryt
Close