All pastes #804713 Raw Edit

code7.1

public c v1 · immutable
·published 2007-12-03 18:27 UTC
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 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**************************************int main(void){	lataus();	paavalikko();	lopetus();	return 0;} // ***************************************************************************************//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();}