Języki programowania – cz. 1

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;
}

.

Dodaj komentarz