[C] program z nawiasami wytłumaczenie

Bison
Użytkownik
Użytkownik
Posty: 117
Rejestracja: 17 sty 2010, o 20:54
Płeć: Mężczyzna
Lokalizacja: Dolny Śląsk
Podziękował: 5 razy

[C] program z nawiasami wytłumaczenie

Post autor: Bison »

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

int dlugosc_tablicy(char tablica[])
{
    int i=0;
    while(tablica[i])
    {
        i++;
    }
    return i;
}

int czy_poprawny(char tablica[])
{
    int p=0,z=0,i,wynik = 0; // poprawny
    
    for(i=0; i<dlugosc_tablicy(tablica); i++)
    {
        switch(tablica[i])
        {
            case '(' :
            {
                p++;
                break;
            }
            case ')' :
            {
                z++;
            }
        }
        
        if(z>p)
        {
            wynik++;
        }
    }
    if(p!=z)
    {
        wynik++;
    }
    
    return wynik;
}

int main()
{
    char napis[50]="";
    printf("Podaj napis: ");
    scanf("%99s",napis);

    if (czy_poprawny(napis)==0) printf("\nZapis poprawny!\n");
    else {printf("\nZapis niepoprawny!\n");
}


 system("PAUSE"); 
    return 0;
} 
Problem wygląda następująco. Czy mógłby mi ktoś wytłumaczyć w miarę przejrzyście (bo jestem z tego zielony) skąd to się wszystko bierze? Dokładniej:
Zasady działania tych funkcji dlugosc i czy_poprawny (tak po kolei co się dzieje) oraz o co chodzi w linijce 48 i 50.
Z góry dziękuję za odpowiedzi i pomoc.
Awatar użytkownika
lotnik21
Użytkownik
Użytkownik
Posty: 43
Rejestracja: 3 maja 2011, o 01:08
Płeć: Mężczyzna
Lokalizacja: Poland
Podziękował: 9 razy

[C] program z nawiasami wytłumaczenie

Post autor: lotnik21 »

Kod: Zaznacz cały

    char napis[50]=""; // iniciujesz zmienną typu znakowego;
    printf("Podaj napis: "); // w konsoli wypisuje "Podaj napis: ";
    scanf("%99s",napis); // wrpowadzasz napis;
W następnym kroku program sprawdza, czy zapis jest poprawny, czy niepoprawny.

Kod: Zaznacz cały

    if (czy_poprawny(napis)==0) printf("
Zapis poprawny!
") 
    // jeśli zmienna wynik zainicjowana w czy_poprawny(char) zwróci 0 to wynik jest poprawny;
    else {printf("
Zapis niepoprawny!
"); // w przeciwnym wypadku wynik jest niepoprawny


Mam nadzieje, że pomogłem zrozumieć funkcje główną programu
Bison
Użytkownik
Użytkownik
Posty: 117
Rejestracja: 17 sty 2010, o 20:54
Płeć: Mężczyzna
Lokalizacja: Dolny Śląsk
Podziękował: 5 razy

[C] program z nawiasami wytłumaczenie

Post autor: Bison »

@lotnik21
Dzięki, ale mółbyc mi wytłumaczyć jeszce tę funkcję czy poprawny (w sensie dlaczego na początku sie to zeruje i krok o kroku o co chodzi w tej funkcji)?
Awatar użytkownika
lotnik21
Użytkownik
Użytkownik
Posty: 43
Rejestracja: 3 maja 2011, o 01:08
Płeć: Mężczyzna
Lokalizacja: Poland
Podziękował: 9 razy

[C] program z nawiasami wytłumaczenie

Post autor: lotnik21 »

Zapiszę ci tą funkcje krócej:

Kod: Zaznacz cały

int czy_poprawny(char tablica[])
{
    int p=0,z=0,i,wynik = 0; 
    // zmienna p to licznik który zlicza wystąpienie '(', na początku jest 0 wystąpień;
    // zmienna z to licznik który zlicza wystąpienie ')', na początku jest 0 wystąpień;
    // zmienna i do zliczania długości tablicy;
    // zmienna wynik do sprawdzania, czy poprawny ( =0) ...
    for(i=0; i<dlugosc_tablicy(tablica); i++)
        switch(tablica[i])
        {
            case '(' : p++;
                          break;
            case ')' : z++;
        }      
    if(p!=z) wynik=1; // ... czy niepoprawny ( =1), tzn. ilość wystąpień '(' jest różna od ')';

    return wynik;
}
Xitami

[C] program z nawiasami wytłumaczenie

Post autor: Xitami »

wołanie w pętli funkcji dlugosc jest błędem, algorytm staje się kwadratowy
zapisałbym to tak

Kod: Zaznacz cały

    for(j=i=0; napis[i] != 0; i++)
        if( napis[i]=='(' ) j++;
        else if( napis[i]==')' ) j--;
    if( j==0 ) puts("poprawny");
    else puts("niepoprawny"); 
ODPOWIEDZ