Wzorzec
#include <stdio.h>
#define LONG 128
void pisz(int ile, char znak)
{
int i;
for (i=0; i<ile; i++)
{
printf("%c",znak);
}
}
main ()
{
char wzorzec[LONG],tekst[LONG];
int i,j,dlug_w,roznic;
system("clear");
printf("Podaj wzorzec: ");
scanf("%s",&wzorzec);
printf("Podaj tekst w ktorym mam szukac: ");
i=0;
while (i<2)
{
fgets(tekst, LONG, stdin);
i++;
}
printf("\n");
printf("%s",tekst);
//poszukaj dlugosci pierwszego wyrazu
dlug_w = 0;
while ( wzorzec[dlug_w] != 0 && dlug_w < LONG ) dlug_w++;
//przelec go ladnie
for (i=0; i<LONG; i++)
{
if (tekst[i]==0) break;
roznic = 0;
for (j=0; j<dlug_w; j++)
{
if ( tekst[i+j]!= wzorzec[j] )
{
roznic ++;
}
}
if (roznic == 0)
{
pisz(1,'*');
//i = i + dlug_w - 1;
}
else pisz(1,' ');
}
printf("\n\n");
}
WzorzecB
#include <stdio.h>
#define LONG 128
//podaj worzec, np.: ala
//podaj tekst, np.: ala ma kota tralalalala
//poczatki wzorca w tekscie zostana zaznaczone znakiem *
//zostana podane wszystkie najdluzsze wystapienia czesci Wzorca w Tekscie
char wzorzec[LONG],tekst[LONG],gwiazdki[LONG];
int szukaj(int dlugosc, int od_ktorego, int bez_naglowka)
{
int i,j,roznic,razem=0,g;
g = 0;
//przelec go ladnie
for (i=0; i<LONG; i++)
{
if (tekst[i]==0) break;
roznic = 0;
for (j=0; j<dlugosc; j++)
{
if ( tekst[i+j]!= wzorzec[od_ktorego+j] )
{
roznic ++;
}
}
if (roznic == 0)
{
gwiazdki[g]='*';
razem++;
}
else gwiazdki[g]=' ';
g++;
}
if (razem > 0)
{
if (bez_naglowka == 0) printf("Dlugosc wspolnego fragmentu: %i\n",dlugosc);
printf("\n");
//printf("Fragment z pozycji %i (dlugosc: %i): ",od_ktorego+1,dlugosc);
printf("Fragment z pozycji %i: ",od_ktorego+1);
for (i=0; i<dlugosc; i++)
{
printf("%c",wzorzec[od_ktorego+i]);
}
printf("\n");
printf("%s",tekst);
printf("%s",gwiazdki);
printf("\n");
}
return razem;
}
// glowna czesc programu
main ()
{
int i,dlug_w,od_ktorego,ile_juz=0,dlugosc;
system("clear");
printf("Podaj wzorzec: ");
scanf("%s",&wzorzec);
printf("Podaj tekst w ktorym mam szukac: ");
i=0;
while (i<2)
{
fgets(tekst, LONG, stdin);
i++;
}
printf("\n");
//poszukaj dlugosci pierwszego wyrazu
dlug_w = 0;
while ( wzorzec[dlug_w] != 0 && dlug_w < LONG ) dlug_w++;
//wykonaj przeszukiwanie
//zaczynamy od najdluzszego mozliwego
//potem zmniejszamy o 1
dlugosc = dlug_w;
while (dlugosc > 0)
{
if (ile_juz>0) break; //ukryj aby pokazac wszystkie
od_ktorego = 0;
while (od_ktorego < dlug_w - dlugosc + 1)
{
if ( szukaj(dlugosc,od_ktorego,ile_juz) > 0) ile_juz ++;
od_ktorego ++;
}
dlugosc --;
}
if (ile_juz == 0) printf("Niestety nic nie znalazlem ...\n");
printf("\n");
}
Program getbits / setbits:
#include<stdio.h>
#include<stdlib.h>
// funkcja getbits
// wycina n bitow z "x" od pozycji p w prawo
// (zerowa pozycja to skrajnie prawa pozycja)
unsigned getbits(unsigned x, int n, int p)
{
return ((x>>(p-n+1)) & ~(~0<< n));
}
//czyta binarne
unsigned czytajBin()
{
unsigned x=0;
int z;
while ( (z=getchar())!=EOF && z!='\n' )
{
x<<=1;
if (z=='1') x|=01;
else if (z!='0') return 0;
}
return x;
}
//zlicza bity w liczbie x
int bity(unsigned x)
{
int total=0,j;
unsigned z;
for( j=8*sizeof(unsigned)-1; j>=0; j--)
{
z = x >> j;
if ( (z&1)==1 ) total++;
}
return total;
}
//drukuje binarne
void drukujBin(unsigned x)
{
int j,y;
for( j=8*sizeof(unsigned)-1; j>=0; j--)
{
y=x>>j;
if ((y&1)==0) putchar ('0');
else putchar ('1');
}
printf("\n");
}
//zamienia bit z pozycji p od prawej na b={'1','0'} w x
unsigned setbit(unsigned x, int p, char b)
{
unsigned y=0,z;
int j;
for( j=8*sizeof(unsigned)-1; j>=0; j--)
{
z = x >> j;
y <<=1;
if (( (z&1)==1 && j!=p ) || (j == p && b=='1') ) y|=01;
}
return y;
}
int main()
{
unsigned x,y;
x = czytajBin();
y = getbits( x , 20 , 5 );
drukujBin(y);
y = setbit(x,2,'0');
drukujBin(y);
return 0;
}
.