Sunteți pe pagina 1din 9

/*2.

Fie un sistem de calcul care urmrete controlul unui proces de transmi


sie a datelor pe o linie principal avnd
un debit maxim de 40MB/s. Fluxul de date de pe aceast linie este mprit d
ctre 10 utilizatori, traficul pe
liniile oferite lor putndu-se efectua cu debite ntre 2 i 40 MB/s. Imprir
bitelor pe cele 10 linii se face n
mod dinamic de ctre sistemul de control considernd pentru fiecare linie i
, i=0,...,9 , o pondere subunitar pi,
asociat la configurarea sistemului funcie de utilizator. Introducei iniial ce
10 ponderi pi astfel nct suma
lor s fie egal cu 1. Dac aceast condiie este verificat generai toate
bile considernd c pe
linia principal vom avea cel puin un debit de 2MB/s, deci de 2...40MB/s
determinnd n aceste cazuri
debitele posibile pe cele 10 linii de intrare ale utilizatorilor (ajus
tate la sute de KB/s). Se pune pe 0, dac nu se
poate asigura minimul de 2MB. Afiai aceste soluii. Implementarea poate fi r
ecursiv sau nerecursiv. */
#include <stdio.h>
#include <iostream>
using namespace std;
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#define NRCANALE 10
void afis_sol(void);
int x[NRCANALE],n=1,cont;
float pond[10];
int nmin=2, nmax=40;
void main(void)
{
int k,i;
float p=0;
cout << "Introdu cele 10 ponderi: \n\n";

for(i=0;i<NRCANALE;i++)
{
cout<<"Ponderea nr"<<i+1<<" : ";
cin>>pond[i];
p=p+pond[i];
}
if((int)p!= 1)
{
cout <<"\nPonderi gresite";exit(0);} ;
cout <<"\nIntrodu debitul pe linia principala(2-40 mbps).D
ebitul=0 te scoate din ciclu.";
while(n!=0)
{
cout << "Debitul: ";
cin >> n;
cout<<"\nSolutiile sunt:\n";
if (n <=nmax)
{
cont=0;
k=0;
x[k]=0;
do
{
while(x[k]<nmax)
{
x[k]=x[k]+1;
if(x[k] > nmin-1)
if(k==(NRCANALE-1))afis_sol();

else
{
k++; x[
k]=0;
}
}
k--;
}
while(!(k<0));
}
else cout <<"\nDebit invalid!";
}
}
void afis_sol(void)
{
int l,i;
double fraction, integer;
double number=0;
for(i=0;i<10;i++)
number=(double)(number+pond[i]*x[i]);
l=(int)number;
if (l==n)
{
for (i=0;i<NRCANALE;i++)
cout<<x[i]*pond[i]<<" ";
cout<<endl;
cont++;
if(cont >20)
{
cont=0;cout <<"\nIntrodu un caracter
pentru continuare\n";
getch();
}
}
}
/*3.n cadrul unei companii de software se pune problema difuzrii unor pac
hete de date la mai multe filiale,
maxim 7, valoarea fiind introdus de la intrarea standard. Filialele sunt
dispuse n mai multe puncte din lume,
costurile de transmisie fiind dependente de poziia lor geografic. Pachetele
trebuie s ajung la fiecare filial
chiar dac nu exist o legtur direct ntre toate filialele ci prin interm
i alte filiale caz n care
pachetul va urma o rut ocolitoare. Costurile necesare transmiterii datelo
r n reea se introduc iniial la
generarea sistemului. S se determine i afieze ruta pe care trebuie transmis
e pachetele de date astfel nct
pornind de la filiala i, citit de la intrarea standard pachetul s fie t
ransmis cu cost minim (eventual cu
confirmare adic pachetul poate s se ntoarc napoi). Implementarea poate fi
siv sau nerecursiv.*/
#include <stdio.h>
#include <conio.h>
#define MAX 7
int x[MAX],Y[MAX];
int COST[MAX][MAX];
void cit(int [][MAX],int &);
void afis(int [][MAX],int &);
int max_cost(int [][MAX],int &);
void afis_sol(long &);
int posibil(int);
int n;
void main(void)
{
int k;
long cost_M,C;
printf("Introdu dim matrice costuri(nr.orase <=7):\n");
scanf("%d",&n);
printf("Introdu si afis matricea costurilor C:\n");
cit(COST,n);
afis(COST,n);
cost_M=(n+1)*(long)max_cost(COST,n)+1;
k=0;
printf("Introdu orasul initial (0 ~ n-1):");
scanf("%d",&x[k]);
k=1;
x[k]=-1;
do
{
while(x[k] < n) //mai sunt valori posibile pentru compon
enta k
{
x[k]++; //trec la urmatoarea valoare
if(posibil(k)) if(k==(n-1))
{
C=0;
for(int i=0
;i<n-1;i++)
C+=COST[
x[i]][x[i+1]];
if(C<cost_M)
for(int
i=0;i<n;i++)

{

Y[i]=x[i]; cost_M=C;

}
}
else
{

k++;x[k]=-1;
} //trec la urmatoarea compo
nenta cu valori de la zero
}// sfarsit de while
k--; //nu mai sunt valori pentru componenta k. Revin la
componenta k-1
}
while(!(k<1));//m-am intors mai mult decit se putea
afis_sol(cost_M); //solutie
}

int posibil(int k)
{
if(k==0)return 1;
if(COST[x[k-1]][x[k]]!=0)
{
for(int i=0;i<k;i++)
if(x[k]==x[i]) return 0;
return 1;
}
return 0;
}
void afis_sol(long &CF)
{
for(int i=0;i<n;i++)
printf("%d ",Y[i]);
printf("\nCostul este %ld",CF);
printf("\n");
}
void cit(int a[][MAX],int &n)
{
for(int i=0;i<n-1;i++)
{
a[i][i]=0;
for(int j=i+1;j<n;j++)
{
printf("Introdu Elem[%d][%d]= ",i,j);
scanf("%d",&a[i][j]);
a[j][i]=a[i][j];
}
}
}
void afis(int a[][MAX], int &n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%4d ",a[i][j]);
printf("\n");
}
}
int max_cost(int a[][MAX],int &n)
{
int max=a[0][0];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j] > max)
max=a[i][j];
return max;
}
*/4.Problema investirii optime de capital: pentru un investitor cu un
capital C i n oferte la care trebuie avansate
fondurile fi i care aduc beneficiile bi, se cere selectarea acelor ofer
te care i aduc beneficiul maxim. */
#include <stdio.h>
#include <iostream>
using namespace std;
void Back_SubSet(int);
int Posibil(int, int&);
int ben(int k);
struct oferta
{
int f,b;
};

struct oferta v[20];
int x[20],y[20],c,n,maxim=0,nr;

void main(void)
{ int i;
printf("Introduceti capitalul care urmeaza sa fie investit: ");
scanf("%d",&c);
printf("\nIntroduceti numarul de oferte diferite (<=20): ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\nOferta %d:",i+1);
scanf("%d",&v[i].f);
printf("Beneficiul %d:",i+1);
scanf("%d",&v[i].b);
}; //citirea ofertelor si a beneficiilor

Back_SubSet(0);

cout<<"\nBeneficiul maxim este: "<<maxim;
cout<<"\nEl se obtine pentru ofertele: \n";
for (i=0;i<nr;i++)
cout<<v[y[i]].f<<" ";
cout<<"\nCare adc beneficiile: \n";
for (i=0;i<nr;i++)
cout<<v[y[i]].b<<" ";
cout<<endl;
}

void Back_SubSet(int k)
{
int sum,j,t;
for(j=0;j<n;j++)
{
x[k]=j;
if(Posibil(k, sum))
{
if(sum==c)
{
if (ben(k)>maxim)
{
maxim=ben(k);
for(t=0;t<k+1;t++)
y[t]=x[t];
nr=k+1;
}
}
else
Back_SubSet(k+1);
}
}
}

int Posibil(int k, int &s)
{ int ok=1,i;
s=0;
if(k==0)
return 1;
for (i=0;i<k;i++)
if (x[i]==x[k])
ok=0;
if (x[0]==x[1])
ok =0;

if(ok==1)
{
for( int i=0;i<=k;i++)
s += v[x[i]].f;
if(s <= c) return 1;
}
return 0;
}
int ben(int k)
{
int i,benef=0;
for(int i=0;i<=k;i++)
benef=benef+v[x[i]].b;
return benef;
}
/*5.Sa se scrie o aplicatie C/C++ care sa genereze aleator 10 valori
intregi, ce vor fi memorate intr-un vector. Sa
se verifice daca o alta valoare generata aleator apartine acestui vect
or, utilizand functia _lsearch(). */
#include <stdlib.h>
#include <stdio.h>
#include <search.h>
#include <ctime>
int *gen(int n);
int compare(const void *a, const void *b);
int main(void)
{
const int nr=10;
srand(time(NULL));
int *v,*rez;
v=gen(nr);
int key;
key=rand()%100+1;
rez=(int*) lsearch (&key, v, (size_t *)&nr, sizeof (int), compar
e);
if(rez==NULL)
{
printf("Valoarea %d nu a fost gasita in vectorul generat
initial",key);
}
else printf("Valoarea %d a fost gasita",*rez);
printf("\n");
for(int i=0;i<nr;i++)
{
printf("v[%d]=%d\n",i,v[i]);
}
return 0;
}
int *gen(int n)
{
int *ptr;
ptr=new int[n];
for(int i=0;i<n;i++)
{
//srand(time(NULL)+i);
ptr[i]=rand()%100+1;
}
return ptr;
}
int compare(const void *a, const void *b)
{
return(*(int*)a-*(int*)b);
}
/*6.Scriei o aplicaie C/C++ care s gseasc imaginile cele mai apropiate fo
pe rnd o cheie de cutare din
antetul imaginii. Antetul este reprezentat printr-o structur ce conine un
nume de fiier (String), o cale
(String), o rezoluie de intensitate (ntreg), o dimensiune n octei (ntreg).
ru fiecare cheie folosii o
metod diferit de cutare. Antetul imaginilor se afl stocat ntr-un fiier
itete ntr-un tablou de
structuri de la tastatur. */
#include<stdio.h>
#include <string.h>
#include <search.h>
struct imagine
{
char nume[256];
char cale[256];
int rezolutie;
int dimensiune;
};
int n;
struct imagine *read_data(char cale[]);
void afis_antet(struct imagine *img);
int cmp(struct imagine *v1,struct imagine *v2);
int main(void)
{
char calea[]="header.txt";
/*
* Fisierul va contine pe prima linie numarul de headere
* Pe urmatoarele linii va contine in ordine separate prin sp
atiu urmatoarele:
* nume cale rezolutie dimensiune
* orice modificare asupra structurii fisierului header poate d
uce la o rulare anormala a programului
* dupa fiecare header de imagine se da enter fara a se las
a spatiu liber intre dimensiune si enter
* toate elementele care depasesc numarul declarat in prima li
nie vor fi ignorate
*/
struct imagine *img=read_data(calea);
struct imagine *img_ptr;
char key_value[256];
printf("Introduceti numele pozei pe care doriti sa o cautati: "
);scanf("%s",key_value);
img_ptr = (struct imagine *)lfind(&key_value, img, (size_t *)&n,
sizeof(struct imagine),
(int (*) (const void *, const void *)) cmp);
if(img_ptr != NULL)
{
printf("Sa gasit urmatoarea imagine:\n");
afis_antet(img_ptr);
}
else printf("Imaginea cautata nu a fost gasita.\n");
return 0;
}
struct imagine *read_data(char cale[])
{
FILE *fp;
if((fp = fopen(cale, "r")) == NULL)
{
return NULL;
}
fscanf(fp, "%d\n", &n);
struct imagine *img=new struct imagine[n];
for(int i=0;i<n;i++)
{
fscanf(fp,"%s %s %d %d\n",img[i].nume,img[i].cale,&img[i].rez
olutie,&img[i].dimensiune);
}
fclose(fp);
return img;
}
void afis_antet(struct imagine *img)
{
printf("Imaginea cu numele: \"%s\" care se gaseste la calea: \"
%s\" avand rezolutia %d MP are dimensiunea %d",img->nume,img->cale,img->r
ezolutie,img->dimensiune);
}
int cmp(struct imagine *v1,struct imagine *v2)
{
return strcmp(v1->nume,v2->nume);
}

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