Sunteți pe pagina 1din 43

Aplicaii

1. Operaii cu caractere
2. Proprieti ale numerelor
3. Divizibilitate
4. Numere prime
5. Operaii pe bii
6. iruri de caractere
7. Operaii cu vectori
8. Operaii cu matrici
9. Operaii cu structuri
Aplicaii
Operaii cu caractere
// Se citeste de la tastatura o secventa formata din maxim
// 100 de litere mici, pana la intalnirea caracterului punct
// Daca exista in secventa citita litere alaturate egale, aceste
// litere vor fi eliminate
// Daca in urma eliminarii se obtin din nou litere alaturate
// egale, se elimina si acestea, eliminarile efectuandu-se
// pana cand in secventa nu exista litere alaturate egale.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define NMAX 100
int main() {
char s[NMAX], c;
int n, i, j, k, schimb=1;
n=0; // numarul de litere din secventa
Aplicaii
Operaii cu caractere
printf("Introduceti secventa de litere, terminata cu .\n");
do {
c=getchar();
if (c != '. && islower(c) && n<NMAX) s[n++]=c; }
while (c !='. && n<NMAX);
while (schimb) {
for (schimb=i=0; i<n-1; )
if (s[ i ] == s[i+1]) {
// incepe o secventa de litere egale
// determin sfarsitul acestei secvente
for (j=i+1; j<n && s[ j ]==s[ i ]; j++) ;
Aplicaii
Operaii cu caractere
// elimin secventa
for (k=j; k<n; k++) s[i+k-j]=s[k] ;
// actualizez numarul de elemente
n -= j i;
schimb=1; }
else i++; //trec mai departe
}
for(i=0; i<n; i++ ) printf("%c", s[i]);
system("pause");
return 0;
}
Aplicaii
Proprieti ale numerelor
// Se numesc numere "bine ordonate" acele numere
//care au cifrele in ordine strict crescatoare
#include <stdio.h>
#include <stdlib.h>
int main() {
int c1, c2, c3;
//Generare numere "bine ordonate crescator" cu trei cifre
printf("Numere bine ordonate crecator\n");
for (c1=1; c1<8; c1++)
for (c2=c1+1; c2<9; c2++)
for (c3=c2+1; c3<10; c3++)
printf("%d%d%d ", c1,c2,c3);
printf("\n");
Aplicaii
Proprieti ale numerelor
// Generare numere "bine ordonate descrescator"
// cu trei cifre

printf("Numere bine ordonate descrecator\n");


for (c1=9; c1>1; c1--)
for (c2=c1-1; c2>0; c2--)
for (c3=c2-1; c3>=0; c3--)
printf("%d%d%d ", c1,c2,c3);
printf("\n");
system("pause");
return 0;
}
Aplicaii
Divizibilitate
// Se citeste de la tastatura un numar natural nenul n,
// apoi se citesc succesiv n valori intregi
// Scrieti un program care sa verifice daca oricare
// numar dintre cele n numere citite are un numar impar
// de divizori primi

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

int main() {
unsigned n, x, d, nr, i, oricare=1;
scanf("%u", &n);
Aplicaii
Divizibilitate
for(i=1; i<=n && oricare; i++) {
scanf("%u", &x);
nr=0; /* nr. de divizori primi ai lui x */
d=2;
while (x>1) {
if (x%d==0) { /* d este divizor */
nr++;
/* se elimina d din x, prin impartiri repetate */
while (x % d == 0) x /= d; }
d++; } /* se cauta alt divizor */
if (nr % 2 == 0) oricare=0; }
if (oricare) printf("DA\n");
else printf ("NU\n");
system("pause");
return 0;
}
Aplicaii
Numere prime
// CIURUL LUI ERATOSTENE
// Fie n un numar natural (n<=10000).
// Sa se genereze toate numerele prime mai mici decat n.
#include<stdio.h>
#include <stdlib.h>
#define NMAX 10000

// Ciurul: vector cu 10000 de componente care pot fi 0 sau 1.


// Punem in ciur toate numerele mai mici decat n.
// Cernem aceste numere pana raman in ciur numai nr. prime
// Eliminam din ciur multiplii de 2, 3,... pana la radical din n

int main() {
int ciur[NMAX], n, i, j;
printf("n(<10000) ="); scanf("%d", &n);
Aplicaii
Numere prime

// initial toate numerele sunt in ciur


for(i=2; i<n; i++) ciur[ i ]=1;
for(i=2; i*i<=n; i++)
if (ciur[ i ])
// elimin toti multiplii lui i < n
for(j=2; j*i<n; j++)
ciur[ i*j ]=0;
printf("Numerele prime mai mici decat %d sunt:\n", n);
for(i=2; i<n; i++)
if (ciur[ i ]) printf("%d ",i);
system(pause);
return 0;
}
Aplicaii
Operaii pe bii
// Pentru o valoare intreaga citita de la tastatura sa se
// tipareasca valoarea corespunzatoare in binar
#include <stdlib.h>
#include <stdio.h>
int main() {
int x, i, dim=sizeof(i)*8, masca=1;
printf("Introduceti numarul\n");
scanf("%d", &x);
printf("reprezentarea in binar este:\n");
for(i=dim-1; i>=0; i--)
putchar(x & masca << i ? '1' : '0');
// << are precedenta mai mare decat &
printf("\n");
system("pause");
return 0;
}
Aplicaii
Operaii pe bii
// Fie x un numar natural.
// Utilizand operatorii pe biti,
// sa se scrie expresiile care efectuaza urmatoarele:
// a. inmulteste valoarea variabilei x cu 2^n
x = x << n
// b. imparte valoarea x cu 2^n
x = x >> n
// c. furnizeaza valoarea 1 daca si numai daca x este impar
x&1
// d. furnizeaza valoarea 0 daca si numai bitul n din x este 0
x & (1 << n)
// d. anuleaza bitul n din x
x = x & ~(1 << n)
// e. seteaza bitul n din x
x = x | (1 << n)
// f. schimba bitul n din x
x = x ^ (1 << n)
Aplicaii
iruri de caractere
Cteva funcii pentru lucrul cu iruri de caractere:
Fiierul antet <string.h>
char *strcpy(s, ct) copiaz irul ct n irul s, inclusiv
caracterul \0; returneaz s.
char *strncpy(s, ct, n) copiaz cel mult n caractere din irul
ct n irul s, inclusiv caracterul \0; returneaz s.
Completeaz cu caractere nule \0 dac ct are mai
puin de n caractere.
char *strcat(s, ct) concateneaz irul ct la sfritul
s; returneaz s.
char *strncat(s, ct, n) concateneaz cel mult n caractere din
ct la sfritul s; termin irul s cu \0 ; returneaz s.
Aplicaii
iruri de caractere
int strcmp(cs,ct) compar irul cs cu irul ct; returneaz o
valoare <0 dac cs<ct, 0 dac cs==ct sau >0
dac cs>ct.
int strcncmp(cs,ct,n) compar cel mult n caractere din
irul cs cu irul ct; returneaz o valoare <0 dac
cs<ct, 0 dac cs==ct sau >0 dac cs>ct.
char *strchr(cs,c) returneaz un pointer spre prima apariie a
lui c n cs, sau NULL dac acesta nu apare.
char *strrchr(cs,c)returneaz un pointer spre ultima
apariie a lui c n cs, sau NULL dac acesta nu
apare.
size_t strlen(cs) returneaz lungimea lui cs.
Aplicaii
iruri de caractere
Numrarea caracterele dintr-un ir pn la caracterul
NULL (determinarea lungimii unui ir de caractere).

size_t strlen(const char *sir)


{
int i = 0;
while (sir[ i ])
i++;
return (i);
}
Aplicaii
iruri de caractere

 Copierea irului surs n irul destinaie.

char *strcpy(char *destinatie, const char *sursa)


{
char *initial = destinatie;
while (*destinatie++ = *sursa++)
;
return (initial);
}
Aplicaii
iruri de caractere
 Adugarea coninutului unui ir la alt ir (concatenarea
irurilor).
char *strcat(char *destinatie, const char *sursa)
{
char *initial = destinatie;
while (*destinatie)
destinatie++; /* cauta sfarsitul sirului */
while (*destinatie++ = *sursa++)
;
return (initial);
}
Aplicaii
iruri de caractere
 Adugarea a n caractere la un ir.
char *strncat(char *destinatie, const char *sursa, int n)
{
char *initial = destinatie;
int i = 0;
while (*destinatie)
destinatie++;
while ((i++ < n) && (*destinatie++ = *sursa++))
;
if (i > n) *destinatie = NULL;
return (initial);
}
Aplicaii
iruri de caractere
 Numrarea apariiilor unui caracter ntr-un ir.

int charcnt(const char *sir, int litera)


{
int nr = 0;
while (*sir++)
if (*sir == litera)
nr++;
return (nr);
}
Aplicaii
iruri de caractere
 Inversarea coninutului unui ir.
char *strrev (char *sir) {
char *initial = sir;
char *urmator = sir;
char temp;
while (*sir) sir++;
while (urmator < sir) {
temp = *(--sir);
*sir = *urmator;
*urmator++ = temp; }
return (initial);
}
Aplicaii
iruri de caractere
 Compararea a dou iruri de caractere.
int strcmp(const char *s1, const char *s2)
{
while ((*s1 == *s2) && (*s1))
{
s1++;
s2++;
}
if ((*s1 == *s2) && (! *s1)) /* aceleasi siruri */
return (0);
Aplicaii
iruri de caractere
else if ((*s1) && (! *s2)) /* aceleasi, dar s1 > s2 */
return (1);
else if ((*s2) && (! *s1)) /* aceleasi, dar s2 > s1 */
return (-1);
else
return ((*s1 > *s2) ? 1 : -1); /* diferite */
}
Aplicaii
iruri de caractere
 Cutarea unui subir ntr-un ir de caractere.
char *strstr(const char *s1, const char *s2)
{
int i, j, k;
for (i = 0; s1[i]; i++)
for (j = i, k = 0; s1[j] == s2[k]; j++, k++)
if (! s2[k+1])
return (s1 + i);
return (NULL);
}
Aplicaii
iruri de caractere
 Numrul de apariii ale unui subir.
int strstr_nr(const char *sir, const char *subsir)
{
int i, j, k, nr = 0;
for (i = 0; sir[ i ]; i++)
for (j = i, k = 0; sir [ j ] == subsir [ k ]; j++, k++)
if (! subsir[k+1])
nr++;
return (nr);
}
Aplicaii
iruri de caractere

 tergerea unui subir dintr-un ir de caractere.

char *strstr_rem(const char *sir, const char *subsir)


{
int i, j, k, loc = -1;
for (i = 0; sir[ i ] && (loc == -1); i++)
for (j = i, k = 0; sir[ j ] == subsir[ k ]; j++, k++)
if (! subsir[ k + 1 ])
loc = i;
Aplicaii
iruri de caractere
if (loc != -1) /* subsirul a fost gasit */
{
for (k = 0; subsir [k]; k++)
;
for (j = loc, i = loc + k; sir[ i ]; j++, i++)
sir[ j ] = sir[ i ];
sir[ i ] = NULL;
}
return (sir);
}
Aplicaii
iruri de caractere
 nlocuirea unui subir cu altul.
#include <string.h>
char *strstr_rep(char *sursa, char *vechi, char *nou)
{
char *initial = sursa;
char temp[256];
int lung_veche = strlen(vechi);
int i, j, k, loc = -1;
for (i = 0; sursa[ i ] && (loc == -1); ++i)
for (j = i, k = 0; sursa[ j ] == vechi[ k ]; j++, k++)
if (! vechi[k+1])
loc = i;
Aplicaii
iruri de caractere
if (loc != -1) {
for (j = 0; j < loc; j++)
temp[ j ] = sursa[ j ];
for (i = 0; nou[ i ]; i++, j++)
temp[ j ] = nou[ i ];
for (k = loc + lung_veche; sursa[ k ]; k++, j++)
temp[ j ] = sursa[ k ];
temp[ j ] = NULL;
for(i = 0; sursa[ i ] = temp[ i ]; i++) ; }
return (initial);
}
Aplicaii
iruri de caractere
// Se citeste de la tastatura un text format din max.1000 car.
// Textul, format din mai multe linii, se termina cu o linie vida
// Sa se afiseze cuvintele in ordinea crescatoare a lungimiilor
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
char sir[1000]="", *p, separ[ ]=" ,.;:'?!\n\t", cuv[100][40];
void citxt() {
char linie[100];
printf("Introduceti textul\n");
do {
gets(linie);
strcat(sir, linie); strcat(sir, "\n");
} while (strcmp(linie,""));
}
Aplicaii
iruri de caractere
int main() {
char aux[40];
int n=0, i, j;
citxt();
p=strtok( sir, separ);
if(p)
strcpy(cuv [n++] ,p);
while (p) {
p=strtok( NULL , separ);
if (p)
strcpy(cuv [n++], p);
}
printf("Numarul de cuvinte este %d\n", n);
Aplicaii
iruri de caractere
for (i=0; i<n; i++)
printf("%s\n", cuv[ i ]);
printf("Afisare ordonata dupa lungimea cuvintelor\n");
for (i=0; i<n-1; i++)
for (j=n-1; j>i; j--)
if (strlen(cuv[ i ]) > strlen(cuv[ j ]) ) {
strcpy (aux, cuv [ i ]);
strcpy (cuv [ i ], cuv [ j ]);
strcpy (cuv [ j ], aux);
}
for( j=0; j<n; j++)
printf("%s %d\n", cuv [ j ], strlen(cuv [ j ]));
system(pause);
return 0;
}
Aplicaii
Operaii cu vectori
// Fie a un vector cu n (n<=50) componente de tip int.
// a. Verificati daca exista in vectorul a un palindrom
// b. Verificati daca toate elementele vectorului sunt nr. prime
#include<stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int a[50], x, rx, n, i, exista, ok, d, rad;
printf("n="); scanf("%d", &n);
printf("Introduceti elementele vectorului\n");
for(i=0; i<n; i++)
scanf("%d", &a[i]);
Aplicaii
Operaii cu vectori

for (exista=i=0; !exista && i<n; i++) {


// verific daca a[ i ] este palindrom
x=a[i];
rx=0; // inversul lui x in oglinda
while (x) {
rx=rx*10 + x%10;
x /= 10; }
if (rx == a[ i ]) exista=1;
}
if (exista)
printf("exista un palindrom in vector \n");
else
printf("nu exista un palindrom in vector \n");
Aplicaii
Operaii cu vectori
for (ok=1, i=0; ok && i<n; i++) {
// verific daca a[ i ] este prim
for (d=2, rad=sqrt(a[ i ]); a[ i ]%d && d<=rad; d++);
if (a[ i ] % d == 0) ok=0; // a[ i ] nu este prim
}
if (ok)
printf("Toate elementele vectorului sunt prime\n");
else
printf("Nu toate elementele vectorului sunt prime\n");
system("pause");
return 0;
}
Aplicaii
Operaii cu matrici
// Fie a o matrice de intregi cu n linii si m coloane(n, m<=100)
// Numarati cate elemente din matrice au ca vecini numai
// numere pare (doua elemente sunt vecine daca sunt
// adiacente pe verticala sau orizontala
#include<stdio.h>
#include <stdlib.h>
#define NVecini 4
#define DMAX 102
int a[DMAX][DMAX], n, m;
int dl[ NVecini ]={-1, 0, 1, 0};
int dc[ NVecini ]={0, 1, 0, -1};
int main()
{ int i, j, k, nr, total=0;
printf("Introduceti nr de linii si coloane\n");
scanf("%d%d", &n, &m);
Aplicaii
Operaii cu matrici
printf("Introduceti elementele matricii\n");
for (i=1; i<=n; i++)
for (j=1; j<=m; j++) {
printf("a[%d,%d]=", i, j);
scanf("%d", &a[ i ][ j ]); }
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{ // parcurg vecinii si-i numar pe cei pari
for (nr=0, k=0; k<NVecini; k++)
if (a[i+dl[k]][j+dc[k]] % 2 == 0) nr++;
// daca toti vecinii sunt pari, numar acest element
if (nr == NVecini) total++;
}
printf("Numarul de elemente cu vecini pari:%d\n", total);
system("pause");
return 0;
}
Aplicaii
Operaii cu structuri
// Se citesc de la tastatura numele si cele 4 note obtinute de
// studenti in sesiune
// Sa se calculeze media fiecarui student promovat
// Sa se afiseze, in ordine alfabetica, toti studentii.
// Sa se afiseze studentii nepromovati, tot in ordine alfabetica
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 30
struct student{
char *nume;
int note[4];
float media;
} s[NMAX];
int n;
Aplicaii
Operaii cu structuri
void citire() {
int i, j, cond;
char vnume[30];
printf("Numarul de studenti:"); scanf("%d",&n);
printf("Introduceti datele celor %d studenti\n",n);
for (i=0; i<n; i++) {
fflush(stdin); // goleste bufferul de intrare
printf("\nStudentul %d\n",i+1);
printf("Numele:"); gets(vnume);
s[i].nume=(char *)malloc(strlen(vnume)+1);
strcpy(s[i].nume, vnume);
Aplicaii
Operaii cu structuri
printf("Notele:");
for (j=0; j<4; j++)
scanf("%d",&s[ i ].note[ j ]);
s[ i ].media=0.0;
cond=1;
for (j=0; j<4; j++)
if(s[ i ].note[ j ]<5) cond=0;
if (cond)
for (j=0; j<4; j++)
s[ i ].media+=s[ i ].note[ j ];
s[ i ].media /=4.0;
}
}
Aplicaii
Operaii cu structuri

void afisare()
{
int i,j;
for (i=0; i<n; i++){
printf("%-30s", s[ i ].nume);
for (j=0; j<4; j++)
printf(" %2d",s[ i ].note[ j ]);
printf("%8.2f\n",s[ i ].media);
}
}
Aplicaii
Operaii cu structuri
void sortare_alf()
{ int i,j, ok;
struct student aux;
do {
for(i=0, ok=1; i<n-1; i++)
if (strcmp(s[ i ].nume, s[i+1].nume)>0) {
aux=s[ i ];
s[ i ]=s[i+1];
s[i+1]=aux;
ok=0;
}
} while (!ok);
}
Aplicaii
Operaii cu structuri

void afis_nepromovati()
{
int i, j;
for (i=0; i<n; i++){
if(s[ i ].media<5.0) {
printf("%-30s", s[ i ].nume);
for (j=0; j<4; j++)
printf(" %2d",s[ i ].note[ j ]);
printf("%8.2f\n",s[ i ].media);
}
}
}
Aplicaii
Operaii cu structuri
int main() {
citire();
printf("Datele studentilor\n");
afisare();
printf("\nStudentii in ordine alfabetica\n");
sortare_alf();
afisare();
printf("\nStudentii nepromovati\n");
afis_nepromovati();
system("pause");
return 0;
}

S-ar putea să vă placă și