Probleme Atp
Probleme Atp
Probleme Atp
#include<stdio.h>
#include<math.h>
#pragma warning (disable:4996)
void init(int n, int st[])
{
int i;
for (i = 0; i < n; i++)
st[i] = 0;
}
//COMBINARI
#include<stdio.h>
#include<math.h>
#pragma warning (disable:4996)
void init(int n, int st[])
{
int i;
for (i = 0; i < n; i++)
st[i] = 0;
}
void main()
{
float v[10][2];
int n, i, b[10], o[10], k;
citire(v, &n);
for (i = 0; i < n; i++)
b[i] = i + 1;
afisare(v, n, b);
sortare(v, n, b);
afisare(v, n, b);
printf("ordinea spectacolelor este ");
greedy(v, n, o, &k);
for (i = 0; i < k; i++)
printf("%d ", b[o[i]]);
}
//PROBLEMA DAMEI
#include<stdio.h>
#include<math.h>
#pragma warning (disable:4996)
void init(int n, int st[])
{
int i;
for (i = 0; i < n; i++)
st[i] = 0;
}
if (f != NULL)
{
fscanf(f, "%d", &*n);
fscanf(f, "%d", &m);
for (i = 0; i < *n; i++)
for (j = 0; j < *n; j++)
a[i][j] = 0;
for (i = 0; i < m; i++)
{
fscanf(f, "%d", &x);
fscanf(f, "%d", &y);
a[x - 1][y - 1] = a[y - 1][x - 1] = 1;
}
fclose(f);
}
else er = 0;
return er;
}
void afisare(int a[20][20], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}
void main()
{
int a[20][20], n, m[20][20], i, j;
citire(a, &n);
afisare(a, n);
Roy_Warshall(a, n, m);
printf("\n");
afisare(m, n);
int ok = 1;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (m[i][j] == 0)
ok = 0;
if (ok == 0)
printf("Graful nu este conex");
else
printf("Graful este conex");
int ncc = 0, martor[100], p, v[100];
for (i = 0; i < n; i++) {
martor[i] = 0; v[i] = 0;
}
i = 0;
ok = 0;
while (ok == 0)
{
int nrz = 0;
for (j = 0; j < n; j++)
{
if (m[i][j] == 1) martor[j] = 1;
else nrz = nrz + 1;
}
if (nrz == n) martor[i] = 1;
ok = 1;
for (int l = 0; l < n; l++)
if (martor[l] == 0)
{
i = l;
l = n;
ok = 0;
}
ncc = ncc + 1;
}
}
//program pentru sortare prin interschimbare
#include<stdio.h>
#include<malloc.h>
#pragma warning(disable:4996)
(*v)[i] = x;
i++;
fscanf(f, "%d", &x);
}
fclose(f);
}
else er = 0;
return er;
}
if (f != NULL)
{
fscanf(f, "%d", &*n);
fscanf(f, "%d", &m);
for (i = 0; i < *n; i++)
for (j = 0; j < *n; j++)
a[i][j] = 0;
for (i = 0; i < m; i++)
{
fscanf(f, "%d", &x);
fscanf(f, "%d", &y);
a[x - 1][y - 1] = a[y - 1][x - 1] = 1;
}
fclose(f);
}
else er = 0;
return er;
}
void afisare(int a[20][20], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}
void BF(int a[20][20], int n, int vo, int parinte[20], int m[20], int
coada[20], int* r)
{
int i, k, p, c[20], u;
c[0] = vo - 1;
parinte[vo - 1] = -1;
p = 0; u = 0; *r = 0;
m[vo - 1] = 1;
while (p <= u)
{
i = c[p];
coada[*r] = i;
(*r)++;
for (k = 0; k < n; k++)
if ((a[i][k] == 1) && (m[k] == 0))
{
u = u + 1;
c[u] = k;
parinte[k] = i;
m[k] = 1;
}
p = p + 1;
}
}
void main()
{
int a[20][20], n, vo, parinte[20], m[20], coada[20], r, i;
citire(a, &n);
afisare(a, n);
printf("vo=");
scanf("%d", &vo);
for (i = 0; i < n; i++)
m[i] = 0;
for (i = 0; i < n; i++)
coada[i] = -1;
BF(a, n, vo, parinte, m, coada, &r);
printf("\nvarfurile vizitate:");
for (i = 0; i < r; i++)
printf("%d ", coada[i] + 1);
for (i = 0; i < n; i++)
printf("%d", coada[i] + 1);
for (i = 0; i < n; i++)
if (i != vo - 1)
printf("\nparintele lui %d este %d", i + 1, parinte[i] + 1);
if (r == n)
{
printf("\ndrumul de la %d la %d\n", vo, n - 1);
printf("%d ", n - 1);
int k = n - 2;
while (k != vo - 1)
{
printf(" %d ", parinte[k] + 1);
k = parinte[k];
}
}
//parcurgere in latime
#include<stdio.h>
#include <malloc.h>
#pragma warning(disable:4996)
int citire(int a[20][20], int* n)
{
int x, y, m, j;
FILE* f;
int er = 1, i;
char nume[20];
printf("numele fisierului este:");
gets_s(nume);
f = fopen(nume, "r");
if (f != NULL)
{
fscanf(f, "%d", &*n);
fscanf(f, "%d", &m);
for (i = 0; i < *n; i++)
for (j = 0; j < *n; j++)
a[i][j] = 0;
for (i = 0; i < m; i++)
{
fscanf(f, "%d", &x);
fscanf(f, "%d", &y);
a[x - 1][y - 1] = a[y - 1][x - 1] = 1;
}
fclose(f);
}
else er = 0;
return er;
}
void afisare(int a[20][20], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}
void BF(int a[20][20], int n, int vo, int parinte[20], int m[20], int
coada[20], int* r)
{
int i, k, p, c[20], u;
c[0] = vo - 1;
parinte[vo - 1] = -1;
p = 0; u = 0; *r = 0;
m[vo - 1] = 1;
while (p <= u)
{
i = c[p];
coada[*r] = i;
(*r)++;
for (k = 0; k < n; k++)
if ((a[i][k] == 1) && (m[k] == 0))
{
u = u + 1;
c[u] = k;
parinte[k] = i;
m[k] = 1;
}
p = p + 1;
}
}
void main()
{
int a[20][20], n, vo, parinte[20], m[20], coada[20], r, i;
citire(a, &n);
afisare(a, n);
printf("vo= ");
scanf("%d", &vo);
for (i = 0; i < n; i++) m[i] = 0;
for (i = 0; i < n; i++) coada[i] = -1;
BF(a, n, vo, parinte, m, coada, &r);
if (r == n)
printf("graful este conex");
else
printf("graful nu este conex");
}
//CMMDC
#pragma warning(disable: 4996)
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
void citire(float*** a, int* n) {
int i, j;
printf("Introduceti n = "); scanf("%d", &(*n));
(*a) = (float**)malloc((*n) * sizeof(float*));
for (i = 0; i < *n; i++) {
*((*a) + i) = (float*)malloc((*n) * sizeof(float));
}
for (i = 0; i < *n; i++) {
for (j = 0; j < *n; j++) {
printf("[%d][%d]=", i, j); scanf("%f", &((*a)[i][j]));
}
}
}
void afisare(float** a, int n) {
int i, j;
for (i = 0; i < n; i++) {
printf("\n");
for (j = 0; j < n; j++) {
printf("%5.2f ", *(*(a + i) + j));
}
}
}
unsigned int cmmdc(unsigned int a, unsigned int b)
{
if (a == b) return a;
else
if (a > b) return cmmdc(a - b, b);
else return cmmdc(a, b - a);
}
void main()
{
unsigned int x, y;
printf("Introduceti x: ");
scanf("%u", &x);
printf("Introduceti y: ");
scanf("%u", &y);
getch();
}
BACKTRACKING
#include <stdio.h>
#include <math.h>
int nr, v[100];
int validare(int k)
{
int i;
for (i = 1; i <= k - 1; i++)
if (v[i] == v[k] || abs(v[k] - v[i]) == (k - i))
return 0;
return 1;
}
int solutie(int k)
{
if (k == nr)
return 1;
return 0;
}
void afisare()
{
int i, j;
for (i = 1; i <= nr; i++) {
for (j = 1; j <= nr; j++)
if (v[i] == j)
printf("D ");
else
printf("- ");
printf("\n");
}
printf("\n --------------------------------------------\n");
}
void Backtracking(int k)
{
int i;
for (i = 1; i <= nr; i++) {
v[k] = i;
if (validare(k) == 1)
if (solutie(k) == 1)
afisare();
else
Backtracking(k + 1);
}
}
void main()
{
printf("Introduceti dimensiunea tablei de sah: ");
scanf_s("%d", &nr);
Backtracking(1);
}
2. Generarea tuturor permutarilor
#include <stdio.h>
int n, v[100];
int valid(int k) //verificăm conditiile de continuare
{
int i;
for (i = 1; i <= k - 1; i++) //comparăm fiecare element din vectorul v cu ultimul
element selectat
if (v[i] == v[k]) //deoarece într-o permutare elementele nu au voie să se
repete,
return 0; //returnăm 0 în cazul în care elementul curent a mai fost
selectat anterior
return 1; //returnăm 1 în cazul în care elementul nu mai apare în vector
}
int solutie(int k) //verificăm dacă am obţinut o soluţie
{
if (k == n) //am obţinut o permutare dacă am reuşit să depunem în vector n
elemente
return 1;
return 0;
}
void afisare(int k) //afisarea conţinutului vectorului v
{
int i;
for (i = 1; i <= k; i++)
printf("%d ", v[i]);
printf("\n");
}
void BK(int k)
{
int i; //i-elementul selectat din multimea Sk, trebuie sa fie variabilă locală,
pentru a se memora pe stivă
for (i = 1; i <= n; i++) //parcurgem elementele mulţimii Sk
{
v[k] = i; //selectăm un element din mulţimea Sk
if (valid(k)) //verificăm dacă eelementul ales îndeplineşte condiiile de
continuare
{
if (solutie(k)) //verificăm dacă am obţinut o soluţie
afisare(k); //se afişează soluţia obţinută
else
BK(k + 1); //reapelăm funcţia pentru poziţia k+1 din vectorul
v
}
}
}
void main()
{
printf("Introduceti n: ");
scanf_s("%d", &n);
//apelăm funcţia BK pentru completarea poziţiei 1 in vectorul v
BK(1);
}
3. Generarea tuturor aranjamentelor
#include <stdio.h>
int n, v[100], p;
int valid(int k) //verificăm conditiile de continuare
{
int i;
for (i = 1; i <= k - 1; i++) //comparăm fiecare element din vectorul v cu ultimul
element selectat
if (v[i] == v[k]) //deoarece într-o permutare elementele nu au voie să se
repete,
return 0; //returnăm 0 în cazul în care elementul curent a mai fost
selectat anterior
return 1; //returnăm 1 în cazul în care elementul nu mai apare în vector
}
int solutie(int k) //verificăm dacă am obţinut o soluţie
{
if (k == p) //am obţinut o permutare dacă am reuşit să depunem în vector p
elemente
return 1;
return 0;
}
void afisare(int k) //afisarea conţinutului vectorului v
{
int i;
for (i = 1; i <= k; i++)
printf("%d ", v[i]);
printf("\n");
}
void BK(int k)
{
int i; //i-elementul selectat din multimea Sk, trebuie sa fie variabilă locală,
pentru a se memora pe stivă
for (i = 1; i <= n; i++) //parcurgem elementele mulţimii Sk
{
v[k] = i; //selectăm un element din mulţimea Sk
if (valid(k)) //verificăm dacă eelementul ales îndeplineşte condiiile de
continuare
{
if (solutie(k)) //verificăm dacă am obţinut o soluţie
afisare(k); //se afişează soluţia obţinută
else
BK(k + 1); //reapelăm funcţia pentru poziţia k+1 din vectorul
v
}
}
}
void main()
{
printf("Introduceti n: ");
scanf_s("%d", &n);
printf("Introduceti p: ");
scanf_s("%d", &p);
//apelăm funcţia BK pentru completarea poziţiei 1 in vectorul v
BK(1);
}
4. Generarea tuturor combinarilor
#include <stdio.h>
int n, v[100], p;
int solutie(int k)
{
if (k == p) return 1;
return 0;
}
void afisare(int k)
{
int i;
for (i = 1; i <= k; i++)
printf("%d ", v[i]);
printf("\n");
}
void BK(int k)
{
int i;
for (i = v[k - 1] + 1; i <= n; i++) //la pasul k selectăm din mulţime un element
mai mare decât elementul
{
v[k] = i; //de pe poziţia k-1
if (solutie(k)) //nu este necesar să verificam condiţiile de continuare,
ele sunt respectate
afisare(k); //datorită modului în care am selectat elementele.
else
BK(k + 1);
}
}
void main()
{
printf("Introduceti n: ");
scanf_s("%d", &n);
printf("Introduceti p: ");
scanf_s("%d", &p);
//apelăm funcţia BK pentru completarea poziţiei 1 in vectorul v
BK(1);
}
void init()
{
st[k] = 0;
}
int succesor()
{
if (st[k] < 4)
{
st[k]++;
return 1;
}
else return 0;
}
int valid()
{
for (int i = 1; i < k; i++)
if (st[i] == st[k] && a[i][k] == 1) return 0;
return 1;
}
int sol()
{
return (k == n);
}
void tipar()
{
for (int i = 1; i <= n; i++)
printf("Tara numarul %d ce are culoarea %d\n", i, st[i]);
printf("\n\n");
}
void bkt()
{
int as; k = 1;
init();
while (k > 0)
{
do {} while ((as = succesor()) && !valid());
if (as)
if (sol()) tipar();
else { k++; init(); }
else k--;
}
}
void main()
{
printf("Dati numarul de tari:");
scanf("%d", &n);
printf("Dati matricea:\n");
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]);
bkt();
_getch();
}
#include <stdio.h>
#define MAX 20
int n = 0, x, v[MAX], w[MAX], z[MAX], S, Suma, sol;
//v-vectorul soluţie,w-valoarea monedelor,z-nr.maxim de monede de un anumit tip
int valid(int k)
{
int i;
Suma = 0;
for (i = 1; i <= k; i++)
Suma = Suma + v[i] * w[i];
if ((Suma <= S) && (k <= n))
return 1;
return 0;
}
int solutie()
{
if (Suma == S)
return 1;
return 0;
}
void afisare(int k)
{
int i;
sol++;
printf("Solutia : %d \n", sol);
for (i = 1; i <= k; i++)
if (v[i])
printf("%d monede de valoarea %d \n", v[i], w[i]);
printf("\n");
}
void BK(int k)
{
int i;
for (i = 0; i <= z[k]; i++)
{
v[k] = i;
if (valid(k) == 1)
{
if (solutie() == 1)
afisare(k);
else
BK(k + 1);
}
}
}
void citire()
{
int i;
FILE* f;
fopen_s(&f, "monede.txt", "r");
if (f == NULL)
printf("Fisierul nu exista");
else {
//se citesc suma S şi numărul de monede
fscanf_s(f, "%d", &S);
fscanf_s(f, "%d", &n);
//se citesc valorile monedelor
for (i = 1; i <= n; i++)
{
fscanf_s(f, "%d", &w[i]);
//z-memoreză numărul maxim de monede de un anumit tip, penru a plati
suma S
z[i] = S / w[i];
}
}
}
void main()
{
citire();
BK(1);
}
#define EAST 0
#define WEST 1
#define NR_CANNIBALS 3
#define NR_MISSIONARIES 3
#define BOAT_CAPACITY 2
void search(char path[MAX], State currentState, int boatSide, State allStates[MAX], int
n) {
if (solution(currentState)) {
printf("SOLUTION: %s\n", path);
return;
}
if (failure(currentState, allStates, n)) {
return;
}
// add state
allStates[n++] = currentState;
int direction = 1 - boatSide;
int main() {
State allStates[MAX];
State init;
init.m_left = 3; init.m_right = 0;
init.c_left = 3; init.c_right = 0;
init.boat_pos = WEST;
return 0;
}
9) Problema turelor
/* Backtracking - problema turelor */
#include <stdio.h>
int validare(int k) {
int i;
for (i = 1; i <= k - 1; i++)
if (v[i] == v[k])
return 0;
return 1;
}
int solutie(int k) {
if (k == nr)
return 1;
return 0;
}
void afisare() {
int i, j;
for (i = 1; i <= nr; i++) {
for (j = 1; j <= nr; j++)
if (v[i] == j)
printf("T ");
else
printf("- ");
printf("\n");
}
printf("\n --------------------------------------------\n");
}
void Backtracking(int k) {
int i;
for (i = 1; i <= nr; i++) {
v[k] = i;
if (validare(k) == 1)
if (solutie(k) == 1)
afisare();
else
Backtracking(k + 1);
}
}
void main()
{
printf("Introduceti dimensiunea tablei de sah: ");
scanf_s("%d", &nr);
Backtracking(1);
void Afisare()
{
int i;
printf("%c {", sp);
for (i = 1; i <= n; i++)
if (x[i] == 1) printf("%d ", i);
printf(" }\n");//cout<<char(8)<<"}"<<endl;
nrsol++;
//if (nrsol%22==0) _getch();//cin.get();
}
void BackRec(int k)
{
int i;
for (i = 0; i <= 1; i++)
{
x[k] = i;
if (k == n) Afisare();
else BackRec(k + 1);
}
}
int main()
{
printf("\n\nSubmultimile multimii {1,2,3.....,n}\n ");
//cout<<endl<<endl<<sp<<"Submultimile multimii {1,2,3.....,n}"<<endl;
printf(" Dati valoarea unui n:");
scanf("%d", &n); //cout<<endl<<sp<<" Dati valoarea lui n: "; cin>>n;
printf("\n"); //cout<<endl;
BackRec(1);
printf("Nr. solutii: %d\n", nrsol); //cout<<endl<<sp<<"Numar solutii: "<<nrsol;
_getch();
return 0;
}
GRAFURI
1. Parcurgerea in latime-BF
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include<malloc.h>
void main()
{
int n, v0, ** a, m, i, j, vf1, vf2;
printf("Introduceti numarul de varfuri:");
scanf("%d", &n);
a = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++)
a[i] = (int*)malloc(n * sizeof(int));
for (i = 0; i < n; i++)
for (j = 0; j <= i; j++)
a[j][i] = a[i][j] = 0;
printf("Introduceti numarul de muchii:");
scanf("%d", &m);
for (i = 0; i < m; i++)
{
printf("Introduceti varf initial pentru muchie:");
scanf("%d", &vf1);
printf("Introduceti varf final pentru muchie:");
scanf("%d", &vf2);
a[vf1 - 1][vf2 - 1] = a[vf2 - 1][vf1 - 1] = 1;
}
printf("\Introduceti varful initial pentru parcurgerea BF ");
scanf("%d", &v0);
printf("\nOrdinea de vizitare a virfurilor grafului este:");
parcurgere_in_latime(v0 - 1, a, n);
//se va elibera zona de memorie alocata pentru matricea a
for (i = 0; i < n; i++)
free(a[i]);
free(a);
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include<malloc.h>
int inserare_nod_in_stiva(int* stiva, int n, int vf)
{
int i;
for (i = n - 1; i >= 0; i--)
stiva[i + 1] = stiva[i];
stiva[0] = vf;
n++;
return n;
}
int stergere_nod_din_stiva(int* stiva, int n)
{
int i;
for (i = 0; i < n - 1; i++)
stiva[i] = stiva[i + 1];
n--;
return n;
}
int citeste_stiva(int* stiva, int n)
{
return stiva[0];
}
void main()
{
int n, v0, ** a, m, i, j, vf1, vf2;;
printf("Introduceti numarul de varfuri:");
scanf("%d", &n);
a = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++)
a[i] = (int*)malloc(n * sizeof(int));
for (i = 0; i < n; i++)
for (j = 0; j <= i; j++)
a[j][i] = a[i][j] = 0;
printf("\Introduceti numarul de muchii:");
scanf("%d", &m);
for (i = 0; i < m; i++)
{
printf("Introduceti nod initial pentru muchie");
scanf("%d", &vf1);
printf("Introduceti nod final pentru muchie:");
scanf("%d", &vf2);
a[vf1 - 1][vf2 - 1] = a[vf2 - 1][vf1 - 1] = 1;
}
printf("\nIntroduceti nodul initial pentru parcurgerea DF ");
scanf("%i", &v0);
printf("\nOrdinea de vizitare a varfurilor grafului este:");
parcurgere_in_adancime(v0 - 1, a, n);
for (i = 0; i < n; i++) free(a[i]);
free(a);
}
//graf ponderat
#include<stdio.h>
#include<malloc.h>
int citire_graf(char numefisier[20], int* nr_vrf, int* nr_muchii, int*** g)
{
FILE* f;
int i,er;
fopen_s(&f, numefisier, "r+t");
if (f == NULL)
er = 1;
else
{
er = 0;
fscanf_s(f,"%d %d", nr_vrf, nr_muchii);
*g = (int**)malloc(*nr_muchii* sizeof(int*));
for (i = 0; i < *nr_muchii; i++)
(*g)[i] = (int*)malloc(3 * sizeof(int));
for (i = 0; i < *nr_muchii; i++)
fscanf_s(f,"%d %d %d", & (*g)[i][0], & (*g)[i][1], &(*g)[i][2]);
fclose(f);
}
return er;
}
void main()
{
char numefisier[20];
int n, m, ** tabel, er;
printf("Introduecti fisierul din care cititi graful:");
gets_s(numefisier);
er = citire_graf(numefisier, &n, &m, &tabel);
printf("Numarul de varfuri este:%d", n);
printf("Numarul de muchii este:%d", m);
printf("Muchiile sunt:\n");
int i;
for (i = 0; i < m; i++)
{
printf("%d %d ", tabel[i][0], tabel[i][1]);
printf("Ponderea muchiei este: %d\n", tabel[i][2]);
}
}
//graf ponderat
#include<stdio.h>
#include<malloc.h>
#define INF 1000
int citire_graf(char numefisier[20], int* nr_vrf, int* nr_muchii, int*** g)
{
FILE* f;
int i, er;
fopen_s(&f, numefisier, "r+t");
if (f == NULL)
er = 1;
else
{
er = 0;
fscanf_s(f, "%d %d", nr_vrf, nr_muchii);
*g = (int**)malloc(*nr_muchii * sizeof(int*));
for (i = 0; i < *nr_muchii; i++)
(*g)[i] = (int*)malloc(3 * sizeof(int));
for (i = 0; i < *nr_muchii; i++)
fscanf_s(f, "%d %d %d", &(*g)[i][0], &(*g)[i][1], &(*g)[i][2]);
fclose(f);
}
return er;
}
int** a, dim;
a = conversie_matrice(n, m, tabel, &dim);
printf("\nMatricea de adiacenta este:\n");
for (i = 0; i < dim; i++)
{
for (j = 0; j < dim; j++)
printf("%d ", a[i][j]);
printf("\n");
}
void main()
{
int a[10][10], n, nm, i, j, u, v, m[10][10];
printf("Introduceti numarul de noduri:");
scanf_s("%d", &n);
printf("Introduceti numarul de muchii:");
scanf_s("%d", &nm);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
a[i][j] = 0;
for (i = 0; i < nm; i++)
{
printf("Introduceti nod initial muchie:");
scanf_s("%d", &u);
printf("Introduceti nod final muchie:");
scanf_s("%d", &v);
a[u - 1][v - 1] = a[v - 1][u - 1] = 1;
}
Roy_Warshall(a, m, n);
printf("Matricea existentei drumurilor este:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%d ", m[i][j]);
printf("\n");
}
}
m = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++)
m[i] = (int*)malloc(n * sizeof(int));
fclose(f);
*a = mw;
}
void main()
{
int** a, ** m_dr;
int n, i, j;
char numef[20];
void main()
{
int a[10][10], n, nm, i, j, u, v, m[10][10];
printf("Introduceti numarul de noduri:");
scanf_s("%d", &n);
printf("Introduceti numarul de muchii:");
scanf_s("%d", &nm);
Roy_Warshall(a, m, n);
printf("Matricea existentei drumurilor este:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%d ", m[i][j]);
printf("\n");
}
m = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++)
m[i] = (int*)malloc(n * sizeof(int));
*a = mw;
}
void main()
{
int** a, ** m_dr;
int n, i, j;
char numef[20];
int v[15], n;
int a[15][15];
void main()
{
int x;
FILE* f = NULL;
citire(f);
printf("Nr de componente conexe este %i .", conexe());
}
//adaugam o variabila care numara cate componente conexe avem; se afla in void
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
printf("Numarul de noduri:");
scanf("%i", &*n);
printf("Numarul de muchii:");
scanf("%i", &m);
c[0] = vo - 1;
parinte[vo - 1] = -1;
p = 0;
*u = 0;
m[vo - 1] = 1;
adiacenta(a, &n);
afisare(a, n);
printf("Citeste vo=");
scanf("%d", &vo);
nr = nr + 1;
printf("Varfurile vizitate:");
for (i = 0; i <= u; i++)
printf(" %d ", c[i] + 1);
printf("Parinte: ");
for (i = 0; i <= u; i++)
printf("\n parinte[%d]=%d", i + 1, parinte[i] + 1);
if (nr == 1)
printf("\ngraf conex");
else
printf("\nNumarul de componente conexe este %d", nr);
#include <stdio.h>
#include <malloc.h>
#define INF 1000000
typedef struct {
float l;
int vf;
}eticheta;
//subprogram
//preia datele unui graf in forma tabelara din fisierul nume si obtine
//matricea ponderilor, unde INF este valoarea cu semnificatie de infinit
//ultima linie a fisierului contine virful initial din algoritmul Dijkstra
//subprogram
//functia pentru implementarea algoritmului Dijkstra - returneaza
//vectorul de etichete
//subprogram
//functia principala
ui = v0;
for (nrit = 0; nrit < n - 1; nrit++)
{
lmin = INF;
//sunt recalculate w-distantele de la virfurile v cu prel[v-1]=0 si este
determinat vmin, //urmatorul virf cu proprietatea ca pentru acesta a fost determinat un
drum de cost minim,
// lmin
for (v = 1; v <= n; v++)
{
if ((prel[v - 1] == 0) && (v_et[v - 1].l > v_et[ui - 1].l + w[v -
1][ui - 1]))
{
v_et[v - 1].l = v_et[ui - 1].l + w[v - 1][ui - 1];
v_et[v - 1].vf = ui;
}
if ((prel[v - 1] == 0) && v_et[v - 1].l < lmin)
{
lmin = v_et[v - 1].l; vmin = v;
}
}
ui = vmin; prel[ui - 1] = 1;
}
free(prel); return v_et;
}
void main()
{
float** w;
int n, v0, v, u, i;
char numef[20];
printf("Introduceti numele fisierului care contine graful:");
scanf("%s", numef);
preia_graf(numef, &w, &n, &v0);
eticheta* rez = Dijkstra(w, n, v0);
for (v = 1; v <= n; v++)
if (v != v0)
{
printf("Costul unui cel mai ieftin drum de la %i la %i este %8.3f",
v, v0, rez[v - 1].l);
printf("\n Un drum de cost minim: %i ", v);
u = v;
while (rez[u - 1].vf != v0)
{
printf("%i ", rez[u - 1].vf);
u = rez[u - 1].vf;
}
printf("%i \n\n", v0);
}
free(rez);
for (i = 0; i < n; i++) free(w[i]);
free(w);
}
11)Roy-Floyd cu introducere garf de la tastatura
#include<stdio.h>
#define INF 100
void main()
{
int w[10][10], n, nm, i, j, u, v,c, d[10][10];
scanf_s("%d", &n);
scanf_s("%d", &nm);
12. Yen
13. Determinare numar de arce care pleaca dintr-un nod
#include<stdio.h>
#include<conio.h>
void citire(int a[][30], int* n, int* m)
{
int x, y, i;
FILE* f;
char Numefis[30];
printf_s("\nIntroduceti fisierul: ");
gets_s(Numefis);
fopen_s(&f, Numefis, "r");
if (f == NULL)
printf_s("\nNu se poate deschide fisierul");
else
{
fscanf_s(f, "%d %d", n, m);
for (i = 0; i < *m; i++)
{
fscanf_s(f, "%d", &x);
fscanf_s(f, "%d", &y);
a[x][y] = 1;
}
fclose(f);
}
}
void main()
{
int a[30][30], m, n, rez;
citire(a, &n, &m);
rez = numara(a, n);
printf_s("\n Numarul de arce care pleaca din varful cautat este de %d", rez);
_getch();
}
#include<stdio.h>
#include<conio.h>
void main()
{
int a[30][30], n, m, rez;
citire(a, &n, &m);
rez = verificare(a, n);
if (rez == 0)
printf_s("\nExista varfuri care nu sunt izolate");
else
printf_s("\nToate varfurile sunt varfuri izolate");
_getch();
}
#include<stdio.h>
#include<conio.h>
void main()
{
int a[30][30], n, m, rez;
citire(a, &n, &m);
rez = verifica(a, n);
if (rez == 1)
printf("\nGraf complet");
else
printf("\nGraful nu e complet");
_getch();
}
void main()
{
int a[100][3], n, m, cost, i, j, x, y, c, aux;
FILE* f;
f = fopen("input.txt", "r");
if (!f) printf("Eroare la deschiderea fisierului de date.");
else
{
fscanf(f, "%d", &n);
fscanf(f, "%d", &m);
for (i = 0; i < m; i++)
{
fscanf(f, "%d", &x);
fscanf(f, "%d", &y);
fscanf(f, "%d", &c);
a[i][0] = x;
a[i][1] = y;
a[i][2] = c;
}
fclose(f);
}
for (i = 0; i < m - 1; i++)
for (j = i + 1; j < m; j++)
if (a[i][2] > a[j][2])
{
aux = a[i][0];
a[i][0] = a[j][0];
a[j][0] = aux;
aux = a[i][1];
a[i][1] = a[j][1];
a[j][1] = aux;
aux = a[i][2];
a[i][2] = a[j][2];
a[j][2] = aux;
}
printf("Arborele de cost minim contine muchiile: ");
cost = kruskal(a, n);
printf("\nCost total: %d", cost);
_getch();
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
int radacina(int v, int* tata)
{
int u = v;
while (tata[u] >= 0) u = tata[u];
return u;
}
int kruskal(int a[][3], int nv, int nm, int b[][3], int* l)// nv=numar varfuri nm=numar
muchii b retine ce am selectat, l nr de muchii selectate
{
int tata[50], i, j;
int c = 0;
*l = 0;
for (i = 0; i < nv; i++)tata[i] = -1;
for (j = i = 0; i < nv - 1; j++)
{
int v1 = a[j][0]; int v2 = a[j][1];
int k = radacina(v2, tata); int p = radacina(v1, tata);
if (k != p)
{
if (tata[k] < tata[p])
{
tata[k] += tata[p];
tata[p] = k;
}
else
{
tata[p] += tata[k];
tata[k] = p;
}
c += a[j][2];//adun costul
b[*l][0] = a[j][0];
b[*l][1] = a[j][1];
b[*l][2] = a[j][2];
(*l) = (*l) + 1;
i++;
}
}
return c;
}
void main()
{
int nv, nm, a[50][3], i, j, b[50][3];//este o forma tabelara matricea a
printf("Numarul de varfuri:"); scanf("%d", &nv);
printf("Numarul de muchii"); scanf("%d", &nm);
printf("Matricea de reprezentare\n");
for (i = 0; i < nm; i++)
{
printf("vi="); scanf("%d", &a[i][0]);
printf("vf="); scanf("%d", &a[i][1]);
printf("cost="); scanf("%d", &a[i][2]);
}
for (i = 0; i < nm; i++)
{
printf("\n");
for (j = 0; j < 3; j++)
printf("%d ", a[i][j]);
}
printf("\nArborele de cost minim: \n");
int l = 0;
int cost = kruskal(a, nv, nm, b, &l);
printf("\ncostul=%i\n", cost);
for (i = 0; i < l; i++)
{
for (j = 0; j < 3; j++)
printf("%d ", b[i][j]);
printf("\n");
}
}
19. Prim
//introducere graf de la tastatura, nu calculeaza
bine
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
void main()
{
int i, j, nv, nm, v, u, v0, ** arb; float** w, MAX = 1000000, cost, p;
//graful este preluat de la tastatura
//datele citite:numarul de virfuri, numarul de muchii si matricea ponderilor
printf("Numarul de virfuri:"); scanf("%i", &nv);
printf("Numarul de muchii:"); scanf("%i", &nm);
printf("Matricea ponderilor\n");
for (i = 0; i < nv; i++)
for (j = 0; j < nv; j++)
w[i][j] = MAX;
for (i = 0; i < nm; i++)
{
printf("Muchia %i si ponderea:", i + 1);
scanf("%i %i %f", &v, &u, &p);
w[u - 1][v - 1] = w[v - 1][u - 1] = p;
}
printf("Introduceti varful de pornire:");
scanf("%i", &v0);
int Prim(int w[100][100], int n, int vf, int rez[100][2], int max)
{
int cost, cmin, i, u, v, v1, v2, viz[100];
cost = 0;
for (i = 0; i < n; i++)
viz[i] = 0;
viz[vf - 1] = 1;
for (i = 0; i < n - 1; i++)
{
cmin = max;
for (u = 1; u <= n; u++)
if (viz[u - 1])
for (v = 1; v <= n; v++)
if (!viz[v - 1] && w[u - 1][v - 1] <= cmin)
{
v1 = u;
v2 = v;
cmin = w[u - 1][v - 1];
}
cost = cost + cmin;
rez[i][0] = v1;
rez[i][1] = v2;
viz[v2 - 1] = 1;
}
return cost;
}
void main()
{
int w[100][100], rez[100][2], n, m, x, y, c, cost, vf, i, j;
FILE* f;
f = fopen("input.txt", "r");
if (!f) printf("Eroare la deschiderea fisierului de date.");
else
{
fscanf(f, "%d", &n);
fscanf(f, "%d", &m);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
w[i][j] = 32000;
for (i = 0; i < m; i++)
{
fscanf(f, "%d", &x);
fscanf(f, "%d", &y);
fscanf(f, "%d", &c);
w[x - 1][y - 1] = w[y - 1][x - 1] = c;
}
fclose(f);
}
printf("Varful de start: ");
scanf("%d", &vf);
cost = Prim(w, n, vf, rez, 32000);
printf("Un arbore de cost minim contine muchiile: ");
for (i = 0; i < n - 1; i++)
printf("\nMuchia %d - %d", rez[i][0], rez[i][1]);
printf("\nCost total: %d", cost);
_getch();
}
20)Graf bipartit
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
#include"Coada.cpp"
#include"Preluare graf.cpp"
for(i=0;i<g.n;i++)
{ stare[i]=0;
culoare[i]=-1;
}
ok=ins_c(&p,&u,vi);
stare[vi-1]=1;
culoare[vi-1]=0;
nr=0;
este=1;
while(p)
{ ok=extrage_c(&p,&u,&i);
proceseaza_inainte(i, rez, nr);
stare[i-1]=2;
for(j=0; j<g.n; j++)
if( (g.a[i-1][j] == 1) )
{ if(stare[j]!=2)
procesare_muchie(i,j+1, culoare, este);
if(stare[j]==0)
{ ok=ins_c(&p,&u,j+1);
stare[j] = 1;
}
}
}
}
void main()
{ GRAF g;
char numef[30], ponderat, orientat;
int x, er, i;
int vi, cite, *parc, *p, *c, bi;
//strcpy(numef,"Grafp.txt"); ponderat='d';
//strcpy(numef,"Graf11.txt"); ponderat='n';
strcpy(numef,"Grafa.txt"); ponderat='n';
orientat='n';
er=citire_graf(numef, g, ponderat, orientat);
if(er)
printf("\nNu pot deschide fisierul %s", numef);
else
{ printf("\nNumar virfuri: %d",g.n);
printf("\nNumar muchii: %d",g.m);
//testare parcurgeri BF
printf_s("\nvi= ");
scanf_s("%d",&vi);
delete parc;
delete c;
dezalocare_matrice(g.a, g.n);
dezalocare_matrice(g.tab, g.m);
}
_getch();
}
21)Componenta conexa
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
#include"Coada.cpp"
#include"Preluare graf.cpp"
// Procesare virf inainte de a analiza vecinii
// I:
// E:
void proceseaza_inainte(int v, int* &rez, int &nr)
{ rez[nr++]=v;
}
for(i=0;i<g.n;i++)
stare[i]=0;
ok=ins_c(&p,&u,vi);
stare[vi-1]=1;
nr=0;
while(p)
{ ok=extrage_c(&p,&u,&i);
proceseaza_inainte(i, rez, nr);
stare[i-1]=2;
for(j=0; j<g.n; j++)
if( (g.a[i-1][j] == 1) )
{ if(stare[j]!=2)
procesare_muchie(i,j+1, muc, nm);
if(stare[j]==0)
{ ok=ins_c(&p,&u,j+1);
stare[j] = 1;
}
}
}
}
void main()
{ GRAF g;
char numef[30], ponderat, orientat;
int x, er, i;
int vi, cite, *parc, *p, **muchii, nrm;
//strcpy(numef,"Grafp.txt"); ponderat='d';
strcpy(numef,"Grafn.txt"); ponderat='n';
orientat='n';
er=citire_graf(numef, g, ponderat, orientat);
if(er)
printf("\nNu pot deschide fisierul %s", numef);
else
{ printf("\nNumar virfuri: %d",g.n);
printf("\nNumar muchii: %d",g.m);
//testare parcurgeri BF
printf_s("\nvi= ");
scanf_s("%d",&vi);
delete parc;
dezalocare_matrice(g.a, g.n);
dezalocare_matrice(g.tab, g.m);
dezalocare_matrice(muchii,g.m);
}
_getch();
}
22)Cicluri
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
#include"Preluare graf.cpp"
if(stare[y-1]==1)
if( (y!=p[x-1]) )
{ //printf("\n(%2d %2d) inapoi", x,y);
muc[nm][0]=x;
muc[nm][1]=y;
muc[nm][2]=0;
nm++;
}
else ;
else
{ //printf("\n(%2d %2d) inainte", x,y);
muc[nm][0]=x;
muc[nm][1]=y;
muc[nm][2]=1;
nm++;
}
void main()
{ GRAF g;
char numef[30], ponderat, orientat;
int x, er, i;
int vi, cite, *parc, *p;
//strcpy(numef,"Grafp.txt"); ponderat='d';
//strcpy(numef,"Grafn.txt"); ponderat='n';
strcpy(numef,"Grafa.txt"); ponderat='n';
orientat='n';
er=citire_graf(numef, g, ponderat, orientat);
if(er)
printf("\nNu pot deschide fisierul %s", numef);
else
{ printf("\nNumar virfuri: %d",g.n);
printf("\nNumar muchii: %d",g.m);
//testare parcurgeri DF
int* stare;
int** muchii, nrm;
stare = new int[g.n];
parc = new int[g.n];
p = new int[g.n];
nrm=0;
muchii=new int*[g.m];
for(i=0; i<g.m; i++)
muchii[i]=new int[3]; //coloana 3: 1-inainte, 0-inapoi
for(i=0;i<g.n;i++)
{ p[i] =-1;
stare[i]=0;
}
cite=0;
printf_s("\nvi= ");
scanf_s("%d",&vi);
delete parc;
delete p;
delete stare;
dezalocare_matrice(muchii, g.m);
dezalocare_matrice(g.a, g.n);
dezalocare_matrice(g.tab, g.m);
}
_getch();
}
23)Noduri articulatie
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
#include"Preluare graf.cpp"
if( p[v-1]<1 )
if( grad[v-1]>1 )
{ //printf("\nNod articulatie: %2d 'Radacina'",v);
adauga(v, na, nra);
}
else;
else
{ r = (p[p[v-1]-1]<1)? 1 : 0;
if( (sa[v-1]==p[v-1]) && (!r) )
{ adauga(p[v-1], na, nra);
//printf("\nNod articulatie: %2d 'Parinte'",p[v-1]);
}
if( sa[v-1]==v )
{ //printf("\nNod articulatie: %2d 'Punte'",p[v-1]);
adauga(p[v-1], na, nra);
if( grad[v-1]>0 )
{ adauga(v, na, nra);
//printf("\nNod articulatie: %2d 'Punte'",v);
}
}
tv = ti[sa[v-1]-1];
tpv= ti[sa[p[v-1]-1]-1];
if( tv<tpv )
sa[p[v-1]-1] = sa[v-1];
}
}
}
//utilizare clasa muchie: actualizare grad sau stramos accesibil
if( tip==1 )
grad[x-1]++ ;
if( (tip==0) && (p[x-1]!=y) )
if( ti[y-1] < ti[sa[x-1]-1] )
sa[x-1] = y;
}
void main()
{ GRAF g;
char numef[30], ponderat, orientat;
int x, er, i;
int vi, cite, *parc, *p;
//strcpy(numef,"Grafp.txt"); ponderat='d';
//strcpy(numef,"Grafn.txt"); ponderat='n';
//strcpy(numef,"Grafa.txt"); ponderat='n';
strcpy(numef,"Grafart.txt"); ponderat='n';
orientat='n';
er=citire_graf(numef, g, ponderat, orientat);
if(er)
printf("\nNu pot deschide fisierul %s", numef);
else
{ printf("\nNumar virfuri: %d",g.n);
printf("\nNumar muchii: %d",g.m);
//testare parcurgeri DF
int* stare;
int** muchii, nrm;
stare = new int[g.n];
parc = new int[g.n];
p = new int[g.n];
nrm=0;
muchii=new int*[g.m];
for(i=0; i<g.m; i++)
muchii[i]=new int[3]; //coloana 3: 1-inainte, 0-inapoi
for(i=0;i<g.n;i++)
{ p[i] =-1;
stare[i]=0;
}
cite=0;
printf_s("\nvi= ");
scanf_s("%d",&vi);
t=0;
sa=new int[g.n]; //stramos accesibil
grad=new int[g.n]; //grad extern in arborele de parcurgere (nr fii)
ti=new int[g.n]; //moment incepere prelucrare nod
te=new int[g.n]; //moment terminare prelucrare nod
na=new int[g.n]; //noduri articulatie
nra=0;
delete parc;
delete p;
delete stare;
delete sa;
delete grad;
delete ti;
delete te;
delete na;
dezalocare_matrice(muchii, g.m);
dezalocare_matrice(g.a, g.n);
dezalocare_matrice(g.tab, g.m);
}
_getch();
}
23)Sortare topologica
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
#include"Preluare graf.cpp"
// Clasificare muchie
// I: virf inceput (x), virf sfirsit (y), vector parinti (p), vector stare
(stare), vector moment intrare (ti - global), nr. virfuri (n)
// E: cod (-1-neclasificata, 0-inapoi, 1-arbore, 2-inainte, 3-lateral)
int tip_muchie(int x, int y, int* p, int *stare, int n)
{ int t;
t=-1;
if( p[y-1]==x )
t=1;
else
if( stare[y-1]==1 )
t=0;
else
if( stare[y-1]==2 && ti[y-1]>ti[x-1] )
t=2;
else
if( stare[y-1]==2 && ti[y-1]<ti[x-1] )
t=3;
return t;
}
void main()
{ GRAF g;
char numef[30], ponderat, orientat;
int x, er, i;
int vi, cite, *parc, *p, este;
orientat='n';
//strcpy(numef,"Grafp.txt"); ponderat='d';
//strcpy(numef,"Grafn.txt"); ponderat='n';
//strcpy(numef,"Grafa.txt"); ponderat='n';
//strcpy(numef,"Grafart.txt"); ponderat='n';
strcpy(numef,"Grafo.txt"); ponderat='n'; orientat='d';
er=citire_graf(numef, g, ponderat, orientat);
if(er)
printf("\nNu pot deschide fisierul %s", numef);
else
{ printf("\nNumar virfuri: %d",g.n);
printf("\nNumar muchii: %d",g.m);
//testare parcurgeri DF
int* stare;
nrm=0;
muchii=new int*[g.m];
for(i=0; i<g.m; i++)
muchii[i]=new int[3];
for(i=0;i<g.n;i++)
{ p[i] =-1;
stare[i]=0;
}
cite=0;
printf_s("\nvi= ");
scanf_s("%d",&vi);
t=0;
ti=new int[g.n]; //moment incepere prelucrare nod
este=1;
if( este )
{ printf("\nSortare topologica: ");
for(i=cite-1; i>=0; i--)
printf("%d ",parc[i]);
}
else
printf("\nGraful are cicluri, nu se poate face sortarea!");
for(i=0;i<nrm;i++)
switch(muchii[i][2])
{ case 0: printf("\n(%2d %2d) - inapoi",
muchii[i][0],muchii[i][1]); break;
case 1: printf("\n(%2d %2d) - arbore",
muchii[i][0],muchii[i][1]); break;
case 2: printf("\n(%2d %2d) - inainte",
muchii[i][0],muchii[i][1]); break;
case 3: printf("\n(%2d %2d) - lateral",
muchii[i][0],muchii[i][1]); break;
default: printf("\n(%2d %2d) - necunoscut",
muchii[i][0],muchii[i][1]);
}
delete parc;
delete p;
delete stare;
delete ti;
dezalocare_matrice(muchii, g.m);
dezalocare_matrice(g.a, g.n);
dezalocare_matrice(g.tab, g.m);
}
_getch();
23)Coada
#include<stdio.h>
#include<malloc.h>
void main()
{
float cap_totala;
printf("Introduceti capacitatea rucsacului:");
scanf("%f", &cap_totala);
int n;
int i;
printf("Introduceti numarul de obiecte:");
scanf("%d", &n);
float c[50], v[50];
printf("Introduceti capacitatile specifice obiectelor:\n");
for (i = 0; i < n; i++)
{
printf("c[%d]=", i);
scanf("%f", &c[i]);
}
printf("Introduceti catigul specific obiectelor:\n");
for (int i = 0; i < n; i++)
{
printf("v[%d]=", i);
scanf("%f", &v[i]);
}
//float CT = 33; //capacitate totala de transport
//float c[10] = { 1,2,3,4,5,6,7,8,9,10 }; //capacitati
//float v[10] = { 3,2,1,4,5,3,2,7,1,8 }; //venituri
//pentru cazul general datele de intrare se vor citi de la tastatura
float sol[50], a, castig;
int j;
//prelucrare preliminara
//sortarea obiectelor
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (v[i] / c[i] < v[j] / c[j]) //cistig unitar
{
a = v[i]; v[i] = v[j]; v[j] = a;
a = c[i]; c[i] = c[j]; c[j] = a;
}
//apel functie
Rucsac_c(cap_totala, n, c, sol);
//afisare rezultate
castig = 0;
for (i = 0; i < n; i++)
{
printf("\n%2d: c=%5.2f v=%5.2f %2f, cistig=%5.2f", i + 1, c[i], v[i],
sol[i], castig += v[i] * sol[i]);
}
_getch();
a.Intreaga
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
//prelucrare preliminara
//sortarea obiectelor
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (v[i] / c[i] < v[j] / c[j]) //cistig unitar
{
a = v[i]; v[i] = v[j]; v[j] = a;
a = c[i]; c[i] = c[j]; c[j] = a;
}
//apel functie
Rucsac_i(cap_totala, n, c, sol);
//afisare rezultate
castig = 0;
for (i = 0; i < n; i++)
{
printf("\n%2d: c=%5.2f v=%5.2f %2d, cistig=%5.2f", i + 1, c[i], v[i],
sol[i], castig += v[i] * sol[i]);
}
_getch();
}
2. Suma maxima dintr-o multime de numere naturale
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
void main()
{
float a[100], b[100];
int n, i, nr;
printf("Introduceti numarul de elemente:");
scanf("%d", &n);
printf("Elementele sunt:\n");
for (i = 0; i < n; i++)
{
printf("a[%d]=", i);
scanf("%f", &a[i]);
}
suma_maxima(a, n, b, &nr);
if (nr == 0)
printf("Nu exista numare pozitive");
else
{
printf("Solutia este:");
for (i = 0; i < nr; i++)
printf("%f ", b[i]);
}
}
void main()
{
int t[100], sol[100], suma, n, i;
printf("Introduceti numarul de tipuri de bancnote:");
scanf("%d", &n);
printf("Introduceti valoare fiecarei bancnote:\n");
for (i = 0; i < n; i++)
{
printf("t[%d]=", i);
scanf("%d", &t[i]);
}
printf("Introduceti suma de plata:");
scanf("%d", &suma);
sortare(t, n);
plata_unitate(suma, t, n, sol);
for (i = 0; i < n; i++)
printf("%d bancnote de %d \n", sol[i], t[i]);
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
int m, n, i, j, k, x[100][100];
printf("m= ");
scanf_s("%d", &m);
printf("n= ");
scanf_s("%d", &n);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
x[i][j] = paznic(m, n, i, j);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
printf("%2d ", x[i][j]);
printf("\n");
}
_getch();
}
5. Problema spectacolelor
#include <stdio.h>
int inceput[20], sfarsit[20], nr[20], n;
void sortare_spectacole()
{
int schimb, aux, i;
do {
schimb = 0;
for (i = 0; i < n - 1; i++)
if (sfarsit[nr[i]] > sfarsit[nr[i + 1]]) {
aux = nr[i];
nr[i] = nr[i + 1];
nr[i + 1] = aux;
schimb = 1;
}
} while (schimb);
}
void main()
{
int i, h, m, ultim;
printf("Numarul de spectacole: "); scanf_s("%d", &n);
printf("Introduceti ora de inceput si de sfarsit a fiecarui spectacol: ");
for (i = 0; i < n; i++)
{
nr[i] = i;
printf("\nIntervalul de timp pt spectacolul %d\n", i);
printf("Ora inceput: "); scanf_s("%d", &h);
printf("Minut: "); scanf_s("%d", &m);
inceput[i] = h * 60 + m;
printf("Ora sfarsit: "); scanf_s("%d", &h);
printf("Minut: "); scanf_s("%d", &m);
sfarsit[i] = h * 60 + m;
}
sortare_spectacole();
printf("\nSpectacolele selectate sunt: %d ", nr[0]);
for (ultim = 0, i = 1; i < n; i++)
if (inceput[nr[i]] >= sfarsit[nr[ultim]]) {
printf("%d ", nr[i]);
ultim = i;
}
}
typedef struct {
int* a;
int l;
}VECTOR;
void interclasare(int v1[100], int l1, int v2[100], int l2, int vr[200], int* lr)
{
int i, j, k;
i = j = *lr = 0;
while (i < l1 && j < l2)
if (v1[i] < v2[j]) vr[(*lr)++] = v1[i++];
else vr[(*lr)++] = v2[j++];
for (k = i; i < l1; k++)
vr[(*lr)++] = v1[k];
for (k = j; k < l2; k++)
vr[(*lr)++] = v2[k];
}
void main()
{
VECTOR l[100];
int i, n, j;
printf("Numar de vectori: ");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("Vectorul %d", i + 1);
printf(" Dimensiunea lui este: ");
scanf("%d", &l[i].l);
printf("\nVector: ");
for (j = 0; j < l[i].l; j++)
scanf("%d", &l[i].a);
}
interclasare_optima(l, n);
printf("Vector rezultat:\n");
}
void main()
{
int p[100], n, s[2][100], i, nr;
printf("Dimensiune: ");
scanf("%d", &n);
printf("Permutare: \n");
for (i = 1; i <= n; i++) printf("%d ", i);
printf("\n");
for (i = 1; i <= n; i++) scanf("%d", &p[i]);
descompunere_perm(p, n, s, &nr);
for (i = nr - 1; i >= 0; i--)
printf("%d %d\n", s[0][i], s[1][i]);
_getch();
}
8. Dijkstra la grafuri
#include <stdio.h>
int divizori(int k)
{
int i, n;
n = k + 2;
while (verificare(n, k) == 0)n++;
return n;
}
void main()
{
int k;
printf("Introduceti nr. de divizori proprii:");
scanf_s("%d", &k);
printf("Cel mai mic nr. natural cu %d divizori proprii este %d\n", k,
divizori(k));
}
RECURSIVITATE
1. Sortarea prin metoda bulelor
#include<stdio.h>
void sortare_bule(float v[], int nr)
{
int i, gata;
float aux;
gata = 0;
for (i = 0; i < nr - 1; i++)
{
if (v[i] > v[i + 1])
{
aux = v[i];
v[i] = v[i + 1];
v[i + 1] = aux;
gata = 1;
}
}
if (gata == 1)
sortare_bule(v, nr);
}
void main()
{
float v[50];
int nr, i;
printf("Numarul de elemente ale vectorului:");
scanf_s("%d", &nr);
printf("Introduceti elementele vectorului:\n");
for (i = 0; i < nr; i++)
scanf_s("%f", &v[i]);
sortare_bule(v, nr);
printf("Vector sortat:");
for (i = 0; i < nr; i++)
printf("%f ", v[i]);
}
Scaderi repetate:
int cmmdc (int a, int b)
{if (a==b)
return a;
else
if (a>b)
return cmmdc((a-b), b);
else
return cmmdc(a, (b-a));
}
void main()
{
int a, b;
printf("a=");
scanf("%d", &a);
printf("b=");
scanf("%d", &b);
printf("Cmmdc este: %d", cmmdc(a, b));
printf("Cmmmc este: %d", ((a*b)/cmmdc(a,b)));
}
9) Aranjamente
#include<stdio.h>
int aranjamente(int n, int k)
{
int a;
if (k > n)
return 0;
else
{
if (k == 1)
return n;
else
{
a = n * aranjamente(n - 1, k - 1);
return a;
}
}
}
void main()
{
int n, k;
int aranj;
printf("Introduceti n:");
scanf_s("%d", &n);
printf("Introduceti k:");
scanf_s("%d", &k);
aranj = aranjamente(n, k);
printf("Aranjamente de %d luate cate %d=%d", n, k, aranj);
float ecuatie(float x)
{
return x * x - 4* x + 4;
}
int bisectie(float x1, float x2,float eps, int n,float (*f)(float),float* x)
{
int cod = 0;
while ((n > 0) && (cod == 0))
{
*x = (x1 + x2) / 2;
if ((*f)(*x) == 0)
cod = 1;
else
if ((x2 - x1) < eps)
cod = 2;
else
if ((*f)(x1)*(*f)(*x) < 0)
x2 = *x;
else
x1 = *x;
n--;
}
return cod;
}
void main()
{
float a, b, sol, prec;
int nr, cod;
printf("\na="); scanf("%f", &a);
printf("\nb="); scanf("%f", &b);
printf("\nprecizia=");
scanf("%f", &prec);
switch (cod)
{
case 0: printf("\nFara solutie");
break;
case 1: printf("\nSolutia exacta este % 7.3f", sol);
break;
case 2: printf("\nSolutia aproximativa este % 7.3f", sol);
}
}
12) Ackermann
#include<stdio.h>
int ackermann(int m, int n)
{
if (m == 0)
return n + 1;
else
{
if (n == 0)
return ackermann(m - 1, 1);
}
return ackermann(m - 1, ackermann(m, n - 1));
}
void main()
{
int m, n;
printf("Introduceti m");
scanf_s("%d", &m);
printf("Introduceti n");
scanf_s("%d", &n);
int rezultat;
rezultat = ackermann(m, n);
printf("\n%d", rezultat);
}
13)Fibonacci
#include<stdio.h>
#include<conio.h>
#include<math.h>
int fib(int n)
{
int f;
if (n == 0)
return 0;
else
{
if (n == 1)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
}
void main()
{
int n, f;
printf("Vreau termenul de pe pozitia: ");
scanf_s("%d", &n);
f = fib(n - 1);
printf("Termenul %d din sirul lui Fibonaci este: %d", n, f);
_getch();
}
14) Hannoi
#include<stdio.h>
void turnuri_hanoi(int n, int a, int b, int c)
{
if (n > 0)
{
turnuri_hanoi(n - 1, a, c, b);
printf("muta un disc de pe %d pe %d\n", a, c);
turnuri_hanoi(n - 1, b, a, c);
}
}
int main()
{
int a, b, c, n;
a = 1; b = 2; c = 3;
printf("nr discuri ");
scanf_s("%d", &n);
turnuri_hanoi(n, a, b, c);
}
int suma_cifrelor(int n)
{
if (n == 0)
return 0;
else
return suma_cifrelor(n / 10) + n % 10;
}
void main()
{
int n;
int suma;
printf("Introduceti numarul:");
scanf_s("%d", &n);
suma = suma_cifrelor(n);
printf("Suma cifrelor numarului %d este:%d", n, suma);
}
}
void main()
{
float alfa, beta, gama, delta, a0, b0;
printf("Introduceti alfa");
scanf_s("%f", &alfa);
printf("Introduceti beta");
scanf_s("%f", &beta);
printf("Introduceti delta");
scanf_s("%f", &delta);
printf("Introduceti gama");
scanf_s("%f", &gama);
printf("Introduceti a0");
scanf_s("%f", &a0);
printf("Introduceti b0");
scanf_s("%f", &b0);
float rezultat_sira, rezultat_sirb;
int n;
printf("Calculeaza termin de rang:");
scanf_s("%d", &n);
rezultat_sira = sira(n);
rezultat_sirb = sirb(n);
printf("Rezultat sira: %f Rezultat sirb: %f", rezultat_sira,rezultat_sirb);
}
p = polinom(a, n, x);
printf("\n");
printf("Valoarea polinomului in punctul %5.2f este %5.2lf", x, p);
}
19)Functia HERMITE
#include<stdio.h>
int main()
{
int rezultat;
int n, x;
long h;
printf("x=");
scanf_s("%d", &x);
printf("Gradul polinomului:");
scanf_s("%d", &n);
rezultat = Hermite(n, x);
printf("%d", rezultat);
}
void main()
{
int i, n;
float v[100];
float max;
printf("Nr elemente:");
scanf_s("%d", &n);
printf("Elemente:\n");
for(i=0;i<n;i++)
scanf_s("%f", &v[i]);
max = maxim(v, 0, n - 1);
printf("Nr maxim este=%f", max);
}
#include <stdio.h>
#include <stdlib.h>
void main() {
int a[20][20];
int i, j, n, p;
citireMatrice(a, &n);
afisareMatrice(a, n);
printf("Puterea este: "); scanf("%d", &p);
putereMatrice(a, n, p);
}
SORTARI
1)Interclasare
#include<stdio.h>
3)HEAP
#include<stdio.h>
int stanga(int i)
{
return 2 * i + 1;
}
int dreapta(int i)
{
return 2 * i + 2;
}
void main()
{
int n, i; double x[100];
printf("Inroduceti numarul de elemente n=");
scanf_s("%d", &n);
printf("Elementele:");
for (i = 0; i < n; i++)
{
printf("x[%d]=", i);
scanf_s("%lf", &x[i]);
}
heap_sort(x, n);
for (i = 0; i < n; i++)
printf("%3.1lf ", x[i]);
}
4)Selectie
#include<stdio.h>
free(temp);
free(num);
}
void main()
{
int n, i;
float x[100];
printf("Numarul de elemente din vector:");
scanf_s("%d", &n);
printf("Elementele vectorului:\n");
for (i = 0; i < n; i++)
{
printf("x[%d]=", i);
scanf_s("%f", &x[i]);
}
sortare_numarare(x, n);
printf("Vector sortat:\n");
for (i = 0; i < n; i++)
printf("%f ", x[i]);
}
void main()
{
int n, i;
float v[1000];
printf("Numarul de elemente din vector:");
scanf_s("%d", &n);
printf("Elemente vector:\n");
for (i = 0; i < n; i++)
{
printf("v[%d]=", i);
scanf_s("%f", &v[i]);
}
sortare_shell(v, n);
printf("Vectorul sortat\n");
for (i = 0; i < n; i++)
printf("%f ", v[i]);
}
if(!vb)
{ *(pu+*m)=*(pv+i);
*m=*m+1;
}
}
int *puN;
puN=(int*)malloc(*m*sizeof(int));
for(int i=0; i<*m;i++)
*(puN+i)=*(pu+i);
free(pu);
return puN;
}
void main()
{
int n, *pv, i;
printf("Introduceti dimensiunea vectorului:");
scanf("%d",&n);
pv=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{ printf("v[%d]=",i+1);
scanf("%d",pv+i);
}
int m, *pu;
pu=detValUniceVector(pv,n,&m);
int *pf;
pf=(int*)malloc(m*sizeof(int));
for(i=0;i<m;i++)
*(pf+i)=0;
for(i=0;i<m;i++)
printf("\nValoarea %d are frecventa de aparitie %d", *(pu+i),
*(pf+i));
free(pv);
free(pu);
free(pf);
getch();
}
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
void main()
{ int n, *pv,i;
printf("Introduceti dimensiunea vectorului:");
scanf("%d",&n);
pv=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{ printf("v[%d]=",i+1);
scanf("%d",pv+i);
}
int ng;
ng=calcululNrNegative(pv,n);
int m=n+ng;
int *pf=(int*)malloc(m*sizeof(int));
inserareNule(pv,n,pf);
printf("\n");
for(i=0;i<m;i++)
printf("%d",*(pf+i));
free(pv);
free(pf);
getch();
}
void main()
{ int n, *pv,i;
printf("Introduceti dimensiunea vectorului:");
scanf("%d",&n);
pv=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{ printf("v[%d]=",i+1);
scanf("%d",pv+i);
}
int ng;
ng=calcululNrNegative(pv,n);
int m=n+ng;
int *pf=(int*)malloc(m*sizeof(int));
inserareNule(pv,n,pf);
printf("\n");
for(i=0;i<m;i++)
printf("%d",*(pf+i));
free(pv);
free(pf);
getch();
}
4)Concatenare vectori
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
int *pc=(int*)malloc(*m*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<*(pn+i);j++)
{ *(pc+k)=*(*(pv+i)+j);
k=k+1;
}
return pc;
}
void main()
{ int n, *pn, **pv, i;
printf("Introduceti numarul de vectori:");
scanf("%d",&n);
pn=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{printf("Dimensiune vector %d:", i+1);
scanf("%d",pn+i);
}
pv=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
*(pv+i)=(int*)malloc(*(pn+i)*(sizeof(int)));
for(i=0;i<n;i++)
{ printf("\nIntroduceti elementele vectorului %d:\n",i+1);
for(int j=0;j<*(pn+i);j++)
{ printf("v%d[%d]=", i+1,j+1);
scanf("%d", *(pv+i)+j);
}
}
int m;
int *pm=Concateneaza(pv, pn, n, &m);
printf("\n");
for(i=0;i<m;i++)
printf(" %d ", *(pm+i));
for(i=0;i<n;i++)
free(*(pv+i));
free(pv);
free(pn);
free(pm);
getch();
}
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
void main()
{ int *pv, *pu, i,m,n;
if(m==n)
{
pv=(int*)malloc(m*sizeof(int));
pu=(int*)malloc(n*sizeof(int));
for(i=0;i<m;i++)
{ printf("v1[%d]=", i+1);
scanf("%d", pv+i);
}
printf("\n");
for(i=0;i<n;i++)
{ printf("v2[%d]=", i+1);
scanf("%d", pu+i);
}
int* pp=PV(pv,pu,n);
printf("\n");
for(i=0;i<n;i++)
printf(" %d ", *(pp+i));
free(pv);
free(pu);
free(pp);
}
else
printf("\nDimensiunile vectorilor nu permit efectuarea
operatiei!\n");
getch();
6)Interclasarea a 2 vectori
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
void main()
{ int m,n,*px,*py,i,j,k;
sortare(px,m);
sortare(py,n);
int *pi=(int*)malloc((m+n)*sizeof(int));
k=0;
i=0;
j=0;
if(i<m)
for(int ii=i;ii<m;ii++)
{ *(pi+k)=*(px+ii);
k=k+1;
}
else
for(int jj=j;jj<n;jj++)
{ *(pi+k)=*(py+jj);
k=k+1;
}
printf("\n");
for(i=0;i<k;i++)
printf(" %d ", *(pi+i));
free(px);
free(py);
free(pi);
getch();
}
void main()
{
token=strtok(src,sep);
char *pCuv[51];
int i=0;
while(token)
{ pCuv[i]=(char*)malloc(sizeof(char)*strlen(token)+1);
strcpy(pCuv[i],toke);
i=i+1;
token=strtok(NULL,sep);
}
printf("\n");
for(int j=0; j<i; j++)
printf("\n%s", pCuv[j]);
free(src);
for(int j=0; j<i; j++)
free(pCuv[j]);
getch();
}
return m;
}
//I - vectorul de intrare cu valori intregi, lungimea vectorului de
intrare, lungimea noului vector determinata in cadrul functiei
//E - noua zona de memorie dinamica aferenta masivului cu valori intregi
strict pozitive
void main()
{ int n, *pv, i;
printf("Introduceti dimensiunea vectorului:");
scanf("%d",&n);
pv=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{ printf("v[%d]=",i+1);
scanf("%d", pv+i);
}
int m;
int *pz=extragerePoz(pv,n,&m);
for(i=0;i<m;i++)
printf(" %d ", *(pz+i));
free(pv);
free(pz);
getch();
}
9)Identitatea multimilor
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
if(!vbs)
vb=1;
}
if(vb)
return 0;
else
for(i=0;i<n;i++)
if(!*(ps+i))
return 0;
return 1;
}
void main()
{ int m,n,i;
float *px, *py;
printf("Introduceti dimensiunea vectorului 1:");
scanf("%d", &m);
px=(float*)malloc(m*sizeof(float));
for(i=0;i<m;i++)
{printf("v1[%d]=",i+1);
scanf("%f", px+i);
}
int *pis=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
*(pis+i)=0;
int vb=verificaIdentitatea(px,py,pis,m,n);
if(vb)
printf("\nVectorii sunt identici!");
else
printf("\nVectorii contin multimi diferite de valori!");
free(px);
free(py);
free(pis);
getch();
10)Deconcatenarea masivului
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
int main()
{int **pm,n,i,j;
printf("Dimensiunea Matricei:");
scanf("%d",&n);
pm=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
*(pm+i)=(int*)malloc(n*sizeof(int));
int c;
printf("Valoare constantei:");
scanf("%d",&c);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(j==i || j==n-i-1)
*(*(pm+i)+j)=c;
else
*(*(pm+i)+j)=0;
for(i=0;i<n;i++)
{printf("\n");
for(j=0;j<n;j++)
printf("%d",*(*(pm+i)+j));
}
for(i=0;i<n;i++)
free(*(pm+i));
free(pm);
getch();
}
12)Liniarizarea lexicografica
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
int main()
{int **pm,m,n,i,j;
printf("Introduceti nr de linii:");
scanf("%d",&m);
printf("Introduceti nr de coloane:");
scanf("%d",&n);
pm=(int**)malloc(m*sizeof(int*));
for(i=0;i<m;i++)
*(pm+i)=(int*)malloc(n*sizeof(int));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{printf("M[%d][%d]=",i+1,j+1);
scanf("%d",*(pm+i)+j);
}
int *pv,nr,k;
nr=m*n;
pv=(int*)malloc(nr*sizeof(int));
k=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{*(pv+k)=*(*(pm+i)+j);
k=k+1;
}
printf("\n");
for(i=0;i<nr;i++)
printf("%d",*(pv+i));
for(i=0;i<m;i++)
free(*(pm+i));
free(pm);
free(pv);
getch();
}
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
//I - doua matrice cu valor reale, dimensiunea celor doua matrice data in
numar de linii si coloane
//E - adresa de memorie dinamica pentru gestionarea matricei rezultat
suma=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++)
*(suma+i)=(float*)malloc(n*sizeof(float));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
*(*(suma+i)+j)=*(*(pa+i)+j)+*(*(pb+i)+j);
return suma;
}
void main() {
float **pa, **pb;
int m,n,p,r,i,j;
printf("Introduceti numarul de linii matrice A:");
scanf("%d",&m);
printf("Introduceti numarul de coloane matrice A:");
scanf("%d",&n);
pb=(float**)malloc(p*sizeof(float*));
for(i=0;i<p;i++)
*(pb+i)=(float*)malloc(r*sizeof(float));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{printf("A[%d][%d]=", i+1,j+1);
scanf("%f",*(pa+i)+j);
}
for(i=0;i<p;i++)
for(j=0;j<r;j++)
{printf("B[%d][%d]=", i+1,j+1);
scanf("%f",*(pb+i)+j);
}
float **ps;
ps=sumaMat(pa,pb,m,n);
for(i=0;i<m;i++)
{ printf("\n");
for(j=0;j<n;j++)
printf(" %7.2f ", *(*(ps+i)+j));
}
for(i=0;i<m;i++)
free(*(pa+i));
free(pa);
for(i=0;i<m;i++)
free(*(pb+i));
free(pb);
for(i=0;i<m;i++)
free(*(ps+i));
free(ps);
}
else
getch();
}
14)Transpusa
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
void main()
{ float **pm;
int m,n,i,j;
printf("Introduceti numarul de linii:");
scanf("%d",&m);
printf("\nIntroduceti numarul de coloane:");
scanf("%d",&n);
pm=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++)
*(pm+i)=(float*)malloc(n*sizeof(float));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{printf("M[%d][%d]=", i+1,j+1);
scanf("%f", *(pm+i)+j);
}
float **pt;
pt=(float**)malloc(n*sizeof(float*));
for(i=0;i<n;i++)
*(pt+i)=(float*)malloc(m*sizeof(float));
transpusaMat(pm,pt,m,n);
for(i=0;i<n;i++)
{printf("\n");
for(j=0;j<m;j++)
printf(" %7.2f ", *(*(pt+i)+j));
}
for(i=0;i<m;i++)
free(*(pm+i));
free(pm);
for(i=0;i<m;i++)
free(*(pt+i));
free(pt);
getch();
}
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
for(int i=0;i<n-1;i++)
for(int j=i+1; j<n;j++)
if(*(pv+i)==*(pv+j))
*(pis+i)=*(pis+j)=1;
for(int i=0;i<n;i++)
if(*(pis+i))
{free(pis);
return 0;
}
for(int i=0;i<n;i++)
*(pis+i)=0;
for(int i=0;i<n;i++)
if(*(pv+i)>m+n)
*(pis+i)=1;
for(int i=0;i<n;i++)
if(*(pis+i))
{ free(pis);
return 0;
}
free(pis);
return 1;
}
void main()
{ float **pm;
int m,n,i,j;
printf("Introduceti numarul de linii al matricei: ");
scanf("%d",&m);
printf("Introduceti numarul de coloane al matricei: ");
scanf("%d",&n);
pm=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++)
*(pm+i)=(float*)malloc(n*sizeof(float));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ printf("M[%d][%d]=", i+1, j+1);
scanf("%f", *(pm+i)+j);
}
float **pr;
int *pv;
int r;
printf("Introduceti numarul de linii suplimentare:");
scanf("%d",&r);
pv=(int*)malloc(r*sizeof(int));
printf("Introduceti pozitiile in matricea rezultat pentru liniile de
inserat:\n");
for(i=0;i<r;i++)
{ printf("Linia %d:", i+1);
scanf("%d",pv+i);
}
sortareVector(pv,r);
int vb=validarePozitii(pv,r,m);
if(vb)
{ pr=(float**)malloc((m+r)*sizeof(float*));
for(i=0;i<m+r;i++)
*(pr+i)=(float*)malloc(n*sizeof(float));
else
{ for(j=0;j<n;j++)
*(*(pr+i)+j)=*(*(pm+pmi)+j);
pmi=pmi+1;
}
for(i=0;i<m;i++)
free(*(pm+i));
free(pm);
pm=pr;
pr=NULL;
for(i=0;i<m+r;i++)
{ printf("\n");
for(j=0;j<n;j++)
printf(" %7.2f ", *(*(pm+i)+j));
}
}
else
printf("\nVectorul de pozitii ale liniilor nu este corect
specificat!\n");
for(i=0;i<m+r;i++)
free(*(pm+i));
free(pm);
free(pv);
getch();
}
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
int sumasec(int **pm,int n)
{int i,j,s=0;
for(i=1;i<n;i++)
for(j=n-1;j>n-i-1;j--)
s=s+*(*(pm+i)+j);
return s;
}
int main()
{int **pm=NULL , n,i,j;
printf("Dimensiune Matrice:");
scanf("%d",&n);
pm=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
*(pm+i)=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("M[%d][%d]=",i+1,j+1);
scanf("%d",*(pm+i)+j);
}
for(i=0;i<n;i++)
{printf("\n");
for(j=0;j<n;j++)
printf("%d",*(*(pm+i)+j));
}
printf("\nSuma elementelor de sub diagonala secundara este
%d:\n",sumasec(pm,n));
for(i=0;i<n;i++)
if(*(pm+i))
free(*(pm+i));
if(pm)
free(pm);
getch();
}
1)Generare aranjamente
#include<stdio.h>
#include<conio.h>
void main()
{ int n,k,nr;
nr=aranjamente(n,k);
2)Generare combinari
#include<stdio.h>
#include<conio.h>
void main()
{ int n,k,nr;
nr=combinari(n,k);
3)Matrice distante
#include<stdio.h>
#include<conio.h>
#define INF 1000
for(i=0;i<n;i++)
for(j=0;j<n;j++)
d[i][j]=a[i][j];
for(j=0;j<n;j++)
for(i=0;i<n;i++)
if(d[i][j] < INF)
for(k=0;k<n;k++)
if(d[i][k] > d[i][j]+d[j][k])
d[i][k] = d[i][j]+d[j][k];
}
void main()
{
int a[30][30],m,n,i,j;
int d[30][30];
citire(a,&n,&m);
Roy_Floid(a,n,d);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf_s("%d ", d[i][j]);
printf_s("\n");
}
_getch();
}
PROBLEME MARIAH
(imi da max=8)
#define _CRT_SECURE_NO_WARNINGS_
#include<stdio.h>
int a, b, m;
if (s == d)
return pare[s];
else
m = (s + d) / 2;
a = maxim(pare, s, m);
b = maxim(pare, m + 1, d);
if (a > b)
return a;
else
return b;
int main()
int i, * v, * pare, n;
scanf_s("%d", &n);
v = new int[n];
scanf_s("%d", &v[i]);
for (i = 0; i < n; i = i + 2)
pare[i] = v[i];
Rezolvare in C++:
#include<iostream>
int a, b, m;
if (s == d)
return pare[s];
else
m = (s + d) / 2;
a = maxim(pare, s, m);
b = maxim(pare, m + 1, d);
if (a > b)
return a;
else
return b;
int main()
int i, * v, * pare, n;
v = new int[n];
for (i = 0; i < n; i = i + 2)
pare[i] = v[i];
(suma=55)
Pb rezolvata in c:
#include <stdio.h>
if (n == 1) {
if (v[0] % 10 == 5)
s += v[0];
}
else {
if (n % 2 == 0) {
suma5(n / 2, v, s);
suma5(n / 2, v + n / 2, s);
else {
suma5(n / 2, v, s);
suma5(1 + n / 2, v + n / 2, s);
int main() {
int s = 0;
suma5(n, a, s);
return 0;
Pb 4 rezolvata in C++:
#include <iostream>
if (n == 1) {
if (v[0] % 10 == 5)
s += v[0];
}
else {
if (n % 2 == 0) {
suma5(n / 2, v, s);
suma5(n / 2, v + n / 2, s);
else {
suma5(n / 2, v, s);
suma5(1 + n / 2, v + n / 2, s);
int main() {
int s = 0;
suma5(n, a, s);
cout << s;
return 0;
Pb 6
Scrieți un subprogram recursiv care determină maximul dintre valorile impare dintr-un
vector folosind metoda Divide et Impera, precum și programul principal (funcția main)
care demonstrează utilizarea acestui subprogram. Transmiterea datelor se va realiza
exclusiv prin parametri. Elementele vectorului sunt indexate de la 0.
if (n >= 0)
*max = v[n];
max_impar(v, n - 1, max);
int main()
max_impar(v, 3, &max);
return 0;
Pb 7.
#include <stdio.h>
int i = 0;
*s = *s + v[i++];
int main()
int s = 0;
suma_minima(v, 5, &s);
return 0;
Alte pb:
#include <stdio.h>
int a[10], n;
if (n == 0)
return 0;
else
if (a[n] > 0)
else
void main()
scanf_s("%d", &n);
scanf_s("%d", &a[i]);
}
2. Să se scrie și să se apeleze în main o funcție recursivă care calculează și
returnează diferența dintre suma numărului elementelor pare și suma numărului
elementelor impare dintr-un vector v cu n elemente.
#define _CRT_SECURE_NO_WARNINGS_
#include <stdio.h>
int a[10], n;
if (n == 0)
return 0;
else
if (a[n] % 2 == 0)
else
void main()
scanf_s("%d", &n);
{
printf("Elementul [%d] = ", i);
scanf_s("%d", &a[i]);
}
//djikstra
#include<stdio.h>
#include <malloc.h>
#pragma warning(disable:4996)
{
s[k] = 1;
for (i = 0; i < n; i++)
if ((s[i] == 0) && (l[i] > l[k] + c[i][k]))
{
l[i] = l[k] + c[i][k]; pred[i] = k;
}
}
else
g = 1;
} while (g != 1);
}
void main()
{
int a[20][20], n, m, l[20], i, j, pred[20], x,v,drum[30],k,nod;
citire(a, &n, &m);
afisare(a, n);
printf("\nvarful initial este: ");
scanf("%d", &x);
dijkstra(a, n, l, pred, x);
for (i = 0; i < n; i++)
if (i != x - 1)
printf("\ncostul minim de la varful %d la varful %d este %d", x, i + 1, l[i]);
for (i = 0; i < n; i++)
if (i != x - 1)
printf("\npredecesorul lui %d este %d", i + 1, pred[i] + 1);
printf("\nvarful final este: ");
scanf("%d", &v);
drum[0] = v;
k = 1;
i = v - 1;
while (i != x - 1)
{
drum[k] = pred[i] + 1;
k = k + 1;
i = pred[i];
}
printf("\ndrumul de la varful %d la varful %d este:", x, v);
for (i = k - 1; i >= 0; i--)
printf("%d ", drum[i]);
for (nod=0;nod<n;nod++)
{
if (nod != x-1)
{
drum[0] = nod+1;
k = 1;
i = nod;
while (i != x - 1)
{
drum[k] = pred[i] + 1;
k = k + 1;
i = pred[i];
}
printf("\ndrumul de la varful %d la varful %d este:", x, nod+1);
for (i = k - 1; i >= 0; i--)
printf("%d ", drum[i]);
}
}
}
Seminar 5
Lucrul cu fișiere text și fișiere binare – probleme economice
Probleme propuse:
1. Fie un fişier organizat secvențial, cu date referitoare la punctele obținute de studenți la disciplina Algoritmi și
tehnici de programare. Articolele au următoarea structură:
Nume şi Gru Puncte proba practică Puncte teme (0-1)
Nr. matricol Puncte examen (0-50)
prenume pa (0-30) 1 2 … 10
cha cha cha cha
int char[30] int char char
r r r r
Scrieți programul care înregistrează în fișier punctajul obținut de un student la examen. Studentul este identificat
prin numărul matricol. Programul trebuie să ofere posibilitatea repetării, pentru înregistrarea punctajelor mai
multor studenți.
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.
2. Fie un fişier organizat secvențial, cu date referitoare la punctele obținute de studenți la disciplina Algoritmi și
tehnici de programare. Articolele au următoarea structură:
Nume şi Gru Puncte proba practică Puncte teme (0-1)
Nr. matricol Puncte examen (0-50)
prenume pa (0-30) 1 2 … 10
cha cha cha cha
int char[30] int char char
r r r r
Scrieți programul care înregistrează înmatricularea unui nou student (punctajele vor avea valori nule).
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.
3. Fie un fişier organizat relativ, cu date referitoare la absențele studenților de la cursuri și seminarii/laboratoare
pentru fiecare dintre cele 15 discipline specifice fiecărui an de studiu. Cheia relativă este numărul matricol al
studentului (domeniul de valori pentru numerele matricole începe de la 0). Articolele au următoarea structură:
A Absențe (0-14)
Nr. Nume şi Gru n
Indicator de stare (0/1)
matricol prenume pa (1- 1 2 … 15
5)
C S C S C S
ch c
char int char[25] int
ar h char char char char char
ar
Numărul de activități la fiecare disciplină este 14.
Scrieţi un program care înregistrează exmatricularea unui student. Studentul este identificat prin numărul
matricol.
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.
4. Fie un fişier organizat relativ, cu date referitoare la absențele studenților de la cursuri și seminarii/laboratoare
pentru fiecare dintre cele 15 discipline specifice fiecărui an de studiu. Cheia relativă este numărul matricol al
studentului (domeniul de valori pentru numerele matricole începe de la 0). Articolele au următoarea structură:
Nr. Nume şi Gru A Absențe (0-14)
Indicator de stare (0/1)
matricol prenume pa n 1 2 … 15
1
(1-
C S C S C S
ch c
char int char[25] int
ar h char char char char char
ar
Numărul de activități la fiecare disciplină este 14.
Scrieţi un program care înregistrează o nouă absență a unui student la o activitate. Studentul este identificat prin
numărul matricol, activitatea este identificată prin poziția în vector (1-15) și tip (Curs/Seminar).
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.
Exemple de rezolvare:
Observatii:
Fisierul binar trebuie sa se regaseasca in directorul proiectului
În Visual Studio versiuni mai noi extensia fișierului sursă trebuie să fie .c (nu .cpp) – (dacă aveți eroare
legată de funcția gets)
#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente legate de securitate
1. Problema 1
//Fisierul binar se numeste Puncte.dat
#include<stdio.h>
2
fread(&s,sizeof(STUDENT),1,f);
}
fclose(g);
}
void main()
{FILE *f;
char nume[30];
STUDENT s;
int gasit,n,j;
printf("\nFisier: ");gets(nume);
f=fopen(nume,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis", nume);
else
{
lista_studenti(f);
printf("\nNr. matricol: ");scanf("%d",&n);
while(!feof(stdin))
{rewind(f);
fread(&s,sizeof(STUDENT),1,f);
gasit=0;
while((!feof(f))&&(gasit==0))
{
if(n==s.nr)
{gasit=1;
printf("\nNr.mat:%3d Nume: %-30s Grupa: %4d Punctaj pp: %2d\n: ",s.nr,s.nume,s.grupa, s.pp);
for(j=0;j<10;j++)
printf("%2d ",s.teme[j]);
printf("Punctaj examen: %2d ",s.examen);
printf("Introduceti punctajul la examen:");
scanf ("%d", &s.examen);
fseek(f, ftell(f)-sizeof(STUDENT),0);
fwrite(&s, sizeof(STUDENT), 1, f);
}else
fread(&s,sizeof(STUDENT),1,f);
}
if(gasit==0)printf("\nNu a fost gasit.");
printf("\nNr. matricol: ");scanf("%d",&n);
}
fclose(f);}
}
3
Va fi creat fișierul text cu studenții din fișierul binar
2. Problema 2
void main()
{FILE *f;
char nume[30];
STUDENT s;
int i;
printf("\nFisier: ");gets(nume);
f=fopen(nume,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis", nume);
else
{
lista_studenti(f);
fseek(f,0,2);//pozitionare la sfarsitul fisierului
printf("Nr.matricol: ");scanf("%d",&s.nr);
while(!feof(stdin))
{
printf("Nume: ");getchar(); gets(s.nume);
printf("Grupa: ");scanf("%d",&s.grupa);
s.pp=0;
for(i=0;i<10;i++)s.teme[i]=0;
s.examen=0;
fwrite(&s,sizeof(STUDENT),1,f);
printf("Nr.matricol: ");scanf("%d",&s.nr);
}
fclose(f);}
}
5
La urmatoarea listare in fișier text se poate observa că cei doi studenți au fost adaugați la sfârșitul fișierului
3. Problema 3
void main()
{FILE *f;
char nume[30];
STUDENT s;
int n;
printf("\nFisier: ");gets(nume);
f=fopen(nume,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis", nume);
else
{
lista_studenti(f);
printf("\n Numarul matricol:"); scanf("%d",&n);
while(!feof(stdin))
{
if(n>=nrart(f,sizeof(STUDENT)))
printf("Studentul nu exista!");
else{
fseek(f,n*sizeof(STUDENT),0);
fread(&s,sizeof(STUDENT), 1, f);
if(s.is==0) printf("Studentul nu exista!");
else{
fseek(f,n*sizeof(STUDENT),0);
printf("Studentul %s va fi exmatriculat: ",s.nume);
s.is=0;
fwrite(&s,sizeof(STUDENT), 1, f);
}
}
7
printf("\nNumar matricol: "); scanf("%d",&n);
}
fclose(f);}
}
După încă o apelare se poate observa că în fișierul text rezultat nu mai apare studentul cu numarul matricol
respectiv
4. Problema 4 – tema
Obs. Este tot o modificare (ca si la problema anterioara), dar a altui câmp din structura articolului
Important: se va avea în vedere lucrul cu fișiere binare organizate secvențial și relativ (a se vedea toate operațiile
discutate la curs), precum și rapoarte în fișiere text