Program wyszkujuący słowa na daną literę.

2012-11-25 14:19

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Napisz program wyszukujący w podanym pliku wyrazów zaczynających się na podaną literę . Plik do
przeszukiwania powinien zostać podany jako pierwszy parametr programu. Litera powinna być
przekazywana jako drugi parametr programu. Program powinien wyświetlać znalezione słowa wraz
numer linii oraz numer informującym, które jest to słowo w danej linii. Dane te powinny być zapisane
do pliku wyjściowego, do którego ścieżka powinna być podana jako trzeci parametr.

Czy mógłby ktoś mnie nakierować jakich instrukcji najlepiej użyć w danym programie ?
Czy instrukcja pos dałaby radę ?

edytowany 1x, ostatnio: deathvenom, 2012-11-25 14:27

Pozostało 580 znaków

2012-11-25 14:29

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Tuchów

1

Czy instrukcja pos dałaby radę ?

Można i tak, choć wczutując linię do String'a wystarczy sprawdzić, czy nie jest pusta i jeśli nie - sprawdzić pierwszy znak, więc Pos nie jest konieczne, ale można go wykorzystać;

Czy mógłby ktoś mnie nakierować jakich instrukcji najlepiej użyć w danym programie ?

A czego dokładnie nie rozumiesz? To zadanie jest bardzo proste (tzn. na poziomie TI) więc ucząc się na zajęciach powinieneś bez problemu sobie z nim poradzić;


@EDIT

a co jeżeli w jednej linii będę miał kilka słów na literę 'n' ?

No to napisz precyzyjnie jaka jest budowa tego pliku - ja założyłem, że jest jeden wyraz w jednej linii (zwykle takie zadania widuję) - jak widać błędnie;

Możesz wykonać to ręcznie, możesz wykorzystać TStrings i ExtractStrings lub własną procedurę like Explode; Wczytujesz linię do łańcucha, rozdzielasz ją za pomocą np. ExtractStrings i w pętli przechodzisz po wszystkich liniach obiektu sprawdzając pierwszy znak czy jest równy n; Jeśli trzeba to wykorzystaj UpperCase czy CompareText żeby nie rozróżniać wielkości liter; Jeśli sprawdzasz wyrazy jedynie pod kątem litery n - po prostu sprawdź czy:

if Strings1[Index][1] in ['n', 'N'] then
  { doo something }

Sposobów jest wiele - zastanów się i wybierz taki, jaki Ci odpowiada i jaki umiesz zaimplementować;


edytowany 2x, ostatnio: furious programming, 2012-11-25 14:49
a co jeżeli w jednej linii będę miał kilka słów na literę 'n' ? - deathvenom 2012-11-25 14:38
W poleceniu było zawarte, że w linii tekstu jest więcej niż jeden wyraz ; p - deathvenom 2012-11-25 14:55
Tego to już nie napisałeś... Pomogłem - plusik :> - furious programming 2012-11-25 14:58
Program powinien wyświetlać znalezione słowa wraz<br /> numer linii oraz numer informującym, "które jest to słowo w danej linii". - deathvenom 2012-11-25 14:59

Pozostało 580 znaków

2012-11-25 14:40

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

a co jeżeli w jednej linii będę miał kilka słów na literę 'n' ?

Musisz rozdzielić łańcuch na słowa, po czym w pęltli sprawdzić każdy i inkrementować jakiś licznik; - furious programming 2012-11-25 14:59

Pozostało 580 znaków

2012-11-25 15:28

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Tuchów

0

Program powinien wyświetlać znalezione słowa wraz numer linii oraz numer informującym, "które jest to słowo w danej linii"

Więc w pętli pobierającej linię inkrementujesz licznik linii:

wLinesCnt := 0;

while not EoF(fInput) do
begin
  Inc(wLinesCnt);

  { sprawdzenie długości linii i podzielenie jej na słowa }
end;

i jeśli podzielisz wczytaną linię (wcześniej sprawdzoną czy nie jest pusta) na słowa, to w pętli po wyrazach sprawdzisz czy zaczyna się na daną literę i jeśli tak - licznik pętli jest indeksem wyrazu w ciągu:

{ dzielimy łańcuch na wyrazy }

if slLines.Count > 0 then
  for I := 0 to Pred(slLines.Count) do
    if slLines[I][1] in ['n', 'N'] then
      { I to indeks wyrazu w ciągu, gdzie pierwszy wyraz ma indeks 0 }

i to wszystko - wyświetlanie na ekranie konsoli to już sam oprogramuj;

wLinesCnt i I to Word (może być inny typ - ja podałem dla przykładu Word), a slLines to TStrings, fInput typu TextFile; Sprawdzanie pod kątem liter n i N;


edytowany 3x, ostatnio: furious programming, 2012-11-25 15:30

Pozostało 580 znaków

2012-11-25 18:17

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Nie napisałbyś jak ma dokładnie wyglądać sprawdzenie długości linii i podzielenie jej na słowa, bo to sprawia mi największe problemy ; /

Pozostało 580 znaków

2012-11-25 19:11

Rejestracja: 14 lat temu

Ostatnio: 18 sekund temu

0

Najprościej czytać plik znak po znaku obrabiając to przez maszynę Turinga w postaci tablicy.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

czlowieknaswiecie
2012-11-25 19:15
czlowieknaswiecie
0

Przed chwilą było takie samo pytanie, pewnie też twoje, ale nie była podana kolejność parametrów.
Napisałem całość (w Pythonie, bo Delphi nie umiem) i wszystko jest jak opisałeś, tylko kolejność parametrów jest inna... i język się nie zgadza, ale wszystko pokomentowałem, więc mam nadzieję, że pomoże.

#!/usr/bin/env python
#-*- coding: utf-8 -*-

# Program przyjmuje 3 (i 1 opcjonalny) argumenty: plik wejściowy (parsowany), plik wyjściowy (zawierający "tabelę" ze słowami, linią i numerem wyrazu w kolejności oraz literę, na którą mają się rozpoczynać wyrazy, opcjonalny argument to wrażliwość na wielkość liter (t, n) standardowo wrażliwe (t). 

import sys

if(len(sys.argv)<4): # Sprawdza czy zostały podane wszystkie argumenty
    print "Nie podałeś wszystkich argumentów. Wymagane: plik wejściowy, wyjściowy i litera [oraz opcjonalnie czy wielkość litery ma znaczenie (t, n) standardowo t]. "
    sys.exit() # Jak nie to wywala błąd i się wyłącza
if(len(sys.argv)==5): # sprawdza czy jest podany opcjonalny parametr, jeśli tak
    if(sys.argv[4]=="n"): # jeśli jego zawartość to "n"
        case = False # nie zwracaj uwagi na wielkość znaków
    else: # jeśli inna
        case = True # zwracaj
else: # jeśli nie podane
    case = True # zwracaj
if(case==False): # jeśli nie zwraca uwagi na wielkość znaków
    arg = sys.argv[3].lower() # znak wejściowy z małej litery
else: # jeśli nie
    arg = sys.argv[3] # pozostaje bez zmian
try: # Program spróbuje... 
    infile = open(sys.argv[1], "r") # otworzyć plik... 
except: # jeśli się nie uda... 
    print "Nie można otworzyć pliku wejściowego sprawdź czy ścieżka jest poprawna i czy program ma do tego uprawnienia. " # wyświetli taki komunikat błędu... 
    sys.exit() # i wyjdzie
try: # Program spróbuje... 
    outfile = open(sys.argv[2], "w+") # otworzyć [utworzyć i otworzyć do zapisu] plik... 
except: # jeśli się nie uda... 
    print "Nie można utworzyć pliku wyjściowego. Czy folder istnieje i czy program ma prawa do tworzenia tam plików? " # wyświetli taki komunikat błędu... 
    sys.exit() # i wyjdzie... 
content = infile.read() # tutaj jest zawartość pliku wejściowego
lines = content.split("\n") # zawartość pliku podzielona na tablice przez znak nowej linii
for i in range(len(lines)-1): # zrób pętle tyle razy ile linii w pliku
    for y in range(len(lines[i].split(" "))): # zrób pętle tyle razy ile wyrazów w pliku (oddzielone spacją)
        if(case==False): # jeśli nie zwraca uwagi na wielkość
            first = lines[i].split(" ")[y][0].lower() # pierwszy znak wyrazu jako mała litera
        else: # jeśli zwraca
            first = lines[i].split(" ")[y][0] # oryginalna wielkość znaku
        if(first==arg): # jeśli pierwszy (zerowy, bo liczymy od zera) znak w pliku jest taki jak trzeci argument (litera, której szukamy)
            outfile.write(lines[i].split(" ")[y]+"\t"+str(i+1)+"\t"+str(y+1)+"\n") # zapisuje do pliku wyjściowego wyraz, numer linii, numer kolejności wyrazu w linii, oddzielone tabem, na końcu nowa linia
infile.close() # zamyka plik wejściowy
outfile.close() # zamyka plik wyjściowy

Przykładowy plik wejściowy (test):

To jest testowy tekst
Jeśli program przejdzie poprawnie ten test
to wyświetli wyjście, które mówi o tekście na t
w liniach i wyrazach
1,1 1,3 1,4 2,5 2,6 3,1 3,7 3,9

Komenda:
python literka.py test out t n
Wyjście (out):

To  1   1
testowy 1   3
tekst   1   4
ten 2   5
test    2   6
to  3   1
tekście 3   7
t   3   9

(wyjście jest oddzielone tabami, które formatowanie tutaj zepsuło, ale w edytorze tekstowym wynik wygląda jak tabela)

Mam nadzieję, że pomoże :)

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0