Datuve :: Forums :: Arhīvs :: PASCAL Programma - vajag palīdzību

Datuve

Mana Datuve

Reģistrācija | Noteikumi | Paroles atjaunošana



Forums

Ieskaties


Raksti

Lietotāji online

Lietotāji online: 81

Reģistrētie lietotāji online: 0

Viesi online: 81

Datuve.lv video
Top.LV

PASCAL Programma - vajag palīdzību

Ievietoja: KasparsKarasevskis @ 2009.09.29 20:01  

Uzdevums ir uzrakstīt programmu pascal vidē, kura atrod ievadītajam skaitlim N tuvāko divnieka pakāpi X, kas ir lielāka par N. Ja 2^X=N

{Esmu pirmā kursa students, tādēļ īpaši neko nesaprotu vēl no pascal
Paldies :)}

Komentāri:

#1 KaNeiet @ 2009.09.29 20:11

Kādu palīdzību? Neredzu uzrakstīto programmu. Ja gribi, lai to dara kāds cits - neredzu summu.
Pamatkonstrukcijas aprakstītas, piemēram, http://www.liis.lv/nps/
Konkrētajā uzdevumā dali skaitli ar 2 un skaiti - cik reizes izdevās iegūt veselu skaitli.

#2 KasparsKarasevskis @ 2009.09.29 20:15

KaNeiet rakstīja:

Kādu palīdzību? Neredzu uzrakstīto programmu. Ja gribi, lai to dara kāds cits - neredzu summu.
Pamatkonstrukcijas aprakstītas, piemēram, http://www.liis.lv/nps/
Konkrētajā uzdevumā dali skaitli ar 2 un skaiti - cik reizes izdevās iegūt veselu skaitli.

Nu beidz Summu tādai elementārai programmai :D
Bet paldies par padomu :)

#3 damncrow @ 2009.09.29 21:34

program figna;

var
 n, m: integer;
 i: integer = 0;

begin
 Write('N = ');
 ReadLn(n);
 m := n;

 while m > 1 do
 begin
   i := i + 1;
   m := m div 2;
 end;
 i := i + 1;

 m := Round(Exp((i) * Ln(2)));
 WriteLn('Atbilde: ', i, '   (2^', i, ' = ', m, ')');
 WriteLn(m div 2, ' <= ', n, ' < ', m);

 ReadLn;
end.

// Saucās - nesapratu uzdevumu...

#4 KasparsKarasevskis @ 2009.09.29 22:43

damncrow rakstīja:

program figna;

var
 n, m: integer;
 i: integer = 0;

begin
 Write('N = ');
 ReadLn(n);
 m := n;

 while m > 1 do
 begin
   i := i + 1;
   m := m div 2;
 end;
 i := i + 1;

 m := Round(Exp((i) * Ln(2)));
 WriteLn('Atbilde: ', i, '   (2^', i, ' = ', m, ')');
 WriteLn(m div 2, ' <= ', n, ' < ', m);

 ReadLn;
end.

// Saucās - nesapratu uzdevumu...

Paldies - mana  versija bija
var
N, x: integer;
Begin
write('Введите: ');
readln(N);
x:=1;
while exp(ln(2)*x)<N do
 inc(x);
if exp(ln(2)*x)=N then
 Writeln('2^',x,' = ',N)
else
 Writeln('X= ',x);
End.
bet tur kkas nesanāca :)

#5 edd999 @ 2009.09.29 23:07

Pēc #3 koda:

N = 1
Atbilde: 1   (2^1 = 2) // 2^0=1, tatad atbilde 0
1 <= 1 < 2

N = 2
Atbilde: 2   (2^2 = 4)  //2^1=2 , atbilde 1
2 <= 2 < 4

N = 3
Atbilde: 2   (2^2 = 4)   // Nu šis ok
2 <= 3 < 4

N = 4
Atbilde: 3   (2^3 = 8) // 2^2=4 atbilde 2
4 <= 4 < 8

N = 16
Atbilde: 5   (2^5 = 32) // 2^4=16 atbilde 4
16 <= 16 < 32

#6 edd999 @ 2009.09.29 23:13

Lūk mans risinājums, risinājums nav tas labākais, bet ņemot vērā, ka šī bija pirmā programma, kuru pats uzrakstīju.

program div_pak;
uses crt;
var n,b,a,o:real;
Label Fin, error, last, first;
begin
first:
clrscr;
a:=0;
b:=1;
Writeln('Shi programma izvada tuvako 2 pakapi ievaditajam skaitlim. ');
error:
Writeln('Ievadiet n , (n>=0) ');
Readln(n);
If n<0 then goto error;
If n=0 then
begin
Writeln('Skaitlim ',n:2:0,' tuvaka divnieka pakape',a:2:0,'   2^',a:2:0);
 GoTo Fin;
 end;
repeat b:=b*2; a:=a+1; until b>=n;
If n=b then
Writeln('Ievaditais skaitlis ',n:2:0,' ir vienads ar 2 ',a:2:0, ' pakape!')
else
Writeln('Ievaditais skaitlis ',n:2:0,' ir mazaks par 2 ',a:2:0, ' pakape!');
Fin:
Writeln('Programmas beigas');
Writeln('Lai turpinatu programmu spediet 1, ja velaties beigt programmu, spiediet 0');
Readln(o);
If o=0 then goto last else goto first;
readkey;
last:

end.

#7 gatboom @ 2009.09.30 08:56

uzdevum jau izpildīts, bet iesaku aizmirst operatoru GOTO!
izmanto repeat vai while nosacījuma ciklus un, turpinot apgūt programmēšanu,
veiksmīgi var izmantot lietotāja definētas f-jas un procedūras.

uztaisi šo pašu bez GOTO operatoriem un būsi jau nākamajā līmenī. :)

#8 damncrow @ 2009.09.30 09:49

Uzdrīkstēšos oponēt :)

GOTO nav nekas izskaužams. Ja vien nesāk aunapieres izdarības, kā lekt iekšā ciklos vai ārā no tiem. Ja to iemācās un netaisa pārlieku spagetti, konsoļu programmās GOTO izrādās reti noderīgs.

#9 Recy @ 2009.09.30 10:24

ilgi tirinaajos, rakstiit, vai nerakstiit atsevishkju komentaaru. Buutiiba ir taada, ka pilniiba piekriitu #8, un veeleejos pajautaat #7, ko taadu ieguust, neizmantojot sho komandu- sarezgjiitaaku algoritmu, kur paaradresaacijas gala kompilaacijaa buus vairaak, noslogos sisteemu vairaak? jautaaju to, kaa assemblera programmeetaajs, nevis 'lai programma izskatiitos iisaaka' staipiitaajs.
P.S. parasti aatrdarbiigaakaas, efektiivaakaas programmas ir nedaudz lielaakas par liidzveertiigaam, bet leenaakaam.

#10 gatboom @ 2009.09.30 10:38

#9:
no pieredzes: cilvēks nespēj strādāt lielākā projektā, mocās līdz spēj augstvērtīgi programmēt OOP :)

#11 Recy @ 2009.09.30 12:42

#10
suudiigi cilveeki, ja nespeej straadaat savaa jomaa profesionaali. visticamaak- bez izgliitiibas :( nothing personal :)

#12 usver @ 2009.09.30 12:55

#9: uzturamību iegūst.
Jedritvai nazīt, ja lielā projektā kāds izdomā savus globāļus lietot un glabāt tmp mainīgos sesijā, jo neprot nodot mainīgos starp funkcijām un logiem, tad var iet nosisties pret sienu uzreiz, jo tāds kods bieži vien ir grūti uzturams.
 Cilvēki ar laiku pasaka - "šito palagu es nepārtaisīšu". Ja viens vidusmēra jaunietis atsakās to labot, otrs atsakās un ir jāpiesaista eksperti, kas milzīgus palagus var pēc tam pielāgot, tad labs OOP ir DAUDZ uzturamāks un strukturētāks. Da kaut sakarīgs kods, bet ne jau mudžekļains koda palags ar, nedod dies`, vēl mudžekļainākiem tikai sev saprotamiem nosacījumiem, ko iebāzt negaidītās vietās. Lietojot GOTO utml negaidītus pavērsienus, cilvēki bieži vien neiemācās lietot parametrizāciju un klases, lai otrs uzreiz saprastu, kur notiek kura funkcionalitāte. Viņi prot tikai drukāt palagus un pieķibināt kaut ko klāt "uz puņķa", kur ienāk prātā, tā ka ir jāizlasa viss kods pilnībā, lai saprastu, kāda mārrutka pēc sistēma pēkšņi rāda uz pogas 3 punktiņus, nevis gaidāmo tekstu. Jo kāds ir uzlicis, ka tā jābūt, ja loga teksts satur tekstu "lietotāj" un veiksmīgi balstījis uz šī nosacījuma funkcionalitāti jau vairākos citos logos :) Murgus sarakstīt ir vienkārši, ja ir apņēmība un laiks, bet labot un uzturēt to - grūtāk.
 Viena kodera projektos vaut vai savu interpretatoru taisīt un lietot mainīgos ar nosaukumiem ķīniešu valodā, taču lielās sistēmās labās prakses ievērošana mežonīgi atvieglo sistēmas augšanu un uzturēšanu. Nu kaut vai tas, ka cilvēki ar bakalaura diplomu IT joprojām nezina, kāda jēga ir no 1. normālformas, ja var vienārši glabāt laukā serializētus vai ar semikolu atdalītus masīvus. Nu un, ka meklēšanu vai atlasīšanu pēc tam nevarēs normāli sataisīt pie 10GB datu? Tagad takš strādā viss ;)

#13 gatboom @ 2009.09.30 13:28

#12: tieši tā :)
diemžēl to reāli parāda statistika bakalauros, kur no 30 cilvēku grupas labi ja 2 vai 3 ir spējīgi to izprast. Pārējie diemžel iziet darba tirgū ar diplomu, bet programmēt nemāk, nemaz nerunājot par programmatūras specifikācijas izstrādi.

#14 usver @ 2009.09.30 13:40

Uz programmēšanu ir gatavi doties liela daļa bakalauru, "jo tur pieklājīgi maksā", un tas ir tikai apsveicami, taču vispirms vajag tiem pašiem mājās pasēdēt un pataisīt savas sistēmas, lai izslimotu bērnu slimības - jau minētās koda tizlības, lai paši saprastu, kāpēc nav labi visu funkcionalitāti uzrakstīt garā 10KB palagā, bez funkcijām vai ar murgainu loģiku. Lieta tāda, ka arī firmās koda analīze NETIEK veikta - tjp, ja students kaut kā nebūt atķeksē "uzdevums paveikts", tad viss - ar to pietiek. Un tāpēc arī bieži vien netiek veicināta izaugsme, lai zaļu studentu rosinātu rakstīt sakarīgu, uzturamu kodu. Bet tā jau ir vadītāja atbildība - ja to neņem vērā, tad pats vainīgs, ka firmai funkcionalitātes izmaiņas prasa ilgāku laiku.
Es klusētu, ja šāda viltīgā loģika bieži vien neietu rokrokā ar tizlu uzturamību.

#13: specifikācijas uzrakstīt - oi, tav nav grūti. 1 rindopa: "Uztaisi, lai klients var parakstīt datus ar savu kartiņu. Punkts". Tā bieži vien skaitās specifikācija ;)
vot, projektējuma arhitektūra (PPA)- tas jau ir sarežģītāk, un tur ar mācēšanu pateikt "davai, izdari tur kaut ko" nepietiek.

#15 damncrow @ 2009.09.30 14:59

Tas ir skaidrs, kā diena, ka es piederu pie tiem kretīniem, kas raksta galīgi greizu kodu. Un PPA uzrakstīt es tiešām nejēdzu (lai gan kurss tāds bija, aha) :D

Bet kā jau augstāk cilvēks atsaucās uz asembleri: galu galā procesors vienalga beigās kaut kur redz CMP-JE/JNE/etc.. Kas pēc būtības tas pats IF-GOTO vien ir. Vai arī es esmu totāls zābaks...

Principā jau te pamācoša diskusija izvērtās, to nevar noliegt :)