#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