Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 03. 11. 2013 12:13 — Editoval JohnNash (03. 11. 2013 14:08)

JohnNash
Příspěvky: 62
Reputace:   
 

Řetězce_jazykC

Ahoj, mým úkolem je v ověřit, jestli v daném řetězci je řetězec "programovani". Můj kód vypadá takto

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

int je_obsazen (char *retezec)
{
        const char *p = retezec;
        char programovani[] = "programovani";
        const char *q = programovani;
        int je_rovno = 1;

        if (strlen(programovani) > strlen(retezec))
        {
            return 0;
        }
        else
        {
            while (*p != '\0')
            {
                while ((*q != '\0') || (je_rovno == 0))
                {
                    if (*p != *q)
                        je_rovno = 0;

                    q++;
                    p++;
                }
                if (je_rovno == 1)
                    return 1;

                q = programovani;
                p = retezec;
                p++;
                je_rovno = 1;
            }
            return 0;
        }
}

int main (void)
{
    char retezec[] = "zkurvenyprogramovani";
    if (je_obsazen (retezec) == 1)
        printf("Programovani je v retezci obsazeno!\n");
    else
        printf ("Programovani neni v retezci obsazeno!\n");

    return 0;
}

Ale nefunguje, proč? Děkuji moc.

Offline

 

#2 03. 11. 2013 12:36

Lukee
Administrátor
Místo: Opava
Příspěvky: 1863
Škola: UPOL, Informatika
Pozice: Roznašeč reklamních bannerů
Web
 

Re: Řetězce_jazykC

Do ukazatele *p nikdy nic neuložíš, to by mohla být první chyba.


2+2=4

Offline

 

#3 03. 11. 2013 12:57

JohnNash
Příspěvky: 62
Reputace:   
 

Re: Řetězce_jazykC

↑ Lukee: Jojo, mas pravdu, to jsem smazal, když jsem zkoušel něco jiného, opraveno.

Offline

 

#4 03. 11. 2013 13:28

Lukee
Administrátor
Místo: Opava
Příspěvky: 1863
Škola: UPOL, Informatika
Pozice: Roznašeč reklamních bannerů
Web
 

Re: Řetězce_jazykC

1) Moc nechápu, prčo tam vůbec ukazetele p a q jsou, akorát ten kód znepřehledňují. Ukazatele retezec a programovani stačí.
2) if (je_rovno = 1) tady mají asi být dvě rovnítka.


2+2=4

Offline

 

#5 03. 11. 2013 13:33

JohnNash
Příspěvky: 62
Reputace:   
 

Re: Řetězce_jazykC

↑ Lukee: ach bože..., co dál?

Offline

 

#6 03. 11. 2013 13:37

Lukee
Administrátor
Místo: Opava
Příspěvky: 1863
Škola: UPOL, Informatika
Pozice: Roznašeč reklamních bannerů
Web
 

Re: Řetězce_jazykC

No moc nechápu, proč používáš syntaxi *p a p++ místo klasického p[i]. Kromě toho, že to je, myslím si, méně čitelné, tak v tom bude nejspíš i další chyba — když v tom vnitřním cyklu zjistíš, že tohle není podřetězec „programovani” (je_rovno = 0;), tak bys měl i resetovat ukazatel q na začátek.


2+2=4

Offline

 

#7 03. 11. 2013 13:42

JohnNash
Příspěvky: 62
Reputace:   
 

Re: Řetězce_jazykC

↑ Lukee:
tzn jak? a potom by to mělo případně fungovat?

Offline

 

#8 03. 11. 2013 13:43

Lukee
Administrátor
Místo: Opava
Příspěvky: 1863
Škola: UPOL, Informatika
Pozice: Roznašeč reklamních bannerů
Web
 

Re: Řetězce_jazykC

↑ JohnNash: Nevím, nezkoušel jsem to. Zkus a uvidíš ;).


2+2=4

Offline

 

#9 03. 11. 2013 13:46

JohnNash
Příspěvky: 62
Reputace:   
 

Re: Řetězce_jazykC

↑ Lukee:
no ja bych rad, ale nevim, jak mam resetovat ukazatel na zacatke, tzn kdyz
}
                if (je_rovno == 1)
                    return 1;

                p++;
                je_rovno = 1;
            }

prepisu na
}
                if (je_rovno == 1)
                    return 1;

                q = programovani;
                p++;
                je_rovno = 1;
            }
tak to porad nefunguje, ale nevim ,jestli tohle to co jsi rikal

Offline

 

#10 03. 11. 2013 13:56

Lukee
Administrátor
Místo: Opava
Příspěvky: 1863
Škola: UPOL, Informatika
Pozice: Roznašeč reklamních bannerů
Web
 

Re: Řetězce_jazykC

Nějak tak. Stejně tak ale musíš vracet ukazatel p. Proto je blbost používat ty pointery a lepší je používat standardní syntaxi s []. Takhle si to užij :). V jednom whilu máš navíc zase jedno rovnítko, tos asi taky nechtěl: while ((*q != ‚\0') || (je_rovno = 0))

No a pak tam máš nejvíc nejlepší chybu, ale to je trest za to, že jsi sprostý, tak ti ji neřeknu :-))


2+2=4

Offline

 

#11 03. 11. 2013 14:23 — Editoval JohnNash (03. 11. 2013 16:24)

JohnNash
Příspěvky: 62
Reputace:   
 

Re: Řetězce_jazykC

↑ Lukee:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int je_obsazen (char *retezec)
{
        char *p = retezec;
        char programovani[] = "programovani";
        char *q = programovani;
        int je_rovno = 1;
        char *pomocna = p;

        if (strlen(programovani) > strlen(retezec))
        {
            return 0;
        }
        else
        {
            while (*p != '\0')
            {
                pomocna = p;
                while ((*q != '\0') || (je_rovno == 0))
                {
                    if (*p != *q)
                        je_rovno = 0;

                    q++;
                    p++;
                }
                if (je_rovno == 1)
                    return 1;

                p = pomocna;
                q = programovani;
                p++;
                je_rovno = 1;
            }
            return 0;
        }
}

int main (void)
{
    char retezec[] = "zkurvenyprogramovani";
    if (je_obsazen (retezec) == 1)
        printf("Programovani je v retezci obsazeno!\n");
    else
        printf ("Programovani neni v retezci obsazeno!\n");

    return 0;
}
Tak jsem to upravil, v dalším pointru si pamatuju tu puvodni pozici p, pridal jsem jeste return 0, kdyz to cely projde a nic nenajde, ale stale tapu...
tak jsem to jeste upravil, ale fakt uz nevim, any idea?

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson