Informatica clasa IX Notiuni introductive si structuri de control

Informatica- domeniu dedicat crearii de algoritmi si programe utile in gestionarea tehnicii de calcul .Algoritmii pot fi creați pentru operarea unor baze de date , crearea și analizarea  unor modele ale unor situații reale cu algoritmi predictivi ,analiza și clasificarea unor date specifice.


Algoritmul - format din pasi (etape) este destinat rezolvarii unei categorii de probleme ; are caracteristici : generalitate, finitudine , claritate .
Se reprezinta algoritmii prin scheme logice , limbaj de programare , pseudocod, formalisme matematice .
Pseudocodul - este o descriere a algoritmului in limbaj natural cu cuvinte cheie precum : start , stop , daca , altfel , atunci , scrie, citeste , atribuie , pentru, cat timp , repeta , executa .
Transcrierea algoritmului daca sunt utilizate corect aceste cuvinte in cod sursa este foarte simpla . Există din perioada când se puneau bazele informaticii ca domeniu o teoremă cunoscută ca teoremă Bohm-Jacopini ce demonstrează că un algoritm se poate scrie doar cu structuri secvențiale , structura alternativa cât timp și structuri decizionale.
Structuri liniare(secventiale) 

  1. scrie    cin>>
  2. citeste   cout<<
  3. atribuie  =
  4. instructiunea compusa  {                   }
  5. Citirea se face de la tastatură când introducem valori ale variabilelor , din fișiere , din fluxuri de date ( eventual prin comunicație în rețea așa cum se întâmplă dacă se transmit datele unui formular web către un script php ). Scriptul citește datele formularului.
  6. Scrierea este realizata prin afișaj pe display , prin scriere în fișiere , transmiterea de date prin fluxuri de date , trimiterea unor date în diverse protocoale în rețea .
  7. Atribuirea are ca efect atribuirea valorii sau a unei evaluări a membrului din dreapta către cel din stânga .
Structuri decizionale (numite si structuri alternative sau selective)

daca conditie atunci instr;  selectia simpla 
daca conditie  atunci instr1 altfel instr 2; selectia duala 

În programe apare adesea selecția multiplă , dar aceasta este de fapt alcătuită din mai multe structuri selective simple si eventual duale. În C++ se operează cu instr switch(selector) { case val1 : instr 1 ; case val2:instr2; ...else instr ;}
#include<stdio.h>
#include<iostream.h>
int i,j;
int  main()
{

cout<< "i=";
cin>>i;
cout<< "j=";
cin>>j;
if(i=j)cout<<i;
else cout<<j; return 0;}


Programul citeste i si j si il afiseaza pe cel mai mare dintre i si j . Main e funcția principala , practic instrucțiunile sale se execută in ordinea în care apar . 
Aceste programe sunt realizate pentru stilul de programare in care avem un singur fir de execuție și acela în logica execuției strict secvențiale după ordinea in care avem instructiunile  în funcția Main .
În programele de rețea se lucrează de regulă cu fire multiple de executie - multithread.



Structurile repetitive 

-structura repetitiva cu contor  
pentru i de la  val_initiala la valoare_finala executa
 instr ;   
-structura repetitiva cu test initial 
cat timp conditie executa instr ;
-structura repetitiva cu test final 
repeta instr pana când conditie;

Test practic - REDACTATI programul CMMDC 

#include<iostream.h>

int a[10],n,i,j;
int  main()

{

cout<<"nr=";cin>>n;for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<n;i++)
while(a[i]!=a[i+1])
{if(a[i]>a[i+1])  a[i]=a[i] -a[i+1];
if (a[i]<a[i+1]) a[i+1]=a[i+1]-a[i];
}
cout<<a[n]<<"    este    cmmdc";
return 0 ;
}
 EXPLICATIE Avem in n numarul de numere -exemplu 3 . In ”vectorul” a vom introduce pe rand 7,21 si 42 si vom obtine pentru cmmdc valoarea 7.Elementele vectorului a sunt comparate doua cate 2 .Se scade din numarul mai mare numarul mai mic până când devin egale . Variabile sunt a,n,i,j.
INCERCATI SA SCRIETI ALGORTMUL IN PSEUDOCOD pentru programul de mai sus .


NOTIUNI TEORETICE NECESARE IN REALIZAREA ALGORITMILOR 
%-operatia modulo ofera restul la impartirea intreaga 




Teste la clasa 
test1
Pentru itemul 1, scrieţi pe foaia de examen litera corespunzătoare răspunsului corect.
1. Variabila x este de tip real. Care dintre următoarele expresii C/C++ are valoarea 1 dacă şi
numai dacă numărul real memorat în variabila x aparţine intervalului (5,8]? (1p.)
a. (x<8) && (x>=5) b. (x<=8) || (x>5)
c. (x>8) || (x<=5) d. (x<=8) && (x>5)
Scrieţi  răspunsul pentru fiecare dintre cerinţele următoare.
2. Se consideră algoritmul alăturat, descris în pseudocod.
citeşte n (număr natural)
z=0
p=1
┌cât timp n>0 execută
│ c=n%10
│ n=[n/10]
│┌dacă c%3=0 atunci
││ z=z+p*(9-c)
││ p=p*10
│└■
└■
scrie z
S-a notat cu x%y restul împărţirii numărului întreg x la numărul
întreg nenul y şi cu [a] partea întreagă a numărului real a.
a) Scrieţi valoarea care se va afişa dacă se citeşte
n=103456. (3p.)
b) Scrieţi toate numere naturale impare, distincte, fiecare
având exact două cifre, care pot fi citite pentru variabila
n astfel încât să se afişeze valoarea 3. (2p.)
c) Scrieţi în pseudocod un algoritm, echivalent cu cel dat,
în care să se înlocuiască structura cât timp...execută
cu o structură repetitivă de alt tip. (2p.)

2p (of)

Rezolvare:
La 1 avem raspuns corect b si d
la 2 a) se face un tabel 

n
c
z
p

103456
6
0
1

10345

3
10

1034
5



103
4




3
63
100

10
0
963
1000

1
1



0






Cel mai probabil afiseaza 963  
2 b)  pt n=16 observam 
n
c
z
p

16

0
1

1
6
3
10

0
1




























presupunem ca daca prima cifra nu e diviz cu 3 dar ultima e 6 avem f probabil valorile 
16,26,46,56,76,86

c) citeşte n (număr natural)
z=0
p=1
daca n>0 atunci 
┌repeta 
│ c=n%10
│ n=[n/10]
│┌dacă c%3=0 atunci
││ z=z+p*(9-c)
││ p=p*10
│└■
 pana cand(n=0)
scrie z

S-a inlocuit instructiunea repetitiva cu test initial cu cea cu test final.
Intrebari
1.  Observati ca am inlocuit instr repetitiva cu test initial cu instr repetitiva cu test final !
TEST
De ce se pune inaintea instructiunii repetitive cu test final o instructiune conditionala cu exact aceeasi conditie ca in instr repetitiva cu test initial?
2.Mentionati numele variabilelor intalnite in algoritm
3.Mai sus avem doua modalitati diferite de reprezentare  a algoritmilor . Care sunt ?
4.Ce inseamna % , &&, ||, [ ] in algoritmul de mai sus ? 

TEST VERIFICARE 
Pentru itemul 1, scrieţi pe caiet litera corespunzătoare răspunsului corect.
1. Care dintre următoarele expresii C/C++, are ca valoare cel mai mic dintre numerele
naturale nenule, cu cel mult 4 cifre fiecare, memorate în variabilele întregi x şi y? (4p.)
a. (x+y-abs(x-y))/2 b. x+y-abs(x-y)/2
c. (x+y+abs(x-y))/2 d. (x+y+abs(x+y))/2
Scrieţi pe caiet răspunsul pentru fiecare dintre cerinţele următoare.
2. Se consideră algoritmul alăturat, descris în pseudocod:
S-a notat cu [c] partea întreagă a numărului real c, iar cu a%b
restul împărţirii numărului întreg a la numărul întreg nenul b.
a) Scrieţi valoarea care se afişează, în urma executării
algoritmului, dacă se citeşte numărul 9321. 
b) Scrieţi o valoare care poate fi citită pentru n astfel încât
să se afişeze valoarea 11. 
c) Scrieţi în pseudocod un algoritm echivalent cu cel dat în
care să se înlocuiască structura cât timp ... execută
cu o structură repetitivă cu test final. 
citeşte n (număr natural)
s=-1
┌cât timp n>0 execută
│┌dacă n%10>s atunci
││ s=n%10
││altfel
││ s=11
│└■
│ n=[n/10]
└■
scrie s


Rezolvare cerinta b

citeşte n (număr natural)
s=-1
┌cât timp n>0 execută
│┌dacă n%10>s atunci
││ s=n%10
││altfel
││ s=11
│└■
│ n=[n/10]
└■
scrie s


s=11 cerinta b

n=? 100,200,50,250………



n
s
100
-1
10
0
1
11
0
11
















REZOLVARE la cerinta c

citeşte n (număr natural)
s=-1

daca n>0 atunci
┌repeta
│┌dacă n%10>s atunci
││ s=n%10
││altfel
││ s=11
│└■
│ n=[n/10]
└■pana cand n<=0
scrie s



Tema : ce afiseaza pt n=321 ?

Algoritmi cu secvente numerice



sunt  cei de sortare , cautare , extragere dintr-un sir a cifrelor impare , pare etc

1. Suma cifrelor impare ale unui numar n>0


#include<iostream.h>
int n,s;
void main()
{
s=0;
do {
    cout<<"n=";cin>>n;
    } while(n<=0);
    while(n>0)
    {
    if((n%10)%2==1) s=s+n%10;
    n=n/10;
    }
    cout<<"suma cif impare= "<<s;
    }

VECTORII

                       - sunt alcatuiti dintr-o insiruire de elemente de acelasi   fel

                   -elementele (fiecare in parte) sunt asociate unor indici   

EXEMPLU  INT A[10];
                    INDICII SUNT 0....9

                    Elementele sunt A[0]......A[9]

                    Evident A este vector!

2. Se cere un algoritm pentru a inversa un sir alfanumeric.
Obs . Avem nevoie sa declaram vectori .In fapt un sir e un vector de caractere.
E rezolvat si la TIC cu o pagina web  data ca exemplu !!
Algoritmul(pseudocod)
declaram n,i intregi
s[20] ca sir de caractere ,c caracter
citeste s
n<--lungimea lui s     //exista instructiune in C++pt lung. de sir  
pentru i de la 0 la n/2
     { x=s[i];
        s[i]=s[n-i-1];
        s[n-i-1]=x;
     }
scrie s ;
In C++ in CODEBLOCKS :
#include <iostream>
#include<string.h>
using namespace std;
int n,i;
char s[20],x;
int main()
{
   cout<<"s=";
   cin>>s;
n=strlen(s);
cout<<n;
for(i=0;i<n/2;i++)
     { x=s[i];
        s[i]=s[n-i-1];
        s[n-i-1]=x;
     }
cout<<"sir inv="<< s ;
       return 0;
}

3. SORTAREA UNUI SIR DE NUMERE (stocate într-un vector)
Algoritm pseudocod(bubblesort)
IMPORTANT! Indicii unui vector C++ se numerotează începând cu 0 .
Declară a[10], n,i j,,x intregi
citeste n
pentru i de la 0 la n-1 { citeste a[i ]
                                 pentru j de la 0 la i-1 daca a[i ]<a[j] atunci
                                  { x=a[i]
                                     a[i]=a[j]
                                     a[j ]=x;
                                  }
                               }
pentru i de la 0 la n-1  scrie a[i]
                                
IN C++ , editat si rulat in CODEBLOCKS cu compilator MINGW C++ :
#include <iostream>
using namespace std;
int n,i,j,a[10],x;
int main()
{
    cout<<"sortarea e crescatoare-dati n ! " << endl;
    cin>>n;
    for(i=0;i<n;i++){ cout<<"a["<<i<<"]=";cin>>a[i];
    for(j=0;j<i;j++) if(a[i]<a[j]){x=a[i];
                                   a[i]=a[j];
                                   a[j]=x;
                                   }
    }
    cout<<endl<<"vectorul sortat este"<<endl;
    for (i=0;i<n;i++) cout<<a[i]<<endl;

    return 0;
}
 Se cere ca tema  :
  • explicatii sub forma unui eseu de 10 propozitii


ALGORITMI simpli tratati in pseudocod si in limbajul C++ 
1. Se cere suma tuturor numerelor intregi  din intervalul [a,b] , a<b cu a si b intregi 
2. Se dau x si y . Se cere algoritm pentru calculul mediei aritmetice 
Subiectul 2 ramane pt testare 

REZOLVARE
1.
 declara i, s, a si b intregi 
    citeste a si b 
s=0
pentru i de la a la b s=s+i
scrie i

#include<iostream>
using  namespace std; 
int a, b , i , s;
int main ()
{
cin >>a>>b;
s=0;
for(i=a;i<=b;i++) s=s+i;
cout<<i;
return 0;
}