Labb C
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; }