Tema 0 - First

Changelog:

  • 24.10.2024: Prelungire deadline

Responsabili:

  • Andrei-Valentin Lipan

Termen de predare:

  • Deadline soft: 24 octombrie 23:55
  • Deadline hard: 27 octombrie 23:55

Aceasta este o temă de “încălzire”. Scopul acesteia este să vă obișnuiți cu infrastructura de testare automată a temelor. Această infrastructură va fi folosită la toate temele ulterioare.

Pentru fiecare zi (24 de ore) de întârziere, se vor scădea 10 puncte din nota acordată, până la atingerea deadline-ului hard.

Întrebări

Dacă aveți nelămuriri, puteți să ne contactați pe forumul dedicat temei de casă nr. 0 sau pe canalul Temei 0.
La orice întrebare vom răspunde în maxim 24 de ore.
Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.

Atenție:

  • Citiți cu atenție tot enunțul temei.
  • Respectați întocmai regulile de încarcare a arhivei. Dacă uitați să includeți fișierele sursă sau Makefile-ul în arhivă, veți primi 0 pe temă.
  • Respectați întocmai instrucțiunile de scriere a fișierului Makefile. Checkerul folosește acest fișier pentru a vă rula tema. Dacă el nu este scris corect, veți primi 0 pe temă chiar dacă codul sursă este ok.
  • La trimiterea arhivei pe Moodle, tema vă este corectată automat, pe loc. Verificați secțiunea “Feedback” pentru a afla punctajul. Dacă vă apar erori și/sau nu apare punctajul obținut (în format numeric e.g. 85/100) înseamnă că tema voastră nu a fost rulată și veți primi 0 pe temă dacă nu rezolvați eroarea.
  • Puteți retrimite tema de oricate ori vreți înainte de expirarea deadline-ului. Se va lua în considerare numai ultima variantă trimisă.

Intro Makefile

make este un utilitar cu care putem automatiza compilarea de fișiere C, pe baza unui set de reguli descris într-un fișier numit Makefile. Un fișier Makefile este format din linii cu următoarea sintaxă: [nume-regula]: [dependente] urmată de lista de comenzi care se execută când această regulă este apelată. O regulă poate avea unul sau mai multe fișiere ca dependențe. La apelarea unei reguli, utilitarul make verifică automat dacă aceste fișiere există înainte de a executa comenzile din cadrul regulii. Dacă unul din ele nu există, atunci înainte de comenzile asociate regulii apelate se va apela automat regula cu același nume ca fișierul lipsă.

Să analizăm un exemplu de fișier Makefile:

CFLAGS=-Wall -Werror

.PHONY: clean run

run: myexe
	./myexe

myexe: main.c
	gcc main.c $(CFLAGS) -o myexe

clean:
	rm -f myexe

Avem următoarele elemente:

  • o regulă myexe care depinde de fișierul main.c. Această regulă compilează fișierul main.c si generează un executabil cu numele myexe
  • o regulă run care depinde de fișierul myexe. Această regulă rulează executabilul myexe
  • o regulă clean care șterge executabilul generat.
  • o variabilă numită CFLAGS care conține string-ul -Wall -Werror și care este folosită la compilare. În cazul în care dorim să compilăm mai multe fișiere folosind același Makefile, putem refolosi variabila în loc sa repetăm flag-urile pentru fiecare utilizare gcc.
  • o linie care marchează regulile clean și run ca reguli de tip PHONY. Asta îi spune utilitarului make că aceste reguli NU au rolul de a genera un fișier cu același nume (clean și run). Spre exemplu pentru regula run, fără mențiunea PHONY, la apelarea acestei reguli utilitarul make nu ar mai executa comenzile asociate dacă în același director ar exista un fișier numit run, deoarece ar considera că rularea regulii nu e necesară întrucât fișierul este deja generat. Dacă folosim PHONY, acea regulă se va rula mereu, chiar dacă deja există un fișier cu acel nume. Atentie: make rulează mereu o regulă dacă dependentele ei au fost modificate mai recent decât fișierul produs de către regulă. Exemplu: dacă rulăm regula myexe, chiar dacă executabilul myexe este deja generat, dacă fișierul main.c a fost modificat între timp, make va rula regula din nou (adică main.c va fi recompilat și vom obține un nou myexe, ceea ce este rezultatul dorit).

Pentru rularea unei reguli, scriem în terminal: make [nume-regula]. Exemplu:

  • pentru (re)compilarea codului și rularea executabilului: make run
  • doar pentru (re)compilarea codului: make myexe
  • pentru stergerea executabilului generat: make clean

Cerință

Task0

Scrieți un fișier Makefile care să conțină următoarele reguli obligatorii:

  • run-task1: (re)compilează și rulează codul pentru taskul 1;
  • run-task2: (re)compilează și rulează codul pentru taskul 2;
  • puteti folosi orice alte reguli suplimentare pe care le considerați necesare.

Task1 (30p)

Scrieți un program care citește de la standard input (tastatură) două numere întregi pozitive, a și b. Programul trebuie să verifice daca numărul a este divizibil cu numărul b. Daca a este divizibil cu b, se va afișa 1. În cazul contrar se va afișa 0.

Exemplu utilizare:

make clean
make run-task1
6 3
1

Task2 (60p)

Scrieți un program care citește de la standard input (tastatură) un număr întreg n. Programul trebuie să afișeze un triunghi format astfel: Pe prima linie se va afișa *, pe a doua linie * *, pe a treia linie * * * etc. și pe a n-a linie caracterul * de n ori. Pe fiecare linie caracterele * vor fi separate de cate un spațiu.

Exemplu utilizare:

make clean
make run-task2
3
*
* *
* * *

Pentru a trece la urmatoarea linie folosim caracterul newline. https://en.wikipedia.org/wiki/Escape_sequences_in_C

Coding Style

Este foarte important, pentru orice proiect, ca codul sursă să fie ușor de citit. Astfel, de-a lungul timpului, comunitatea programatorilor a agreat un set de reguli pe care programatorii trebuie să-l respecte atunci când scriu cod. Acest set de reguli poartă numele de Coding style și include directive precum:

  • utilizarea unor nume descriptive / intuitive pentru variabile care să descrie intenția utilizării variabilei - nu folosim x, folosim num_elems
  • nu utilizăm numere magice; le ținem într-o variabilă care are un nume descriptiv
  • indentăm codul
  • etc.

În funcție de echipa / compania / proiectul la care veți lucra, coding style-ul poate diferi, în funcție de ce a fost agreat anterior, și vă veți adapta acelui stil.
În cadrul cursului de programare vom folosi regulile definite de către Cpp Core Guidelines. Acestea sunt verificate în mod automat de către checker.

Validare locală temă

Pentru a vă ajuta în dezvoltarea temei, arhiva first.zip conține o copie a checkerului.

Pentru a instala dependențele necesare verificării pentru coding style utilizați scriptul install-linters.sh:

./install-linters.sh

Pentru a rula checkerul local folosiți comanda:

./check.sh

Codul sursă este compilat folosind flagurile -Wall -Werror:

  • -Wall - compilatorul va avertiza (warn) orice operații care pot genera un comportament nedefinit
  • -Werror - compilatorul va trata warningurile ca pe niște erori de compilare

Trimitere temă

Tema va fi trimisă folosind Moodle, cursul Programarea Calculatoarelor (CB & CD), activitatea “Tema 0”.

Toate temele sunt testate în mod automat pe Moodle.

Arhiva temei se va încărca folosind formularul de submisie (butonul Add submission).

Rezultatele vor fi disponibile în secțiunea Feedback - nota apare la linia Grade, iar outputul checkerului și erorile apar la sectiunea Feedback comments. Dacă apare un buton albastru în formă de plus, trebuie să dați click pe el pentru a afișa întregul output al checkerului.
Citiți cu atenție informațiile afișate în Feedback pentru a vă asigura că tema a fost rulată cu succes; o eroare comună este dată de faptul că conținutul arhivei nu respectă structura dorită (ex. fișierele sunt într-un alt director).

Punctajul final al temei este afișat la linia Grade și la finalul outputului din checker.

Conținutul arhivei trebuie să fie următorul:

  1. Fișierele .c, .h (dacă este cazul) care conțin implementarea temei.
  2. Fișierul Makefile.
  3. Un fișier README în care descrieți rezolvarea temei.

Arhiva trebuie să fie de tipul zip.

Nu includeti fisierele checkerului in arhiva voastra.

In cazul in care testele va trec local, insa pica pe vmchecker cel mai probabil aveti o sursa de “undefined behavior in cod”. Pentru a va asigura ca scapati de aceste probleme, compilati cu flagul de compilare `-Wall` si rezolvati toate warning-urile.

Listă depunctări

Lista nu este exhaustivă.

  • O temă care nu compilează și nu a rulat pe vmchecker nu va fi luată în considerare
  • O temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare
  • NU acceptăm teme copiate. În cazul unei teme copiate se scade punctajul aferent temei din punctajul total.
  • [-20.0]: Nerezolvarea tuturor erorilor și warningurilor de coding style
programare/teme_2024/tema0_2024_cbd.txt · Last modified: 2024/10/24 12:53 by andrei.lipan
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