Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:laboratoare:lab01 [2016/10/04 00:26]
darius.neatu [Unelte de programare]
programare:laboratoare:lab01 [2024/10/02 14:04] (current)
darius.neatu [Unelte folosite]
Line 2: Line 2:
  
 **Responsabili:​** ​ **Responsabili:​** ​
-  ​* [[rares.cheseli@stud.acs.upb.ro|Rares Cheseli (2016)]] +  * [[darius.neatu@upb.ro|Darius ​Neațu ​(2024)]]
-  ​* [[darius.neatu@cti.pub.ro|Darius ​Neatu (2016)]]+
   * [[laura.vasilescu@cti.pub.ro|Laura Vasilescu (2015)]]   * [[laura.vasilescu@cti.pub.ro|Laura Vasilescu (2015)]]
  
Line 10: Line 9:
  
 În urma parcurgerii acestui laborator studentul va fi capabil să: În urma parcurgerii acestui laborator studentul va fi capabil să:
 +  * înțeleagă ce înseamnă noțiunile de program, limbaj de programare, compilare/​interpretare
   * scrie și compileze programe simple în limbajul C   * scrie și compileze programe simple în limbajul C
-  * utilizeze ​programul ​Make pentru a compila automat programele scrise+  * utilizeze ​utilitarul ​Make pentru a compila automat programele scrise
   * utilizeze funcțiile din limbaj de citire și scriere a datelor   * utilizeze funcțiile din limbaj de citire și scriere a datelor
  
 ==== Introducere ==== ==== Introducere ====
 +**Calculatorul** este un instrument care stochează, procesează și redă date sub forma unei secvențe de zero și unu ([[https://​ro.wikipedia.org/​wiki/​Sistem_binar | un sistem binar]], despre care veți învăța mai multe semstrul acesta la Proiectare Logică și Introducere în Informatică),​ fiind utilizat pentru rezolvarea unor probleme folosind acele date. Un **program** este o înșiruire de instrucțiuni pe care calculatorul le va urma //​întocmai//​ în vederea îndeplinirii unei sarcini. Când calculatorul urmează instrucțiunile dintr-un program, spunem că //​execută//​ programul.
  
-C este un limbaj de programare structurată menit să simplifice scrierea programelor apropiate de masină. A fost creat de către Dennis Ritchie în perioada 1968-1973 și a fost dezvoltat în strânsă legatură cu sistemul de operare Unix, care a fost rescris în întregime în C. Utilizarea limbajului s-a extins cu trecerea timpului de la sisteme de operare și aplicaţii de sistem la aplicaţii generale.+Deoarece noi nu putem folosi direct sistemul binar pentru a spune unui calculator ce să facă, utilizăm un **limbaj de programare**,​ similar limbii vorbite (are o sintaxă, punctuație bine definite și cuvinte-cheie preluate în general din limba engleză) și deci ușor de asimilat. Acesta poate fi “tradus” prin compilare sau interpretare în //​cod-mașină//,​ limbajul înțeles de calculator și exprimat, în general, în binar. 
 + 
 +Compilarea (specifică limbajelor precum Java, Pascal, C - pe care îl veți folosi anul acesta la Programarea Calculatoarelor și Structuri de Date) constă în traducerea propriu-zisă de către un compilator din limbajul de programare ales în cod-mașină,​ care va fi executat direct de calculator. Interpretarea (Python, Ruby, JavaScript) implică faptul că programul nu va fi rulat direct de calculator, ci de un alt program, //​interpretor//,​ care este deja compilat în cod-mașină. 
 + 
 +//**Pentru acasă**//​ 
 +      * //Puteți gândi programul ca pe o rețetă care îți spune cum să faci un sendviș cu unt de arahide. În acest model, voi sunteți calculatorul,​ programul este rețeta, iar limbajul de programare este, desigur, limba în care este scrisă rețeta.//​ 
 +      * //​Încercați să formulați o secvență de instrucțiuni pentru a spune cuiva cum să facă un sendviș cu unt de arahide, fără să omiteți vreun pas sau să îi puneți în ordinea greșită.//​ 
 +      * //A fost ușor? V-ați amintit toți pașii? Poate ați uitat să menționați că trebuie folosit un cuțit și [[https://​www.youtube.com/​watch?​v=cDA3_5982h8| cine urmează instrucțiunile are mâinile pline de unt de arahide]]! Sigur vă veți gândi că un om nu este atât de inapt. Dar un calculator chiar este! El va face numai și numai ce îi spui să facă. Acest lucru poate fi frustrant la început, dar într-un fel este o ușurare: dacă faci totul corect, știi exact ce va face calculatorul,​ pentru că i-ai spus tu. ([[https://​en.wikiversity.org/​wiki/​Introduction_to_Programming/​About_Programming|sursa]])//​ 
 + 
 + 
 +C este un limbaj de programare structurată menit să simplifice scrierea programelor apropiate de masină. A fost creat de către Dennis Ritchie ​(care este și unul dintre creatorii sistemului Unix) în perioada 1968-1973 și a fost dezvoltat în strânsă legatură cu sistemul de operare Unix (cu care vă veți familiariza semestrul acesta prin materia Utilizarea Sistemelor de Operare), care a fost rescris în întregime în C. Utilizarea limbajului s-a extins cu trecerea timpului de la sisteme de operare și aplicaţii de sistem la aplicaţii generale.
  
 Deşi în prezent, pentru dezvoltarea aplicaţiilor complexe au fost create limbaje de nivel mai înalt (''​Java,​ C#, Python''​),​ C este în continuare foarte folosit la scrierea sistemelor de operare şi a aplicațiilor de performanţă mare sau dimensiune mică (în lumea dispozitivelor embedded). Nucleele sistemelor Windows şi Linux sunt scrise în C. Deşi în prezent, pentru dezvoltarea aplicaţiilor complexe au fost create limbaje de nivel mai înalt (''​Java,​ C#, Python''​),​ C este în continuare foarte folosit la scrierea sistemelor de operare şi a aplicațiilor de performanţă mare sau dimensiune mică (în lumea dispozitivelor embedded). Nucleele sistemelor Windows şi Linux sunt scrise în C.
 +
 +Să începem prin a analiza un program simplu scris în limbajul C, al cărui scop este să afișeze în linia de comandă mesajul “Hello, World!”:
 +<code c>
 +#include <​stdio.h>​
 +
 +int main()
 +{
 +    //Hello from my first program!
 +    printf("​Hello,​ World!\n"​);​
 +    return 0;
 +
 +</​code>​
 +
 +<note tip>​Puteți testa codul [[http://​tpcg.io/​2yCLtg|aici]]! </​note>​
 +
 +
 +Prima linie reprezintă o instrucțiune de preprocesare care spune programului să includă header-ul standard input output (stdio.h) din biblioteca C, permițând utilizarea funcțiilor de bază precum //printf, scanf, getc, puts// etc.
 +
 +Declarația int main() indică începutul funcției principale, de la care începe execuția în orice program C. Conținutul acestei funcții este încadrat de acolade {}. Conform [[https://​www.kernel.org/​doc/​html/​v4.10/​process/​coding-style.html|convenției]],​ main fiind o funcție, cele două acolade se află singure pe câte o linie. Pentru alte comenzi (if, while, do, for etc), prima acoladă se va pune pe linia comenzii.
 +
 +După fiecare comandă este obligatoriu caracterul punct și virgulă //;// pentru a indica sfârșitul comenzii. Din această cauză orice comandă în C se poate scrie pe oricâte rânduri, dar acest lucru nu este recomandat decât dacă linia respectivă ar fi extrem de lungă (peste 80 de caractere).
 +
 +Așa cum este important să scrii frumos de mână pentru ca ceilalți care citesc să înțeleagă,​ este important să scrii și cod frumos ca să fie ușor de înțeles. Există niște reguli de bază numite **coding style** pe care le găsiți pe scurt [[https://​ocw.cs.pub.ro/​courses/​programare/​coding-style|aici]].
 +
 +Textul care urmează după cele două slash-uri reprezintă un comentariu dedicat exclusiv omului, pe care compilatorul nu îl citește. Comentariile sunt în general folosite pentru a explica/​clarifica ce fac anumite părți din cod persoanei care citește codul (inclusiv celui care l-a scris!). Există două moduri de a scrie comentarii:
 +
 +<code c>
 +//​Everything on this line is a comment.
 +This text is not a comment. It would cause errors when the compiler tries to translate it.
 +/* Comments like this can be written
 +   on multiple lines */
 +</​code>​
 +
 +{{ :​programare:​laboratoare:​god_only_knows.jpg?​400 |}}
 +   
 +Ultima linie din funcția main, //return 0//; indică sfârșitul cu succes a programului în C și este obligatorie. Orice program are un exit code la sfârșitul rulării, care indică dacă programul a fost executat cu succes (acest cod este, în general, zero) sau nu (caz în care va fi returnată o altă valoare care semnifică un anumit cod de eroare). În cazul nostru, 0 este //exit// code.{{ :​programare:​laboratoare:​error.png?​400 |}}
 +
 +
  
 ==== Unelte folosite ==== ==== Unelte folosite ====
Line 31: Line 80:
  
 === Utilizare GCC === === Utilizare GCC ===
 +
 +<​note>​
 +Instrucțiuni de instalare gcc - [[https://​ocw.cs.pub.ro/​courses/​programare/​vmchecker_conf#​instalare_gccmake| Instalare gcc/make ]]
 +</​note>​
  
 Vom folosi pentru exemplificare un program simplu care tipărește la ieșirea standard un șir de caractere. Vom folosi pentru exemplificare un program simplu care tipărește la ieșirea standard un șir de caractere.
Line 37: Line 90:
 #include <​stdio.h>​ #include <​stdio.h>​
  
-int main(void) {+int main() {
   printf("​Hello from your first program!\n"​);​   printf("​Hello from your first program!\n"​);​
-  
   return 0;   return 0;
 } }
Line 72: Line 124:
  
 === Utilitarul Make === === Utilitarul Make ===
 +
 +<​note>​
 +Instrucțiuni de instalare gcc - [[https://​ocw.cs.pub.ro/​courses/​programare/​vmchecker_conf#​instalare_gccmake| Instalare gcc/make ]]
 +</​note>​
  
 Utilitarul ''​make''​ determină automat care sunt părțile unui proiect care trebuie recompilate ca urmare a operării unor modificări și declanşează comenzile necesare pentru recompilarea lor. Pentru a putea utiliza ''​make'',​ este necesar un fișier de tip ''​makefile''​ (numit de obicei ''​Makefile''​ sau ''​makefile''​) care descrie relațiile de dependenţă între diferitele fișiere din care se compune programul şi care specifică regulile de actualizare pentru fiecare fişier în parte. Utilitarul ''​make''​ determină automat care sunt părțile unui proiect care trebuie recompilate ca urmare a operării unor modificări și declanşează comenzile necesare pentru recompilarea lor. Pentru a putea utiliza ''​make'',​ este necesar un fișier de tip ''​makefile''​ (numit de obicei ''​Makefile''​ sau ''​makefile''​) care descrie relațiile de dependenţă între diferitele fișiere din care se compune programul şi care specifică regulile de actualizare pentru fiecare fişier în parte.
Line 108: Line 164:
        * [[http://​www.nano-editor.org|nano]]        * [[http://​www.nano-editor.org|nano]]
   * interfață grafică   * interfață grafică
 +       * [[https://​code.visualstudio.com/​docs/​setup/​linux | Visual Studio Code]]
 +       * [[https://​www.sublimetext.com/​ | Sublime Text]]
        * [[http://​projects.gnome.org/​gedit|gedit]]        * [[http://​projects.gnome.org/​gedit|gedit]]
        * [[http://​kate-editor.org|Kate]]        * [[http://​kate-editor.org|Kate]]
-  ​IDE +       [[https://​www.jetbrains.com/​clion|CLion]] (gratuit pentru studenți) 
-       * [[http://​www.codeblocks.org|Code::​Blocks]]+       * [[https://​www.codeblocks.org|Code::​Blocks]] 
  
 ==== Interacțiunea program-utilizator ==== ==== Interacțiunea program-utilizator ====
Line 246: Line 305:
   - Într-un director care conține fișierul ''​hello.c''​ și **nu** conține niciun fișier de tip ''​makefile''​ rulați comanda: <​code>​make hello</​code>​ Ce observați?   - Într-un director care conține fișierul ''​hello.c''​ și **nu** conține niciun fișier de tip ''​makefile''​ rulați comanda: <​code>​make hello</​code>​ Ce observați?
   - Se citește de la tastatură un număr natural în baza 10. Să se afișeze în bazele 8, 10 și 16.   - Se citește de la tastatură un număr natural în baza 10. Să se afișeze în bazele 8, 10 și 16.
-  - Să se calculeze (folosind formule matematice; nu instrucțiuni repetitive) și să se afișeze sumele:+  ​- Se citesc de la tastatură două numere reale. Să se afișeze suma, diferenta și media lor cu precizie de 5 zecimale exacte. 
 +  ​- Să se calculeze (folosind formule matematice; nu instrucțiuni repetitive) și să se afișeze sumele ​(''​n''​ se va citi de la tastatura):
     * \begin{eqnarray*}&​ & S_1 = \sum_{k=0}^n {k}\end{eqnarray*}     * \begin{eqnarray*}&​ & S_1 = \sum_{k=0}^n {k}\end{eqnarray*}
     * \begin{eqnarray*}&​ & S_2 = \sum_{k=0}^n {k^2}\end{eqnarray*}     * \begin{eqnarray*}&​ & S_2 = \sum_{k=0}^n {k^2}\end{eqnarray*}
Line 252: Line 312:
     * afișați rezultatul cu două zecimale     * afișați rezultatul cu două zecimale
     * **Atenție!** Trebuie să includeți antetul ''​math.h''​ și să compilați cu opțiunea ''​-lm''​     * **Atenție!** Trebuie să includeți antetul ''​math.h''​ și să compilați cu opțiunea ''​-lm''​
-==== Soluții ​====+  - Se citesc de la tastatură două numere reale. Să se afișeze ''​EQ''​ dacă cele două numere sunt egale cu precizie de 4 zecimale; în caz contrar se va afișa mesajul ''​NOT EQ''​. 
 + 
 +==== Extra ==== 
 +    * [[https://​github.com/​cs-pub-ro/​ComputerProgramming/​blob/​master/​Laboratories/​Lab1/​cheatsheet.pdf|Cheatsheet]] 
 <​hidden>​ <​hidden>​
 +==== Soluții ====
 +
 {{:​programare:​laboratoare:​1-solutions.zip|}} {{:​programare:​laboratoare:​1-solutions.zip|}}
 </​hidden>​ </​hidden>​
programare/laboratoare/lab01.1475529966.txt.gz · Last modified: 2016/10/04 00:26 by darius.neatu
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