miyago icon

labb3 lager

miyago | PRO | 03/08/18 11:54:07 AM UTC | 0 ⭐ | 402 👁️ | Never ⏰ | []
C |

15.46 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "funktioner.h"
 
#define NAMESIZE 20
#define LAGERSIZE 10
 
 
Item aItem(int myNr, char myNamn[], int myAntal);
Item newItem(void);
void addItem(Item *pLager, int *counter, Item itamz);
void openLager(Item pLager[],int *pitems, char aFile[]);
void backupLager(Item pLager[],int fitems, char aFile[]);
void printItem(Item *pItem);
void printLager(Item *pLager, int fitems);
void setAntal(Item *pLager, int Antalet);
void printAntal(Item *pLager, int fitems, int theNr);
void delItem(Item *pLager, int *counter, int theNr);
void changeItemSaldo(Item *pLager, int fitems, int theNr, int saldot);
void findNr(Item *pLager, int fitems, int theNr);
void writeNr(Item *pLager, int fitems, int theNr, char aFile[]);
void writeNamn(Item *pLager, int fitems, char *theNamn, char aFile[]);
void writeSaldo(Item *pLager, int fitems, int theNr, char aFile[]);
void findAntal(Item *pLager, int fitems, int theNr);
void findNamn(Item *pLager, int fitems, char *theNamn);
void nrSort(Item *pLager, int theNr);
void antalSort(Item *pLager, int theNr);
void namnSort(Item *pLager, int theNr);
void printMenu(void);
bool checkNr(Item *pLager, int theNr);
 
int main(int argc, char **argv) {
    Item Lager[LAGERSIZE+1];
    char ch1[3];
    char ch2[2];
    char ch3[3];
    char ch4[3];
    int items = 0;
    int aTal = 0;
    char aaTal[4];
    int aSaldo = 0;
    char aNamn[NAMESIZE+1];
    char filen[NAMESIZE+1];
    printf("V\x84lkommen till lagret!\n");
    printf("Tyv\x84rr \x84r detta programmet endast optimerat f\x94r anv\x84ndning av gemener.\n");
    printf("Versaler anv\x84nds p\x86 egen risk\n");
    printf("Skriv in filnamnet p\x86 den fil inneh\x86llande ditt lager: ");
    gets(filen);
    openLager(Lager, &items, filen);
    printMenu();
    do {
        printf("Ditt val: ");
        gets(ch1);
        switch (ch1[0]) {
            case 'r' :  printf("Registrera varor?\n");
                    do {
                        if (items != LAGERSIZE) {
                        addItem(Lager, &items, newItem()); // Registrera ny vara
                        printf("y f\x94r att forts\x84tta");
                        gets(aaTal);
                    } else {
                        printf("Lagret \x84r fullt! [%d/%d]\n", items, LAGERSIZE);
                        break;
                    }
                    } while (aaTal[0] == 'y');
                    break;
            case 'w' :  printLager(Lager, items); break; // Visa alla varor
            case 's' :  do {
                        printf("S\x94k efter varor p\x86 [i] - varunummer, [n] - varunamn, [s] - saldo. q f\x94r att avsluta\n\n");
                        gets(ch2);
                        switch (ch2[0]) {
                            case 'i' :  gets(aaTal);
                                aTal = atoi(aaTal); 
                                findNr(Lager, items, aTal); 
                                break;
                            case 'n' :  gets(aNamn); 
                                findNamn(Lager, items, aNamn); 
                                break;
                            case 's' :  gets(aaTal); 
                                aTal = atoi(aaTal);
                                findAntal(Lager, items, aTal); 
                                break;
                    }
                    } while (ch2[0] != 'q');
                        break;
            case 'c' :  printf("Type in the itemnumber for the item you want to change saldo: ");
                        gets(aaTal);
                        aTal = atoi(aaTal);
                        printf("Nytt saldo:");
                        gets(aaTal);
                        aSaldo= atoi(aaTal);
                        changeItemSaldo(Lager, items, aTal, aSaldo); 
                        break;// Ändra lagersaldot för varor
            case 'o' :  printf("Sortera varor. [i] efter varunummer. [n] efter namn och [s] efter saldo: ");
                        gets(ch3);
                        switch (ch3[0]) {
                            case 's' :  antalSort(Lager, items); 
                                        printf("Sorterat efter saldo\n"); 
                                        break;
                            case 'i' :  nrSort(Lager, items); 
                                        printf("Sorterat efter varunummer\n"); 
                                        break;                    
                            case 'n' :  namnSort(Lager, items); 
                                        printf("Sorterat i bokstavsordning\n"); 
                                        break;
                        }
                        break;
            case 'd' :  printf("Ange varunummer f\x94r den vara du vill ta bort: ");
                        gets(aaTal);
                        aTal = atoi(aaTal);
                        delItem(Lager, &items, aTal);
                        break; // Avregistrera varor
            case 'v' :  gets(aaTal);
                        aTal = atoi(aaTal);
                        printAntal(Lager, items, aTal); 
                        break; // Varning för lågt saldo
            case 'k' :  printf("S\x94k och skriva ut varor till fil. [i] efter varunummer. [n] efter namn och [s] efter saldo: ");
                        gets(ch4);
                        switch(ch4[0]) {
                            case 'i' :  printf("Skriv in varunumret: ");
                                        gets(aaTal);
                                        aTal = atoi(aaTal);
                                        printf("Skriv in filnamnet p\x86 den filen du vill spara i: "); 
                                        gets(filen); 
                                        writeNr(Lager, items, aTal, filen);
                                        break;
                            case 'n' :  printf("S\x94k p\x86 namn: ");
                                        gets(aaTal);
                                        printf("Skriv in filnamnet p\x86 den filen du vill spara i: "); 
                                        gets(filen);
                                        writeNamn(Lager, items, aaTal, filen);
                                        break;
                            case 's' :  printf("S\x94k p\x86 saldo: ");
                                        gets(aaTal);
                                        aTal = atoi(aaTal);
                                        printf("Skriv in filnamnet p\x86 den filen du vill spara i: "); 
                                        gets(filen); 
                                        writeSaldo(Lager, items, aTal, filen);
                                        break;
                        } break;
            case 'p' :  printf("[%d] / %d\n", items, LAGERSIZE); break;
            case 'm' :  printMenu(); break; 
            case 'q' :  printf("Du har tryckt f\x94r att avsluta. Ange filnamnet du vill spara lagret till: "); 
                        gets(filen); 
                        backupLager(Lager, items, filen);
                        break;
        }
    } while (ch1[0] != 'q');
        printf("P\x86 \x86terseende");
    
 
    
    return 0;
}
 
void openLager(Item pLager[],int *pitems, char aFile[]) { // Läser in ett lager från en fil
    FILE *pFile;
    printf("-[L\x84ser in filen]-\n");
    if ((pFile=fopen(aFile,"r"))) {
        while (fscanf(pFile, "%d %s %d", 
        &pLager[*pitems].nr, 
        pLager[*pitems].namn, 
        &pLager[*pitems].antal)==3 && *pitems < LAGERSIZE) {
            (*pitems)++;
        }
    } else {
        printf("Ingen fil med det namnet hittade\n");
    }
    fclose(pFile);
    printf("Lagret laddat med [ %d ] varor\n", *pitems);
}
void backupLager(Item pLager[],int fitems, char aFile[]) { // Skriver lagret till en fil
    FILE *pFile;
    printf("L\x84ser in filen\n");
    if ((pFile=fopen(aFile,"w"))) {
        for (int i=0; i<fitems; i++) 
            fprintf(pFile, "%d %s %d\n", 
            pLager[i].nr, 
            pLager[i].namn, 
            pLager[i].antal);
        } else {
        printf("Something went wrong!\n");
    }
    fclose(pFile);
    printf("Lagret skriven till filen: %s\n", aFile);
}
void printItem(Item *pItem){ // Skriver ut en vara
    printf("%03d\t\t", pItem->nr);
    printf("%-20s\t", pItem->namn);
    printf("%5d\n", pItem->antal);
}
void printLager(Item *pLager, int fitems) { // Skriver ut hela lagret
        printf("Nr\t\tNamn\t\t\tSaldo\n");
        printf("---------------------------------------------\n");
        for (int i=0;i<fitems;i++){
            printItem(&pLager[i]);
    }
}
Item aItem(int myNr, char myNamn[], int myAntal) { // Skapar en ny vara
    Item aItem;
    aItem.nr = myNr;
    strcpy(aItem.namn, myNamn);
    aItem.antal = myAntal;
    return aItem;
}
 
void addItem(Item *pLager, int *counter, Item itamz){ // Läger till en vara i lagret
    bool check;
    check = checkNr(pLager, itamz.nr);
        if (check == false){
            pLager[(*counter)++] = itamz;
            } else {
            printf("Varunummer m\x86ste vara unikt!\n");
            return;
        }
            
}
void setAntal(Item *pLager, int Antalet){ // Mutator för saldo
    pLager->antal = Antalet;
}
void printAntal(Item *pLager, int fitems, int theNr) { // Skriver ut varor på skärmen med saldo X eller lägre
        printf("Visar varor med antal %d eller mindre\n", theNr);
        printf("---------------------\n");
        for (int i=0;i<fitems;i++){
         if (pLager[i].antal <= theNr){
            printItem(&pLager[i]);
            }
    }
}
void delItem(Item *pLager, int *counter, int theNr) { // Tar bort en vara
    int i; bool check;
    check = checkNr(pLager, theNr);
    if (check == true) {
        printf("Tar bort varan med varunummer %d\n", theNr);
        printf("---------------------\n");
        for (i=0;i<LAGERSIZE;i++){
         if (pLager[i].nr == theNr){
            pLager[i].nr = 0;
            (*counter)--;
            for (i=0;i<LAGERSIZE;i++){
                if(pLager[i].nr == 0){
                    pLager[i].nr = pLager[i+1].nr;
                    pLager[i+1].nr = 0;
                }
            }
         }
        }
    } else {
        printf("Ogilitigt varunummer!\n");
        return;
    }
}
void changeItemSaldo(Item *pLager, int fitems, int theNr, int saldot) { // Ändrar saldo på en vara
    int i; bool check;
        check = checkNr(pLager, theNr);
        if(check == true) {
            printf("\x8Endrar varanummer %d's saldo till %d\n", theNr, saldot);
            printf("---------------------\n");
            for (i=0;i<fitems;i++){
                if (pLager[i].nr == theNr) {
                    setAntal(pLager, saldot);
                }
            }
        } else {
            printf("Ogiltigt varunummer!");
            return;
        }
}
void findNr(Item *pLager, int fitems, int theNr) { // Söker efter en varu med ett vist varunummer
        printf("Visar varor med varunummer %d\n", theNr);
        printf("---------------------\n");
        for (int i=0;i<fitems;i++){
         if (pLager[i].nr == theNr){
            printItem(&pLager[i]);
            }
    }
}
void writeNr(Item *pLager, int fitems, int theNr, char aFile[]) { // Skriver ut en vara med ett visst varunummer
        printf("---------------------\n");
        int i; bool check; FILE *pFile;
        check = checkNr(pLager, theNr);
        if (check == true) {
            printf("[-L\x84ser in filen]-\n");
            if ((pFile=fopen(aFile,"w"))) {
                for (i=0; i<fitems; i++){
                    if (pLager[i].nr == theNr){
                        fprintf(pFile, "%d %s %d\n", 
                                        pLager[i].nr, 
                                        pLager[i].namn, 
                                        pLager[i].antal);
                        printf("Skriver ut vara med varunummer %d till %s\n", theNr, aFile); 
                    }
                }
            } else {
                printf("Something went wrong!\n");
                    }
        } else { 
            printf("Ogiltigt varunummer!");
            return;
        }
    fclose(pFile);
    
}
void writeNamn(Item *pLager, int fitems, char *theNamn, char aFile[]) { // Skriver ut varor efter namn
        printf("---------------------\n");
    FILE *pFile;
    printf("-[L\x84ser in filen]-\n");
    if ((pFile=fopen(aFile,"w"))) {
        for (int i=0; i<fitems; i++){
            if (strstr(pLager[i].namn, theNamn) != NULL){
            fprintf(pFile, "%d %s %d\n", 
            pLager[i].nr, 
            pLager[i].namn, 
            pLager[i].antal);
            }
            printf("Skriver ut varor med varunamn matchande %s till %s\n", theNamn, aFile);
        }
        } else {
        printf("Something went wrong!\n");
    }
    fclose(pFile);
}
void writeSaldo(Item *pLager, int fitems, int theNr, char aFile[]) { // Skriver ut varor med ett visst saldo
        printf("---------------------\n");
    FILE *pFile;
    printf("-[L\x84ser in filen]-\n");
    if ((pFile=fopen(aFile,"w"))) {
        for (int i=0; i<fitems; i++) {
            if (pLager[i].antal == theNr){
            fprintf(pFile, "%d %s %d\n", 
            pLager[i].nr, 
            pLager[i].namn, 
            pLager[i].antal);
        }
        
        }
        printf("Skriver ut alla varor med saldo %d till filen %s\n", theNr, aFile); 
        } else {
        printf("Something went wrong!\n");
        }
    fclose(pFile);
}
void findAntal(Item *pLager, int fitems, int theNr) { // Sök på saldo
        printf("Visar varor med antal %d\n", theNr);
        printf("---------------------\n");
        for (int i=0;i<fitems;i++){
         if (pLager[i].antal == theNr){
            printItem(&pLager[i]);
            }
    }
}
void findNamn(Item *pLager, int fitems, char *theNamn) { // Sök på varunamn 
        printf("Visar varor som inneh\x86ller s\x94kordet %s\n", theNamn);
        printf("---------------------\n");
        for (int i=0;i<fitems;i++){
         if (strstr(pLager[i].namn, theNamn) != NULL){
            printItem(&pLager[i]);
         }
}
}
void nrSort(Item *pLager, int theNr) { // Sorterar lagret efter varunummer
    int tmp; int tmp2;
    char tmp3[NAMESIZE+1];
    for (int i=0; i<theNr-1; i++)
        for (int j=0; j<theNr-1-i; j++)
            if (pLager[j].nr>pLager[j+1].nr) {
                tmp=pLager[j].nr;
                tmp2 =pLager[j].antal;
                strcpy(tmp3,pLager[j].namn);
                pLager[j].nr=pLager[j+1].nr;
                pLager[j].antal=pLager[j+1].antal;
                strcpy(pLager[j].namn,pLager[j+1].namn);
                pLager[j+1].nr=tmp;
                pLager[j+1].antal=tmp2;
                strcpy(pLager[j+1].namn,tmp3);
            }
}
void antalSort(Item *pLager, int theNr) { // Sorterar lagret efter saldo
    int tmp; int tmp2;
    char tmp3[NAMESIZE+1];
    for (int i=0; i<theNr-1; i++)
        for (int j=0; j<theNr-1-i; j++)
            if (pLager[j].antal>pLager[j+1].antal) {
                tmp=pLager[j].nr;
                tmp2 =pLager[j].antal;
                strcpy(tmp3,pLager[j].namn);
                pLager[j].nr=pLager[j+1].nr;
                pLager[j].antal=pLager[j+1].antal;
                strcpy(pLager[j].namn,pLager[j+1].namn);
                pLager[j+1].nr=tmp;
                pLager[j+1].antal=tmp2;
                strcpy(pLager[j+1].namn,tmp3);
            }
}
void namnSort(Item *pLager, int theNr) { // Sorterar lagret i bokstavsordning
    int tmp; int tmp2;
    char tmp3[NAMESIZE+1];
    for (int i=0; i<theNr-1; i++)
        for (int j=0; j<theNr-1-i; j++)
            if (strcmp(pLager[j].namn,pLager[j+1].namn) > 0){
                tmp=pLager[j].nr;
                tmp2 =pLager[j].antal;
                strcpy(tmp3,pLager[j].namn);
                pLager[j].nr=pLager[j+1].nr;
                pLager[j].antal=pLager[j+1].antal;
                strcpy(pLager[j].namn,pLager[j+1].namn);
                pLager[j+1].nr=tmp;
                pLager[j+1].antal=tmp2;
                strcpy(pLager[j+1].namn,tmp3);
            }
}
bool checkNr(Item *pLager, int theNr) { // Kollar om ett varunummer redan finns i lagret
    int i; bool alrdyExist = false;
    for (i=0;i<LAGERSIZE; i++) {
        if (pLager[i].nr == theNr) {
            alrdyExist = true;
        }
    }
    return alrdyExist;
}

Comments