miercuri, 27 mai 2020

Daca vrei sa iti gasim documentele !

Pentru toti care ne trimit documente

Stim ca vi se pare redundant dar ca sa va gasim rapid atat email-urile cat si documentele atasate dupa descarcare, adaugati atat in Subject-ul de la e-mail cat si in numele fisierului informatiile dupa care puteti fi cautat, dvs sau documentele:


ASA DA:

Subject: Plata diferenta Popescu George - TIAI 2 - Microprocesoare pt 31-02-2020


ASA NU:
Subject: Plata diferenta


ASA DA:

Atasam fisierul:  Microprocesoare-Popescu George TIAI 2 -confirmare-diferenta.png

Cu cat mai multe informatii: Facultate, Domeniu de studii, An, Materia, data examenului, NUME PRENUME, cu atat mai bine !

ASA NU:

Atasam fisierul:  confirmare-diferenta.png


Lipseste numele personei, grupul/grupa, si alte informatii utile.


Suntem de acord cu dumneavoastra ca o cautare de 10 minute ne-ar permite sa aflam toate datele, cu exceptia cazului cand cautarea da REZULTATE MULTIPLE, ceea ce se intampla la nume frecvente.

Dar pentru 70 de cereri acest lucru ne-ar consuma 700 de minute adica peste 10 ore pe care nu le avem.

Va multumim pentru intelegere si va rugam
ca in loc sa consumati 10 minute ca sa va plingeti ca cererile nu va sunt
prompt si corect procesate, sa contribuiti la aceasta promptitudine scriind cat mai complet Subject-ul la e-mail-uri si numele de fisiere.




Medii de programare / IPDP

Indicatii de instalare software pt  IPDP si Medii de programare

Instalati IDE-ul Gambas pe Linux. Este cam la fel cu Visual Basic 6, adica ambele sunt instrumente de programare vizuala.

Exista un manual pe Ibiblio, cautati Gambas .pdf.

http://distro.ibiblio.org/vectorlinux/Uelsk8s/GAMBAS/gambas-beginner-guide.pdf

Cautati pe net How to install gambas on Ubuntu, dar luati varianta gambas3 nu varianta daily build, ceea ce va presupune sa schimbati ultimul cuvant cheie din comanda de instalare pe care ati fi gasit-o cautand pe net.

Comenzile de instalare pt Ubuntu, ar fi deci asa:

sudo add-apt-repository ppa://gambas-team/gambas3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gambas3

La Fedora Linux folositi instalatorul:
yum install ... sau
dnf install ....

La Suse Linux folositi:
yast2  ....

Dati un forward al acestor explicatii si la colegi !

miercuri, 20 mai 2020

luni, 18 mai 2020

LFA - TI si INFO

Buna ziua,

Astazi facem pregatire pentru exmen sub forma unor Assignments pe Teams,
cu subiecte din subiectele anilor precedenti.

Teams - Trecem pe Teams

De azi trecem pe Teams ca sa putem face simulari de examen sa putem da teste si exercitii. Veti primi cunoscutele Assignments.

Insist sa participe toata lumea, imi rezerv dreptul de a pune note care sa faca parte (sau nu) din nota finala.

Licenta

Buna ziua,

Intrucat am de acordat notele la practica de licenta,
studentii indrumati de mine sunt rugati sa trimita lucrarea de licenta si sa astepte crearea unui grup de Teams care sa ii includa pe toti, astfel ca sa putem si altfel comunica (decat am facut-o pina acum).

Daca o trimiteti pe e-mail puneti la subiect: Licenta si Nume si titlu ca sa fiti usor de gasit.

Dan

vineri, 15 mai 2020

Retele de calculatoare -IFR -Laborator S13


Buna ziua,

Astazi facem o serie de experimente de simulare de retele,
Veti primi pe e-mail o carte de lucrari de laborator si un simulator
de retelistica pentru Linux, Ubuntu, pe nume CORE.

1) Intai am sa va trimit pe e-mail materialele.
2) Apoi voi da niste indicatii de instalare.

Ok, v-am trimis software-ul CORE in doua versiuni
si un script de descarcare a acelor pachete.

SCRIPT DE DESCARCARE

#!/bin/sh
wget -c http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com/pool/universe/c/core-network/core-network_4.8-1_all.deb
wget -c http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com/pool/universe/c/core-network/core-network-daemon_4.8-1_i386.deb
wget -c http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com/pool/universe/c/core-network/core-network-gui_4.8-1_all.deb

wget -c http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com/pool/universe/c/core-network/core-network-daemon_4.6-2_amd64.deb
wget -c http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com/pool/universe/c/core-network/core-network-gui_4.6-2_amd64.deb

wget -c http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com/pool/universe/c/core-network/core-network-daemon_4.8-1_amd64.deb

Salvati seria de comenzi de mai sus intr-un fisier, dati-i permisiuni de executie si rulati-l din terminal.

Cam asa ruleaza, din terminal, nu e impresionant dar descarca totul.

Ca alternativa puteti merge la aceasta adresa:
De aici puteti  sa descarcati pachetele necesare.

Ce pachete sa instalati: In principiu trebuie sa:
- alegeti arhitectura: i386 sau amd64 (acum cam toate comp noi sunt pe 64 biti)
In cazul meu am ales amd64
- Identificati fisierele necesare, in cazul meu am ales:

Pachetele de instalat pe un Ubuntu, versiunea pe 64 de biti.

INSTALAREA

Pur si simplu dati click pe rand pe cele doua pachete, gui-ul si daemonul, se va deschide programul de instalare:

Apasati pe butonul Install, va trebui sa apara o bara orizontala indicand progresul instalarii.
Va trebui sa faceti aceasta pentru ambele pachete.

TESTAREA INSTALARII

Daca totul a mers bine ar trebui sa gasiti CORE printre programele instalate deja. Dati click pe cele 9 puncte de pe toolbar/taskbar.
Programul CORE are ca simbol bulina verde , aV-a de pe randul al 3-lea din img.

RULAREA PROGRAMULUI

Dati click pe "bulina verde de mai sus" si veti obtine  fereastra programului.
 Pe bara laterala cu instrumente gasiti  seturi de dispozitive de retea.
Daca dati click pe computer, al 3 lea de jos, va aparea o lista de dispozitive inclusiv computerul, dati click pe dispozitivul dorit pentru a alege tipul lui si apoi dati click pe fundal pentru a-l pozitiona.

Sa incepem:

Puneti doua computere si un cablu de legatura intre ele:

Acum sa pornim simularea retelei (apropos, asigurati-va ca ati instalat cat mai multe unelte de lucru in retea: tcpdump, inet-utils, host, dig , traceroute, tshark, ping, nmap, etc).

PORNIREA SIMULATORULUI

Apasati pe butonul verde de sus, CORE face niste verificari.
Daca totul e ok, apare verde ! :)

Acum puteti sa deschideti console pe dispozitive si sa lansati diferite comenzi in mod text, de exemplu:

a) Pentru a vedea configuratia:
- ifconfig
- route

b) Pentru a lansa trafic in retea:
- ping  (trimite acele ICMP-uri)

- dar si alte comenzi

c) Pentru a vedea ce fel de trafic a sosit:
- tcpdump  (are o multime de alte optiuni sa stiti)
- tshark

LUCRATI PRACTIC

Click dreapta pe n1 , folositi -> Shell -> bash, apare o fereastra:




La fel procedati pentru al doilea computer, cel cu adresa 10.0.0.21

Exercitiu:
In prima fereastra tastati: ping 10.0.0.21, lansand ICMP-uri catre al doilea.


In a doua tastati: tshark , pentru a vedea cum vin ping-urile si pleaca raspunsurile, reply.


Din acest moment, sunteti gata sa faceti TOATE experimentele din prima parte, (Cap 1-8) a cartii pe care ati primit-o si sa obserati cum pleaca traficul de retea prin routere, hub-uri si switch-uri.

Pastrati in portofoliul dvs imaginile de pe desktop din timpul rularii experimentelor si fisierele in format .imn, rezultate din salvare.

Pauza.

Pentru examen pregatiti SI arhiva cu fisiere .imn si imaginile de ecran ale experimentelor, capturate cu ALT-Printscreen sau KSnapshot.

Spor la lucru !


Nota: Pentru detalii despre comenzile:
-route  (afiseaza tabela de rutare a nucleului Linux)
-ping  (trimite un ICMP - ping pt a obtine un raspuns, poreclit pong)
-netstat (arata starea conexiunilor, incercati  netstat -poanta, intr-o consola reala Linux, nu pe simulator)
-tcpdump (sniffer simplu care afiseaza traficul de retea)
-tshark (la fel)


puteti folosi un manula de Linux sau comanda man.

joi, 14 mai 2020

Qt - Saptamana a 13-a Laborator

Qt - Saptamana a 13-a Laborator



Pentru cei care s-au incurcat in codul ceasului, (o fi oare din cauza saptamani a 13-a), va transcriu aici sursele finale , in varianta care ruleaza pe Qt 5.9

Fisierul: main.cpp

//------------------------ main.cpp----------------------------------------//
#include <QApplication>
#include <QLCDNumber> // pt QT 5.x Linux Ubuntu
#include <QTimer>     // Includeti si QTimer
#include "digitalclock.h"
int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  DigitalClock clock;

  #if defined(Q_OS_SYMBIAN)
     clock.showMaximized();
  #else
     clock.show();
  #endif
  return app.exec();
}
//----------------------------------------------------------------------------//


Fisierul:digitalclock.h
#ifndef DIGITALCLOCK_H
#define DIGITALCLOCK_H
#include <QLCDNumber>

class DigitalClock : public QLCDNumber
{
    Q_OBJECT
public:
    DigitalClock(QWidget * parent = 0);
private slots:
    void showTime();
};

#endif // DIGITALCLOCK_H


Fisierul:digitalclock.cpp

 //----------------------- digitalclock.cpp------------------------------------//
#include <QtGui>
#include <QLCDNumber>
#include <QTimer>

#include "digitalclock.h"
//! [0]
DigitalClock::DigitalClock(QWidget *parent)
  : QLCDNumber(parent)
{
    setSegmentStyle(Filled);

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
    timer->start(1000);

    showTime();
    setWindowTitle(tr("Digital Clock"));
    resize(150, 60);
}
//! [0]


//! [1]
void DigitalClock::showTime()
//! [1] //! [2]
{
  QTime time = QTime::currentTime();
  QString text = time.toString("hh:mm");
  if ((time.second() % 2) == 0)
    text[2] =  ' ';
  display(text);
}
//! [2]


//-----------------------------------------------------------//


Si licenta:

/**********************************************************************
******
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** ”Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
** the names of its contributors may be used to endorse or promote
** products derived from this software without specific prior written
** permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
AND CONTRIBUTORS
** ”AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, IN-
CLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABI-
LITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (IN-
CLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
168CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.”
** $QT_END_LICENSE$
***********************************************************************
*******/
Licența comună a celor trei fișiere, pe care avem obligația să o repro-
ducem.


Retele de calculatoare IFR


Pentru IFR, retele.

Studiati:

cisco.ctcnvk.ro/RS1Romana/course/module1/  -> pina la ultimul modul ca exista si 2 ....10...11.

Veti mai primi indicatii si materiale.

Qt - Saptamana a 13-a Cap 12 + 13 in avans trimis

Buna ziua,

Bun venit la intalnirea cu Qt-ul din saptamana a XIII-a.

Ce ne propunem astazi:

1) Intai sa va trimit capitolul de azi al cartii.
Cei dintre dvs care nu au trimis portofoliul de lucrari de laborator, directoare arhivate,sunt rugati (elegant spus) sa isi faca lucrarile de laborator si sa le trimita pe e-mail la adresa cunoscuta.

2) Ne ocupam azi sa vedem utilizarea unei clase noi de obiecte Qt, cele care se ocupa cu timpul: QTimer si QTime.

3) Ce se mai poate face ... poate si meniuri ... vom vedea.

Va rog sa asteptati venirea capitolului .pdf pe e-mail.

Ok, ati primit e-mail-urile. Acum sa studiem impreuna Cap 12.
Ca de obicei voi comenta cele scrise...

Deschideti la pagina: [pg 159].
Ati gasit care sunt noutatile promise ale capitolului ?
Dar lucrurile deja stiute ?

Care sunt noutatile promise ale capitolului ?
R: Deocamdata ne propunem sa lucram in Qt 5, ceva care foloseste clasele QTimer si QTime. Paranteza din titlu sugera ca sunt doua clase diferite.

Dar lucrurile deja stiute ?
R: Organizarea de proiect, o gasiti la pagina urmatoare: [pg 160]
- avem de facut un program care foloseste o clasa al carui nume s-ar traduce prin "ceasdigital", digitalclock, si care se prezinta sub forma a doua fisiere:
- digitalclock.h
- digitalclock.cpp
Vom folosi aceasta clasa mai departe.

Dati pagina la [pg 160].
Cam asa va arata proiectul nostru in lucru, iar sus gasiti imaginea interfetei.


     In esenta e un afisaj pe mai multi digiti, 
in stil QLCDNumber vom vedea cati si cum facut.

Ne pregatim sa incepem proiectul, dati pagina la [pg 161]. Cititi-o !

Haideti sa incercam sa il facem din mers... printre comentarii... deschideti Qt Creator-ul !

Incepeti un nou proiect:


 Sa fie de tipul Empt Qmake Project, si dati-i un nume sugestiv:

Urmeaza Next,Next,Finish.
Si ne apucam de editat fisierul .pro.

Ceea ce aveti in manual este fisierul .pro in forma finala, deocamdata incepeti cu un fisier .pro de forma:

TEMPLATE = app
TARGET = QTDigitalClock
QT += core gui
QT += widgets
HEADERS +=
SOURCES +=

Intrebare de control:
Ce inseamna fiecare dintre randurile de mai sus ?

Intrebare de control:
La ce versiune de Qt nu este nevoie de toate ?

Intrebare de control:
La ce varianta a Qt-ului , pentru ce SO, am recomandat sa le folositi pe toate 1

Deocamdata ar trebui sa aveti un proiect care arata cam asa:


Si este momentul sa adaugam in proiect calsele de obiecte necesare:

Folositi fereastra aceasta !

Intrebare de control:
Daca nu v-am fi spus, cum se justifica alegerea celor doua optiuni marcate cu albastru ?

Acum dati pagina la pagin 162-163 si cititi declaratia de clasa de la pagina 163 de sus!

#include <QLCDNumber>

class DigitalClock : public QLCDNumber
{
    Q_OBJECT
public:
    DigitalClock(QWidget *parent = 0);
private slots:
    void showTime();
};


Intrebare de control:
Ce ne spune randul acesta ?

class DigitalClock : public QLCDNumber
Raspuns: Ne indica faptul ca am derivat, imposibil sa nu stiti notiunea, clasa noastra  DigitalClock in mod public din clasa QLCDNumber !

Acset lucru il puteti indica in fereastra urmatoare:


Apoi, Next, Next, Finish. OK ?

Ar trebui acum sa completati codul declaratiei clasei DigitalClock, dar atentie, scrieti-l fireste in digitalclock.h !  In prim plan va aparea digitalclock.cpp ! Dati click pe digitalclock.h in arborele proiectului !

Si ajungeti aici !

Completati declaratia clasei !

Aici observati o chestie draguta, cel putin la Qt 5.9 1 Cand adaugati : QWidget * parent = 0 apare un beculet minuscul dupa finalul randului, indicand o sugestie. Dati click pe el si vi se adauga in implementarea clasei, si parametrii declarati, deja in fisierul .h.



Reveniti la declaratia clasei, din manual  [pg 163] si observati ca mai avem ceva de adaugat ! Slotul privat !

Este prima oara cand intalnim un slot privat ! Asta inseamna ca va exista ceva inauntrul clasei care va trimite semnale ce vor fi receptionate pe acest slot !

Intrebare de control:
Ce semnale vin dinauntrul unui ceas ?
Indicatie: Daca aveti un ceas mecanic, puneti-l la ureche ! :))

Si la ce va folosi, foarte probabil slotul ? Ati inteles !
Pina la urma este chiar perfect normal:

#include <QLCDNumber>

class DigitalClock : public QLCDNumber
{
    Q_OBJECT
public:
    DigitalClock(QWidget *parent = 0);
private slots:
    void showTime();

 };

Intrebare de control:
Cum se numeste metoda, (aka functia inclusa in clasa, pentru cei care au uitat trermenul de metoda) care va fi apelata regulat, la fiecare semnal care vine pe slot ? Sare in ochi nu ?

#include <QLCDNumber>

class DigitalClock : public QLCDNumber
{
    Q_OBJECT
public:
    DigitalClock(QWidget *parent = 0);
private slots:
    void showTime();

 };

Nu uitati acest ";" final, lipsa lui poate duce la erori de compilare urate.

Acum ca ati adaugat slotul, imaginea ar fi asa:


Acum, cititi va rog explicatiile de la pg [163-164]. Va las cateva minute cu ele...
Urmeaza sa continuam cu implementarea clasei.

Acum dati la pagina 165 sa citim despre implementarea clasei.

Implementarea este formata din m

ai multe parti:
Chiar de la inceput includem tot ce e nevoie:

//----------------------- digitalclock.cpp------------------------------------//
#include <QtGui>
#include ”digitalclock.h”
//! [0]


Observati ca headerul este deja inclus, de cand am creat impreuna fiseirele .h si .cpp ale clasei.


 Se aduga acum constructorul clasei, acea metoda care, stiti voi, are numele clasei si se ocupa cu toate initializarile necesare obiectelor din acea clasa (recapitulez !!).

DigitalClock::DigitalClock(QWidget *parent)
: QLCDNumber(parent)
{
  setSegmentStyle(Filled);
  QTimer *timer = new QTimer(this);
  connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
  timer->start(1000);
  showTime();
  setWindowTitle(tr(”Digital Clock”));
  resize(150, 60);
}
//! [0]

Intrebari de control:
- De unde , din ce clasa, este luata si apelata metoda: setSegmentStyle(Filled);
- Nu cumva ar fi fost mai bine sa declaram variabila timer ca atribut in clasa de obiecte si nu ca variabila locala ? Avantaje si dezavantaje ale acestor abordari ?
- Era neaparat nevoie sa se apeleze direct showTime() ?
- Ce face setWindowTitle(tr(”Digital Clock”)); ? Evident, nu !
- Ce credeti ca face : timer->start(1000); ?
- Cum obtineti explicatii despre clasa QTimer ? Apasati F1 sau Fn+F1 ! Incercati !

Dati pagina: [pg 166] cititi explicatiile.

//! [1]
void DigitalClock::showTime()
//! [1] //! [2]
{
  QTime time = QTime::currentTime();
  QString text = time.toString(”hh:mm”);
  if ((time.second() % 2) == 0)
    text[2] =  ́ ́;;
  display(text);
}
//! [2]

Intrebari de control:
- De ce este scris: QTime::currentTime(); ?
- Carei claseii apartine metoda toString(”hh:mm”); ?
- Care simbol din ceea ce ar fi, generic ora: hh:mm este inlocuit cu spatiu, cand se intra pe ramura "then" a if-ului ?
- Din ce clasa provine metoda  display ?
 
Dati pagina la [pg 167].
Adaugati in proiect un fisier .cpp pe nume main .cpp !

Acesta este un C++ source file ! Numiti fisierul main.cpp, Next,Next,Finish.

Intrebare de control :
Prin ce difera aceasta adaugare de adaugarea unei clase ?

Cititi cu atentie explicatiile de la [pg 167] !!!

//------------------------ main.cpp----------------------------------------//
#include <QApplication>
#include <QLCDNumber> // pt QT 5.x Linux Ubuntu
#include ”digitalclock.h”
int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  DigitalClock clock;
  #if defined(Q_OS_SYMBIAN)
     clock.showMaximized();
  #else
     clock.show();
  #endif
  return app.exec();
}
//----------------------------------------------------------------------------//

Cateva indicatii de lucru:
- Atentie la ghilimelele stringurilor ! Puneti ghilimele de program, nu de acelea de Office, superioare si inferioare, ca in carte ! Corectati !
- Sa nu va sperie mesajele de eroare !
- Daca un rand cu o metoda sau o constanta apare scris cu negru, este foarte probabil sa fie nevoie sa includeti clasa respectiva, deoarece nu este inclusa !
- Adaugati in digitalclock.cpp headerele claselor folosite:
#include <QLCDNumber>
#include <QTimer>
- Corectati ghilimelele de la randul: #include ”digitalclock.h”

- Daca ceasul nu functineaza, si ramane blocat, cu mesajul
QObject::connect: No such slot QLCDNumber::showTime()
puteti suspecta:
-- o nepotrivire intre numele semnalului si al slotului.(Nu aici.)
--Este posibil ca mesajul sa apara din lipsa macroului Q_OBJECT in declaratia de clasa din fisierul .h! 
--Si nu uitati sa includeti clasa de baza, aici QLCDNumber, in fisierul .h.
Altfel de unde si-ar putea lua clasa din care va deriva clasa ceasurilor ?



- Pe sistemul meu, QT-ul ma invata ca pot folosi niste macrouri, pentru setarile de scalare, ceea ce este util cand dezvoltati aplicatiii mobile.
Warning: QT_DEVICE_PIXEL_RATIO is deprecated. Instead use:
QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-screen factors.
QT_SCREEN_SCALE_FACTORS to set per-screen factors.
QT_SCALE_FACTOR to set the application global scale factor.

Dupa pauza "intram in laborator" si depanam aplicatia ...

Ghinionisti cei care ... caz in care va trebui ceva reprogramat. Ruleaza pe Linux cu Qt 5.5.1.

O alta varianta de implementare. Sursele complete: Qt 5.9

//------------------------ main.cpp----------------------------------------//#include <QApplication>
#include <QLCDNumber> // pt QT 5.x Linux Ubuntu
#include <QTimer>     // Includeti si QTimer
#include "digitalclock.h"
int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  DigitalClock clock;

  QTimer *timer = new QTimer(&clock);
  DigitalClock::connect(timer, SIGNAL(timeout()), &clock, SLOT(showTime()));
  timer->start(1000);

  #if defined(Q_OS_SYMBIAN)
     clock.showMaximized();
  #else
     clock.show();
  #endif
  return app.exec();
}

//----------------------------------------------------------------------------//


Remarcati Timerul adus in programul principal si noua declaratie a conexiunii.

// -- digitalclock.h---//

#ifndef DIGITALCLOCK_H
#define DIGITALCLOCK_H
#include <QLCDNumber>

class DigitalClock : public QLCDNumber
{
    Q_OBJECT
public:
    DigitalClock(QWidget * parent = 0);
private slots:                           
    void showTime();
};

#endif // DIGITALCLOCK_H


//----------------------------------//

//----------------------- digitalclock.cpp------------------------------------//
#include <QtGui>
#include <QLCDNumber>
#include <QTimer>

#include "digitalclock.h"
//! [0]
DigitalClock::DigitalClock(QWidget *parent)
  : QLCDNumber(parent)
{
    setSegmentStyle(Filled);

    //QTimer *timer = new QTimer(this);
    //connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
    //timer->start(1000);


    showTime();
    setWindowTitle(tr("Digital Clock"));
    resize(150, 60);
}
//! [0]


//! [1]
void DigitalClock::showTime()
//! [1] //! [2]
{
  QTime time = QTime::currentTime();
  QString text = time.toString("hh:mm");
  if ((time.second() % 2) == 0)
    text[2] =  ' ';
  display(text);
}
//! [2]



//----------------------------------//

Remarcati Timerul scos din clasa ceasului.


Intrebare de control:
- Timerul poate fi scos din Ceas si pus in main. Este mai eleganta aceasta solutie ? De ce da, de ce nu ?

Exercitiu:Cum adaugati si un mic buton de [Quit] pe interfata ceasului ?

Pentru un listing complet al solutiei, aveti o postare mai noua: Qt - Saptamana a 13-a Laborator.


Sfarsit.

miercuri, 13 mai 2020

LFA si Compilatoare Recapitulare

Buna ziua,

Este practic ultima intalnire cu fiecare semigrupa de laborator de compilatoare.

Voi face doar o recapitulare, marcand principalele idei pe care le-am intalnit
in aceste ore.

REC. DIN PARTEA DE CONSTRUCTIE A COMPILATOARELOR

Revedeti va rog urmatoarele elemente, asigurati-va ca le-ati inteles si le-ati studiat.

Cap 1: Compilatorul
- Ideea de translator de limbaje, de compilator  [ pg8]
- Nevoia de a folosi o definitie inductiva, pentru  procesul de traducere [pg9]
- Notiunea de sintaxa a unui limbaj - se leaga de gramatici
- Definitia compilatorului [pg10]
- Componentele compilatorului si rolul acestora [pg 10-11-12]
- Notiunea de interpretor [pg 12]
- Limbajul Simple [pg 14-15-16] cu instructiunile si declaratiile lui

Cap 2: Parserul
- Notiunea de analizor sintactic = parser (din eng. parse=a parcurge) [pg 17]
- Cele 3 sectiuni ale fisierului pentru Yacc/Bison
- %start, %token, %left, %right - semnificatiile lor  [pg 18]
- Relatia intre %start si gramatica limbajului
- Sintaxa limbajului Simple in formatul Bison-ului
- Functii importante: yyparse() , yyerror() si rolul lor.
- Forma functiei main() la un compilator [pg 20]
- Cum arata fisierul pentru Yacc/Bison [pg24]
- Intelegeti ce alte fisiere genereaza Bison/Yacc din acest fisier

Cap 3. Scanerul
- Ce face un analizor lexical, adica un scanner [pg 25]
- Cele trei sectiuni ale fisierului pentru Flex/Lex [pg 25-26]
- Macrouri Lex/Flex cu expresii regulare: Ex. DIGIT, ID [pg 26 - 27]
- Sectiunea cu sabloane si acolade cu instructiuni de executat
- Cum comunica Flex/Lex Bisonului ce atom a gasit ?
- Scrierea expresiilor regulare pentru Lex/Flex [pg 28]
- procesarea fisierelor Lex [pg 29]
- Constructia compilatorului, [pg 30] si anexa 2.
- Exemplu de fisier Lex/Flex [pg 31-32]

Cap 4. Contextul
-De ce are nevoie un compilator de o tabela de simboluri ? [pg 33]
-Cea mai simpla tabela de simboluri posibila [pg 34]
-Functii pentru a accesa aceasta tabela, functii care le apeleaza pe acestea [pg 34-35]
- Cum arata o implementare [pg 36-37]
- Modificari ale parserului si scanerului ca sa manipuleze corect simbolurile din tabela (aka. denumirile variabilelor,etc) [pg 38-42]
- Implementarea [pg 43-46] pina la Cap 5.

Cap 5. Optimizarea
- Optimizari posibile
- Daca le-ar face programatorii
- si daca le face compilatorul.
- Transformari de arbori, cautati va rog fisele pozate si trimise pe e-mail.

Cap 6. Masina virtuala [aprox pg 50->60]
- Rolul unei masini virtuale, in acest caz
- Masina virtuala cu stiva [pg 52]
- Registrii procesorului
- Instructiunile [pg 53-54-55]
- Functionarea, initializarea si bucla fetch-execute (adu si executa)
-  Implementarea

Cap 7. Generarea codului
- Traducerea diferitelor feluri de instructiuni
- Traducerea expreiilor
- Functii  necesare generatorului de cod [pg 64]
- Modificari ale tabelei de simboluri ca sa contina adresele variabilelor
- Modificari ale parserului ca sa genereze codul
- Exemple de cod generat pentru diferite programe (pe blog)
- Modificarile scannerului ca sa transmita si constantele [pg 72/sau 74 - depinde de editie] Functia pentru afisarea codului.

Va rog cititi, informativ, si Cap 8,9 si 10.

Sfarsit.
Recap la LFA va fi luni.

luni, 11 mai 2020

Licenta - Disertatie

Am primit nota si va informez la randul meu:

"Studentii trebuie sa trimita pana saptamana viitoare (cel tarziu)
ceea ce au lucrat pana acum la lucrarea de licenta/disertatie, urmand sa primeasca o nota la colocviul de Elaborare a lucrarii de licenta/disertatiei."

Subject-ul va fi de forma

Licenta - INFO - Gr 231- POPESCU ION -  Titlul

Altfel riscati sa nu va fie gasita Licenta in cutia postala a indrumatorului atunci cand va fi cautata.

Va amintesc ca pentru trimiterea unui mesaj si ajungerea lui la destinatie este responsabil expeditorul, care trebuie sa se asigure ca mesajul sau a ajuns, si nu a ajuns doar in cutria postala, unde se poate sa fie pierdut din cauza numarului mare de mesaje cu subiecte anapoda, ci a si fost procesat. Nu ezitati sa telefonati, in caz de mare neclaritate care nu poate fi rezolvata altfel.

Pentru toate "desincronizarile" nu asteptati implicit ca problema sa se rezolve, va invit de pe acum, actionati. Inclusiv verificati in UMS, aparitia tuturor notelor.

Sefii de grupe sunt "rugati" sa propage mesajul acesta mai departe!

LFA - S13

Buna ziua si bun venit la noua intalnire cu
teoria formala (aka matematica) a limbajelor (si cea a automatelor)

La inceput strigam catalogul, pardon trimitem invitatiile la participare.
Acum pregatiti va rog manualul profesorului M. Limbaje formale si teoria automatelor. Am ramas la pagina 79.

Amintiti-va contextul discutiilor noastre. Incercam sa gasim o modalitate de a introduce automatele, dispozitive de verificare a textelor, in limbajele de programare, dar acest lucru era oarecum problematic.
Automatele erau usor de DESENAT, oarecum dificil de programat si am propus pentru ele:
- o reprezentare a multimilor de texte la aparteneta de care putea fi verificat un text: multimile regulare
- o reprezentare a acestor multimi regulare sub forma de: expresii regulare

Aceste expresii regulare, semanand la forma cu expresiile aritmetice, se pot scrie in limbajele de programare. De altfel limbajele de programare includ expresiile aritmetice.

Si aceste expresii regulare se pot transforma usor in automate ! Vedeti tabela de la pagina 78. 
(Mda ' acestea sunt automate cu epsilon-tranziti, dar am demonstrat mai inainte ca ele sunt echivalente cu cele clasice si se pot transforma in cele clasice. Un computer ar sti sa faca asta, programat fiind.)

Numai ca noi avem problema inversa:  Am desenat un automat care ne prinde bine la validat, la verificat niste stringuri, ceeea ce e usor de facut sub forma de desen, si ne-ar trebui expresia regulara.

Avem de facut doua lucruri:
-1. De demonstrat ca in general o asemenea expresie exista. Teorema este in esenta cea de la pagina 79 si atentie, cel mai usor se citeste aceasta pagina intai de sus in jos, o vom comenta impreuna.
-2. Intrucat metoda din teorema este dificila computational, ar cere sa construim un intreg set indexat de multimi regulare si expresii regulare (nu zic nu, exista in teoria algoritmilor asa algoritmi, la capitolul programare dinamica)ne-ar trebui o metoda mai practica, mai rapida, chiar daca DEPENDENTA de problema. Adica nu e un algoritm universal, dar sa mearga repede.
Metoda o gasim in manual la pagina 81. [pg 81].
Se bazeaza pe un fel de formula a rezolvarii ecuatiei de gradul intai (nici macar de garadul al doilea) din universul expresiilor regulare, o gasiti la pagina 80, in chenarul de jos.
Pg 80, jos: Rezolvarea ec. de gradul I, in lumea expresiilor regulare, nu in lumea numerelor.

Sa incepem !

3.2 Determinarea expresiilor regulare [pg 79]

Pare socant, dar mie mi se pare ca pagina aceasta se citeste cel mai bine de jos in sus. Daca nu ma credeti, cititi formula pentru "R indice ij indice superior k", 
Rijk
doua randuri mai jos de unde scrie: Metoda 1. Simtiti ca ati priceput ceva ? Pariez ca nu. 

Sa mergem la baza paginii. Citim impreuna ultimul paragraf: Ziceti dupa mine:
"Limbajul acceptat de automatul M se poate specifica cu ajutorul expresiei regulare
rij1+ rij2n + .. + rijpn
unde F = { qj1  ,  qj2   ...  qjp   }    ... scuzati softul de bloging ca nu scrie bine formule cu indici.

" Am inchis ghilimelele.

Ati inteles ceva mai mult ? Se poate intelege cevaa mai mult ? Eu zic ca da.
Fiti atenti pas cu pas:
- Are automatul mai multe stari finale ! In numar de p. Posibil, Da.
- Sa pp ca ar avea numai cate una din ele pe rand.
- Ar fi atunci mai multe automate cu o stare finala. Da ?
- Fiecare ar accepta o multime (n.n. regulara) de cuvinte.
- Fiecare automat de mai sus ar fi transformabil intr-o expresie regulara.
- Daca expresiile s-ar scrie si le-am calcula ca fiind  acele
rij1n
cu indici de la "j 1" la "j p"atunci intregul automat, care si-ar putea sfarsi functionarea SAU in prima stare finala qj1  SAU in urmatoarea, ce expresie
regulara echivalenta ar avea ?
Daca e cu SAU ?
Sau inseamna reuniune, inseamna + (uneori notat | ) la expresii regulare !
Deci ?

r1j1+ r1j2n + .. + r1jp

Dar cum sa construim aceste multimi "r indice inferior i j indice superior  n" ?
rij1n

Si ce este cu acesti indici ?
Sa intelegem impreuna. Sa vedeti ca se poate intelege !!

rij1n


Ce sunt indicii acestui rij n , doi sunt jos , deci de acelasi fel, unul este sus.

1)Despre cel de  sus va dau eu raspunsul, este un fel de indice n ca la inductie, care creste pas cu pas, dar creste doar pina la n. Cine este n ? Este ceva finit la un automat !
Ce era finit la un automat ?
Numarul de stari ! |Q| = n. Despre el este vorba, si concluzia este ca vom construi acele r indice ....... printr-un fel de inductie dupa n, numarul nodurilor, starilor din automat care participa la constructia multimilor si expresiilor.

Ok. deci n e un fel de indice de inductie, in intervalul 0 - n. 0 = nr de elemente din multimea vida, deci la constructie vor participa ... cum zero stari ? Trebuie sa mai fie niste stari pe undeva. Ca din nimic nu construim nimic - decat cel putin in fizica cuantica. Este momentul ...

Sa ne uitam la indicii de jos: 

2) Al doilea  acel j indice 1 isi tradeaza usor semnificatia, este indicele unei stari (in particular al unei stari din F, dar modul de numerotare sugereaza ca sunt posibili si alti de j.).
Prin similitudine, si primul indice i, este tot al unei stari din automat. Dar la noi , la suma cautata este egal cu 1. Corectati !

Cine este starea 1 ? Starea initiala de la care plecam. Cine sunt acele stari J1 pina la Jp ? Starile in care ajung.

Exact aceasta este ideea constructiei: 

Sa construim printr-un fel de inductie finita acele expresii regulare (si bineinteles si multimile regulare se pot construi analog):

rijunde


i = indicele starii initiale din care plec
j = indicele starii finale in care ajung
k = indicele k dupa care fac inductia

Ne trebuie formula inductiva:  Iat-o ?

rijk = rikk-1 ( rkkk-1 )+ rkjk-1
+ rijk-1
Dar cum o intelegem:
 rijk
adica "Expresia r care coresp drumurilor in automat de la starea i la starea j prin stari de indice cel mult = cu k" este
rikk-1 ( rkkk-1 )+ rkjk-1
produsul a trei expresii, semn ca stringul este concatenare a trei stringuri...


+rijk-1

sau "r care coresp drumurilor in automat de la starea i la starea j prin stari de indice cel mult = cu k-1".

Ia sa ne gandim un pic cum ajungem de la starea i la starea j, prin noduri de indice maxim k, inductie dupa k, cand trec de la k-1 la k ! Stim rijk-1
adica felul cum ajung de la i la j prin noduri / satri de indice maxim k-1. Acum mai apare nodul k.

(i)                   (k)                     (j)   
  |                                             /|\
  |                                              |
  |                                              |
  ----------------......------------------------
                           rijk-1

Decocamdata de la i la j pot ajunge direct, cum spune ipoteza de inductie, prin noduri intermediare de indice cel mult k-1 si acestor drumuri prin graf le corespunde  rijk-1 

Acum apare se inodul de indice k, starea k, si astfel apar mai multe variante de a  ajunge de la i la j, de data aceasta via k.
             
          rikk-1
(i) ------------->  (k)                     (j)   
  |                                             /|\
  |                                              |
  |                                              |
  ----------------......------------------------
                           rijk-1
Primul pas ar fi sa ajung de la i la k, cf ip de inductie, cu stari de indice cel mult k-1 deci rikk-1

Dar drumul nu s-a sfarsit, am ajuns abia in K. Si stringul va fi mai lung.

Din (k) as putea sa ajung direct in j (dar vom mai vedea ca se poate sa mai si batem pasul pe loc tot prin k).

             
          rikk-1                              rkjk-1
(i) ------------->  (k) ----------------> (j)   
  |                                             /|\
  |                                              |
  |                                              |
  ----------------......------------------------
                           rijk-1
Dar sa nu ne grabim, drumurile de la i la j prin k pot fi ceva mai complicate, nu doar :
- din i in k si
- din k in j
Se poate si sa "batem pasul pe loc" plecand si revenind in k de cate ori vrem, ca si cum ar fi o bucla pe k.
             
          rikk-1                              rkjk-1
(i) ------------->  (k) ----------------> (j)   
  |                   /   |\                     /|\
  |                  /       \                    |
  |                   --------   (rkkk-1 )*    |
  ----------------......------------------------
                           rijk-1

In concluzie, drumurile de la i la j prin k pot fi ceva mai complicate:
- din i in k si
- din k in k de cate ori vrem    (vedeti ca * inseamna repetarea !)
- din k in j
Cee ce ar da nastere ls trei stringuri concatenate, sau trei expresii regulare facute produs.

Acum daca va uitati la diagrama de mai sus, o copii, si la formula, legatura incepe sa se vada:

             
          rikk-1                              rkjk-1
(i) ------------->  (k) ----------------> (j)   
  |                   /   |\                     /|\
  |                  /       \                    |
  |                   --------   (rkkk-1 )*    |
  ----------------......------------------------
                           rijk-1


rijk = rikk-1 ( rkkk-1 )+ rkjk-1
+ rijk-1

Si acum hai sa vedem cum incepe inductia:  De la k=0.

rij0 = a1 +...+ aj + ai +...+ ak        - aici indicii pot fi variati si se mai aduna si un + X.
Cum pentru drumurile de la i la j cu indic e0 sus nu luam in considerare si alte noduri, stari, intermediare, e clar ca vor conta doar acele litere a pentru care
 delta ( qi ,a) =  qj

 ceea ce se scrie:   δ ( qi ,a) =  qj
Si toti acesti a cu diferiti indici se aduna pentru a forma expresia rij indice 0 si se mai aduna si ceva notat cu X.

De unde provine acest ceva, X, si cine este el.

Sunt situatii cand i = j, in acest caz am si stringul vid, "", epsilon, acceptat pe drumul de zero pasi de la i la j.

Deci:
daca i = j  atunci X = epsilon.
iar daca i <> j atunci X = multimea vida. (Stiti voi, se noteza cu "fi mare").

Sa trecem acum la multimile regulare echivalente expresiilor.
La mijlocul paginii 79 [pg 79], gasiti formula T(M) a multimii regulare care corespunde automatului.

Ati gasit-o ? Ati gasit si greseala de tipar ?

Mai departe, de la mijlocul paginii [pg 79] in sus, toata povestea se repeta, dar de data aceasta gandim in multimi regulare.

Aveti 15 minute pentru citit pg 79, da, de la jumatate in sus !
Acum v-ati "prins" de ce incepe astfel cu constructia multimilor Rij ?
 
Ati inteles de ce am notat cu X nu cu A multimea cu alternativa, acolada X= { ... ?

Acum dati pagina la pagina 80. [pg 80]

Aici gasiti metoda a II-a , de rezolvare in particular.
 Cititi prima parte a paginii 80.

Care este ideea ?
Ne interesau niste expresii regulare atasate nodurilor din graf, adica starilor din autoamat : Le notam cu niste litere mari, ca pe necunoscute: X,Y, Z, vedeti la pg 82, este o figura, Reveniti la pagina 81, ...... sau le putem nota, tot ca pe niste necunoscute dar cu majuscule de la inceputul alfabetului: A, B, C vedeti la pg 81. In ambele locuri, pe diagrame.

Ati gasit diagramele de la pg 81, 82, cu necunoscutele puse linga stari ?

Bun, ne pregatim sa facem un sistem de ecuatii, pentru fiecare astfel de automat. Am gasit necunoscutele. dar cum se scriu ecuatiile ?

Daca am avea undeva:
              a
(X)  <---------- (Y)

Este clar ca atunci cand ajung in X via Y mai trebuie sa concatenez o litera de a.

Deci cumva X = .... + Ya

daca am fi avut doua arce de la Y la X cu a si a' pe arc, am fi avut doua moduri, cu SAU intre ele de a ajunge de la  Y la X.

Si atunci : X = .... ceva .... + Y(a+b).  Ceva-ul spune ca mai sunt si alte moduri de a ajunge in X, nu numai via Y.  Iar  + ul dintre a si b spune ca pot sa ajung in doua moduri, cu SAU intre ele, din Y in X, dar stringul s eva lungi de la cel parcurs pina in Y cu un a sau cu un b.
Intr-adevar : Y(a+b) = Ya + Yb

Ok, pentru toate nodurile Xk care au arce care pleaca din ele si ajung in nodul nostru X, marcate cu literele a indice k (ak).

Gasiti suma scrisa de mana , cu sigma majuscula, la mijlocul paginii 80, putin mai jos ?

Ati gasit-o ?

Ar tebui s-o cititi: "Xi este egala cu suma dupa acei k pentru care q indice i apartine lui delta de q indice k si a indice k , suma din X indice k produs cu a indice k + un beta indice i".

Cine este beta indice i gasiti mai jos:
- este epsilon daca q indice i este starea initiala
- este Fi majuscula (exp regulara notata cu semnul multimii vide) altfel

Ati gasit formula de la pg 80 jos ? Cu acolada ?

Inainte de a da o formula de calcul pentru rezolvarea unor astfel de ecuatii, sa vedem doar cum se face un astfel de sistem:

CONSTRUCTIA SISTEMULUI PE UN EXEMPLU

Dati pagina la pagina 81:Desenati pe o foaie diagrama de pe pagina.
Starile automatului sunt notate A, B, C, ... la nevoie mai mult. Ne uitam la arce.




Cum ajung in A?
- Pai direct, fiindca e stare initiala, fara sa citesc nimic... deci epsilon:
A = ε  + ...     
sau altfel cum ?
Din C pot sa ajung in A dar se adauga un b la sirul parcurs pina in C, el devenind Cb.
Deci punand la loc cu SAU (aka +) ambele variante obtinem:
A = ε  +  Cb
Am stabilit prima ecuatie.

Cum ajung in B ?
Doar o posibilitate , din A pe arcul cu eticheta a.
Deci B = Aa
Am stabilit a doua ecuatie.

Cum ajung in C ?
In trei moduri. 
Din A pe arcul etichetat cu b, din C pe arcul, bucla, etichetat cu a, din B pe arcul etichetat cu b.
C= Ab + Ca + Bb.
Am stabilit a treia ecuatie.

Concluzia: Am un sistem cu trei ecuatii, dar se rezolva ad hoc, cum vom putea !
A = ε  +  Cb
B = Aa
C= Ab + Ca + Bb.


Pregatiri teoretice: Sistemul fiind de gradul I,avem nevoie de ecuatia de gradul intai in expresii regulare si de formula ei de rezolvare.
Dati pagina la pagina 80 jos, unde este o formula in chenar!
Cititi ultimul paragraf deasupra chenarului si chenarul.

In esenta, ecuatia, (scrieti-o si voi pe un cartonas, post-it, si puneti-l la vedere, fiindca vom da pagina si vom avea nevoie de formula)
X = Xα + β

Are solutia : X =  β α*.
Cum se memoreaza: 
Spuneti dupa mine: Solutia este "termenul liber inmultit cu coeficientul necunoscutei, iterat" sau mai usor de retinut  "termenul liber inmultit cu coeficientul necunoscutei , stelat."

Hai sa facem un exercitiu:
Z = Z(abc)* + ac(bc)*   Cat este Z ?
Ziceti formula magica:
"termenul liber inmultit cu coeficientul necunoscutei , stelat."

Si solutia este:
Z = ac(bc)* ((abc)*)* =  ac(bc)* (abc)*   fiindca  ((abc)*)* = (abc)*

Nota: solutia este unica daca 
ε nu apartine Limbajului formulei α , α fiind coeficientul necunoscutei.

Demonstratia este imediata:
Aratam ca ecuatia:
X = Xα + β
Are solutia : X =  β α*.
Calculam:  Xα + β pentru  X =  β α* :
Xα + β =   β α*α + β = β (α*α + ε) =  β (α*) = X     deoarece   (α*α + ε) = α*

SA NE INTOARCEM LA PRIMUL SISTEM:  

A = ε  +  Cb
B = Aa
C= Ab + Ca + Bb.


Starea finala a automatului este doar C, vezi diagrama, deci am fi multumiti sa aflam expresia necunoscutei C !
Dar in ecuatia a treia avem prea multe variabile, dar de una scap usor:

Fiindca B = Aa pot sa substitui acest B in ultima ecuatie:

C = Ab + Ca + Bb in care inlocuiesc B = Aa

Obtin: C = Ab + Ca + Bb = Ab + Ca + Aab = A(b+ab) +Ca
 
(Acum si pe A il pot inlocui din prima ecuatie cu C-uri.)

Obtin: C = Ab + Ca + Bb = Ab + Ca + Aab = A(b+ab) +Ca = (ε  +  Cb)(b+ab) +Cb.

Acum am o ecuatie de gradul I:  C = C alfa + beta ...... dar cat sunt alfa si beta ? Dezvoltam produsele ca sa aflam.

C = (ε  +  Cb)(b+ab) +Ca. 

C = (ε  +  Cb)(b+ab) +Ca = (b+ab) +  Cb(b+ab)  +Ca = (b+ab) +  Cbb+Cbab  +Ca = 
C( bb+bab  +a ) + (b+ab)

Atentie, se poate gresi foarte usor la calcule !!

Ecuatia este:
C =C( bb+bab  +a ) + (b+ab)

Acum rostim formula magica: 

"termenul liber inmultit cu coeficientul necunoscutei , stelat."

C =  (b+ab)( bb+bab  +a )*

Si am rezolvat pb. C era cel care ne trebuia.

Seminar:

Rezolvati cu cartea in fata, fara sa va uitati la solutie ( ea este pentru control) Exemplul 2 pg 82 si Exemplul 3 pg 83.


Rezolvati:

3.3 Probleme propuse ! pg 84 - 85 -86.

 
Ca de obicei... cat scrie la subsolul paginii continuam,
continuam.