#include <stdio.h>
#include <conio.h>
#include <string.h>
#define KOKO 100
FILE *f; //OSOITINMUUTTUJA TIEDOSTONKÄSITTELYÄ VARTEN
char TIEDOSTO[20];
//TIETUEMÄÄRITYS
typedef struct videokasettirekisteri
{
char nimi[20];
double hinta;
int numero;
}videokasettirekisteri;
//TIETUETAULUKON MÄÄRITYS
struct videokasettirekisteri taulu [KOKO];
//ALIOHJELMIEN ESITTELYT
void syota(videokasettirekisteri taulu[],int lkm);
void tulosta(videokasettirekisteri taulu[],int lkm);
void tallenna(videokasettirekisteri taulu[],int lkm);
int luetiedosto(videokasettirekisteri taulu[]);
void aakkos(videokasettirekisteri taulu[],int lkm);
void hakuNimella(videokasettirekisteri taulu[],int lkm);
int etsintaNimella(videokasettirekisteri taulu[],char kohde[10],int lkm);
void hakuNumerolla(videokasettirekisteri taulu[],int lkm);
int etsiNumerolla(videokasettirekisteri taulu[],int kohde,int lkm);
void muuta(videokasettirekisteri taulu[],int lkm);
int tarkista(videokasettirekisteri taulu[],int lkm,int numero);
//PÄÄOHJELMA
void main (void)
{
int toiminto=0;
int lkm=0;
while(toiminto!=9) //JOS TOIMINTO ON ERI SUURI KUIN 9 VALIKKO TULEE NÄKYVIIN AINA UUDELLEEN
{
//VALIKKO
printf("\n**********************************************\n");
printf("\n \n");
printf("\n 1. Syota elokuvan nimi \n");
printf("\n 2. Tulosta aakkosittain \n");
printf("\n 3. Hae nimella \n");
printf("\n 4. Hae elokuvan numerolla \n");
printf("\n 5. Muuta elokuvan tietoja \n");
printf("\n 9. Lopetus \n");
printf("\n \n");
printf("\n**********************************************\n");
printf("Valintasi on: ");
//LUETAAN KÄYTTÄJÄN VALIKOSTA VALITSEMA NUMERO MUUTTUJAAN
scanf("%d",&toiminto);
switch(toiminto)
{
case 1:
printf("Montako elokuvaa syotat: ");
scanf("%d",&lkm);
syota(taulu,lkm); //SYOTA ALIOHJELMAN KUTSU
break;
case 2:
//KUTSUTAAN ALIOHJELMIA
lkm=luetiedosto(taulu);
aakkos(taulu,lkm);
tulosta(taulu,lkm);
break;
case 3:
//KUTSUTAAN ALIOHJELMIA
lkm=luetiedosto(taulu);
hakuNimella(taulu,lkm);
break;
case 4:
//KUTSUTAAN ALIOHJELMIA
lkm=luetiedosto(taulu);
hakuNumerolla(taulu,lkm);
break;
case 5:
//KUTSUTAAN ALIOHJELMIA
lkm=luetiedosto(taulu);
muuta(taulu,lkm);
break;
case 9: break; //KUN VALITAAN VALIKOSTA 9,OHJELMA LOPETETAAN
default: printf("Valinta ei ole kaytettavissa!");
} //SULKU JOKA LOPETTAA SWITCH-TOIMINNON
} //SULKU JOKA LOPETTAA WHILE-TOIMINNON
printf("\n\n Paina ENTER ");
getch();
} //PÄÄOHJELMAN LOPETUSSULKU
//---------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA JOKA KYSYY ELOKUVAN NIMEÄ,HINTAA JA NUMEROA, JA LUKEE NE TIEDOSTOON
void syota(videokasettirekisteri taulu[],int lkm)
{
int i,numero;
for(i=0;i<lkm;i++)
{
printf("Anna elokuvan nimi: ");
scanf("%s",taulu[i].nimi);
printf("Anna elokuvan hinta: ");
scanf("%lf",&taulu[i].hinta);
printf("Anna elokuvan numero: ");
scanf("%d",&numero);
tarkista(taulu,lkm,numero);
} //for-SILMUKAN LOPETUSSULKU
tallenna(taulu,lkm); //KUTSUTAAN tallenna-ALIOHJELMAA
}
//----------------------------------------------------------------------------------------------------------------------
void tulosta(videokasettirekisteri taulu[],int lkm)
{
int i;
for(i=0;i<lkm;i++)
{
printf("\n%s : hinta %.2lf ja numero %d", taulu[i].nimi, taulu[i].hinta,taulu[i].numero);
} //for-SILMUKAN LOPETUSSULKU
}
//------------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA,JOKA TALLENTAA TIEDOT TIEDOSTOON
void tallenna(videokasettirekisteri taulu[],int lkm)
{
int i;
printf("Anna tiedoston nimi: ");
scanf("%s",TIEDOSTO);
//AVATAAN TIEDOSTO TALLENNUSTA VARTEN
if((f=fopen(TIEDOSTO,"ab"))==NULL)
//JOS AVAAMINEN EI ONNISTU,HERJATAAN
printf("Tiedoston avaaminen ei onnistu!");
else //MUUTOIN for-SILMUKASSA TALLENNETAAN TIEDOT TIEDOSTOON
{
for(i=0;i<lkm;i++)
{
fwrite(&taulu[i],sizeof taulu[i],1,f);
}
fclose(f);
}
}
//-----------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA JOKA LUKEE TIEDOSTOSTA JA AVAA TIEDOSTON
int luetiedosto(videokasettirekisteri taulu[])
{
int i=0;
printf("Anna avattavan tiedoston nimi: ");
scanf("%s",TIEDOSTO);
if((f=fopen(TIEDOSTO,"rb"))==NULL)
//JOS AVAAMINEN EI ONNISTU,HERJATAAN
printf("Tiedoston avaaminen ei onnistunut!");
else //MUUTOIN AVATAAN TIEDOSTO
{
while(!feof(f))
{
fread(&taulu[i],sizeof taulu[i],1,f);
i++;
}
}
fclose(f);
return(i-1);
}
//--------------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA LAJITTELEE ELOKUVAT AAKKOSJÄRJESTYKSEEN
void aakkos(videokasettirekisteri taulu[],int lkm)
{
int i, scan, min;
videokasettirekisteri temp;
for(i=0;i<lkm-1;i++)
{
min=i;
for(scan=i+1;scan<lkm;scan++)
{
if(strcmp(taulu[scan].nimi,taulu[min].nimi)<0)
min=scan;
}
temp=taulu[min];
taulu[min]=taulu[i];
taulu[i]=temp;
}
}
//---------------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA HAKEE ELOKUVAN TIEDOSTOSTA JA MIKÄLI LÖYTÄÄ SEN, TULOSTAA ELOKUVAN TIEDOT
void hakuNimella(videokasettirekisteri taulu[],int lkm)
{
char elokuva[10];
int paikka=0;
printf("Anna haettavan elokuvan nimi: ");
scanf("%s",elokuva);
paikka=etsintaNimella(taulu,elokuva,lkm); //KUTSUTAAN etsintaNimella-ALIOHJELMAA
if(paikka<0)
{
printf("Elokuvan tietoja ei ole!"); //ELLEI ELOKUVAA OLE TALLENNETTUNA TULOSTUU EO. TEKSTI
}
else
{
printf("Elokuvan nimi on %s, hinta on %.2lf ja elokuvan numero on %d",taulu[paikka].nimi,taulu[paikka].hinta,taulu[paikka].numero); //KUN ELOKUVA LÖYTTYY,TULOSTETAAN SEN TIEDOT
}
}
//---------------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA SUORITTAA HAUN ETSINNÄN JA PALAUTTAA TIEDON JOS SE LÖYTYY
int etsintaNimella(videokasettirekisteri taulu[],char kohde[10],int lkm)
{
int i=0;
int vertailu;
while(i<lkm)
{
vertailu=strcmp(kohde,taulu[i].nimi);
if(vertailu==0)
return(i); //ELOKUVA LÖYTYI JA PALATAAN hakuNimella-ALIOHJELMAAN
i++;
}
return(-1); //ELOKUVAA EI LÖYTYNYT,PALATAAN hakuNimella-ALIOHJELMAAN
}
//---------------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA SUORITTAA ELOKUVAN HAUN ELOKUVAN NUMERON PERUSTEELLA
void hakuNumerolla(videokasettirekisteri taulu[],int lkm)
{
int numero;
int paikka=0;
printf("Anna haettavan elokuvan numero:");
scanf("%d",&numero);
paikka=etsiNumerolla(taulu,numero,lkm); //etsiNumerolla-ALIOHJELMAN KUTSU
if(paikka<0)
{
printf("Elokuvaa ei loydy!"); //ELLEI ELOKUVAN TIETOJA LÖYDY,TULOSTUU EO. TEKSTI
}
else
{
printf("Elokuvan nimi on %s, elokuvan hinta on %.2lf ja elokuvan numero on %d",taulu[paikka].nimi,taulu[paikka].hinta,taulu[paikka].numero); //ELOKUVAN LÖYDYTTÄESSÄ TULOSTUU EO. TEKSTI
}
}
//---------------------------------------------------------------------------------------------------------------------------
//ALIOHJELMA SUORITTAA NUMERO HAUN ETSINNÄN JA PALAUTTAA LÖYTYVÄN TIEDON
int etsiNumerolla(videokasettirekisteri taulu[],int kohde,int lkm)
{
int i=0;
while(i<lkm)
{
if(kohde==taulu[i].numero)
return(i); //KOHDE LÖYTYI JA PALATAAN hakuNumerolla-ALIOHELMAAN
i++;
}
return(-1); //KOHDETTA EI LÖYTYNYT, PALATAAN hakuNumerolla-ALIOHJELMAAN
}
//--------------------------------------------------------------------------------------------------------------------------
void muuta(videokasettirekisteri taulu[],int lkm)
{
int paikka=0,i=0,numero;
printf("Anna muutettavan elokuvan numero: ");
scanf("%d",&numero);
while(i<lkm)
{
if(numero==taulu[i].numero)
{
printf("Tuotteen nimi on %s\n",taulu[i].nimi);
printf("Anna uusi nimi:");
scanf("%s",taulu[i].nimi);
printf("Hinta on %.2lf\n" ,taulu[i].hinta);
printf("Anna uusi hinta:");
scanf("%lf", &taulu[i].hinta);
if((f=fopen(TIEDOSTO, "wb"))==NULL)
printf("Tiedoston avaaminen ei onnistunut!");
else
{
for(i=0;i<lkm;i++)
{
fwrite(&taulu[i], sizeof taulu[i],1,f);
}
fclose(f);
}
paikka++;
}
i++;
}
printf("Elokuvan numero %d tiedot muutettiin",numero);
if(paikka==0)
{
printf("Taulukossa ei ole haettavaa elokuvaa!");
}
}
//-----------------------------------------------------------------------------------------------------------------------
int tarkista(videokasettirekisteri taulu[],int lkm,int numero)
{
int i=0;
while(i<lkm)
{
if(numero==taulu[i].numero)
{
printf("Numero on jo kaytossa!\n");
printf("Anna uusi numero:");
scanf("%d",&numero);
}
else
{
printf("Numero on vapaa ja hyvaksytaan!");
scanf("%d",&numero);
return(i);
}
i++;
}
}
//--------------------------------------------------------------------------------------------------------------------