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; }
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); }