Sunteți pe pagina 1din 17

Morari Dumitru gr.

C1I1

Lucru individual
la obiectul Metode netraditionale de rezolvare a problemelor de
Informatica

Tema 1. Utilizarea formulelor matematice pentru optimizarea algoritmilor


Problema 1. De la tastatură se citeşte numărul natural m. Fără a utiliza structuri ciclice,
ramificatorul sau selectorul, să se calculeze numărul de cifre ale lui m.

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

𝑟1 = (((((((𝑓(1) ∙ 10 + 𝑓(2)) ∙ 10 + 𝑓(3)) ∙ 10 + 𝑓(4)) ∙ 10 + 𝑓(5)) ∙ 10 + 𝑓(6)) ∙ 10 + 𝑓(7)) ∙ 10

+ 𝑓(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

n div 10000 mod 10)*10+


n div 100000 mod 10)*10+
n div 1000000 mod 10)*10+
n div 10000000 mod 10)*10+
n div 100000000 mod 10);
l:=trunc(ln(n)/ln(10))+1;
r:=r1 div round(exp(9–l)*ln(10)));
writeln (’ Răsturnatul numărului ’, n,’ este ’, r);
readkey;
END.

4
Morari Dumitru gr. C1I1

Problema 4. De la tastatură se citesc numerele întregi m şi n. Fără a utiliza structuri ciclice,


ramificatorul sau selectorul, să se afişeze la ecran numărul mai mare, apoi numărul mai mic
dintre cele date.
Rezolvare:
Fie m şi n soluţiile unei ecuaţii de forma 𝑥 2 + 𝑏𝑥 + 𝑐 = 0. Atunci 𝑏 = −(𝑚 + 𝑛), iar 𝑐 = 𝑚 ∙ 𝑛.
Obţinem ecuaţia 𝑥 2 − (𝑚 + 𝑛)𝑥 + 𝑚𝑛 = 0, ale cărei soluţii se calculează conform formulelor:
m + n − √(𝑚 + 𝑛)2 − 4𝑚𝑛 m + n − √(𝑚 − 𝑛)2 m + n − |m − n|
𝑥1 = = = ,
2 2 2
m+n−|m−n|
𝑥2 = . Evident 𝑥1 ≤ 𝑥2 .
2
m+n−|m−n|
Astfel, min(𝑚, 𝑛) = ; (5)
2
m+n+|m−n|
max(𝑚, 𝑛) = ; (6)
2
Formulele (5) – (6) pot fi obţinute şi altfel. Considerăm o funcţie de forma
1, 𝑎 > 𝑏,
𝑓(𝑎, 𝑏) = { (7)
0, 𝑎 < 𝑏.
Atunci 𝑚𝑎𝑥(𝑎, 𝑏) = 𝑎 ∙ 𝑓(𝑎, 𝑏) + 𝑏 ∙ 𝑓(𝑏, 𝑎), (8)
𝑚𝑖𝑛(𝑎, 𝑏) = 𝑎 ∙ 𝑓(𝑏, 𝑎) + 𝑏 ∙ 𝑓(𝑎, 𝑏). (9)
Pentru a obţine funcţia f cercetăm funcţia
𝑥 1, dacă 𝑥 > 0,
𝑔: 𝑅 ∗ → 𝑅, 𝑔(𝑥) = ={
|𝑥| −1, dacă 𝑥 < 0.
1, 𝑎 > 𝑏,
Pentru 𝑥 = 𝑎 − 𝑏 (unde (𝑎 ≠ 𝑏)obţinem: 𝑔(𝑎 − 𝑏) = {
−1, 𝑎 < 𝑏.
𝑔(𝑎−𝑏)+1 1, dacă 𝑎 > 𝑏,
Astfel 𝑓(𝑎, 𝑏) = ={
2 0, dacă 𝑎 < 𝑏.
𝑎−𝑏
+1
Prin urmare, 𝑓(𝑎, 𝑏) = |𝑎+𝑏| . (10) Substituind (10) în (8) şi (9), obţinem formulele (5) şi (6).
2

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

Tema 2. Aplicarea generatorului de numere aleatoare


Problema 1. Următorul algoritm este un joc-test de verificare a tablei înmulţirii de la 0 la 10.
Testul propune aleator 20 de înmulţiri, după care afişează nota, calculată după formula
round(Rc/2), unde Rc este numărul de răspunsuri corecte. De exemplu, pentru 10
răspunsuri corecte se va afişa nota 5, iar pentru 11 – nota 6.

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.

Problema 3. Următorul algoritm este un joc, în care calculatorul propune jucătorului să


ghicească din 10 încercări un număr natural aleator din intervalul [1, 1000]. În urma fiecărei
încercări se va afişa un mesaj care va indica dacă numărul propus de jucător este mai mare sau
mai mic decît cel generat.

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

Problema 4. Să realizăm un algoritm care simulează jocul TV “Cîmpul minunilor”. Cuvintele


sunt stocate în fisierul cuv.txt, descrierile corespunzătoare lor – în fisierul desc.txt. Conținutul
acest fișiere se criptează în fișierele cuv.db și desc.db. Generatorul se folosește pentru generarea
cuvîntului care urmează a fi ghicit.

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

3.1. Reprezentarea numerelor în calculator


Problema 1. Să realizăm un algoritm care citeşte de la tastatură un număr întreg din intervalul
[–32 768, 32 767] şi afişează la ecran reprezentarea acestui număr în calculator. Observăm că (în
confirmarea celor menţionate) calculatorul foloseşte codul complementar.

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

Tema 4. Algoritmi cu utilizarea fișierelor


Problema1. Să elaborăm un algoritm care va calcula suma a două numere mari (cu un număr
posibil de cifre mai mare decât 255.)

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

if c='7' then cif:=7 else


if c='8' then cif:=8 else
cif:=9;
end;
Function lit(q:integer):char;
begin
if q=0 then lit:='0' else
if q=1 then lit:='1' else
if q=2 then lit:='2' else
if q=3 then lit:='3' else
if q=4 then lit:='4' else
if q=5 then lit:='5' else
if q=6 then lit:='6' else
if q=7 then lit:='7' else
if q=8 then lit:='8' else
lit:='9';
end;
Function adu(a1,a2:string):string;
var r,zer:string;
l1:char;
i,j,zero,c1,c2,c:integer;
begin
r:='';zer:='0';
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);
for j:=1 to zero do insert(zer,a1,1);

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}

{in baza fisierelor text q1 si q2}


while not eof(q1) do
begin
read(q1,s);
write(f1,s);
readln(q1);
end;
close(f1);
close(q1);
while not eof(q2) do
begin
read(q2,s);
write(f2,s);
readln(q2);
end;lun:=length(s);
close(f2);
close(q2);
{Calcularea sumei a doua numere mari}
reset(f1);reset(f2);
n1:=FileSize(f1);n2:=FileSize(f2);
writeln(n1,n2);
assign(f,'suma_num.dat');
rewrite(f);
rest:=0;
for i:=n1-1 downto 0 do begin
seek(f1,i);read(f1,a);
seek(f2,i);read(f2,b);
sum:=adu(a,b);
if (i=0) and (rest<>0) then begin
str(rest,re);
write(f,sum);
write(f,re);
end
else write(f,sum);
end;
close(f1);close(f2);close(f);
reset(f);
n:=FileSize(f);
writeln(n);
assign(q,'s_numere.txt');
rewrite(q);
for i:=n-1 downto 0 do begin
seek(f,i);
read(f,a);
write(q,a);writeln(a);
writeln(q);

15
Morari Dumitru gr. C1I1

end;
close(q);close(f);
readkey;
end.

Problema 2. Adunarea polinoamelor


Să scriem un algoritm care va efectua adunarea a doua polinoame de mai multe nedeterminate.
Polinoamele pot fi oricît de mari.

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

c1:=c1+s1 [i1]; {c1-coeficientul primului polinom}


inc(i1);
until s1[i1]=' ';
text1:=copy(s1,10,length(s1)-9);
val (c1, coef1, code1);
reset (f2);
text2:='';
while (not eof (f2)) and (text1<>text2) do begin
readln (f2,s2); {citeste un monom din polinomul 2}
while s2[length (s2)]=' ' do s1:=copy(s2,1,length(s2)-1);
{sterge spatiile de la sfirsit}

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

S-ar putea să vă placă și