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

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

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

0

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

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;

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

0

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

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

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