Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.59 KB | None | 0 0
  1. //sa nu uit sa modific la nume cu strcpy
  2. #include <iostream>
  3. #include "schelet1.h"
  4.  
  5. /* TODO
  6. * de inlocuit implementarile cu cele scrise de mana pentru
  7. * lista, stiva, coada (numai cele necesare)
  8. */
  9.  
  10. #include <list>
  11. #include <stack>
  12. #include <queue>
  13. #include<stdlib.h>
  14. #include<stdio.h>
  15. #include<string.h>
  16.  
  17. /**/
  18. using namespace std;
  19. ////////////////////////ARBORE/////////////////////////
  20. Nod* rad_arbore = NULL;
  21.  
  22.  
  23. //capetele de la liste
  24. Nod* cap_supermarket;
  25. Nod* cap_to_buy;
  26. Nod* cap_bought;
  27. //int nr1,nr2;
  28.  
  29. //cerinte
  30. int C[NR_CERINTE];
  31. int buget;
  32. //din propunere: scoatem
  33. //char* nume_arbore;
  34. //char* categorie_arbore;
  35. //int cantitate_arbore;
  36.  
  37. void citeste_date_intrare(char* *argv)
  38. {
  39. citeste_lista_1(argv[1]);
  40. citeste_lista_2(argv[2]);
  41. citeste_fisier_3(argv[3]);
  42. }
  43.  
  44. Nod* citeste_lista_din_fisier(char* nume_fisier, int tip_lista)
  45. {
  46. FILE* fin;
  47. Nod* cap_lista = NULL;
  48. Nod *p,*q;
  49. int i;
  50. int nr;
  51.  
  52. if((fin = fopen(nume_fisier,"rt")) == NULL)
  53. {
  54. printf("Fisierul %s nu poate fi deschis", nume_fisier);
  55. exit(1);
  56. }
  57. //din propunere:
  58. fscanf(fin, "%d", &nr);
  59. for(i = 0;i < nr;i++)
  60. {
  61. q = citeste_nod(fin, tip_lista);
  62. if(i == 0)
  63. {
  64. cap_lista = p = q;
  65. }
  66. else
  67. {
  68. leaga_noduri(p, q);
  69. p = q;
  70. }
  71. }
  72. fclose(fin);
  73. return cap_lista;
  74. }
  75. void citeste_lista_1(char *file_supermarket)
  76. {
  77. cap_supermarket = citeste_lista_din_fisier(file_supermarket, TIP_LISTA_1);
  78. }
  79. void citeste_lista_2(char *file_to_buy)
  80. {
  81. cap_to_buy = citeste_lista_din_fisier(file_to_buy, TIP_LISTA_2);
  82. }
  83. void citeste_fisier_3(char *cerinte)
  84. {
  85. FILE *f3;
  86. int i;
  87. if((f3=fopen(cerinte,"rt"))==NULL)
  88. {
  89. printf("Fisierul cerinte nu poate fi deschis");
  90. exit(1);
  91. }
  92. for(i = 1;i <= NR_CERINTE;i++)
  93. {
  94. fscanf(f3,"%d",&C[i]);
  95. }
  96.  
  97. fscanf(f3,"%d",&buget);
  98.  
  99. //fscanf(f3,"%s",nume_arbore);
  100. //fscanf(f3,"%s",categorie_arbore);
  101. //fscanf(f3,"%d",&cantitate_arbore);
  102. fclose(f3);
  103. }
  104.  
  105. void rezolva_cerinte()
  106. {
  107.  
  108. /* TODO
  109. * descrierea conditiilor pentru ca o cerinta
  110. * sa fie rezolvata
  111. */
  112.  
  113. if(C[1]) {
  114. rezolva_cerinta_1();
  115. }
  116. if(C[2]) {
  117. rezolva_cerinta_2();
  118. }
  119. if(C[3]) {
  120. rezolva_cerinta_3();
  121. }
  122. if(C[4]) {
  123. rad_arbore = rezolva_cerinta_4(rad_arbore);
  124. }
  125. if(C[5]) {
  126. rezolva_cerinta_5(NULL, NULL);
  127. }
  128. }
  129.  
  130. void rezolva_cerinta_1()
  131. {
  132. Nod *p;
  133. //parcurg lista supermarket
  134. for(p=cap_supermarket;p!=NULL;p=p->urm)
  135. {
  136. if(p->stoc==0) //daca stocul este nul
  137. {
  138. cap_to_buy = sterge_dupa_nume(cap_to_buy, p->nume);
  139. }
  140. }
  141. }
  142. void rezolva_cerinta_2()
  143. {
  144. Nod* p_to_buy;
  145. Nod* p_market;
  146. Nod* p_bought;
  147. Nod* q_bought;
  148.  
  149. cap_bought = NULL;
  150. for(p_to_buy = cap_to_buy;p_to_buy != NULL;p_to_buy = p_to_buy->urm)
  151. {
  152. int cantitate;
  153. p_market = gaseste_dupa_nume(cap_supermarket, p_to_buy->nume);
  154. cantitate = calcul_cantitate(buget, p_market, p_to_buy);
  155. buget -= cantitate * (p_market->pret);
  156. if(cantitate != 0) //adaugam la lista de cumparate
  157. {
  158. q_bought = new Nod;
  159. *q_bought = *p_to_buy; //copiere bit cu bit
  160. leaga_noduri(q_bought, NULL);
  161. leaga_noduri(NULL, q_bought);
  162. if(cap_bought == NULL)
  163. {
  164. cap_bought = p_bought = q_bought;
  165. }
  166. else
  167. {
  168. leaga_noduri(p_bought, q_bought);
  169. p_bought = q_bought;
  170. }
  171. }
  172. }
  173. }
  174. void rezolva_cerinta_3()
  175. {
  176. Nod *parcurgator;
  177. Nod *parcurgatornou;
  178. Nod *t;
  179. Nod *p,*q;
  180. Nod *nod_minim;
  181. for(t=cap_to_buy;t!=NULL;t=t->urm) //parcurg lista to buy
  182. {
  183. for(parcurgator=cap_supermarket;parcurgator!=NULL;parcurgator=parcurgator->urm) //parcurg lista supermarket
  184. {
  185. if(strcmp(t->nume,parcurgator->nume)==0) //daca gasesc produsul
  186. {
  187. if(t->cantitate<=parcurgator->cantitate) //daca, cantitatea de cumparat e mai mica decat cea din supermarket
  188. //adaug in lista bought primul element
  189. {
  190. p = new Nod;
  191. if(p==NULL)
  192. {
  193. printf("Alocare dinamica esuata");
  194. exit(1);
  195. }
  196. strcpy(p->nume,t->nume);
  197. strcpy(p->categorie,t->categorie);
  198. p->cantitate=t->cantitate;
  199. p->urm=NULL;
  200. cap_bought=p;
  201. t=t->urm; //altfel trece in bucla infinita
  202. break;
  203. }
  204. }
  205. }
  206. //acelasi lucru fac pentru urmatoarele elemente si creez clasic lista de cumparaturi
  207. for(parcurgatornou=parcurgator->urm;parcurgatornou!=NULL;parcurgatornou=parcurgatornou->urm)
  208. {
  209. if(strcmp(t->nume,parcurgatornou->nume)==0)
  210. {
  211. if(t->cantitate<=parcurgatornou->cantitate)
  212. {
  213. q = new Nod();
  214. if(q==NULL)
  215. {
  216. printf("Alocare dinamica esuata");
  217. exit(1);
  218. }
  219. strcpy(q->nume,t->nume);
  220. strcpy(q->categorie,t->categorie);
  221. q->cantitate=t->cantitate;
  222. q->urm=NULL;
  223. q->ant=p;
  224. p->urm=q;
  225. p=q;
  226. break;
  227. }
  228. }
  229. }
  230. }
  231. for(t=cap_to_buy;p!=NULL;p=p->urm) //parcurg lista to buy
  232. {
  233. for(parcurgator=cap_supermarket;parcurgator!=NULL;parcurgator=parcurgator->urm) //parcurg lista supermarket
  234. {
  235. if(strcmp(t->nume,parcurgator->nume)==0) //daca gasesc elementul
  236. {
  237. if(t->cantitate > parcurgator->cantitate) //daca are cantiatea mai mare decat cea de cumparat
  238. {
  239. if(cap_bought==NULL) //in cazul in care toate elementele din lista au cantitaea mai mare decat trebuie
  240. {
  241. p = new Nod;
  242. if(p==NULL)
  243. {
  244. printf("Alocare dinamica esuata");
  245. exit(1);
  246. }
  247. strcpy(p->nume,t->nume);
  248. strcpy(p->categorie,t->categorie);
  249. p->cantitate=parcurgator->cantitate;
  250. //scad cantitatea din supermarket din cea din to_buy
  251. t->cantitate = t->cantitate - parcurgator->cantitate;
  252. p->urm=NULL;
  253. cap_bought=p;
  254. parcurgator=parcurgator->urm; //trecem la noul element din supermarket
  255.  
  256. nod_minim=parcurgator;
  257. //aici verific care e nodul cu diferenta minima
  258. while(parcurgator!=NULL)
  259. {
  260. if((strcmp(t->categorie,parcurgator->categorie)==0)&&
  261. ((t->pret - nod_minim->pret)>(t->pret - parcurgator->pret)))
  262. {
  263. nod_minim=parcurgator;
  264. }
  265. parcurgator=parcurgator->urm;
  266. }
  267. q = new Nod;
  268. if(q==NULL)
  269. {
  270. printf("alocare dinamica esuata");
  271. exit(1);
  272. }
  273. strcpy(q->nume,nod_minim->nume);
  274. strcpy(q->categorie,nod_minim->categorie);
  275. q->cantitate=t->cantitate; //ce ramane din cantitatea initiala
  276.  
  277. q->urm=NULL;
  278. q->ant=p;
  279. p->urm=q;
  280. p=q;
  281. break;
  282. }
  283. else
  284. {
  285. //bag elementul in lista bought si copiez fiecare camp inclusiv cantitatea din lista supermarket(parcurgator in cazul meu)
  286. q = new Nod;
  287. if(q==NULL)
  288. {
  289. printf("alocare dinamica esuata");
  290. exit(1);
  291. }
  292. strcpy(q->nume,t->nume);
  293. strcpy(q->categorie,t->categorie);
  294. q->cantitate=parcurgator->cantitate;
  295. //scad cantitatea din supermarket din cea din to_buy
  296. t->cantitate=t->cantitate - parcurgator->cantitate;
  297. q->urm=NULL;
  298. q->ant=p;
  299. p->urm=q;
  300. p=q;
  301. parcurgator=parcurgator->urm; //trecem la noul element din supermarket
  302.  
  303. while(parcurgator!=NULL)
  304. //aici verific care e nodul cu diferenta minima
  305. {
  306. if((strcmp(t->categorie,parcurgator->categorie)==0)&&
  307. ((t->pret - nod_minim->pret)>(t->pret - parcurgator->pret)))
  308. {
  309. nod_minim=parcurgator;
  310. }
  311. parcurgator=parcurgator->urm;
  312. }
  313.  
  314. q = new Nod;
  315. if(q==NULL)
  316. {
  317. printf("alocare dinamica esuata");
  318. exit(1);
  319. }
  320. strcpy(q->nume,nod_minim->nume);
  321. strcpy(q->categorie,nod_minim->categorie);
  322. q->cantitate=t->cantitate; //ce ramane din cantitatea initiala
  323.  
  324. q->urm=NULL;
  325. q->ant=p;
  326. p->urm=q;
  327. p=q;
  328. break;
  329. }
  330. }
  331. }
  332. }
  333. }
  334. }
  335. Nod* rezolva_cerinta_4(Nod* radacina)
  336. {
  337. Nod *p;
  338. for(p = cap_bought;p != NULL;p = p->urm)
  339. {
  340. Nod* nod_nou = new Nod;
  341. *nod_nou = *p;
  342. leaga_noduri(nod_nou, NULL);
  343. leaga_noduri(NULL, nod_nou);
  344. radacina = adauga_in_arbore(radacina, nod_nou);
  345. }
  346. return radacina;
  347. }
  348. //aici a afisat RSD-ul ca sa-ti arat cum e
  349. void afisare_arbore(FILE* fout, Nod* p)
  350. {
  351. if(p)
  352. {
  353. fprintf(fout, "%d ", p->cantitate);
  354. afisare_arbore(fout, p->ant);
  355. afisare_arbore(fout, p->urm);
  356. }
  357. }
  358. void rezolva_cerinta_5(Nod* cap, int* rezultat)
  359. {
  360. stack<int> stiva_pozitii;
  361. stack<int> stiva_valori;
  362.  
  363. for(int poz = 0;cap != NULL; poz++, cap = cap->urm)
  364. {
  365. while(!stiva_valori.empty() && stiva_valori.top() > cap->pret)
  366. {
  367. stiva_valori.pop();
  368. stiva_pozitii.pop();
  369. }
  370. rezultat[poz] = stiva_valori.empty() ? poz : poz - 1 - stiva_pozitii.top();
  371. stiva_pozitii.push(poz);
  372. stiva_valori.push(cap->pret);
  373. }
  374. }
  375.  
  376. void scrie_date_iesire(char* nume_f_out)
  377. {
  378. FILE* fout;
  379. if((fout = fopen(nume_f_out,"wt")) == NULL)
  380. {
  381. printf("Fisierul %s nu poate fi deschis", nume_f_out);
  382. exit(1);
  383. }
  384. if(C[1])
  385. {
  386. afisare_lista_in_fisier(fout, cap_to_buy, TIP_LISTA_2);
  387. }
  388. //TODO: afisare pentru fiecare cerinta
  389. if(C[5])
  390. {
  391. afisare_arbore(fout, rad_arbore);
  392. }
  393.  
  394. fclose(fout);
  395.  
  396. }
  397.  
  398. Nod* citeste_nod(FILE* fin, int tip_lista)
  399. {
  400. Nod* q = new Nod;
  401. if(q == NULL)
  402. {
  403. printf("Alocare dinamica esuata");
  404. exit(1);
  405. }
  406. switch(tip_lista)
  407. {
  408. case TIP_LISTA_1:
  409. {
  410. fscanf(fin,"%s",q->nume);
  411. fscanf(fin,"%s",q->categorie);
  412. fscanf(fin,"%d",&(q->pret));
  413. fscanf(fin,"%d",&(q->cantitate));
  414. fscanf(fin,"%d",&(q->stoc));
  415. break;
  416. }
  417. case TIP_LISTA_2:
  418. {
  419. fscanf(fin,"%s",q->nume);
  420. fscanf(fin,"%s",q->categorie);
  421. fscanf(fin,"%d",&(q->cantitate));
  422. break;
  423. }
  424. }
  425. leaga_noduri(q, NULL);
  426. leaga_noduri(NULL, q);
  427. return q;
  428. }
  429. void leaga_noduri(Nod* n1, Nod* n2)
  430. {
  431. if(n1 != NULL)
  432. {
  433. n1->urm = n2;
  434. }
  435. if(n2 != NULL)
  436. {
  437. n2->ant = n1;
  438. }
  439. }
  440. Nod* sterge_dupa_nume(Nod* cap_lista, char* nume_cautat)
  441. {
  442. Nod* temp;
  443. Nod* p = cap_lista;
  444. while((temp = gaseste_dupa_nume(p, nume_cautat)) != NULL)
  445. {
  446. p = temp->urm;
  447. leaga_noduri(temp->ant, temp->urm);
  448. if(temp == cap_lista)
  449. {
  450. cap_lista = p;
  451. }
  452. free(temp);
  453. }
  454. return cap_lista;
  455. }
  456. Nod* gaseste_dupa_nume(Nod* cap_lista, char* nume_cautat)
  457. {
  458. Nod* p = cap_lista;
  459. while(p != NULL)
  460. {
  461. if(strcmp(p->nume, nume_cautat) == 0)
  462. {
  463. return p;
  464. }
  465. p = p->urm;
  466. }
  467. return NULL;
  468. }
  469. int calcul_cantitate(int buget, Nod* p_market, Nod* p_to_buy)
  470. {
  471. int buget_necesar = (p_to_buy->cantitate) * (p_market->pret);
  472. if(buget_necesar > buget)
  473. {
  474. buget_necesar = buget;
  475. }
  476. return buget_necesar / (p_market->pret);
  477. }
  478. Nod* adauga_in_arbore(Nod* radacina, Nod* nod_nou)
  479. {
  480. if(radacina == NULL)
  481. {
  482. return nod_nou;
  483. }
  484. else if(radacina->cantitate <= nod_nou->cantitate)
  485. {
  486. radacina->ant = adauga_in_arbore(radacina->ant, nod_nou);
  487. return radacina;
  488. }
  489. else
  490. {
  491. return adauga_in_arbore(nod_nou, radacina);
  492. }
  493. }
  494.  
  495. void afisare_lista_in_fisier(FILE* fout, Nod* cap_to_buy, int tip_lista)
  496. {
  497. Nod* p = cap_to_buy;
  498. for(;p != NULL;p = p->urm)
  499. {
  500. switch(tip_lista)
  501. {
  502. case TIP_LISTA_1:
  503. {
  504. fprintf(fout,"%s %s %d %d %d\n",p->nume, p->categorie, p->pret, p->cantitate, p->stoc);
  505. break;
  506. }
  507. case TIP_LISTA_2:
  508. {
  509. fprintf(fout,"%s %s %d\n",p->nume, p->categorie, p->cantitate);
  510. break;
  511. }
  512. }
  513. }
  514. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement