matematykaszkolna.pl
c liam: Witam, mam nastepujacy problem − mam w 2 plikach tekstowych wypisane kilka wyrazów i chciałbym wyszukać te które mają identyczne ostatnie 2−3 znaki. Możecie dać mi jakieś wskazówki, nie rozwiązanie. Pozdrawiam
10 maj 15:50
Kejt: zakładam, że nagłówek do zadania to nazwa języka wskazówka: scanf(); obsługuje wyrażenia regularne (no, do czytania z pliku to będzie bodajże fscanf(); )
10 maj 15:55
liam: Tak, hmmm rzeczywiście tak też można, ale ja teraz wpadłem na funkcje fseek i z jej pomoca udalo mi sie poki co porownac 2 teksty , tylko nie wiem jak poprawic kod zeby porownywal kazdy oddzielny wiersz i wyszukiwal podobienstw wsrod 2−3 ostatnich znakow
10 maj 16:04
Kejt: Pokaż kod, razem z tymi plikami tekstowymi, może coś poradzę emotka
10 maj 16:15
Draghan: Nie wiem, jak bardzo zaawansowane ma to być wyszukiwanie podobieństwa, ale to raczej podpada pod wyrażenia regularne. Pobaw się manipulacjami na stringach. Jeśli masz wczytany plik do tablicy znaków, musisz szukać w takiej tablicy znaku nowej linii '\n'. Stąd będziesz wiedział, że tam się kończy wiersz. Wtedy cofnij się o 3 indeksy do tyłu i masz trzy znaki kończące wiersz... Możesz sobie np. podzielić cały wczytany plik na tablice, w których będziesz przechowywał osobne wiersze. Ale pójść jeszcze dalej, przechowywać po te Twoje trzy ostatnie znaki z każdego wiersza... Możliwości jest naprawdę sporo, ogranicza Cię tylko Twoja wyobraźnia i sprawność programowania. Nie obraź się, ale z Twojego postu ciężko nawet wyłapać, z czym masz problem...
10 maj 16:18
liam: Teraz widze, ze jednak moja metoda nie jest dobra, ale ok wrzuce kod, moze bd miec do mnie cierpliwosc #include<stdio.h> int main() { FILE *p1, *p2; char tab1, tab2; long dlugosc; const int ost=3; p1 = fopen("czas.txt", "r"); if (p1 == NULL) { puts("Adres jest bledny lub plik jest pusty"); exit(1); } fseek(p1, 0, SEEKEND); dlugosc = ftell(p1); fseek(p1, (dlugosc − ost), SEEKSET); do { tab1 = fgetc(p1); putchar(tab1); } while (tab1 != EOF); p2 = fopen("rzecz.txt", "r"); if (p2 == NULL) { puts("Adres jest bledny lub plik jest pusty"); exit(1); } fseek(p1, 0, SEEKEND); dlugosc = ftell(p1); fseek(p1, (dlugosc − ost), SEEKSET); do { tab1 = fgetc(p1); putchar(tab1); } while (tab1 != EOF); if (tab1 == tab2) printf("sa identyczne"); else if (tab1 != tab2) printf("Nie sa takie same"); fclose(p1); return(0); }
10 maj 16:31
liam: Nie wiem dlaczego pokazuje seek end i seek set w taki sposob, http://wklej.org/id/1707907/
10 maj 16:33
Draghan: ...dlatego, że znak podkreślenia na tym forum oznacza indeks dolny... emotka
10 maj 16:35
liam: Okkk, czasem szybciej pisze niz mysle...
10 maj 16:38
liam: Chodzi mi po prostu, ze jezeli mam dwa pliki txt i w kazdym wypisane wyrazy w taki sposob wyraz1 wyraz2 wyraz3 etc to moim celem jest porownanie kazdego wiersza z dwoch plikow i wypisanie tych wyrazow/wierszy ktore maja takie same 3 ostatnie litery, dzieki za cierpliwosc
10 maj 17:01
Draghan: Czy oba pliki mają identyczną ilość wierszy?
10 maj 17:05
Kejt: Ok. Każdy wiersz z każdym z tego samego pliku i tego drugiego? czy bierzemy pierwszy wyraz z pierwszego i szukamy w drugim pliku takiego, który będzie miał 3 identyczne znaki na końcu? Sorki, ale nadal się w tym trochę gubię
10 maj 17:09
liam: Nie miały, poprawiłem, niestety bez zmianemotka
10 maj 17:09
liam: Kejt − 2 opcja czyli bierzemy 1 wierz z 1 pliku i szukamy w drugim pliku.
10 maj 17:10
Draghan: Nie, nie, nie... Pytam o warunki zadania. Czy to ma być tak, że jeśli mamy: −−−−−−−plik1−−−−−−−−−−−−− Kawa Telefon Pisak ________________ −−−−−−−plik2−−−−−−−−−−−−− Ława Ssak Telefon ________________ ...to wypisze tylko Kawa−Ława? Czy może jeszcze Pisak−Ssak? Wiersze z odpowiadającymi sobie końcówkami powinny być w tych plikach w tym samym miejscu?
10 maj 17:12
Kejt: Już chyba jasne, podeślę jak coś będę miała ^^
10 maj 17:15
Draghan: Aaaaa, czyli takie coś... Problem nie jest trudny. emotka 1. Wczytujesz oba pliki do osobnych tablic. 2. (opcjonalnie, dla wygody) Dzielisz każdą z tych tablic na tablice 2−wymiarowe, które będą zawierały poszczególne wiersze. 3. Robisz 2 zagnieżdżone pętle for − pierwsza przelatuje po wierszach z pierwszego pliku i dla każdego wiersza przepytuje wszystkie wiersze z drugiego pliku.
10 maj 17:15
Kejt: Ok. Jeszcze tylko jedno pytanie, mam się martwić złożonością czasową i pamięciową? Czy po prostu ma działać
10 maj 17:23
liam: W sumie co do pamięci myślałem nad wprowadzeniem mallockiem, ale nie chce doprowadzic do sytuacji w ktorej sam malo co zrobie, wiec nad mallockiem moze samemu popracuje
10 maj 17:31
Draghan: Moje zdanie jest takie... Działaj, Kejt. emotka Tylko nie zapomnij opatrzyć kodu w komentarze, żeby liam nie miał problemów ze zrozumieniem i wyciągnął wnioski. emotka
10 maj 17:31
Kejt: Proponuję kontakt przez gg: 616192 Będzie łatwiej ^^ Teraz wychodzę, wrócę niedługo. Zostaw wiadomość.
10 maj 17:56