Sau Exclusiv : If Statement
Sau Exclusiv : If Statement
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); }
{ printf("mom?");
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>
switch(number) {
break; case 4: printf("you say number"); break; case 6: printf("Great number"); break; case 8: printf("not such a Great number"); 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>
} 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
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
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
\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 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
Do while loop - ------- > to ensure their codes runs at least one time. ---- a little bit uncommon
Loop Type while loop for loop do...while loop nested loops
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 while statement is as follows: while ( condition ) statement;
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
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.
1 16 16
0 8 0
0 4 4
1 2 0
0 1 0
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.
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))
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
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.)
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; }
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
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),
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.
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
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.
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 );
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);
cin.get();
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
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.
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
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.
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
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); } }
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
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
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
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
preprocesor
directive preprocesor definitii de tipuri prototipuri de functii -- un prototip declara tipul unei functii
( tipul valorii returnate ) si tipurile parametrilor transmisi functiei
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
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
wint_t wchar_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.
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
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
>> - 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 */
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.
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 )
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>;
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 ); }
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: " );
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
//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)
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.
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, ...) };*/
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
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.
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.
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];
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.