Advertisement
Guest User

Untitled

a guest
May 21st, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>e
  4.  
  5. // Структура за телефони
  6. typedef struct Phones
  7. {
  8. char number[20];
  9. char model[20];
  10. double price;
  11. int quantity;
  12. }phone;
  13.  
  14. // Списък към тази структура
  15. typedef struct Node
  16. {
  17. char number[20];
  18. char model[20];
  19. double price;
  20. int quantity;
  21. struct Node *next;
  22. }list;
  23.  
  24. list *head=NULL;
  25. phone phoneData;
  26.  
  27. //функция която чете данните от бинарен файл и попълва списъка със тези данни.
  28. void ReadListFromFile(char *fileName)
  29. {
  30. FILE *fp;
  31. int size1,size2;
  32. list *newNode=NULL;
  33. if((fp=fopen(fileName,"rb"))==NULL)
  34. {
  35. printf("Error opening file.\n");
  36. return;
  37. }
  38. while(1)
  39. {
  40. newNode=malloc(sizeof(list));
  41. list *temp=head;
  42. if(fread(&size1,sizeof(int),1,fp)!=1)
  43. {
  44. break;
  45. }
  46. if(fread(newNode->number,1,size1,fp)!=size1)
  47. {
  48. break;
  49. }
  50. if(fread(&size2,sizeof(int),1,fp)!=1)
  51. {
  52. break;
  53. }
  54. if(fread(newNode->model,1,size2,fp)!=size2)
  55. {
  56. break;
  57. }
  58. if(fread(&newNode->price,8,1,fp)!=1)
  59. {
  60. break;
  61. }
  62. if(fread(&newNode->quantity,sizeof(int),1,fp)!=1)
  63. {
  64. break;
  65. }
  66. if(head==NULL)
  67. {
  68. newNode->next=NULL;
  69. head=newNode;
  70. }
  71. else
  72. {
  73. while(temp->next!=NULL)
  74. {
  75. temp=temp->next;
  76. }
  77. newNode->next=NULL;
  78. temp->next=newNode;
  79. }
  80.  
  81. }
  82. fclose(fp);
  83. }
  84.  
  85. // функция с която заделяме памет за нов елемент от списъка и попълваме всичките полета с новите данни.
  86. // Връща указател от тип "list".
  87. list *CreateNewNode()
  88. {
  89. list *newNode=malloc(sizeof(list));
  90. strcpy(newNode->number,phoneData.number);
  91. strcpy(newNode->model,phoneData.model);
  92. newNode->price=phoneData.price;
  93. newNode->quantity=phoneData.quantity;
  94. newNode->next=NULL;
  95. return newNode;
  96. }
  97.  
  98. //Функция за добавяне на нов телефон на края на списъка.
  99. void InsertNewPhone()
  100. {
  101. list *temp=head;
  102. printf("Enter phone's number: ");
  103. gets(phoneData.number);
  104. while(temp!=NULL)
  105. {
  106. if(!strcmp(temp->number,phoneData.number))
  107. {
  108. printf("You already have a phone with this code.\n");
  109. return;
  110. }
  111. temp=temp->next;
  112. }
  113. printf("Enter phone's model: ");
  114. gets(phoneData.model);
  115. printf("Enter phone's price: ");
  116. scanf("%lf",&phoneData.price);
  117. printf("Enter phone's quantity: ");
  118. scanf("%d",&phoneData.quantity);
  119. list *newNode=CreateNewNode();
  120. temp=head;
  121. if(head==NULL)
  122. {
  123. newNode->next=NULL;
  124. head=newNode;
  125. return;
  126. }
  127.  
  128. while(temp->next!=NULL)
  129. {
  130. temp=temp->next;
  131. }
  132. newNode->next=NULL;
  133. temp->next=newNode;
  134. }
  135.  
  136. // Функция която извежда информация за всички телефони от магазина с цена, по-голяма от средната за всички телефони.
  137. void averagePrice()
  138. {
  139. double sum=0;
  140. int count=0;
  141. double averagePrice;
  142. list *temp=head;
  143.  
  144. while(temp!=NULL)
  145. {
  146. sum+=temp->price;
  147. count++;
  148. temp=temp->next;
  149. }
  150. averagePrice=sum/count;
  151. temp=head;
  152. while(temp!=NULL)
  153. {
  154. if(temp->price >= averagePrice)
  155. {
  156. printf("Phone number: %s\nPhone model: %s\nPrice: %g\nQuantity: %d\n",
  157. temp->number,temp->model,temp->price,temp->quantity);
  158. printf("\n");
  159. }
  160. temp=temp->next;
  161. }
  162. }
  163.  
  164. //Функция която по зададен идентификационен номер извежда информацията за телефона.
  165. void searchByNumber(char *myNumber)
  166. {
  167. list *temp=head;
  168. int flag=0;
  169. while(temp!=NULL)
  170. {
  171. if(!strcmp(myNumber,temp->number))
  172. {
  173. printf("Phone with that number is: ");
  174. printf("%s,it costs %gBGN and you have quantity: %d\n",temp->model,temp->price,temp->quantity);
  175. flag=1;
  176. }
  177. temp=temp->next;
  178. }
  179. if(flag==0)
  180. {
  181. printf("There is no such phone.\n");
  182. return;
  183. }
  184. }
  185.  
  186. // Функция за променяне на наличностите от зададен телефон.
  187. void ChangingQuantity()
  188. {
  189. list *temp=head;
  190. int flag=0;
  191. char model1[20];
  192. int quantity1;
  193. int option;
  194. printf("Enter the phone model: ");
  195. gets(model1);
  196. while(temp!=NULL)
  197. {
  198. if(!strcmp(temp->model,model1))
  199. {
  200. flag=1;
  201. }
  202. temp=temp->next;
  203. }
  204. if(flag==0)
  205. {
  206. printf("There is no such model.Try again.\n");
  207. return;
  208. }
  209. printf("Enter the quantity u want to add or remove: ");
  210. scanf("%d",&quantity1);
  211. if(quantity1<=0)
  212. {
  213. printf("You entered wrong value for changing quantity.\n");
  214. return;
  215. }
  216. printf("Enter: \n1.To add quantity.\n2.To take quantity.\n");
  217. scanf("%d",&option);
  218. switch(option)
  219. {
  220. case 1: addQuantity(quantity1,model1);
  221. break;
  222. case 2: takeQuantity(quantity1,model1);
  223. break;
  224. default: printf("Wrong option.\n");
  225. }
  226. printf("List after changing quantity: \n");
  227. PrintList();
  228. }
  229.  
  230. // Функция за добавяне количество телефони.
  231. void addQuantity(int quantity1,char *model1)
  232. {
  233. list *temp=head;
  234. while(temp!=NULL)
  235. {
  236. if(!strcmp(model1,temp->model))
  237. {
  238. temp->quantity+=quantity1;
  239. }
  240. temp=temp->next;
  241. }
  242. }
  243.  
  244. // Функция за изваждане количества от магазина.
  245. void takeQuantity(int quantity1,char *model1)
  246. {
  247. list *temp=head;
  248. list *prev=NULL;
  249. while(temp!=NULL)
  250. {
  251. if(!strcmp(model1,temp->model))
  252. {
  253. if(temp->quantity - quantity1 == 0)
  254. {
  255. printf("Now you have 0 quantity of that model and it will be deleted from the list.\n");
  256. if(temp==head)
  257. {
  258. head=head->next;
  259. free(temp);
  260. temp=head;
  261. }
  262. else
  263. {
  264. prev->next=temp->next;
  265. free(temp);
  266. temp=prev->next;
  267. }
  268. break;
  269.  
  270. }
  271. else
  272. {
  273. if(temp->quantity - quantity1 <0)
  274. {
  275. printf("Cant change quantity.\n");
  276. return;
  277. }
  278. else
  279. {
  280. temp->quantity-=quantity1;
  281. break;
  282. }
  283. prev=temp;
  284. temp=temp->next;
  285. }
  286. }
  287. else
  288. {
  289. prev=temp;
  290. temp=temp->next;
  291. }
  292. }
  293.  
  294. }
  295.  
  296. // Функция която исписва всичките данни за телефоните на екрана.
  297. void PrintList()
  298. {
  299. list *temp=head;
  300. if(temp==NULL)
  301. {
  302. printf("List is empty.\n");
  303. return;
  304. }
  305. printf("Your list is: \n");
  306. while(temp!=NULL)
  307. {
  308. printf("Phone number: %s, Phone model: %s Price: %gBGN Quantity: %d\n",temp->number,temp->model,temp->price,temp->quantity);
  309. temp=temp->next;
  310. }
  311. }
  312.  
  313. // Функция която презаписва бинарния файл след извршване на някоя промяна в информацията за телефоните.
  314. void RewriteFile(char *fileName)
  315. {
  316. FILE *fp;
  317. list *temp=head;
  318. int size1,size2;
  319.  
  320. if((fp=fopen(fileName,"wb"))==NULL)
  321. {
  322. printf("Error opening file.\n");
  323. return;
  324. }
  325. while(temp!=NULL)
  326. {
  327. size1=strlen(temp->number);
  328. if(fwrite(&size1,sizeof(int),1,fp)!=1)
  329. {
  330. break;
  331. }
  332. if(fwrite(temp->number,1,size1,fp)!=size1)
  333. {
  334. break;
  335. }
  336. size2=sizeof(temp->model);
  337. if(fwrite(&size2,sizeof(int),1,fp)!=1)
  338. {
  339. break;
  340. }
  341. if(fwrite(temp->model,1,size2,fp)!=size2)
  342. {
  343. break;
  344. }
  345. if(fwrite(&temp->price,8,1,fp)!=1)
  346. {
  347. break;
  348. }
  349. if(fwrite(&temp->quantity,sizeof(int),1,fp)!=1)
  350. {
  351. break;
  352. }
  353. temp=temp->next;
  354. }
  355. fclose(fp);
  356. }
  357.  
  358. //Главната функция, която извиква останалите функции.
  359. int main()
  360. {
  361. char filename[20];
  362. char number1[15];
  363. char *menu[]={"Enter: " ,
  364. "1.Insert new phone",
  365. "2.Show phones above average price",
  366. "3.Change quantity of phone",
  367. "4.Search phone by number",
  368. "5.Exit"
  369. };
  370. int option,i;
  371. printf("Enter file name from which u want to read the list: ");
  372. gets(filename);
  373. ReadListFromFile(filename);
  374. PrintList();
  375. do
  376. {
  377. for(i=0;i<6;i++)
  378. {
  379. printf("%s\n",menu[i]);
  380. }
  381. scanf("%d",&option);
  382. fflush(stdin);
  383. switch(option)
  384. {
  385. case 1: InsertNewPhone();
  386. printf("List after insertion: \n");
  387. PrintList();
  388. break;
  389. case 2: printf("Phones above average price: \n\n");
  390. averagePrice();
  391. break;
  392. case 3: ChangingQuantity();
  393. break;
  394. case 4: printf("Enter the number: ");
  395. fflush(stdin);
  396. gets(number1);
  397. searchByNumber(number1);
  398. break;
  399. case 5: break;
  400. default: printf("Wrong option.\n");
  401. }
  402. }while(option!=5);
  403.  
  404. RewriteFile(filename);
  405. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement