<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.1.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>SkullBox</title>
	<link>http://www.skullbox.info</link>
	<description>SkullBox.info - IT pe intelesul tuturor</description>
	<pubDate>Sun, 10 Feb 2008 10:34:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.2</generator>
	<language>en</language>
			<item>
		<title>2. Creare butoane si inputuri in AutoIT</title>
		<link>http://www.skullbox.info/2-creare-butoane-si-inputuri-in-autoit/</link>
		<comments>http://www.skullbox.info/2-creare-butoane-si-inputuri-in-autoit/#comments</comments>
		<pubDate>Sun, 10 Feb 2008 10:33:33 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/2-creare-butoane-si-inputuri-in-autoit/</guid>
		<description><![CDATA[Am ajuns la Lectia 2, in care vom invata cum sa creem butoane si inputuri in programelul nostru, deja avem fereastra cu numele SkullBox Soft Care are dimensiunile de : 800&#215;400.
Pentru inceput vreau sa iau in parte fiecare element si sa va explic ce este:
1. Inputul este o casuta, in care se poate adauga text, [...]]]></description>
			<content:encoded><![CDATA[<p>Am ajuns la Lectia 2, in care vom invata cum sa creem butoane si inputuri in programelul nostru, deja avem fereastra cu numele <strong>SkullBox Soft</strong> Care are dimensiunile de : 800&#215;400.</p>
<p>Pentru inceput vreau sa iau in parte fiecare element si sa va explic ce este:<br />
1. Inputul este o casuta, in care se poate adauga text, deobicei este folosit foarte des la formularele de pe site-uri de incriere, pentru a va recolta datele personale precum Numele,Prenumele etc&#8230;<br />
2. Butonul este un obiect in programarea visuala, pe care atunci cand il apesi (dai click pe el), poti sa il programezi sa execute anumite comenzi.</p>
<p>Asadar, ca in mare stim care e diferenta intre <strong>Input</strong> si <strong>Button</strong>, putem sa incepem sa le utilizam in programul nostru. Pentru creearea input-box-urilor si button-urilor in <strong>AutoIT</strong> avem nevoie de acelasi header, pe care l-am utilizat deja si in creerea ferestrei GUI, dar deja nu il mai introducem fiind deja introdus(headerul GuiConstants.au3).</p>
<p><strong>a)Creerea Input-urilor in AutoIT</strong><br />
Functia pe care o folosim pentru a crea un Input intr-o fereastra GUI, este <strong>GUICtrlCreateInput</strong>, o functie cu un nume relativ foarte usor de tinut minte. Sintaxa aceste functie este urmatoarea:</p>
<div class="codesnip-container" >GUICtrlCreateInput ( &#8220;text&#8221;, left, top [, width [, height [, style [, exStyle]]]] )</div>
<p>Dar noi pentru inceut ne folosim de primii 5 parametrii:<br />
         I.<strong>&#8220;text&#8221;</strong> = optional, un text cu care sa fie initializat deja Inputul<br />
         II.<strong> left </strong>= numarul de pixeli dintre input si partea stanga a ferestrei programului<br />
         III.<strong> top</strong> = numarul de pixeli dintre input si partea de sus a programului<br />
         IV. <strong>width</strong> = este lungimea inputului<br />
         V. <strong>height</strong> = latimea inputului<br />
Pentru exemplul meu m-am gandit sa creez un input de lung de 200, care sa aiba distanta de sus 3 px si din stanga 6px si sa fie lung de 200, latimea standard de 20, si ca text initial sa aiba Introduceti textul&#8230;.Pentru acest input voi folosii codul:</p>
<div class="codesnip-container" >GUICtrlCreateInput (&#8221;Introduceti textul&#8230;&#8221;, 6,  3, 200, 20)</div>
<p>Acest cod se adauga dupa <strong>expresia</strong> cu care am creat fereastra <strong>GUI</strong>. Si gata, am invatat cum sa creem un input in micul nostru programel, care ar trebuii sa arate cam asa:</p>
<div class="codesnip-container" >#include &lt;GUIConstants.au3&gt;<br />
$fereastra=GUICreate(&#8221;SkullBox Soft&#8221;, 800, 400)<br />
$input = GUICtrlCreateInput (&#8221;Introduceti textul&#8230;&#8221;, 6,  3, 200, 20)<br />
GUISetState(@SW_SHOW)<br />
While 1<br />
    $actiune = GUIGetMsg()<br />
        If $actiune = $GUI_EVENT_CLOSE Then ExitLoop<br />
Wend</div>
<p><strong>b)Creerea Button-urilor in AutoIT</strong><br />
Creerea butoanelor in <strong>AutoIT</strong>, este foarte asemanatoare cu creerea Inputurilor, sintaxa avant cam aceeasi parametrii. Functia folosita pentru a creea un buton in <strong>AutoIT</strong> este <strong>GuiCtrlCreateButton</strong>, si sintaxa acestei functii este urmatoarea:</p>
<div class="codesnip-container" >GUICtrlCreateButton ( &#8220;text&#8221;, left, top [, width [, height [, style [, exStyle]]]] )</div>
<p>Nu voi mai explica din nou, ce inseamna fiecare parametru, vreau doar sa va spun ca pentru inceput ii vom folosii doar pe primii 5, si ca primul parametru &#8220;<strong>text</strong>&#8220;, aici are o alta semnificatie, mai exact text-ul este textul ce va aparea pe buton-ul nostru. Butonul pe care il vom crea va avea scris pe el text-ul &#8220;Citeste&#8221;, va fii dupa bara de input a noastra, adica va trebuii sa inceapa de la pixelul 206 al ferestrei noastre. De ce 206? Pentru ca inputul nostru incepe de la pixelul 6, iar lungimea inputului este de 200, adunate ne da un numar de 206 pixeli pe care trebuie sa ii &#8220;ocolim&#8221;, distanta fata de top, va fii tot de 3 pixeli, lung de 50 si lat de 20. Codul pentru acest buton este:<br />
<strong>$buton = GuiCtrlCreateButton(&#8221;Citeste&#8221;,206,3,50,20)</strong><br />
Si il adaugam dupa codul pentru a crea <strong>Input-ului</strong>. Programul dupa adaugare butonulul ar trebuii sa arate acum asa :</p>
<div class="codesnip-container" >#include &lt;GUIConstants.au3&gt;<br />
$fereastra=GUICreate(&#8221;SkullBox Soft&#8221;, 800, 400)<br />
$input = GUICtrlCreateInput (&#8221;Introduceti textul&#8230;&#8221;, 6,  3, 200, 20)<br />
$buton = GuiCtrlCreateButton(&#8221;Citeste&#8221;,206,3,50,20)<br />
GUISetState(@SW_SHOW)<br />
While 1<br />
    $actiune = GUIGetMsg()<br />
        If $actiune = $GUI_EVENT_CLOSE Then ExitLoop<br />
Wend</div>
<p>Acum avem un input care ne cere sa introducem text-ul si un buton care daca l-am apasa, ar trebuii sa citeasca text-ul citit de noi, dar momentan inca nu o face, pentru ca noi doar ne-am jucat si am creat aceste buton folosindune de interfata GUI. Dar stati linistiti ca vom invata si cum sa citim un text din input, si cum sa punem sa se intample ceva, atunci cand apasam pe un buton in lectia uratoare.</p>
<p>Tutorializat realizat de <strong><a href="http://cms-help.net">HexString</a> </strong> | 10.februarie.2008</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/2-creare-butoane-si-inputuri-in-autoit/feed/</wfw:commentRss>
		</item>
		<item>
		<title>1. Creare ferestre GUI in Autoit</title>
		<link>http://www.skullbox.info/1-creare-ferestre-gui-in-autoit/</link>
		<comments>http://www.skullbox.info/1-creare-ferestre-gui-in-autoit/#comments</comments>
		<pubDate>Sun, 10 Feb 2008 10:21:27 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/1-creare-ferestre-gui-in-autoit/</guid>
		<description><![CDATA[Pentru inceput trebuie sa downloadati AutoIT-ul pe calculatorul vostru, in caz ca nu ati facut-o datoria mea este sa va aduc aminte sa o faceti asadar treceti pe la :
Download:
http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe
*il instalati si astfel vom putea incepe sa invatam impreuna Programare in AutoIT.
Asadar incepem prin a crea un program autoit, dati click dreapta > Create > [...]]]></description>
			<content:encoded><![CDATA[<p>Pentru inceput trebuie sa downloadati AutoIT-ul pe calculatorul vostru, in caz ca nu ati facut-o datoria mea este sa va aduc aminte sa o faceti asadar treceti pe la :<br />
Download:</p>
<div class="codesnip-container" ><a href="http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe">http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe</a></div>
<p>*il instalati si astfel vom putea incepe sa invatam impreuna Programare in AutoIT.</p>
<p>Asadar incepem prin a crea un program autoit, dati click dreapta > Create > New AutoIt Script.<br />
Dati click dreapta pe fisierul creat, si Edit Script, s-a deschis IDE-ul Scite (ide-ul este un program ceva in genul NotePad-ului care ajuta programarea in AutoIT, facut highline la functii si diferite sintaxe ale AutoIt-ului, la fel si atunci cand vrei sa folosesti vreo Functie in AutoIT, siincepi sa scrii primele litere, acesta iti sugereaza un set de functii). S-a deschis IDE-ul si acum trebuie sa incepem sa scriem impreuna primele noastre linii in AutoIT.</p>
<p>Vom crea o fereastra gui, dar pentru a crea acesta fereastra, pentru inceput trebuie sa avem inclus in program Header-ul pentru gui headerul are numele <strong>GUIConstants.au3</strong>, pentru a il include folosim sintaxa :</p>
<div class="codesnip-container" >#include &lt;header .au3&gt;</div>
<p>*sintaxa foarte asemanatoare cu cea din C/C++<br />
exmeplu pentru noi :</p>
<div class="codesnip-container" >#include &lt;GUIConstants.au3&gt;</div>
<p>Acum ca am inclus in program headerul care are functii de lucru cu GUI-ul nu ne ramane decat sa creem fereastra.Pentru a crea o fereastra Gui in Autoit folosim functia <strong>GUICreate()</strong> aceasta avand urmatoarea sintaxa :</p>
<div class="codesnip-container" >GUICreate ( &#8220;title&#8221; [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )</div>
<p>Unde pe noi ne intereseaza pentru inceput doar primele 3 lucruri :<br />
       a.&#8221;title&#8221; = titlul ferestrei si acesta se pune intre ghilimele<br />
       b.width/height = acestea sunt dimensiunile ferestrei<br />
Asadar noi vrem de exemplu sa ne creem fereastra cu numele SkullBox si vrem sa aiba dimensiunea de 800&#215;400, folosim urmatorul cod:</p>
<div class="codesnip-container" >$fereastra=GUICreate(&#8221;SkullBox Soft&#8221;, 800, 400)<br />
GUISetState(@SW_SHOW)</div>
<p>Am folosit <strong>GUISetState(@SW_SHOW)</strong> pentru a si afisa fereastra pe ecran.<br />
Acum ca avem creata fereastra, mai trebuie sa facem doar un lucru mai trebuie sa adaugam in program o structura while, care sa faca sa se inchida programul doar cand apasam pe X-ul de sus al programului, asadar mai adaugati in program urmatorul cod:</p>
<div class="codesnip-container" >While 1<br />
    $actiune = GUIGetMsg()<br />
        If $actiune = $GUI_EVENT_CLOSE Then ExitLoop<br />
Wend</div>
<p>Asadar avem creata prima noastra fereastra in AutoIT. Programul nostru ar trebuii sa arate cam asa:</p>
<div class="codesnip-container" >#include &lt;GUIConstants.au3&gt;<br />
$fereastra=GUICreate(&#8221;SkullBox Soft&#8221;, 800, 400)<br />
GUISetState(@SW_SHOW)<br />
While 1<br />
    $actiune = GUIGetMsg()<br />
        If $actiune = $GUI_EVENT_CLOSE Then ExitLoop<br />
Wend</div>
<p>Pentru a compila programul (pentru a il face .exe) dati click dreapta pe programelul_vostru.au3 si dati Compile Script.</p>
<p>Tutorializat realizat de <strong><a href="http://cms-help.net">HexString</a> </strong>| 8.februarie.2008</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/1-creare-ferestre-gui-in-autoit/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cum limitam functia mail() din PHP</title>
		<link>http://www.skullbox.info/cum-limitam-functia-mail-din-php/</link>
		<comments>http://www.skullbox.info/cum-limitam-functia-mail-din-php/#comments</comments>
		<pubDate>Sat, 09 Feb 2008 09:58:04 +0000</pubDate>
		<dc:creator>Agkelos</dc:creator>
		
		<category><![CDATA[LAMP]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/cum-limitam-functia-mail-din-php/</guid>
		<description><![CDATA[Cum PHP nu ofera o solutie pentru limitarea numarului de mailuri trimise cu functia mail() si in majoritatea cazurilor spamerii folosesc functia mail() trebuie gasita o solutie de a limita numarul de mailuri trimise de un utilizator. Am facut un misc script in Perl care face asta.
Modul de functionare e relativ simplu, scriptul este apelat [...]]]></description>
			<content:encoded><![CDATA[<p>Cum PHP nu ofera o solutie pentru limitarea numarului de mailuri trimise cu functia mail() si in majoritatea cazurilor spamerii folosesc functia mail() trebuie gasita o solutie de a limita numarul de mailuri trimise de un utilizator. Am facut un misc script in Perl care face asta.<br />
Modul de functionare e relativ simplu, scriptul este apelat de PHP la trimiterea unui mail. In script se fac niste verificari si daca userul a trimis mai putin de 200 de mailuri (se poate schimba) in ziua respectiva mesajul este trimis. In caz contrar mesajul este ignorat.</p>
<p>Codul il aveti mai jos:</p>
<div class="codesnip-container" >#!/usr/bin/perl<br />
#<br />
# (C) Agkelos, webmaster@aberez.eu<br />
#</p>
<p>use POSIX;<br />
use define LIMITA => 2;</p>
<p>if($> != 0 ) {<br />
        my $count=0;<br />
        if( open(LOG,&#8221;/var/log/phpmail.log&#8221;) ){<br />
                while(<log>){<br />
                        if( $_ =~ /$>/ ){<br />
                                $count++;<br />
                        }<br />
                }<br />
                close(LOG);<br />
        }</p>
<p>        if( open(LOG,&#8221;>>/var/log/phpmail.log&#8221;) ){<br />
                my $sender = getcwd.$ENV{&#8217;SCRIPT_FILENAME&#8217;};<br />
                my $data = `date`;<br />
                chomp $data;<br />
                if( $count > LIMITA ){<br />
                        print LOG &#8220;$data:$>:$sender:ignored \n&#8221;;<br />
                }else{<br />
                        print LOG &#8220;$data:$>:$sender:sent \n&#8221;;<br />
                        exec {&#8221;/usr/sbin/sendmail&#8221;} (&#8217;/usr/bin/sendmail&#8217;,@ARGV);<br />
                }<br />
                close(LOG);<br />
        }<br />
}else{<br />
        exec {&#8221;/usr/sbin/sendmail&#8221;} (&#8217;/usr/bin/sendmail&#8217;,@ARGV);<br />
}</log></div>
<p>Cum este un hack, nu o solutie oferita de distribuitor, trebuie facute cateva mici modificari pentru ca scriptul sa functioneze corect:</p>
<p>1. Se creaza fisierul /var/log/phpmail.log caruia i se pun permisiunile corecte (rw-rw-rw-);<br />
2. Se creaza un cron care in fiecare zi, la ora 00:00, goleste continutul fisierului phpmail.log ( cp /dev/null /var/log/phpmail.log ) - optional se poate face un script care pastreaza fisierele vechi;<br />
3. Se salveaza codul de mai sus in /usr/bin/sendmail, fisier caruia i se da drept de executie - 755;<br />
4. Se modifica in php.ini directiva sendmail_path sa pointeze catre /usr/bin/sendmail, nu catre /usr/sbin/sendmail (observat bin in loc de sbin) cum e default;<br />
5. Modificati use define LIMITA => 200; sa corespunda unei valori care o considerati optima;</p>
<p>Daca astea sunt facute nu mai trebuie nici o modificare (nici macar restart).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/cum-limitam-functia-mail-din-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sunteti gata de &#8220;struct&#8221;-uri </title>
		<link>http://www.skullbox.info/sunteti-gata-de-struct-uri/</link>
		<comments>http://www.skullbox.info/sunteti-gata-de-struct-uri/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 19:02:32 +0000</pubDate>
		<dc:creator>d3light</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/sunteti-gata-de-struct-uri/</guid>
		<description><![CDATA[&#8211;>>Tutorial destinat celor ce au cat de cat habar de c++ < n;
for(int i=0;i]]></description>
			<content:encoded><![CDATA[<p>&#8211;>>Tutorial destinat celor ce au cat de cat habar de c++ < <--</p>
<p>Sa discutam un pic despre structuri...<br />
Ce pot face structurile?<br />
Ei bine sa zicem ca sunteti elev de liceu...Ganditi-va ca aveti de facut un program care sa gestioneze: adresa,varsta,numele si media fiecarui coleg din clasa...<br />
in mod normal ati declara in programul principal ceva de genu:</p>
<blockquote><p>
char nume[30][50];<br />
char adresa[30][50];<br />
int varsta[30];<br />
double media[30];<br />
int n;<br />
cout< <"Cati elevi sunt in clasa? ";cin>>n;<br />
for(int i=0;i<n ;i++)<br />
{<br />
//citire nume[i][50];<br />
//citire adresa[i][50];<br />
//citire varsta[i];<br />
//citire media[i];<br />
}<br />
.<br />
.<br />
.<br />
//gestionare de date</p></blockquote>
<p>Ganditi-va ce bine ar fi daca fiecare coleg ar avea cate un &#8220;antet&#8221; pentru datele sale.Ei bine tocmai ati aflat ce sunt alea structurile!<br />
Structurile permit o mai bine organizare a variabilelor..Astfel ,modelul universal de struct este:</p>
<blockquote><p>
struct <nume_struct><br />
{<br />
tip1 nume1;<br />
tip2 nume2;<br />
.<br />
.<br />
.<br />
tipn numen;<br />
}V1,V2&#8230;Vn;</nume_struct></p></blockquote>
<p>Structurile se declara global,asta inseamna ca se delcara in afara &#8220;Main&#8221;-ului(practic deasupra lui).<br />
Acum explicatia: ganditi-va la struct ca un catalog de date.<br />
<nume_struct>  - numele dat structuri pentru a putea ulterior crearea mai multor structuri de acest fel.<br />
tip1 nume1;<br />
tip2 nume2;<br />
.<br />
.<br />
.<br />
tipn numen;    - variabilele continute de struc<br />
V1,V2&#8230;Vn     - variabile cu care se lucreaza.Trebuie precizat ca nu se poate lucra cu </nume_struct><nume_struct> direct&#8230;ci,asemeni claselor din c#,se lucreaza cu<br />
copii ale structului respectiv.<br />
V1,V2&#8230;Vn      - daca lipsesc,</nume_struct><nume_struct> nu are voie sa lipseasca dar invers este acceptabil,</p>
<p>Folosind ,</nume_struct><nume_struct>,programatorul poate oricand sa creeze copii noi ale structuri respective.De aceea,de multe ori se omite &#8220;V1,V2&#8230;Vn&#8221; preferandu-se<br />
declararea copiilor de struct pe parcursul programului pentru a se face economie de memorie.<br />
Astfel modelul cel mai folosit de struct este:</p>
<blockquote struct <nume_Struct><p>
{<br />
tip1 nume1;<br />
tip2 nume2;<br />
.<br />
.<br />
.<br />
tipn numen;<br />
};
</p></blockquote>
<p>Acum&#8230;sa creem un struct pentru nevoile nostre.Sa numim structul &#8220;coleg&#8221;.Sa nu uitam ca avem nevoie de adresa,varsta,numele si media.<br />
incepem cosntructia(nu uitati ca de obicei se pune deasupra &#8220;main&#8221;-ului):</p>
<blockquote><p>
struct coleg<br />
{<br />
char adresa[50];<br />
char nume[50];<br />
int varsta;<br />
int media;<br />
};</p></blockquote>
<p>Acum ca avem declarat structul&#8230;trebuie sa il si folosim,nu?<br />
Structul este un catalog de variabile.se lucreaza cu copii ale structului,nu cu numele structului in sine!!!<br />
Sa zicem ca la noi in clasa sunt 30 de elevi,deci am avea nevoie de 30 de structuri copii ale structului &#8220;coleg&#8221;.<br />
Le declaram cu ajutorul arrayului lafel cum am declara un array de variabile de acelasi tip si anume:</p>
<blockquote><p>
coleg colegi_in_clasa[30];</p></blockquote>
<p>Simplu,nu?</p>
<p>Probabil va intrebati&#8230;bun am creat,am declarat,dar cum folosim?Ei bine&#8230;si acest lucru e simplu&#8230;<br />
Accesam variabila prin intermediul copiei de struct urmata de &#8216;.&#8217;(punct) si de numele variabilei din struct.Astfel noul nostru progrma cu struct va arata:</p>
<blockquote><p>
struct coleg<br />
{<br />
char adresa[50];<br />
char nume[50];<br />
int varsta;<br />
int media;<br />
};</p>
<p>void CitireStruct(coleg &#038;copie_coleg)<br />
{<br />
cout< <"nDati numele : ";cin.get(copie_coleg.nume,50);<br />
cout<<"nDati Adresa : ";cin.get(copie_coleg.adresa,50);<br />
cout<<"nDati Varsta : ";cin>>copie_coleg.varsta;<br />
cout< <"nDati Media  : ";cin>>copie_coleg.media;<br />
}</p>
<p>void main()<br />
{<br />
//cod de inceput<br />
.<br />
.<br />
int n;<br />
coleg colegi_in_clasa[30];<br />
cout< <"Cati colegi ai in clasa? ";cin>>n;<br />
for(int i=0;i<n ;i++)<br />
citire(colegi_in_clasa[i]);<br />
.<br />
.<br />
//alt cod de program<br />
}
</p></blockquote>
<p>Alta viata,nu?<br />
P.S: Am facut acest tutorial pentru a face legatura intre structurile din C++ cu clasele din C#.Sunt FF asemanatoare!  Dati-va seama si singuri!</p>
<p>©3Nigma<br />
</n></p></blockquote>
<p></nume_struct></n></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/sunteti-gata-de-struct-uri/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I/0 in c# cu StreamReader si StreamWriter-Intermediari</title>
		<link>http://www.skullbox.info/i0-in-c-cu-streamreader-si-streamwriter-intermediari/</link>
		<comments>http://www.skullbox.info/i0-in-c-cu-streamreader-si-streamwriter-intermediari/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 13:58:11 +0000</pubDate>
		<dc:creator>d3light</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/i0-in-c-cu-streamreader-si-streamwriter-intermediari/</guid>
		<description><![CDATA[In continuare voi incerca sa prezint tehnica realizari operatiunilor de I/0 pentru c# folosint clasele &#8220;StreamReader&#8221; si &#8220;StreamWriter&#8221;:
Acest tutorial este destinat utilizatorilor care au ceva cunostinte de baza despre C#&#8230;
Pentru realizarea operatiunilor de I/0 pe c# este necesar,pentru usurarea operatiunii,includerea namespaceului:
System.IO
Clasa care permite citirea unui fisier este:
StreamReader
Practic pentru a citi un fisier trebuie creata o [...]]]></description>
			<content:encoded><![CDATA[<p>In continuare voi incerca sa prezint tehnica realizari operatiunilor de I/0 pentru c# folosint clasele &#8220;StreamReader&#8221; si &#8220;StreamWriter&#8221;:</p>
<p>Acest tutorial este destinat utilizatorilor care au ceva cunostinte de baza despre C#&#8230;</p>
<p>Pentru realizarea operatiunilor de I/0 pe c# este necesar,pentru usurarea operatiunii,includerea namespaceului:</p>
<blockquote><p>System.IO</p></blockquote>
<p>Clasa care permite citirea unui fisier este:</p>
<blockquote><p>StreamReader</p></blockquote>
<p>Practic pentru a citi un fisier trebuie creata o instanta a clasei &#8220;StreamReader&#8221;.In exemplul meu instanta(&#8221;copia&#8221;) clasei o sa o numim &#8220;citeste_fisier&#8221;.</p>
<blockquote><p>StreamReader citeste_fisier=new StreamReader(<locatie_fisier>);</locatie_fisier></p></blockquote>
<p><locatie_fisier> reprezinta locatia fisierului pe HDD pe care dorim sa il citim.<br />
Exceptiile generate de constructor sunt urmatoarele:</p>
<blockquote><p>ArgumentException<br />
 calea este &#8220;goala&#8221; un string gol (&#8221;"). </p>
<p>ArgumentNullException<br />
 calea este o referinta catre null. </p>
<p>FileNotFoundException<br />
 Fisierul nu este de gasit. </p>
<p>DirectoryNotFoundException<br />
Directorul care contine fisierul este de negasit. </p>
<p>IOException<br />
Locatia este incorect scrisa. </p></blockquote>
<p>Dupa ce am initializat o instanta a clasei &#8220;StreamReader&#8221; putem trece la operatiuni de citire asupra fisierului.<br />
Metodele care se ocupa cu aceste operatiuni(cele mai folosite) sunt:</p>
<blockquote><p>
Read<br />
  Returneaza un caracter din fisier,iar &#8220;curosrul&#8221; avanseaza la urmatorul caracter.(Daca s-a atins sfarsitul fisierului returneaza NULL)<br />
ReadToEnd<br />
  Returneaza tot continutul unui fisier sub forma de string.<br />
ReadLine<br />
  Returneaza o linie cu date din fisier,iar &#8220;curosrul&#8221; avanseaza la urmatoarea linie.(Daca s-a atins sfarsitul fisierului returneaza NULL)</p></blockquote>
<p>Exemplu de folosire:</p>
<blockquote><p>
string continut_fisier;<br />
StreamReader citeste_fisier=new StreamReader(&#8221;C:\Windows\ODBC.INI&#8221;);<br />
//&#8221;se observa ca la calea specificata a fisierului destinat deschiderii sunt folosite &#8220;\&#8221; si nu &#8220;&#8221; acest lucru este realizat pentru a nu se confunda<br />
//cu macrourile din limbajele de c&#8230;cum ar fi &#8220;t&#8221;,&#8221;n&#8221; etc&#8230;in felul acesta &#8220;\&#8221;=&#8221;"<br />
//&#8221;imagazinam&#8221; in &#8220;continut_fisier&#8221; continutul fisierului &#8220;C:WindowsODBC.INI&#8221;<br />
continut_fisier=citeste_fisier.ReadToEnd();<br />
//nu mai avem nevoie de fisier asa ca il inchidem<br />
citeste_fisier.Close();<br />
.<br />
.<br />
.<br />
//alte operatiuni</p></blockquote>
<p>Observati ca ultima metoda apelata &#8220;citeste_fisier.Close();&#8221; trebuie apelata in cazul in care nu mai avem nevoie de fisier ca astfel programul sa<br />
elibereze din resurse.</p>
<p>________________________________________________________________________________________________________________________________________________</p>
<p>Pentru operatiuni de citire,se foloseste acelasi namespace:<br />
Cod:</p>
<blockquote><p>System.IO</p></blockquote>
<p>Clasa folosita pentru a &#8220;scrie&#8221; in fisiere este,in cazul acesta &#8220;StreamWriter&#8221;.<br />
Initializarea unei instante &#8220;StreamWriter&#8221; se face identic ca la &#8220;StreamReader&#8221;.<br />
Exemplu:Vom pastra in &#8220;scrie_fisier&#8221; o instanta a clasei &#8220;StreamWriter&#8221;.</p>
<blockquote><p>StreamReader citeste_fisier=new StreamReader(<locatie_fisier>,bool adauga);</locatie_fisier></p></blockquote>
<p></locatie_fisier><locatie_fisier> reprezinta locatia fisierului pe HDD pe care dorim sa-l scriem.<br />
adauga - variabila de tip booleana(bool) care precizeaza modul de deschidere a fisierului(cu posibilitatea de adaugare-append- >>true si prin a scrie fara adaugare-stergere- >>false)<br />
Exceptiile returnate la apelarea constructorului sunt :</p>
<blockquote><p>UnauthorizedAccessException<br />
 Acces respins. </p>
<p>ArgumentException<br />
 calea este &#8220;goala&#8221;. </p>
<p>-sau-</p>
<p>calea contine numele unei resurse utilizate de comp(com1,com2 etc) ???. // ff rar</p>
<p>ArgumentNullException<br />
 calea este o referinta la null. </p>
<p>DirectoryNotFoundException<br />
 Directorul care contine fisierul este de negasit. </p>
<p>IOException<br />
 Locatia este incorect scrisa. </p>
<p>PathTooLongException<br />
 Calea a depasit numarul maxim de caractere(248) sau lungimea fisierelui a depasit 260 de caractere(lungimea maxima in windows). </p>
<p>SecurityException<br />
 Nu este acces la fisierul respectiv(securitate).</p></blockquote>
<p>Dupa crearea instantei si apelarea constructorului,programatorul poate sa faca scrierea pe fisier folosind urmatoarele metode:</p>
<blockquote><p>//scrie o variabila din urmatoarele in fisier:<br />
Write (Boolean)<br />
Write (Char)<br />
Write (Char[])<br />
Write (Decimal)<br />
Write (Double)<br />
Write (Int32)<br />
Write (Int64)<br />
Write (Object)<br />
Write (Single)<br />
Write (String)<br />
Write (UInt32)<br />
Write (UInt64)<br />
///////////////////////////////////////////////<br />
//scrie una dintre variabilele urmatoare si apoi muta cursorul pe urmatoarea linie<br />
WriteLine (Boolean)<br />
WriteLine (Char)<br />
WriteLine (Char[])<br />
WriteLine (Decimal)<br />
WriteLine (Double)<br />
WriteLine (Int32)<br />
WriteLine (Int64)<br />
WriteLine (Object)<br />
WriteLine (Single)<br />
WriteLine (String)<br />
WriteLine (UInt32)<br />
WriteLine (UInt64)<br />
//OBS! pentru a muta curosrul fara a scrie nimic se apeleaza simplu WriteLine()<br />
//////////////////////////////////////////////// </p></blockquote>
<p>Un exemplu de folosire:</p>
<blockquote><p>//initializarea obiectului &#8220;scrie_fisier&#8221;,al doilea argument este tip bool si setat pe &#8220;false&#8221; deoarece dorim sa stearga tot si sa scrie el date noi<br />
StreamWriter Scrie_fisier=new StreamWriter(&#8221;C:\Windows\0.log&#8221;,false);<br />
//scrierea propriuzisa<br />
scrie_fisier.Write(&#8221;Text adaugat automat de program!&#8221;);<br />
//Eliberarea de resurse<br />
scrie_fisier.Close();</p>
<p>//acum ca tot stim sa citim &#8230; putem verifica daca programul a mers automat.Si anume:</p>
<p>//initializam o instanta a clasei &#8220;StreamReader&#8221;<br />
StreamReader citeste_fisier=new StreamReader(&#8221;C:\Windows\0.log&#8221;);<br />
//afisam automat continutul fisierului printr-un mesaj<br />
MessageBox.Show(citeste_fisier.ReadToEnd());<br />
//eliberam resurse<br />
citeste_fisier.Close();</p></blockquote>
<p>Usor,nu? Till next time&#8230;<br />
                                              ©3Nigma                  </locatie_fisier></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/i0-in-c-cu-streamreader-si-streamwriter-intermediari/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Romanian Network E-book 2.0[autor:!_30]</title>
		<link>http://www.skullbox.info/romanian-network-e-book-20autor_30/</link>
		<comments>http://www.skullbox.info/romanian-network-e-book-20autor_30/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 13:08:36 +0000</pubDate>
		<dc:creator>d3light</dc:creator>
		
		<category><![CDATA[Retele]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/romanian-network-e-book-20autor_30/</guid>
		<description><![CDATA[Ce aflam in aceasta carte ?
* Ce este o retea ?
* Ce este acela un IP ( si de la ce vine acest acronym : Internet Protocol ) ?
* Ce reprezinta un port , dar un socket / soclu ?
* Ce rol are subretelarea ? ( transformari binar - zecimal in minte ).
* Ce este [...]]]></description>
			<content:encoded><![CDATA[<p>Ce aflam in aceasta carte ?</p>
<p>* Ce este o retea ?<br />
* Ce este acela un IP ( si de la ce vine acest acronym : Internet Protocol ) ?<br />
* Ce reprezinta un port , dar un socket / soclu ?<br />
* Ce rol are subretelarea ? ( transformari binar - zecimal in minte ).<br />
* Ce este Internetul ? ( LAN-uri / WAN-uri / MAN-uri ) / ( istoria Internetului )<br />
* Cum monitorizam minimal o retea de calculatoare ?</p>
<p>Are rost sa downloadez aceasta carte ?</p>
<p>- Desigur ca te-ai gandit : Are rost sa downloadez inca o carte ? Rapunsul este : da .<br />
- pentru un incepator , informatiile prezentate , au un important rol in cladirea unei &#8220;baze&#8221; in domeniul calculatoarelor.<br />
- De ce sa iti umpli capul cu &#8220;prostii&#8221; de pe net` , cand poti citi o carte romaneasca , cu informatii autentice / originale .<br />
- Acum decizia va fi luata de tine .</p>
<p>Mult mai multe puteti citi , in limba romana , in interiorul acestei carti.Link-urile sunt mai jos :<br />
Download:</p>
<blockquote><p>www.skullbox.info/users/leo/ret.zip</p></blockquote>
<p>Alternativ:</p>
<blockquote><p>http://rapidshare.com/files/45366538/RET.v2.0.rar.html </p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/romanian-network-e-book-20autor_30/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Local Area Network[by !_30]</title>
		<link>http://www.skullbox.info/local-area-networkby-_30/</link>
		<comments>http://www.skullbox.info/local-area-networkby-_30/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 18:50:52 +0000</pubDate>
		<dc:creator>d3light</dc:creator>
		
		<category><![CDATA[Retele]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/local-area-networkby-_30/</guid>
		<description><![CDATA[Pentru incepatori
Ce ar urma sa contina aceasta lectie , daca in lectiile trecute am invatat in mare parte , ceva despre IP-uri , subnet mask si default gateway ?Simplu aceasta lectie va avea rolul de a prezenta &#8220;Local Area Network&#8221; si diferitele chestii dupa acolo.
Deci hai sa incepem :
Cod:
Start ->Setting&#8217;s->Netwrok Connection -> Local Area Netowork [...]]]></description>
			<content:encoded><![CDATA[<p>Pentru incepatori</p>
<p>Ce ar urma sa contina aceasta lectie , daca in lectiile trecute am invatat in mare parte , ceva despre IP-uri , subnet mask si default gateway ?Simplu aceasta lectie va avea rolul de a prezenta &#8220;Local Area Network&#8221; si diferitele chestii dupa acolo.</p>
<p>Deci hai sa incepem :</p>
<p>Cod:</p>
<blockquote><p>Start ->Setting&#8217;s->Netwrok Connection -> Local Area Netowork  </p></blockquote>
<p>Sus , sub chestia unde e scris Local Area Network Status observam : doua tab-uri :</p>
<p>General &#038; Suport</p>
<p>Deci le vom prezenta pe fiecare in parte cum si ce face si ce rol are :</p>
<p>1. General</p>
<p>-sub Connection observam : Status : {connected ar trebui sa fie , adica e facuta conexiunea , si logic , daca sub acest NIC se face posibila citirea acestei pagini , sigur va fi connected }<br />
-duration , de cat timp e conectata { de la vechiul restart , enable/disable ,startup, reinorire IP , Ip release / reuquest IP la DHCP server , DHCP server este un server ce da IP-uri in retea }<br />
-Speed , viteza cu care merge reteaua , observati ca este in bite&#8217;s nu byte&#8217;s</p>
<p>Activity : cate pachete inta si ies dupa NIC : e simplu de observat aceasta si la NIC  / placa de retea , aceasta isi chimba culoarea ( se apridna alta culoare de fiecare data cand trasnmite sau primeste verde deschis sau portocaliu deschis }</p>
<p>Urmeaza Properties : de unde putem face o &#8220;droiaie&#8221; de chestie , nu vom intra in amanunte , se pot instala , protocoale , clienti si alte lucuri.</p>
<p>Butonul disable : opreste conectivitatea la internet / retea , intrerupand placa de retea.</p>
<p>2. Suport :</p>
<p>-detalii principale desper IP , subnet mask , sau cum a fost atribuit acest IP.<br />
-la Details , putem afla mai multe , WINS/DNS server&#8217;s , sau pe cat timp si de cand este dat IP-ul ( lease de un DHCP server ) , daca este cazul .Vom discuta despre DNS , DHCP , WINS server in lectia / lectiile urmatoare , deoarece tot am aminitit aceste notiuni.<br />
-Repair , are rolul de a reinoi adresa , daca este data de un DHCP server ( dintr-un anumit scop sau multscop , vom discuta despre aceste doua notiuni lectiile viitoare ) , sa stearga cache-urile cu mapari , ARP , DNS , Netbios-IP {desigur si acestea vor fi prezentate in lectiile viitoare } asigurand-se ca se elimina anumte erori , la conexiune , dtorate unori IP-uri mapate gresit cu un nume sau chestii de genul acesta !</p>
<p>Routare</p>
<p>-Hai sa discutam ceva despre routare(a)   informatiilor in Windows .</p>
<p>Cod:</p>
<p>route print  </p>
<p>*netowork destination<br />
*netmask<br />
*gateway<br />
*interface<br />
*metric</p>
<p>Deci ce inseamna toate acestea ?</p>
<p>Network destination : este destinatia finala ( folosind routa respectiva ).<br />
Netmask : Subnet-maskul , care are rolul de a ne prezenta cu exactitate  , reteaua unde vrem sa ajungem si/sau hostul respetiv.<br />
Gateway : gateway-ul ( router NIC ) , la care se trimit datele ( prima data ) , pentru a putea ajunge la destinatia finala ( ca un fel de intermediar<br />
Interface : Pe ce interfata ( placa de retea = NIC ) locala se trimite pachetul.<br />
Metric : Costul routei , pe care trebuie sa o aleaga pentru a &#8220;fi mai bine&#8221; depinde de protocolul de rotuare , folosit sau de mai multe..</p>
<p>Sper ca v-am mai lamurit putin cum si ce , pe lectia viitoare ! </p>
<p>[by !_30]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/local-area-networkby-_30/feed/</wfw:commentRss>
		</item>
		<item>
		<title>IPSec[by !_30]</title>
		<link>http://www.skullbox.info/ipsecby-_30/</link>
		<comments>http://www.skullbox.info/ipsecby-_30/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 18:48:51 +0000</pubDate>
		<dc:creator>d3light</dc:creator>
		
		<category><![CDATA[Retele]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/ipsecby-_30/</guid>
		<description><![CDATA[Salut !
Lectia 1
Desi acest tutorial ar dura si &#8220;mii de pagini&#8221; , fara gluma , deoarece IPSec este ceva destul de complex cu destul de mult roluri , daca esti putin descurcaret il poti face pe cateva pagini lejer.Asta voi incerca eu in randurile &#8220;multe&#8221; care urmeaza mai jos.
IPSec in complexitatea sa , initial , [...]]]></description>
			<content:encoded><![CDATA[<p>Salut !</p>
<p>Lectia 1</p>
<p>Desi acest tutorial ar dura si &#8220;mii de pagini&#8221; , fara gluma , deoarece IPSec este ceva destul de complex cu destul de mult roluri , daca esti putin descurcaret il poti face pe cateva pagini lejer.Asta voi incerca eu in randurile &#8220;multe&#8221; care urmeaza mai jos.</p>
<p>IPSec in complexitatea sa , initial , inainte sa apara , atatea subprotocoale , care mai de care mai updatate care sa le includa avea rolul de</p>
<blockquote><p> a trimite date securizate intre doua terminale </p></blockquote>
<p>. Simplu si concret ! Insa aceasta e o poveste lunga si complicata.</p>
<p>IPSec poate trimite , date securizate intre doua noduri de pe retea se numeste tipul transport sau intre doua noduri / hopuri / routere / servere din retele diferite { de pe internet } si aici apare notiunea de tunneling .</p>
<p>Mai jos voi prezenta insa &#8220;sumar&#8221; cum se incepe si se termina o astfel de transmisie de date securizate , intre doua noduri de pe LAN.Trebuie sa fiti atenti pentru a putea intelege ceva :</p>
<p>Prima parte pe care o vom studia se numeste &#8220;negocierea&#8221; , ca la piata , inainte sa faci un transfer &#8220;securizat&#8221; de bani de la tine { client } la vanzator , trebuie sa va hotarati la un pret de comun acord { daca e negociabil } cum zice si numele acestei faze si la mai multe detalii suplimentare.</p>
<p>Aceasta negociere se imarte in doua &#8220;transe&#8221; :</p>
<blockquote><p> faza PRIMARA + faza RAPIDA </p></blockquote>
<p>-sa incepem cu faza primara .<br />
-PC 1 , trimite pachet la PC 2 { pachetul nu a iesit inca pe cablu , deci aveti rabdare } , driverul IPSec se uita sa vada daca pachetul ar trebui trimis securizat , si vede ca trebuie , deci nu trimite inca pachetul &#8220;il lasa in buffer&#8221; , ci incepe negocierile pentru transmiterea securizata de date catre PC 2 .{sa vedem daca si PC 2 vrea aceasta transmisie securizata , depinde daca e obligatorie mean require security , daca e si PC 2 nu vrea se opreste tranmisia si daca nu e obligatorie e doar request , trimite nesecurizat , cum o fi.<br />
-IKE , are roul de a incepe negocierea pentru transmia de date.<br />
-Computer 1 trimite un mesaj prim { de negociere , nu ce vroia sa trimita initial , inainte sa stie daca e securizat sau nu , aici e o chestie de OSI model , treptele acestuia }.IKE message pentru negociere e trimis catre destinatie cu sursa UDP port 500 si destinatie UDP port 400 { desigur la TCP }.<br />
-al doilea PC , primeste , se uita in headerul IKE message pentru negociere si apoi in IPSec sa vada daca e sau nu se vrea securizare intre cei doi.<br />
-daca si PC 2 , incepe negocierea pentru IKE SA , as se numeste .<br />
-computerele in aceasta faza se autentifica, si genereaza o cheie &#8220;master&#8221;.</p>
<p>-sa continuam cu faza rapida {secundara}.<br />
-primul PC , se uita la intreaga politica de securitate , pentru alte moduri cum ar fi encryptare si restul &#8220;tratamentelor&#8221; pentru securitate.<br />
-trimite PC-ului 2 , si PC-ul 2 se uita si &#8220;fenomenal&#8221; e si el de acord.{cu tipul de securizare inceput si trimit prin mesaje IKE , dupa faza IKE SA , de primul PC }.<br />
-are loc trimiterea de pachete encryptata la destinatie PC 2 si invers , apoi decryptar pe baza de chei , etc.. de celalalt PC , destinatia.</p>
<p>Lectia 2</p>
<blockquote><p>Implementare si intelegere </p></blockquote>
<p>Pai in general VPN-ul este folosit de acele aplicatii { sa zicem } , care au nevoie de tranmisie securizata de date , pentru asta a fost conceput initial.</p>
<p>VPN , tunneling si secure data transmision , cam asta e in mare ce poti face cu IPSec</p>
<p>Poate fi asemanat si cu SSL-urile , sau TLS-urile folosite pentru encrypate date { cand intri pe Gmail per example https } .Cam tot pe acolo e.</p>
<p>Un mare avantaj al IPSec e ca lucreaza exact sub layerul de transport al modelului OSI ceea ce-l face mai bun { decat SSL-urile , sau TLS-urile } , dar ii da si niste mici {  bubite },</p>
<p>Ai putea da si 2-3 exemple de aplicatii care folosesc IPSec ?</p>
<p>-in afara de VPN -ul binecunoscut , IPSec mai este folosit si pe LAN la cunexiuini client-server,conexiuni router-router { pe WAN }  ,  si conexiuni RAS securizate.</p>
<p>O chestie interesanta , buna de stiut : deriva de la ideea :</p>
<p>-IPSec are doua protocoale primare : AH { care da integritatea pachete , etc } si ESP { autentificare , confidentilatate si integritate } , dar faza tare ca ESP-ul e INTERZIS in unele tari , citeam mai de mult pe wikipedia.</p>
<p>-foloseste algortmi care fac hashuri { MD5 sau SHA-1 }  , si chei pentru a calcula valoarea de inegritate a pachetelor { daca au ajuns bine securizate de la nodul 1 la nodul 2 }.</p>
<p>E bine de stiut ca incepand cu IP v6 { pe 128 de biti , noile IP-uri sunt in forma hexazecimala } , IPSec e obligatoriu.</p>
<p>Interesant e ca IPSec a inceput sa fie &#8220;dezvoltat&#8221; si pe platforme BSD , Solaris , Linux : odata cu niste proiecte :   FreeS/WAN.De exemplu proiectul : KNAME implementeaza  toata gama IPSec pe NetBSD si OpenBSD.</p>
<p>IPSec e folosit si pe routere Cisco pentru transfer securizat de date.</p>
<p>Mai e implementat si la VoIP , IPSec , o alternativa a IPSec mai este si TLS-ul care nu are aceasi putere ca IPSec.</p>
<p>-uitasem , foloseste un protocol pentru securitate inalta pe 2048 biti.</p>
<p>-o chestie super interesanta :<br />
-cineva spunea : &#8221;<br />
Cand pe net se va implementa IP v6 + IPSec se va diminua spamul , pishingul si wormurile de pe net.</p>
<p>, desi doar lucrand la L3 , unii nu sunt de parere.</p>
<p>-mai au rol de creerea tunelelor de L3 in tehnologia wireless.</p>
<p>Interesant nu ?</p>
<p>[by !_30]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/ipsecby-_30/feed/</wfw:commentRss>
		</item>
		<item>
		<title>TCP/IP subnetworking[by !_30]</title>
		<link>http://www.skullbox.info/tcpip-subnetworking/</link>
		<comments>http://www.skullbox.info/tcpip-subnetworking/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 18:37:29 +0000</pubDate>
		<dc:creator>d3light</dc:creator>
		
		<category><![CDATA[Retele]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/tcpip-subnetworking/</guid>
		<description><![CDATA[Aici voi incerca sa reconstruiesc , colorez un vechi tutorial ! Sper sa minimizez greselile de ortografie si sa fac pe placul tutoror.
Ce rol are el cu IP-ul ?
-ce rol are IP-ul in  sub-retelare ?
Multi nici nu au auzit ce concept .Tasteaza doar mecanic  acele numere (IP , subnet mask .. ) , [...]]]></description>
			<content:encoded><![CDATA[<p>Aici voi incerca sa reconstruiesc , colorez un vechi tutorial ! Sper sa minimizez greselile de ortografie si sa fac pe placul tutoror.</p>
<p>Ce rol are el cu IP-ul ?</p>
<p>-ce rol are IP-ul in  sub-retelare ?<br />
Multi nici nu au auzit ce concept .Tasteaza doar mecanic  acele numere (IP , subnet mask .. ) , pe care li le da adminu .</p>
<p>Voi incerca sa explic , cum sunt formate/alcatuite IP-urile . / Si de ce ?  /  Ce rol are subnet-maskul ?<br />
Prin intermediul acestor randuri se vrea ca un incepator sa se mai lumineze putin prinvind aceasta tema .<br />
Tutorialul va fi lung ( pentru ochi , si pentru mine ) prezentand  in detaliu ,  tehnici diverse de sub-retelare , transformare din zecimal in binar ( tehnici care te vor ajuta sa transformi &#8220;in cap&#8221; ) si asa mai departe</p>
<p>IP-ul dupa cum ,  vedeti si voi , in forma zecimala este ceva  de genu 192.168.1.2 . (  exemplul este aleatoriu ;  apartineunei clase de IP-uri private ) .</p>
<p>Ip-ul pe care l-am prezentat mai sus este inteligibil in forma binara :</p>
<blockquote><p>192.168.1.2 =  11000000.10101000.00000001.00000010 </p></blockquote>
<p>Privind cu atentie dispunerea binara a IP-ului , cat si cea  zecimala observam : - acesta este impartit in 4 parti , numite generic octeti.</p>
<blockquote><p>      11000000.10101000.00000001.00000010 </p></blockquote>
<p>- Ce este acela un octet ? - este o grupare de 8 biti { puteti observa aceasta din exemplul de mai sus , patru parti ale IP-ului organizate fiecare in 8 numere/biti de 0 sau 1.</p>
<p>-dupa cum cred ca ati observat primi trei octeti au fost desemnati prin culoarea galben , si celalat prin culoarea rosu .Nu este la nimereala ci este cu un scop anume , aceea de a reprezenta si arata organizarea precisa a IP-ului , si forma sa binara dupa care ne vom juca cu subretelarea.</p>
<p>Dupa cum puteti observa IP-ul este format din patru octeti , ceea ce va trebui sa intelegem este ca o portiune din prima parte a IP-ului , reprezinta portiunea de &#8220;retea&#8221;, din ce retea face parte ( ati auzi fac parte din reteaua 192.168 ) si a doua parte semnifica partea de &#8220;host&#8221; , al catelea host este IP-ul respectiv.</p>
<p>Cum ati observat , IP-urile sunt de mai multe tipuri , ele fiind organizate in CLASE , pentru a satisface nevoia mica/medie/mare de IP-uri intr-o retea.</p>
<p>Sunt 5 clase de IP-uri , insa numai primele 3 se folosesc efectiv , pentru ca useri de rand sa comunice , restul fiind folosite cu altte scopuri gen ( cercetare de viitor ).</p>
<p>In continuare voi prezenta cele 3 clase de IP-uri si voi explica cum acestea influienteaza , arata si caracterizeaza care este portiune care arata partea de retea si de host a unui IP.</p>
<p>CLASA A</p>
<p>1.0.0.0 - 127.255.255.255 </p>
<p>-aceasta e partea folosita de clasa A , de IP-uri.<br />
HINT : nu toate acele IP-uri sunt routabile , si folosite pe Internet ( asta vom discuta mai tarziu ).<br />
- Default subnet mask  , pentru clasa A este :</p>
<p>255.0.0.0 </p>
<p>-insa ce-i cu asta ? care e impletirea intre acest subnet mask ? si IP-urile din clasa A ? Defapt este destul de simplu , deoarece acest subnet mask , este default , indicand o retea de clasa A , fara subretele inca.   </p>
<p>-hai sa luam un IP din clasa A , si subnet mask-ul default pentru clasa A :</p>
<p>-un IP ar fi 100.4.5.6 cu default subnet mask 255.0.0.0.Veti intelege imediat.Acel 255 semnifica ca primul octect din IP-ul de clasa A , este folosit pentru &#8220;retea&#8221; si restul de trei octeti sunt folositi pentru &#8220;hosturi&#8221;.<br />
-daca luam si transforma subnemaskul si IP-ul in binar format si pe punem unu sub altu observam :</p>
<p>11001000.00000100.00000101.0000010<br />
11111111.00000000.00000000.0000000</p>
<p>-vedeti ? defapt acel 255 in binar inseamna un octect plin de 1 , adica 11111111 .Ce semnifica acest lucru ? Acesi 1 arata ce portiune din IP este folosita pentru a desemna reteaua.Sper ca ati observat ca pe acest exemplu , reteaua e reprezentata integral de 100. , adica un user cu configuratia :</p>
<p>IP : 100.4.5.6<br />
Subnet Mask 255.0.0.0</p>
<p>putem spune ca are un IP care apartine Clasei A de IP-uri , are subnet mask-ul default pentru clasa A de IP-uri , foloseste integral primul octet pentru a arata din ce retea face parte , adica reteaua 100.0.0.0 { cum am dedus acest lucru usor , am lasat octectul care avea acei 8 de 1 sub el de la subnet=mask , intact si am inlocuit tot ce era cu 0 dedesupt ceilalti 3 octecti cu 0 , si am ajuns la reteaua din care face parte si anume : 100.0.0.0 }<br />
-pentru a desemna reteaua din care face parte putem scrie si sub CIDR ( o tehnica care inlocuieste ael subnemask cu ceva de genu /n } .Cati biti ( adica cati de 1 are subnet mask default , pentru clasa A ? are 8 deci putem scrie in loc de 255.0.0.0 = /8 ) , usor nu ? in loc de 255.255.0.0 , putem scrie /16 ( dati-va si voi seama de ce , printr-o simpla transformare in binar a celor doi octecti principali si adunare a numerelor de 1).<br />
-deci putem zice ca IP-ul 100.4.5.6 , cu subnet mask default de clasa A , 255.0.0.0 , apartine retelei 100.0.0.0 / 8  ( sper ca a inteles toata lumea de ce ? Ok mai repetam odata , tot ce e cu 1 dedesupt scriem intact ca la IP , si ce e cu 0 dedesupt de la subnet mask scriem cu 0 ).Intelesei ?</p>
<p>-cu toate aceste chestii intelese , ce rol are totusi un IP de clasa A , sau o retea pe clasa A ? Pai e simplu , daca luam reteaua 100.0.0.0/8 , avem o singura retea nu ? si cate hosturi poate include aceasta retea ? poate include 3 octecti de hosturi adica 2 la puterea 24 de hosturi.Foarte multe.De unde am luat aceasta tehnica ? Sa-mi dau seama cate IP-uri sunt , e simplu , priviti exemplul de mai jos :</p>
<p>100.1.0.0<br />
100.1.0.1<br />
100.1.0.2<br />
&#8230;&#8230;&#8230;..255 => avem pana acum 255 de IP-uri<br />
100.2.0.0<br />
100.2.0.1<br />
&#8230;&#8230;&#8230;..255 => + inca 255 avem 512 , ducandu-me mai departe cu exemplul , com ajunge la numarul gigant de hosturi care il poate include o Clasa A de IP-uri.</p>
<p>-clasa A de IP-uri e folosita , pentru retele foarte mari , care au nevoie de foarte multe hosturi.<br />
-daca credeti ca ati inteles , putem la Clasa B , de IP-uri care este destul de simpla avand baza solida ( presupun ca ati inteles ceva ) , la Clasa A.</p>
<p>CLASA B</p>
<p>128.0.0.0 - 191.255.255.255</p>
<p>-acestea sunt IP-urie care pot fi incluuse in clasa B de IP-uri ( desigur nu sunt toate foosite pe internetul public , fiind si unele routabile , private ).<br />
-subnet-mask default pentru clasa B este : 255.255.0.0<br />
-Deci ce inseamna aceasta ? Ca puteti da seama singuri din multele exemple precedente de la Clasa A ? Daca nu va voi prezenta eu mai jos :</p>
<p>sa presupunem ca avem IP-ul : 129.1.1.1   si subnet-maskul default.<br />
{ le punem una sub alta in format binar , pentru a intelege mai bine acest fenomen).</p>
<p>10000001.00000001.00000001.00000001<br />
11111111.11111111.00000000.00000000</p>
<p>-sper ca ati obseravat culorile ? si va dati seama &#8220;ceva ceva&#8221; ce rol ar avea acestea ? Aceasta vrea sa semnifice  ca primi doi octeti cei cu galben semnifica partea de &#8221; network &#8221; si ceilalti 2 de &#8221; host &#8220;.<br />
-dupa cum va dati seama , acest IP apartine , retelei 129.1.0.0, sau mai simplu , dupa cum am invatat mai devreme 129.1.0.0/16 ? de ce 16 ? deoarece subnet mask-ul default contine 16 de 1 consecutiv si 16 de 0 , de ce 129.1 ? deoarece primi doi octeti integral sunt 1 ( adica se va scrie integral primi doi octeti , pentru a denumi reteaua din care face parte ) , si restu se inlocuieste cu 0 , deoarece ultimi doi octeti de la  subnet mask default sunt complet 0.<br />
-aici sunt in jur de 65 de mii de hosturi posibile , dati-va si voi seama di exemplu de mai jos , sau dupa micul calcul 2 la puterea a 16 hosturi ( deoarece sunt 16 de 0 - 0 e pentru hosturi , de la subnet  mask default  ) , si 2 la a 16 retele ( daca subretelam , deoarece sunt 16 de 1 , 1 reprezinta v-ati dat seama partea de retea , de aceea am scris integral partea din IP , care era dedestupt cu unu de la subnet mask , got the idea ? ).   </p>
<p>129.1.0.1<br />
129.1.0.2<br />
&#8230;&#8230;&#8230;&#8230;255 => 255 de IP-uri<br />
129.1.0.1 => + inca 255 de IP-uri => 512 IP-uri.<br />
129.2.0.1 => si inca 255 => faceti si voi un calcul cate sunt in total</p>
<p>-clasa B este cum v-ati dat seama folosita pentru retele mai mici , care nu au nevoie de atatea hosturi ca retelele de Clasa A.Cu conditia sa mai recapitulati odata conceptele de mai sus , va voi prezenta si ultima clasa care mai e folosita pe Internet , pentru adresare  si anume Clasa C.</p>
<p>  CLASA C</p>
<p>192.0.0.0 - 223.255.255.255</p>
<p>-am de facut o remarca , cred ca ati observat cand doriti sa introduceti IP-ul dumneavoastra , pe primul octet daca puneti ceva de genu 245 , sau 255 , se va modifica automat in 223 , de ce ? deoarece de la 223 in sus , nu mai sunt IP-uri care adreseaza pe Internet si au alte scopuri bine definite.<br />
-subnetul default pentru Clasa C , este 255.255.255.0 , adica dupa cum cred ca ati inteles deja , de la primele doua explicatii cu Clasa A si Clasa B  , inseamna ca primi trei octeti sunt folositi  pentru a desemna partea de retea si celalat ramas partea de host.<br />
-cred ca realizati ca avand o clasa C , o singura clasa numarul de hosturi , putand fi oferit clientilor scade dramatic la 255 ( -2 , vom explica mai tarziu aceasta chestie ).<br />
-hai sa luam un IP de clasa C sio sa-i punem dedesupt subnet maskul default pentru clasa C.<br />
-vom alege IP-ul 194.1.1.1.</p>
<p>11000010.00000001.00000001.00000001<br />
11111111.11111111.11111111.00000000</p>
<p>-dupa cum se observa cu usurinta , sub primi trei octeti ai IP-ului avem numai 1 , deci ne putem da seama clar , ca face parte din reteaua 194.1.1 ( deoarece se transcrie integral , primi 3 octeti de la IP , deoarece au 1 sub ei - 1 este de retea ), si se lasa cu 0 , partea care are 0 dedepust de la subnet mask ( 0  e partea de host ) , adica va rezulta , 194.1.1.0 reteaua  si stim si smecheria ca avem 24 de 1  deci putem scrie /24 deci 192.168.1.0/24 .<br />
-pana aici toate bune si frumoase mai avem de exemplicat ceva ? Sau e totul inteles ? Revizuim tot ce am scris mai sus ( adica voi si apoi trecem mai departe , doar vrem sa subretelam nu alta ).<br />
-o sa prezint sumar si Clasele D &#038; E , doar pentru a putea voi integele mai bine aceste chestii cu IP-urile.</p>
<p>CLASA D</p>
<p>224.0.0.0 - 239.255.255.255</p>
<p>-s-ar putea sa va deruteze putin , insa aceste IP-uri , nu sunt organizate , pe baza de portiune host &#038; retea , si sunt de sine statatoare , adica IP-ul 224.0.0.1 , e un singur IP , nu i retele .<br />
-sunt folosite , pentru multicast.</p>
<p>HINT 1 : ce este acela un Multicast ? este o adresa , folosita , pentru a trimite date nu numai unui host / PC ( ci unei clase de PC-uri , anume clasa ),<br />
HINT 2 : ce este acela un Broadcast ? ca tot vorbiram de multicast , desi prima data ar fi trebuit sa incepem cu broadscast , broadcastul este ultima adresa de pe retea ( nu este folosita pentru a fi atribuita hosturilor / PC-urilor si are rolul de a trimite date la toate hosturile din retea.E destul de logic.<br />
-deci ca tot am aminitit aceasta chestie , trebuie sa remarcam , ca spuneam mai devreme , ca intr-o retea , numarul de hosturi se calculeaza , cati de zero sunt , sunt 10 per example   , ridicand 2 la puterea 10 si scadem cu 2.De ce ? Deoarece o adresa e rezervata pentru retea : cum am remarcat : 192.168.1.0 ( adresa de retea ) , si una  pentru broadcast ( adica adresa la care trimiti , si ajunge la toate hosturile dupa retea ) de genu , ultima adresa posibila din retea 192.168.1.255.Deci 254 de adresew posibile , ca de la 0 la 255 sunt 256 ,  deci 256 - 2 = 254.Cool ha ? Continuam , cu Clasa E , desi nu rpea avem ce spune prea multe .</p>
<p>CLASA E</p>
<p>240.0.0.0 - 255.255.255.255</p>
<p>-Clasa E este folosita in cercetare in viitor si alte chestii.<br />
-dupa cum va dati seama , nici aceasta nu are subnet mask , si fiecare adresa e singura de genu 252.252.252.254 , nefacand parta dintr-o retea.<br />
-cam atat despre Clasa E , a fost scurta , oricum nu veti gasi adrese de acest tip pe internetul Public.</p>
<p>Tin sa mentionez ca acest tutorial mic , nu e chiar asa de mic , insa pentru teoria bitilor e foarte mic , e facut special pentru IP v4 , odata cu noul IP v6 , se schimba multe.</p>
<p>HINT :  UNICAST address : o adresa care simbolizeaza un singur host dupa Internet ( uitasem sa mentionez si acest lucru ) , ca tot spusesem ce e ala broadcast si mutlicast   si nu stia sa stim si acest acronim.</p>
<p>Ca tot mai avem de zis , sa nu uitam , mai avem si niste IP-uri private de prezentat , care mai fac parte din clasele prezentate , de IP-uri si tot am zis ca o sa le prezint , e vorba de IP-urile private care nu au voie pe Internetul public.O sa trecem doar prin a insira clasele , si nu mai multe , ca deja intram in detalii si marim foarte , foarte tare tutorialul , si nici acum nu am ajuns la subretelarea propie.</p>
<p>Adrese rezervate pentru clasa A: 10.0.0.0/8<br />
Adrese rezervate pentru clasa B: 172.16.0.0/16<br />
Adrese rezervate pentru clasa C: 192.168.0.0/24<br />
Adrese rezervate pentru APIPA  : 169.254.0.1-169.254.255.254</p>
<p>-Totusi inainte sa trecem la subretelarea propiu-zisa vreau sa va prezint si un mic artificiu de calcul , de transformare octecti / numere zecimale in binare.</p>
<p>Artificiul incepe de aici : voi da numai un exemplu , trasformand numarul 162 ( e ales aleator , acu imi veni in minte ) , in binar , &#8220;in our head&#8221;.</p>
<p>162 -128 = 34 : deci avem un 1<br />
mai ramane 34 - 64 : nu se paote  deci 0<br />
tot 34 ramane -32 : 2 deci punem 1<br />
ramaen 2 -16 , nu merge , deci 0<br />
ramane tot 2 - 8 : nu merge , deci 0<br />
ramane tot 2 - 4 : nu merge , deci 0<br />
ramane tot 2 - 2 : =0  deci 0<br />
ramane 0  -1  : nu merge , deci 0</p>
<p>Acum daca luam de pe verticala de sus in jos si punem unu langa altul biti/0 si 1 , vom obtine , versiunea binara ( octet ) a lui 162 si anume :</p>
<p>162 = 10100010</p>
<p>E logc ? am luat numarul si prima data am scazut din el 128 apoi 64 , si asa ma departe ,  deci prima data 2 la a 7-a , pana la 2 la a 0-a.Deoarece am vrut sa facem sa fie numarul 162 pe un octet ( binar am inceput de la 2 la a 7-a  , deci 2 la 8-a -1 ).Daca vroaim sa fie reprezentat pe un WORD , incepeam sa scadem si sa tinem minte , in acelasi fel , insa incepeam de la 2 la a 13 , adica 2 la a 14-a -1 , deoarece un word are 16 biti.</p>
<p>HINT : WORD [/color] : un word , este un dublu octect , adica o adunatura de 16 1 si 0 , adic a 16 biti.   </p>
<p>Ca am inteles toate aceste chestii pe care le-am explicat mai sus , putem sa trecem la [b] subretelare propiu-zisa.Mai revizuiti punctele esentiale sa fiti siguri , deoarece , nu voi mai repeta , si voi trece direct in lucrurile complicate , presupunand ca voi stiti deja , ce am prezentat mai sus , clasele de IP-uri , legatura intre IP , subnet mask , biti de hot , si network , care e de hot care e de newtork , am zis ca daca sub portiunea de la IP avem 1 , insemana ca toti acei bitit , sunt de retea , daca ii numaram , putem scrie si subnetmask-ul CIRD de genu : daca sunt 12 scriem /12 got he point ?</p>
<p>Acum hai sa explicam putin , subnet-maskurile , si ce legatura au acestea cu subretelearea propiu-zisa.</p>
<p>-subnet-maskurile nu sunt numari , 255.0.0.0, 255.255.0.0. , sau 255.255.255.0 , aceastea sunt formele stas ,d aca avem o retea de clasa A , B sau C , insa daca vrem sa imaprtim reteaua in mai multe retele mai mici , bazate pe aceasi clasa A , B sau C , atunci ne folosim de subnet-mask , si cum  anume, aici trebuie sa fim atenti , deoarece este o chestie delicata.</p>
<p>-Ne vom ocupa de sub-retelare in Clasa C , deoarece sunt maxim 254 de hosturi , pe o retea , si este mai usor de facut calculul cu subretele.</p>
<p>Cum se face practic sub-retelelarea ? Hai ca am ajuns si aici pana la urma urmei , cu chiu cu vai , dupa tastat si tastat si iar tastat.</p>
<p>pentru clasa C avem  subnet default 255.255.255.0 .La subnetmask-ul asta nu putem defini decat reteaua propiu-zisa , daca avem IP-ul 192.168.1.2 , stim ca face partea din reteaua 192.168.1.0/24 , deoarece ne-am chinuit sa explicam mai sus.</p>
<p>insa acum vine problema , daca avem de exmplu , atribuita de ISP , o singura clasa C , de IP-uri , si vrem sa avem IP-urile distribuite in doua retele ? Cum facem ? Pai tocmai asta se numeste subretelare si are rolul subnet-mask sa ne zica , care e portiunea de network / retea  si care de host , si cum dintr-o singura clasa , adica Clasa C , intial o singura retea  putem face doua mici retele , juma juma , care se numeste defapt subretele .</p>
<p>Pai procedeul e simplu : avem subnemask in binar de genu :</p>
<p>11111111.11111111.11111111.00000000</p>
<p>-ca sa facem doua retele si sa impartim acest spartiu pe din doua , trebuie sa avem 128 de hosturi nu ? Pai hai sa fim atenti , daca avem acum 8 zeroruri default , deci avem 2 la a 8-a ( -2 , binenteles , pentru retea si broadcast , remember ?), cum facem sa avem din subnetmaskul  asta doar 128 de hosturi valabile ? Pai simplu , cat face 2 la a 7 ? face 128 , deci incluim primu 0 cu 1 , si avem ceva de genu :</p>
<p>11111111.11111111.11111111.10000000</p>
<p>-deci in zecimal ar veni acest subnemask 255.255.255.128.<br />
-clar ? Tocmai am facut subretelare si am imapartit spatiul acesta de 256 de locuri , in doua spatii de 128 de locuri, pe baza subnetmask-ului , care ne spune acest lucru , ca acum sunt 128 de hosturi , si cate retele ? ( pai si oricum primi 3 octeti  erau default 1 , deci  pentru afla cate retele vor fi , luam cati de unu am pus , pentru subretelare , noi am pus numai 1 , si facem 2 la puterea 1 , deci doua retele a cate 128 de hosturi , fiecare . Nu o sa fie 128 de hosturi pentru PC-uri valabile , deoarece pe fiecare retea , adica pe amebele , pe care le-am subretelat ,avem o adresa de retea si una de broadscat.Fiecare retea are cate una<br />
unica. </p>
<p>Deci acum sa vedem ce am reusit :</p>
<p>avem doua retele nu ? Fiecare a cate 128 de locuri nu ?</p>
<p>Prima retea : 192.168.1.0-192.168.1.127 (sunt 128 de locuri ).<br />
A doua retea : 192.168.1.128-192.168.1.255 ( inca 128 de locuri ).</p>
<p>in loc  de reteaua : 192.168.1.0/24 sau 192.168.1.0-192.168.1.255 am facut doua retele si anume , 192.168.1.0/25 ( avem 25 de 1 ) , si 192.168.1.128/25 ( avem 25 de 1, prima adresa de la reteaua 2 , e adresa de retea , si ultima , adica 192.168.1.255 e adresa broadast ).La prima retea , adresa broadcas e ultima , inainte de prima adresa de la a doua retea , deci broadcast pentru prima retea este : 192.168.1.127 .Am facut toate acestea bagand inca un 1 in loc de 0, pentru a face doua retele.</p>
<p>Pentru a face mai multe retele avem combinatiile :</p>
<p>* bagam un 1 : 2 la 1 : 2 retele<br />
* bagam doi de 1 : 2 la a 2 : 4 retele<br />
* bagam trei de 1 : 2 la a 3 : 8 retele</p>
<p>Sper ca e inteles , mai luam un singur exemply , pentru clasa C , de exemplu , luam IP-ul 192.168.2.1 , care face parte initial , fiind din clasa C , si avand subnet mask default , din reteaua , 192.168.2.0/24 , si vrem sa avem 8 retele.Cum facem ? Simplu bagam 3 de 1 , iun subnt mask , in loc de 0 si vine :</p>
<p>11111111.11111111.11111111.11100000</p>
<p>-vom avea 8 retele cu cate 2 la a 5-a hosturi , (-2 pentru retea si broadcast ) , si va avea un CIDR de tipul /27 (  avem 27 de biti de 1 consecutivi ).</p>
<p>vom lua si niste mici exemple : ( unde prima adresa , de la care incepe reteaua e adresa de retea , si ultima adresa , la care se termina reteaua e broadcast ). </p>
<p>  Prima retea : 192.168.2.0-192.168.2.31 ( deci 32 ).<br />
A doua retea : 192.168.2.32-192.168.2.63 ( inca 32).<br />
&#8230;.<br />
Ultima retea 192.168.2.224-255 ( inca 32 ).</p>
<p>-Asta a fost cam tot ce am avut de  spus , fireste mai era mult mai mult , teoria bitilor nu se termina niciodata , dar e un inceput , incercati si voi pe retele de Clasa A sau B sa subretelari si macar sa intelegeti ce am scris mai sus.</p>
<p>Bafta si spor la munca !  {  Tutorial facut integral de !_30 }</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/tcpip-subnetworking/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tutorial Javascript: Lucrurile de bază şi recunoaşterea JavaScriptului</title>
		<link>http://www.skullbox.info/tutorial-javascript-lucrurile-de-baza-si-recunoasterea-javascriptului/</link>
		<comments>http://www.skullbox.info/tutorial-javascript-lucrurile-de-baza-si-recunoasterea-javascriptului/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 16:49:50 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/tutorial-javascript-lucrurile-de-baza-si-recunoasterea-javascriptului/</guid>
		<description><![CDATA[Tag-urile folosite pentru �ncadrarea scripturilor sunt
 şi  
 . Tag-ul care deschide scriptul ar trebui sa arate cam aşa:

Codul JavaScript
 
Se pot folosi c�te astfel de tag-uri doriţi �n fişierul HTML, ca şi c�nd ar fi un tag normal. Doar amintiţi-vă să-l �nchideţi. Dacă urmariţi să folosiţi funcţii JavaScript, acestea trebuie plasate intre

 ale [...]]]></description>
			<content:encoded><![CDATA[<p>Tag-urile folosite pentru �ncadrarea scripturilor sunt<br />
<blockquote> şi  </p></blockquote>
<p> . Tag-ul care deschide scriptul ar trebui sa arate cam aşa:</p>
<blockquote><p>
Codul JavaScript
 </p></blockquote>
<p>Se pot folosi c�te astfel de tag-uri doriţi �n fişierul HTML, ca şi c�nd ar fi un tag normal. Doar amintiţi-vă să-l �nchideţi. Dacă urmariţi să folosiţi funcţii JavaScript, acestea trebuie plasate intre<br />
<blockquote></blockquote>
<p> ale documentului. �n acest fel, funcţiile sunt �ncărcate �nainte ca pagina să �nceapă să se afişeze şi nu vor apărea niciun fel de erori ale codului.<br />
Mai este un lucru de care trebuie ţinut cont �nainte să trecem să scriem scripturi.<br />
    Browserele vechi �ncă sunt folosite, dar ele nu recunosc tag-ul . Dec�t să scrieţi scriptul şi să vi-l afişeze ca pe un simplu text, mai bine �păcăliţi� browserul. Veţi face asta ignor�nd textul din tag-ul . Acest lucru se face folosing un comentariu HTML. Brwoserele vechi vor ignora textul dinăuntrul commenturilor, dar un browser ce suporta JavaScript va procesa totuşi scriptul.<br />
Cum se face asta? Un exemplu:</p>
<blockquote>
<p> Asta inchide partea comentariilor, iar browserul va procesa scriptul.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/tutorial-javascript-lucrurile-de-baza-si-recunoasterea-javascriptului/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Instalare cms Jupiter Portal</title>
		<link>http://www.skullbox.info/instalare-cms-jupiter-portal/</link>
		<comments>http://www.skullbox.info/instalare-cms-jupiter-portal/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 09:33:29 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/instalare-cms-jupiter-portal/</guid>
		<description><![CDATA[Cum sa instalezi Jupiter CMS?

    Necesitati:
un hosting care sa aiba si support php
o baza de date MySql
si spatiu suficient pe FTP
    Pentru inceput luati scriptul,  (il puteti lua de pe site-ul : http://www.cms-help.net), il dezarhivati, iar apoi il uploadati pe ftp-ul vostru.
    Sa incepem instalarea [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Cum sa instalezi Jupiter CMS?<br />
</strong><br />
    Necesitati:<br />
un hosting care sa aiba si support<strong> php</strong><br />
o baza de date <strong>MySql</strong><br />
si spatiu suficient pe<strong> FTP</strong><br />
    Pentru inceput luati scriptul,  (il puteti lua de pe site-ul : <a href="http://www.cms-help.net">http://www.cms-help.net</a>), il dezarhivati, iar apoi il uploadati pe ftp-ul vostru.<br />
    Sa incepem instalarea <strong>cms</strong>-ului <strong>Jupiter Portal</strong>:<br />
I. Primul pas include intrarea pe site undeva va intra direct installul la care veti da <strong>Next</strong> si dupa aia inca o data next:<br />
<img src="http://img63.imageshack.us/img63/3301/install1qx7.jpg" alt="Instalare Jupiter Portal"/><br />
II. Trebuie sa fiti ajuns la :<em> mySQL Information si Your information</em>. unde veti completa cu numelei bazei de date userunameul, parola si hostnameul (deobicei localhost). Ex:<br />
<img src="http://img165.imageshack.us/img165/8172/install2mo5.jpg" alt="Instalare cms Jupiter Portal"/><br />
III. In acest ultim pas trebuie sa completati mai jos cateva date despre userul pe care il veti crea pentru a administra site-ul cum ar fii parola, adresa de e-mail si numele siteului.Ex:<br />
<img src="http://img165.imageshack.us/img165/1194/install3hy9.jpg" alt="Instalare cms Jupiter Portal"/><br />
Si gata scriptul este instalat.</p>
<p>    <strong>Tutorial realizat de echipa www.CMS-Help.Net | HexString</strong></p>
<p>Pentru a vedea demo-ul intrati pe : <a href="http://demo.cms-help.net/jupiter/">http://demo.cms-help.net/jupiter/</a></p>
<p>USER : <strong>Admin</strong><br />
PASS: <strong>demo</strong><br />
<strong>&copy; Hexstring</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/instalare-cms-jupiter-portal/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Instalare platforma forum SMF</title>
		<link>http://www.skullbox.info/instalare-platforma-forum-smf/</link>
		<comments>http://www.skullbox.info/instalare-platforma-forum-smf/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 09:23:40 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/instalare-platforma-forum-smf/</guid>
		<description><![CDATA[Cum sa instalezi SMF?
    Necesitati:
un hosting care sa aiba si support php
o baza de date MySql
si spatiu suficient pe FTP
    Pentru inceput luati scriptul,  (il puteti lua de pe site-ul : http://www.cms-help.net), il dezarhivati, iar apoi il uploadati pe ftp-ul vostru.
    Sa incepem instalarea cms-ului [...]]]></description>
			<content:encoded><![CDATA[<p>Cum sa instalezi <strong>SMF</strong>?</p>
<p>    Necesitati:<br />
un hosting care sa aiba si support php<br />
o baza de date <strong>MySql</strong><br />
si spatiu suficient pe <strong>FTP</strong><br />
    Pentru inceput luati scriptul,  (il puteti lua de pe site-ul : <a href="http://www.cms-help.net">http://www.cms-help.net</a>), il dezarhivati, iar apoi il uploadati pe ftp-ul vostru.<br />
    Sa incepem instalarea <strong>cms</strong>-ului <strong>SMF</strong>:<br />
I.Primul pas intrati pe link-ul : <a href="http://www.siteultau.ro/smf/install.php">http://www.siteultau.ro/smf/install.php</a>, si completati primul cam cu numele site-ului ex:<br />
<img src="http://img405.imageshack.us/img405/3039/install1tx7.jpg" alt="Instalare SMF"/><br />
II.In urmatorul pas trebuie sa completati datele despre baza de date: Hostname (deobicei localhost),username,password,baza de date si prefixul (este recomandat sa folositi prefix la tabele in caz ca folositi mai multe scripturi pe o singura baza de date).Ex:<br />
<img src="http://img161.imageshack.us/img161/6852/install2ea8.jpg" alt="Instalare SMF"/><br />
III.Dupa aceea dati click pe Proceed si veti merge pe urmatoarea pagina, unde veti completa datele pe care le doriti sa le aveti pentru logarea ca admin.Ex:<br />
<img src="http://img65.imageshack.us/img65/5182/install3qt0.jpg" alt="instalare forum SMF"/><br />
IV.Click pe Finish iar mai apoi bifati ca sunteti de acord sa stergeti install.php, si gata. Aveti forumul SMF instalat il puteti vedea la <a href="http://www.siteultau.ro/smf/  ">http://www.siteultau.ro/smf/  </a>  <strong>Tutorial realizat de echipa http://www.CMS-Help.Net | HexString</strong></p>
<p>Puteti incerca script-ul aici : <a href="http://demo.cms-help.net/smf">http://demo.cms-help.net/smf</a></p>
<p>USER : <strong>Admin</strong><br />
PASSWORD: <strong>demo</strong><br />
<strong>&copy; Hexstring</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/instalare-platforma-forum-smf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Instalare platforma forum PhpBB</title>
		<link>http://www.skullbox.info/instalare-platforma-forum-phpbb/</link>
		<comments>http://www.skullbox.info/instalare-platforma-forum-phpbb/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 08:55:47 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/instalare-platforma-forum-phpbb/</guid>
		<description><![CDATA[Cum sa instalezi PhpBB?
    Necesitati:
un hosting care sa aiba si support php
o baza de date MySql
si spatiu suficient pe FTP
Pentru inceput luati scriptul, eu am ales versiune de pe siteul http://www.phpbb.ro , pentru ca e o comunitate destul de mare si e buna versiunea actuala in limba romana (dar il puteti gasi [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Cum sa instalezi PhpBB?</strong></p>
<p>    Necesitati:<br />
un hosting care sa aiba si support <strong>php</strong><br />
o baza de date <strong>MySql</strong><br />
si spatiu suficient pe <strong>FTP</strong></p>
<p>Pentru inceput luati scriptul, eu am ales versiune de pe siteul <a href="http://www.phpbb.ro">http://www.phpbb.ro</a> , pentru ca e o comunitate destul de mare si e buna versiunea actuala in limba romana (dar il puteti gasi mai usor si pe site-ul : <a href="http://www.cms-help.net">http://www.cms-help.net</a>), il dezarhivati, iar apoi il uploadati pe <strong>ftp-ul</strong> vostru.</p>
<p>Sa incepem instalarea cms-ului <strong>PhpBB</strong>:<br />
I.Pentru inceput intra pe :<a href=" http://www.siteultau.ro/phpbb/install/install.php"> http://www.siteultau.ro/phpbb/install/install.php</a> (depinde de unde ti-ai uploadat fisierele forumului).Si vom incepe sa completam datele din tabelul de pe aceasta pagina.Primele date care ni se cer sunt : Limba, Tipul bazei de date,si Metoda. Completati la fel ca si modelul de mai jos depinde de dorintele si detaliile despre serverul bazei de date pe care il folositi:<br />
<img src="http://img211.imageshack.us/img211/5084/install1hv6.jpg"/></p>
<p>II.Urmatorul pas include completarea campurilor despre baza de date si detaliile administratorului.Sa incepem cu baza de date completati Hostnameul(de obicei logalhost), numele bazei de date, userul, parola si prefixul care vreti sa il folositi la tabele (este recomandabil sa folositi daca aveti pe o signura baza de date mai multe scripturi), un exemplu de completare aveti mai jos:<br />
<img src="http://img234.imageshack.us/img234/7089/install2vj3.jpg"/></p>
<p>III.Mai aveti de completat datele personale pentru Userul de admin, cum ar fii username, parola, e-mail (casutele 2,3,4 – lasati-le necompletate pentru ca se completeaza autmat). Ex:<br />
<img src="http://img50.imageshack.us/img50/5442/install3ct8.jpg"/></p>
<p>IV.Dupa aceea dati Porneste instalarea.Daca nu ati avut probleme, si ati instalat totul ok, urmatoarea pagina va trebuii sa contina un buton Terminare instalare pe care tocmai trebuie sa il apasati, iar mai apoi stergeti folderele din ftp contrib si install ca si masura de securitate, totul ar trebuie sa mearga ok si puteti sa va logati cu userul si parola alese la instalare.</p>
<p>    <strong>Tutorial realizat de echipa <a href="www.CMS-Help.Net">www.CMS-Help.Net</a> | HexString</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/instalare-platforma-forum-phpbb/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Instalare platforma blog Wordpress</title>
		<link>http://www.skullbox.info/instalare-platforma-blog-wordpress/</link>
		<comments>http://www.skullbox.info/instalare-platforma-blog-wordpress/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 08:39:58 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/instalare-platforma-blog-wordpress/</guid>
		<description><![CDATA[Cum sa instalezi Wordpress?
In primul rand ai nevoie de un host cu suport php, o baza de date MySql si evident spatiu suficient pe FTP.
Pentru a putea incepe instalearea trebuie sa luati scriptul (il puteti gasi si pe site-ul : http://www.csm-help.net),  sa-l dezarhivati si sa-l uploadati pe ftp-ul dumneavoastra.
Asigurandu-va ca toate fisierele au fost [...]]]></description>
			<content:encoded><![CDATA[<p>Cum sa instalezi Wordpress?</p>
<p>In primul rand ai nevoie de un <strong>host</strong> cu suport <strong>php</strong>, o baza de date <strong>MySql</strong> si evident spatiu suficient pe <strong>FTP</strong>.<br />
Pentru a putea incepe instalearea trebuie sa luati scriptul (il puteti gasi si pe site-ul : <a href="http://www.csm-help.net">http://www.csm-help.net</a>),  sa-l dezarhivati si sa-l uploadati pe <strong>ftp-ul</strong> dumneavoastra.<br />
Asigurandu-va ca toate fisierele au fost uploadate putem incepe instalarea scriptului.</p>
<p>1.In folderul pe care tocmai l-ati uploadat (<strong>wordpress</strong>) se gaseste un fisier numit: <strong>wp-config-sample.php</strong>, acesta il deschideti cu un editor de texte (ex: Notepad) si il modificati astfel:<br />
Modificarile facute fiind:<br />
DB_NAME: numele bazei de date<br />
DB_USER: userul bazei de date<br />
DB_PASSWORD: parola bazei de date<br />
DB_HOST: localhost (in cele mai multe cazuri)<br />
<img src="http://img235.imageshack.us/img235/5592/install1bv2.jpg"/><br />
Fisierul nou creeat SE SALVEAZA sub numele de:  <strong>wp-config.php</strong><br />
2.Intrati pe http://siteulmeu.ro/wordpress/wp-admin/install.php unde veti executa clik pe First Step pentru a continua Instalarea.<br />
3.In acest pas veti complecta astfel: La Weblog title veti pune titlul blogului, iar la e-mail veti pune e-mailul administratorului.<br />
4.Executand clik pe butonul ce il vedeti instalarea e gata. Userul si parola va sunt afisate.<br />
<img src="http://img526.imageshack.us/img526/4215/install2dw9.jpg"/></p>
<p>Puteti incerca demo-ul aici : <a href="http://demo.cms-help.net/wordpress">http://demo.cms-help.net/wordpress</a><br />
<strong>&copy; Hexstring</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/instalare-platforma-blog-wordpress/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lucrul cu fisierele</title>
		<link>http://www.skullbox.info/lucrul-cu-fisierele/</link>
		<comments>http://www.skullbox.info/lucrul-cu-fisierele/#comments</comments>
		<pubDate>Fri, 14 Dec 2007 17:05:40 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/lucrul-cu-fisierele/</guid>
		<description><![CDATA[M-am gandit si eu sa fac un mic tutorial in C despre &#8220;Operatii ce se pot realiza asupra unui fisier&#8221;! Poate il scutesc un pic pe OSHO de ceva treaba. Ok..sa incepem cu simple operatii de citire/scriere pe fisiere. Exista mai multe modalitati de a realiza citirea/scrierea asupra unui fisier.Eu va voi prezenta doar una [...]]]></description>
			<content:encoded><![CDATA[<p>M-am gandit si eu sa fac un mic tutorial in C despre &#8220;Operatii ce se pot realiza asupra unui fisier&#8221;! Poate il scutesc un pic pe OSHO de ceva treaba. Ok..sa incepem cu simple operatii de citire/scriere pe fisiere. Exista mai multe modalitati de a realiza citirea/scrierea asupra unui fisier.Eu va voi prezenta doar una dintre ele. Metoda utilizata de mine consta in deschiderea unui fisier pentru operatii de scriere/citire,citirea/scrierea pe fisier realizata caracter cu caracter si in cele din urma inchiderea fisierului.</p>
<p><strong>Deschiderea fisierului pentru citire/scriere!</strong><br />
In primul rand pentru a accesa functia de deschidere a unui fisier trebuie sa includeti headerul <strong>stdio.h</strong> deasupra proiectului. </p>
<div class="codesnip-container" >#include<stdio></stdio></div>
<p>Functia care o vom folosi pentru a deschide un fisier este <strong>fopen</strong> si are urmatorul prototip in header: </p>
<div class="codesnip-container" >FILE *fopen(const char *locatiefisier,const char *mod_deschidere);</div>
<p><strong>locatiefisier</strong>  - contine locatia fisierului pe care doriti sa-l deschideti. Exemplu ar fi &#8220;C:inferno.log&#8221;<br />
<strong>mod_deschidere</strong> - reprezinta modalitatea de utilizare a fisierului (ex citire,adaugare,scriere)<br />
Modurile de deschidere sunt:</p>
<p>� a - deschide un fisier pentru operatiuni de adaugare.Daca fisierul nu exista,sistemul il creeaza!<br />
� r - deschide un fisier pentru operatiuni de citire.<br />
� w - creaza un fisier nou si il deschide pentru operatiuni de scriere,daca mai exista un fisier cu acelasi nume,functia suprascrie fisierul<br />
� r+ - deschide un fisier atat pentru operatiuni de scriere cat si pentru citire<br />
� w+ - creaza un fisier nou si il deschide atat pentru operatiuni de scriere cat si pentru citire,daca mai exista un fisier cu acelasi nume,functia suprascrie fisierul<br />
� a+ - deschide un fisier atat pentru operatii de citire cat si pentru operatii de adaugare.Daca fisierul nu exista,sistemul il creaza!</p>
<p>Functia<strong> fopen</strong> odata apelata,va returna un pointer de tip <strong>FILE</strong> asa cum specifica headeru<strong> stdio.h.</strong><br />
Daca fisierul nu s-a putut deschide,functia va returna valoarea de NULL.<br />
O modalitate de a verifica daca deschiderea unui fisier s-a puttu realiza este cu ajutorul conditiei <strong>if.</strong><br />
Exemplu: </p>
<div class="codesnip-container" >if((fisier_deschis=fopen(&#8221;<locatie_fisier>&#8220;,&#8221;r&#8221;))!=NULL)<br />
{<br />
  //Fisierul s-a putut deschide!<br />
}<br />
else<br />
{<br />
  //Fisierul NU s-a putut deschide!<br />
}</locatie_fisier></div>
<p>Cum am spus,
<div class="codesnip-container" >fopen</div>
<p> returneaza un pointer de fisier pe care il vom folosi mai tarziu pentru a citi sau scrie pe un fisier!<br />
In cazul exemplului de mai sus..pointerul ce-l returneaza <strong>fopen</strong> este atribuit lui <strong>fisier_deschis</strong> pe care il vom declara : </p>
<div class="codesnip-container" >FILE *fiser_deschis;</div>
<p>Pentru tutoarilul defata vom lua &lt;locatie_fisier&gt; ca fiind C:YServer.txt sau puteti voi sa dati orice alta locatie de fisier!</p>
<p><strong>Citirea si scrierea pe un fisier!</strong><br />
Acum ca am invatat sa deschide un fisier putem face operatii de I/O pe fisierul deschis!<br />
Functiile ce le vom folosi pentru operatii de I/O sunt <strong>fgetc</strong> pentru citire si <strong>fputc</strong> pentru scriere pe fisier!<br />
Prototipul lor in biblioteca <strong>stdio.h</strong> este urmatorul: </p>
<div class="codesnip-container" >int fgetc(FILE *pointer_de_intrare);<br />
int fputc(int caracter_transmis,FILE *pointer_de_iesire);</div>
<p>Acum sa le implementam in exemplul nostru.Sa zicem ca dorim sa afisam continutul fisieului deschis! </p>
<div class="codesnip-container" >FILE *fisier_deschis;<br />
int litera_citita;<br />
if((fisier_deschis=fopen(&#8221;C:YServer.txt&#8221;,&#8221;r&#8221;))!=NULL)<br />
{<br />
[b]while((litera_citita=fgetc(fisier_deschis))!=EOF)<br />
cout< <(char)litera_citita;[/b]<br />
}<br />
else<br />
{<br />
  //Fisierul NU s-a putut deschide! si atentionam utilizatorul<br />
  cout<<"Fisierul nu s-a putut deschide!";<br />
}</div>
<p>Dupa cum vedeti am folosit o structura repetitva <strong>while</strong>.Practic acest lucru informeaza programul ca el va citi fisierul,litera cu litera,pana va ajunge la finalul lui! Cand va ajunge la finalul fisierului,ciclul <strong>while</strong> se va termina!<br />
In structura <strong>while</strong> avem:<br />
</code>
<div class="codesnip-container" >cout< <(char)litera_citita;</div>
<p>Am folosit un <strong>cast</strong> &#8220;(char)&#8221; deoarece functia returneaza, dupa cum vedeti, un int si noi nu vrem sa afisam pe ecran cifre ci literele corespeunzatoare int-ului conform tabelului ASCII! (char) &lt;variabila_de_tip_int&gt; vede &lt;variabila_de_tip_int&gt; ca fiind corespondentul ei in ASCII!<br />
Functiile de I/O prezentate de mine sunt de citire/scriere <strong>caracter cu caracter</strong> desi exista si functii de citire linie cu linie,eu nu le voi prezenta in tutorialul de fata!Practit, functiile create mai sus scriu/citesc un caracter dupa care <strong>muta</strong> pozitia cursorului la urmatorul caracter.Daca s-a atins sfarsitul fisierului, functia va returna,asa cum am vazut in exemplu o constanta EOF(End Of FIle)</p>
<p><strong>Inchiderea unui fisier!</strong><br />
Dupa ce am realizat operatia de I/O si nu mai avem nevoie ca fisierul sa fie deschis pur si simplu il inchidem cu o functie special creata,tot din biblioteca <strong>stdio.h</strong> si anume <strong>fclose.</strong><br />
Prototipul ei este urmatorul:<br />
</code>
<div class="codesnip-container" >int fclose(FILE *pointer_la_fisierul_deschis);</div>
<p><strong>fclose</strong> returneaza 0 daca fisierul a fost inchis cu succes si o constana EOF(end of file) daca a aparut o eroare).Testatarea o putem face printr-un banal<strong> if. </strong></p>
<div class="codesnip-container" >if(fclose(fisier_deschis)==EOF)<br />
cout< <"A aparut o eroare la inchiderea fisierului!";</div>
<p>Daca nu apelati functia de inchidere a fisierului,nu va faceti griji,  programul le va inchide singur la terminarea lui!<br />
Sa implementam asta si in exemplul nostru:<br />
</code>
<div class="codesnip-container" >FILE *fisier_deschis;<br />
int litera_citita;<br />
if((fisier_deschis=fopen(&#8221;C:YServer.txt&#8221;,&#8221;r&#8221;))!=NULL)<br />
{<br />
 while((litera_citita=fgetc(fisier_deschis))!=EOF)<br />
cout<
<litera_citita;<br />
[b]fclose(fisier_deschis);[/b]<br />
}<br />
else<br />
{<br />
  //Fisierul NU s-a putut deschide! si atentionam utilizatorul<br />
  cout<<"Fisierul nu s-a putut deschide!";<br />
}</div>
<p>Daca ar fi sa facem un cod complet cu tot cu headere si main ar arata cam asa:<br />
</code>
<div class="codesnip-container" >#include&lt;conio&gt;<br />
#include&lt;iostream&gt;<br />
#include&lt;stdio&gt;<br />
void main()<br />
{<br />
FILE *fisier_deschis;<br />
int litera_citita;<br />
if((fisier_deschis=fopen(&#8221;C:YServer.txt&#8221;,&#8221;r&#8221;))!=NULL)<br />
{<br />
 while((litera_citita=fgetc(fisier_deschis))!=EOF)<br />
cout< <(char)litera_citita;<br />
<strong>fclose(fisier_deschis);<br />
}<br />
else<br />
{<br />
  //Fisierul NU s-a putut deschide! si atentionam utilizatorul<br />
  cout< <"Fisierul nu s-a putut deschide!";<br />
}<br />
fgetchar();<br />
}</div>
<p>In acest tutorial ati invatat:</p>
<p>� deschiderea fisierlor pentru operatii de I/O<br />
� realizarea de operatii I/O pe un singur caracter cu avansare de cursor la urmatorul caracter<br />
� inchiderea fisierului</p>
<p>Simplu,nu?<br />
Mai tarziu in acest topic va voi arata cum sa faceti operatii de &#8220;suprafata&#8221; asupra fisierelor in c(cum ar fi stergere,redenumire,etc) acum is un pic obosit&#8230;<br />
Pentru sugetii si comentarii postati <a href="http://www.skullbox.info/board/viewtopic.php?id=218">aici</a>!<br />
©3Nigma</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/lucrul-cu-fisierele/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pointeri</title>
		<link>http://www.skullbox.info/pointeri/</link>
		<comments>http://www.skullbox.info/pointeri/#comments</comments>
		<pubDate>Fri, 14 Dec 2007 16:45:14 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/pointeri/</guid>
		<description><![CDATA[Am cam ramas in urma cu lectiile din curs. Azi mi-am facut putin timp sa fac o scurta introducere in pointeri. Veti vedea ca este intr-adevar o introducere scurta. Nu am avut suficient timp (si nici dispozitia necesara) sa explic toate aplicatiile pointerilor dar e suficient sa va prindeti despre ce si cum fac pointerii. [...]]]></description>
			<content:encoded><![CDATA[<p>Am cam ramas in urma cu lectiile din curs. Azi mi-am facut putin timp sa fac o scurta introducere in pointeri. Veti vedea ca este intr-adevar o introducere scurta. Nu am avut suficient timp (si nici dispozitia necesara) sa explic toate aplicatiile pointerilor dar e suficient sa va prindeti despre ce si cum fac pointerii. Deci, here it goes:</p>
<p>Unul termen foarte greu de inteles pentru incepatorii in C este pointerul. Ce este un pointer ? La ce este bun ? De ce sa folosim pointeri cand tot ce fac e sa ne ingreuneze munca ? Incerc sa explic chestia asta mai jos.</p>
<p>Incepem cu prima intrebare, si anume &#8220;Ce este un pointer ?&#8221;</p>
<p>In lectiile anterioare ati vazut ca exista diferite tipuri de date in C. Exista int si long pentru numere intregi, char pentru caractere, float si double pentru numere reale. Pointerul este un tip nou de data dar care spre deosebire de celelalte tipuri memoreaza doar adrese.<br />
Ce inseamna asta ? Ca sa intelegeti ce inseamna trebuie sa va familiarizati cu cativa termeni intalniti in programare. Cand concepeti un program folositi, bineinteles, variabile. La definirea unei variabile stiti ca e important sa cunoasteti doua lucruri: tipul si numele acesteia. In timpul rularii unui program apare un nou termen de care trebuie tinut cont si anume adresa variabilei. Un pointer este o variabila care tine minte acest al treilea termen, adica adresa unei variabile.</p>
<p><strong><br />
Cum se declara un pointer ?</strong></p>
<p>Inainte de a folosi un pointer trebuie sa stim spre ce fel de resursa va pointa, adica sa stim ce tip de variabila se gaseste la adresa care o memoreaza. In functie de tipul de variabila care se gaseste la adresa respectiva, se declara pointerul. Adica, daca avem nevoie, de exemplu, de un pointer care sa pointeze catre o variabila de tip int il vom declara in felul urmator: </p>
<div class="codesnip-container" >int *pInt;</div>
<p>Dupa cum vedeti un pointer se declara ca si o variabila normala, in cazul nostru de tip int, cu diferenta ca numele variabilei are un asterisc ( * ) in fata ceea ce ne spune ca este un pointer, adica este o variabila care pastreaza o adresa a unei variabile de tip int, nu este o variabila de tip int. Ca o conventie de nume majoritatea programatoril prefera ca atunci cand se creaza un pointer sa i se dea un nume care incepe cu litera p (de la pointer). Astfel de fiecare data cand folositi variabila respectiva va amintit ca e pointer, nu o variabila normala.<br />
Prin analogie va puteti da seama cum se declara pointeri pentru alte tipuri de date: </p>
<div class="codesnip-container" >char *pCh; // un pointer catre un caracter<br />
char *float; // un pointer catre un numar intreg</div>
<p>Ok. E usor de declarat un pointer, dar cum ii spun sa memoreze o adresa ?</p>
<p>Ei, daca tot am declarat un pointer e bine sa si memoreze ceva si ca sa fie util trebuie sa memoreze o adresa. De fapt, asta e primul lucru care trebuie sa-l faceti dupa ce ati declarat un pointer: sa-i dati o valoare, sa-l faceti sa pointeze spre ceva.<br />
Pentru a-i spune unui pointer adresa care trebuie sa o memoreze se foloseste semnul egal ca in atribuirile normale cu diferenta ca inaintea variabilei a carei adrese trebuie memorate se pune semnul &#8216;&#038;&#8217; care ii spune compilatorului ca acolo NU valoarea variabilei trebuie data ca rvalue, ci adresa acesteia.<br />
OK, am invatat sa asociem o adresa trebuie sa vedem si cum se poate citi (afisa) valoarea care se gaseste la adresa respectiva. Asta se face ca si cum s-ar citi o valoare normala doar ca numele pointerului este prefixat de un asterisc ( * ). Asta spune compilatorului sa NU se citeasca/afiseze continutul pointerului si ceea ce se gaseste la adresa care este tinuta in pointer.<br />
Sa vedem si un exemplu concret care va ajuta sa intelegeti mai bine functionarea pointerilor: </p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;</p>
<p>int main(){<br />
  int i; // o variabila de tip int<br />
  int *pInt // un pointer catre un int</p>
<p>  pInt = &#038;i; // pInt citeste adresa lui i</p>
<p>  // afisam valoarea lui i si valoarea spre care pointeaza<br />
  // pointerul pInt<br />
  printf(&#8221;n%d - %dn&#8221;,i,*pInt);</p>
<p>}</p></div>
<p>Rezultatul ar trebui sa fie: 10 - 10<br />
Primul 10 este valoarea atribuita variabilei i. Al doilea 10 este valoarea care se gaseste<br />
la adresa care este memorata de pointerul pInt. Cum pInt memoreaza adresa lui i, *pInt<br />
va fi 10 adica valoarea lui i.</p>
<p>Haideti sa ne mai jucam putin cu pointerii. Incercati urmatorul program: </p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;</p>
<p>int main(){<br />
  int i, j;<br />
  int *pInt;</p>
<p>  i = 5;<br />
  j = 2;</p>
<p>  pInt = &#038;i;<br />
  printf(&#8221;n*pInt are valoarea %dn&#8221;,*pInt);</p>
<p>  pInt = &#038;j;<br />
  printf(&#8221;n*pInt are valoarea %dn&#8221;,*pInt);</p>
<p>}</p></div>
<p>Dupa ce compilati si rulati codul de mai sus va trebui sa vedeti doua linii. Pe prima linie ne spune ca *pInt are valoarea 5 iar pe cea de-a doua linie afisata ne spune ca *pInt are valoarea 2.<br />
De ce ? Simplu&#8230; i ia valoarea 5 si j ia valoarea 2. Inainte de primul printf() pInt memoreaza adresa variabilei i, adica *pInt va afisa valoarea variabilei i care este 5. Inainte de al doilea printf() pInt memoreaza adresa variabilei j iar la afisare pe ecran apare 2, adica valoarea variabilei j la care pointeaza acum pInt.</p>
<p>Haideti sa intram la chestii ceva mai avansate cum ar fi folosirea pointerilor in lucrul cu sirurile de caractere. Daca lucrati cu un singur caracter, utilizarea pointerilor nu se deosebeste de utilizarea lor in numerele intregi. In schimb daca folositi siruri de caractere apare o functionalitate in plus si anume posibilitatea de a incrementa sau decrementa un pointer.<br />
Sa vedem un exemplu: </p>
<div class="codesnip-container" >int main(){<br />
  int i;<br />
  char sir[] = &#8220;abcdefghi&#8221;;<br />
  char *pChar;</p>
<p>  pChar = &sir;</p>
<p>  for( i = 0 ; i < strlen(sir) ; i++ )<br />
     printf("%c",*(pChar + i));</p>
<p>}</p></div>
<p>Codul de mai sus declara variabila sir si o initializeaza cu sirul de caractere &#8220;abcdefghi&#8221;. Mai jos declaram un pointer, pChar, care memoreaza date de tip char. Mai jos punem in pChar adresa sirului de caractere declarat mai sus ( sir ).<br />
Bun, avem un sir de caractere, un pointer catre un sir de caractere&#8230; now what ? Afisam sirul de caractere afisand fiecare caracter in parte. Probabil va puneti intrebarea &#8220;Cum sa afisam un sir daca pChar pointeaza spre un caracter ?&#8221;. Ei bine, intr-adevar pointerul pointeaza spre un caracter dar in cazul sirurilor de caractere, care in memorie sunt reprezentate ca un sir lung de adrese consecutive, pointerul pointeaza catre primul caracter din acel sir. Adica, pChar = &#038;sir s-ar traduce ca &#8220;Memoreaza primul caracter din sirul sir.&#8221; Dupa cum am spus mai sus, toate caracterele sunt reprezentate ca zone consecutive din memorie iar pointerul il putem incrementa<br />
pentru a afisa continutul de la fiecare zona in parte.<br />
In cazul de fata am preferat sa nu incrementez pointerul si sa-i adaug un numar. Dupa cum vedeti am folosit o bucla for in care i este initializat cu valoarea 0 iar conditia de oprire e ca i sa fie mai mic decat lungimea sirului de caractere. La fiecare iteratie se va afisa caracterul care se gaseste la adresa pointata de pChar la care se adauga valoarea lui i. Ce inseamna asta ? Se va afisa din sir &#8220;a i-a&#8221; valoare. La prima trecere prin bucla i este 0, deci valoarea afisata va fi pChar + 0, adica va afisa primul caracter din sir pentru ca, dupa cum am spus mai sus, cand unui pointer ii atribuim adresa unui sir de fapt ii dam adresa primului caracter din sir. La a doua iteratie se va afisa valoarea de la adresa pChar + 1, adica de la inceputul sirului se &#8220;merge&#8221; distanta de 1 caracter si este afisat. La fel si mai departe.</p>
<p>Acelasi lucru putea fi scris si de forma:<br />
</code>
<div class="codesnip-container" >int main(){<br />
  int i;<br />
  char sir[] = &#8220;abcdefghi&#8221;;<br />
  char *pChar;</p>
<p>  pChar = &sir;</p>
<p>  for( i = 0 ; i < strlen(sir) ; i++ ){<br />
     printf("%c",*pChar++);<br />
  }</p>
<p>}</p></div>
<p>Codul de mai sus si codul anterior sunt echivalente cu diferenta ca nu se apeleaza pChar + deplasament cum era in primul caz ci se afiseaza doar pChar care este incrementat dupa fiecare afisare. Observati ca am folosit operatorul de incrementare dupa valoarea variabilei, adica mai intai va fi afisat *pChar si apoi va fi incrementat.</p>
<p>Cam asta ar fi ideea de utilizare a pointerilor. Bineinteles, pointerii sunt mult mai complecsi decat am prezentat eu aici. In randurile de mai sus am facut doar o prezentare scurta a ceea ce se numeste pointer.</p>
<p>Pentru a va obisnui cu pointerii pun mai jos inca un exemplu care e util sa il studiati si sa il intelegeti:</p>
<p>Transmiterea unui pointer ca parametru intr-o functie:<br />
</code>
<div class="codesnip-container" >#include &lt;stdio.h&gt;</p>
<p>void afiseaza(int *pInt);</p>
<p>int main(){<br />
  int i;</p>
<p>  i = 5;</p>
<p>  afiseaza(&#038;i);</p>
<p>}</p>
<p>void afiseaza(int *pInt){<br />
     printf(&#8221;%d&#8221;,*pInt);<br />
}</p></div>
<p>In codul de mai sus se poate vedea cum transmitem ca parametru functiei afiseaza() o adresa in locul unei valori. Cazul de fata este doar exemplificativ si nu are o valoare practica deosebita dar in cadrul unui program complex este o tehnica utila dintr-un motiv simplu: daca valoarea transmisa este foarte mare ( ex. o structura de 10MB ) nu este deloc util sa apelam functia dand ca parametru variabila. In schimb putem transmite doar adresa variabilei care urmeaza a fi prelucrate astfel evitand incarcarea memoriei.</p>
<p>Daca aveti nelamuriri, astept sa le postati <a href="http://www.skullbox.info/board/viewtopic.php?id=451">aici</a><br />
&copy; OSHO</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/pointeri/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lectia 05 - Lucrul cu siruri de caractere</title>
		<link>http://www.skullbox.info/lectia-05-lucrul-cu-siruri-de-caractere/</link>
		<comments>http://www.skullbox.info/lectia-05-lucrul-cu-siruri-de-caractere/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 18:30:43 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/lectia-05-lucrul-cu-siruri-de-caractere/</guid>
		<description><![CDATA[Ok&#8230;siruri in c&#8230;ce frumos suna!OK&#8230;sa ne intoarcem pentru un moment in lumea reala&#8230;sirurile de caractere(textele de cuvinte) din lumea reala sunt formate, asa cum le spune si numele,din caractere.Practic un text este format din mai multe caractere puse una langa alta.Asa este si in lumea de C - > un text este alcatuit din-trun sir [...]]]></description>
			<content:encoded><![CDATA[<p>Ok&#8230;siruri in c&#8230;ce frumos suna!OK&#8230;sa ne intoarcem pentru un moment in lumea reala&#8230;sirurile de caractere(textele de cuvinte) din lumea reala sunt formate, asa cum le spune si numele,din caractere.Practic un text este format din mai multe <strong>caractere</strong> puse una langa alta.Asa este si in lumea de C - > un text este alcatuit din-trun sir de caractere(array de caractere).Daca va mai aduceti amine,o variabila de tipa &#8216;caracter&#8217; se declara in felul urmator: </p>
<div class="codesnip-container" >char &lt;nume_variabila&gt; ;</div>
<p>Asa cum am spus mai sus,pentru un text avem nevoie de un sir(array) de variabile de tip &#8216;char&#8217;.Arrayul de caractere il declaram asa: </p>
<div class="codesnip-container" >char &lt;nume_variabila&gt;[dimensiune_sir];</div>
<p>exemplu:
<div class="codesnip-container" >char nume[20];</div>
<p>In exemplul de mai sus,programul creeaza si rezerva o zona de memorie de 20 de octeti.Umplerea acelei zone de memorie cu ceva text se realizeaza cu ajutoru functiei<br />
<strong>cin</strong> aceeasi functie care o folositi si pentru a citi alte tipuri de date.<br />
<strong><br />
Reprezentarea in memorie</strong><br />
Ok acum ca am vazut ca avem nevoie de array de char-uri pentru a inmagazina un text. Haideti sa vedem cum apare in memorie un text.<br />
Pentru a face acest pas trebuie sa stim sau sa ne reamintim,ce reprezinta defapt un array.Un array reprezinta o colectie de variabile declarate deodata pentru a face economie de spatiu la programare.Sa luam un exemplu normal.Sa zicem ca avem nevoie de 30 medii de la 30 indivizi.Daca am declara cele 30 medii in mod separat,am proceda cam asa: </p>
<div class="codesnip-container" >int media1,media2,media3&#8230;media30;</div>
<p>Ei bine,array-ul ne permite ca sa scurtam dramatic marimea codului &#8216;compresand&#8217; cele 30 de variabile declarate cu <strong>una singura!</strong><br />
Arrayul respectiv va arata asa:</p>
<div class="codesnip-container" >int medii[30];</div>
<p>Accesarea unei variabile din acest array se face asa: </p>
<div class="codesnip-container" >medii[int index_medie];</div>
<p>Sa zicem ca am dori sa stim media ce are index 13.In cazul acesta,am proceda astfel: </p>
<div class="codesnip-container" >medii[12];</div>
<p>Se observa ca,pentru a afla a 13-a medie se insereaza la index &#8230;numarul 12.De ce?probabil va intrebati.Ei bine&#8230;indexul unui array incepe de la <strong>0</strong> si nu de la 1 cum ar fi normal.Din acest motiv&#8230;apelare de </p>
<div class="codesnip-container" >medii[30];</div>
<p>ar da o eroare deoarece al 30-lea element are defapt index 29.<br />
Cam atat despre arrayuri&#8230;acum&#8230;cand declaram un array,numele arrayului reprezinta, defapt un pointer de memorie care indica locatia primului element din array.<br />
Sa zicem ca am declarat un array de caractere(un text) astfel: </p>
<div class="codesnip-container" >char nume[30];</div>
<p>sa zicem ca am introduce in &#8216;nume&#8217; &#8220;Popescu Ion&#8221;.In memorie ar fi reprezentat cam asa: </p>
<div class="codesnip-container" >Popescu Ion�                  &#60spatiile libere reprezinta cei 18 de octeti nefolositi!</div>
<p>Se observa prezenta lui .Acest  informeaza calculatorul ca sirul introdus se termina.Practic cand ii cerem calculatorului sa afiseze sirul introdus in arrayul<br />
&#8216;nume&#8217;&#8230;el va afisa litera cu litera pana va da de caz in care se va opri!<br />
Acum ca stim aceste informatii &#8230; hai sa vedem care este diferenta dintre <strong>&#8216;V&#8217; si &#8220;V&#8221;.</strong><br />
<strong>&#8216;V&#8217;</strong> este reprezentat in memorie ca si :<strong> V</strong><br />
<strong>&#8220;V&#8221;</strong> este reprezentat in memorie ca si : <strong>V�</strong><br />
Ati priceput?Nu este asa de greu cu decalratia si citirea!<br />
<strong><br />
Afisarea unui text tinut intr-un array de char-uri</strong><br />
Se face simplu cu functia <strong>cout</strong>.Pentru a afisa continutul array-ului declarat mai sus vom folosi simplu: </p>
<div class="codesnip-container" >cout&#60&#60nume;</div>
<p><strong>Operatii ce se pot realiza in siruri si intre siruri!</strong></p>
<p>Functiile se vor aplica pe array-ul nume declarat mai sus in care,sa presupunem ca exista un text :&#8221;Popescu Ion&#8221;!</p>
<p>Toate functiile ce vor urma sunt prezente in headerul <strong>string.h</strong> si trebuie inclus in proiect ca sa se poata folosi!<br />
Operatiile ce le voi prezenta in continuarea sunt:</p>
<p><strong>� Determinarea lungimii unui sir!<br />
� Copierea unui sir de caractere in alt sir de caractere!<br />
� Concatenarea a 2 siruri(Unirea a 2 siruri)!<br />
� Verificare daca 2 siruri sunt identice!<br />
� Convertirea unui sir de caractere in majuscule si minuscule!<br />
� Numarul de aparitii a unui caracter intr-un sir!<br />
� Inversarea unui sir de caractere!<br />
� Convertirea din sir in numar!</p>
<p>Determinarea lungimii unui sir!</strong><br />
Se realizeaza cu functia <strong>strlen</strong> care este declarata in header astfel: </p>
<div class="codesnip-container" >int strlen(const char *array_de_caractere);</div>
<p>In exemplul nostru ar arata cam asa: </p>
<div class="codesnip-container" >strlen(nume);</div>
<p><strong>strlen</strong> returneaza un <strong>int</strong> ce reprezinta lungimea sirului prezent in variabila array_de_caractere.In cazul nostru ea va returna lungimea sirului &#8220;Popescu Ion&#8221; care este<br />
de 11!<br />
<strong><br />
Copierea unui sir de caractere in alt sir de caractere!</strong><br />
O realizam folosind functia <strong>strcpy</strong> declarata,in header astfel: </p>
<div class="codesnip-container" >char *strcpy(char *destinatie_sir,const char *sursa_sir);</div>
<p>Cum pentru a aplica functia ca exemplu ne trebuie 2 siruri,iar noi avem doar un sir(sirul <strong>nume</strong>) va trebui sa mai creem un sir&#8230;sa zicem ca creem si </p>
<div class="codesnip-container" >char adresa[50];</div>
<p>Sa zicem ca dorim sa copiem ce este in <strong>nume</strong> in sirul <strong>adresa</strong>.Astfel,aplicand functia pe cele 2 siruri astfel: </p>
<div class="codesnip-container" >strcpy(adresa,nume);</div>
<p><strong>strcpy</strong> returneaza un pointer ce reprezinta inceputul sirului <strong>destinatie_sir</strong>.<br />
<strong>Important!</strong> -> Copierea unui sir pe alt sir va duce la distrugerea continutului sirului <strong>destinatie_sir</strong>!<br />
<strong><br />
Concatenarea a 2 siruri(Unirea a 2 siruri)!</strong><br />
Se realizeaza cu ajutoru functiei <strong>strcat</strong> care are urmatorul prototip: </p>
<div class="codesnip-container" >char *strcat(char *destinatie_sir,const char *sursa_sir);</div>
<p>Noi avem deja declarate 2 siruri(<strong>nume</strong> si <strong>adresa</strong>) dar <strong>adresa</strong> este gol deocamdata asa ca o unire a celor 2 siruri va returna,normal,continutul sirului <strong>nume</strong>!<br />
Sa inmagazinam in <strong>adresa</strong> sirul : &#8220;Preotesei Nr.2&#8243;!<br />
Acum putem realiza unirea propriu-zisa: </p>
<div class="codesnip-container" >strcat(nume,adresa);</div>
<p>Dupa executarea functiei,<strong>nume</strong> va contine :&#8221;Popescu IonPreotesei Nr.2&#8243;!<br />
strcat returneaza un pointer la sirul <strong>destinatie_sir!</strong></p>
<p><strong>Verificare daca 2 siruri sunt identice</strong>!<br />
O realizam cu ajutorul functiei <strong>streql</strong> care are urmatoarea declaratie: </p>
<div class="codesnip-container" >int streql(char *sir_1,char *sir_2);</div>
<p>Exemplu:</p>
<div class="codesnip-container" >streql(nume,adresa);</div>
<p><strong>streql</strong> va returna 1 daca sirurile sunt identice si 0 daca cele 2 siruri difera!<br />
<strong>Important!</strong> -> Functia este case sensitive(literele mari le vede diferit fata de cele mici) pentru a testa 2 siruri pentru identitate fara a tine cont de marimea literelor vom<br />
          -> folosi functia <strong>strieql</strong> care are acelasi prototip si nu are rost sa mai dau exemplu de folosire smile</p>
<p><strong>Convertirea unui sir de caractere in majuscule si minuscule!</strong><br />
O facem cu ajutorul functiilor <strong>strlwr</strong> pentru minuscule si <strong>strupr</strong> in majuscule!<br />
Antetul functiilor este: </p>
<div class="codesnip-container" >char *strlwr(char *sir);<br />
char *strupr(char *sir);</div>
<p>Sa aplicam <strong>strupr</strong> pe variabila <strong>nume</strong> de exemplu: </p>
<div class="codesnip-container" >strupr(nume);</div>
<p>Practic dupa apelarea functiei,<strong>nume</strong> va contine: &#8220;POPESCU ION&#8221;(toate caracterele alfanumerice)!<br />
Functiile returneaza un pointer la sirurile pasate ca argumente la apelare!<br />
<strong>strlwr</strong> este asemanatoarea si nu voi mai da exemplu!</p>
<p><strong>Numarul de aparitii a unui caracter intr-un sir!</strong><br />
Se realizeaza cu functia <strong>charcnt</strong> ce are prototipul: </p>
<div class="codesnip-container" >int charcnt(char *sir,int litera);</div>
<p>Exemplu,sa presupunem ca dorim sa cautam numarul de aparitii a caracterului &#8216;o&#8217; in sirul <strong>nume</strong>! </p>
<div class="codesnip-container" >charcnt(nume,(int)&#8217;o');</div>
<p>Am folosit un cast <strong>(int)</strong> deoarece,al doilea argument la apelarea de functie este  <strong>int litera</strong> care trebuie sa fie <strong>int</strong>!<br />
In exemplul nostru,functia va returna 29de atatea ori apare caracterul &#8216;o&#8217; in &#8220;Popescu Ion&#8221;)<br />
<strong><br />
Inversarea unui sir de caractere!</strong><br />
Se realizeaza cu ajutorul functiei <strong>strrev</strong> care are prototipul: </p>
<div class="codesnip-container" >char *strrev(char *sir_de_inversat);</div>
<p>Daca apelam functia pentru sirul <strong>nume</strong> o realizam astfel: </p>
<div class="codesnip-container" >strrev(nume);</div>
<p>Dupa apelarea de functie,sirul <strong>nume</strong> va contine :&#8221;noI ucsepoP&#8221;!<br />
<strong>strrev</strong> returneaza pointer la sirul inversat!</p>
<p><strong>Convertirea din sir in numar!</strong><br />
Pentru a converti un sir de caractere intr-un numar cu care programul poate lucra se pot folosi o serie de functii: </p>
<div class="codesnip-container" >atoi(&#8221;sir_de_caractere&#8221;) ex: atoi(&#8221;145&#8243;);    ->> converteste un sir de caractere intr-o valoare intreaga<br />
atof(&#8221;sir_de_caractere&#8221;) ex: atof(&#8221;145.90&#8243;); ->> converteste un sir de caractere intr-o virgula mobila<br />
atol(&#8221;sir_de_caractere&#8221;) ex: atol(&#8221;1459802&#8243;);->> converteste un sir de caractere intr-un long</div>
<p>Pentru critici si comentarii postati <a href="http://www.skullbox.info/board/viewtopic.php?id=238">aici</a>!<br />
&copy; 3Nigma</p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/lectia-05-lucrul-cu-siruri-de-caractere/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Curs] C - Lectia 04 - Instructiuni de control</title>
		<link>http://www.skullbox.info/curs-c-lectia-04-instructiuni-de-control/</link>
		<comments>http://www.skullbox.info/curs-c-lectia-04-instructiuni-de-control/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 17:57:39 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/curs-c-lectia-04-instructiuni-de-control/</guid>
		<description><![CDATA[In C exista doua tipuri de instructiuni de control a fluxului de rulare si ar putea fi etichetate ca &#8220;structuri alternative&#8221; si &#8220;structuri repetitive&#8221;.
Ce fac acestea ? Instructiuni alternative verifica o conditie si in functie de aceasta ruleaza un bloc de instructiuni sau altul. Instructiunile repetitive, dupa cum le spune si numele, ruleaza un bloc [...]]]></description>
			<content:encoded><![CDATA[<p>In C exista doua tipuri de instructiuni de control a fluxului de rulare si ar putea fi etichetate ca &#8220;structuri alternative&#8221; si &#8220;structuri repetitive&#8221;.</p>
<p>Ce fac acestea ? Instructiuni alternative verifica o conditie si in functie de aceasta ruleaza un bloc de instructiuni sau altul. Instructiunile repetitive, dupa cum le spune si numele, ruleaza un bloc de instructiuni pana cand apare conditia de oprire a repetarii.</p>
<p>Ca si in cazul functiilor, mai multe instructiuni pot forma un bloc folosind acoladele.</p>
<p><strong>1. Instructiunea IF</strong></p>
<p>Aceasta instructiune permite ramificarea programului in functie de valoarea conditiei.<br />
Sintaxa acesteia este: </p>
<div class="codesnip-container" >if( Conditie )<br />
   executa cod1;<br />
else<br />
   executa cod2;</div>
<p>Cum functioneaza ? Blocul &#8220;Conditie&#8221; este evaluat si daca acesta ia valoarea True este executat codul 1. In caz contrar (Conditia ia valoarea False) este executat codul 2.<br />
<strong>De mentionat 2 idei:<br />
a. else nu e obligatoriu sa apara;<br />
b. se pot executa mai multe instructiuni pentru fiecare din cazuri cu conditia ca acestea<br />
sa fie tinute in interiorul unui bloc determinat de { si }.<br />
</strong><br />
Sa vedem si un exemplu concret: </p>
<div class="codesnip-container" >if( 1 == 1 )<br />
   printf(&#8221;Adevarat&#8221;);<br />
else<br />
   printf(&#8221;Fals&#8221;);</div>
<p>In exemplul de mai sus se evalueaza expresia 1 == 1 care intotdeauna va returna True, deci blocul dat ca exemplu intotdeauna va afisa &#8220;Adevarat&#8221;. Daca am inlocui 1 == 1 cu 1 == 0<br />
conditia va deveni Falsa la fiecare rulare, deci de fiecare data blocul respectiv va afisa &#8220;Fals&#8221;.<br />
Pentru a putea fi folosita in practica, instructiunea if permite utilizarea variabilelor.<br />
Adica, putem avea int a = 1; si int b = 2; care apoi sa le evaluam. Daca expresia dintre paranteze va fi de forma if( a == b ) rezultatul va fi &#8220;False&#8221; pentru ca a = 1 si b = 2 ceea ce e fals. In schimb daca expresia ar fi de forma if( a != b ) rezultatul va fi &#8220;True&#8221;.<br />
De ce ? Pentru ca a nu este egal cu b iar expresia va returna &#8220;True&#8221; daca a nu este egal cu b (operatorul != ).<br />
Trebuie mentionat ca functia if poate fi folosita doar in cazul numerelor. In cazul sirurilor se folosesc functii specializate despre care voi vorbi intr-o lectie care urmeaza.</p>
<p>Pentru a complica putin treburile, e bine de stiut ca instructiunea if permite si expresii compuse, adica 2 sau mai multe expresii legate intre ele prin operatorii logici &#038;&#038; (si) respectiv || (sau). Cum putem folosi asta ? Simplu, dau un exemplu mai jos care va ajuta sa intelegeti: </p>
<div class="codesnip-container" >int a,b,c;</p>
<p>a = 1;<br />
b = 2;<br />
c = 3;</p>
<p>if( a == 1 &#038;&#038; b <c> b &#038;&#038; b < c ){<br />
   printf("Am facut un SI logic intre rezultatele expresiilor a > b si b < cn.");<br />
   printf("Prima returneaza False.n");<br />
   printf("A doua returneaza True.n");<br />
   printf("Rezultatul e False pentru ca SI logic aplicat pe True si False e False.n");<br />
   printf("Adica textul de aici nu va fi afisat niciodata ;-) .n");</p>
<p>}</p></div>
<p>Instructiunea IF accepta de asemenea si &#8220;inlantuiri&#8221;. Adica, aplicam un IF iar in cazul in care<br />
conditia rezultata este False, punem un else care foloseste mai departe un alt IF. Cel mai bine se intelege printr-un exemplu: </p>
<div class="codesnip-container" >if( conditie )<br />
   puts(&#8221;Conditia ia valoarea True&#8221;);<br />
else if( conditie2 )<br />
         puts(&#8221;Conditia 1 a luat valoarea False, iar conditie2 True&#8221;);<br />
     else<br />
         puts(&#8221;Conditia 1 si Conditia 2 au luat valoarea False&#8221;);</div>
<p>Simplu, nu ? Dar ganditi-va ce ar iesi daca am avea de verificat 10 conditii. Pentru cazuri mai complexe, s-a creat instructiunea switch.</p>
<p>2. <strong>Instructiunea switch</strong> functioneaza identic cu instructiunea IF cu diferenta ca aceasta permite mai multe alternative. IF permite doar 2 alternative (True sau False).<br />
Switch ne permite sa declaram mai multe alternative si sa asociem cate o actiune pentru fiecare. Sintaxa este de felul urmator: </p>
<div class="codesnip-container" >switch( expresie ){<br />
  case constanta1: instructiune1;break;<br />
  case constanta2: instructiune2;break;<br />
      &#8230;<br />
  case constantaN: instructiuneN;break;<br />
  default: instructiuneDefault;<br />
}</div>
<p>Ce inseamna asta ? Se verifica expresia data ca parametru instructiunii switch iar apoi rezultatul este comparat pe rand cu fiecare caz specificat. Daca expresia are valoarea constantei nr. 1, se executa instructiune1 iar apoi se iasa din structura de control (instructiunea break obliga iesirea). Daca expresia nu se valideaza se trece la urmatorul caz si asa mai departe pana cand se termina cazurile. Daca expresia nu corespunde nici unui caz specificat se executa instructiunea data la cazul &#8220;default&#8221;. Acesta poate lipsi dar nu este recomandat. Dupa ce instructiunea switch si-a facut treaba programul este executat mai departe.<br />
<strong><br />
3. Instructiunea repetitiva WHILE</strong><br />
Foarte des veti avea nevoie sa folositi acelasi bloc de cod de mai multe ori cu mici diferente. In loc sa scrieti acelasi cod de 100 de ori, puteti folosi o instructiune repetitiva (bucla) while.<br />
Instructiunea are urmatoarea forma: </p>
<div class="codesnip-container" >while( expresie ){<br />
   codul care trebuie executat<br />
}</div>
<p>Adica, la intrarea in bucla while este evaluata expresia. Daca aceasta are valoarea True, se executa codul. In caz contrar se trece la instructiunea urmatoare.<br />
Bun, sa facem un mic cod care va afisa toate numerele de la 1 la 100 cu ajutorul buclei while: </p>
<div class="codesnip-container" >int i = 0; // Aici declaram variabila i de tip int si o initializam cu valoarea 0;<br />
while( i < 100 ){<br />
   printf("Valoarea lui i este %dn",i);<br />
   i++;<br />
}</div>
<p></code></c></code><br />
Ce am facut mai sus ? Am declarat o variabila i si am initializat-o cu valoarea 0. Apoi am folosit-o in expresia din cadrul instructiunii while sub forma i&lt;100 (adica valoarea variabilei i este mai mica decat 100). Odata inceputa bucla while, i va avea valoarea 0.<br />
La prima evaluarea a expresiei i va fi inlocuit cu 0 (valoarea actuala a lui i). 0&lt;100 va returna True, deci codul va fi executat. La urmatoarea evaluare i va avea valoarea 1 pentru ca la iesirea din codul while se incrementeaza valoarea lui i. Deci, expresia se va transforma din 0&lt;100 in 1&lt;100 care este, din nou, True. Codul va fi executat pana cand i va lua valoarea 100, adica de 100 de ori si de cate ori va fi executat codul noi vom vedea pe ecram &#8220;Valoarea lui i este %d&#8221; unde %d este valoarea actuala.<br />
Cand i va lua valoarea 100, expresia va deveni 100&lt;100 care este fals iar bucla se va opri si va fi executata urmatoarea instructiune.</p>
<p>Pentru cei carora le place sa se complice putin, bucla de mai sus poate fi scrisa si sub forma: </p>
<div class="codesnip-container" >int i=0;<br />
while( i++ < 100 )<br />
   printf("Valoarea lui i este %d",i);</div>
<p><strong>4. Instructiunea FOR</strong><br />
O instructiune repetitiva mai simpla este FOR. Aceasta se aseamana foarte mult cu instructiunea WHILE, cu diferenta ca initializarea, expresia validata si modificarea variabilei de control sunt facute intr-o singura linie. Se utilizeaza in felul urmator:<br />
</code>
<div class="codesnip-container" >for( expresie1 ; expresie2 ; expresie3 ){<br />
  cod care trebuie executat<br />
}</div>
<p>Asta s-ar traduce in felul urmator:<br />
expresie1 este evaluata la initializarea functiei;<br />
expresie2 verifica conditia de rularea a codului;<br />
expresie3 modifica valorile verificate de expresie2.</p>
<p>Un exemplu concret si foarte utilizat ar fi urmatorul: </p>
<div class="codesnip-container" >for( i=0 ; i&lt;100 ; i++ )<br />
  printf(&#8221;Valoarea lui i este %dn&#8221;,i);</div>
<p>In cazul de fata, i este initializat cu valoarea 0 (expresie1), cat timp valoarea lui i este mai mica decat 100 este rulat blocul corespunzator instructiunii (expresie2) si la fiecare rulare i este incrementat (expresie3).</p>
<p><strong>5. Instructiunea DO-WHILE</strong><br />
Aceasta instructiune este foarte asemanatoare cu instructiunea WHILE cu diferenta ca blocul corespunzator instructiunii este executat cel putin o data. Este folosita in felul urmator: </p>
<div class="codesnip-container" >do{<br />
cod care trebuie executat<br />
} while (expresie)</div>
<p>Adica, codul va fi rulat si abia apoi va fi evaluata expresia si se va decide daca se va rula din nou codul sau nu.</p>
<p>Cam asta ar fi lectia despre instructiunile de control. Sper ca ati inteles. In caz contrar va astept cu intrebari.<br />
Ar mai fi de mentionat urmatoarele:</p>
<p>1. In fiecare caz, puteti da frau liber imaginatiei si fiecare expresie care este evaluata poate fi rezultatul utilizarii operatorilor logici &#038;&#038; (SI) respectiv || (SAU).<br />
2. In cazul instructiunilor repetitive (bucle) aveti grija ca intotdeauna sa existe o cale de iesire. In caz contrar va veti alege cu o bucla infinita care va bloca aplicatia sau intreg sistemul.<br />
3. Have fun ! Si asta-i cea mai importanta big_smile<br />
&copy; OSHO<br />
Articolul original il gasiti <a href="http://www.skullbox.info/board/viewtopic.php?id=217">Aici</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/curs-c-lectia-04-instructiuni-de-control/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Curs] C - Lectia 03 - Functii I/O standard (extensie)</title>
		<link>http://www.skullbox.info/curs-c-lectia-03-functii-io-standard-extensie/</link>
		<comments>http://www.skullbox.info/curs-c-lectia-03-functii-io-standard-extensie/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 15:14:15 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/curs-c-lectia-03-functii-io-standard-extensie/</guid>
		<description><![CDATA[M-am gandit sa fac si o extensie a lectiei nr. 3 cu doua mici programele care
sa fie folosite ca exemple de utilizare a functiilor prezentate. Daca credeti ca
sunt utile spuneti-mi si incerc sa fac si pentru lectiile urmatoare.
1. Afiseaza codul ASCII pentru un caracter introdus de la tastatura
#include &#60;stdio.h&#62;
int main(){
char c;
puts(&#8221;Afiseaza codul ASCII al unui [...]]]></description>
			<content:encoded><![CDATA[<p>M-am gandit sa fac si o extensie a lectiei nr. 3 cu doua mici programele care<br />
sa fie folosite ca exemple de utilizare a functiilor prezentate. Daca credeti ca<br />
sunt utile spuneti-mi si incerc sa fac si pentru lectiile urmatoare.</p>
<p><strong>1. Afiseaza codul ASCII pentru un caracter introdus de la tastatura</strong></p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;<br />
int main(){<br />
char c;</p>
<p>puts(&#8221;Afiseaza codul ASCII al unui caractern&#8221;);<br />
printf(&#8221;Introdu caracterul: &#8220;);<br />
scanf(&#8221;%c&#8221;,&amp;c);<br />
printf(&#8221;nCodul ASCII al lui &#8216;%c&#8217; este %dnn&#8221;,c,c);<br />
return 0;<br />
}</p></div>
<p><strong>2. Afiseaza valoarea in binar, octal si hexazecimal a unui numar zecimal<br />
introdus de la tastatura  </strong></p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;<br />
int main(){<br />
int nr;</p>
<p>puts(&#8221;Afiseaza valoarea unui numar in octal si hexan&#8221;);<br />
printf(&#8221;Introdu numarul: &#8220;);<br />
scanf(&#8221;%d&#8221;,&amp;nr);<br />
printf(&#8221;Valoarea lui %d in octal e %o iar in hexa e %Xnn&#8221;,nr,nr,nr);<br />
return 0;<br />
}</p></div>
<p>©OSHO<br />
Articolul original il puteti gasi <a href="http://www.skullbox.info/board/viewtopic.php?id=75">Aici</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.skullbox.info/curs-c-lectia-03-functii-io-standard-extensie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Curs] C - Lectia 03 - Functii I/O standard</title>
		<link>http://www.skullbox.info/curs-c-lectia-03-functii-io-standard/</link>
		<comments>http://www.skullbox.info/curs-c-lectia-03-functii-io-standard/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 15:07:05 +0000</pubDate>
		<dc:creator>tercot</dc:creator>
		
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.skullbox.info/curs-c-lectia-03-functii-io-standard/</guid>
		<description><![CDATA[Recapitulare
Ce mai stiti din lectia anterioara ? Exista functia main() din care sunt apelate  toate functiile, nu ? In functia main() punem cam tot ce ne intereseaza. In  functia main() citim datele, din functia main() scriem datele. In programarea  structurata (care e folosita in C) functia main() este cea mai importanta.
De fapt&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Recapitulare</strong><br />
Ce mai stiti din lectia anterioara ? Exista functia main() din care sunt apelate  toate functiile, nu ? In functia main() punem cam tot ce ne intereseaza. In  functia main() citim datele, din functia main() scriem datele. In programarea  structurata (care e folosita in C) functia main() este cea mai importanta.<br />
De fapt&#8230; ii spune chiar si numele (main=principal).</p>
<p>Bun, v-ati prins care-i structura unui program in C, acum se pune intrebarea  &#8220;Cum face altceva?&#8221;, sau &#8220;Cum putem folosi functia main() ca programul sa faca  ce vrem noi sa faca?&#8221;. Pentru asta avem nevoie de functiile de intrare/iesire  standard puse la dispozitie de C. Pentru a putea folosi functiile standard de  intrare/iesire va trebui sa introducem un header. Un header este un fisier  separat cu terminatia .h in care sunt definite functii, structuri, constante  in functie de scopul headerului. In cazul nostru avem nevoie de headerul  <strong>stdio.h</strong> (STanDard Input Output) care contine prototipul unor functii  definite in libraria standard C. Headerul se introduce in program in felul  urmator:</p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;</div>
<p>In UNIX din moment ce functiile sunt definite in libc (libraria standard) nu e neaparat necesar sa includem acest header dar e bine sa ne obisnuit sa-l includem pentru a fi mai usoara portarea programului pe un alt sistem de operare.<br />
Bun, sa trecem la fapte. Ce stie stdio asta si ce putem face cu el ?</p>
<p><strong>getchar()</strong><br />
functia getchar() citeste codul ASCII al unui caracter care il introduceti de la tastatura. Codul nu este citit direct de la tastatura ci dintr-un buffer din memorie in care se pastreaza toate caracterele introduse, buffer care se poate corecta folosind tasta backspace.</p>
<p>Functia se apeleaza sub forma:</p>
<div class="codesnip-container" >char a;<br />
a = getchar();</div>
<p>unde a este o variabila de tip caracter. Dupa executarea functiei a va lua valoarea returnata de getchar(), adica codul ASCII a tastei care am apasat-o.</p>
<p><strong>putchar()</strong><br />
Afiseaza codul ASCII al unui caracter. Se apeleaza de forma:</p>
<div class="codesnip-container" >putchar(a);</div>
<p>unde a este o variabila care contine un cod ASCII al unui caracter.<br />
Acum ca stim deja doua functii de intrare/iesire sa facem si un mic programel:</p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;<br />
int main(){<br />
char a;<br />
a = getchar();<br />
putchar(a);<br />
putchar(&#8217;n');<br />
return 0;<br />
}</div>
<p>Pe linia 1 a programului am inclus headerul stdio.h pentru a putea folosi functiile getchar() si putchar();<br />
Pe linia 3 incepe functia main;<br />
Pe linia 4 am declarat variabila a de tip char. Adica, variabila a va putea tine un cod ASCII;<br />
Pe linia 6 folosim functia getchar() pentru a citi un cod de la tastatura cod care il pune in variabila a.<br />
Pe linia 7 avem deja variabila a care are un anumit continut (dat de noi de la tastatura). Folosim functia putchar() pentru a afisa continutul variabilei.<br />
Pe linia 8 afisam caracterul newline (&#8217;n') strict din motive estetice <img src="http://www.skullbox.info/board/img/smilies/big_smile.png" alt="big_smile" height="15" width="15" /><br />
Pe linia 10 returnam 0 ca valoare de iesire pentru functia main() iar pe linia 11 se inchide acolada care marcheaza sfarsitul blocului main().</p>
<p>Simplu, nu ? Copiati codul, compilati-l si jucati-va putin cu el.</p>
<p>Vedeti ce se intampla daca in loc de</p>
<div class="codesnip-container" >char a;<br />
a = getchar();<br />
putchar(a);</div>
<p>puneti ceva de genul asta</p>
<div class="codesnip-container" >putchar(getchar());</div>
<p>Functioneaza ? Daca da, incercati sa va dati seama de ce. Daca nu, la fel&#8230; incercati sa va dati seama de ce.</p>
<p><strong>gets()</strong><br />
Sa luam un text de 30 de caractere cu functia getchar() e destul de nasol. In libraria standard exista functia gets() care ne ajuta cu siruri de caractere.<br />
Apelul se face in felul urmator:</p>
<div class="codesnip-container" >char sir[30];<br />
gets(sir);</div>
<p>unde sir poate contine maxim 30 de caractere (dupa cum e specificat). La apelul functiei gets() utilizatorul va introduce un sir de caractere iar programul va returna sirul cand utilizatorul va apasa tasta enter.</p>
<p><strong>puts()</strong><br />
Daca exista functie pentru citirea unui sir de caractere trebuie sa existe o functie si pentru afisarea acestuia. Functia puts primeste ca parametru un sir de caractere care il afiseaza pe ecran. Se foloseste de forma:</p>
<div class="codesnip-container" >char sir[] = &#8220;Test&#8221;;<br />
puts(test);</div>
<p>OK, haideti sa combinam cele doua functii si sa facem un programel mic.<br />
Sa folosim functia gets() pentru a va citi numele iar apoi functia puts() pentru a-l afisa. Codul va arata de forma:</p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;<br />
int main(){<br />
char nume[30];<br />
puts(&#8221;Care e numele tau?&#8221;);<br />
gets(nume);<br />
puts(nume);<br />
return 0;<br />
}</div>
<p>Ce face codul de mai sus ? Creaza o variabila nume care poate tine maxim 30 de caractere. Afiseaza &#8220;Care este numele tau?&#8221;, asteapta sa introduceti un text care va fi salvat in variabila nume iar apoi afiseaza continutul variabilei nume.<br />
Faceti cateva teste si vedeti ce se intampla daca tastati mai mult de 30 de caractere. Modificati programul si jucati-va putin cu el.</p>
<p><strong>printf()</strong><br />
Probabil v-ati dat seama ca nu aveti flexibilitate cu functiile getchar(), putchar(), gets() si puts(). Poate ca doriti ca intr-o singura linie sa afisati mai multe date: caractere, numere intregi, numere reale etc. Pentru asta se foloseste functia printf() (printf formated). Functia ne permite sa afisam un text si sa controlam modul de afisare. printf() returneaza numarul de caractere afisate sau -1 in caz de eroare.<br />
Se foloseste in felul urmator:</p>
<div class="codesnip-container" >printf(sir_de_control,parametrul1,parametrul1,&#8230;,parametrulN);</div>
<p>unde sir_de_control este un camp text care contine caractere speciale de control despre care am vorbit si in lectia trecuta. La rulare se inlocuiesc in text caracterele speciale (specificatorii de format) cu valorile parametrilor dati functiei, parametrii ce corespund sirurilor de control.<br />
Probabil stiti deja cum se lucreaza cu functia din lectia anterioara asa ca ma rezum la un exemplu scurt:</p>
<div class="codesnip-container" >printf(&#8221;Acesta este un numar - %dn&#8221;,53);</div>
<p>Observati ca in sirul de control se pot pune si caractere speciale (newline - n, tab - t etc).<br />
Hai a refacem programul de mai sus folosind functia printf. Ar arata cam asa:</p>
<div class="codesnip-container" >#include &lt;stdio.h&gt;</div>
<p>int main(){<br />
char nume[30];<br />
printf(&#8221;Care e numele tau?&#8221;);<br />
gets(nume);<br />
printf(&#8221;Salut, %sn&#8221;,nume);<br />
return 0;<br />
}<br />
Compilati-l si rulati-l. Alta viata, nu ? <img src="http://www.skullbox.info/board/img/smilies/big_smile.png" alt="big_smile" height="15" width="15" /><br />
Acum putem formula o propozitie cu variabila nume <img src="http://www.skullbox.info/board/img/smilies/wink.png" alt="wink" height="15" width="15" /></p>
<p><strong>scanf()</strong><br />
Prin analogia cu printf() va puteti da seama si ce face scanf(). Adica, citeste (scaneaza) ceva de la tastatura si returneaza in variabilele specificate.<br />
Functia are formatul:</p>
<div class="codesnip-container" >scanf(sir_d