Potřebuju poradit s programem, který počítá kolik slov začíná a končí stejným písmenem. Prosím pomožte, už si fakt nevím rady.
Fórum › Pascal
Pascal
To Lasserus : tak jak bys to delal ty, kdybys to mel delat jen na papire...
dalsi uroven: predstav si ze mas omezenou pamet, hlavne musis vedet presne kam a co ukladas... a ze muzes udelat jen jednu akci najednou
program PRACPRG;
uses crt;
var nevyskyt,i,p,r,a,s,n,k,t,x:integer;
text:string[255];
nevy:string[225];
begin
clrscr;
write('Zadej text: ');
readln (text);
n:= length (text);
p:=0;
konce:=['.','?','!'];
for i:=1 to length(text) do
if text[i] in konce then p:=p+1;
writeln('Text obsahuje ',p,' vet.');
s:=0;
for r:=1 to length(text) do
if (text[r]='a') and ((text[r+1]=' ') or (text[r+1]=',') or (text[r+1] in konce) or (text[r+1]='!'))
then s:=s+1;
if text[n]='a' then s:=s+1;
writeln('Text obsahuje ',s,' acek na konci slova.');
***
readln(text);
nevy:='';
for i:=65 to 90 do
if pos(chr(k),text)=0 then
nevy:=nevy+chr(k);
for i:=97 to 122 do
if pos(chr(k),text)=0 then
nevy:=nevy+chr(k);
writeln(nevy);
readln;
end.
***Kolik slov začíná a končí stejným písmenem.
no a ted si predstav ze kdyz mas pismena tak je ukladas do nejake promenne (tim ti vznika slovo) a kdyz narazis na neco co pismeno neni, tak to slovo zpracujes... tj. prvni a posledni pismeno srovnas.. a kdyz sou stejne prictes nekam jednicku - jako pocet slov ktere zacinaji a konci jednickou...
a pak znova
Jen tak mimochodem, ten tvůj (?) program dělá něco úplně jiného...
Zadání je tak trochu nepřesné. Mluví se o slovech, které mají první písmeno stejné jako poslední, nebo o slovech, které všechna začínají jedním a končí druhým písmenem?
Začni tím, že si zadaný text rozložíš na slova a vypíšeš je na samostatné řádky. Zhruba nějak takhle:
Vstup:
'Tohle je věta, kterou chci rozložit. Tohle taky!'
Výstup:
'Tohle'
'je'
'věta'
'kterou'
'chci'
'rozložit'
'Tohle'
'taky'
Jakmile máš slova takhle zvlášť, už není problém porovnat první a poslední písmeno (if slovo[1]=slovo[length(slovo)] then ...). Samozřejmě je dobré předtím všechno převést na velká písmena (funkce Upcase), jinak by třeba 'Anča' vyšlo jako neshoda (protože 'A'<>'a').
A jak najít slova? Třeba takhle:
Do proměnné Věta typu string si nech zadat text k prohledání.
Máš dvě celočíselné proměnné Začátek a Délka, do kterých si budeš ukládat, kde slovo začíná a jak je dlouhé. Obě teď vynuluj.
/ Cyklus (While), který pojede tak dlouho, dokud se Začátkem nedostaneme za konec Věty:
|/ Cyklus (While), který pojede tak dlouho, dokud se Začátkem nedostaneme za konec Věty:
|| Začátek zvyš o 1 (tj. posuň se ve Větě o jeden znak dál).
|\ Jestli znak na pozici Začátku je něco, z čeho se může skládat slovo (tedy asi písmena nebo číslice), nastav Délku na 1 a ukonči cyklus (příkaz Break), jinak ho nech běžet dál.
|/ Další cyklus (opět While), který opět pojede tak dlouho, dokud se Začátkem nedostaneme za konec Věty:
|\ Jestli je znak na pozici Začátek+Délka něco, z čeho se může skládat slovo, zvyš délku o 1, jinak ukonči cyklus (Break).
| Jestli je Začátek>délka Věty, ukonči cyklus (break), už nemáme co zpracovávat.
| Teď ti Začátek ukazuje na první znak nalezeného slova a v Délce máš uloženo, z kolika písmen se skládá. Vykopíruj si ho funkcí Copy do samostatné proměnné typu string a zpracuj ho podle potřeby (teď např. Writeln).
\ K Začátku přičti Délku a Délku potom vynuluj. Tím se dostaneš za právě zpracované slovo.
Moje stránka.
Tak v tom případě ti stačí porovnat první písmeno slova s posledním a jestli jsou stejné, něco s tím udělat.
Prvním krokem každopádně zůstává vytahání slov ze vstupního textu. Jak jsi daleko?
Moje stránka.
Jak moc "trochku"? Jako takhle: http://mircosoft.ic.cz/texty/ZAKLADY.TXT?
Nebo snad takhle:
program RozborVety;
var veta,slovo:string;
zacatek,delka,PocetNalezenycSlov:integer;
BEGIN
writeln;
writeln('Program na pocitani slov se stejnym pismenem na zacatku jako na konci');
writeln('=====================================================================');
writeln;
write('Zadej vetu, ktera se ma prozkoumat: ');
readln(veta);
zacatek:=0;
delka:=0;
...algoritmus jsem ti popsal o par prispevku vys, staci ho prelozit do Pascalu...
writeln('Zadana veta obsahuje ',pocetnalezenychslov,' slov, ktera zacinaji');
writeln('a konci stejnym pismenem.');
writeln;
writeln('Pro ukonceni stiskni Enter.);
readln;
END.
?Moje stránka.
Ne. To už bych to za tebe musel napsat celé. Jestli neuvidím, že se aspoň trochu snažíš (a kopírování kusů kódu od ostatních za snahu nepovažuju), tak ti nepomůžu. Je to tvoje škola, ne moje.
Když už nic jiného, tak se aspoň ptej na konkrétní věci.
Moje stránka.
To Mircosoft : prosím já to je pouze jenom podprogram se kterým si fakt nevím rady jinak zadání celé práce je
Zadání: Na vstupu je dán text (max. 255 znaků).
Zjisti a) Kolik obsahuje vět (věta je zakončená ., !, ?). Mám
b) Kolik slov končí písmenem a. Mám
c) Která písmena anglické abecedy se v textu nevyskytují. Mám
d) Kolik slov začíná a končí stejným písmenem. Nemám
Moc prosím.
To Lasserus :
V tom, co si myslíš, že už máš, je několik chybek. Například při hledání počtu písmen "a" na konci slov procházíš zadanou větu od prvního znaku do posledního a včetně toho posledního (pokud se jedná o "a") zkoumáš, jestli následující znak není oddělovač. Ale za posledním znakem "(text[r+1]=' ')" už nemáš co zkoumat - jsi mimo zadanou větu a pokud zadáš větu 255 znaků dlouhou, už jsi i mimo rozsah proměné! Je pravda, že aby program skončil chybou 201 musel by být poslední znak "a", to ale dokonce předpokládáš a posichroval sis to zvlášť příkazem: "if text[n]='a' then s:=s+1;"
Já bych spíš předpokládal, že budou jasně dány podmínky vstupu, například že nepředpokládáme chybně zapsaný text a že každá (i poslední věta) je regulerně ukončena. Pak nemusíš dělat takovéto nestandardní záležitosti.
Pak mě překvapilo, že když správně u počítání vět využíváš množinu, proč jsi to tak děsně zamotal u počítání písmen "a" na konci slov - proč tam zdvojeně zkoumáš ukončovací znaky vět jednou z množiny konce a pak ještě extra po jednom?
Vždyť tam stačí napsat, že následující znak musí být z množiny tvořené sloučením množiny [' '] a už nachystané množiny konce.
if (text[r]='a') and (text[r+1] in [' ']+konce)
No a jestli platí ta verze co máš na začátku, proč před počítáním písmen, které se nevyskytují, znovu čteš větu?
Každopádně ti to nefunguje - sis tam nějak popletl řídící proměnnou cyklu. Navíc mám takové tušení, že u tohodle zkoumání se asi nemají rozlišovat velká a malá písmena...
A pokud ti na ten poslední úkol nestačí rady trpělivého Mircosofta, zkusím ještě něco já...
Co třeba takto:
Potřebujeme zjistit počáteční a koncové znaky slov... Zavedeme si tedy dvě proměnné - zs a ks (začátek a konec slova typu znak).
První písmeno zadání je i prvním písmenem prvního slova že? Tak ho tam přiřadíme.
No a teď projdeme celý vstupní text od prvního do předposledního znaku a u každého zkoumáme, zda následující znak za právě zkoumaným je mezera nebo oddělovač vět, pokud tomu tak je, našli jsme poslední znak ve slově. Tak si ho uložíme a porovnáme s tím prvním (samozřejmě nezávisle na tom, jestli je to velké/malé písmeno). Máme-li shodu, přičteme si počet takových slov. Nezapomeneme pro další slovo nastavit počáteční písmeno. To se dá udělat buď tak, že tam přiřadíme znak o dva dál (pokued ovšem nejsme už na předposledním znaku zadání), nebo se to dá vyřešit i tak, že pokud aktuální znak je mezera nebo oddělovač vět, následující znak musí být prvním znakem dalšího slova...
To bys mohl zvládnout napsat ne?
To JoDiK : toto je aktuální verze:
program PRACPRG;
uses crt;
var i,p,r,a,s,n,k,t:integer;
konce: set of char;
text:string[255];
procedure POSLEDNI;
var nevy: string;
i: integer;
begin
nevy:='';
for i:=65 to 90 do
if pos(chr(i),text)=0 then
nevy:=nevy+chr(i);
for i:=97 to 122 do
if pos(chr(i),text)=0 then
nevy:=nevy+chr(i);
writeln('V textu se nevyzkytuji tyto znaky anglicke abecedy:');
writeln;
write(nevy);
readln;
end;
begin
clrscr;
write('Zadej text: ');
writeln;
readln (text);
writeln('===========================================================');
writeln;
n:= length (text);
p:=0;
konce:=['.','?','!'];
for i:=1 to length(text) do
if text[i] in konce then p:=p+1;
if p=0 then writeln('Text neobsahuje zadnou vetu!') else
writeln('Text obsahuje ',p,' vet.');
writeln;
s:=0;
for r:=1 to length(text) do
if (text[r]='a') and
((text[r+1]=' ')
or (text[r+1]=',')
or (text[r+1] in konce)
or (text[r+1]='!'))
then s:=s+1;
if text[n]='a' then s:=s+1;
if s=0 then writeln('Text neobsahuje zadne acka na konci slov!') else
writeln('Text obsahuje ',s,' acek na konci slov.');
writeln;
POSLEDNI;
end.
S kamošem jsme uvažovali trochu
program PRACPRG;
uses crt;
var i,p,r,a,s,n,k,t:integer;
konce: set of char;
text: string[255];
procedure POSLEDNI;
var nevy:string;
i:integer;
begin
nevy:='';
for i:=65 to 90 do
if pos(chr(i), text)=0 then
nevy:=nevy+chr(i);
for i:=97 to 122 do
if pos(chr(i), text)=0 then
nevy:=nevy+chr(i);
writeln('V textu se nevyzkytuji tyto znaky anglicke abecedy: ');
writeln;
writeln(nevy);
readln;
end;
procedure PREDPOS;
var alphabet: set of char;
n,b: integer;
begin
alphabet:=[a,b,c,d,e,f,g,h,ch,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,Ch,I,J,K,L,M,O,P,Q,R,S,T,U,V,W,X,Y,Z];
while n<=lenght(text)
if b[n] in alphabet then b:=b+1;
n:=n+1;
writeln('Slov kterych začinaji a konci stejným pismenem je ',b,'.);
readln;
end;
begin
clrscr;
write('Zadej text bez diakritiky: ');
writeln;
readln(text);
writeln('===========================================================');
n:= length (text);
p:=0;
konce:=['.','?','!'];
for i:=1 to length(text) do
if text[i] in konce then p:=p+1;
if p=0 then writeln ('Text neobsahuje zadnou vetu')
else writeln('Text obsahuje ',p,' vet.');
writeln('===========================================================');
s:=0;
for r:=1 to length(text) do
if (text[r]='a') and ((text[r+1]=' ')
or (text[r+1]=',')
or (text[r+1]= '?')
or (text[r+1]='!'))
then s:=s+1;
if text[n]='a' then s:=s+1;
if s=1 then writeln('Text obsahuje ',s,' acko na konci slova.') else
s=0 then writeln('Text neobsahuje zadne acka na konci slov.')else
s>1 then writeln('Text obsahuje ',s,' acek na konci slova.');
writeln('===========================================================');
POSLEDNI;
writeln('===========================================================');
PREDPOS;
writeln('===========================================================');
readln;
end.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Dev Pascal, Free pascal - oba mi spustí program 2x po sobě — založil Gooo
Pomoc:pascal:kurz turbo pascal II — založil Systém
Pascal: kurz turbo pascal II — založil Systém
Moderátoři diskuze