Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>e
- // Структура за телефони
- typedef struct Phones
- {
- char number[20];
- char model[20];
- double price;
- int quantity;
- }phone;
- // Списък към тази структура
- typedef struct Node
- {
- char number[20];
- char model[20];
- double price;
- int quantity;
- struct Node *next;
- }list;
- list *head=NULL;
- phone phoneData;
- //функция която чете данните от бинарен файл и попълва списъка със тези данни.
- void ReadListFromFile(char *fileName)
- {
- FILE *fp;
- int size1,size2;
- list *newNode=NULL;
- if((fp=fopen(fileName,"rb"))==NULL)
- {
- printf("Error opening file.\n");
- return;
- }
- while(1)
- {
- newNode=malloc(sizeof(list));
- list *temp=head;
- if(fread(&size1,sizeof(int),1,fp)!=1)
- {
- break;
- }
- if(fread(newNode->number,1,size1,fp)!=size1)
- {
- break;
- }
- if(fread(&size2,sizeof(int),1,fp)!=1)
- {
- break;
- }
- if(fread(newNode->model,1,size2,fp)!=size2)
- {
- break;
- }
- if(fread(&newNode->price,8,1,fp)!=1)
- {
- break;
- }
- if(fread(&newNode->quantity,sizeof(int),1,fp)!=1)
- {
- break;
- }
- if(head==NULL)
- {
- newNode->next=NULL;
- head=newNode;
- }
- else
- {
- while(temp->next!=NULL)
- {
- temp=temp->next;
- }
- newNode->next=NULL;
- temp->next=newNode;
- }
- }
- fclose(fp);
- }
- // функция с която заделяме памет за нов елемент от списъка и попълваме всичките полета с новите данни.
- // Връща указател от тип "list".
- list *CreateNewNode()
- {
- list *newNode=malloc(sizeof(list));
- strcpy(newNode->number,phoneData.number);
- strcpy(newNode->model,phoneData.model);
- newNode->price=phoneData.price;
- newNode->quantity=phoneData.quantity;
- newNode->next=NULL;
- return newNode;
- }
- //Функция за добавяне на нов телефон на края на списъка.
- void InsertNewPhone()
- {
- list *temp=head;
- printf("Enter phone's number: ");
- gets(phoneData.number);
- while(temp!=NULL)
- {
- if(!strcmp(temp->number,phoneData.number))
- {
- printf("You already have a phone with this code.\n");
- return;
- }
- temp=temp->next;
- }
- printf("Enter phone's model: ");
- gets(phoneData.model);
- printf("Enter phone's price: ");
- scanf("%lf",&phoneData.price);
- printf("Enter phone's quantity: ");
- scanf("%d",&phoneData.quantity);
- list *newNode=CreateNewNode();
- temp=head;
- if(head==NULL)
- {
- newNode->next=NULL;
- head=newNode;
- return;
- }
- while(temp->next!=NULL)
- {
- temp=temp->next;
- }
- newNode->next=NULL;
- temp->next=newNode;
- }
- // Функция която извежда информация за всички телефони от магазина с цена, по-голяма от средната за всички телефони.
- void averagePrice()
- {
- double sum=0;
- int count=0;
- double averagePrice;
- list *temp=head;
- while(temp!=NULL)
- {
- sum+=temp->price;
- count++;
- temp=temp->next;
- }
- averagePrice=sum/count;
- temp=head;
- while(temp!=NULL)
- {
- if(temp->price >= averagePrice)
- {
- printf("Phone number: %s\nPhone model: %s\nPrice: %g\nQuantity: %d\n",
- temp->number,temp->model,temp->price,temp->quantity);
- printf("\n");
- }
- temp=temp->next;
- }
- }
- //Функция която по зададен идентификационен номер извежда информацията за телефона.
- void searchByNumber(char *myNumber)
- {
- list *temp=head;
- int flag=0;
- while(temp!=NULL)
- {
- if(!strcmp(myNumber,temp->number))
- {
- printf("Phone with that number is: ");
- printf("%s,it costs %gBGN and you have quantity: %d\n",temp->model,temp->price,temp->quantity);
- flag=1;
- }
- temp=temp->next;
- }
- if(flag==0)
- {
- printf("There is no such phone.\n");
- return;
- }
- }
- // Функция за променяне на наличностите от зададен телефон.
- void ChangingQuantity()
- {
- list *temp=head;
- int flag=0;
- char model1[20];
- int quantity1;
- int option;
- printf("Enter the phone model: ");
- gets(model1);
- while(temp!=NULL)
- {
- if(!strcmp(temp->model,model1))
- {
- flag=1;
- }
- temp=temp->next;
- }
- if(flag==0)
- {
- printf("There is no such model.Try again.\n");
- return;
- }
- printf("Enter the quantity u want to add or remove: ");
- scanf("%d",&quantity1);
- if(quantity1<=0)
- {
- printf("You entered wrong value for changing quantity.\n");
- return;
- }
- printf("Enter: \n1.To add quantity.\n2.To take quantity.\n");
- scanf("%d",&option);
- switch(option)
- {
- case 1: addQuantity(quantity1,model1);
- break;
- case 2: takeQuantity(quantity1,model1);
- break;
- default: printf("Wrong option.\n");
- }
- printf("List after changing quantity: \n");
- PrintList();
- }
- // Функция за добавяне количество телефони.
- void addQuantity(int quantity1,char *model1)
- {
- list *temp=head;
- while(temp!=NULL)
- {
- if(!strcmp(model1,temp->model))
- {
- temp->quantity+=quantity1;
- }
- temp=temp->next;
- }
- }
- // Функция за изваждане количества от магазина.
- void takeQuantity(int quantity1,char *model1)
- {
- list *temp=head;
- list *prev=NULL;
- while(temp!=NULL)
- {
- if(!strcmp(model1,temp->model))
- {
- if(temp->quantity - quantity1 == 0)
- {
- printf("Now you have 0 quantity of that model and it will be deleted from the list.\n");
- if(temp==head)
- {
- head=head->next;
- free(temp);
- temp=head;
- }
- else
- {
- prev->next=temp->next;
- free(temp);
- temp=prev->next;
- }
- break;
- }
- else
- {
- if(temp->quantity - quantity1 <0)
- {
- printf("Cant change quantity.\n");
- return;
- }
- else
- {
- temp->quantity-=quantity1;
- break;
- }
- prev=temp;
- temp=temp->next;
- }
- }
- else
- {
- prev=temp;
- temp=temp->next;
- }
- }
- }
- // Функция която исписва всичките данни за телефоните на екрана.
- void PrintList()
- {
- list *temp=head;
- if(temp==NULL)
- {
- printf("List is empty.\n");
- return;
- }
- printf("Your list is: \n");
- while(temp!=NULL)
- {
- printf("Phone number: %s, Phone model: %s Price: %gBGN Quantity: %d\n",temp->number,temp->model,temp->price,temp->quantity);
- temp=temp->next;
- }
- }
- // Функция която презаписва бинарния файл след извршване на някоя промяна в информацията за телефоните.
- void RewriteFile(char *fileName)
- {
- FILE *fp;
- list *temp=head;
- int size1,size2;
- if((fp=fopen(fileName,"wb"))==NULL)
- {
- printf("Error opening file.\n");
- return;
- }
- while(temp!=NULL)
- {
- size1=strlen(temp->number);
- if(fwrite(&size1,sizeof(int),1,fp)!=1)
- {
- break;
- }
- if(fwrite(temp->number,1,size1,fp)!=size1)
- {
- break;
- }
- size2=sizeof(temp->model);
- if(fwrite(&size2,sizeof(int),1,fp)!=1)
- {
- break;
- }
- if(fwrite(temp->model,1,size2,fp)!=size2)
- {
- break;
- }
- if(fwrite(&temp->price,8,1,fp)!=1)
- {
- break;
- }
- if(fwrite(&temp->quantity,sizeof(int),1,fp)!=1)
- {
- break;
- }
- temp=temp->next;
- }
- fclose(fp);
- }
- //Главната функция, която извиква останалите функции.
- int main()
- {
- char filename[20];
- char number1[15];
- char *menu[]={"Enter: " ,
- "1.Insert new phone",
- "2.Show phones above average price",
- "3.Change quantity of phone",
- "4.Search phone by number",
- "5.Exit"
- };
- int option,i;
- printf("Enter file name from which u want to read the list: ");
- gets(filename);
- ReadListFromFile(filename);
- PrintList();
- do
- {
- for(i=0;i<6;i++)
- {
- printf("%s\n",menu[i]);
- }
- scanf("%d",&option);
- fflush(stdin);
- switch(option)
- {
- case 1: InsertNewPhone();
- printf("List after insertion: \n");
- PrintList();
- break;
- case 2: printf("Phones above average price: \n\n");
- averagePrice();
- break;
- case 3: ChangingQuantity();
- break;
- case 4: printf("Enter the number: ");
- fflush(stdin);
- gets(number1);
- searchByNumber(number1);
- break;
- case 5: break;
- default: printf("Wrong option.\n");
- }
- }while(option!=5);
- RewriteFile(filename);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement