0% found this document useful (0 votes)
205 views

Sau Exclusiv : If Statement

The document discusses various programming concepts in C/C++ including: 1. Loop structures - while, for, do-while loops with examples of their syntax and usage. 2. Decision making statements - if, if-else, switch statements and examples of nested conditional logic. 3. Data types - details on basic C/C++ data types like char, int, float, their typical bit widths and value ranges.

Uploaded by

Dana Mihaela
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
205 views

Sau Exclusiv : If Statement

The document discusses various programming concepts in C/C++ including: 1. Loop structures - while, for, do-while loops with examples of their syntax and usage. 2. Decision making statements - if, if-else, switch statements and examples of nested conditional logic. 3. Data types - details on basic C/C++ data types like char, int, float, their typical bit widths and value ranges.

Uploaded by

Dana Mihaela
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 74

Sau exclusiv

If statement.
If(num1 == num2) { Printf(they are equal); If(num1 > num2) { Printf(%d is greater than %d, num1 , num2); } If(num1 < num2) { Printf(%d is less than %d, num1, num2); }

If ,else if, else statements


#include <stdio.h> #include <conio.h> int main(void) { int age; printf("Enter your age"); scanf("%d", &age);

if(age==60) { printf("easy cougar"); } else if(age==40)

{ printf("mom?");

} else if(age==21) { printf("call me"); }

else { printf("jailbait!"); } getch(); }

WHILE LOOP
while(loopcount<5) { printf("Enter number of hotdogs u ate: "); scanf("%d", &hotdogs); total = total + hotdogs; loopcount= loopcount+1;

loopcount= loopcount+1;
counter += 1; - assignment operator

counter++;

if u know how many times ure gonnaloop u can use for loop

for loop
#include <stdio.h> #include <stdlib.h>

int main() { int counter = 1; for(counter = 1; counter < 20; counter++) { printf("%d\n",counter); } } ______________________________________________________ %i tot int inseamna scanf("%d%d", &x, &y) printf("%d\n",counter); #include <stdio.h> #include <stdlib.h>

int main() { int number; scanf("%d", &number);

switch(number) {

case 2: printf("Great number");

break; case 4: printf("you say number"); break; case 6: printf("Great number"); break; case 8: printf("not such a Great number"); break;

default: printf("I dont know what you entered"); break;

} }

Do while loops
Does at least once #include <stdio.h>

#include <conio.h> int main(void) { int counter = 12; do { printf("%d\n", counter); counter++; } while(counter < 10); getch(); }

Logical operators
#include <stdio.h> #include <stdlib.h>

int main() { int eyes; int toes;

printf("Enter number of eyes and toes"); scanf("%d%d",&eyes, &toes);

if(eyes == 2 || toes == 10) { printf("You are normal");

} else { printf("You are weird");

} getch(); }

printf("%d\n", 1+rand()%6); - numbers from 1 to 6. %6-gives u the remainder or how many choices u have srand(time(NULL));

int uses %d float uses %f char uses %c character strings use %s /* * Because this function has a body, it is also a definition. * Any variables declared inside will be definitions, * unless the keyword 'extern' is used. * Don't use 'extern' until you understand it! */ int def_func(void){ float f_var; /* a definition */ int c; /* another definition */ int random_num(void); /* declare (but not define) another function */ return(0); }

A function is a set of instruction you tell your computer what to do printf("Hello world"); ; Getch get character

#include <conio.h> value = 6 +( 4 *10) printf(%d is less than %d, num1, num2);

int nValue1, int nValue2; // wrong (compiler error) int nValue1, nValue2; // correct
a | ~a 1|0 0|1

&&

true && true // => true true && false // => false false && true // => false false && false // => false

or

true || true // => true true || false // => true false || true // => true false || false // => false

not

!true // => false !false // => true

2.3. PREPROCESORUL

Aa cum am menionat n capitolul 1.3., n faza de compilare a fiierului surs este invocat nti preprocesorul. Acesta trateaz directivele speciale - numite directive preprocesor - pe care le gsete n fiierul surs. Directivele preprocesor sunt identificate prin simbolul #, care trebuie s fie primul caracter, diferit de spaiu, dintr-o linie. Directivele preprocesor sunt utilizate la includerea fiierelor header, la definirea numelor constantelor simbolice, la definirea macro-urilor, sau la realizarea altor funcii (de exemplu, compilarea condiionat), aa cum ilustreaz exemplele urmtoare:

Includerea fiierelor header n codul surs: Exemplul1: #include <stdio.h> Cnd procesorul ntlnete aceast linie, datorit simbolului #, o recunoate ca fiind o directiv preprocesor, localizeaz fiierul header indicat (parantezele unghiulare < > indic faptul c este vorba de un fiier header sistem). Exemplul 2: #include "headerul_meu.h" Numele fiierului header inclus ntre ghilimele, indic faptul c headerul_meu.h este un fiier header creat de utilizator. Preprocesorul va cuta s localizeze acest fiier n directorul curent de lucru al utilizatorului. n cazul n care fiierul header nu se afl n directorul curent, se va indica i calea ctre acesta.

Exemplul 3: #include "c:\\bc\\head\\headerul_meu.h" n acest exemplu, pentru interpretarea corect a caracterului backslash \, a fost necesar "dublarea" acestuia, din motive pe care le vom prezenta n paragraful 2.5.2.4

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Syntax: The syntax of a for loop in C++ is:

for ( init; condition; increment ) { statement(s); } Syntax: The syntax of a while loop in C++ is: while(condition) { statement(s); }

Syntax: The syntax of a do...while loop in C++ is: do { statement(s); }while( condition );

Int 16 biti Short 16 biti Long 32 biti Unsigned 16 biti Unsigned long 32 biti Char 8 biti

Float 32 biti Double 64 biti Long double 80 biti

Table 3.1. Variable Types.


Type
unsigned short int short int

Size 2 bytes

Values 0 to 65,535 -32,768 to 32,767 0 to 4,294,967,295 -2,147,483,648 to 2,147,483,647 -32,768 to 32,767 -2,147,483,648 to 2,147,483,647 0 to 65,535 0 to 4,294,967,295 256 character values 1.2e-38 to 3.4e38 2.2e-308 to 1.8e308

2 bytes unsigned long int 4 bytes long int 4 bytes int (16 bit) 2 bytes int (32 bit) 4 bytes
unsigned int (16 bit) unsigned int (32 bit) char float double

2 bytes 2 bytes 1 byte 4 bytes 8 bytes

\n

new line \t tab \b backspace \" double quote \' single quote \? question mark \\ backslash

Un program scris n limbajul C (sau C++) este compus din unul sau mai multe fiiere surs. Un fiier surs este un fiier text care conine codul surs (n limbajul C) al unui program. Fiecare fiier surs conine una sau mai multe funcii i eventual, referine ctre unul sau mai multe fiiere header (figura 2.1.).

Prima linie este o directiv preprocesor (indicat de simbolul #) care determin includerea n fiierul surs a fiierului header cu numele iostream.h. Acest header permite realizarea afirii pe monitor
Name char short int(short) int Description Character or small integer. Short Integer. Size* 1byte 2bytes Range* signed: -128 to 127 unsigned: 0 to 255 signed: -32768 to 32767 unsigned: 0 to 65535 signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295 signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295 true or false +/- 3.4e +/- 38 (~7 digits) +/- 1.7e +/- 308 (~15 digits) +/- 1.7e +/- 308 (~15 digits) 1 wide character

Integer.

4bytes

long int (long) bool float double long double wchar_t

Long integer. Boolean value. It can take one of two values: true or false. Floating point number. Double precision floating point number. Long double precision floating point number. Wide character.

4bytes

1byte 4bytes 8bytes 8bytes 2 or 4 bytes

x += 1 is equal to x++ which is equal x = x+1

Do while loop - ------- > to ensure their codes runs at least one time. ---- a little bit uncommon

C++ Loop Types:


C++ programming language provides following types of loop to handle looping requirements. Click the following links to check their detail. Description Repeats a statement or group of statements while a given condition is true. It tests the condition before executing the loop body. Execute a sequence of statements multiple times and abbreviates the code that manages the loop variable. Like a while statement, except that it tests the condition at the end of the loop body You can use one or more loop inside any another while, for or do..while loop.

Loop Type while loop for loop do...while loop nested loops

C++ Decision Making:


C++ programming language provides following types of decision making statements. Click the following links to check their detail. Statement if statement if...else statement switch statement nested if statements nested switch statements Description An if statement consists of a boolean expression followed by one or more statements. An if statement can be followed by an optional else statement, which executes when the boolean expression is false. A switch statement allows a variable to be tested for equality against a list of values. You can use one if or else if statement inside another if or else if statement(s). You can use one swicth statement inside another switch statement(s).

Type char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double wchar_t

Typical Bit Width 1byte 1byte 1byte 4bytes 4bytes 4bytes 2bytes Range Range 4bytes 4bytes 4bytes 4bytes 8bytes 8bytes 2 or 4 bytes

Typical Range -127 to 127 or 0 to 255 0 to 255 -127 to 127 -2147483648 to 2147483647 0 to 4294967295 -2147483648 to 2147483647 -32768 to 32767 0 to 65,535 -32768 to 32767 -2,147,483,647 to 2,147,483,647 same as long int 0 to 4,294,967,295 +/- 3.4e +/- 38 (~7 digits) +/- 1.7e +/- 308 (~15 digits) +/- 1.7e +/- 308 (~15 digits) 1 wide character

In c programming language when we divide two integers we get an integer result, For example the result of 7/3 will be 2.So we can take advantage of this and may use it to find whether the number is odd or even. Consider an integer n we can first divide by 2 and then multiply it by 2 if the result is the original number then the number is even otherwise the number is odd. For example 11/2 = 5, 5*2 = 10 ( which is not

equal to eleven), now consider 12/2 = 6 and 6 *2 = 12 ( same as original number). These are some logic which may help you in finding if a number is odd or not.

// If we've printed 5 numbers, start a new column if ((nCount+1) % 5 == 0) cout << endl;
: 12: 13: 14: 15: do { } cout << "Hello\n"; counter--; while (counter >0 );

The syntax for the do...while statement is as follows: do statement while (condition);

for (counter = 0; counter < 5; counter++) 10: cout << "Looping! ";

The syntax for the for statement is as follows:


for (initialization; test; action ) statement;

The syntax for the while statement is as follows: while ( condition ) statement;

3.7 Converting between binary and decimal


In order to understand the bit manipulation operators, it is first necessary to understand how integers are represented in binary. Consider a normal decimal number, such as 5623. We intuitively understand that these digits mean (5 * 1000) + (6 * 100) + (2 * 10) + (3 * 1). Because there are 10 decimal numbers, the value of each digit increases by a factor of 10.

Binary numbers work the same way, except because there are only 2 binary numbers (0 and 1), the value of each digit increases by a factor of 2. Just like commas are often used to make a large decimal number easy to read (eg. 1,427,435), we often write binary numbers in groups of 4 bits to make them easier to read. Converting binary to decimal In the following examples, we assume that were dealing with unsigned numbers. Consider the 8 bit (1 byte) binary number 0101 1110. 0101 1110 means (0 * 128) + (1 * 64) + (0 * 32) + (1 * 16) + (1 * 8) + (1 * 4) + (1 * 2) + (0 * 1). If we sum up all of these parts, we get the decimal number 64 + 16 + 8 + 4 + 2 = 94. Here is the same process in table format. We multiple each binary digit by its bit value (determined by its position). Summing up all these values gives us the total. Binary digit * Bit value = Total (94) 0 128 0 1 64 64 0 32 0 1 16 16 1 8 8 1 4 4 1 2 2 0 1 0

Lets convert 1001 0111 to decimal: Binary digit * Bit value 1 128 0 64 0 0 32 0 1 16 16 0 8 0 1 4 4 1 2 2 1 1 1

= Total (151) 128

1001 0111 binary = 151 in decimal. Converting decimal to binary Converting from decimal to binary is a little more tricky, but still pretty straightforward. The easiest way to do this is to work backwards to figure out what each of the bits must be. Consider the decimal number 148.

Is 148 >= 128? Yes, so the 128 bit must be 1. 148 128 = 20, which means we need to find bits worth 20 more. Is 20 >= 64? No, so the 64 bit must be 0.

Is 20 >= 32? No, so the 32 bit must be 0. Is 20 >= 16? Yes, so the 16 bit must be 1. 20 16 = 4, which means we need to find bits worth 4 more.

Is 4 >= 8? No, so the 8 bit must be 0. Is 4 >= 4? Yes, so the 4 bit must be 1. 4 4 = 0, which means all the rest of the bits must be 0.

148 = (1 * 128) + (0 * 64) + (0 * 32) + (1 * 16) + (0 * 8) + (1 * 4) + (0 * 2) + (0 * 1) = 1001 0100

In table format:Binary number * Bit value 128 64 0 32 0

1 16 16

0 8 0

0 4 4

1 2 0

0 1 0

= Total (148) 128 Signed numbers

The following section is optional. Most of the time when we deal with binary numbers and bit operations, we use unsigned numbers. However, it is interesting to examine how signed numbers are dealt with. Signed numbers are typically stored using a method known as twos complement. In twos complement, the leftmost (most significant) bit is used as the sign bit. A 0 bit means the number is positive, and a 1 bit means the number is negative. Positive signed numbers are stored just like positive unsigned numbers. Negative signed numbers are stored as the inverse of the positive number, plus 1. For example, heres how we convert -5 to binary: First we figure out the binary representation for 5: 0000 0101 Then we invert all of the bits: 1111 1010 Then we add 1: 1111 1011 Converting -76 to binary: Positive 76 in binary: 0100 1100

Invert all the bits: 1011 0011 Add 1: 1011 0100 Why do we add 1? Consider the number 0. If a negative value was simply represented as the inverse of the positive number, 0 would have two representations: 0000 0000 (positive zero) and 1111 1111 (negative zero). By adding 1, 1111 1111 intentionally overflows and becomes 0000 0000. This prevents 0 from having two representations, and simplifies some of the internal logic needed to deal with negative numbers. Is 93 >= 128? No, so the 128 bit is 0. Is 93 >= 64? Yes, so the 64 bit is 1. 93 64 = 29. Is 29 >= 32? No, so the 32 bit is 0. Is 29 >= 16? Yes, so the 16 bit is 1. 29 16 = 13. Is 13 >= 8? Yes, so the 8 bit is 1. 13 8 = 5. Is 5 >= 4? Yes, so the 4 bit is 1. 5 4 = 1. Is 1 >= 2? No, so the 2 bit is 0. Is 1 >= 1? Yes, so the 1 bit is 1.

The answer is 0101 1101.

Sistemul octal foloseste baza 8, utiliznd cifrele de la 0 la 7. Astfel, numarul 8 va fi notat n sistemul octal cu 10, numarul 9 va fi notat cu 11, numarul 10 va fi notat n octal cu 12 etc. Sistemul octal este cel mai rar folosit. Trecerea din baza 2 n baza 10 se face prin nmultiri succesive ale cifrelor numarului n baza 2 cu puteri ale lui 2: Exemplu de conversie din baza 2 n baza 10: 11101(2) = 1*24 + 1*23 + 1*22 + 0*21 + 1*20 = 16 + 8 + 4 + 0 + 1 = 29(10)

1 byte = 8 bits
1 (adevarat) sau 0 (fals))

if( fp == NULL ) { perror("Error while opening the file.\n"); exit(EXIT_FAILURE)

A function that calls itself is known as recursive function and the process of calling function itself is known as recursion in C programming A function that calls itself is known as recursive function and the process of calling function itself is known as recursion in C programming ..

Numbers of Fibonacci sequence are known as Fibonacci numbers. First few numbers of series are 0, 1, 1, 2, 3, 5, 8 etc, Except first two terms in sequence every other term is the sum of two previous terms, For example 8 = 3 + 5 (addition of 3, 5). Remember a number is armstrong if the sum of cubes of individual digits of a number is equal to the number itself. For example 371 is an armstrong number as 33 + 73 + 13 = 371. Some other armstrong numbers are 0, 1, 153, 370, 407.

Floyd's triangle First four rows of Floyd's triangle are as follows :1 23 456

7 8 9 10 It's clear that in Floyd's triangle nth row contains n numbers.

Pascal Triangle in c: C program to print Pascal triangle which you might have studied in Binomial Theorem in Mathematics. Number of rows of Pascal triangle to print is entered by the user. First four rows of Pascal triangle are shown below :1 1 1 1 2 1 1 3 3 1 Note that & is address of operator and * is value at address operator.
t = array[c]; array[c] = array[end]; array[end] = t;

gets

If you want to read a string from standard input, you can use the gets function, the name of which stands for "get string". However, this function is deprecated -- that means it is obsolete and it is strongly suggested you do not use it -- because it is dangerous. It is dangerous because it provides no protection against overflowing the string into which it is saving data. Programs that use gets can actually be a security problem on your computer. Since it is sometimes used in older code (which is why the GNU C Library still provides it), we will examine it briefly; nevertheless, you should always use the function getline instead. (See getline.)

#include <stdio.h> int main() { char my_string[500]; printf("Type something.\n");

gets(my_string); printf ("You typed: %s\n", my_string); return 0; }

strrev

#include <stdio.h> #include <string.h> int main() { char arr[100]; printf("Enter a string to reverse\n"); gets(arr); strrev(arr); printf("Reverse of entered string is \n%s\n",arr); return 0; }

its a library function used to reverse a string.

Strrev - its a library function used to reverse a string.

Strcat- for concatenate strings /sa unesti doua cuvinte madonnalove

To find string length we use strlen function of string.h.


Strcpy- copy something

while(*source) { *target = *source; source++; target++;

compares two strings using strcmp

Although most of the answers below will lead you to believe that ~0 will yield the highest value of the unsigned type you're assigning to, such behavior is not guaranteed. Use -1 i

~0 is the bitwise complement of 0, which is a number with all bits filled. For an unsigned 32-bit int, that's 0xffffffff. The exact number of fs will depend on the size of the value that you assign ~0to. It's the one complement, which inverts all bits. ~ ~ ~ 0101 => 1010 0000 => 1111 1111 => 0000

The built-in C-style null-terminated strings which are really just byte arrays and the C++ standard librarystd::string class which is not null terminated. Printing a null-terminated string prints everything up until the first null character. Printing astd::string prints the whole string, regardless of null characters in its middle

\0 is the NULL character, you can find it in your ASCII table, it has the value 0. It is used to determinate the end of C-style strings.

Firstly user will be asked to enter the order of matrix ( number of rows and columns )

This c program prints transpose of a matrix. It is obtained by interchanging rows and columns of a matrix. For example if a matrix is 12 34 56 then transpose of above matrix will be 135 246 When we transpose a matrix then the order of matrix changes, but for a square matrix order remains same. Palindrome dad,radar,121,212,-454 ROM read only memory; date al caror continut nu se pierde la intreruperea alimentarii calculatorului; memoriile ram sunt utilizate pentru a stoca programe si date care trebuie sa existe permanent in sistem;

RAM random access memory- sunt memorii la care microprocesorul poate atat citi cat si sa scrie date,si al caror continut se pierde la intreruperea alimentarii;sunt folosite pentru Stocarea temporara a informatiei. Dpdv al tehnologiei de realizare, memoriile de tip RAM sunt de doua feluri: Memorii statice(SRAM-static RAM)care mentin informatia atata timp cat exista tensiune de alimentare fara a mai fi necesara reimprospatarea(refresh-ul)sau rescrierea informatiei.Sunt memorii rapide ,dar sunt scumpe Memorii dinamica(DRAM- Dynamic RAM),la care informatia se volatileaza in timp si de aceea este necesara reimprospatarea periodica a acesteia,cu ajutorul unui circuit specializat.Memoriile dinamice sunt mai lente decat memoriile static,insa sunt mai ieftine si sunt memoriile cu care se realizeaza memoria interna de mare capacitate a calculatoarelor actuale.

Deoarece memoria are o capacitate limitat, se folosesc pentru stocarea programelor i datelor, dispozitivele sau unitile de memorie extern. Cele mai utilizate dispozitive de memorie extern sunt dispozitivele magnetice: discuri flexibile (floppy disks), benzile magnetice, discurile de mare capacitate sau discurile hard (hard disks). dispozitivele optice: CD-ROM, DVD (Digital Versatile Disc); memorii flash, SSD (Solid State Disk ) etc

DISPOZITIVELE DE INTRARE / IESIRE (I/O)


Pentru a comunica cu utilizatorul, un calculator dispune de urmtoarele dispozitive periferice de baz: tastatura pentru introducerea programelor sau datelor de prelucrat, display-ul sau ecranul pentru afiarea informaiilor din calculator, care pot fi n particular rezultatele prelucrrii, i imprimanta, pentru tiprirea pe hrtie a acestor informaii.

Exemplu,

printr-o linie se poate specifica dac microprocesorul citete sau scrie date (dac microprocesorul ine linia respectiv n "0", aceasta nseamn c procesorul citete date din memorie sau porturile de intrare; dac microprocesorul pune "1" pe aceast linie, se va efectua o scriere n memorie sau porturile de ieire),

MAGISTRALA SISTEMULUI (BUS)


Dimensiunea magistralei de date va da tipul procesorului, respectiv al calculatorului realizat n jurul procesorului respectiv. Dac magistrala de date are 16 linii, deci transferurile de date se pot face numai pe cuvnt (1cuvnt = 2 octei), se spune c avem un calculator pe 16 bii, iar dac magistrala de date are 32 linii avem un calculator pe 32 bii etc. Cele mai frecvent ntlnite familii de microprocesoare sunt: Intel (8088/8086, 80286, 80386, I80486, Pentium), Motorola (Motorola 680xx), AMD, Zilog (Z80, Z8000), Sparc (Sun Sparc i UltraSparc pe 32 de bii), Mips etc.

MAGISTRALA SISTEMULUI (BUS)


Magistrala este compusa din 3 seciuni : magistrala de date (Data Bus), pe care microprocesorul citete date din memorie sau porturile de intrare, sau scrie date n memorie sau porturile de ieire. Datele citite din memorie pot fi, n mod particular, instruciuni. magistrala de adrese (Address Bus), UCP-ul folosind aceste linii pentru a selecta locaia de memorie sau portul de I/E, din care se vrea o dat pentru a fi citit, sau n care se dorete nscrierea unei date. magistrala de control (Control Bus), format din linii specifice utilizate de microprocesor pentru controlul transferurilor de date pe magistral.

microprocesorul I8088 are: - magistrala de date de 8 bii, - magistrala de adrese de 16 bii, - magistrala de control de 8 bii, iar microprocesorul I8086 are: - magistrala de date de 16 bii, - magistrala de adrese de 20 de bii i - magistrala de control de 8 bii.

Octet- e unitatea de masura a memoriei;Are multipli si submultipli;1 byte= 8 octeti


ASCII American Standard Code for Information Interchange , EBCD Extended Binary Coded Decimal Interchange Code.) modul de codificare a numerelor, cea mai utilizata fiind binara A-65 B-66 C-67 D-68 s.a.m.d a-97 b- 98 c-99 d-100 s.a.m.d 0-48 1-49 2- 50 3-51 s.a.md.

O colecie de 8 bii numit octet sau "byte", unde fiecare bit poate fi 0 sau 1, poate distinge ntre 256 de stri diferite (28=256 ), deci dac am vrea s comunicm cu cineva folosind un octet, am putea transmite cel mult 256 de mesaje diferite, fiecare mesaj fiind asociat

cu o combinaie de 0 i 1 a celor 8 bii.

BAZE DE NUMERATIE
Sistemele de numeraie folosite de ctre utilizatorii de calculatoare, n afar de sistemul zecimal, sunt: sistemul binar, sistemul octal i sistemul hexazecimal. Sistemul binar este sistemul de numeraie n care lucreaz calculatoarele electronice, datorit faptului c nu are dect dou cifre, ceea ce duce la o implementare uoar a calculelor n hardware. Sistemele de numeraie octal i hexazecimal sunt folosite deoarece comprim irurile lungi de bii din reprezentarea unui numr n baza 2, iar conversia din baza 2 in baza 8 sau 16, i invers, se face foarte uor, fr calcule laborioase.

REPREZENTAREANUMERELOR
innd cont de reprezentarea intern a semnului numerelor binare, distingem urmtoarele trei coduri de reprezentare: A)Codul direct - n care numrul binar este reprezentat prin modulul numrului precedat de un bit de semn; 0 dac este pozitiv, 1 dac este negativ. Exemple: x = +1101 se reprezint n cod direct astfel : xd = 01101 y = - 11011,101 -> yd = 111011,101 B) Codul invers sau codul complementar fa de 1 - n care - dac numrul este pozitiv, se reprezint n cod invers la fel ca i n cod direct, deci precedat de un bit 0. - dac numrul x este negativ (x < 0), se inverseaz cifrele reprezentrii binare n cod direct a numrului -x, care este un numr pozitiv.

Exemple: x = +1101 -> xi = 01101 y = -1101,011 -> yi = 10010,100

REPREZENTAREANUMERELOR
C) Codul complementar fa de 2 - n cazul numerelor pozitive, reprezentarea este aceeai ca i n codul direct. - Pentru numerele negative, codul n complement fa de 2 se obine din codul invers, la care se adaug 1 n rangul cel mai puin semnificativ. Exemple: x = +1101 -> xc = 01101 y = -1101 -> yi = 10010 + 1 ------yc = 10011

REPREZENTAREANUMERELOR
Relativ la modul de reprezentare a virgulei zecimale, numerele reale pot fi reprezentate n - virgul fix sau n - virgul mobil.

LIMBAJUL PSEUDOCOD
In cadrul Universitatii "Stefan cel Mare" Suceava se utilizeaz, ncepnd din 1986, un metalimbaj numit n continuare PDEUDOCOD. Un algoritm este reprezentat n acest metalimbaj printr-o list de enunuri, dintre care se deosebesc dou tipuri de enunuri: standard i nestandard.
fclose( fp );

unde fp este pointerul la fiierul care va fi nchis.

Funcia fclose returneaz o valoare egal cu zero dac totul este n regul sau EOF dac s-au detectat erori

Funcia ftell() Permite obtinerea pozitiei curente in cadrul unui fisier. Prototipul functiei este
CITIREA DINTR-UN FISIER BINAR

Se face prin intermediul functiei fread( ... ), functie ce are prototipul dat in continuare.
size_t fread( void *ptr, size_t size, size_t n, FILE *fp);

FILE *fp; // fp = ... ( este deschis fisierul pentru citire)

INCHIDEREA UNUI FISER IN MODUL BINAR

Se face ca si in cazul fisierelor in mod text, adica:


fclose( fp );

cin.get();

pause>nul getch(); System("pause");

exit( 0 ); // sau return 0; ...; DESCHIDEREA UNUI FISER IN MODUL BINAR

Se face cu ajutorul functiei fopen(...) utilizand ca si parametru pentru specificarea modului de deschidere o secventa de genul _b, unde caracterul underscor ( _ ) poate fi (r, w, a sau +) astfel:
FILE *fp; char numefisier[80]; // sirul in care pastrez numele fisierului printf( \n Introdu numele fisierului:); scanf(%s, numefisier ); // citesc numele de fisier fp = fopen( numefisier, rb); // mod citire (r) fisier binar (b) if( fp == NULL ) // in cazul in care fisierul nu poate fi deschis { fprintf( stderr, Fisierul <%s> nu poate fi deschis, numefisier );

// printf( Fisierul <%s> nu poate fi deschis, numefisier ); exit( 0 ); // sau return ...; } INCHIDEREA UNUI FISER IN MODUL BINAR

Se face ca si in cazul fisierelor in mod text, adica:


fclose( fp FUNCII DE CITIRE/SCRIERE CU FISIERE TEXT

Dintre funciile principale de citire / scriere n fiiere amintim: i) pentru citire - fgetc( fp ) - citete un caracter; dac s-a ajuns la sfrit de fiier funcia va returna caracterul EOF - fscanf( fp, "format", arg ), avnd argumentele format, arg identice ca la scanf, cu deosebirea c datele sunt preluate din fiierul fp; - fgets ( buf, size( buf ), fp ) - citete un ir n zona buf. Aceast funcie ntoarce n mod normal adresa zonei buf sau o valoare nul dac s-a detectat EOF sau s-a produs o eroare. ii) pentru scriere - fputc( c, fp ) va scrie caracterul c n fiierul pointat de fp ce a fost deschis doar pentru scriere; - fputs( buf, fp ) va scrie irul de la adresa buf n fiierul fp; funcia ntoarce ultimul caracter scris n fiier dac nu s-a detectat nici o eroare sau EOF n caz contrar. - fprintf( fp, format, arg ), unde fp este pointerul fiierului n care se va scrie, iar format i arg sunt identice ca la funcia printf. Pentru testarea detectrii sfritului de fiier (EOF) se utilizeaz funcia
int feof( fp );

ce are ca argument pointerul fiierului prelucrat. Dac s-a detectat sfritul de fiier funcia returneaz valoarea 1, n caz contrar valoarea zero.

Exemplu Pentru citirea unui fiier text i afiarea coninutului su se poate utiliza secvena de program urmtoare:
FILE *fp; // declarare pointer la fisier char *nume = "fis.txt"; // identificator fisier // ... if( ( fp = fopen( nume, "rt" ) ) == NULL ) //deschidere fisier & test printf( "\nFisierul %s nu poate fi deschis", nume ); else { while( !feof( fp ) ) putch( fgetc( fp ) ); fclose( fp ); // inchidere fisier } // ... FUNCTIILE FOPEN( ) SI FCLOSE( )

Realizeaz deschiderea unui fiier, prin alocarea spaiului pentru vectorul de intrare-ieire i va returna adresa acestui vector. Aceast adres o vom numi n continuare pointer la fiier Declararea unui astfel de pointer se face cu ajutorul tipului de date FILE definit n stdio.h.
FILE *fintrare, *fiesire;

Pointerii la fiier servesc la stabilirea legturii ntre specificarea fiierului din program, n apelul funciilor de I/E i fiierul concret aflat pe suportul extern de memorie. Cnd fiierul nu poate fi deschis, funcia fopen va returna o valoare nul (NULL). Forma general a apelului acestei funcii este urmtoarea:
fp = fopen( char *nume, char *mod ) ;

unde fp - pointer la fiier ( adresa vectorului de I/E ), de tipul FILE*, nume - identificatorul fiierului pe care dorim s-l prelucrm; nume este un pointer la un ir de caractere ce indentific numele fiierului conform sintaxei prevzute de sistemul de operare sub care se lucreaz. mod - un pointer la un ir de caractere ce indic modul n care se va deschide fiierul.

Funcia fopen( ) Deschide un fiier nou sau unul existent ntr-unul din urmtoarele moduri : w scriere (vechiul coninut al fiierului se pierde), a adugare de nregistrri la fiierul existent (append), r citire secvenial din fiier, + se permit citiri i scrieri, t fiierul deschis este un fiier text, b fiierul deschis este un fiier binar. Exemplu :
FILE *fp; fp = fopen( date.txt, rt ) ; if( fp == NULL ) { printf( Eroare la deschidere ); exit( 0 ) ;

Funcia fclose() Dup ce toate operaiile asupra unui fiier s-au terminat, fiierul trebuie nchis iar acest lucru se face printrun apel al funciei fclose ca cel de mai jos:
fclose( fp );

unde fp este pointerul la fiierul care va fi nchis. Funcia fclose returneaz o valoare egal cu zero dac totul este n regul sau EOF dac s-au detectat erori.
FUNCTII DE POZITIONARE IN FISIER

Permite accesul n mod direct la nregistrrile unui fiier. Dac funcia fseek( ) nu este utilizat, accesul la date intr-un fisier are loc secvenial. Dup fiecare nregistrare citit sau scris indicatorul nregistrrii

curente fiind incrementat pe urmtoarea nregistrare. Funcia fseek( ) permite poziionarea pe oricare octet din fiier, conform argumentelor efective, cu setarea corespunztoare a indicatorului de nregistrare. Urmtoarea operaie de I/E n fiier dup apelul funciei fseek( ) va fi executat asupra nregistrrii poziionate de aceasta. Prototipul funciei este urmtorul:
long int fseek( FILE *fp, long offset, int whence);

unde: - fp este un pointer la fiier, - offset este numrul octetului pe care se va face poziionarea, iar - whence servete la calculul adresei relative n fiier al octetului pe care se poziioneaz indicatorul de nregistrare, putnd lua una din valorile simbolice: SEEK_SET - adresa se calculeaz relativ la primul octet al fiierului SEEK_CUR - se ia ca origine poziia curent la care se adaug offset SEEK_END - adresa se calculeaz considernd originea n ultimul octet din fiier. Este clar c n acest ultim caz offset trebuie s fie negativ. Funcia ftell() Permite obtinerea pozitiei curente in cadrul unui fisier. Prototipul functiei este :
long int ftell ( FILE * stream );

Aplicatie
/* ftell: * obtinerea dimensiunii unui fisier */ #include <stdio.h> int main( void ) { FILE *pFile; long size; pFile = fopen( "myfile.txt","rb" ); if (pFile==NULL) printf ("Error opening file"); else { fseek (pFile, 0, SEEK_END); size = ftell (pFile); fclose (pFile); printf ("Dimensiunea pentru myfile.txt: %ld bytes.\n", size); } return 0; }

To answer your question, you're supposed to use %d for signed (or ordinary) ints, and %u for unsigned ints; %* for normal ints, and %l* for long ints. clrscr mean to start clear output screen for another output of any program.

clrscr (); and getch();


clrscr(); and getch(); requires the header file conio.h i.e #include <conio.h> clrscr(); :- This is used for clearing the output screen i.e console

suppose you run a program, alter it and run it again you may find that the previous output is still stuck there itself, at this time clrscr(); would clean the previous screen. One more thing to remember always use clrscr(); after the declaration like int a,b,c; float total; clrscr(); getch(); :- getch is used to hold the screen in simple language, if u don't write this the screen will just flash and go away

Exist trei tipuri de structuri fundamentale care eflect cele trei tipuri de raionamente umane elementare:
Secvena, Decizia, Repetiia.

Aceste structuri controleaz la un nivel superior execuia operaiilor algoritmului. Structura secvenial Este format dintr-un grup de operaii simple i/sau alte structuri de control ce se execut n mod secvenial.
int a, b, suma scrie \nIntrodu doua valori: citeste a, b suma = a+b scrie \nsuma = , suma stop Structura decizional

Sunt posibile urmtoarele forme de structur decizionale

care exprim o decizie ce trebuie luat n cursul execuiei unui algoritm.


dac <condiie> atunci <operaie_de_baz> Decizionala. Forma I Decizionala. Forma II Execuie: - se evalueaz expresia logic <condiie> - dac rezultatul este adevrat se execut <operaie_de_baz>, altfel se trece la structura urmtoare din algoritm. dac <condiie> atunci -if <secvent> Execuie: - se evalueaz expresia logic <condiie> - dac rezultatul este adevrat se execut <secven>, altfel se trece direct la structura urmtoare. Decizionala. Forma III dac <condiie> atunci if else <secvena_1> altfel <secvena_2> Execuie: - se evalueaz expresia logic <condiie> - dac rezultatul este adevrat se execut <secvena_1>, altfel se execut <secvena_2>. - se trece apoi la secvena urmtoare. Observaie. Nu este corect utilizarea unei structuri decizionale care s aib doar ramura altfel, ramura atunci fiind vid. In astfel de situaii se nlocuiete <condiie> cu negata ei i se utilizeaz varianta Forma II.

Ce inseamna sqrt Better getline than gets


The other standard functions, including gets, fgets, and scanf, are too unreliable

Scanf&fgets&Gets &getline/ citeste Printf/scrie Stop/


Getch(); - system pause

Structura repetitiv
Structurile repetitive permit comanda execuiei repetate a unei secvene funcie de respectarea unei anumite condiii de oprire. Exist trei forme distincte de repetiii:
cu test iniial, cu test final i cu contor.

Structura repetitiv cu test iniial- while loop


ct timp <condiie> execut <secvena>

Structura repetitiv cu test final do while- at least once


Exist dou variante permise pentru acest tip de structur: repet repet
<secvena> <secvena> ct timp <condiie> pn cnd <condiie>

Pentru ambele forme, n primul rnd se execut <secvena>, apoi se evalueaz <condiie>. Observatii 1. Condiia de oprire este verificat dup ce se execut <secvena>. 2. Acest lucru face ca indiferent de forma, <secvena> s fie executat cel puin o dat.

3. Acest aspect le deosebete net de structura repetitiv cu test iniial. Din acest moment, apar diferene ntre execuiile acestor variante de structuri repetitive cu test final: n cazul primei formei, dac rezultatul este ADEVARAT, se reia execuia secvenei, altfel se trece la urmtoarea structur; n cazul formei a doua, dac rezultatul este FALS se execut nc o dat <secvena> . de 2 ori Dup cum sugereaz i numele lor, prima forma asigur execuia secvenei din interior ct timp condiia este ADEVARAT, iar forma a doua execut pn cnd <condiie> ia valoarea ADEVARAT

Structura repetitiv cu contor- for


Repetarea execuiei implic la aceast structur i modificarea valorii unei variabile numite contor. Aceast variabil ia pe parcursul execuiei valori ntr-un interval nchis [val_iniial, val_final] precizat n corpul structurii.
pentru <contor> = <val_init>, <val_fin> [,<pas>] execut <secvena>

Observatii 1. Parantezele [ i ] denot faptul c ceea ce este cuprins ntre ele este opional. 2. Valoarea expresiei <pas> reprezint incrementul cu care este modificat valoarea variabilei <contor> dup fiecare execuie a secvenei. 3. Dac nu este prezent n mod explicit atunci valoarea incrementului este 1. 4. De reinut c incrementul poate lua valori pozitive sau negative.

for loop

#include <stdio.h> #include <stdlib.h> int main() { int counter = 1; for(counter = 1; counter < 20; counter++) { printf("%d\n",counter); } }

Execuia structurii pentru n cazul pas>0


i) se iniializeaz <contor> cu <val_iniial>; ii) se verific dac valoarea contorului este mai mic sau egal cu <val_final>. In situaia n care aceast inegalitate nu este respectat, execuia structurii pentru se termin i se trece la urmtoarea structur de control din algoritm. iii) dac inegalitatea este respectat se execut <secvena>; iv) se execut <contor> = <contor> + <pas> ; v) se reia cu pasul ii). Execuia structurii pentru cazul n care pas<0 i) se iniializeaz <contor> cu <val_iniial>; ii) se verific dac valoarea contorului este mai mare sau egal cu <val_final>. In situaia cnd aceast inegalitate nu este respectat execuia structurii pentru se termin i se trece la urmtoarea structur de control; iii) dac inegalitatea este respectat se execut <secvena>; iv) se execut <contor> = <contor> + <pas>; v) se reia cu pasul ii).

Enunuri nestandard

Acest tip de enunuri servesc n mod frecvent la indicarea unor prelucrri ce nu sunt nc evideniate prin enunuri standard. Forma general a unui enun nestandard este urmtoarea:

*) <text_scris_n_limbaj_natural> pentru i=2,n execut dac x(i)>x(i-1) atunci *) schimb ntre ele x(i-1) i x(i) schimb=1

Observatie
Enunul nestandard *)schimb ntre ele x(i-1) i x(i) poate fi nlocuit prin secvena de enunuri standard *)schimb ntre ele x(i-1) i x(i) este salv = x(i-1) x(i-1) = x(i) x(i) = salv

int x, suma suma=0 scrie Introdu un sir terminat cu 0 //citete x repet citete x suma = suma + x pn cnd x==0 scrie "Suma= ", suma stop Exemplul II

Calculul lui N!. Solutia data va folosi metoda de calcul a factorialului in varianta iterativa. N! = 1*2*3**N
Definitii Observatie.
Structura decizional dac a fost necesar pentru a preveni

afiarea unui rezultat absurd ca urmare a unei greeli de introducere a datelor..

Iterativitate := Repetarea unui acelasi set de operaii asupra unor date diferite Recursivitate := Repetarea unui set de operaii, asupra datelor obinute la iteraia anterioar Observatie.
Structura decizional dac a fost necesar pentru a preveni afiarea unui rezultat absurd ca urmare a unei greeli de introducere a datelor..

Iterativitate := Repetarea unui acelasi set de operaii asupra unor date diferite Recursivitate := Repetarea unui set de operaii, asupra datelor obinute la iteraia anterioar int n,f citete n dac n<0 atunci scrie "Numr ilegal" altfel f=1 pentru i=2,n execut f=f*i scrie n,"!=",f Stop

Simboluri fara corespondent grafic


Simbol Semnificatie Secventa escape Cod ASCII zecimal SP avans cursor cu o pozitie - space 32 BEL semnal acustic - bell \a 7 BS revenire cursor cu o pozitie - back space \b 8 FF salt la pagina noua - form feed \f 12 NL avans cursor cu o linie - new line \n 10 CR revenire cursor la inceputul liniei curentecarriage

return \r 13 HT salt la urm pozitie de tabulare orizontala horizontal tab \t 9 VT salt la urm pozitie de tabulare verticala vertical tab \v 11 NULL caracter cu cod 0 ( terminator de sir ) \0 0

ASCII ( American Standard Code for information Interchange)

Definitie
Numele sau identificatorii se compun dintr-o secventa de litere, cifre si/sau _ ( liniuta de subliniere ), primul caracter trebuind sa fie litera sau _.

Observatie
Numele sunt case sensitive, deci se face deosebire intre literele mari si mici ( spre deosebire de PASCAL ), iar acestea pot fi: 1. nume utilizator nume de variabile, constante simbolice, functii, tipuri, structuri, uniuni Exemple de nume utilizator
test produs x1 X1 PI fctRecursiva

Exemple de definitii de constante simbolice ( care sunt nume utilizator ): #define PI 3.1415 #define DIMENSIUNE 20 #define Salut "Hello!" Observatii 1. Este bine ca numele utilizator, sa fie alese cat mai sugestiv pentru scopul utilizarii; 2. Se obisnuieste ca numele constantelor simbolice sa fie compuse din majuscule 3. Oconstanta simbolica se defineste prin directiva #define, fiind recunoscuta in toate liniile de program ce urmeaza definirii; Code for Information Interchange

4. Preprocesorul, anterior compilarii, inlocuieste orice aparitie a unei constante simbolice cu definitia sa
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while

Tabela cuvintelor rezervate - proprii compilatorului de C: nume de registri, moduri de compilare, etc
asm _cs _BH _DH cdecl _ds _BL _DI far _es _BP _DL huge _ss _BX _DX interrupt _AH _CH _FLAGS near _AL _CL _SI pascal _AX _CX _SP

Constantele numerice pot avea in componenta cifre si/sau caracterele .+-Eef Constantele nu au semn explicit: +12 sau -12 sunt expresii formate din cate o constanta precedata de operatorii unari +, respectiv -. Constantele ocupa un spatiu de memorie minim, corespunzator tipului numeric caruia ii apartin Constantele numerice pot fi: intregi - implicit in baza 10 ( zecimal ); in baza 8 ( octal ) sunt precedate de 0, in baza 16 ( hexazecimal ) de 0x; Exemple: 1, 29, 123123123, 0237 ( in octal ), 0xffab ( in hexazecimal ); aceeasi constanta in trei baze diferite: 255 0377 0xFF reale - pot avea doar mantisa sau mantisa si exponent (

exponentul este precedat de litera e sau E si reprezinta puterea lui 10 ); Exemplu o constanta in patru scrieri echivalente: 12.345 12.345f .12345E+2 1.2345e1 12345e-3 Spatiul ocupat este un numar de octeti cu unu mai mare decat al caracterelor din sir, ultimul octet fiind rezervat pentru terminatorul de sir: caracterul cu codul ASCII 0, adica '\0'.
Binary operator: & Stanga==> Dreapta Binary operator: ^ Stanga==> Dreapta Binary operator: | Stanga==> Dreapta expr ? true_expr : false_expr Dreapta<== Stanga += -= *= /= <<= &= ^= |= %= >>= = Dreapta<== Stanga

#include <stdio.h> #include <Stdio.h> --- Directive

preprocesor

int main( void ) { printf(\nHello world); return 0; }


Un program C are, in principiu, urmatoarea structura:

directive preprocesor definitii de tipuri prototipuri de functii -- un prototip declara tipul unei functii
( tipul valorii returnate ) si tipurile parametrilor transmisi functiei

definitii de variabile globale definitii de functii

Intr-o prima faza, programele C care vor fi concepute vor contine doar functia main

( care va fi void, deci nu va returna nici un rezultat si nu va primi parametri, deci si lista parametrilor va fi void ). Structura acestor programe va fi:

directive preprocesor definitii de tipur definitii de variabile globale definitia functiei main

Un tip de date reprezinta o multime de valori pe care sunt definite anumite operatii. Limbajul C defineste urmatoarele tipuri: 1. fundamentale ( aritmetice ) intregi, reale, enumerare, void 2. derivate tablou, functie, pointer, structura, uniune. Tipul void
Tipul void poate insemna: 1. nimic - cand se foloseste pentru functii care nu returneaza nici un rezultat 2. orice - cand se foloseste pentru pointeri care indica spre entitati cu tip neprecizat.

Tipuri intregi
La baza clasificarii tipurilor intregi stau doua criterii: 1. dimensiunea memoriei utilizate pentru reprezentarea unei valori: 1 octet -char, 2 octeti - int, 4 octeti long

2. modalitatea de tratare a valorii: cu semn - signed: este modul implicit, bitul cel mai semnificativ este considerat bit de semn; valoarea 0 a acestuia inseamna o valoare pozitiva, iar valoarea 1, o valoare negativa; reprezentarea valorilor se face in complement fate de 2 fara semn - unsigned: toti bitii reprezentarii fac parte din valoarea numarului.
Tip intreg nr octeti / nr biti valoare minima zecimal hexa binar valoare maxima zecimal hexa binar char (signed char) unsigned char 1 8 -128 0x80 -27

0 0x0 0 127 0x7F 27-1 255 0xFF 28-1

int ( signed int ) unsigned int 2 16 -32768 0x8000 -215

0 0x0 0 32767 0x7FFF 215-1 65535 0xFFFF 216-1


long (signed long) unsigned long 4 32 -2147483648 0x80000000 -231

0 0x0 0 2147483647 0x7FFFFFFF 231-1 4294967295 0xFFFFFFFF 232-1

Tipurile char(signed char)si unsigned char sunt cele pentru care se aloca cel mai mic spatiu de memorie, 1 octet. De cele mai multe ori valorile de aceste tipuri se interpreteaza ca reprezentand coduri de caractere, dar se folosesc si pentru memorarea intregilor de valori mici. Exemplu Daca o variabila trebuie sa retina un numar de apartament, de exemplu, poate fi declarata de

tipul char.
Pentru reprezentarea contantelor fara semn se foloseste sufixul u sau U: 32780 ( este long), 32780u ( este unsigned int ). Pentru reprezentarea constantelor in hexazecimal se foloseste prefixul 0x sau 0X: 0x8adf ( int ), 0x1F111 ( long ). Pentru reprezentarea constantelor in octal se foloseste prefixul 0 ( ZERO): 0721 ( int ), 07111111 ( long ). Valorile reale sunt reprezentate in virgula mobila. Trebuie semnalat faptul ca nu toate numerele reale pot fi reprezentate, deoarece memorarea valorilor reale, fiind realizata pe un numar anume de biti, nu poate retine decat o parte dintre cifrele semnificative. Deci, numai anumite valori reale au reprezentarea exacta in calculator, restul confundandu-se cu reprezentarea cea mai apropiata. Exista trei tipuri reale: float, double, long double, cu caracteristici prezentate in tabelul de mai jos. Constantele reale sunt implicit de tipul double; Sufixul f sau F aplicat unei constante, o face de tipul float; Sufixul l sau L aplicat unei constante, o face de tipul long double. O constanta reala ( double, pentru celelate doua tipuri reale, se adauga sufixul corespunzator ) se reprezinta sub forma: mantisa sau perechea: mantisaparte_exponent

unde : mantisa = parte_intr.parte_zecimala ( oricare din cele doua parti poate lipsi, dar nu ambele ) exponent = e val_exponent sau E val_exponent Observatie Valoarea constantei este produsul dintre mantisa si 10 la puterea data de exponent.

VARIABILE Variabila este o entitate folosita pentru memorarea unei valori de tipul asociat variabilei. O variabila se caracterizeaza printr-un: nume, un tip, o valoare. Oricarei variabile i se aloca ( rezerva ) un spatiu de memorie care corespunzator tipului variabilei. Definirea variabilelor se poate face: inaintea functiilor, caz in care sunt globale, deci pot fi folosite de functii, sau in corpul functiilor, inainte de prelucrari, caz in care sunt locale functiei respective. Numele unei variabile este unic ( nu pot exista mai multe variabile cu acelasi nume ), dar o variabila locala poate avea numele uneia globale, caz in care in interiorul functiei, e valabila noua semnificatie a numelui. Exemplu
char c1; char car1 = 'a',car2= car1 + 1; /* car2 se initializeaza cu 'b' */ float real = 1.74, coef; /*Observatie: In declaratia: tip lista_declaratori; tip poate fi precedat sau urmat de cuvantul cheie const, caz in care variabilele astfel definite trebuie sa fie initializate si nusi pot modifica valoarea.

*/ const int coef1 = -2, coef2 = 14; coef1=5; /* modificarea valorii unei variabile declarate cu const e gresita, apare eroare in compilare */

Afisarea pe consola
int printf( format, arg1, arg2, ... );
Functia afiseaza valorile expresiilor din lista argumentelor, conform formatului specificat, unde argumentele pot fi: constante, variabile, expresii. Formatul este un sir de caractere care trebuie sa includa cate un descriptor de format pentru fiecare din argumente. Caracterele din format care nu fac parte din descriptori se tiparesc pe ecran. Daca nu apare nici un argument, pe ecran se tiparesc doar caracterele din sirul format. Functia returneaza numarul de valori tiparite sau EOF in cazul unei erori.
Descriptor Reprezentare %c caracter %d %i intreg in zecimal %u intreg in zecimal fara semn %o intreg in octal %x intreg in hexazecimal %ld %li %lu %lo %lx cu semnificatiile de mai sus, pentru intregi lungi %f %e float; pentru %e - o cifra la partea intreaga %lf %le double %Lf %Le long double

Citirea de la terminal
int scanf( format, adr1, adr2 ,...);
Functia citeste informatiile tastate pe care le interpreteaza conform specificatorilor din format, memorand valorile citite la adresele transmise ca parametri. Formatul este un sir de caractere care trebuie sa includa cate un descriptor de format pentru fiecare dintre valorile citite.

Adresele sunt pointeri sau adresele variabilelor ale caror valori se citesc; Observatii 1. Adresa unei variabile se obtine folosind operatorul de adresare &, astfel: &nume_variabila 2. Functia returneaza numarul de valori citite sau EOF daca s-a tastat Ctrl/Z. 3. Valorile intregi sau reale consecutive introduse de la tastatura trebuie separate de cel putin un Enter sau spatiu. 4. Atunci cand folosim printf sau scanf va trebui sa includem fisierul header stdio.h: #include <stdio.h>

Sintaxa descriptorului de format este: Descriptorul indic conversia care se face: d - ntreg n baza 10 o - ntreg n baza 8 x - ntreg n baza 16 f - real c - caracter s - ir de caractere. * indic faptul c valoarea citit nu se atribuie unei variabile. L indic un ntreg long sau un real double; h - indic un ntreg short. putch( <expresie> ) - afieaz pe ecran caracterul avnd codul ASCII egal cu valoarea expresiei; funcia returneaz codul caracterului afiat. Aceste funcii au prototipurile declarate n fiierul <conio.h>. 1. getchar() - nu este o funcie ci o macroinstruciune. Are ca efect citirea cu ecou a unui caracter de la terminalul standard. Caracterele introduse de la tastatur sunt puse ntr-o zon tampon, pn la acionarea tastei ENTER, moment n care n zona tampon se introduce caracterul rnd nou. Fiecare apel getchar() preia urmtorul caracter din zona tampon. 2. putchar( <expresie> ) - este tot o macroinstruciune, care

afieaz caracterul avnd codul ASCII egal cu valoarea parametru <expresie>. Macrourile getchar i putchar sunt definite n fiierul <stdio.h>.
ASCII is an acronym for American Standard Code for Information Interchange.
specifiers length (none) int

d i

u o x X unsigned int

f F e E g G a A double

c int

s char*

p void* int*

hh h l ll j z t L

signed char unsigned char short int long int long long int unsigned short int unsigned long int unsigned long long int

signed char* short int*

wint_t wchar_t*

long int* long long int*

intmax_t size_t ptrdiff_t

uintmax_t size_t ptrdiff_t


long double

intmax_t* size_t* ptrdiff_t*

Note: Yellow rows indicate specifiers and sub-specifiers introduced by C99. See <cinttypes> for the specifiers for extended types.

Compatibility Particular library implementations may support additional specifiers and sub-specifiers. Those listed here are supported by the latest C and C++ standards (both published in 2011), but those in yellow were introduced in C99 (only required for C++ implementations since C++11), and may not be supported by libraries that comply with older standards.

NAME

printf, fprintf, sprintf, snprintf, asprintf, dprintf, vprintf, vfprintf, vsprintf, vsnprintf, vasprintf, vdprintf -- formatted output conversion

Expresii

O expresie este compus din una sau mai multe operaii. Operaiile sunt reprezentate de operatori ce acioneaz asupra operanzilor. Operatorii care admit un operand sunt numii operatori unari, n timp ce operatorii care implic 2 operanzi sunt numii operatori binari. Operanzii pentru un operator binar sunt cunoscui ca operand stnga sau dreapta. Parte din operatori i limbajului C pot reprezenta i o operaie unar i o operaie binar.

Conversii aritmetice

Cnd un operator binar se aplic ntre doi operanzi de tip diferit, are loc o conversie implicit: { operandul de tip mai slab reprezentat este convertit la tipul mai puternic reprezentat al celuilalt operand. } Astfel n expresia f + i, operandul int este convertit n float. Operatorii aritmetici convertesc automat operanzii la un anumit tip, dac operanzii sunt de tip diferit. Se aplic urmtoarele reguli: 1. operanzii char i short int se convertesc n int; operanzii float se convertesc n double. 2. dac unul din operanzi este double restul operanzilor se convertesc n double iar rezultatul este tot double. 3. dac unul din operanzi este long restul operanzilor se convertesc n long , iar rezultatul este tot long. 4. dac unul din operanzi este unsigned restul operanzilor se convertesc n unsigned , iar rezultatul este tot unsigned. 5. dac nu se aplic ultimele 3 reguli, atunci operanzii vor fi de tip int i rezultatul de asemeni de tip int.

Conversii de tip CAST

Conversiile explicite de tip (numite i cast) pot fi forate n orice expresie folosind un operator unar (cast) ntr-o construcie de

forma: (tip) expresie n care expresia este convertit la tipul numit. Operatorul cast are aceeai preceden cu a unui operator unar. Valoarea transmis din partea dreapt este convertit implicit la tipul prii stngi. Atribuiri de forma: a = a op b se scriu mai compact a op= b n care op poart numele de operator de atribuire, acesta putnd fi un operator aritmetic: ( +, -,*,/,%) sau ( >>, <<, &, ^, | ). O atribuire multipl are forma: v1 = v2 = ... = vn = expresie; i este asociativ la dreapta. Observatie Operatorul modulo calculeaz restul mpririi a dou valori. Poate fi aplicat doar operanzilor de tip int.
operatori aritmetici + - * / % >> << & ^ | operatorii relationali - > >= == !=

Operatorii relaionali au prioritate mai mic dect operatorii aritmetici. Putem deci scrie: a < b -1 n loc de a < (b -1) Operatorii logici sunt: - && - SI logic ( TRUE doara daca ambii operanzi sunt TRUE ) - || - SAU logic ( TRUE cand cel putin un operand este TRUE ) - ! - Negatie ( TRUE daca expresia este FALSA ) Rezultatul unui operator relational sau logic este o valoare

logica. In limbajul C, valoarea: - FALSE echivalent cu ZERO - TRUE echivalent cu orice valoare diferita de ZE

date::structuri::functii ] Operatorii incrementare/decrementare

Operatorii de incrementare (++) i decrementare (--) reprezint o notaie convenional, compact pentru adunarea i scderea valorii 1 dintr-o variabil. Fiecare operator are o form prefix i alta postfix. id_var ++; ++ id_var; id_var --; -- id_var; int c=0, a, b; a = ++c; //increment prefix b = c++; // increment postfix //a=1; b=1; c=2; Forma prefix incrementeaz/decrementeaz valoarea lui id_var nainte ca id_var s fie utilizat, iar n cazul formei postfix, valoarea este incrementat / decrementat dup ce a fost utilizat id_var.O

Operatorii binari pe BITI


n C exist 6 operaii de manipulare a biilor, aplicate asupra unor operanzi ntregi (char, short, int, long) cu sau fr semn: & -I | - SAU ^ - SAU exclusiv << - deplasare stnga

>> - deplasare dreapta ~ - complement fat de 1 (inversare) Operatorul I se foloseste pentru operaia de mascare a unor bii. n=n & 0177; /* pune pe 0 bitii din pozitia 8 in sus */ Operatorul SAU pune pe 1 biii specificai printr-o masc: x=x | 0x03; /* sunt 1 bitii ce sunt 1 in MASCA 0x03*/ Deplasarea dreapta a unui ntreg cu semn este aritmetic, iar a unui ntreg fr semn este logic. x |= 1 << 7; /* pune pe 1 bitul 0 din octetul x */ x &= ~(1 << 7); /* pune pe 0 bitul 0 din octetul x */

Operatorii conditional si secventa

Operatorul secvential este reprezentat prin simbolul , i se foloseste n situaiile n care sintaxa impune prezena unei singure expresii, dar prelucrarea presupune prezena i evaluarea mai multor expresii. expr1,expr2,...,exprn Evaluare presupune evaluarea a doua sau mai multor expresii; acestea se evalueaza de la stanga la dreapta, iar rezultatul iintregii expresii este cel al ultimei expresii ( exprn ) Observatie Expresiile componente trebuie s fie atribuiri, incrementri sau decrementri, n afar de exprn care poate fi oarecare, deoarece d valoarea ntregii secvene. Exemplu y = 20; x = ( y = y-5, 30/y ); valoarea variabilei y este 15, iar valoarea lui x este 2.

alti operatori unari

Operatorii de adresare indirecta & <id_var> - obine adresa unei entiti; * <adresa> - pentru adresare indirect adic memoreaz adresa unei entiti printr-o valoare a unui pointer / adresa; ( va fi studiat la POINTERI )

alti operatori unari


EXEMPLU sqrt(x), printf(salut\n) x[i], a[i][j] student.nastere.an pstud->nume Operatori de acces [ ] indexare folosit n expresii de forma tablou[ indice ] . selecie direct - pentru adresarea unui cmp dintr-o structur sau uniune sub forma struct.selector -> selecie indirect - pentru accesul la un cmp dintr-o structur sau uniune, a crei adres este memorat ntr-un pointer pointer -> selector este echivalent cu (* pointer) . selector

instructiunea decizionala
Instruciunea IF ( daca in PSEUDOCOD ) Forma general: if( <expresie> ) <instructiune1>; else <instructiune2>; Se evalueaz expresia; dac este diferit de 0 se execut instruciune1 altfel instruciune2. O form simplificat are instruciune2 vid: if( <expresie> ) <instructiune>; n problemele de clasificare se ntlnesc decizii de forma: if( <expr1> ) <instr1>;

else if( <expr2> ) <instr2>; else <instrn>;

2 S se scrie un program pentru rezolvarea cu discuie a ecuaiei de grad 2: ax2+bx+c=0


#include <stdio.h> #include <math.h> void main(void) { float a, b, c, d, delta; printf("Introduceti coeficientii " (aX^2 + bX + c = 0)\n"); printf("\na = "); scanf("%f", &a printf("\nb = "); scanf("%f", &b printf("\nc = "); scanf("%f", &c /* * [ REZOLVARE ] */

ecuatiei ); ); );

Observatie In limbajul C doua constante sir de caracter sunt concatenate. Student silitor este echivalent cu Student silitor
if( a == 0 ) //separa de cazul ecuatiei de gr. I { if( b == 0 ) // evita / la ZERO { if( c == 0 ) printf("\nO inf. de solutii ( %d = 0 )", c ); else printf("\nFara solutii ( %5.2f = 0 ).", c ); }else printf("\nSolutie ... X = %5.2f", -c/b ); } else // ... sigur nu este ec. de gr. I { delta = b*b - 4*a*c; if( delta >= 0 ) //Solutii REALE printf("\nX1 = %5.2f\nX2 = %5.2f", (-b + sqrt( delta ))/2/a, (-b - sqrt( delta ))/2/a

); else //Solutii COMPLEXE { printf("\nX1 = %5.2f +i %5.2f", -b/2/a, sqrt( -delta )/2/a ); printf("\nX1 = %5.2f -i %5.2f", -b/2/a, sqrt( -delta )/2/a ); } } }//end main()

directiva #include ... #include <math.h> In limbajul C se ntlnesc trei instruciuni repetitive: dou cu test iniial ( while i for ) i una cu test final ( do ). Dupa for , do while,while nu se pune ; while( !0 ) //ADEVARAT tot timpul
/*Un numar natural n se numeste perfect daca este egal * cu suma divizorilor sai naturali mai mici decat n. * Exemplu: * 6 = 1 + 2 + 3 ; 28 = 1 + 2 + 4 + 7 + 14) * Sa se determine toate numerele perfecte mai mici * sau egale cu n, un numar citit de la tastatura. */ #include <stdio.h> #include <conio.h> #include <string.h> int main( void ) { int n_lim, i, j, s; printf( "\nIntroduceti numarul pana la care doriti " "sa se faca \nafisarea numerelor perfecte: " ); scanf( "%d", &n_lim ); for( i = 2; i <= n_lim; i++ ) { s = 1; //initializez suma cu 1 for( j = 2; j <= i/2; j++ ) if( i % j == 0 ) // este divizor? s += j; //calculez suma divizorilor if( i == s ) //A dat identitate? printf("\n %d", i ); }

return 0; } TEMA 1. Ce imbunatatiri puteti adduce solutiei

Sintaxa general de declarare a unei variabile indexate este: <tip> <identificator> [<indice1>] [<indice2>]...[<indicen>]; Referirea la un element al masivului se face conform urmtoarei sintaxe generale: <identificator>[<expresie_int1>][<expresie_int2>]... unde <expresie_intx> - este o expresie a crei valoare trebuie s fie ntreag i pozitiv. Exemplu: mat[ 0 ][ 0 ] = 0; mat[ i ][ j ] = sir[ 2 ]; vect[ i+1 ] += 1; vect[ i++ ] = vect[ 0 ];

Variabile indexate
Exemplu: int A[4][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; Astfel, se pune n eviden faptul c matricea A are 4 elemente, fiecare element fiind un tablou unidimensional de 3 elemente. Exemplu: int A[][3]={1,2,3,4,5,6,7,8,9,10,11,12}; Unde nu s-a precizat prima dimensiune a tabloului. Lipsa dimensiunii ntr-o declaraie de tip n care sunt prezente iniializri, face ca dimensiunea alocat s fie egal cu dimensiunea zonei iniializate efectiv. Observatie De reinut ca regul general, faptul c numai prima dimensiune a unui tablou

multidimensional poate rmne neprecizat, n caz contrar, compilatorul nu mai are informaiile necesare pentru calculul adresei unui element de tablou. Exemplu: int M[2][3]={{1}, {2}}; int M[2][3]={{1,0,0}, {2,0,0}}; Declaratiile sunt echivalente! Observatie Pentru tablouri ntregi, n cazul n care sunt precizate dimensiunile, iar lungimea zonei iniializate este mai mic dect aceast dimensiune, se completeaz cu 0. Exemplu: TABLOU int A[4][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; Exemplu: int M[2][3]={{1}, {2}}; int M[2][3]={{1,0,0}, {2,0,0}}; Declaratiile sunt echivalente! Observatie Pentru tablouri ntregi, n cazul n care sunt precizate dimensiunile, iar lungimea zonei iniializate este mai mic dect aceast dimensiune, se completeaz cu 0. Alte forme de initializare a sirurilor de caractere Exemplu: printf("ABCDE"); printf("%d",n); scanf("%f",&t); Constante ir se ntlnesc n apelul funciilor printf(...s) sau scanf(...) Exemplu: char s[]="ABCDE"; char *s="ABCDE";

In acest caz se aloc pentru tabloul s[ ], 6 octei, dintre care primii 5 conin codurile ASCII ale literelor A,B,C,D,E i al aselea indicatorul de sfrit de ir '\0'. Exemplu: char s[]= { 'A', 'B',
'C', 'D', 'E', '\0 };

Efect identic Exemplu: /*Constanta originala*/ printf("Acesta este un exemplu cu o constanta sir foarte mare"); /*Metoda 1*/ printf( "Acesta este un exemplu cu o \ constanta sir foarte mare ); /*Metoda 1*/ printf("Acesta este un exemplu cu o "constanta sir foarte mare ); Efecte identice ! printf( %s, sir ); - cu specificatorul de format %s. Functia va afisa caracterele din sir, pn se ntlnete caracterul '\0' (terminator sir); Observatie Deoarece pot ramane caractere in bufferul de tastaura,pentru golirea acestuia se va folosi functia flushall( ); Vom folosi acesta functie atunci cand dorim ca apelul functiei gets() sa preia caracterele ce le vom introduce in acel moment si nu caractere ramase de la citiri anterioare. Exemplu char sir[ 80 ]; /* .... */ printf("\Introdu sirul: " );

flushall(); gets( sir ); /* .... */


Argumente n linia de comand void main ( int argc, char *argv[ ] )

Instructiunea de selectie ( switch )


Forma general a acestei instruciuni este: switch( <exp_int> ) { case <exp_ct_1>: <secventa_1> //............. case <exp_ct_k>: <secventa_k> default: <secventa_x> } Componentele de baz ale instruciunii de selecie au urmtoarele particulariti: expresia selectoare <exp_int> trebuie s aib valoarea de tip ntreg; etichetele case <exp_ct_i>, cu i=1,..,k trebuie s aib n partea exp_ct_i constante sau expresii cu valoare constant, de tip ntreg; ele trebuie s fie distincte; eticheta default i prelucrarea asociat ei sunt opionale; ea corespunde mulimii etichetelor posibile diferite de cele menionate explicit n case, <secventa_i> reprezint instruciuni simple sau compuse, dar pot i lipsi. In cazul acestor secvente de program poate aparea si instructiunea break, efectul fiind acela de a parasi instructiunea switch, in acel punct si continuarea programului cu urmatoarea instructiune de dupa switch. Construcii ca urmatoarea fiind perfect valide:

switch ( nota ) { case 10 :

case 9 :printf ("\nFelicitari !"); break; case 8 : case 7 :printf("bine") break; case 6 :printf("..."); break; case 5 :printf(" ? "); break; default :printf("\nNota inacceptabila.");
} Derularea execuiei unei instruciuni de selecie: se evalueaz expresia selectoare, a crei valoare este comparat succesiv cu valorile <exp_ct_i> din etichetele case; dac se detecteaz o etichet avnd pentru <exp_ct_i> o valoare egal cu cea a expresiei <exp_int>, se trece la execuia prelucrrii asociate, continundu-se apoi cu toate cele care urmeaz, pn la ntlnirea unei instruciuni break, return sau pn la ntlnirea acoladei de sfrit a instruciunii complexe asociate. dac nu se detecteaz o astfel de etichet, dar este prezent eticheta default, se execut prelucarea asociat acesteia, altfel selecia se ncheie fr a fi executat vreo prelucrare.

clrscr mean to start clear output screen for another output of any program.syntax means the rules of the pictular programming language which have to follow while writting program in that langague The 'syntax' is rather simple: clrscr ();
In C, definiia funciilor se face conform urmtoarei sintaxe generale:

[<tip_functie> ]

<id_functie>([ <lista_declaratii_parametri> ] ) { [ <declaraii_identificatori_locali> ] [ <instruciuni> ] [ return [ <expresie> ]; ] unde: tip_functie := int|char|unsigned|float|double|short|long Prin tip_functie se stabilete tipul rezultatului funciei. Dac nu este prezent tip_functie, atunci funcia este considerat de tip ntreg. In limbajul BorlandC 3.1 este permis ca declarator de tip i tipul void, pentru funcii care nu ntorc nici un rezultat. Sunt permise i funcii fr nici un argument, de exemplu, funcia getchar(), dar i pentru aceste funcii sunt obligatorii parantezele. In primele etape ale elaborrii programelor se pot utiliza funcii care au corp vid, urmnd ca acestea s fie completate ntr-o etap ulterioar Termenul <id_functie> reprezinta numele ( identificatorul ) functiei si respecta conditiile de la identificatorii de variabile. Execuia unei funcii de tip void se poate termina i printr-o instruciune: return; Astfel, tipul fiecrui parametru actual este comparat cu cel al parametrului formal corespunztor i se realizeaz conversiile implicite de tip: float la double, char i short la int, etc.

Alte conversii necesare trebuie realizate prin operator cast. Instruciunile din corpul funciei care se refer la parametri formali, utilizeaz copiile valorilor parametrilor efectivi. Dac se modific valoarea unui parametru, de fapt este afectat doar copia, nu i parametrul efectiv corespunztor. Astfel, funcia putere(), n versiunea cea mai simpl, poate fi scris astfel: double putere( float b, unsigned char exp { double rez=1; for (; exp; exp--) rez*=b; return rez; In cazul n care, n program, definiia funciei se afl dup apelul su, declaraia funciei trebuie s precead apelul acesteia, de exemplu:
double putere( double x, int y ); //declaratie void main( void ) { // . . . putere( 3.2, 3 ); //apel

Tipul acestei valori este specificat naintea numelui funciei, iar transmiterea valorii este realizat de o instruciune return, inclus n corpul funciei, conform sintaxei generale: return expresie;
#include <stdio.h> void schimba( int px, int py ); void test( int t ); int T1, T2; /* -----------------------------------------------------------* Interschimba valorile din cei doi parametri. * ------------------------------------------------------------ */

void schimba( int px, int py ) { int tmp, _tmp; printf( "\nint T1, T2 : %p-%p.", &T1, &T2 ); printf( "\n\tschimba( px, py ): %p-%p.\n\tint tmp, _tmp : %p-%p.", &px, &py, &tmp, &_tmp ); printf( "\n\t- px = %d, py = %d.", px, py ); tmp = px; px = py; py = tmp; printf( "\n\t- px = %d, py = %d.", px, py ); } /* Functir de test */ void test( int t ) { schimba( -1, -2 );

Functii Recursive Recursivitatea este tehnica de programare n care un subprogram se autoapeleaz. Limbajul C face parte din clasa limbajelor de programare care admit scrierea de funcii recursive. Un obiect sau un fenomen se defineste in mod recursiv daca in definitia sa exista o referire la el insusi Recursivitatea e strins legata de iteratie.Iteratia este executia repetata a unei portiuni de program, pina la indeplinirea unei conditii (while, dowhile , for din C). Recursivitatea presupune: executia repetata a unui modul, insa in cursul executiei, se verifica o conditie a carei nesatisfacere, implica reluarea executiei modulului de la inceput, fara ca executia curenta sa se fi terminat.

In momentul satisfacerii conditiei se revine in ordine inversa din lantul de apeluri, reluandu-se si incheindu-se apelurile suspendate.
return factorialR( n ) / factorialR( k ) / factorialR( n-k ); return combinariR( n-1, k ) + combinariR( n-1, k-1 );

Functii cu parametri variabile indexate In acest caz putemafirma ca orice schimbare produsa in interiorul functiei va fi vizibila si dupa revenirea din functie. Acest lucru este posibil deoarece, in aceste cazuri, se face accesul la elementul unui sir pe baza adresei sirului, motiv pentru care accesul se va produce asupra sirului transmis ca parametru. In cazul acestor functii identificam doua situatii mai des intalnite: Functii cu parametri de tip sir Functii cu parametri de tip matrice In cazul acestor functii se pune problema modului in care declaramacesti parametri si modul in care transmitem un astfel de parametru. PARAMETRI de tip SIR // declararea unei functii cu un parametru de tip SIR void functiePSir( int n, int sir[] ); // void functiePSir( int n, int sir[ 100 ] ); void main( void ) { int N = 5, sirA[ 100 ]; // functiePSir( N, sirA ); // apelul functiei. Transmiterea unui sir ca parametru //functiePSir( N, &sirA[0] ); functiePSir( N/2, &sirA[N/2] ); PARAMETRI de tipMATRICE // declararea unei functii cu un parametru de tip SIR

void functiePMat( int n, int m, int mat[][20] ); // void functiePMat( int n, int m, int mat[10][20]); void main( void ) { int N = 5,M = 3, matA[ 10 ][ 20 ]; // functiePMat( N,M, matA ); // apelul functiei. Transmiterea unei matrici ca parametru // } CONCLUZII In cazul parametrilor de tip SIR: 1. In cazul declaratiei nu este obligatoriu specificarea dimensiunii sirului; 2. In momentul apelului se va transmite, ca si parametru real, NUMELE unui sir, catre parametrul formal de tip SIR; In cazul parametrilor de tip MATRICE: 1. In cazul declaratiei nu este obligatoriu specificarea numarului de randuri pentru parametrul matrice, dar suntemOBLIGATI sa specificamnumarul de COLOANE pentru acelasi parametru; 2. In momentul apelului se va transmite, ca si parametru real, NUMELE unei matrici, catre parametrul formal de tip MATRICE; 3. Numarul de coloane pentru parametrul real ( matricea trimisa) sa coincida cu numarul de coloane pentru parametrul formal ;
// Functia de afisare geamana lui "printf( ... )" void myprintf( char *msg, ... )

//Doua exemple de apel Sort( "Numerele sortate sunt :", 3, 2, 9, 3, 1, 0 ); Sort( "Numerele sortate sunt :", 11, 2, -3, 4, 21, 44, 12, 0 ); 1 DIRECTIVE DE PREPROCESARE

Preprocesarea este prelucrarea textului sursa al programului inaintea etapei de compilare. In limbajul C preprocesarea se realizeaza cu ajutorul directivelor de preprocesare. Acestea sunt recunoscute de compilator prin prezenta caracterului #. Includerea fisierelor sursa se realizeaza prin intermediul directivei #include care are doua forme:
#include <fisier_sursa> #include "fisier_sursa"

Ambele forme au ca efect includerea totala a fisierului sursa in fisierul care contine directiva. Diferentele intre cele doua forme se refera la locatia unde este cautat fisierul sursa: - In cazul in care se foloseste prima varianta, fisierul este cautat in directoarele standard (specificate prin optiuni sau prin variabile de mediu in functie de compilator). - In in cazul celei de-a doua varianta fisierul este cautat intai in directorul curent, iar dupa aceea, daca nu este gasit, in directoarele standard. Forma cu "..." permite si specificarea caii complete catre fisierul inclus; in acest caz, nu se mai face cautarea si in directoarele standard.
#include "D:\Work\Siruri.c" D:\work\siruri.c DIRECTIVELE CONDIIONALE

Compilarea conditionata permite includerea/excluderea unor sectiuni din codul sursa in functie de anumite criterii. In C se folosesc directivele de compilare conditionata prezentate mai jos:
#if #ifdef #ifndef #else #elif #endif

In cadrul expresiilor se poate folosi cuvantul cheie defined pentru a testa daca un anumit simbol de preprocesare a fost definit. Exemplu:
#if defined( DIM_MAX ) ... )

In cazul in care se doreste doar testarea existentei unei variabile se pot folosi directivele: - #ifdef (echivalent cu #if defined ) sau - #ifndef (echivaled cu #if !defined )

There are two ways to declare a symbolic constant in C++. The old, traditional, and now obsolete way is with a preprocessor directive, #define. Defining Constants with #define To define a constant the traditional way, you would enter this: #define studentsPerClass 15 Note that studentsPerClass is of no particular type (int, char, and so on). #define does a simple text substitution. Every time the preprocessor sees the word studentsPerClass, it puts in the text 15. Because the preprocessor runs before the compiler, your compiler never sees your constant; it sees the number 15. Defining Constants with const Although #define works, there is a new, much better way to define constants in C++:

const unsigned short int studentsPerClass = 15; This example also declares a symbolic constant named studentsPerClass, but this time studentsPerClass is typed as an unsigned short int. This method has several advantages in making your code easier to maintain and in preventing bugs. The biggest difference is that this constant has a type, and the compiler can enforce that it is used according to its type

square root

rdcin ptrat [mat.]

//Doua exemple de apel Sort( "Numerele sortate sunt :", 3, 2, 9, 3, 1, 0 ); Sort( "Numerele sortate sunt :", 11, 2, -3, 4, 21, 44, 12, 0 );
MACRODEFINIII

Macrodefinitiile sunt secvente de cod parametrizate care pot fi inlocuite in textul sursa. Pentru definirea lor se foloseste o extensie a directivei #define:
#define macro(param) corp

Unde: - macro numele macrodefinitiei - param lista de parametri, fara tip - corp corpul macrodefinitiei Macrodefinitiile sunt expandate in textul sursa inainte de compilare in doua etape: - apelul macrodefinitiei din codul sursa este inlocuit cu corpul acesteia - parametrii macrodefinitiei sunt inlocuiti cu valorile primite ca parametrii

ce pot opera cu nume de fisiere si directoare precum si alte operatii auxiliare ( copiere, mutare, creare, redenumire, etc)

OPERATII CU FISIERE SI DIRECTOARE


Functiile ce realizeaza aceste operatii sunt declarate in fisierul <dir.h>. Limbajul C dispune de functii ce pot opera cu nume de fisiere si directoare precum si alte operatii auxiliare ( copiere, mutare, creare,redenumire, etc)
<DIR.H> [ Functii ] chdir findfirst findnext setdisk fnmerge fnsplit getcurdir getcwd getdisk mkdir mktemp rmdir searchpath [ Constante, tipuri de date si variabile globale ] DIRECTORY DRIVE EXTENSIONS MAXPATH

ffblk FILENAME MAXDIR MAXDRIVE MAXEXT MAXFILE Structura ffblk dispune de urmatoarele campuri: struct ffblk { char ff_reserved[21]; /* rezervat de DOS */ char ff_attrib; /* atributul gasit */ int ff_ftime; /* timpul fisierului */ int ff_fdate; /* data fisierului */ long ff_fsize; /* dimensiunea fisierului */ char ff_name[13]; /* numele fisierului gasit */ }; Observatie Campurile ff_ftime si ff_fdate sunt structuri de 16 biti, divizate la nivel de bit pentru a accesa campurile referitoare la data si timp.

GENARATORUL NUMERE ALEATOARE


In acest scop sunt utilizate doua functii, din biblioteca stdlib.h: - functia randomize( ); - functia random( val ).
#include <stdio.h> #include <stdlib.h> void main() { int x, YourNumber; randomize(); //initializeaza generatorul printf ("Numerele sunt:\n\n"); for ( x = 1; x < 7; x++) // genereaza 6 nr. aleatoare { YourNumber = random( 48 ) + 1; //numarul creat printf( "%d: %d\n", x, YourNumber ); } } Argumentul ce reprezinta + path calea catre procesul fiu argN argumentele transmise separat argv[N] un sir de pointeri env sir de pointeri catre variabilele de mediu.

Valoarea returnata: - pt. succes, functia nu returneaza cod de eroare. - in caz de eroare, functia returneaza -1 si seteaza variabila errno cu una din valorile: o E2BIG lista de argumente prea mare
15

o o o o o

EACCES acces interzis EMFILE prea multe fisiere deschise ENOENT cale sa fiser negasit ENOEXEC format executabil incorect ENOMEM insuficienta memorie

#include <stdio.h> #include <process.h> int main() { FILE *fl; system("ping 127.0.0.1 > temp.txt"); fl = fopen("temp.txt", "rt" ); printf("\nFISIERUL: temp.txt\n"); if( fl ) { while( !feof( fl ) ) printf( "%c", fgetc( fl ) ); fclose(fl); } printf("\nEND: temp.txt\n"); return 0; } In acelasi mod, putem da comenzi DOS, de tipul: system("dir"); system("cd mydir"); system("format a:"); system("xcopy *.* c:\mydir");

5 MODURI VIDEO
MODUL TEXT

Fisierele au ca principala atributie intr.-un sistemde calcul de a stoca informatii (date, aplicatii). Un
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <dos.h> #include <process.h> #include <stdarg.h> #include "meniu.h" char *luni[]={"ianuarie", "februarie", "martie", "aprilie","mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie" }; // F U N C T I I la meniu //Aafiseaza meniul si returneaza noua pozitie selectata int AfisareMeniu( int yMeniu, char *meniu[], char *titlu ) { int i, n=0, l; char c; for(l=0; strlen(meniu[l]) > 0; l++ ); //stabileste fereastra activa pentru intregul meniu window(1, 1, strlen(meniu[0])+2, l+4);//stabileste fereastra relativa de afisare clrscr(); // sterge continutul fereastrei ative gotoxy(1, 1 ); cprintf(""); for(i=1; i < strlen(meniu[0])+1; i++ ) cprintf(""); cprintf("");

gotoxy( ( strlen(meniu[0])-strlen(titlu) ) / 2, 1 ); cprintf(titlu); gotoxy(1, 2 ); cprintf(""); for(i=1; i < strlen(meniu[0])+1; i++ ) cprintf(" "); cprintf(""); for(i=0, n=0; strlen(meniu[i]) > 0; i++ ) { gotoxy(1,i+3);

//Afiseaza timpul sistem void AfisareTimp(void) { struct time t; /*struct time { unsigned char ti_min; // minute unsigned char ti_hour; // ore unsigned char ti_hund; // sutimi de secunde unsigned char ti_sec; // seconde };*/ int x, y; struct date d; /*struct date { int da_year; // anul curent char da_day; // ziua din luna (1, 2, 3, ..., 31) char da_mon; // luna (1 = Ianuarie, ...) };*/

Functii 2009/2010 - Suceava in C. Numar variabili de parametri


CONCLUZIE In cazul functiilor cu numar variabil de parametri va trebui facuta o conventie de utilizare asupra numarului de parametri reali transmisi si asupra tipului fiecaruia dintre acestia. In cazul exemplului prezentat mai jos conventia consta in : numarul de parametri suplimentari este indicat prin valoarea primul parametru obligatoriu; tipul fiecarui parametru suplimentar este int.

POINTERI. Fundamente

Simplist privind, un pointer este o variabil ntreaga care stocheaz o adres de memorie, adresa ce poate indica o alt variabil sau chiar un alt pointer. Dac o variabil conine adresa unei alte variabile se spune c prima variabil pointeaza catre a doua. Un pointer poate fi, de asemenea, reprezentat ca o referinta catre o alta variabila. Pointerul este, n general, de mrimea unui intreg pe masina respectiva de calcul, dar acesta poate fi de tipuri diferite. Pointerul de un anumit tip nu pot fi convertit, n mod implicit, la un alt tip, dar poate fi convertit, n mod explicit, folosind de operatorul cast ( ). ntr-o astfel de conversie a pointerilor, ntotdeauna se presupune c acesta este convertit spre un obiect de tipul su. Daca in realitatea difera tipurile i dac este utilizat incorect, poate duce la dezastre pe maina de calcul. De asemenea, este important de remarcat faptul c toate operaiunile pe pointeri sunt efectuate prin intermediul a doi operatori noi: "*" (Star) i "& '(Ampercent). '&' Este un operator unar care returneaz adresa de memorie a unei variabile. "*" Se completeaz cu '&' i intoarce valoarea depozitata la o locaie de memorie, adresa stocata ntr-un pointer si nu numai. '*' Poate fi interpretat ca motto "la adresa" n timp ce '&' poate fi interpretat ca motto "adresa.
#include <stdio.h> int main( void ) { printf( "\n[START] main() " ); //declararea variabilelor din program

int *p, var = 1, test=2; printf( "\nContinut:\n\t- `p` `var`: %d", *p, var, test ); p = &var; printf( "\nAdresa:\n\t- `p` : `test`: %p", p, &p, &var, &test ); *p = -1; printf( "\nContinut:\n\t- `p` `var`: %d", *p, var, test ); test = *p; printf( "\nContinut:\n\t- `p` `var`: %d", *p, var, test ); printf( "\n[END] main() " ); return 0; }// END

: %d\n\t- `var`: %d\n\t-

%p [%p]\n\t- `var` : %p\n\t-

: %d\n\t- `var`: %d\n\t-

: %d\n\t- `var`: %d\n\t-

POINTERI. Variabile
Variabilele care pstreaz adresele altor variabile se numesc pointeri. Sintaxa declaraiei unui pointer de date este: <tip> *<identificator_pointer>; unde: identificator_pointer este numele unei variabile pointer tip este tipul variabilei a crei adres o va conine. EXEMPLE //c este pointer la o variabila de tip char. char *c; //pi,pj sunt pointeri la ntregi int *pi, *pj; //x1,x2 - contin adrese de variabile reale. float *x1, *x2; //variabila tab_p este un tablou de 10 pointeri int. int *tab_p[ 10 ]; //variabila a contine adresa unui pointer de variabile float. float **a;

POINTERI. Atribuire

Aceasta este un tip de expresie folosita pentru a atribui o valoare unui pointer, caz in care se utilizeaz operatorul '='. In acest caz, in stanga operatorului va fi prezent un pointer, iar in dreapta va fi o expresie ce va avea ca rezultat o adresa catre o variabila. Ca rezultat, att pointerul cat si expresia indica catre aceeai locaie de memorie, dup aceast expresie. Pointerii de tipuri similare pot fi utilizati n expresii de atribuire, dupa cum se arat mai jos, dar pentru pointerii de tipuri diferite va trebui sa se specifice prin operatorul cast conversia dorita.

POINTERI. Conversii
Conversia pointerilor este un instrument foarte puternic ns foarte periculos. nainte de a folosi conceptul de conversie a pointerilor trebuie s neleagem conceptul de pointer void. Pointerul void, din punct de vedere tehnic, este un indicator care orice. Pointerul void are proprietatea speciale, c aceasta poate fi convertit n orice alt tip de pointer fr nici un tip de conversie. Pointerul NULL nu are nevoie de un tip de conversie si poate fi utilizat atunci cand dorim sa specificamca acel pointer nu are o valoare valida. De asemenea, n funciile de alocare dinamica a memoriei, returneaz un pointer void care pot fi uor transformat n alte tipuri. Conversia de tip este o caracteristic puternic, dar trebuie utilizata cu prudenta.. In aceste cazuri putemobtine rezultate neateptate i nesigure, chiar daca programul a fost compilat cu succes.

Codul de mai jos arat o conversie de tip pentru un pointer.

POINTERI. Aritmetica
In afar de atribuire, pentru pointeri sunt permise operaii de comparare, adunare i scdere (inclusiv incrementare i decrementare). Valorile a doi pointeri pot fi comparate folosind operatorii relaionali, de exemplu: int *p1, *p2; if( p1 < p2 ) /* ... */ Se ntlnete deseori compararea unui pointer cu valoarea nul, pentru a verifica dac adreseaz un obiect: if( p1 == NULL ) /*...*/ sau if( !p1 ) /*...*/ Sunt admise operaii de adunare sau scdere ntre un pointer i un ntreg. Astfel pentru: tip *id_pointer; id_pointer + n id_pointer n operaiile corespund adunrii/scderii la adresa id_pointer a valorii n*sizeof(tip). Este permis i scderea a doi pointeri de variabile de acelai tip. Rezultatul este o valoare ntreag reprezentnd diferena de adrese divizat prin dimensiunea tipului: tip *p1, *p2; int i; i = p2-p1; //i=(adresa_p2-adresa_p1)/sizeof(tip) Rezultatul adunrii a doi pointeri nu are semnificaie practic.

POINTERI. Initializarea pointerilor


Initializarea pointerilor se poate face ca in exemplul de mai jos. variable_type *pointer_name = 0;

sau variable_type *pointer_name = NULL; iar in cazul sirurilor de caractere char *pointer_name = "string value here"; In cazul sirurilor: int sir[ 20 ]; int *pointer1 = sir; int *pointer2 = &sir[0];

POINTERI. Pointeri catre functii


Declararea unui parametru de tip pointer la functie se face astfel : int (*p_functie)( int , float ) ; acest pointer nu poate contine decat adresa unei functii ce are un prototip identic cu cel al pointerului: int functie( int a, float b ) { //corpul functiei } void main( void ) { p_functie = functie; } cu observatia ca numele functiei reprezinta adresa functiei. Apelul unei functii prin intremediul unui pointer la functie se face: p_functie( 23, 45.6 ) ;

POINTERI. Transferul parametrilor prin referinta


Pana acum am studiat transferul parametrilor unei funcii prin valoare i s-a indicat c mai exist o modalitate de transfer a parametrilor unei funcii, i anume prin referin. Astfel, pentru ca o funcie C s poat modifica valoarea unei variabile indicate ca parametru efectiv, trebuie declarat un parametru formal de tip pointer, iar la apelare trebuie s i se ofere explicit adresa variabilei. Declaratia unei functii de acest tip este urmatoarea:

void Inversare( int *a, int *b ); iar prototipul este : void Inversare( int *a, int *b ) { int t; t = *a; *a = *b; *b = t; } apelul fiind de forma: int x=2, y=3; Inversare( &x, &y ); Observatie : Un parametru de tip pointer este echivalent cu un parametru de tip sir pentru o functie.

You might also like