Diferență între revizuiri ale paginii „PC Laborator 4”

De la WikiLabs
Jump to navigationJump to search
Linia 266: Linia 266:
 
<li>Dându-se un număr întreg de la tastatură, să se afișeze 0 dacă numărul este impar și 1 dacă este par.</li>
 
<li>Dându-se un număr întreg de la tastatură, să se afișeze 0 dacă numărul este impar și 1 dacă este par.</li>
 
<li>Dându-se un număr întreg de la tastatură, să se afișeze restul împărțirii numărului la 16, folosind doar operații pe biți.</li>
 
<li>Dându-se un număr întreg de la tastatură, să se afișeze restul împărțirii numărului la 16, folosind doar operații pe biți.</li>
<li>(dificil) Folosind doar operații pe biți (fără construcții condiționale), să se calculeze modulul unui număr întreg pe 32 de biți, introdus de la tastatură.</li>
+
<li><code>dificil</code> Folosind doar operații pe biți (fără construcții condiționale), să se calculeze modulul unui număr întreg pe 32 de biți, introdus de la tastatură.</li>
 
<ol>
 
<ol>

Versiunea de la data 29 octombrie 2015 12:31

Obiective

Familiarizarea cu noțiunile de bază ale limbajului C: tipuri de date, operatori, dar și folosirea corectă a acestora.

Tipuri de date

Tipurile de date fundamentale ale limbajului C sunt: caractere (char), întregi (int), numere reale reprezentate în virgulă mobilă cu simplă precizie (float), numere reale reprezentate în virgulă mobilă cu dublă precizie (double).

Tipuri fundamentale
Tip Numar de biti Domeniu
char 8 -127 ... 128
int 16 -32,768 ... 32,767
float 32 Precizie 6 zecimale
double 64 Precizie 10 zecimale
Tipurile fundamentale pot fi precedate de diferiţi modificatori. Un modificator se utilizează pentru a adapta cât mai convenabil tipul de bază la situație.

Tipuri reale(float,double) și virgulă mobilă

Observatie: Principalul dezavantaj al reprezentării în virgulă fixă este faptul că, dacă un număr nu mai încape în spaţiul de biţi rezervat, se pierd cifrele cele mai semnificative.

Un număr este reprezentat în virgulă mobilă printr-un cuvant de n biți conținând semn, mantisă și exponent sub următoarea formă:

Mantisa.jpg

Unde s este bitul de semn al numarului, cu aceeași convenție ca pentru numere in virgulă fixa(s=0 numar pozitiv si s=1 numar negativ), m este mantisa numarului, reprezentând cifrele semnificative, iar e este exponentul (puterea la care trebuie ridicata o valoare)

Valoarea numarului real reprezentat in virgula mobila este data de expresia:

<math> valoare=(-1)^s*m*(baza)^e </math>

Observatie: Mantisa trebuie să îndeplinească condiția: 1 > m >= 1/baza

Modificatori

  • signed
  • unsigned
  • long
  • short
Folosirea modificatorilor
Tip Numar de biti Domeniu
unsigned char 8 0 ... 255
unsigned long int 16 0 ... 4,294,967,295
Diferenţa dintre întregii signed şi unsigned constă în interpretarea diferită a bitului semnificativ (adică cel mai din stânga). 
Pentru un întreg signed, se va considera bitul semnificativ ca fiind bit de semn. 
Dacă acest bit este 0 atunci numărul este pozitiv iar dacă este 1 atunci este negativ.
Observatie: Bit-ul reprezintă cea mai mică unitate de informaţie dintr-un calculator. Denumirea de bit provine de la „binary digit” adică număr binar. Sistemul binar este un sistem de numeraţie unde totul se reprezintă doar cu 1 şi 0. Simbolul pentru un bit este "b",a nu se confunda cu byte "B" care reprezintă o grupare de 8 biți.

Operatori

Operatorii aritmetici:

  • + adunarea
  • - scăderea
  • * înmulţirea
  • / împărţirea (rezultatul împărţirii pentru numere reale, câtul împărţirii pentru numere întregi)
  • % modulo (restul împărţirii a două numere întregi)
  • ++ incrementarea (mărirea unei valori cu o unitate)
  • -- decrementarea (micşorarea unei valori cu o unitate)

Operatorii de incrementare/decrementare sunt folosiţi pentru creșterea/micşorarea unei valori cu o unitate.

a++ / ++a - incrementare
a-- / --a - decrementare

De asemenea se pot folosi instrucțiuni de pre sau post incrementare/decrementare.

POST-incrementare: x = a++;

x = a; 
a = a + 1;

PRE-incremenatare: x = ++a;

a = a + 1;
x = a;

Operatori relaţionali şi logici:

  • > - mai mare
  • >= -mai mare egal
  • < -mai mic
  • <= -mai mic egal
  • = -egal
  • != -diferit
  • && -si
  • || -sau
  • ! -negare

Exemplu operatori relaționari și logici

#include <stdio.h>
 
int main(){
    int a = 2, b = 6, c = 0, result;
 
    result = !(a < c) && (a < b) || (b <=c);
 
    printf("result is %d\n", result);
    return 0;
}


Operatori la nivel de bit:

Avem şase operatori la nivel de bit,aceștia se aplică tipurilor char,int,long signed/unsigned,iar rezultatul este un întreg. Operatorii la nivel de bit sunt următorii.

  • & - AND (şi logic)
  • | - OR (sau logic)
  • ^ - XOR (sau exclusiv)
  • << - deplasare la stânga
  • >> - deplasare la dreapta
  • ~ - negare la nivel de bit

Tabele de adevăr

Operator Tabel de adevăr Operator Tabel de adevăr Operator Tabel de adevăr
AND
A B A AND B
0 0 0
0 1 0
1 0 0
1 1 1
OR
A B A OR B
0 0 0
0 1 1
1 0 1
1 1 1
XOR
A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

Exemplu operator AND

Dorim să aflăm valoarea bitului de pe poziția 2 a numarului 20.Pentru a afla valorea acestui bit se poate realiza operația AND (&) între numărul dorit și un alt număr binar care are doar pe poziția dorită valoarea 1 (în cazul nostru poziția 2),astfel dacă rezultatul este diferit de 0 atunci inițial am avut bitul 1, respectiv 0 dacă bitul a fost 0.

#include <stdio.h>
 
int main(){
   int a=20;  /*  1 0 1 0 0 */
   int b=4;   /*  0 0 1 0 0 */
 
    if(a & b){/*  0 0 1 0 0*/
        printf("Rezultatul este diferit de 0\n");
    }else{
        printf("Rezultatul are valoarea 0\n");
    }
    return 0;
}

Exemplu operator de deplasare <<

Operatorii de deplasare (<< şi >>) realizează deplasarea biţilor din operandul stâng cu atâtea poziţii câte sunt indicate de operandul drept.

int a = 255;  /* 0000 0000 1111 1111*/
a = a << 3;   /* 0000 0111 1111 1000*/
Observatie: Deplasarea la stânga (<<) completează la dreapta cu 0, deci biţii din stânga se vor pierde.

Exemplu operator de negare ~

Operatorul de negare realizează complementarea biților,biții de 0 se pun 1, iar biții de 1 se pun 0.

int a = 2200;  /* 1000 1001 1000*/
a = ~a;        /* 0110 0110 0111*/

Exerciții

  1. Scrieți un program care să citească un număr în virgulă mobilă de la tastatură și să se afișeze, pe linii diferite, în hexazecimal, semnul, mantisa și exponentul. Notă: pentru a putea efectua operații pe biți, operanzii trebuie să fie de tip întreg. Astfel, pentru a interpreta un număr în virgulă mobilă ca secvență de biți, variabila trebuie sa fie de tip int, iar citirea să se facă cu template-ul "%f".
  2. Scrieți un program care să citească de la tastatură un număr întreg fără semn pe 8 biți (în bază 10) și să-l afișeze pe ecran în baza doi, folosind operatori de shiftare și mascare.
  3. Citiți de la tastatură un număr întreg cu semn, pe 32 de biți, apoi negați-l aritmetic și afișați valoarea, fără să folosiți operatorului unar "-" (folosind regulile convenției complement față de 2).
  4. Scrieți un program care să citească un număr întreg pe 8 biți de la tastatură, să numere și să afișeze câți biți de 1 și câți biți 0 are reprezentarea lui binară.
  5. Citiți de la tastatură un număr întreg n, calculați și afișați suma numerelor de la 0 la n.
  6. Citiți o valoare de temperatură în grade Celisus, și afișați pe ecran valoarea acelei temperaturi în Kelvin și grade Fahrenheit.
  7. Fie o matrice de 8 linii și 10 coloane, cu elementele numerotate de la 0 (elementul din stânga sus) la 79 (elementul din dreapta jos):
      0  1  2  3  4  5  6  7  8  9
     10 11 12 13 14 15 16 17 18 19
     ...
     70 71 72 73 74 75 76 77 78 79
    
    Dându-se de la tastatură un index n între 0 si 79, să se afișeze pe ce linie și pe ce coloană este indexul respectiv.
  8. Dându-se un număr întreg de la tastatură, să se afișeze 0 dacă numărul este impar și 1 dacă este par.
  9. Dându-se un număr întreg de la tastatură, să se afișeze restul împărțirii numărului la 16, folosind doar operații pe biți.
  10. dificil Folosind doar operații pe biți (fără construcții condiționale), să se calculeze modulul unui număr întreg pe 32 de biți, introdus de la tastatură.