miyago

Labb3 - Lagret

Oct 10th, 2017
489
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5.  
  6. #define NAMESIZE 20
  7. #define LAGERSIZE 10
  8.  
  9. typedef struct {
  10.     int nr;
  11.     char namn[NAMESIZE+1];
  12.     int antal;
  13. } Item;
  14. Item aItem(int myNr, char myNamn[], int myAntal);
  15. Item newItem(void);
  16.  
  17. void addItem(Item *pLager, int *counter, Item itamz);
  18. void openLager(Item pLager[],int *pitems, char aFile[]);
  19. void backupLager(Item pLager[],int fitems, char aFile[]);
  20. void printItem(Item *pItem);
  21. void printLager(Item *pLager, int fitems);
  22. void setAntal(Item *pLager, int Antalet);
  23. void printAntal(Item *pLager, int fitems, int theNr);
  24. void delItem(Item *pLager, int *counter, int theNr);
  25. void changeItemSaldo(Item *pLager, int fitems, int theNr, int saldot);
  26. void findNr(Item *pLager, int fitems, int theNr);
  27. void writeNr(Item *pLager, int fitems, int theNr, char aFile[]);
  28. void writeNamn(Item *pLager, int fitems, char *theNamn, char aFile[]);
  29. void writeSaldo(Item *pLager, int fitems, int theNr, char aFile[]);
  30. void findAntal(Item *pLager, int fitems, int theNr);
  31. void findNamn(Item *pLager, int fitems, char *theNamn);
  32. void nrSort(Item *pLager, int theNr);
  33. void antalSort(Item *pLager, int theNr);
  34. void namnSort(Item *pLager, int theNr);
  35. void printMenu(void);
  36. bool checkNr(Item *pLager, int theNr);
  37.  
  38. int main(int argc, char **argv) {
  39.     Item Lager[LAGERSIZE+1];
  40.     char ch1[3];
  41.     char ch2[2];
  42.     char ch3[3];
  43.     char ch4[3];
  44.     int items = 0;
  45.     int aTal = 0;
  46.     char aaTal[4];
  47.     int aSaldo = 0;
  48.     char aNamn[NAMESIZE+1];
  49.     char filen[NAMESIZE+1];
  50.     printf("V\x84lkommen till lagret!\n");
  51.     printf("Tyv\x84rr \x84r detta programmet endast optimerat f\x94r anv\x84ndning av gemener.\n");
  52.     printf("Versaler anv\x84nds p\x86 egen risk\n");
  53.     printf("Skriv in filnamnet p\x86 den fil inneh\x86llande ditt lager: ");
  54.     gets(filen);
  55.     openLager(Lager, &items, filen);
  56.     printMenu();
  57.     do {
  58.         printf("Ditt val: ");
  59.         gets(ch1);
  60.         switch (ch1[0]) {
  61.             case 'r' :  printf("Registrera varor?\n");
  62.                     do {
  63.                         if (items != LAGERSIZE) {
  64.                         addItem(Lager, &items, newItem()); // Registrera ny vara
  65.                         printf("y f\x94r att forts\x84tta");
  66.                         gets(aaTal);
  67.                     } else {
  68.                         printf("Lagret \x84r fullt! [%d/%d]\n", items, LAGERSIZE);
  69.                         break;
  70.                     }
  71.                     } while (aaTal[0] == 'y');
  72.                     break;
  73.             case 'w' :  printLager(Lager, items); break; // Visa alla varor
  74.             case 's' :  do {
  75.                         printf("S\x94k efter varor p\x86 [i] - varunummer, [n] - varunamn, [s] - saldo. q f\x94r att avsluta\n\n");
  76.                         gets(ch2);
  77.                         switch (ch2[0]) {
  78.                             case 'i' :  gets(aaTal);
  79.                                 aTal = atoi(aaTal);
  80.                                 findNr(Lager, items, aTal);
  81.                                 break;
  82.                             case 'n' :  gets(aNamn);
  83.                                 findNamn(Lager, items, aNamn);
  84.                                 break;
  85.                             case 's' :  gets(aaTal);
  86.                                 aTal = atoi(aaTal);
  87.                                 findAntal(Lager, items, aTal);
  88.                                 break;
  89.                     }
  90.                     } while (ch2[0] != 'q');
  91.                         break;
  92.             case 'c' :  printf("Type in the itemnumber for the item you want to change saldo: ");
  93.                         gets(aaTal);
  94.                         aTal = atoi(aaTal);
  95.                         printf("Nytt saldo:");
  96.                         gets(aaTal);
  97.                         aSaldo= atoi(aaTal);
  98.                         changeItemSaldo(Lager, items, aTal, aSaldo);
  99.                         break;// Ändra lagersaldot för varor
  100.             case 'o' :  printf("Sortera varor. [i] efter varunummer. [n] efter namn och [s] efter saldo: ");
  101.                         gets(ch3);
  102.                         switch (ch3[0]) {
  103.                             case 's' :  antalSort(Lager, items);
  104.                                         printf("Sorterat efter saldo");
  105.                                         break;
  106.                             case 'i' :  nrSort(Lager, items);
  107.                                         printf("Sorterat efter varunummer");
  108.                                         break;                    
  109.                             case 'n' :  namnSort(Lager, items);
  110.                                         printf("Sorterat i bokstavsordning");
  111.                                         break;
  112.                         }
  113.                         break;
  114.             case 'd' :  printf("Ange varunummer f\x94r den vara du vill ta bort: ");
  115.                         gets(aaTal);
  116.                         aTal = atoi(aaTal);
  117.                         delItem(Lager, &items, aTal);
  118.                         break; // Avregistrera varor
  119.             case 'v' :  gets(aaTal);
  120.                         aTal = atoi(aaTal);
  121.                         printAntal(Lager, items, aTal);
  122.                         break; // Varning för lågt saldo
  123.             case 'k' :  printf("S\x94k och skriva ut varor till fil. [i] efter varunummer. [n] efter namn och [s] efter saldo: ");
  124.                         gets(ch4);
  125.                         switch(ch4[0]) {
  126.                             case 'i' :  printf("Skriv in varunumret: ");
  127.                                         gets(aaTal);
  128.                                         aTal = atoi(aaTal);
  129.                                         printf("Skriv in filnamnet p\x86 den filen du vill spara i: ");
  130.                                         gets(filen);
  131.                                         writeNr(Lager, items, aTal, filen);
  132.                                         break;
  133.                             case 'n' :  printf("S\x94k p\x86 namn: ");
  134.                                         gets(aaTal);
  135.                                         printf("Skriv in filnamnet p\x86 den filen du vill spara i: ");
  136.                                         gets(filen);
  137.                                         writeNamn(Lager, items, aaTal, filen);
  138.                                         break;
  139.                             case 's' :  printf("S\x94k p\x86 saldo: ");
  140.                                         gets(aaTal);
  141.                                         aTal = atoi(aaTal);
  142.                                         printf("Skriv in filnamnet p\x86 den filen du vill spara i: ");
  143.                                         gets(filen);
  144.                                         writeSaldo(Lager, items, aTal, filen);
  145.                                         break;
  146.                         } break;
  147.             case 'p' :  printf("[%d] / %d\n", items, LAGERSIZE); break;
  148.             case 'm' :  printMenu(); break;
  149.             case 'q' :  printf("Du har tryckt f\x94r att avsluta. Ange filnamnet du vill spara lagret till: ");
  150.                         gets(filen);
  151.                         backupLager(Lager, items, filen);
  152.                         break;
  153.         }
  154.     } while (ch1[0] != 'q');
  155.         printf("P\x86 \x86terseende");
  156.    
  157.  
  158.    
  159.     return 0;
  160. }
  161.  
  162. void openLager(Item pLager[],int *pitems, char aFile[]) { // Läser in ett lager från en fil
  163.     FILE *pFile;
  164.     printf("-[L\x84ser in filen]-\n");
  165.     if ((pFile=fopen(aFile,"r"))) {
  166.         while (fscanf(pFile, "%d %s %d",
  167.         &pLager[*pitems].nr,
  168.         pLager[*pitems].namn,
  169.         &pLager[*pitems].antal)==3 && *pitems < LAGERSIZE) {
  170.             (*pitems)++;
  171.         }
  172.     } else {
  173.         printf("Ingen fil med det namnet hittade\n");
  174.     }
  175.     fclose(pFile);
  176.     printf("Lagret laddat med [ %d ] varor\n", *pitems);
  177. }
  178. void backupLager(Item pLager[],int fitems, char aFile[]) { // Skriver lagret till en fil
  179.     FILE *pFile;
  180.     printf("L\x84ser in filen\n");
  181.     if ((pFile=fopen(aFile,"w"))) {
  182.         for (int i=0; i<fitems; i++)
  183.             fprintf(pFile, "%d %s %d\n",
  184.             pLager[i].nr,
  185.             pLager[i].namn,
  186.             pLager[i].antal);
  187.         } else {
  188.         printf("Something went wrong!\n");
  189.     }
  190.     fclose(pFile);
  191.     printf("Lagret skriven till filen: %s\n", aFile);
  192. }
  193. void printItem(Item *pItem){ // Skriver ut en vara
  194.     printf("%03d\t\t", pItem->nr);
  195.     printf("%-20s\t", pItem->namn);
  196.     printf("%5d\n", pItem->antal);
  197. }
  198. void printLager(Item *pLager, int fitems) { // Skriver ut hela lagret
  199.         printf("Nr\t\tNamn\t\t\tSaldo\n");
  200.         printf("---------------------------------------------\n");
  201.         for (int i=0;i<fitems;i++){
  202.             printItem(&pLager[i]);
  203.     }
  204. }
  205. Item aItem(int myNr, char myNamn[], int myAntal) { // Skapar en ny vara
  206.     Item aItem;
  207.     aItem.nr = myNr;
  208.     strcpy(aItem.namn, myNamn);
  209.     aItem.antal = myAntal;
  210.     return aItem;
  211. }
  212. Item newItem(void){
  213.     Item newItem; char t[10];
  214.         printf("Nummer:");
  215.         gets(t);
  216.         newItem.nr = atoi(t);
  217.         printf("Namn: ");
  218.         gets(newItem.namn);
  219.         printf("Antal: ");
  220.         gets(t);
  221.         newItem.antal = atoi(t);
  222.     return newItem;
  223. }
  224. void addItem(Item *pLager, int *counter, Item itamz){ // Läger till en vara i lagret
  225.     bool check;
  226.     check = checkNr(pLager, itamz.nr);
  227.         if (check == false){
  228.             pLager[(*counter)++] = itamz;
  229.             } else {
  230.             printf("Varunummer m\x86ste vara unikt!\n");
  231.             return;
  232.         }
  233.            
  234. }
  235. void setAntal(Item *pLager, int Antalet){ // Mutator för saldo
  236.     pLager->antal = Antalet;
  237. }
  238. void printAntal(Item *pLager, int fitems, int theNr) { // Skriver ut varor på skärmen med saldo X eller lägre
  239.         printf("Visar varor med antal %d eller mindre\n", theNr);
  240.         printf("---------------------\n");
  241.         for (int i=0;i<fitems;i++){
  242.          if (pLager[i].antal <= theNr){
  243.             printItem(&pLager[i]);
  244.             }
  245.     }
  246. }
  247. void delItem(Item *pLager, int *counter, int theNr) { // Tar bort en vara
  248.     int i; bool check;
  249.     check = checkNr(pLager, theNr);
  250.     if (check == true) {
  251.         printf("Tar bort varan med varunummer %d\n", theNr);
  252.         printf("---------------------\n");
  253.         for (i=0;i<LAGERSIZE;i++){
  254.          if (pLager[i].nr == theNr){
  255.             pLager[i].nr = 0;
  256.             (*counter)--;
  257.             for (i=0;i<LAGERSIZE;i++){
  258.                 if(pLager[i].nr == 0){
  259.                     pLager[i].nr = pLager[i+1].nr;
  260.                     pLager[i+1].nr = 0;
  261.                 }
  262.             }
  263.          }
  264.         }
  265.     } else {
  266.         printf("Ogilitigt varunummer!\n");
  267.         return;
  268.     }
  269. }
  270. void changeItemSaldo(Item *pLager, int fitems, int theNr, int saldot) { // Ändrar saldo på en vara
  271.     int i; bool check;
  272.         check = checkNr(pLager, theNr);
  273.         if(check == true) {
  274.             printf("\x8Endrar varanummer %d's saldo till %d\n", theNr, saldot);
  275.             printf("---------------------\n");
  276.             for (i=0;i<fitems;i++){
  277.                 if (pLager[i].nr == theNr) {
  278.                     setAntal(pLager, saldot);
  279.                 }
  280.             }
  281.         } else {
  282.             printf("Ogiltigt varunummer!");
  283.             return;
  284.         }
  285. }
  286. void findNr(Item *pLager, int fitems, int theNr) { // Söker efter en varu med ett vist varunummer
  287.         printf("Visar varor med varunummer %d\n", theNr);
  288.         printf("---------------------\n");
  289.         for (int i=0;i<fitems;i++){
  290.          if (pLager[i].nr == theNr){
  291.             printItem(&pLager[i]);
  292.             }
  293.     }
  294. }
  295. void writeNr(Item *pLager, int fitems, int theNr, char aFile[]) { // Skriver ut en vara med ett visst varunummer
  296.         printf("---------------------\n");
  297.         int i; bool check; FILE *pFile;
  298.         check = checkNr(pLager, theNr);
  299.         if (check == true) {
  300.             printf("[-L\x84ser in filen]-\n");
  301.             if ((pFile=fopen(aFile,"w"))) {
  302.                 for (i=0; i<fitems; i++){
  303.                     if (pLager[i].nr == theNr){
  304.                         fprintf(pFile, "%d %s %d\n",
  305.                                         pLager[i].nr,
  306.                                         pLager[i].namn,
  307.                                         pLager[i].antal);
  308.                         printf("Skriver ut vara med varunummer %d till %s\n", theNr, aFile);
  309.                     }
  310.                 }
  311.             } else {
  312.                 printf("Something went wrong!\n");
  313.                     }
  314.         } else {
  315.             printf("Ogiltigt varunummer!");
  316.             return;
  317.         }
  318.     fclose(pFile);
  319.    
  320. }
  321. void writeNamn(Item *pLager, int fitems, char *theNamn, char aFile[]) { // Skriver ut varor efter namn
  322.         printf("---------------------\n");
  323.     FILE *pFile;
  324.     printf("-[L\x84ser in filen]-\n");
  325.     if ((pFile=fopen(aFile,"w"))) {
  326.         for (int i=0; i<fitems; i++){
  327.             if (strstr(pLager[i].namn, theNamn) != NULL){
  328.             fprintf(pFile, "%d %s %d\n",
  329.             pLager[i].nr,
  330.             pLager[i].namn,
  331.             pLager[i].antal);
  332.             }
  333.             printf("Skriver ut varor med varunamn matchande %s till %s\n", theNamn, aFile);
  334.         }
  335.         } else {
  336.         printf("Something went wrong!\n");
  337.     }
  338.     fclose(pFile);
  339. }
  340. void writeSaldo(Item *pLager, int fitems, int theNr, char aFile[]) { // Skriver ut varor med ett visst saldo
  341.         printf("---------------------\n");
  342.     FILE *pFile;
  343.     printf("-[L\x84ser in filen]-\n");
  344.     if ((pFile=fopen(aFile,"w"))) {
  345.         for (int i=0; i<fitems; i++) {
  346.             if (pLager[i].antal == theNr){
  347.             fprintf(pFile, "%d %s %d\n",
  348.             pLager[i].nr,
  349.             pLager[i].namn,
  350.             pLager[i].antal);
  351.         }
  352.        
  353.         }
  354.         printf("Skriver ut alla varor med saldo %d till filen %s\n", theNr, aFile);
  355.         } else {
  356.         printf("Something went wrong!\n");
  357.         }
  358.     fclose(pFile);
  359. }
  360. void findAntal(Item *pLager, int fitems, int theNr) { // Sök på saldo
  361.         printf("Visar varor med antal %d\n", theNr);
  362.         printf("---------------------\n");
  363.         for (int i=0;i<fitems;i++){
  364.          if (pLager[i].antal == theNr){
  365.             printItem(&pLager[i]);
  366.             }
  367.     }
  368. }
  369. void findNamn(Item *pLager, int fitems, char *theNamn) { // Sök på varunamn
  370.         printf("Visar varor som inneh\x86ller s\x94kordet %s\n", theNamn);
  371.         printf("---------------------\n");
  372.         for (int i=0;i<fitems;i++){
  373.          if (strstr(pLager[i].namn, theNamn) != NULL){
  374.             printItem(&pLager[i]);
  375.          }
  376. }
  377. }
  378. void nrSort(Item *pLager, int theNr) { // Sorterar lagret efter varunummer
  379.     int tmp; int tmp2;
  380.     char tmp3[NAMESIZE+1];
  381.     for (int i=0; i<theNr-1; i++)
  382.         for (int j=0; j<theNr-1-i; j++)
  383.             if (pLager[j].nr>pLager[j+1].nr) {
  384.                 tmp=pLager[j].nr;
  385.                 tmp2 =pLager[j].antal;
  386.                 strcpy(tmp3,pLager[j].namn);
  387.                 pLager[j].nr=pLager[j+1].nr;
  388.                 pLager[j].antal=pLager[j+1].antal;
  389.                 strcpy(pLager[j].namn,pLager[j+1].namn);
  390.                 pLager[j+1].nr=tmp;
  391.                 pLager[j+1].antal=tmp2;
  392.                 strcpy(pLager[j+1].namn,tmp3);
  393.             }
  394. }
  395. void antalSort(Item *pLager, int theNr) { // Sorterar lagret efter saldo
  396.     int tmp; int tmp2;
  397.     char tmp3[NAMESIZE+1];
  398.     for (int i=0; i<theNr-1; i++)
  399.         for (int j=0; j<theNr-1-i; j++)
  400.             if (pLager[j].antal>pLager[j+1].antal) {
  401.                 tmp=pLager[j].nr;
  402.                 tmp2 =pLager[j].antal;
  403.                 strcpy(tmp3,pLager[j].namn);
  404.                 pLager[j].nr=pLager[j+1].nr;
  405.                 pLager[j].antal=pLager[j+1].antal;
  406.                 strcpy(pLager[j].namn,pLager[j+1].namn);
  407.                 pLager[j+1].nr=tmp;
  408.                 pLager[j+1].antal=tmp2;
  409.                 strcpy(pLager[j+1].namn,tmp3);
  410.             }
  411. }
  412. void namnSort(Item *pLager, int theNr) { // Sorterar lagret i bokstavsordning
  413.     int tmp; int tmp2;
  414.     char tmp3[NAMESIZE+1];
  415.     for (int i=0; i<theNr-1; i++)
  416.         for (int j=0; j<theNr-1-i; j++)
  417.             if (strcmp(pLager[j].namn,pLager[j+1].namn) > 0){
  418.                 tmp=pLager[j].nr;
  419.                 tmp2 =pLager[j].antal;
  420.                 strcpy(tmp3,pLager[j].namn);
  421.                 pLager[j].nr=pLager[j+1].nr;
  422.                 pLager[j].antal=pLager[j+1].antal;
  423.                 strcpy(pLager[j].namn,pLager[j+1].namn);
  424.                 pLager[j+1].nr=tmp;
  425.                 pLager[j+1].antal=tmp2;
  426.                 strcpy(pLager[j+1].namn,tmp3);
  427.             }
  428. }
  429. void printMenu(void){ // Huvudmeny
  430.     printf("[Lager meny]\n");
  431.     printf("[r] - registrera\n");
  432.     printf("[w] - visa lagret\n");
  433.     printf("[s] - s\x94ka i lagret\n");
  434.     printf("[c] - \x84ndra saldo f\x94r en vara\n");
  435.     printf("[o] - ordna i lagret\n");
  436.     printf("[d] - ta bort en vara\n");
  437.     printf("[v] - varna f\x94r l\x86gt saldo\n");
  438.     printf("[k] - skriv ut delar av lagret till en txt fil\n");
  439.     printf("[p] - Lagerstatus\n");
  440.     printf("[m] - f\x94r att visa denna meny\n");
  441. }
  442. bool checkNr(Item *pLager, int theNr) { // Kollar om ett varunummer redan finns i lagret
  443.     int i; bool alrdyExist = false;
  444.     for (i=0;i<LAGERSIZE; i++) {
  445.         if (pLager[i].nr == theNr) {
  446.             alrdyExist = true;
  447.         }
  448.     }
  449.     return alrdyExist;
  450. }
Advertisement
Add Comment
Please, Sign In to add comment