Programarea Calculatoarelor, seria CC
Tema presupune realizarea unui utilitar pentru formatarea de fisiere sursa C cu un Coding Style clasic numit K&R (denumire ce vine de la Kernigham & Ritchie, autorii unei cărţi foarte cunoscute despre limbajul C şi anume "The C Programming Language",
pe care o puteţi găsi şi pe pagina principala a cursului de PC) şi apoi
exportarea lor în documente HTML care să poată fi afişate într-un
browser (de exemplu, Mozilla Firefox). Sursa se va numi
Pentru mai multe detalii despre ce înseamnă Coding Style consultaţi linkurile:
Programul scris de voi trebuie să poată fi folosit în
consolă pentru a formata orice fişier sursă de C. Pentru aceasta, el va
trebui să poată primi diverşi parametri în linia de comandă. Un program
scris în C poate accepta parametri din linia de comandă prin
modificarea sintaxei funcţiei
Pentru a clarifica sintaxa, iată un exemplu de program care afişează toţi parametrii pe care i-a primit în linia de comandă.
Copiaţi executabilul de mai sus într-un fişier C şi compilaţi-l folosind următoarele comenzi:
gcc fisier_sursa.c -o executabil1
gcc fisier_sursa.c -o executabil2
Rulaţi pe rând următoarele comenzi şi observaţi funcţionalitatea programului.
./executabil1 -optiune1 valoptiune1 -optiune2 valoptiune2
./executabil2 -optiune val1,val2,val3
./executabil1 -optiune val1, val2, val3
./executabil1 -optiune val1 val2 val3
./executabil2 orice string este considerat dr3pt 4r9Um3n7
./executabil1 numerele 2 si 3 sunt considerate tot stringuri
A doua etapă a programului este exportarea unui fişier sursă de C deja formatat cu un Coding Style într-o pagină în format HTML. Formatul HTML este un format standardizat prin care se specifică modul în care trebuie prezentată informaţia dintr-o pagină web. Pentru o scurtă introducere în sintaxa HTML, aveţi posibilitatea să consultaţi următoarele linkuri:
Pentru a vedea un exemplu de cum trebuie să arate un fişier HTML pentru o sursă de C anume, puteţi să generaţi unul urmând paşii de mai jos, în Linux:
Pentru folosirea funcţionalităţilor de mai sus ale
sudo apt-get install vim-full
În Fedora (sau distribuţii bazate pe RedHat) puteţi folosi comanda echivalentă
Valgrind este un instrument de debugging pentru Linux folosit pentru depistarea greșelilor de utilizare a memoriei: memory leak-uri, pointeri invalizi, folosirea unor variabile neinițializate, free-uri invalide.
Pentru a folosi
apt-get install valgrind
Pentru a rula programul în Valgrind cu tool-ul pentru memcheck folosiți:
valgrind --tool=memcheck ./formatkr parametrii
Pentru afișare leak-urilor detaliat:
valgrind --tool=memcheck --leak-check=full ./formatkr parametrii
Atenţie! Stringurile prezente în fişierul de intrare trebuie să rămână nemodificate. De exemplu, linia
Creaţi un program formatkr care primeşte în linia de comandă numele a unul sau mai multe fişiere sursă C şi formatează acele fişier aplicându-le stilul Kernighan & Ritchie.
Fişierele formatate vor avea numele
Fişierele formatate vor conţine câte o singură instrucţiune pe o linie. Instrucţiunile se termină în C cu
Atenţie! Exemplul de mai jos a fost conceput să vă atragă atenţia asupra a doar câteva dintre capcanele pe care vi le poate ridica împărţirea în linii a codului. Comentariile, dacă există, for fi lăsate nemodificate. Atenţie însă, comentariile pot conţine orice şir în interior!!
Atenţie! Se garantează că în codul fişierelor de C pe care le va formata programul scris de voi nu există instrucţiunea
splitlines.c |
# include <stdio.h>
int main () { printf("ATENTIE! Caracterele \" ; sau { } pot sa apara in stringuri"); fflush(stdin);if (1=='A') {printf("\nConditia e true!\n");}else printf("\nConditia e false!\n"/*);*/);getchar() ;return 0;} |
splitlines_neat.c |
# include <stdio.h>
int main () { printf("ATENTIE! Caracterele \" ; sau { } pot sa apara in stringuri"); fflush(stdin); if (1=='A') { printf("\nConditia e true!\n"); } else printf("\nConditia e false!\n"/*);*/); getchar() ; return 0; } |
Modificaţi programul de la punctul anterior astfel încât să introduceţi următoarea funcţionalitate: în fişierul formatat, instrucţiunile vor fi indentate (adică aliniate mai la dreapta) conform specificatiilor de stil de cod K&R.
Pentru pasul de indentare puteţi alege orice mărime (frecvent se utilizează tab-uri de 8 spaţii sau de 4 spaţii). Specificaţi în README alegerea făcută.
addindent.c |
# include <stdio.h>
int main () { printf("ATENTIE! Caracterele \" ; sau { } pot sa apara in stringuri"); fflush(stdin); if (1=='A') { printf("\nConditia e true!\n"); } else printf("\nConditia e false!\n"/*);*/); getchar() ; return 0; } |
addindent_neat.c |
# include <stdio.h>
int main () { printf("ATENTIE! Caracterele \" ; sau { } pot sa apara in stringuri"); fflush(stdin); if (1=='A') { printf("\nConditia e true!\n"); } else printf("\nConditia e false!\n"/*);*/); getchar() ; return 0; } |
Modificaţi programul de la punctul anterior astfel încât să introduceţi
următoarea funcţionalitate: în fişierul formatat, cu excepţia
aliniatului, liniile nu trebuie să conţină secvenţe de mai mult de un
spaţiu consecutiv. Se vor introduce câte un spaţiu în stânga şi în
dreapta operatorilor (
trimspaces.c |
# include <stdio.h>
int main () { printf("ATENTIE! Caracterele \" ; sau { } pot sa apara in stringuri"); printf("ATENTIE!Sir cu spatii: "); fflush(stdin); if (1=='A') { printf("\nConditia e true!\n"); } else printf("\nConditia e false!\n"/*);*/); getchar() ; //comentariu cu spatii: ; /*comentariu cu spatii: ;*/ return 0; } |
trimspaces_neat.c |
# include <stdio.h>
int main() { printf("ATENTIE! Caracterele \" ; sau { } pot sa apara in stringuri"); printf("ATENTIE!Sir cu spatii: "); fflush(stdin); if (1 == 'A') { printf("\nConditia e true!\n"); } else printf("\nConditia e false!\n"/*);*/); getchar() ; //comentariu cu spatii: ; /*comentariu cu spatii: ;*/ return 0; } |
Pornind de la
Vă reamintim despre câteva dintre modificările care trebuiesc introduse (fără a le menţiona nici pe departe pe toate):
Fişierul
sourcecode.c | sourcecode.html |
# include <stdio.h> int main() { printf("Hello world!"); return 0; } |
<html>
<body><font face="monospace"> # include <stdio.h><br> <br> int main()<br> {<br> printf("Hello world!");<br> return 0;<br> }<br> <br> </font></body> </html> |
Modificaţi programul, astfel încât să adăugaţi următoarele funcţionalităţi:
colorsourcecode.c |
# include <stdio.h> int main() { printf("//Acesta NU(!!) este un comentariu"); //Acesta este un comentariu int a,b; a = 5; b = 7; if (a + b >= 10) printf("%d",a + b); else printf("%d",b - a); return 0; } |
colorsourcecode.html |
<html> <body bgcolor="#ffffff" text="#000000"><font face="monospace"> <font color="#ff40ff"># include </font><font color="#ff6060"><stdio.h></font><br> <br> <font color="#00ff00">int</font> main()<br> {<br> printf(<font color="#ff6060">"//Acesta NU(!!) este un comentariu"</font>);<br> <font color="#8080ff">//Acesta este un comentariu</font><br> <font color="#00ff00">int</font> a,b;<br> a = <font color="#ff6060">5</font>;<br> b = <font color="#ff6060">7</font>;<br> <font color="#8A4B08"><b>if</b></font> (a + b >= <font color="#ff6060">10</font>) <br> printf(<font color="#ff6060">"%d"</font>,a + b);<br> <font color="#8A4B08"><b>else</b></font> <br> printf(<font color="#ff6060">"%d"</font>,b - a);<br> <font color="#8A4B08"><b>return</b></font> <font color="#ff6060">0</font>;<br> }<br> </font></body> </html> |
Până
în acest moment, programul accepta o listă de fişiere în linia de
comandă şi le formata în mod implicit pe toate, cu nume generate prin
adăugarea sufixului
./formatkr <sursa_intrare> -o <sursa_iesire> -h <fisier_html>
./formatkr <sursa_intrare> -h <fisier_html> -o <sursa_iesire>
./formatkr -o <sursa_iesire> <sursa_intrare> -h <fisier_html>
./formatkr -o <sursa_iesire> -h <fisier_html> <sursa_intrare>
./formatkr -h <fisier_html> <sursa_intrare> -o <sursa_iesire>
./formatkr -h <fisier_html> -o <sursa_iesire> <sursa_intrare>
Fie
./formatkr <sursa_intrare> -h <fisier_html>
./formatkr <sursa_intrare> -o <sursa_iesire>
./formatkr <sursa_intrare>
Observaţie! Dacă argumentele primite de program nu corespund cu vreounul din formatele de mai sus, atunci se afişează mesajul
Observaţie!
Dacă formatul comenzii este corect, dar vreo unul dintre fişierele care
trebuie formatate este inexistent, atunci se afişează mesajul
Modificaţi programul, astfel încât acesta să poată primi o opţiune suplimentară
Observaţie! Mare atenţie la stringurile care apar în program. Următoarele linii de cod NU conţin comentarii:
printf("//Acesta NU este un comentariu!");
printf("inceput /* Acesta NU este un comentariu!*/ sfarsit");
Modificaţi programul, astfel încât numele de tipuri de date definite de utilizator, precum şi numele de funcţii definite de utilizator să apară în pagina HTML cu Italic.
Modificaţi programul, astfel încât acesta să accepte şi un argument