Program pobierający tekst i zliczający krotność słowa.

DBoniem
Użytkownik
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.

Post autor: DBoniem »

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.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

Program pobierający tekst i zliczający krotność słowa.

Post autor: Afish »

W którym miejscu masz problem?
DBoniem
Użytkownik
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.

Post autor: DBoniem »

jak połączyć to, że pobierze z linii komend i z pliku słowa?
Crizz
Użytkownik
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.

Post autor: Crizz »

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.
DBoniem
Użytkownik
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.

Post autor: DBoniem »

Początek

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);
...

  
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??
Crizz
Użytkownik
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.

Post autor: Crizz »

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.
DBoniem
Użytkownik
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.

Post autor: DBoniem »

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);
...
Crizz
Użytkownik
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.

Post autor: Crizz »

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

Kod: Zaznacz cały

char calosc[20000];
Czym jest zatem zmienna calosc? I ile w związku z tym zwróci operator sizeof(calosc)?
DBoniem
Użytkownik
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.

Post autor: DBoniem »

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?

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++)
Funkcja strlen oblicza długość łańcucha calosc.
Crizz
Użytkownik
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.

Post autor: Crizz »

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

Kod: Zaznacz cały

for(licz=0; licz<=ile-1; licz++)
A nie prościej będzie tak?

Kod: Zaznacz cały

for(licz=0; licz<ile; licz++)
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ś.
DBoniem
Użytkownik
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.

Post autor: DBoniem »

a mógłbyś wstawić swoją wersję tego zadania?
Crizz
Użytkownik
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.

Post autor: Crizz »

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;
}    
Starałem się zachować jak najwięcej Twoich pomysłów i fragmentów kodu.
Xitami

Program pobierający tekst i zliczający krotność słowa.

Post autor: Xitami »

Crizz pisze:

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;
}    
Czemu cały tekst trzeba trzymać w pamięci i przeglądać go wielokrotnie?
Po wczytaniu linijki uzupełnić tablicę h[256], a na koniec wybrać z h[] tylko interesujące nas wartości
ODPOWIEDZ