CPA 2000-2001!

CONCURS de programare

Ediția a doua a concursului de programare organizat de Gazeta de Informatică începe în această lună. Pentru detalii referitoare la acest concurs citiți paginile următoare sau vizitați site-ul nostru: www.ginfo.ro.

Informații generale

Concursul de Programare Agora (CPA) este o competiție internațională destinată elevilor și studenților. Acest concurs este organizat de redacția GInfo și editura Computer Press Agora.

Vor fi șase runde, la fiecare dintre ele participanții trebuie să rezolve trei probleme și să trimită soluțiile prin e-mail; adresa e-mail a acestui concurs este concurs@ginfo.ro. După cele șase etape care se vor desfășura prin e-mail va fi o etapă finală care se va desfășura la Liceul de Informatică din Cluj-Napoca; doar primii zece clasați în urma primelor șase runde vor participa la faza finală. Problemele care trebuie rezolvate sunt propuse de redacția GInfo în colaborare cu studenți și profesori care se ocupă pregătirea elevilor români care participă la diferite concursuri naționale și internaționale.

Înscrierea

Pentru a participa la Concursul de Programare Agora va trebui mai întâi să vă înscrieți. Pentru a vă înscrie va trebui să trimiteți un e-mail având următoarea structură:

From: numele dumneavoastră sau adresa e-mail

To: contest@ginfo.ro

Subject: înscriere APC

și în corpul mesajului:

Nume: numele dumneavoastră

Prenume: prenumele dumneavoastră

E-mail: adresa e-mail

Oraș: orașul în care locuiți

Vă vom trimite un e-mail care va conține codul dumneavoastră de identificare (ID).

Dacă adresa CPA nu va funcționa din diferite motive, puteți încerca și una dintre următoarele adrese:

· office@ginfo.ro

· clara@cs.ubbcluj.ro

· skortzy@email.ro

· smihai@asterix.obs.utcluj.ro

Regulament

Limbajele de programare acceptate la CPA sunt Pascal și C/C++. Fișierele sursă vor fi compilate folosind Borland Pascal 7.0 sau Borland C++ 3.1.

Problemele vor apărea în paginile revistei GInfo, iar rezolvările vor trebui trimise înaintea termenului limită specificat în fiecare număr al revistei.

O singură soluție va fi acceptată pentru fiecare problemă. Dacă un concurent va trimite mai multe soluții pentru o anumită problemă numai prima soluție va fi luată în considerare, restul fiind ignorate.

Redacția GInfo își rezervă dreptul de a descalifica concurenții care trimit soluții identice (sau aproape identice).

Este interzisă folosirea de secvențe scrise în limbaj de asamblare; dacă un fișier sursă conține astfel de secvențe concurentul va primi 0 puncte pentru problema respectivă.

Este interzis ca programele generate folosind sursele concurenților să modifice timer-ul. Concurenții care vor încerca să modifice ceasul sistem vor fi descalificați.

Dacă aveți neclarități referitoare la enunțurile problemelor, puteți pune întrebări folosind adresa e-mail a concursului.

Nu puteți pune decât întrebări ale căror răspunsuri posibile sunt DA sau NU. Dacă răspunsul la întrebare pote fi găsit în enunțul problemei, atunci răspunsul la întrebare va fi FĂRĂ COMENTARII.

Dacă redacția GInfo consideră că răspunsul la o anumită întrebare trebuie primit de toți participanții atunci cel care a adresat întrebarea va primi răspunsul ANUNȚ GENERAL. Acest răspuns va fi urmat de un e-mail pe care îl vor primi toți participanții și care va clarifica nelămurirea.

Trimiterea soluțiilor

Pentru a trimite soluțiile de la o anumită rundă va trebui să trimiteți un e-mail având ca subiect codul dumneavoastră de identificare urmat de textul Runda X, unde X reprezintă numărul rundei (1-6). Acest e-mail va avea atașat o arhivă .zip sau .rar având numele yyyyRx.ext unde yyyy este codul dumnevoastră de identificare, x este numărul rundei, iar ext este extensia (RAR sau ZIP).

Arhiva va conține un singur director numit yyyy (codul dumneavoastră de înregistrare). Acest director trebuie să conțină patru fișiere: trei fișiere sursă corespunzătoare celor trei probleme ale rundei și un fișier .BAT care va conține liniile de comandă pe care doriți să le folosim pentru a vă compila sursele. Denumirile fișierelor sursă sunt date în descrierea problemelor, iar numele celui de-al patrulea fișier va fi ROUNDX.BAT. Din motive de securitate arhivele autoexpandabile nu sunt acceptate.

Arhiva nu poate conține nici un alt fișier sau director, deci nu puteți trimite fișiere auxiliare împreună cu fișierele sursă. Dacă programul dumneavoastră trebuie să creeze fișiere auxiliare atunci acestea vor avea extensia .TMP și trebuie șterse înaintea terminării execuției programului. Dacă această regulă nu este respectată concurentul va primi 0 puncte pentru problema corespunzătoare chiar dacă soluția este corectă. Dacă redacția GInfo consideră că un concurent pune în pericol (prin suprascrierea unor fișiere, crearea de fișiere foarte mari etc.) buna desfășurare a competiției atunci acel concurent poate fi descalificat.

Toate fișierele trimise devin proprietatea editurii Computer Press Agora și nu pot fi folosite în scopuri comerciale fără acordul scris al editurii.

Evaluarea

Pentru fiecare problemă puteți primi maximum 100 de puncte; numărul maxim de puncte pentru o anumită rundă este 300, iar pentru întreg concursul 1800. Pentru corectarea fiecărei probleme vom folosi între 5 și 20 seturi de date; dacă programul va genera un fișier de ieșire corect pentru un anumit set de date atunci concurentul va primi un număr de puncte care se va adăuga la numărul de puncte corespunzător problemei respective.

Calculatorul folosit pentru evaluare are următoarea configurație: procesor Intel PentiumTM III 500 MHz, RAM: 128 MB, HDD: 13 GB. Este garantat faptul că în timpul evaluării vor fi liberi cel puțin 300 KB de memorie convențională și cel puțin 100 MB de spațiu pe disc. Sistemul de operare folosit în timpul evaluării va fi Microsoft Windows Me (Millennium Edition). Dacă un program va efectua o operație ilegală atunci concurentul va primi 0 puncte pentru setul de date corespunzător.

Sfaturi

Programatorii în Pascal nu ar trebui să folosească niciodată unitul CRT deoarece programele lor se vor opri returnând eroarea de execuție Error 200: Division by zero. Acest fapt este cauzat de un binecunoscut bug al mediului de programare Borland Pascal 7.0; nici o problemă propusă spre rezolvare în cadrul Concursului de Programare Agora nu necesită folosirea acestui unit.

Atunci când sunt folosite anumite tipuri de date (cum ar fi Comp) modul 8087 trebuie să fie activ. Opțiunile de mediu permit setarea acestui mod ca mod implicit, dar în mod normal acest mod nu este activ. Programatorii în Pascal sunt rugați să includă în codul sursă directiva de compilare {$N+} dacă doresc să folosească tipuri de date care necesită activarea acestui mod. În caz contrar, în mometul în care vom încerca să compilăm fișierul sursă, va fi generată eroarea de compilare Error 116: Must be in 8087 mode to compile this. Pentru a vă asigura că programul se va compila exact ca pe calculatorul folosit pentru a-l scrie, apăsați CTRL+O,O. Astfel, în sursa dumneavoastră, vor fi incluse toate directivele de compilare cu opțiunile care sunt setate în mediu. Puteți modifica aceste opțiuni astfel încât să fie cele dorite de dumneavoastră. Nu vă îngrijorați dacă nu cunoașteți semnificație unor anumite directive de compilare; acestea nu vor avea efecte negative asupra execuției programului - dacă programul dumneavoastră va rula corect pe calculatorul pe care l-ați folosit pentru a-l scrie, atunci va rula corect și pe calculatorul folosit pentru evaluare.

Toate programele trebuie să citească datele de intrare din fișierul de intrare specificat. Nu ar trebui să fie așteptate date de la intrarea standard (tastatură). Dacă programul dumneavoastră va aștepta o reacție de la tastatură atunci execuția sa va fi oprită după expirarea timpului și nu veți obține nici un punct pentru acea soluție chiar dacă ea este corectă. Deci, vă rugăm să nu includeți în codul sursă secvențe ca Readln, getch(), getche() etc.

Toate programele trebuie să scrie datele de ieșire în fișierul de ieșire specificat. Puteți scrie date și la ieșirea standard, dar aceasta nu va duce decât la încetinirea programului, deci nu este recomandabil să scrieți date pe ecran. Toate datele scrise la ieșirea standard sunt ignorate în timpul evaluării. Programul de evaluare va verifica numai soluția scrisă în fișierul de ieșire specificat.

Fișierul de intrare se află întotdeauna în directorul curent; nu încercați să citiți date din alte locații. Fișierul de ieșire va trebui generat tot în directorul curent; nu scrieți date de ieșire în alte locații. Trebuie să folosiți întotdeauna denumirile specificate în enunț pentru fișierul sursă, fișierul de intrare și fișierul de ieșire. Folosirea altor denumiri va duce la funcționarea incorectă a programului.

Nu trimiteți soluții după termenul limită (indicat în fiecare număr al revistei).

Exemplu

La fiecare rundă vor fi trei probleme care trebuie rezolvate. Să presupunem că una dintre ele are următorul enunț:

Nume fișier sursă: SUMA.PAS, SUMA.C sau

SUMA.CPP

Nume fișier de intrare: SUMA.IN

Nume fișier de ieșire: SUMA.OUT

Descriere: Dându-se două numere, aflați suma lor.

Date de intrare: Fișierul de intrare conține, pe o singură linie, cele două numere separate printr-un singur spațiu.

Date de intrare: Fișierul de ieșire ar trebui să conțină suma celor două numere.

Exemplu:

SUMA.IN SUMA.OUT

2 4 6

Timp maxim de execuție: 1 secundă/test

După citirea enunțului veți începe să rezolvați problema. Veți observa că nu este clar dacă numerele sunt întregi sau reale. Pentru a clarifica acest lucru va trebui să adresați o întrebare. Aceasta nu poate fi: Numerele sunt întregi sau reale? deoarece nu se poate răspunde la ea prin DA sau NU. O soluție ar fi să întrebați: Numerele sunt întregi? Veți primi răspunsul NU și veți ști că numerele sunt reale. Acum apare o întrebare mult mai importantă: Ce precizie trebuie folosită pentru afișarea rezultatului? Se pare că redacția GInfo a uitat să precizeze acest lucru în enunț. Bineînțeles, va trebui să adresați o întrebare la care să se poată răspundă prin DA sau NU. Ați putea încerca: Este suficientă o precizie de trei zecimale? Răspunsul la întrebare va fi ANUNȚ GENERAL și va fi urmat de un alt e-mail care va conține un mesaj de genul:

Rezultatul va trebui scris cu o precizie de două zecimale. Ne cerem scuze pentru descrierea incompletă a problemei.

Sperăm să nu fim niciodată nevoiți să trimitem astfel de mesaje, dar...

După primirea anunțului general puteți începe scrierea codului sursă. O soluție corectă ar putea fi:

1: Program SUMA;

2: var a,b:Real;

3: f:Text;

4: Begin

5: Assign(f,'SUMA.IN');

6: Reset(f);

7: Readln(f,a,b);

8: Close(f);

9: Assign(f,'SUMA.OUT');

10: Rewrite(f);

11: Writeln(f,a+b:0:2);

12: Close(f)

13: End.

Numerele de la începutul fiecărei linii nu fac parte din program; ele sunt folosite pentru a ne putea referi mai ușor la o anumită linie.

Dacă veți adăuga o linie 1': uses Crt; și o linie 4': Clrscr; nu veți reuși să obțineți decât eroarea Error 200: Division by zero așa cum am explicat în secțiunea Sfaturi.

Dacă adăugați o linie 12': Readln; rezultatul evaluării va fi Time out! deoarece execuția programului nu se va termina, ci se va aștepta apăsarea tastei <ENTER>. Execuția va fi întreruptă de către programul de evaluare după o secundă.

Dacă folosiți linia 5: Assign(f,'C:\SUMA.IN'); atunci programul va funcționa corect numai dacă directorul curent este rădăcina drive-ului C: (ceea ce este foarte improbabil). Nu veți obține decât eroarea File not found.

Dacă folosiți linia 5: Assign(f,'ALTFISIER'); atunci programul nu va citi datele de intrare din fișierul specificat și va rula incorect.

Dacă folosiți linia 9: Assign(f,'C:\SUMA.OUT'); atunci programul va părea că funcționează corect dar programul de evaluare nu va găsi fișierul dumneavostră de ieșire decât dacă directorul curent este rădăcina drive-ului C: (din nou, șansele sunt foarte mici). Programul de evaluare va returna No ouput file!.

Dacă folosiți linia 9: Assign(f,'ALTFISIER'); atunci programul nu va scrie datele în fișierul de ieșire specificat, iar programul de evaluare va returna No output file!.

Dacă folosiți linia 7: Readln(a,b); atunci programul va aștepta datele de intrare de la intrarea standard și va fi întrerupt după o secundă. Puteți folosi această linie numai dacă aveți o secvență asemănătoare cu:

5: Assign(Input,'SUMA.IN');

6: Reset(Input);

7: Readln(a,b);

8: Close(Input);

Dacă folosiți linia 11: Writeln(a+b:0:2); atunci datele de ieșire vor fi scrise pe ecran și nu în fișierul de ieșire specificat. Puteți folosi această linie numai dacă secvența este de tipul:

9: Assign(Output,'SUMA.OUT');

10: Rewrite(Output);

11: Writeln(a+b:0:2);

12: Close(Output)

Acestea sunt cele mai des întâlnite erori care au apărut la prima ediție a concursului organizat de GInfo. Sperăm că nu veți face aceleași greșeli și la această ediție.

După scrierea codului sursă trebuie să trimiteți soluția împreună cu soluțiile celorlalte două probleme. Să presupunem că denumirile fișierelor sursă pentru aceste probleme sunt DIF.PAS și PRODUS.PAS. Trebuie să creați arhiva pe care o veți trimite. Această arhivă va conține un director numit yyyy unde yyyy este numărul dumneavostră de identificare (de exemplu, 2457). Veți crea directorul 2457 și veți copia în interiorul său fișierele SUMA.PAS, DIF.PAS și PRODUS.PAS. Acum trebuie creat fișierul .bat pe care îl vom folosi pentru compilarea surseor. Aceasta se va numi RUNDA1.BAT și ar putea arăta astfel:

bpc suma.pas

bpc dif.pas

bpc produs.pas

Folosiți bpc pentru compilarea surselor Pascal și bcc pentru compilarea surselor C/C++.

După crearea acestui fișier trebuie construită arhiva pe care o veți trimite. Folosiți un arhivator care creează arhive .rar sau .zip; nu creați o arhivă autoexpandabilă. Numele arhivei ar trebui să fie 2457R1.ZIP sai 2457R1.RAR.

Acum puteți trimite mesajul e-mail care va conține soluțiile. Nu uitați să atașați arhiva și să scrieți în linia Subject: 2457 Runda 1.

Atenție!!!

Nu folosiți numărul 2457 decât dacă este propriul dumneavoastră cod de identificare pentru Concursul de Programare Agora. Folosiți ID-ul dumneavoastră; am folosit 2457 doar ca un exemplu.

[cuprins]