Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
C1I1
Lucru individual
la obiectul Metode netraditionale de rezolvare a problemelor de
Informatica
Rezolvare:
Fie că m are n cifre. Atunci 10n-1≦ m < 10n. (1)
Aplicînd operaţia de logaritmare, aşa cum funcţia
𝑓: 𝑅+∗ → 𝑅, 𝑓(𝑥) = lg(𝑥), este crescătoare, obţinem:
lg10n-1≤lg m < lg10n sau n-1≤ lg m < n. (2)
Din relaţia (2), aşa cum [x] ≤x, ∀𝑥 ∈ 𝑅 obţinem [lg m] = n-1 .
Prin urmare, n=[ lg m] +1. (3)
Algoritmul Pascal:
Program Probl1;
Uses Crt;
var m: longint;
n: byte;
BEGIN
ClrScr;
Write(’Scrie un număr natural cu cel mult 9 cifre: ’);
readln(m);
n:= trunc(ln(m)/ln(10))+1;
Writeln(’Numărul ’, m, ’ este format din ’, n, ’ cifre’);
readkey;
END.
1
Morari Dumitru gr. C1I1
Problema 2. De la tastatură se citesc numerele naturale m şi n, unde n < 1010 şi m este mai mic
decît numărul de cifre ale lui n.
Fără a utiliza structuri ciclice, ramificatorul sau selectorul, să se afişeze la ecran numărul:
a) u, format din ultimele m cifre (numărînd de la stînga spre dreapta) ale lui n în aceeaşi ordine;
b) p, format din primele m cifre ale lui n în aceeaşi ordine.
Rezolvare:
Orice număr natural n poate fi reprezentat în forma 𝑛 = 10𝑚 ∙ 𝑐 + 𝑟 unde 𝑐, 𝑟 ∈ 𝑁.
De exemplu, dacă 𝑛 = 91785 atunci:
– pentru 𝑚 = 1, 𝑛 = 10 ∙ 9178 + 5; – pentru 𝑚 = 2, 𝑛 = 102 ∙ 917 + 85;
– pentru 𝑚 = 3, 𝑛 = 103 ∙ 91 + 785; – pentru 𝑚 = 4, 𝑛 = 104 ∙ 9 + 1785; Observăm că: a)
numărul r este format din ultimele m cifre ale numărului n în aceeaşi ordine şi este egal cu restul
împărţirii numărului n la 10m ;
b) numărul c este format din primele (l–m) cifre ale numărului n în aceeaşi ordine şi este egal cu
cîtul împărţirii numărului n la 10m, unde l este numărul total de cifre ale numărului n.
Deci, pentru a obţine numărul format din primele m cifre ale numărului n, vom calcula cîtul
împărţirii numărului n la 10l-m.
Observaţie. Numărul l se va calcula cu ajutorul formulei (3).
Program Probl2;
Uses Crt;
var n,p,u: longint;
m,l: byte;
BEGIN
ClrScr;
Write(’Scrie un număr natural cu cel mult 9 cifre: ’);
readln (n);
l:=trunc(ln(n)/ln(10))+1;
u:=n mod round(exp(m*ln(10)));
p:=n div round(exp((l–m)*ln(10)));
writeln(’Numărul format din:’);
writeln(’ ultimele ’, m,’ cifre ale lui ’, n,’ este ’, u);
writeln(’ primele ’, m, ’ cifre ale lui ’, n,’ este ’, p);
readkey;
END.
2
Morari Dumitru gr. C1I1
Problema 3. De la tastatură se citeşte numărul natural n, n < 1010 . Fără a utiliza structuri ciclice,
ramificatorul sau selectorul, să se afişeze la ecran răsturnatul numărului n.
Algoritm:
Fie f(m), a m-a cifră a numărului n (numărînd de la dreapta spre stînga).
Luînd în consideraţie că n poate avea cel mult 9 cifre, calculăm numărul
+ 𝑓(8)) ∙ 10 + 𝑓(9) .
)
Observaţie. Considerăm 𝑓(𝑚) = 0, dacă m este mai mare decît numărul de cifre ale lui n.
Numărul 𝑟1 va fi format din 9 cifre. Dacă n are l cifre, atunci numărul va avea 9–l zerouri.
De exemplu, pentru n=27543 𝑟1=345720000.
Valoarea f(m) coincide cu ultima cifră din primele 𝑙 − 𝑚 + 1 cifre ale numărului n (numărînd de
la dreapta spre stînga).
Aplicînd formulele problemei 2, obţinem că f(m) este restul împărţirii la 10 a cîtului împărţirii la
10m-1 a numărului n. Prin urmare, expresia pentru calcularea numărului 𝑟1 în Pascal se va scrie:
𝑟1 ≔ ((((((((n mod
n div 10
n div 100
n div 1000
n div 10000
n div 100000
n div 1000. 000
n div 10 000 000
n div 100 000 000 mod 10).
Aflăm numărul l conform formulei (3).
Fie r răsturnatul numărului n. Atunci r este cîtul împărţirii numărului 𝑟1 la 109-l .
Algoritmul Pascal
Program Probl3;
Uses Crt;
var n,r1,r:longint;
l: byte;
BEGIN
ClrScr;
Write(’Scrie un număr natural cu cel mult 9 cifre: ’);
readln(n);
r1:=((((((((n mod 10*10+
n div 10 mod 10)*10+
n div 100 mod 10)*10+
n div 1000 mod 10)*10+
3
Morari Dumitru gr. C1I1
4
Morari Dumitru gr. C1I1
Algoritmul Pascal:
Program Probl4;
Uses Crt;
Var m,n,min,max:integer;
BEGIN;
ClrScr;
Write (’Scrie două numere întregi: ’); readln (m,n);
min:=(m+n–abs(m–n))/2; max:=(m+n+abs(m–n))/2;
writeln (’max=’, max);
witeln (’min=’, min);
readkey;
END.
5
Morari Dumitru gr. C1I1
Algoritmul Pascal:
program Test;
uses Crt;
var p,f1,f2,nota,rc,i:integer;
BEGIN
ClrScr;
writeln(’TEST CU TABLA INMULTIRII’);
Randomize; rc:=0;
for i:=1 to 20 do begin
f1:=random(11); f2:=random(11);
write(f1,’ X ’,f2,’ = ’); readln(p);
if p=f1*f2 then inc(rc);
end;
nota:=round(rc/2); writeln(’Ai obtinut nota ’,nota);
readkey;
END.
Problema 2. Să realizăm un algoritm care generează „balonaşe de săpun”. Apar aleator puncte
care se transformă în cercuri (baloane). Acestea din urmă, continuînd să „crească în volum”, se
sparg (de asemenea aleator).
Algoritmul Pascal:
program Baloane;
uses crt,graph;
type balon=record
x,y,i:integer;
max:integer;{raza maximala a balonului}
end;
var k,l:integer;
a:array[1..200] of balon;
procedure initiere;
var gd,gm,errcode:integer;
begin
gd:=detect; initgraph(gd,gm,’c:\tp\bgi’);
errcode:=graphresult; if errcode<>grok then write(’eroare’);
end;
6
Morari Dumitru gr. C1I1
BEGIN
initiere; randomize;
for k:=1 to 200 do begin
a[k].x:=random(getmaxx); a[k].y:=random(getmaxy);
a[k].max:=random(30)+10; a[k].i:=random(100)-100;
end;
repeat
cleardevice;
for k:=1 to 200 do
if (a[k].i>=0) and (a[k].i<a[k].max) then
circle(a[k].x,a[k].y,a[k].i)
else begin
a[k].x:=random(getmaxx); a[k].y:=random(getmaxy);
a[k].i:=random(100)-100; a[k].max:=random(30)+10;
end;
delay(2000);
for k:=1 to 200 do inc(a[k].i);
until keypressed;
closegraph;
END.
Algoritmul Pascal:
program Ghici;
Uses Crt;
var i,n,r:integer;
BEGIN
ClrScr;
writeln(’Ghiceste din 10 incercari numarul natural generat din
intervalul [1,1000]’);
Randomize; n:=random(1000)+1;
i:=0;
repeat
inc(i);
writeln(’—Incercarea ’,i,’ —’);
write(’Scrie numarul: ’);readln(r);
if n>r then writeln(’Numarul generat este mai mare’)
else if n<r then writeln(’Numarul generat este mai mic’)
else write(’Bravo! Ai ghicit numarul din ’, i, ’ incercari’);
until (i=10) or (n=r);
if n<>r then write(’Regret, numarul generat era ’, n);
readkey;
END.
7
Morari Dumitru gr. C1I1
Algoritmul Pascal:
uses CRT,DOS;
const
cuv_filename = 'cuv.txt';
desc_filename = 'desc.txt';
cuv_filename_c = 'cuv.db';
desc_filename_c = 'desc.db';
key = 24;
type
TCuv = string;
TDesc = string;
var
cuv, uc: TCuv;
desc: TDesc;
nCuv: word;
i, l,j: word;
mx, my, cx, cy: byte;
k: char;
str:string;
function file_exists(fn:string): boolean;
var Dir: SearchRec; {Uses DOS;} //directoria deschisa
begin
findFirst(fn, $3F, Dir); {Se cauta fisierul specificat, cu orice atribut}
if(DosError = 0) then file_exists:= true else file_exists:=false;
//file_exists := DosError = 0;//if()
end;
procedure to_cript(fn,gn:string; key:byte);
var
f, g:file of byte;
b:byte;
begin
Assign(f, fn);
Reset(f);
Assign(g, gn);
Rewrite(g);
while not eof(f) do begin
read(f, b);
b:= b xor key;
write(g, b);
end;
close(f);
close(g);
end;
function file_nLines_cript(fn:string; key:byte): word;
var n: word;
f: file of byte;
b, ln:byte;
begin
Assign(f, fn);
8
Morari Dumitru gr. C1I1
Reset(f);
n := 0;
ln:= 10 xor key;
while(not eof(f)) do begin
read(f, b);
if b = ln then inc(n);
end;
file_nLines_cript := n;
Close(f)
end;
function file_getLine_cript(fn:string; key:byte; line:byte): string;
var ret: string;
f: file of byte;
ln,ln2,b:byte;
begin
Assign(f, fn);
Reset(f);
ret := '';
ln:= 10 xor key;
while (not eof(f)) and (line >1) do
begin
read(f, b);
// b:= b xor key;
if b = ln then dec(line);
end;
while not eof(f) and (line =1) do
begin
read(f, b);
b:= b xor key;
if (b =10) or (b=13) then break;
ret := ret + chr(b);
end;
file_getLine_cript:=ret;
Close(f);
end;
function file_nLines(fn:string): word;
var n: word;
f: Text;
begin
Assign(f, fn);
Reset(f);
n := 0;
while(not eof(f)) do begin
inc(n);
readln(f);
end;
file_nLines := n;
Close(f)
end;
function file_getLine(fn:String; line: word): string;
var ret: string;
f: Text;
begin
Assign(f, fn);
Reset(f);
ret := '';
while not eof(f) and (line > 0) do
9
Morari Dumitru gr. C1I1
begin
dec(line);
readln(f, ret);
end;
if line <> 0 then
ret := '';
file_getLine := ret;
Close(f)
end;
function str_repeat(s: string; n: byte): string;
var ret: string;
begin
ret := '';
while n > 0 do begin
dec(n);
ret := ret + s;
end;
str_repeat := ret;
end;
function upper(s:string): string;
var i: byte;
begin
i := length(s);
while i > 0 do begin s[i] := UpCase(s[i]); dec(i); end;
upper := s;
end;
BEGIN
ClrScr;
Randomize;
/*cuv_filename = 'cuv.txt';
desc_filename = 'desc.txt';
cuv_filename_c = 'cuv.db';
desc_filename_c = 'desc.db';*/
if(file_exists(cuv_filename) and (file_exists(desc_filename))) then
begin
to_cript(cuv_filename,cuv_filename_c, key);
to_cript(desc_filename,desc_filename_c, key);
end;
nCuv := file_nLines_cript(cuv_filename_c, key);
i := Random(nCuv)+1;
cuv := file_getLine_cript(cuv_filename_c, key, i);
desc := file_getLine_cript(desc_filename_c,key, i);
mx := Lo(WindMax);
my := Hi(WindMax);
cx := mx div 2;
cy := my div 2;
uc := upper(cuv);
Writeln(#10'Descriere:'#10);
Writeln(desc);
l := length(cuv);
gotoxy(cx-l, cy);
Write(str_repeat(#32#219, l));
str:='';
j:=0;
repeat
gotoxy(2, cy + 2);
write('Ghici litera: ');
10
Morari Dumitru gr. C1I1
k := UpCase(ReadKey);
inc(j);
ClrEOL;
writeln(k);
if ((pos(k, uc) > 0) and (pos(k, str) = 0)) then begin
write('Corect!!!'); ClrEOL;
for i := 1 to l do
if k = uc[i] then begin str:=str+k; gotoxy(cx-l+2*i-1, cy); write(cuv[i]);
end;
end
else if((pos(k, uc) > 0) and (pos(k, str) > 0)) then begin
write('Aceasta litera a mai fost :-('); ClrEOL;
end
else begin
write('Nu exista asa litera :-('); ClrEOL;
end;
until ((k = #27) or(length(str)=l));
gotoxy(cx-20, cy + 4);
if length(str)=l then writeln('Bravo, ati ghicit toate literele din ',j,'
incercari!!!')
else write('Ne pare rau, nu ati terminat testul!');
readkey;
END.
11
Morari Dumitru gr. C1I1
Algoritmul Pascal:
Program Reprezentarea;
Uses crt;
var a: integer;
function bytebits(B: byte): string; {returneaza scrierea binara a lui
B}
var m: byte; r: string;
begin
r:=’’;
m:=128;
while (m>0) do begin
r:=r+char(ord(B and m>0)+48);
m:=m shr 1; {arunca 1 bit din dreapta lui m}
end;
bytebits:=r;
end;
function membits(P: pointer; n: byte): string;
{returneaza reprezentarea in calculator a numarului de pe adresa P }
var r: string; pc: pchar;
begin
if p=nil then exit;
r:=’’; pc:=p;
while n > 0 do begin
r:=bytebits(ord(pc^))+’ ’+r;
inc(pc);
dec(n);
end;
membits:=r;
end;
BEGIN
ClrScr;
write(’a=’); readln(a);
writeln(membits(@a,2));
readkey;
END.
12
Morari Dumitru gr. C1I1
Algoritmul Pascal:
Program numere_str; {Calcularea sumei numerelor mari de lungimi egale}
uses crt;
type fisier=file of string;
var f1,f2,f:fisier;
q1,q2,q:text;
s,re,s1,s2,secv:string;
n1,n2,i,i1,i2,j,rest,n,kapa,lun:integer;
a,b,sum,dif,produs,ad:string;
Function cif(c:char):integer;
begin
if c='0' then cif:=0 else
if c='1' then cif:=1 else
if c='2' then cif:=2 else
if c='3' then cif:=3 else
if c='4' then cif:=4 else
if c='5' then cif:=5 else
if c='6' then cif:=6 else
13
Morari Dumitru gr. C1I1
end;
for i:=length(a1) downto 1 do begin
c1:=cif(a1[i]);c2:=cif(a2[i]);
c:=c1+c2;c:=c+rest;rest:=c div 10;
c:=c mod 10;
l1:=lit(c);
insert(l1,r,1);end;
adu:=r;
end;
Function scad(a1,a2:string):string;
label 2,9;
var g,r,zer,h:string;
l1:char;
i,j,zero,c1,c2,rest,c,w,m,f:integer;
begin
r:='';zer:='0';rest:=0;
if length(a1)=length(a2) then begin
if a1<a2 then begin m:=1;g:=a1;a1:=a2;a2:=g;end;
end;
if length(a1)>length(a2) then begin
zero:=length(a1)-length(a2);
for j:=1 to zero do insert(zer,a2,1);
end;
if length(a2)>length(a1) then begin
zero:=length(a2)-length(a1);m:=1;
for j:=1 to zero do insert(zer,a1,1);
g:=a1;a1:=a2;a2:=g;
end;
writeln;
for i:=length(a1) downto 1 do begin
c1:=cif(a1[i]);c2:=cif(a2[i]);
if c1>=c2 then c:=c1-c2 else begin
c1:=c1+10;
c:=c1-c2;
w:=cif(a1[i-1])-1;
a1[i-1]:=lit(w);end;
if (i=1) and (c=0) then goto 2;
l1:=lit(c);
insert(l1,r,1);end;
2:h:='0';
for i:=1 to length(r) do
if r[i]<>h then begin f:=i;goto 9;end;
9:delete(r,1,f-1);
if m=1 then scad:='-'+r else scad:=r;
end;
Function inmul(a1,a2:string):string;
var r3,r4:string;
i,j,k:integer;
begin
r3:='';r4:='';
for i:=length(a1) downto 1 do begin
r3:='';
for j:=1 to cif(a1[i]) do r3:=adu(a2,r3);
for k:=1 to length(a1)-i do r3:=r3+'0';
r4:=adu(r3,r4);end;
inmul:=r4;
14
Morari Dumitru gr. C1I1
end;
Begin
clrscr;
assign(q1,'numere1.txt');
assign(q2,'numere2.txt');
assign(f1,'intrare1.dat');
assign(f2,'intrare2.dat');
reset(q1);reset(q2);
rewrite(f1);rewrite(f2);
{se creeaza fisierele cu acces direct f1 si f2}
15
Morari Dumitru gr. C1I1
end;
close(q);close(f);
readkey;
end.
Algoritm Pascal:
Program Polinoame;
Uses Crt;
Var f1,f2,f3:text;
s1,s2,c1,c2,text1,text2:string;
i1,i2,j,code1,code2,coef1,coef2:integer;
f:Boolean;
BEGIN
ClrScr;
assign (f1,'p1.txt');
assign (f2,'p2.txt');
assign (f3,'p3.txt');
reset (f1);
rewrite (f3);
while not eof (f1) do begin
readln(f1, s1); {citeste un monom din primul polinom}
while s1[length(s1)]=' ' do s1:=copy (s1,1,length (s1)-1);
{sterge spatiile de la sfirsit}
i1:=1;
c1:='';
repeat
16
Morari Dumitru gr. C1I1
i2:=1;
c2:='';
repeat
c2:=c2+s2[i2];
inc(i2);
until s2[i2]=' ';
text2:=copy (s2,10,length (s2)-9);
val (c2,coef2,code2);
if text2=text1 then begin
coef1:=coef1+coef2;
str(coef1,c1);
s1:=c1;
for j:=1 to 9-length(s1) do s1:=s1+' ';
s1:=s1+text2;
end;
end;
if s1[1]<>'0' then writeln (f3,s1);
close (f2);
end;
close (f1);
{Etapa 2}
reset (f2);
while not eof (f2) do begin
readln (f2,s2);
while s2[length (s1)]=' ' do s2:=copy(s2,1,length (s2)-1);
{sterge spatiile de la sfirstit}
i2:=1;
c2:='';
repeat
c2:=c2+s2[i2];
inc(i2);
until s2[i2]=' ';
text2:=copy(s2,10,length (s2)-9);
f:=false;
text1:='';
reset(f1);
while (not eof(f1))and (not f) do begin
readln (f1,s1);
while s1[length (s1)]=' ' do s1:=copy(s1,1,length(s1)-1);
{sterge spatiile de la sfirsit}
i1:=1;
c1:='';
repeat
c1:=c1+s1[i1];
inc(i1);
until s1[i1]=' ';
text1:=copy(s1,10,length(s1)-9);
if text2=text1 then f:=true;
end;
if not f then writeln (f3,s2);
close(f1);
end;
close(f2);
close(f3)
END.
17