Skocz do zawartości

Zablokowane [C] Proównywanie tekstu


gnysek

Rekomendowane odpowiedzi

  • Administratorzy

Słuchajcie, na jutro na zajęcia mam napisać program, ale zbytnio nie mam czasu, niestety jak ja tego nie zrobię to cała grupa będzie nieprzygotowana :P

Zadanie nie jest trudne, chociaż nieco bez sensu. Oczywiście program jest w C (nie w C++ !!)

 

 

User podaje WZORZEC oraz TEKST, załóżmy, że wzorzec to char[5], a tekst to char[20].

Program podkreśla gwiazdkami fragmenty słowa TEKST które są takie jak WZORZEC, np.:

 

//wzorzec = ala, tekst = ala ma kota i tralalala

> ala ma kota i tralalala
> ***             *** ***

 

Nie można korzystać z żadnej gotowej funkcji, trzeba napisać samemu (może być scanf / getchar, pętle for i while etc.).

Odnośnik do komentarza
Udostępnij na innych stronach

licencja unwarnware:

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

#define ROZM_W 3 // rozmiar wzorca
#define ROZM_T 30 // rozmiar tekstu

char wzorzec[128]; // dalem wszedzie 128 zeby segfaulta nie bylo.
char tekst[128];
char gwiazdki[128];
int main()
{
   int i=0,j;
   char *tmp = malloc(128);
   printf("Podaj wzorzec: ");
   scanf("%s",wzorzec);
   printf("Podaj tekst:\n");
   while (i++<2)
     fgets(tekst, 127, stdin);
   i=0;
   while (i<ROZM_T)
   {
       *(tmp)=0;
       for (j=0;j<ROZM_W;j++)
          sprintf(tmp,"%s%c",tmp,tekst[i+j]);
       if (strcmp(tmp,wzorzec)!=0) {
          if (gwiazdki[i]!='*') gwiazdki[i]=' '; }
       else
       {
           for (j=0;j<ROZM_W;j++)
           {
              gwiazdki[i+j]='*';
           }
       }
       i++;
   }
   printf("%s",gwiazdki);
   free(tmp);
   return 0;
}

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ale napisałem, że nie mogę korzystać z gotowych funkcji tylko mam napisać je samemu, więc czemu wyskakujesz z strcmp ? Własnie o to chodzi, ze ma byc bez tego :)

Wszelkie stdlib.h czy string.h odpadają :)

Odnośnik do komentarza
Udostępnij na innych stronach

No to może:

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

void UnderlineSubstring( const char* aSubstring, const char* aString ) {
 int i, j;
 int substringLength = strlen( aSubstring );
 int stringLength = strlen( aString );
 char* underline = (char*) malloc( stringLength + 1 );

 memset( underline, ' ', stringLength );
 underline[stringLength] = 0;

 for ( i = 0; i < stringLength; i++ ) {
   for ( j = 0; aString[i] == aSubstring[j] && j < substringLength; j++ )
     if ( j == substringLength - 1 ) {
       memset( underline + i - (substringLength - 1), '*', substringLength );
       break;
     } else 
       i++;
 }

 printf( "%s\r\n", aString );
 printf( "%s\r\n", underline );

 free( underline );
}

int main( int argc, char* argv[] ) {
 char text[0x200];
 char substring[0x200];

 printf( "Tekst: " );
 gets( text );

 printf( "Wzorzec: " );
 gets( substring );

 UnderlineSubstring( substring, text );
return 0;
}

 

EDIT:

Wszelkie stdlib.h czy string.h odpadają

Damn, nie zauważyłem tego ;d

Odnośnik do komentarza
Udostępnij na innych stronach

#define LENGTH_TEXT 20
#define LENGTH_PATTERN 5

char text[LENGTH_TEXT+1];
char pattern[LENGTH_PATTERN+1];
char result[LENGTH_TEXT+1];

int main()
{
printf("Wzorzec:\n");
scanf("%s",pattern);
printf("\nTekst:\n");
scanf("%s",text);
int pos;
int spos;
for(pos=0;pos<LENGTH_TEXT;pos++)
{
for(spos=0;spos<LENGTH_PATTERN&&pos+spos<LENGTH_TEXT;spos++)
{
if(text[pos]==pattern[spos])
result[pos]='*';
else
result[pos]=text[pos]; // result[pos]=' ';
pos++;
}
}
result[LENGTH_TEXT]=0;
printf(result);
}

 

EDIT: Poprawione :P

Odnośnik do komentarza
Udostępnij na innych stronach

C nie umiem więc masz w C++ to sobie przerobisz czy coś:

 

#include<cstdio>

#include <cstdlib>

 

using namespace std;

 

int main()

{

char t[1000];

char w[1000];

 

int dl_t=0;

int dl_w=0;

 

char z='a';

for(int i=0;1;i++)

{

scanf("%c",&z);

if(z=='\n')

{

dl_w=i;

break;

}

w=z;

}

 

z='a';

for(int i=0;1;i++)

{

dl_t=i+1;

scanf("%c",&z);

if(z=='\n')

{

dl_t=i;

break;

}

t=z;

}

 

int j=0;

for(int i=0;i<dl_t;i++)

{

if(t!=w[i-j])

{

j++;

printf(" ");

while(j!=i+1)

{

printf(" ");

j++;

}

}

else if(i-j+1==dl_w)

{

while(j!=i)

{

printf("*");

j++;

}

j++;

printf("*");

}

}

 

system("PAUSE");

return 0;

}

 

Chyba dobrze działa :P

 

 

 

EDIT: O kurde tyle odpowiedzi przede mną xD (nie odświerzyłem przed wysłaniem)

Odnośnik do komentarza
Udostępnij na innych stronach

Napisałem własną funkcję strcmp() i wywaliłem te nagłówki. Licencja pozostaje niezmieniona.

#include <stdio.h>
#define ROZM_W 3
#define ROZM_T 30

char wzorzec[128];
char tekst[128];
char gwiazdki[128];

int strcmp(const char *s1,const char *s2)
{
int i=0;

while (*(s1+i) != 0 && *(s2+i) != 0)
{
	if (*(s1+i)>*(s2+i)) return 1;
	if (*(s1+i)<*(s2+i)) return -1;
	i++;
}
return 0;
}

int main()
{
int i=0,j;
char tmp[128];
printf("Podaj wzorzec: ");
scanf("%s",wzorzec);
printf("Podaj tekst:\n");
while (i++<2)
  fgets(tekst, 127, stdin);
i=0;
while (i<ROZM_T && tekst[i]!=0)
{
	*(tmp)=0;
	for (j=0;j<ROZM_W;j++)
	   sprintf(tmp,"%s%c",tmp,tekst[i+j]);
	if (strcmp(tmp,wzorzec)!=0) {
	   if (gwiazdki[i]!='*') gwiazdki[i]=' '; }
	else
	{
		for (j=0;j<ROZM_W;j++)
		{
		   gwiazdki[i+j]='*';
		}
	}
	i++;
}
printf("%s",gwiazdki);
return 0;

}

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Dobra, teraz to mam aż za dużo odpowiedzi :P Będę musiał jednak posiedzieć i sam to napisać, zeby było najprościej jak sie da, bo inaczej nikt nie zrozumie o co chodzi :P

 

Edit: kryniak, zapomniałem o nagrodzie :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

:) To ja się muszę jeszcze jakoś wskaźników pozbyć żeby koledzy studenci załapali :P

Wiem na czym polegał mój błąd - facet wymyślił sobie ten program i stwierdził, ze w sumie nie wie jak go napisac, pewnie getchar będzie najlepsze, tymczasem kupa i nieprawda scanf jednak praktyczniejszy :P

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra, jedno pytanie, czy ktokolwiek pomyslal chociarz przez chwile o analizie zlozonosci i optymalnosci algorytmu ;P? Takie bruty to se mozecie o kant dupy rozbic, dajcie milion znakow i i milionowy klucz a sobie troche poczekacie. Nie lubie tekstówek :/ ale moze do jutra zdaze cos klepnac.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

a po co optymalność ? to nie są zawody który program działa szybciej, celem jest zrobienie programu który porówna 3-4 znaki z ciągiem 20.

Program ma być MAKSYMALNIE prosty.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

No poziom studiów, ale to są raptem trzecie zajęcia z języków programowania, pamiętaj, że 80% osób tam pierwszy raz w życiu programuje. Nie każdy robi to tak długo jak ja.

 

Ostatecznie program wyglądał tak:

#include <stdio.h>

#define LONG 30

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;

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(dlug_w,'*');
		i = i + dlug_w - 1;
	}
	else pisz(1,' ');
}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Nie no, jak zadawala cie takie rozwiazanie to spoko, po prostu myslalem ze to ma byc zadanie na poziomie studiow a nie szkoly podstawowej :/ Sorki ze nie wysylam kodu ale wczoraj nie dalem rady juz nic zrobic po powrocie do domu.

 

Znajdź mi pierwsze lepszą szkołe ponadgimnazjalna z takim zadaniem.

Odnośnik do komentarza
Udostępnij na innych stronach

Znajdź mi pierwsze lepszą szkołe ponadgimnazjalna z takim zadaniem.

 

w mojej na zadanie pisałem np: mapowania sferyczne i cylindryczne, Quadtrees, dynamiczne oświetlenie per-pixel, optymalizacja zarządzania zasobami, kompresje, vfs. Tak więc all zależy tylko i wyłącznie od nauczyciela ;]

Wprawdzie w ELI ale moje gimnazjum

 

nom robiliśmy zadanka z olimpiady gimnazjalnej rok temu były masakryczne.

Odnośnik do komentarza
Udostępnij na innych stronach

A co tu zazdrościć wszystko możesz samemu robić... jak będziesz miał jakiś problem zawsze możesz kogoś zapytać i po sprawie a infe w szkole po prostu sobie odpuścić. 5h dziennie nad programowaniem zamiast graniem po sieci i po kilku latach już możesz mówić sobie programista.

Odnośnik do komentarza
Udostępnij na innych stronach

@Will: Fajny nauczyciel, ale mój z gimnazjum był jeszcze lepszy, bo grał z nami w Q2/3 i War3 ;]

 

Wg. mnie uczenie się Worda, Excela, Power Pointa itp. rzeczy jest zbędne. Prawdziwy informatyk znajdzie sobie lepszy program, do tego Microsoft robi aktualizacje tych programów, więc część nauczonych rzeczy w gimnazjum "nie zadziała" w szkole średniej + nie są darmowe, więc teoretycznie w domu się nie pouczysz :P I ostatni najważniejszy argument: Word ssie.

Odnośnik do komentarza
Udostępnij na innych stronach

No u nas było jeszcze trochę HTML, ale to tyle co nic.

Na informatykach przez 3 lata prawie zawsze mieliśmy godz. wychowawczą :P

 

Sam się musiałem uczyć wszystkiego, dopiero teraz w liceum na infie jest programowanie, ale straszne banały, a i tak większość klasy nie kuma...

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi o to że u was się w szkołach coś na ten temat porusza, u mnie dupa: DZIŚ DZIECI NAUCZYMY SIĘ PISAĆ W WORDZIE, no i na kiego nam to? :>

 

każdy nauczyciel jest przyzwyczajony do tępaków u mnie może 3 osoby coś wiedzą(tak mniej więcej) Część lepszych tematów zaproponowałem sam, reszta downów po pewnym czasie się zbuntowała i coś tam robią jakieś syfy a ja i tak co infe pisze swoje i omawiam z nim problemy czy spostrzeżenia lub proszę o rade w pewnym temacie. Infa to ile 3h tygodniowo? to jest nic.. kupujesz z 10 książek czytasz i piszesz..

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...