rendered paste body/********************************************************** Tekijät: ** Jaakko Reinman 000001 TIE07 ** Joni Lehmuksela 000002 TIE07 ** Juho Peltonen 000003 TIE07 ** Ohjelmaversio: 1.5 ** jne. ** ***********************************************************///Luokkakirjastot#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>#include <windows.h>//Definet#define MAX_PITUUS 50#define INT_MAX 65535#define ANNAINT_MIN -1#define ANNAINT_MAX INT_MAX#define ANNADOUBLE_MIN 0#define ANNADOUBLE_MAX INT_MAX#define BUF_KOKO 50#define TAVARAT_KOKO 100//Tietueettypedef struct tavara{ char nimi[MAX_PITUUS+1]; double hinta; long kpl;}Tavara;//Globaalit tietotyypit ja muuttujat//muutamia funktioiden muuttujia on täällä //--> optimointia, kun ei tarvitse joka kohdassa uudelleenmääritellä//Samalla opimme, että globaalien muuttujien kanssa on oltava varovainen ;)//esim. yhteinen int i; on vaarallinen, kun kutsutaan funktioita toisten sitällä.Tavara tavarat[TAVARAT_KOKO] = {0};int temp=0;int ok=0;char puskuri[MAX_PITUUS+1];char vastaus;double yhthinta=0;int yhtmaara=0;//Funktioiden esittelytvoid trim(char* s);void annaIntLuku(int* luku); //haluaa muuttujan osoitteenvoid annaDoubleLuku(double* luku); //haluaa muuttujan osoitteenvoid annaTeksti(char* merkkijono); //haluaa muuttujan osoitteenint vertaa(char* jono1, char* jono2); //haluaa vertailtavien muuttujien osoitteetvoid lataus(); //testimielessävoid paavalikko();void tulostus(Tavara* tuote);int valinta_KE();int lisays(Tavara tavarat[]);int poista(Tavara tavarat[]);void lopetus(void);//****************************************pääfunktio**************************************void main(void){ lataus(); paavalikko(); lopetus();} // ***************************************************************************************//Funktioiden määrittelyt//Tehtävänannossa annettu funktio, "trimmaa" merkkijonon alusta tyhjät merkit poisvoid trim(char* s){ char* p; for(p=s; *p && isspace(*p); p++); if (p>s) strcpy(s,p); for(p=s+strlen(s); p>s && (isspace(*p) || *p=='\0'); p--) *p='\0';}//annaIntLuku pyytää käyttäjältä kokonaisluvun ja sisältää syötteen virheentarkistuksen//haluaa muuttujan osoitteenvoid annaIntLuku(int* luku){ //char puskuri[20]; ok=0; temp=0; do //kysytään kokonaislukua { fgets(puskuri,20,stdin); ok=sscanf(puskuri,"%d",&temp); fflush(stdin); if(ok<1) printf("Virheellinen syote, yrita uudelleen!\n"); if(temp<ANNAINT_MIN || temp>ANNAINT_MAX ) { printf("Anna luku alueelta %d - %d :",ANNAINT_MIN,ANNAINT_MAX); ok=0; } }while(ok<1); *luku=temp; //tallennetaan vasta kunnollinen arvo}//annaDoubleLuku pyytää käyttäjältä desimaaliluvun ja sisältää syötteen virheentarkistuksen//haluaa muuttujan osoitteenvoid annaDoubleLuku(double* luku){ //char puskuri[20]; double temp2=0; ok=0; do //kysyt\x84\x84n desimaalilukua { fgets(puskuri,20,stdin); ok=sscanf(puskuri,"%lf",&temp2); fflush(stdin); if(ok<1) printf("Virheellinen sy\x94te, yrit\x84 uudelleen!\n"); if(temp2<ANNADOUBLE_MIN || temp2>ANNADOUBLE_MAX) { printf("Anna luku alueelta %d - %d :",ANNADOUBLE_MIN,ANNADOUBLE_MAX); ok=0; } }while(ok<1); *luku=temp2; //tallennetaan vasta kunnollinen arvo}//annaTeksti pyytää käyttältä syötteen, joka on maksimissaan 50 merkkiä pitkä//haluaa muuttujan osoitteenvoid annaTeksti(char* merkkijono){ //char puskuri[MAX_PITUUS+1]; ok=0; do { fgets(puskuri,MAX_PITUUS,stdin); fflush(stdin); trim(puskuri); if( strlen(puskuri)==0 ) printf("Nimi ei kelpaa, anna uusi nimi:"); //else //{ // printf("Annoit: %s. \nHyväksytäänkö? (k/e)",puskuri); // vastaus=_getch(); // fflush(stdin); // if(vastaus == 'k') // ok=1; // else // printf("\nAnna nimi: "); //} }while(ok!=1); strncpy(merkkijono,puskuri,MAX_PITUUS);}//Vertailee kahta merkkijonoa. Jos jonot ovat samat, palautetaan 1, muutoin 0//haluaa vertailtavien muuttujien osoitteetint vertaa(char* jono1, char* jono2){ int i; int pituus1=strlen(jono1); temp=strlen(jono2); if( pituus1 == temp ) { for(i=0;i<pituus1;i++) { if( tolower(jono1[i])==tolower(jono2[i]) ) ; else return 0; } return 1; } return 0;}void lataus() //testimielessä{ printf("\nLataus\n"); _getch();}void paavalikko(){ temp=0; do { system("cls"); printf("\n*****P\x84\x84valikko*****\n"); printf("1. Lis\x84\x84 tavara\n"); printf("2. Poista tavara\n"); printf("3. Tulosta kaikki tavarat ruudulle\n"); printf("4. Lataa tiedostosta\n"); printf("5. Tallenna tiedostoon\n"); printf("9. Lopetus\n"); printf(": "); annaIntLuku(&temp); if(temp<0 || temp>9) printf("Virheellinen sy\x94te, yrit\x84 uudelleen!\n"); switch(temp) { case 1: if( lisays(tavarat) ) printf("\nLis\x84ys suoritettu."); else printf("\nTaulukko t\x84ynn\x84, lis\x84yst\x84 ei tehty."); _getch(); break; case 2: poista(tavarat); _getch(); break; case 3: tulostus(tavarat); _getch(); break; case 4: printf("4. Lataa tiedostosta\n"); _getch(); break; case 5: printf("5. Tallenna tiedostoon\n"); _getch(); break; } }while(temp !=9);}// Tulostusfunktio TOIMII VAIN ALLE 7 MERKIN NIMILLÄ, ALLE 100 HINNOILLA JA ALLE 6 MÄÄRILLÄ// MITÄ KEKSITÄÄN???void tulostus(Tavara* tuote){ int i; double yhthinta=0; int yhtmaara=0; printf("nimi \t\t hinta \t m\x84\x84r\x84\n"); // Tulostetaan otsikot printf("============= \t ===== \t =====\n"); // Tulostetaan ensimmäiset väliviivat for(i=0;i<TAVARAT_KOKO;i++) // Käydään läpi taulukko ja tulostetaan vain niiden alkioiden sisältö, joilla on nimi (=ei ole tyhjä) { if( strcmp(tuote[i].nimi,"")!=0) { printf("%s \t\t %2.2f \t %5d\n",tuote[i].nimi,tuote[i].hinta,tuote[i].kpl); yhtmaara += tuote[i].kpl; // Lasketaan samalla Yhteensä -rivin arvot yhthinta += tuote[i].kpl * tuote[i].hinta; } } printf("============= \t ===== \t =====\n"); // Tulostetaan toiset väliviivat printf("Yhteens\x84: \t %2.2f \t %5d\n",yhthinta,yhtmaara); // Tulostetaan Yhteensä -rivi}//lisays()-funktion käyttämä härpäkeint valinta_KE(){ char c; do { c = tolower(getch()); if(c == 'k') return 1; else if(c == 'e') return 0; } while(c != 'k'||c != 'e');}int lisays(Tavara tavarat[]){ int i; double hinta; int kpl; int vanha = 0; temp=0; printf("Anna tavaran nimi: "); annaTeksti(puskuri); for(i=0; i<TAVARAT_KOKO; i++) { if(vertaa(tavarat[i].nimi, puskuri)) { vanha = 1; //Vanha nimi break; } } if(vanha==0) // Ei ole vanha nimi.(eli se on uusi...) Etsitään tyhjä paikka. { for(i=0; i<TAVARAT_KOKO; i++) //Onko käytössä? { if(strcmp(tavarat[i].nimi,"") == 0) //Ei ole käytössä { break; } if(i == TAVARAT_KOKO) //Kaikki paikat käytössä: palautetaan 0 { printf("Tavaralista on t\x84ynn\x84!\n"); return 0; } } } strcpy(tavarat[i].nimi, puskuri); if(vanha) { printf("Muutetaanko hintaa? (k/e) Vanha hinta on %lf\n", tavarat[i].hinta); temp = valinta_KE(); } if(vanha==0 || temp) { printf("\nAnna tuotteen hinta: "); annaDoubleLuku(&tavarat[i].hinta); } temp = 0; if(vanha) { printf("Muutetaanko kappalem\x84\x84r\x84\x84? (k/e) Vanha m\x84\x84r\x84 on %d\n",tavarat[i].kpl); temp = valinta_KE(); } if(vanha==0 || temp) { printf("Anna tuotteiden m\x84\x84r\x84: "); annaIntLuku(&tavarat[i].kpl); } return 1;}int poista(Tavara tavarat[]){ int i; printf("Anna poistettavan tavaran nimi: "); annaTeksti(puskuri); for(i=0; i<TAVARAT_KOKO; i++) { if(vertaa(tavarat[i].nimi, puskuri)) { strcpy(tavarat[i].nimi, ""); printf("\nPoisto onnistui!\n"); return 1; } } printf("\nPoisto ep\x84onnistui"); return 0;}void lopetus(void){ char osa1[] = {"Kiitos k\x84nnist"}; char osa2[] = {"ynnist\x84"}; int i; for(i=0; i<strlen(osa1); i++) { putchar(osa1[i]); Sleep(100); } Sleep(200); for(i=0; i<5; i++) //poistetaan 5 merkkiä { Sleep(500); putchar('\x08'); //Mene yksi merkki taakepäin. putchar('\x20'); //Tee välilyönti. putchar('\x08'); //Taas taaksepäin. } Sleep(1000); for(i=0; i<strlen(osa2); i++) { putchar(osa2[i]); Sleep(100); } getchar();}