Domaci iz programskih jezika

Započeo MilosM, 06.03.2011, 20:17

prethodna tema - sledeća tema

holodoc

Citat: maxogm  13.03.2011, 13:09
Koristi LIFO stack.
Kad se kreces kroz dobijeni string, sve otvarajuce zagrade stavljas na stack. Kad naidjes na neku zatvarajucu zagradu nju proveravas sa elementom sa vrha stack-a itd...

Ideja je ne samo za () vec i za {} [] ()

Kod necu jos da postavim :)
Svaka čast :bravo: Na stack sam i mislio :) K'o što Herr Maksimilijan reče dobra strana tog algoritma je što uopšte nije bitno koje se sve zagrade koriste a ako je u pitanju praktičan izraz sa sve operandima i operacijama dovoljno je napraviti pomoćni string koji će sadržati samo zagrade u redosledu kako se pojavljuje u originalnom stringu. Doduše sa brojem različitih tipova komplikuej se malo i kod ali ništa specijalno.

Hoće li sad bar neko od kolega kojima je domaći i namenjen da proba da napiše kod? :P
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php

Zepi

Sto se tice resenja studenata mogu samo da kazem da su bila veoma losa.

Neka koda koji nije pogresio za sledeci unos )( .

Maxogm vidi se da si imao iskustva sa ovom problematikom :)

Marko Аcović

LIFO stack! Kako se toga ne setih pre! :)
CitatSvaka čast :bravo: Na stack sam i mislio :)
Lepo si mislio samo se nisi dobro odrazio pa te nisam odma' razumeo sta si hteo da kazes. :)

PS. Valjalo bi i aktuelni studenti da se malo ukljuce u razgovor sa predlozima a ne samo mi "veterani" :)

maxogm

Citat: Zepi  14.03.2011, 09:13
Maxogm vidi se da si imao iskustva sa ovom problematikom :)

I moje prvo resenje nije bilo ko zna kakvo ;)

Marko Аcović

15.03.2011, 00:08 #19 Poslednja Izmena: 15.03.2011, 21:01 od marko_gm
Evo jednog resenja. :) Nadam se da nisam omanuo negde :)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024

void push(char i);
char pop(void);
int isInArray(char c, char* niz);

int top;
char stek[MAX];

int main(void) {

    int i, size, pos = -1;
    char* inputString;
    char s;

    char openingBrackets[] = {'{', '[', '('};
    char closingBrackets[] = {'}', ']', ')'};

    inputString = (char *)calloc(MAX, sizeof(char));

    printf("Unesi ulazni string: ");
    gets(inputString);

    size = strlen(inputString);
    for (i = 0; i < size; ++i) {
       
        if ((pos = isInArray(inputString[i], openingBrackets)) > -1) {
            push(inputString[i]);
        } else if ((pos = isInArray(inputString[i], closingBrackets)) > -1) {
            s = pop();
            if (s == 0) {
                printf("NETACNO\n");
                return EXIT_FAILURE;
            }

            pos = isInArray(s, openingBrackets);

            if (inputString[i] != closingBrackets[pos]) {
                printf("NETACNO\n");
                return EXIT_FAILURE;
            }

        } else {
            continue;
        }
        pos = -1; // reset position
    }

    printf("%sTACNO\n", (top == 0) ? "" : "NE");
    return EXIT_SUCCESS;
}

// dodaj element na stek
void push(char i) {
    if (top > MAX) {
        printf("STACK FULL");
        return;
    } else {
        top++;
        stek[top] = i;
    }
}

// uzmi element sa steka
char pop(void) {
    char a;
    if (top <= 0) {
        //printf("STACK EMPTY");
        return 0;
    } else {
        a = stek[top];
        top--;
    }
    return a;
}

// proveri da li se dati karakter nalazi u nizu i
// ako se nalazi, vrati njegovu poziciju
int isInArray(char c, char* niz) {
    int i, size, found = -1;
    size = strlen(niz);
    for (i = 0; i < size; ++i) {
        if (c == niz[i]) {
            found = i;
            break;
        }
    }
    return found;
}

Ako neko ima elegantnije resenje, neka izbaci :)

maxogm

Citat: marko_gm  15.03.2011, 00:08
Evo jednog resenja. :) Nadam se da nisam omanuo negde :)

Probaj da ukucas za string: ()(jskjdks

maxogm

15.03.2011, 19:26 #21 Poslednja Izmena: 15.03.2011, 19:29 od maxogm
Jos nesto ali ovo je ne vezano za Markovo resenje i da li to tu ima.

Funkcija:

   gets(input);


je deprecated i nebi je trebalo koristiti. Koriscenjem funkcije gets() niste ogranicili korisnika koliko sme da unese maksimalno karaktera pa veoma lako moze doci do pucanja vase aplikacije ukoliko niste alocirali dovoljnu kolicinu memorije. Bolje je koristit fgets()


   if(fgets(input, 100, stdin) != NULL)
   {
     free(input);
   }

holodoc

Citat: maxogm  15.03.2011, 19:26
Jos nesto ali ovo je ne vezano za Markovo resenje i da li to tu ima.

Funkcija:

   gets(input);


je deprecated i nebi je trebalo koristiti. Koriscenjem funkcije gets() niste ogranicili korisnika koliko sme da unese maksimalno karaktera pa veoma lako moze doci do pucanja vase aplikacije. Bolje je koristit fgets()


   if(fgets(input, 100, stdin) != NULL)
   {
     free(input);
   }

Ko to nama koristi -Wall parametar u gcc kompajleru? :P
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php

maxogm

Citat: holodoc  15.03.2011, 19:28
Ko to nama koristi -Wall parametar u gcc kompajleru? :P
Pa kad nemam ni jedan drugi C kompajler :)

holodoc

Citat: maxogm  15.03.2011, 19:34
Citat: holodoc  15.03.2011, 19:28
Ko to nama koristi -Wall parametar u gcc kompajleru? :P
Pa kad nemam ni jedan drugi C kompajler :)
Ista sam ti taka :D U poslednje vreme sve češće hvatam samog sebe kako se preko SSH kačim na kućni server da bih na brzaka nešto iskompajlirao sa gcc-om :D Samo da mi onaj šuntavi nano ne smeta sve više i više :(
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php

marjan

CitatProbaj da ukucas za string: ()(jskjdks
Nemoj, Marko, to je neki shellcode, će da ti pobriše MBR!
:P
Unix is user-friendly—it's just choosy about who its friends are.

Marko Аcović

15.03.2011, 21:03 #26 Poslednja Izmena: 15.03.2011, 21:07 od marko_gm
U pravu ste. :) Ipak ima bug :). Dodao sam jos jednu proveru u kodu (modifikovao sam postojeci primer koji sam postovao) i sad bi trebalo da radi. Probajte :)

PS. Znam da je gets() deprecated i da treba da se koristi fgets() ali me mrzelo da je ubacujem, jer fgets() dodaje i enter na kraj stringa a ovo je ipak )demonstracioni primer a ne nesto sto ce da radi u realnom svetu :)

MilosM

E hvala ljudi na pomoci, iako je sustina zadatka zakasnila, svi smo se zeznuli sa )(!!!! :D
i tako, domaci idu dalje...
sada imamo domaci sa nizovima preko funkcija...
valjda cemo se snaci :)
Opet hvala!!!!
mI!

Marko Аcović

Kad imate neki problem, prvo pokusajte da ga resite sami pa ako bas ne ide, bacite ovde da vam pomognemo ali prvo morate sami da pokusate. :)

holodoc

Nizovi su verovatno jedna od najbitnijih stvari koje su izmišljene u prethodnom milenijumu. Ako ne računamo naravno mašinu za kafu  =))
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php