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