Program pobierający tekst i zliczający krotność słowa.
-
- Użytkownik
- Posty: 312
- Rejestracja: 25 lis 2010, o 13:47
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 1 raz
- Pomógł: 1 raz
Program pobierający tekst i zliczający krotność słowa.
Napisz program, który pobierze z linii komend zbiór liter oraz z pliku tekst i wypisze krotność każdej z zadanych liter w tym tekście.
-
- Użytkownik
- Posty: 4094
- Rejestracja: 10 lut 2008, o 15:31
- Płeć: Mężczyzna
- Lokalizacja: Łódź
- Podziękował: 12 razy
- Pomógł: 805 razy
Program pobierający tekst i zliczający krotność słowa.
Z linii komend ma pobrać litery (które, jak rozumiem, mamy zliczyć w pliku).
No i zasadnicze pytanie: w czym ten program? Pokaż najlepiej swoje próby rozwiązania.
No i zasadnicze pytanie: w czym ten program? Pokaż najlepiej swoje próby rozwiązania.
-
- Użytkownik
- Posty: 312
- Rejestracja: 25 lis 2010, o 13:47
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 1 raz
- Pomógł: 1 raz
Program pobierający tekst i zliczający krotność słowa.
Początek
ten fragment ma za zadanie pobranie ile liter użytkownik chce wyszukać, następnie ma podać, które litery wybrał.
Jeśli dotąd jest w porządku, to jak dalej z tą linią komend i plikiem zrobić?
Należy użyć programu cmd.exe i z jej pomocą wpisać szukane litery??
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
char linijka[1000];
char calosc[20000];
int ile;
char tab[ile];
printf("Ile liter w tekscie chcesz wyszukiwac?
");
scanf("%d", &ile);
printf("Podaj te litery
");
scanf("%s", tab);
...
Jeśli dotąd jest w porządku, to jak dalej z tą linią komend i plikiem zrobić?
Należy użyć programu cmd.exe i z jej pomocą wpisać szukane litery??
-
- Użytkownik
- Posty: 4094
- Rejestracja: 10 lut 2008, o 15:31
- Płeć: Mężczyzna
- Lokalizacja: Łódź
- Podziękował: 12 razy
- Pomógł: 805 razy
Program pobierający tekst i zliczający krotność słowa.
Ten program ma być naprawdę w C?
Masz main bez typu.
Początek może taki być, o ile nie chodziło o to, zeby podawać te litery jako parametry wywołania programu. Potem jakies funkcje typu fopen, fread, fclose do czytania z pliku. Musisz dokładnie kontrolować, ile znaków przeczytałeś z pliku (jeśli mniej, niż wynosi podany rozmiar tablicy, to kończymy czytanie).
W tych dwóch tablicach chcesz trzymać odpowiednio linijkę i całość pliku? Nie ma takiej potrzeby. Wystarczy czytać po kawałku pliku i zliczać wystepujące w nim, interesujące nas litery. Przyda się natomiast jakaś dodatkowa tablica do trzymania ilości znaków danego typu.
Masz main bez typu.
Początek może taki być, o ile nie chodziło o to, zeby podawać te litery jako parametry wywołania programu. Potem jakies funkcje typu fopen, fread, fclose do czytania z pliku. Musisz dokładnie kontrolować, ile znaków przeczytałeś z pliku (jeśli mniej, niż wynosi podany rozmiar tablicy, to kończymy czytanie).
W tych dwóch tablicach chcesz trzymać odpowiednio linijkę i całość pliku? Nie ma takiej potrzeby. Wystarczy czytać po kawałku pliku i zliczać wystepujące w nim, interesujące nas litery. Przyda się natomiast jakaś dodatkowa tablica do trzymania ilości znaków danego typu.
-
- Użytkownik
- Posty: 312
- Rejestracja: 25 lis 2010, o 13:47
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 1 raz
- Pomógł: 1 raz
Program pobierający tekst i zliczający krotność słowa.
Tak ma być w języku c.
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
int main()
{
char linijka[1000];
char calosc[20000];
int ile;
char tab[ile];
printf("Ile liter w tekscie chcesz wyszukiwac?
");
scanf("%d", &ile);
printf("Podaj te litery
");
scanf("%s", tab);
FILE *wsk;
wsk=fopen(plik.txt","r");
printf("
Wejsciowy tekst:
");
while (fgets(linijka,1000,wsk))
{
strncat(calosc, linijka, sizeof calosc - 1);
}
fclose(wsk);
...
-
- Użytkownik
- Posty: 4094
- Rejestracja: 10 lut 2008, o 15:31
- Płeć: Mężczyzna
- Lokalizacja: Łódź
- Podziękował: 12 razy
- Pomógł: 805 razy
Program pobierający tekst i zliczający krotność słowa.
No OK, tylko nie możesz zakładać, że plik wejściowy będzie miał tylko 20000 bajtów, bo to smieszna liczna. Jeżeli już musisz wprowadzić ograniczenie dotyczące liczby znaków w pliku i musisz koniecznie trzymać zawartość tego pliku w tej "ogromnej" tablicy, to chociaż zabezpiecz sie, żeby nie zacząć pisać sobie po całej pamięci (na razie Twój program tego nie gwarantuje).
Poza tym zadeklarowałeś:
Czym jest zatem zmienna calosc? I ile w związku z tym zwróci operator sizeof(calosc)?
Poza tym zadeklarowałeś:
Kod: Zaznacz cały
char calosc[20000];
-
- Użytkownik
- Posty: 312
- Rejestracja: 25 lis 2010, o 13:47
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 1 raz
- Pomógł: 1 raz
Program pobierający tekst i zliczający krotność słowa.
W tym pliku nie będzie zbyt wielu słów najwyżej do dziesięciu.
Do jakiej wielkości można powiększyć char calosc[20000] by nie patrzeć już na rozmiary pliku?
Funkcja strlen oblicza długość łańcucha calosc.
Do jakiej wielkości można powiększyć char calosc[20000] by nie patrzeć już na rozmiary pliku?
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char linijka[1000];
char calosc[20000];
int ile;
char tab[ile];
printf("Ile liter w tekscie chcesz wyszukiwac?
");
scanf("%d", &ile);
printf("Podaj te litery
");
scanf("%s", tab);
FILE *wsk;
wsk=fopen("plik.txt","r");
printf("
Wejsciowy tekst:
");
while (fgets(linijka,1000,wsk))
{
strncat(calosc, linijka, sizeof calosc - 1);
}
fclose(wsk);
printf("%s
",calosc);
int dlugosc = strlen(calosc);
int licz;
for(licz=0; licz<=ile-1; licz++)
-
- Użytkownik
- Posty: 4094
- Rejestracja: 10 lut 2008, o 15:31
- Płeć: Mężczyzna
- Lokalizacja: Łódź
- Podziękował: 12 razy
- Pomógł: 805 razy
Program pobierający tekst i zliczający krotność słowa.
Nie no, na 10 słów to starczy spokojnie. Chodziło mi o to, że nie należy przyzwyczajać sie do takiego stylu programowania, bo stos jest zasobem bardzo ograniczonym i nie powinno się go nadużywać.
A nie prościej będzie tak?
Bo jak dla mnie, to będzie nie tylko prościej, ale i taniej. Twój pomysł powoduje, że w każdym obiegu pętli wykonujemy bez potrzeby dodatkową operację arytmetyczną.
Powtarzam pytanie: co zwróci sizeof(calosc)? Proponuję to sprawdzić, wstawiając do zmiennej calosc jakiś długi łańcuch, a potem wypisując na ekran rezultat tego operatora. Zastanów się, czy wyświetlona liczba będzie tym, czego się spodziewałeś.
Kod: Zaznacz cały
for(licz=0; licz<=ile-1; licz++)
Kod: Zaznacz cały
for(licz=0; licz<ile; licz++)
Powtarzam pytanie: co zwróci sizeof(calosc)? Proponuję to sprawdzić, wstawiając do zmiennej calosc jakiś długi łańcuch, a potem wypisując na ekran rezultat tego operatora. Zastanów się, czy wyświetlona liczba będzie tym, czego się spodziewałeś.
-
- Użytkownik
- Posty: 4094
- Rejestracja: 10 lut 2008, o 15:31
- Płeć: Mężczyzna
- Lokalizacja: Łódź
- Podziękował: 12 razy
- Pomógł: 805 razy
Program pobierający tekst i zliczający krotność słowa.
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char linijka[1000];
char calosc[20000];
int ile;
char tab[26];
int licznik[26]={};
printf("Ile liter w tekscie chcesz wyszukiwac?
");
scanf("%d", &ile);
printf("Podaj te litery
");
scanf("%s", tab);
FILE *wsk;
if(!(wsk=fopen("plik.txt","r")))
{
printf("Błąd otwarcia pliku
");
return 1;
}
printf("
Wejsciowy tekst:
");
while (fgets(linijka,1000,wsk))
{
strncat(calosc, linijka, 20000);
}
fclose(wsk);
printf("%s
",calosc);
int dlugosc = strlen(calosc);
printf("%s
","Wyniki");
for(int i=0; i<ile; i++)
{
for(int j=0; j<dlugosc; j++)
{
if(calosc[j]==tab[i])licznik[i]++;
}
printf("%c - %d
",tab[i],licznik[i]);
}
return 0;
}
Program pobierający tekst i zliczający krotność słowa.
Crizz pisze:Czemu cały tekst trzeba trzymać w pamięci i przeglądać go wielokrotnie?Kod: Zaznacz cały
... for(int i=0; i<ile; i++) { for(int j=0; j<dlugosc; j++) { if(calosc[j]==tab[i])licznik[i]++; } printf("%c - %d ",tab[i],licznik[i]); } return 0; }
Po wczytaniu linijki uzupełnić tablicę h[256], a na koniec wybrać z h[] tylko interesujące nas wartości