This is an old revision of the document!


Tema 3. Cartele

Responsabili: Andrei Pârvu, Emil Racec

Termen de predare: 4 decembrie 2012 23:55. Tema se va trimite prin intermediul platformei de cursuri cs.curs

Obiective: După realizarea acestei teme de casă studentul va fi capabil să:

  • lucreze cu matrice - vectori
  • lucreze modularizat
  • implementeze funcții ajutătoare

Cunoștințe necesare rezolvării acestei teme de casă:

  • lucrul cu tablouri multidimensionale
  • lucrul cu funcții
  • laboratoarele 1 - 6

Introducere

Pentru a putea intra în sediul Serviciului Central de Spionaj agenții secreți au nevoie de o cartelă de acces, care este de forma unei matrice de dimensiuni NxN. Celulele acestei cartele pot fi de două tipuri: 0 – permite lumina infraroșie a scaner-ului de cartele sa treacă sau 1 – nu permite lumina să treacă. Astfel, atunci când se introduce cartela, se formează un șablon care este comparat cu o listă de șabloane din baza de date, iar dacă se găsește cel puțin o potrivire atunci se permite accesul agentului ce a folosit cartela respectivă.

Cerința problemei

Tocmai ai fost angajat ca șef al diviziei informatice a SCS, iar prima ta cerință este să scrii un program care să verifice dacă o cartelă introdusă corespunde cu vreun șablon din baza de date. Sarcina nu este atât de simplă, deoarece când o cartelă este introdusă ea poate să fie rotită în sens trigonometric sau anti-trigonometric cu 90, 180 sau 270 de grade sau poate să fie întoarsă cu ”fața în sus” - oglindire verticală sau orizontală. Toate aceste posibile mișcări nu trebuie să influențeze validitatea unei cartele – cu alte cuvinte, daca o cartelă poate fi rotită sau oglindită astfel încât să se potrivească cu un șablon, atunci ea va fi considerată validă.
Codificăm aceste operații în felul următor:

  • T90 - rotație sens trigonometric 90 de grade
  • T180 - rotație sens trigonometric 180 de grade
  • T270 - rotație sens trigonometric 270 de grade
  • A90 - rotație sens anti-trigonometric 90 de grade
  • A180 - rotație sens anti-trigonometric 180 de grade
  • A270 - rotație sens anti-trigonometric 270 de grade
  • V - oglindire verticală
  • O - oglindire orizontală

Structura datelor de intrare și de ieșire

Datele de intrare se citesc de la tastatură, pe prima linie găsindu-se două numere întregi N - dimensiunea cartelei si a șabloanelor si M - numărul de șabloane.
Următoarele N linii descriu cartela, astfel cel de-al j-lea număr de pe a i-a astfel de linie reprezintă elementul (i, j) al cartelei. Aceste numere sunt separate printr-un spatiu, si pot fi doar 0 sau 1.
În continuare, sunt descrise cele M sabloane într-un mod asemănător cu cel de descriere al cartelei.

Programul va afișa la ecran M linii, câte una pentru fiecare șablon. Dacă al i-lea șablon nu poate fi obținut din cartela, atunci se va afisa textul “NU”. Dacă șablonul se potrivește fără să fie nevoie de vreo mutare, atunci se va afișa “IDENTIC”. Altfel trebuie afisată o listă de mutări (separate printr-un spațiu) care pot fi aplicate cartelei astfel încat să obținem șablonul. Lista de mutări NU trebuie să fie de dimensiune minimă. Mutările sunt afișate conform codificării de mai sus.

Restricții și precizări

  • 1 ≤ N ≤ 50
  • 1 ≤ M ≤ 50

Exemplu

Fie următoarea secvență de date de intrare, (matricele de NxN au fost separate printr-o linie goală doar pentru a se înțege mai ușor inputul - acestea nu vor fi prezente în fișierele de intrare din teste, respectându-se formatul descris mai sus):

3 6
0 1 0
1 0 0
0 0 1

0 0 1
1 0 0
0 1 0

1 0 0
0 1 0
0 0 1

0 1 0
0 0 1
1 0 0

0 1 0
0 0 1
1 0 0

0 1 0
1 0 0
0 0 1

0 1 0
1 0 0
0 0 1

Se va afișa la ecran:

T90
NU
V
A90
V T90
IDENTIC

Detalii de implementare

Fișierul sursă trimis de voi va trebui să se numească tema3.c (fără majuscule!). El va fi compilat folosind gcc sub Linux, astfel că indiferent de mediul de programare folosit la elaborarea programului, tema voastră va trebui să fie compilabila cu gcc. Makefile-ul folosit la compilarea temei voastre este cel folosit în cadrul Laboratorului 1, cu actualizările de rigoare.

Implementarea voastră trebuie să fie modulară; definiți-vă și folosiți cât mai multe funcții.

Datele de intrare se vor considera valide, de accea NU trebuie să faceți nici un fel de verificare asupra acestora.

Deși programul vostru va trebui să citească direct de la tastatură și să afișeze pe ecran (folosind, de exemplu, scanf și printf), puteți să citiți datele și să le scrieți în fișiere text, folosind redirectarile din consolă, fără să modificați programul. Dacă fișierul de intrare este example.in, și cel de ieșire este example.out, iar programul vostru se numește tema3, comanda la consolă va fi:

./tema3 < example.in > example.out

Dat fiind că pot exista mai multe variante corecte de a transforma cartela în unul din șabloane, testele nu vor avea un fișier de ieșire corect cu care va fi comparat outputul vostru. În schimb, va exista un verificator ce vă va simula mutările afișate de voi și va compara rezultatul final cu șablonul ce trebuie obtinut.

Observații

  • în cadrul temei NU este permis lucrul cu variabile globale
  • tema se va trimite într-o arhivă conform cu specificațiile din regulamentul general al materiei
  • tema trebuie sa aiba un aspect ingrijit si un coding-style adecvat. Un exemplu de tutorial se gaseste aici
  • din cadrul temei nu trebuie să lipsească fișierul README în care să descrieți pe scurt cum ați rezolvat tema (motivându-vă deciziile mai importante pe care le-ați luat), dar nici comentariile din cadrul codului sursă
programare-ca/laboratoare/lab14.1353225211.txt.gz · Last modified: 2012/11/18 09:53 by andrei.parvu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0