/********************************************************* * Tekijät: * * Jaakko Reinman 000001 TIE07 * * Joni Lehmuksela 000002 TIE07 * * Juho Peltonen 000003 TIE07 * * Ohjelmaversio: 1.5 * * jne. * * * **********************************************************/ //Luokkakirjastot #include #include #include #include #include //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 //Tietueet typedef 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 esittelyt void trim(char* s); void annaIntLuku(int* luku); //haluaa muuttujan osoitteen void annaDoubleLuku(double* luku); //haluaa muuttujan osoitteen void annaTeksti(char* merkkijono); //haluaa muuttujan osoitteen int vertaa(char* jono1, char* jono2); //haluaa vertailtavien muuttujien osoitteet void 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 pois void 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 osoitteen void 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(tempANNAINT_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 osoitteen void 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(temp2ANNADOUBLE_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 osoitteen void 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 osoitteet int vertaa(char* jono1, char* jono2) { int i; int pituus1=strlen(jono1); temp=strlen(jono2); if( pituus1 == temp ) { for(i=0;i9) 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