Limbaje de programare: Tema 3

De rezolvat și predat la laboratorul din săptămâna 3

1. Numere în format hexazecimal. Scrieți o funcție care returnează valoarea unui număr natural citit de la intrare caracter cu caracter, în format hexazecimal (cifrele 0-9, A-F sau a-f).
Indicații: problema e similară cu funcția readnat de la curs. Un prim test se face pentru cifra hexazecimala (isxdigit, tot din ctype.h), apoi pentru a obține valoarea cifrei trebuie tratat diferit cazul cifrelor și al literelor (de la A la F). Cum scrierea cu litere mari sau mici nu contează se poate folosi funcția toupper din ctype.h (returnează literă mare dacă argumentul e literă mică; altfel returnează chiar litera dată ca argument) pentru a trata cele două cazuri uniform. (La fel de bine se poate folosi funcția pereche tolower).
Pentru o variantă mai simplă, presupuneți că în scriere se folosește doar un singur fel de litere (mari sau mici).

2. Rădăcina unei funcții. Găsiți, cu o aproximație dată (de exemplu 10-6), o rădăcină a unei funcții f continuă pe un interval [a, b] și care schimbă semnul pe acel interval (adică o valoare x pentru care f(x) = 0).
Rezolvați problema pentru o funcție dată (de exemplu f(x) = x2 - 3) pe care o definiți în program, și alegeți valori corespunzătoare pentru a și b (de exemplu 1 și 3).
Indicații Deoarece f(a) ≤ 0 (f(1) = 1 * 1 - 3 = -2) și f(b) ≥ 0 (f(3) = 3*3 - 3 = 6) iar funcția e continuă pe [a, b], ea va avea o rădăcină în acest interval. Problema se rezolvă înjumătățind la fiecare pas intervalul de căutare pe care funcția schimbă semnul, până când acesta devine mai mic decât precizia dată. Atunci orice punct din interval e o soluție cu precizia cerută.
Se calculează valoarea funcției în mijlocul intervalului. Dacă valoarea funcției e ≥ 0, funcția schimbă semnul pe jumătatea din stânga a intervalului. Altfel (dacă valoarea funcției la mijlocul intervalului e < 0), funcția schimbă semnul pe jumătatea din dreapta. (în exemplul dat, f(2) = 2*2 - 3, și cum f(2) ≥ 0, continuăm cu intervalul [1,2]). Ajungem astfel la aceeași problemă, dar cu intervalul redus la jumătate. Continuând să înjumătățim lungimea intervalului ajungem la cazul de bază, când putem returna orice valoare din interval (de exemplu mijlocul).
Se poate eventual testa suplimentar dacă în mijlocul intervalului, funcția are valoarea zero, și returna direct rădăcina în acest caz.


Marius Minea
Last modified: Fri Oct 5 16:30:00 EET 2012