• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie w C, dwie tablice znaków, szukanie wzorca

Object Storage Arubacloud
+1 głos
364 wizyt
pytanie zadane 19 stycznia 2016 w C i C++ przez Lukasz95 Bywalec (2,160 p.)
edycja 19 stycznia 2016 przez Lukasz95
Podane mamy  dwie tablice znaków  np.   char napis1[]={"Abab"}   char napis2={"ansusyhabab} program zwraca 1 jeśli ciąg z tablicy napis1 występuję w napis2 a jeśli nie to zwraca 0.

Więc jak byście to zrobili , jaki macie pomysł?

EDIT:
Mamy to zrobić bez używanie funkcji przeznaczonych do tego celu.

2 odpowiedzi

+1 głos
odpowiedź 19 stycznia 2016 przez mrcnsct Nałogowiec (36,390 p.)
wybrane 20 stycznia 2016 przez Lukasz95
 
Najlepsza
Ja bym to zrobił tak:

1. Funkcja nr1 przyjmująca te 2 napisy:

-oblicza długość napisu1 w pętli for,

-w drugiej pętli for, dopóki drugi napis się nie skończy wrzuca do funkcji nr2. oba napisy, numer indeksu funkcji w którym się znajduje i długość pierwszego napisu, jeśli funkcja numer 2 zwróci 1 to funkcja numer 1 też zwraca 1, jak przejdzie cały napis i wyjdzie z pętli to zwraca 0 (bo wcześniej nie zwróciło 1),

2. Funkcja nr2, przyjmuje napisy, indeks napisu2 i długość napisu :

- pętla for działająca dopóki któryś z napisów się nie skończy, porównuje tam napis2 od elementu którego indeks przyjęła funkcja, z napis1, jeśli wyjdzie że któreś znaki nie są równo to zwraca 0, w tej pętli też zliczanie porównanych znaków, jeśli pętla się skończy i z niej wyjdzie (bo wcześniej nie zwróciło 0) to trzeba porównać ilość zliczonych znaków z długością napis1, jeśli różne zwrócić 0, w przeciwnym wypadku zwrócić 1.
komentarz 19 stycznia 2016 przez Lukasz95 Bywalec (2,160 p.)
Czy mógłbyś to przedstawić w postaci kodu? wtedy może bym to jakoś przeanalizował i zrozumiał bo jak na razie to tak słabo.
komentarz 19 stycznia 2016 przez mrcnsct Nałogowiec (36,390 p.)
Powiedz czego nie rozumiesz?
komentarz 19 stycznia 2016 przez Lukasz95 Bywalec (2,160 p.)
W sumie to takiej zależności między tymi dwoma funkcjami, nie mogę ogarnąć sposoby rozwiązania tego problemu, może dlatego że ja próbowałem to zrobić inaczej no ale mi nie wychodziło.
Więc funkcja1 przyjmuje indeksy tych dwóch napisów ,bo całych tablic nie da się wykorzystać w funkcjach ,tak?
obliczanie długości napisu to nie problem tylko później co się dzieje w tej drugiej pętli for , to jest dla mnie nie zrozumiałe... bo funkcja 1 się jeszcze nie kończy a już wrzuca to do funkcji 2.
Co do funkcji 2 to mam rozumieć że przyjmujemy napis1[0] i porównujemy z każdym kolejnym indeksem napis2 póki napis2==0 , jeśli indeksy się nie zgadzają to zwiększamy indeks napis2 i zaczynamy od nowa? i tak aż któryś napis się nie skończy tak?
komentarz 19 stycznia 2016 przez mrcnsct Nałogowiec (36,390 p.)
edycja 19 stycznia 2016 przez mrcnsct

Funkcja pierwsza

int fun1(char napis1[], char napis2[])

w wywołaniu podajesz samo napis1 i napis2. Po prostu wywołuje tą funkcję.

for(i=0;napis2[i]!='\0';++i){
        if(fun2(napis1,napis2,i,d1)) return 1;
    }

W drugiej funkcji przyjmujesz oba napisy, długość pierwszego napisu i indeks napisu drugiego, który został wrzucony przy wywołaniu w pętli w funkcji pierwszej i porównujesz od napis2[i]!=napis1[j], w pętli zwięszasz i oraz j. i wrzucone z poprzedniej funkcji.

for(j=0;(napis1[j]!='\0')&&(napis2[i]!='\0');++i,++j){
        if(napis2[i]!=napis1[j]) return 0;
        ++x;
    }

 

komentarz 19 stycznia 2016 przez Lukasz95 Bywalec (2,160 p.)
​
#include <stdio.h>
#include <stdlib.h>
int fun1(char napis1[], char napis2[])
{int i,d1;
    for(i=0;napis2[i]!='\0';++i){
        if(fun2(napis1,napis2,i,d1)) return 1;
    }
}
int fun2(char napis1[],char napis2[],int i,int d1)
{   int x=0;
    int j;
    for(j=0;(napis1[j]!='\0');++i,++j)
    {
        if(napis2[i]!=napis1[j]) return 0;
            ++x;
    }
}
int main()
{

    char napis1[]={"xay"};
    char napis2[]={"bauxaxavb"};
    printf("%d",(fun1(napis1,napis2)));
    return 0;
}



Nie jestem w stanie znaleźć błędu, zwraca 0 nawet gdy powinno zwracać 1.

komentarz 19 stycznia 2016 przez mrcnsct Nałogowiec (36,390 p.)
edycja 20 stycznia 2016 przez mrcnsct

Funkcja1:

-gdzie liczenie długości napisu?

-gdzie zwracanie 0?

Funkcja2:

-wywołujesz ją w pierwszej, a ta jest nad nią, więc wyżej powinienieś dać prototyp,

-dlaczego sprawdzasz tylko czy napis1 się kończy? a co z napis2?

-poniżej pętli powinien być warunek, co jak d1!=x a co w przeciwnym wypadku.

#include <stdio.h>

int fun2(char[], char[],int,int);

int fun1(char napis1[], char napis2[]){
    int i,d1;
    for(d1=0;napis1[d1]!='\0';++d1);
    for(i=0;napis2[i]!='\0';++i){
        if(fun2(napis1,napis2,i,d1)) return 1;
    }
    return 0;
}

int fun2(char napis1[], char napis2[], int i,int d1){
    int j,x=0;
    for(j=0;(napis1[j]!='\0')&&(napis2[i]!='\0');++i,++j){
        if(napis2[i]!=napis1[j]) return 0;
        ++x;
    }
    if(d1!=x) return 0;
    return 1;
}

int main(){


    char napis1[]={"xay"};
    char napis2[]={"bauxaxavb"};
    printf("%d\n",fun1(napis1,napis2));

    return 0;
}

Ja to zrobiłem tak. Sprawdzałem dla różnych sytuacji i działa jak trzeba, o ile dobrze zrozumiałem polecenie i czegoś nie pomyliłem. Nie podałem Ci od razu kodu, żebyś trochę to przemyślał. Mam nadzieję, że zrozumiałeś i wiesz już jak to zrobić.

0 głosów
odpowiedź 19 stycznia 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)

Pierwszy algorytm który wpadł mi do głowy o złożoności O ( n * m ) gdzie n i m to długość napisów <- czyli kiepsa złożoność. Jak będziesz chciał lepszą złożoność algorytmu to pisz :P

#include <iostream>
#include <string>
using namespace std;
int main(){
    // zakldamy ze napis 2 jest zawsze dluzszy od 1
   string napis1,napis2; // nasze napisy i sprawdzamy napis 1  w napisie 2 !!
   cin>>napis1>>napis2;
   int d1 = napis1.length();
   int d2 = napis2.length();
   bool czy_znajduje = true;
   for ( int i = 0 ; i < d2 - d1; i++ ){
        czy_znajduje = true;
        for ( int j = 0; j < d1; j++ ){

            if ( napis2[i+j] != napis1[j] ) czy_znajduje = false;
        }
       if ( czy_znajduje ){cout<<"jest wzorzec"; return 0; }
   }
    cout<<"niema wzorca";
}

 

Podobne pytania

+1 głos
1 odpowiedź 662 wizyt
pytanie zadane 13 marca 2016 w C i C++ przez GameFreak Początkujący (450 p.)
0 głosów
1 odpowiedź 2,556 wizyt
0 głosów
2 odpowiedzi 581 wizyt
pytanie zadane 19 stycznia 2018 w C i C++ przez nibyykto Nowicjusz (140 p.)

92,621 zapytań

141,477 odpowiedzi

319,817 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...