matematykaszkolna.pl
Program Benny: Mam zapisać w nowym pliku anagramy.txt wszystkie pary anagramów występujących w slownik.txt, slownik2.txt to kopia slownik.txt #include<stdio.h> #include<conio.h> #include<string.h> int lwws(char a, char slowo1[30]) { int s=0, i; for(i=0;i<strlen(slowo1);i++) if(slowo1[i]==a) s++; return s; } int anagram(char slowo1[10], char slowo2[10]) { int i; if(strlen(slowo1)!=strlen(slowo2)) return 0; for(i=0; i<strlen(slowo1); i++) { if(lwws(slowo1[i],slowo1)!=lwws(slowo1[i],slowo2)) return 0; return 1; } } main() { FILE *f1, *f2, *f3; char slowo1[30], slowo2[30]; f1=fopen("slownik.txt", "r"); f3=fopen("anagram.txt", "w+"); while(!feof(f1)) { fscanf(f1, "%s", slowo1); f2=fopen("slownik2.txt", "r"); while(!feof(f2)) { fscanf(f2, "%s", slowo2); if(anagram(slowo1, slowo2)==1) fprintf(f3, "%s %s\n", slowo1, slowo2); } fclose(f2); } fclose(f1); fclose(f3); getch(); } Czemu źle mi to wypisuje?
5 cze 22:45
jc: A dlaczego to miałoby działać? Myślę, że trzeba posortować litery w słowach, a potem porównać.
5 cze 23:08
Benny: Nie było mowy o żadnym sortowaniu. Program napisany przez wykładowce. Wklepałem i w lewej kolumnie mam po paręnaście/dziesiąt wyrazów takich samych a po prawej już inne, lecz nic nie mają ze sobą wspólnego.
5 cze 23:10
jc: No, dobrze, funkja anagram rzeczywiście sprawdza, czy mamy doczynienia z anagramami. Strasznie to działa (o ile działa). Bierzemy pierwsze słowo ze słownika i sprawdzamy czy jego anagram występuje w drugim słowniku, a potem następne słowo itd. Wydaje się, że powinno być dobrze. Co otrzymujesz?
5 cze 23:38
Benny: ABAŻUR ABAŻUR ABAŻUR ADRIAN ABAŻUR AFRYKA ABAŻUR AGITKA ABAŻUR AGONIA ABAŻUR AKCYZA ABAŻUR AKTYWA ABAŻUR ALADYN ABAŻUR ALARMY ABAŻUR ALDONA ABAŻUR ALEJKA ABAŻUR ALIANS ABAŻUR ALIANT ABAŻUR ALICJA ABAŻUR ALKOWA ABAŻUR ALOSZA ABAŻUR ALUZJA ABAŻUR AMATOR ABAŻUR AMBONA ABAŻUR AMMANN ABAŻUR ANATOL ABAŻUR ANATOM ABAŻUR ANDORA ABAŻUR ANDREA ABAŻUR ANEMIA ABAŻUR ANGINA ABAŻUR ANGLIA ABAŻUR ANGOLA To tylko początek, ale jak widać coś jest nie tak.
5 cze 23:52
jc: hmm... może jutro emotka ABAŻUR ADRIAN lwws(slowo1[1], slowo1) = 1 lwws(slowo1[1], slowo2) = 0
6 cze 00:03
Benny: Ok znalazłem. W funkcji anagram zawsze zwraca 1, więc return 1; ma być za funkcją. Zastanawiam się jaki warunek dać, aby nie wypisywało mi dwóch tych samych par tj. ABEL BELA BELA ABEL
6 cze 00:07
jc: No tak, to efekty pisania niepotrzebnych klamerek { } (ta była po for)
6 cze 00:23
Benny: Da ktoś pomysł, żeby nie wypisywało mi tych samych wyrazów obok siebie oraz tych samych par?
6 cze 09:08
jc: Niczym zaczniesz sprawdzać, czy słowo z pliku "słownik" ma anagram w pliku "słownik2", sprawdź, czy nie nie zadpisałeś go już do pliku "anagram".
6 cze 09:22
Benny: Mam poprawkę. Znalazłem funkcję strcmp, ale coś mi się chyba zwiesiło i nie wpisuje mi nic. Jak ktoś może wklepać u siebie i zobaczyć czy coś nie gra. #include<stdio.h> #include<conio.h> #include<string.h> int lwws(char a, char slowo1[30]) { int s=0, i; for(i=0;i<strlen(slowo1);i++){ if(slowo1[i]==a) s++; } return s; } int anagram(char slowo1[10], char slowo2[10]) { int i,j; if(strlen(slowo1)!=strlen(slowo2)||slowo1==slowo2) return 0; for(j=0; j<strlen(slowo1);j++) if(slowo1[j]=slowo2[j]) return 0; for(i=0; i<strlen(slowo1); i++) { if(lwws(slowo1[i],slowo1)!=lwws(slowo1[i],slowo2)) return 0; } return 1; } main() { FILE *f1, *f2, *f3; char slowo1[30], slowo2[30]; f1=fopen("slownik.txt", "r"); f3=fopen("anagram.txt", "w+"); while(!feof(f1)) { fscanf(f1, "%s", slowo1); f2=fopen("slownik2.txt", "r"); while(!feof(f2)) { fscanf(f2, "%s", slowo2); if(anagram(slowo1, slowo2)==1&&strcmp(slowo1, slowo2)<0) fprintf(f3, "%s %s\n", slowo1, slowo2); } fclose(f2); } fclose(f1); fclose(f3); printf("skonczylem "); getch(); }
6 cze 22:32
Benny: W funkcji anagram trzeba wykreślić 5 linijek, zapomniałem.
6 cze 22:35
Benny: Nie całość, kurde
6 cze 22:37
jc: A co powiesz na taką propozycję wzór(słowo) = posortowane litery słowa 1) tworzysz plik: wzór + słowo 2) sortujesz nowy plik wg pierwszej kolumny
6 cze 23:11
Benny: Nie robiliśmy jeszcze sortowania.
6 cze 23:14