25 Aug 2012

Introducere C - despre funcții

Salutare tuturor!

Astăzi  vom vedea cum putem modulariza codul astfel încât să fie mult mai ușor de citit și de înțeles. Acest lucru se realizează, în principal, cu ajutorul funcțiilor, C-ul fiind prin excelență un limbaj procedural.
Funcțiile ne permit, totodată, să le reutilizăm după necesități. De exemplu, să presupunem că am făcut o funcție care verifică dacă un număr este prim. Dacă avem de rezolvat, o problemă mai complicată care necesită, la un moment dat, testarea unor numere pentru a vedea dacă ele sunt prime, atunci putem folosi funcția realizată anterior. Important este ca funcțiile să fie cât mai generale și să preia numai parametrii absolut necesari. Și pentru că am pomenit de parametrii, iată cum arată semnătura generică a unei funcții:

tip_rezultat nume_funcție(tip parametru1, tip parametru2, ...) {
    // declarații și instrucțiuni
 }

Apelarea se face în modul următor:

nume_funcție(lista parametri) daca tip_rezultat este void (adică nu întoarce nimic)
sau
variabila = nume_funcție(lista parametri) daca funcția întoarce ceva

Iar acum să modificăm ultimele exemple prezentate astfel încât programele să fie cu funcții.

1. Fiind date de la tastatură două numere întregi, să se afișeze cel mai mare divizor comun al lor. (Indiciu: Algoritmul lui Euclid)

#include <stdio.h>

int cmmdc (int a, int b) {
   int r;

   // testam cazul limita cand b este zero
   if (b == 0) {
       return a;
   }
   // aici ar fi mers un 'else', dar nu e nevoie datorita return-ului anterior
   // aici este algoritmul propriu-zis
   do{
       r = a % b;
       a = b;
       b = r;
   }while(r);

   // la final, cmmdc-ul este in 'a'
   return a;
}

int main(){
   // declaram variabilele; ele vor fi initializate automat la zero
   int a, b, c;

   printf("Introduceti primul numar: ");
   scanf("%d",&a);

   printf("Introduceti al doilea numar: ");
   scanf("%d",&b);
 
   c = cmmdc(a,b);
  
   printf("Cmmdc este %d\n",c);
  
   return 0; 
}


2. Să se verifice dacă un număr introdus de la tastatură este prim.

#include <stdio.h>

// functia va intoarce 0 (fals) sau 1 (adevarat) in functie de rezultatul testului
int e_prim(int nr){
   int i, prim = 1;
   /* pentru fiecare numar mai mic decat numarul nostru, verificam daca exista vreunul la care
   * acesta acesta din urma se imparte exact
   * s-a aratat ca nu e cazul sa verificam toate numerele, ci doar pe acelea mai mici decat nr/2
   */
   for (i = 2; i < nr/2; ++i) {
       if (nr % i == 0) {
           printf("Numarul nu este prim\n");
           prim = 0;
           break; // am gasit ca numarul nu este prim si iesim fortat din bucla; nu are sens sa continuam
       }
   } 
   return prim;
}

int main(){
   // vom folosi o variabila auxiliara pentru a putea afisa mesajul afirmativ de la sfarsit
   // pornim de la ideea ca numarul este prim
   int nr, i, prim = 1;

   printf("Introduceti numarul: ");
   scanf("%d",&nr);

   prim = e_prim(nr);

   if (prim) {
       printf ("Numarul este prim\n");
   }
   else {
      printf("Numarul nu este prim\n");
   }

   return 0;
}

23 Aug 2012

Introducere C - probleme rezolvate (3)

Salutare tuturor!

Astăzi o să vă prezint ultima parte a problemelor simple urmând ca, de data viitoare, să trecem la modularizare și alte lucruri interesante.
Pe ordinea de zi, avem tot două probleme, după cum urmează

1. Fiind date de la tastatură două numere întregi, să se afișeze cel mai mare divizor comun al lor. (Indiciu: Algoritmul lui Euclid)

#include <stdio.h>

int main(){
   // declaram variabilele; ele vor fi initializate automat la zero
   int a, b, r;

   printf("Introduceti primul numar: ");
   scanf("%d",&a);

   printf("Introduceti al doilea numar: ");
   scanf("%d",&b);

   // testam cazul limita cand b este zero
   if (b == 0) {
       printf("Cmmdc este %d\n",a);
       return 0;
   }
   // aici ar fi mers un 'else', dar nu e nevoie datorita return-ului anterior
   // aici este algoritmul propriu-zis
   do{
       r = a % b;
       a = b;
       b = r;
   }while(r);

   // la final, cmmdc-ul este in 'a'
   printf("Cmmdc este %d\n",a);

   return 0; 

}


2. Să se verifice dacă un număr introdus de la tastatură este prim.

#include <stdio.h>

int main(){
   // vom folosi o variabila auxiliara pentru a putea afisa mesajul afirmativ de la sfarsit
   // pornim de la ideea ca numarul este prim
   int nr, i, prim = 1;

   printf("Introduceti numarul: ");
   scanf("%d",&nr);

   /* pentru fiecare numar mai mic decat numarul nostru, verificam daca exista vreunul la care
   * acesta acesta din urma se imparte exact
   * s-a aratat ca nu e cazul sa verificam toate numerele, ci doar pe acelea mai mici decat nr/2
   */
   for (i = 2; i < nr/2; ++i) {
       if (nr % i == 0) {
           printf("Numarul nu este prim\n");
           prim = 0;
           break; // am gasit ca numarul nu este prim si iesim fortat din bucla; nu are sens sa continuam
       }
   }  
   // aici era corect si if (prim == 1)
   // in C, o structura de tipul if (ceva) este echivalenta cu if (ceva != 0)
   if (prim) {
       printf ("Numarul este prim\n");
   }
   return 0;
}

20 Aug 2012

Codepad, un instrument util

După cum v-ați seama deja, aș vrea să vă spun două vorbe despre Codepad.
Acesta este un compilator / interpretor online pe care îl puteți folosi pentru a vă testa programele. Aveți însă grijă la citirile de la tastatură, care nu vor fi efectuate - va trebui să inițializați de mână variabilele respective. În rest, este un instrument ușor de utilizat și util, zic eu. Suportă mai multe limbaje de programare și oferă programului vostru rulat un link pe care îl puteți partaja cu prietenii.
Codepad poate fi găsit aici.

Introducere C - probleme rezolvate (2)

Salutare,
astazi continuam seria problemelor rezolvate.

1. De la tastatură se introduce un număr real ce reprezintă măsura unui unghi în radiani. Să se scrie un program pentru conversia acestuia în grade, minute şi secunde sexagesimale.

#include <stdio.h>

// asa ne definim noi o constanta
#define PI 3.14159265

int main(){
   // definire variabile
   float radiani, gf, mf;
   int grade, minute, secunde;

   printf(“Introduceti numarul de radiani: “);
   scanf("%f", &radiani);

   /** aici avem valoare introdusa de la tastatura
   * mai trebuie sa facem calculele necesare conversiei
   * primele doua initializari sunt interesante intrucat, mai intai, calculam
   * valoarea reala (cu virgula) a expresiei, iar apoi obtinem si partea intreaga a rezultatului
   * in variabila de tip int
   */
   grade = gf = radiani * 180 / PI;
   minute = mf = (gf - g) * 60;
   secunde = (mf - m) * 60;

   printf("%f radiani inseamna %d grade %d minute %d secunde.\n", radiani, grade, minute, secunde);

   return 0;
}

2. Să se calculeze abaterea media patratică a unor valori rezultate în urma unui experiment. Formula de calcul poate fi găsită aici, la finalul primei secțiuni. Pentru usurință, aceasta poate fi puțin prelucrată făcând reducerile necesare și dând factor comun.

#include <stdio.h>
#include <math.h>

int main(){
   int n,i;
   double a, suma1 = 0, suma2 = 0, amp;
  
   printf("Introduceti numarul valorilor: ");
   scanf("%d",&n);

   for (i=0;i<n;i++) {
      printf("Introduceti valoarea %d: ",i+1);
      scanf("%lf",&a);
      suma1+=a*a;
      suma2+=a;
    }

    amp=sqrt((n * suma1 - suma2 * suma2) / (n * (n - 1)));
    printf("Abaterea medie patratica este %lf.\n",amp);
    return 0;
}

Pana data viitoare, eu va doresc numai bine.

19 Aug 2012

Adaptor USB bluetooth nu a fost detectat de Nokia PC Suite

ES-388

Adaptorul USB bluetooth cu seria ES-388 care foloseste driverul IVT BlueSoleil, prezinta o problema, nu este detectat de nokia pc suite si nici de ovi nokia. Aceata problema a fost prezentata de foarte multi utilizatori.
Motivul acestei probleme este dat de faptul ca de la versiunea 7.0 a programului nokia pc suite, stiva de drivere suportate de program nu suporta versiuni mai joase de 6.0 ale IVT BlueSoleil.
Modul cel mai simplu de rezolvare a acestei probleme este prin utilizarea unei versiuni mai vechi a programului nokia pc suite. Versiunea ce functioneaza destul de bine fiind  6.x.x.x. Sau achizionarea unei versiuni mai recente a softului dongle. 

Modul in care se poate verifica daca problema este de la driver este urmatoarea:
1.Deschidere nokia pc suite / ovi nokia 


2. Click HELP->About nokia pc suite...

3. Click pe Show system information dialog ( i ).

4. Daca driverul este recunoscut de program acesta ar trebui sa apara in lista din fereastra nou aparuta, exact ca in imaginea de mai jos. Daca nu apare atunci driverul nu a fost detectat de program si fie se updateatza driverul, fie se downgradeaza versiunea softului de transfer de date(acest acest nokia pc suite).



14 Aug 2012

Introducere C - probleme rezolvate

Salut prieteni,
astăzi începem să scriem primele noastre progrămele în C folosind noțiunile învățate anterior. Nu este greu deloc, totul este logic.

Vom trata trei probleme

1. Se citește de la tastatură un număr natural, în baza 10. Să se afișeze numărul în bazele 8, 10 si 16.

// includem libraria pentru a putea folosi functiile printf si scanf
#include<stdio.h>
int main(){
   int numar = 0; // declaram si initializam variabila in care vom salva numarul citit
   printf("Introduceti numarul: "); scanf("%d",&numar); // citirea de la tastatura
   printf("Baza 8: %o Baza 10: %d Baza 16: %X\n",numar, numar, numar);
   // am facut afisarea; la final am adaugat caracterul '\n' pentru a trece pe o linie noua 
   return 0;
}

2. Să se determine maximul și minimul dintre două numere întregi, citite de la tastatură.

#include<stdio.h>
int main(){
   int a = 0, b = 0; // declaram si initializam variabilele in care vom salva numarele citite

   // citirea de la tastatura
   printf("a="); scanf("%d",&a);
   printf("b="); scanf("%d",&b);

   // acum decizia
   if (a > b) {
      printf("Maximul este %d, iar minul este %d\n",a,b);
   }
   else if (b > a){
      printf("Maximul este %d, iar minul este %d\n",b,a);
   }
   else {
      printf("Numere sunt egale\n");
   }
   // am facut afisarea; la final am adaugat caracterul '\n' pentru a trece pe o linie noua
   return 0;
}

3. Fiind date 2 numere întregi, să se calculeze media lor aritmetică, geometrică și armonică.

#include<stdio.h>
#include<math.h>
int main(){
   // declaram si initializam variabilele in care vom salva numarele citite
   int a = 0, b = 0;
   float m_aritm, m_geom, m_arm;
 
// citirea de la tastatura
   printf("a="); scanf("%d",&a);
   printf("b="); scanf("%d",&b);

   m_aritm = (a + b) / 2.;
   m_geom =  sqrt(a * b);
   m_arm = (2. * a * b) / (a + b);
   /*
   * observati ca am folosit notatia 2. astfel incat
   * compilatorul sa stie ca vrem un rezultat de tip real (cu virgula)
   */

   printf("Media aritmetica: %f Media geometrica: %f Media armonica: %f\n",m_aritm, m_geom, m_arm);

   return 0;
}

Asta a fost pentru azi, până data viitoare eu vă doresc numai bine!

13 Aug 2012

Tur de orizont al limbajului de programare C (partea a doua)

Va salut,
continuăm astăzi seria de tutoriale legate de C și vom vedea câteva elemente pe care le vom folosi mai mereu în programele pe care le vom scrie.

1. Tipurile
Orice nume (sau variabila) trebuie să fie asociat unui tip. Principalele tipuri sunt char (variabilă caracter), short/int/long (variabilă număr întreg - cele trei tipuri diferă, de obicei, prin lungime), float/double (variabilă de tip număr real, double are precizie mai mare).

Exemple de declarații și inițializări:

int a = 10;
int b,c;
char d = 'a';
float e = 0.5;
double f = 0.123;

Paranteză: în continuare vă voi arăta cum se fac comentariile

// acesta este un comentariu pe o linieș tot ce este după caracterele // este ignorat de compilator
/*
* acesta este un comentariu bloc
* oricat de lung
*/

2. Atribuirea
Aceasta este de două feluri
  • simplă - are forma variabila1 = expresie si modifică valoarea stocată în variabila1
  • compusă - variabila1 operator= expresie și este echivalentă cu variabila1 = variabila1 operator expresie
  • multiplă - are forma variabila1 = variabila2 = ... = variabilaN = expresie; inițializarea are loc de la dreapta la stânga
Există niște operatori speciali și anume:

a = b++ are ca efect a = b; b = b+1;
a = ++b înseamnă b = b+1; a = b;

3. Decizia

Ne permite să alegem între posibilități, în funcție de valoare logică (adevărat sau fals) a unei condiții.

if (expresie)
   instrucțiune1;
else [if (expresie2)] -> opțional
   instrucțiune2;

4. Ciclul

Acesta repetă un anumit bloc de instrucțiuni de mai multe ori cât timp este îndeplinită condiția.

while (expresie){
instrucțiune1;
instrucțiune2;
...
}

5. Afișarea la consola

După cum am văzut în tutorialul anterior, se folosește funcția printf(listă_descriptori, listă_variabile). Mai multe detalii puteți găsi aici.

6. Citirea de la tastatură

De această dată se folosește funcția scanf(lista_descriptori, lista_adrese). Mai multe detalii aveți aici.

Cam atât pentru astăzi. Mâine vom exersa toate noțiunile de până acum, rezolvând niște probleme simple.

Pe curând!

12 Aug 2012

Tur de orizont al limbajului de programare C

Salutare tuturor!

Astăzi începem seria noastră de tutoriale cu o scurtă introducere în limbajul de programare C.

Mai întâi haideți să ne gândim în ce condiții avem nevoie de un astfel de limbaj. Evident, trebuie să avem o anumită problemă de rezolvat. Așadar, se poate spune că orice limbaj de programare este o interfața dintre problemă și programul de rezolvare.

Nu o să intru în detalii, dar programul de rezolvare este întruchiparea unui algoritm. Prin algoritm se înțelege o înșiruire finită de pași care preia anumite date de intrare și oferă un rezultat final (sau un set) într-un timp finit.

Trecerea de la specificatia problemei în limbaj natural nu este mereu directă. De obicei trebuie să trecem prin mai mulți pași, cum ar fi analiza problemei, găsirea unei metode de rezolvare, elaborarea algoritmului și codificarea acestuia (pentru noi, in C).

Ca fapt divers, ar fi bine să știți că C-ul este un limbaj de programare procedural, adică un program este o mulțime de blocuri și funcții.

O funcție repezintă o bucată de cod care atunci când este apelată face niște calcule și, de cele mai multe ori, întoarce un rezultat. Orice progam scris in C va avea în mod obligatoriu funcția main().

Dar, mai bine, haideți să vedem cum arată un program simplu.

#include <stdio.h>
int main(){
   printf("Salut");
   return 0;
}

Acum să disecăm puțin codul de mai sus. Acesta poate fi scris fără probleme în editorul de text preferat (eu vă recomand Notepad++ pentru Windows) și salvat cu extensia .c (de exemplu salut.c).

Prima linie anunta compilatorul de C că fisiererul stdio.h trebuie introdus. El conține prototipurile functiilor de intrare și de ieșire, printre care si printf().

Umătoarea linie introduce funcția -main- care va întoarce un rezultat întreg. Ca o convenție, pentru cazul în care programul se termină cu succes, trebuie întoarsă valoarea 0, lucru specificat prin penultima linie.

A mai rămas de explicat funcția / instrucțiunea printf(). Aceasta are rolul de a afișa, pe ecran, anumite valori formatate.

Acum veți spune: "Minunat, am scris primul program în C, dar ce fac mai departe ca să îl rulez?". Întrebarea este foarte justificată. Pentru a rula programul de mai sus va trebui să instalăm compilatorul de C.

Pentru Linux, acesta se numește -gcc- și vine deja instalat pe versiunea 12.04 a lui Ubuntu. Pentru versiunile mai vechi va trebui sa rulați din terminal comanda: sudo apt-get install build-essential.
După scrierea programului în editorul de text favorit și salvarea acestuia cu extensia .c (salut.c) va trebui să deschideți un terminal și să navigați către folderul unde se află acesta. Apoi veți da comanda de compilare 'gcc salut.c -o salut'. Pentru rulare, tot din terminal dați '\.salut'.

Pentru Windows, vă sugerez să instalați MinGW de aici. După instalare, va trebui să modificați variabila de sistem Path, adăugând calea către executabilul gcc.exe. Pentru Windows 7, pașii sunt următorii: click dreapta pe My Computer -> Properties -> Advanced system settings -> asigurați-vă că sunteți pe tabul Advanced și click pe Environment Variables -> în partea de jos aveți un tabel cu variabilele de sistemș derulati până găsiți Path, click pe ea și apoi pe Edit... -> se va deschide o casetă de dialog în care va trebui să introduceți calea precedată de ; (la mine ar fi ;c:\mingw\bin). În continuare pașii sunt asemănători cu cei din Linux. Dați click pe Start -> Run -> tastați cmd și apoi Enter. Se va deschide consola de tip MS-DOS. De aici navigați către folderul unde ați salvat fișierul sursă și tastați comanda de compilare 'gcc salut.c -o salut'. Pentru rulare, trebuie să dați 'salut'.
Dacă nu vă descurcați, spuneți asta pe rubrica de comentarii și voi adauga un video demonstrativ.

Cam asta a fost pentru astăzi, sper că v-a plăcut și că nu am fost foarte tehnic și plictisitor. Oricum tutorialele următoare vor fi mult mai practice. Dacă aveți orice sugestii, opinii sau reclamații decente nu evitați a le face publice.

Numai bine!

Bine v-am găsit!

Salutare tuturor!

Astăzi, printre nenumăratele bloguri românești de IT, se naște încă unul care își propune să aducă în prim plan știrile din acest domeniu, dar și alte aspecte interesante ale acestuia. Pentru început, vom debuta cu rubricile de știri și tutoriale urmând ca în viitorul apropiat, să apară alte secțiuni de interes.

Blogul se adresează celor care sunt pasionați de IT, care doresc să fie la curent cu noutățile specifice acestuia și, totodata, celor care doresc să își însușească câteva deprinderi utile folosind un calculator.

Subiectele vor fi scrise pe înțelesul tuturor și speram că vă veți convinge singuri de asta.

Vorba lungă, sărăcia omului... pentru început este de ajuns și urmeaza, inevitabil, să trecem la treabă. Așa că vă rog, cu căldură, să citiți toate mesajele de pe blog sau numai pe cele care vă interesează mai mult și nu uitați că așteptăm de la voi orice sugestie, opinie sau reclamație :)

Pe curând!