Zdravím všechny,
dostali jsem za úkol vytvořit program. Ale programování mi je cizí, bohužel. Jak by byl snadný život :) Obracím se na vás s dotazem, zdali by jste mi nemohli dát přibližný nástřel, jak by měl program vypadat...
Název příkladu je Posun jmen:
Vytvořte program, který naplní jednorozměrný vektor jmen A (typ string) o délce n. Dále přečtete celé číslo m. V případě kladného m proveďte cyklický posun vektoru vpravo o m pozic, pro záporné m vlevo. Cyklický posun vpravo znamená, že se neposlední prvky posunou o jeden index, poslední prvek přesune na místo prvního prvku. Posun vlevo je analogický, první prvek se stává posledním.
Vytiskněte původní i posunutý vektor.
Vstup: n, m, vektor A
Výstup: Původní i posunutý vektor.
Budu rád, za každou odpověď, která mi pomůže...vím, že čas nikdy dost..i tak děkuji za odpovědi :)
Fórum › Pascal
Posun jmen
Zkus říct po pravdě o co jde. A proč mluvíš za víc lidí "dostali jsem za úkol"? Proč ti někdo dává za úkol vytvořit program, když je ti to cizí? To jako kdyby mně někdo dal za úkol otestovat DNA na přítomnost sekvence způsobující dědičnou chorobu - taky je mi to cizí...
Neviem či som dobre pochopil zadanie, ale asi máš načítať pole stringov a potom to pole poprehadzovať podľa toho posunu. V podstate budeš iba posúvať indexy. Budeš maťnačítané pole A potom vytvoríš pole B s poprehadzovanými(posunutými) prvkami. Sprav si funkciu ktorá ti bude vracať prepočítaný index, teda ak je posun 2 tak z indexu 2 ti spraví 4, z indexu 3 zas vráti 5, hlavne ošetri ten prechod cez hranice intervalu. Potom už len prejdeš v cykle pole A a budeš priraďovať polu B nové indexy, čiže asi niečo takéto B[funkcia(i,posun)] := A[i]
To Grungy :
Problém mnoha zadání je, že jsou nepřesná. Často se pak stane, že člověk vyplodí nějaký program a zadavatel mu ho vrátí, protože to chtěl jinak.
V tomto případě, pokud se budu držet formulace zadání: "proveďte cyklický posun vektoru vpravo o m pozic...", jde zřejmě zadavateli o to, aby si řešitel procvičil práci s polem a opravdu fyzicky přesouval ty údaje v tom jednom poli. Což ve tvém navrženém řešení nebude provedeno. Netvrdím, že je to špatné řešení, ale domnívám se, že nebude přijato. Samozřejmě se mohu také mýlit.
To JoDiK : Jo, nepřesná zadání jsou na houby. Ale možná se na té škole považuje "otravujte zadavatele tak dlouho, dokud vám to neupřesní" za implicitní součást zadání a užitečný trénink pro praxi :-).
Tak jo, zkusím ten nástřel...
Máš vektor (člil pole, čili klíčové slovo Array) stringů nebo obecně čehokoli, budu tomu říkat prvky. Indexy začínají číslem 1, poslední platný prvek má index m, pravá mez pole může být cokoli >=m (u Turbo Pascalu pozor na 64kilobytový limit - kompletních stringů se ti do souvislého pole vejde maximálně 256, pak už překladač hlásí "Structure too large").
Posun doprava:
1) m. prvek si ulož někam stranou (do samostatné proměnné).
2) Cyklus pro pozici od m do 2 (budeš potřebovat slova For a Downto): prvek vlevo od aktuální pozice (tj. s indexem o 1 menším) zkopíruj na aktuální pozici.
3) Na 1. pozici zkopíruj původní m. prvek.
Doleva to bude podobné, jenom si na začátku odložíš první prvek a cyklus budeš točit od levého konce (For + To).
Posun o n prvků můžeš pro začátek vyřešit jako nkrát opakovaný posun o 1. Jestli to budeš chtít nějak optimalizovat, budeš muset použít druhé pole, jak doporučuje Grungy.
Moje stránka.
Zdravím všechny, děkuji za reakce...s kamarádem jsem si sednul a trochu popracoval...když jsem se byl zeptat jestli je to zprávně, tak neni. Udělal jsem to, že se šoupou jen písmena ne jména..špatně jsem to pochopil a ještě ten posun moc nefunguje. Měli by se šoupat jména např. Pepa, Karel, Jana atd. vždy o jeden index a poslední zpět na první a naopak..šlo by to nějak rychle upravit an ty jména? tady je můj program: díky
program Posun_jmen;
{$APPTYPE CONSOLE}
uses
SysUtils;
const c = 90;
var
a : array [1..c]of string;
p, h : string;
i, n, m : integer;
// zacatek programu
Begin
// zadani delky vektoru
writeln('zadejte delku vektoru (1-',c,')');
readln(n);
writeln;
// naplneni a vypsani vektoru
randomize;
for i := 1 to n do
begin
a[i] := char(random(25)+65);
write(a[i]);
end;
// posun vekotoru o "m"
writeln;
writeln;
writeln('zadejte cele cislo; zaporne posouva vektor doleva kladne doprava');
readln(m);
writeln;
m := m mod n;
if m>=0
then
// posun pro kladne "m"
begin
for i := n downto 1+m do
begin
h := a[i];
a[i] := a[i-m];
a[i-m] := h;
end
end
else
// posun o zaporne "m"
begin
m := -m;
for i := 1 to n-m do
begin
h := a[i];
a[i] := a[i+m];
a[i+m] := h;
end;
end;
// vypsani posunuteho vektoru
for i := 1 to n do
write(a[i]);
// finis
writeln;
writeln;
writeln('pro ukonceni stiskni ENTER');
readln;
end.
Když to má zpracovávat jména, proč tam cpeš písmena?
a[i] := char(random(25)+65);
když máš posouvat po jednom cituji: "Cyklický posun vpravo znamená, že se neposlední prvky posunou o jeden index"
proč se pokušíš posouvat rovnou o m a ještě tak divně?
a[i] := a[i-m];
Zadavatel chce, abys to m-krát posunul o jedno.
Máš špatně ten posouvací algoritmus. Nápad s postupným vyměňováním dvojic jako při bubblesortu by sice fungovat mohl, ale máš pomotané cykly. Je potřeba použít dva: vnitřní, který projde celé pole od n do 2 nebo od 1 do n-1 (ten způsobí cyklický posun o 1), a vnější, který to celé zopakuje mkrát. V žádném případě se tam nesmí objevit nic jako 1 to n-m a podobně - n a m spolu nijak nesouvisí!
Já bych to napsal spíš takhle:
// posun o 1 doprava:
begin
h := a[n]; {ulozeni posledniho prvku stranou}
for i := n downto 2 do {predpokladam, ze pole bude mit vic nez 2 prvky!}
a[i] := a[i-1]; {postupne prekopirovani kazdeho prvku o jedno misto doprava}
a[1] := h; {vlozeni posledniho prvku na prvni pozici}
end
Ale tvůj postup bude fungovat taky, stačí opravit ty cykly. Písmena místo jmen přesouvat nebude; to se ti jenom zdálo, protože se pole místo cyklického posunu totálně zamíchalo.
Moje stránka.
Díky za reakce...
Tak jsem se obrátil trochu na programátora, který bohužel v Pascalu dělal naposledy před 10 lety :)) trochu mi s tim poradil...napsal mi vlastní algoritmus programu tak, jak by to mělo fungovat, problém je ten, že netrefil syntax pascalu, mohl by mi tady někdo pomoci přepsat do správné syntaxe? díky moc
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var vektor: array[90] of String;
var posun: Integer;
var pocetJmen: Integer;
var i: Integer;
function posunNahoru(vektor, pocetJmen) {
var tmp: String;
var i: Integer;
tmp = vektor[0];
for (i =0; i< pocetJmen-1; i++) {
vektor[i] = vektor[i+1]; // posun o jednu pozici nahoru
}
vektor[pocetJmen] = tmp;
return vektor;
}
function posunDolu(vektor, pocetJmen) {
var tmp: String;
var i: Integer;
tmp = vektor[pocetJmen];
for (i =pocetJmen; i> 0; i--) {
vektor[i] = vektor[i-1]; // posun o jednu pozici dolu
vektor[0] = tmp;
return vektor;
}
if (posun>0) {
for (i=1; i<=posun; i++) {
posunNahoru(vektor)
}
}
else {
posun = abs(posun); // absolutni hodnota
for (i=1; i<=posun; i++) {
posunDolu(vektor);
}
}
Asi ano...:/ přeci jenom se pohybuje na vysoké úrovni...udělal mi nástřel algoritmu, jen bych ho teď potřeboval přepsat do syntaxu pascalu...:(...nemohl by mu tady někdo hodný pomoci...prosím
To Anonymní uživatel : a co si takhle prohlidnout syntaxi pascalu, syntaxi C a udelat si to sam?
Je tu kazdej den 20 lidi co nejsou schopni udelat ani takhle jednoduchou vec (nekteri sou na tom jeste hur)
A je to samozrejme otravny tu cist furt to samy: tak sem tady - posadte se na prdel a udelejte mi to a to (+ prosim, smutne koukam, zivit se tim nechci - je to jen do skoly... bla bla bla)
(divim se ze nervak jeste drzi :D - ikdyz me to taky par let vydrzelo)
No, ono mezi "pomoci" a "udělat to za mě" je docela rozdíl ;-). Nejdřív ses nás zeptal, jak na to. Podrobně jsme ti popsali postup. Pak sis to nechal napsat od jednoho kamaráda, jenže to tak docela nefungovalo. Zeptal ses proč. Řekli jsme ti, co je špatně a jak to opravit. Pak sis to nechal napsat od jiného kamaráda, jenže to zase nefunguje. Když ti teď poradíme, co kde přepsat, zajdeš za třetím kamarádem, nebo se nad tím konečně trochu zamyslíš?
Všechno, co potřebuješ k úspěšnému vyřešení, najdeš v tomhle vlákně. Je to tvoje škola a tvoje známky, ne naše.
Neboj, ono to půjde. Stačí chtít.
Moje stránka.
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
Posun Jmen — založil Radek
Trideni jmen — založil Lukáš
Seznam jmen vytvořený polem — založil peaceman
Problem u jmen obsahujici mezery — založil boomsek
Filtrování stejných jmen ve výpisu z databáze — založil cosh-boy
Moderátoři diskuze