Labb C

mail@pastecode.io avatar
unknown
c_cpp
a year ago
11 kB
2
Indexable
Never
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_VAROR 100
#define MAX_NAMN 20


/* Represententation för varje vara */
struct Vara {
    int varunummer;
    char namn[MAX_NAMN];
    int lagersaldo;
};

/* Registrera nya varor */
void registreraVaror(struct Vara varor[], int *antalVaror) {
    int varunummer;
    char namn[MAX_NAMN];
    int lagersaldo;

    printf("Registrera nya varor:\n");
    while (1) {
        printf("Ange varunummer (0 för avslut): ");
        scanf("%d", &varunummer);
        if (varunummer == 0) {
            break;
        }

        int uniktVarunummer = 1;
        for (int i = 0; i < *antalVaror; i++) {
            if (varor[i].varunummer == varunummer) {
                uniktVarunummer = 0;
                printf("Ej unikt nummer!\n");
                break;
            }
        }

        if (!uniktVarunummer) {
            continue;
        }

        printf("Ange namn: ");
        scanf(" %[^\n]", namn); // För att läsa in hela raden inklusive mellanslag

        printf("Ange saldo: ");
        scanf("%d", &lagersaldo);

        if (*antalVaror < MAX_VAROR) {
            varor[*antalVaror].varunummer = varunummer;
            strcpy(varor[*antalVaror].namn, namn);
            varor[*antalVaror].lagersaldo = lagersaldo;
            (*antalVaror)++;
        } else {
            printf("Lagret är fullt! Kan inte lägga till fler varor.\n");
            break;
        }
    }
}

/* Skriva ut alla varor */
void skrivUtAllaVaror(struct Vara varor[], int antalVaror) {
    printf("%-12s %-15s %10s\n", "Varunummer", "Namn", "Lagersaldo");
    printf("_____________________________________________\n");
    for (int i = 0; i < antalVaror; i++) {
        printf("%-12d %-15s %10d\n", varor[i].varunummer, varor[i].namn, varor[i].lagersaldo);
    }
}


/* Sökning efter varor genom namn */
void sokVaraNamn(struct Vara varor[], int antalVaror) {
    char sokstr[MAX_NAMN];
    printf("Ange söksträng: ");
    scanf(" %[^\n]", sokstr); 

    printf("Varunummer Namn       Lagersaldo\n");
    printf("_________________________________\n");
    for (int i = 0; i < antalVaror; i++) {
        if (strstr(varor[i].namn, sokstr) != NULL) {
            printf("%-12d %-15s %10d\n", varor[i].varunummer, varor[i].namn, varor[i].lagersaldo);
        }
    }
}

/* Sökning efter varor genom varunummer */
void sokVaraNummer(struct Vara varor[], int antalVaror) {
    int varunummer;
    printf("Ange varunummer: ");
    scanf("%d", &varunummer);

    int hittad = 0;
    for (int i = 0; i < antalVaror; i++) {
        if (varor[i].varunummer == varunummer) {
            printf("Varunummer Namn       Lagersaldo\n");
            printf("_________________________________\n");
            printf("%-12d %-15s %10d\n", varor[i].varunummer, varor[i].namn, varor[i].lagersaldo);
            hittad = 1;
            break;
        }
    }

    if (!hittad) {
        printf("Ingen vara med angivet varunummer hittades.\n");
    }
}

/* Sökning efter varor genom lagersaldo */
void sokVaraSaldo(struct Vara varor[], int antalVaror) {
    int saldo;
    printf("Ange lagersaldo: ");
    scanf("%d", &saldo);

    printf("Varunummer Namn       Lagersaldo\n");
    printf("_________________________________\n");
    for (int i = 0; i < antalVaror; i++) {
        if (varor[i].lagersaldo == saldo) {
            printf("%-12d %-15s %10d\n", varor[i].varunummer, varor[i].namn, varor[i].lagersaldo);
        }
    }
}

/* Ändring av lagersaldot */
void andraLagersaldo(struct Vara varor[], int antalVaror) {
    int varunummer, andring;
    printf("Ange varunummer: ");
    scanf("%d", &varunummer);

    int hittad = 0;
    for (int i = 0; i < antalVaror; i++) {
        if (varor[i].varunummer == varunummer) {
            printf("Nuvarande lagersaldo för %s är %d\n", varor[i].namn, varor[i].lagersaldo);
            printf("Ange ökning/minskning av lagersaldo: ");
            scanf("%d", &andring);

            varor[i].lagersaldo += andring;
            if (varor[i].lagersaldo < 0) {
                printf("Varning: Lagersaldo kan inte vara mindre än 0! Lagersaldo sätts till 0.\n");
                varor[i].lagersaldo = 0;
            }

            printf("Lagersaldo för %s uppdaterat till %d\n", varor[i].namn, varor[i].lagersaldo);
            hittad = 1;
            break;
        }
    }

    if (!hittad) {
        printf("Ingen vara med angivet varunummer hittades.\n");
    }
}

/* Sortera varor - varunummer */
int varunummerSorter(const void *vara1, const void *vara2) {
    return ((struct Vara *)vara1)->varunummer - ((struct Vara *)vara2)->varunummer;
}

/* sortera varor genom namn */
int namnSorter(const void *vara1, const void *vara2) {
    return strcmp(((struct Vara *)vara1)->namn, ((struct Vara *)vara2)->namn);
}

/* Sortera varor genom lagersaldo */
int saldoSorter(const void *vara1, const void *vara2) {
    return ((struct Vara *)vara1)->lagersaldo - ((struct Vara *)vara2)->lagersaldo;
}

/* avregistrera varor */
void avregistreraVaror(struct Vara varor[], int *antalVaror) {
    int varunummer;
    printf("Ange varunummer för vara att avregistrera: ");
    scanf("%d", &varunummer);

    int hittad = 0;
    for (int i = 0; i < *antalVaror; i++) {
        if (varor[i].varunummer == varunummer) {
            // Flytta alla varor efter den som ska tas bort ett steg bakåt i arrayen
            for (int j = i; j < *antalVaror - 1; j++) {
                varor[j] = varor[j + 1];
            }
            (*antalVaror)--;
            printf("Vara med varunummer %d har tagits bort ur registret.\n", varunummer);
            hittad = 1;
            break;
        }
    }

    if (!hittad) {
        printf("Ingen vara med angivet varunummer hittades.\n");
    }
}

/* Sökning efter varor med saldo <= angiven siffra */
void varningLagersaldo(struct Vara varor[], int antalVaror) {
    int saldo;
    printf("Ange ett saldo: ");
    scanf("%d", &saldo);

    printf("Varunummer Namn       Lagersaldo\n");
    printf("_________________________________\n");
    for (int i = 0; i < antalVaror; i++) {
        if (varor[i].lagersaldo <= saldo) {
            printf("%-12d %-15s %10d\n", varor[i].varunummer, varor[i].namn, varor[i].lagersaldo);
        }
    }
}

/* Spara varor */
void sparaVarorTillFil(struct Vara varor[], int antalVaror) {
    char filnamn[100];
    printf("Ange filnamn: ");
    scanf("%s", filnamn);

    FILE *fil = fopen(filnamn, "w");
    if (fil != NULL) {
        for (int i = 0; i < antalVaror; i++) {
            fprintf(fil, "%d %s %d\n", varor[i].varunummer, varor[i].namn, varor[i].lagersaldo);
        }
        fclose(fil);
        printf("Varor sparade till filen '%s'.\n", filnamn);
    } else {
        printf("Kunde inte öppna filen för skrivning.\n");
    }
}

int main() {
    struct Vara varor[MAX_VAROR];
    int antalVaror = 0;

    /* Läs in varor från fil om den finns */
    FILE *fil = fopen("varor.txt", "r");
    if (fil != NULL) {
        while (fscanf(fil, "%d %s %d", &varor[antalVaror].varunummer, varor[antalVaror].namn, &varor[antalVaror].lagersaldo) == 3) {
            antalVaror++;
        }
        fclose(fil);
    }

    int val;
    while (1) {
        printf("\nHuvudmeny:\n");
        printf("1. Registrera nya varor\n");
        printf("2. Skriva ut alla varor\n");
        printf("3. Söka efter varor\n");
        printf("4. Ändra lagersaldo för varor\n");
        printf("5. Sortera varor\n");
        printf("6. Avregistrera varor\n");
        printf("7. Varning - Visa varor med lågt saldo\n");
        printf("8. Spara varor till fil\n");
        printf("9. Avsluta programmet\n");
        printf("Välj ett alternativ: ");
        scanf("%d", &val);

        switch (val) {
            case 1:
                registreraVaror(varor, &antalVaror);
                break;
            case 2:
                skrivUtAllaVaror(varor, antalVaror);
                break;
            case 3:
                printf("Sökalternativ:\n");
                printf("1. Sök efter varor baserat på namn\n");
                printf("2. Sök efter varor baserat på varunummer\n");
                printf("3. Sök efter varor baserat på lagersaldo\n");
                printf("4. Återgå till huvudmenyn\n");
                printf("Välj ett sökalternativ: ");
                scanf("%d", &val);

                switch (val) {
                    case 1:
                        sokVaraNamn(varor, antalVaror);
                        break;
                    case 2:
                        sokVaraNummer(varor, antalVaror);
                        break;
                    case 3:
                        sokVaraSaldo(varor, antalVaror);
                        break;
                    case 4:
                        // Huvudmeny
                        break;
                    default:
                        printf("Ogiltigt val. Försök igen.\n");
                        break;
                }
                break;
            case 4:
                andraLagersaldo(varor, antalVaror);
                break;
            case 5:
                printf("Sorteringsalternativ:\n");
                printf("1. Sortera varor baserat på varunummer\n");
                printf("2. Sortera varor baserat på namn\n");
                printf("3. Sortera varor baserat på lagersaldo\n");
                printf("4. Återgå till huvudmenyn\n");
                printf("Välj ett sorteringsalternativ: ");
                scanf("%d", &val);

                switch (val) {
                    case 1:
                        qsort(varor, antalVaror, sizeof(struct Vara), varunummerSorter);
                        break;
                    case 2:
                        qsort(varor, antalVaror, sizeof(struct Vara), namnSorter);
                        break;
                    case 3:
                        qsort(varor, antalVaror, sizeof(struct Vara), saldoSorter);
                        break;
                    case 4:
                        // Huvudmeny
                        break;
                    default:
                        printf("Ogiltigt val. Försök igen.\n");
                        break;
                }
                break;
            case 6:
                avregistreraVaror(varor, &antalVaror);
                break;
            case 7:
                varningLagersaldo(varor, antalVaror);
                break;
            case 8:
                sparaVarorTillFil(varor, antalVaror);
                break;
            case 9:
                // Spara varor 
                fil = fopen("varor.txt", "w");
                if (fil != NULL) {
                    for (int i = 0; i < antalVaror; i++) {
                        fprintf(fil, "%d %s %d\n", varor[i].varunummer, varor[i].namn, varor[i].lagersaldo);
                    }
                    fclose(fil);
                } else {
                    printf("Kunde inte spara till filen.\n");
                }

                printf("Avslutar programmet...\n");
                return 0;
            default:
                printf("Ogiltigt val. Försök igen.\n");
                break;
        }
    }

    return 0;
}