Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: kuinka toimia char-muuttujien kanssa

timok16 [17.02.2005 17:46:56]

#

int TT::etsi_tilkohta5(char *tilalku_kohta, char *tilloppu_kohta)
{
			if (fseek(tiavaus, 0, SEEK_CUR) == 0) {
			fread(&tilausviite, sizeof(tilausviite), 1, tiavaus);
			while (tilausviite.tilpva >= tilalku_kohta && tilausviite.tilpva <= tilloppu_kohta) {
			(!feof(tiavaus));
			fread(&tilausviite, sizeof(tilausviite), 1, tiavaus);
			}
/*nämä kaikki muuttujat char-tyyppisiä 11 merkkiä*/
/*pitääkö muuttaa numeroiksi?*/
			if (tilausviite.tilpva >= tilalku_kohta && tilausviite.tilpva <= tilloppu_kohta ) {
			//fseek(tiavaus, -(sizeof(tilausviite)),SEEK_CUR);
			return 1;
			} else return 0;
	}
			return 0;
}


		case 5:	do{
					printf( "\nAnna alkupaiva: (syota muodossa pp.kk.vvvv)\n");
					cin>>ws;
					gets(ptilalku_kohta);
					}while(strlen (ptilalku_kohta) != 10);

					do{
					printf( "\nAnna loppupaiva: (syota muodossa pp.kk.vvvv)\n");
					cin>>ws;
					gets(ptilloppu_kohta);
					}while(strlen (ptilloppu_kohta) != 10);
					//kaydaan hakemassa oikea vali
					if(fseek(tiavaus, 0, SEEK_SET)==0){
					while((etsi_tilkohta5(ptilalku_kohta,ptilloppu_kohta)== 1)&& (!feof(tiavaus))){

					memcpy(papu,tilausviite.tilnro,7);
					if(fseek(ttfileptr, 0, SEEK_SET)==0){
					while((etsi_tt(papu)==1) && (!feof(ttfileptr))){
						memcpy(tuoteapu,ttietue.ttcode,7);

						itoa(ttietue.maara,taksa1,7);//maara--->merkkijonoksi taksa1
						memcpy(tuoteapu,taksa1,7);
						etsi_tuote(tuoteapu);

						taksa=tuoteviite.price;
						loppusumma = loppusumma + ttietue.maara*tuoteviite.price;
								}
							}
						}
					}

kuinka voin verrata char-muuttujia. Siis tässä koodissa olis
tarkoitus hakea tietyllä aikavälillä tehtyjen tilausten
yhteissumma.

Blaze [17.02.2005 18:07:18]

#

No nämähän nyt on perusasioita:

if(munchar == sunchar) {
  printf("On ne samoja _o/");
}

tai jos tarkoitit char arraytä

if(strcmp(munchararray, sunchararray) == 0) {
  printf("Samoja _o/");
}

timok16 [17.02.2005 18:18:11]

#

tarkoitin sitä, että pitäis verrata tilaus-tietueessa olevia
tilauspäiviä (char 11 merkkiä) kysyttyyn väliin---->
anna alkupäivä(char 11 merkkiä)
anna loppupäivä(char 11 merkkiä)
sit tulostetaan sille välille osuva tilausten yhteissumma.
Onko siis tämä mahdollista?
if (tilausviite.tilpva >= tilalku_kohta && tilausviite.tilpva <= tilloppu_kohta ) ,
eli voiko merkkijono olla >= merkkijono jne.

sqwiik [17.02.2005 18:39:15]

#

turpo16 kirjoitti:

Onko siis tämä mahdollista?

if (tilausviite.tilpva >= tilalku_kohta && tilausviite.tilpva <= tilloppu_kohta )

eli voiko merkkijono olla >= merkkijono jne.

Lyhyesti: ei. Sinun pitää käyttää Blazen mainitsemaa strcmp(s1, s2)-funktiota, joka palauttaa merkkijonojen välisen suhteen: negatiivinen, jos s1 on 'vähemmän' aakkosjärjestyksessä, vastaavasti positiivinen jos se on 'enemmän'. Funktio katsoo siis jokaisen merkin ja vertaa niiden ascii-arvoja, esim. "11.12.2004" > "05.12.2004", koska '1' > '0'. Mutta jos toinen päivämäärä on muodossa "5.12.2004", se on suurempi koska '5' > '1'.

Ja muistathan, että merkkijono pitää päättää '\0'-merkkiin. Jos päivämäärä on muodossa pp.kk.vvvv, sille pitää varata 11 merkkiä.

samlui [18.02.2005 10:15:30]

#

kannattaisi varmaan tallentaa noin kokonaislukuina esim. muuttamalla ne päiviksi. Sitten niitä on helppo vertailla.
Kun pitää printata niin muutat ne taas päivämääriksi.
esim.

int paivat;
int kuukaudet;
int vuodet;
int yhteensa;

cout << "Syötä päivien lukumäärä\n";
cin >> paivat;
cout << "Syötä kuukausien lukumäärä\n";
cin >> kuukaudet;
cout << "Syötä vuosien lukumäärä\n";
cin >> vuodet;

kuukaudet *= 30;
vuodet *= 365;
yhteensa = paivat + kuukaudet + vuodet;

cout << "Päivämääräsi päivinä " << yhteensa << endl;

div_t temp, temp2;
temp = div(yhteensa,365);
temp2 = div(temp.rem,30);
cout << "Ja muutettuna takaisin päivämääräksi\n";
cout << temp2.rem << "." << temp2.quot << "." << temp.quot << endl;

samlui [18.02.2005 12:40:46]

#

ups tossa olikin pieni virhe tässä korjattu versio

int paivat;
int kuukaudet;
int vuodet;
int yhteensa;

cout << "Syötä päivien lukumäärä\n";
cin >> paivat;
cout << "Syötä kuukausien lukumäärä\n";
cin >> kuukaudet;
cout << "Syötä vuosien lukumäärä\n";
cin >> vuodet;

kuukaudet--;
kuukaudet *= 30;
vuodet *= 365;
yhteensa = paivat + kuukaudet + vuodet;

cout << "Päivämääräsi päivinä " << yhteensa << endl;

div_t temp, temp2;
temp = div(yhteensa,365);
temp2 = div(temp.rem,30);
cout << "Ja muutettuna takaisin päivämääräksi\n";
cout << temp2.rem << "." << temp2.quot + 1 << "." << temp.quot << endl;

jos haluat tallentaa päivämäärät tekstina saat päivät, kuukaudet ja vuodet selville seuraavasti

int paivat;
int kuukaudet;
int vuodet;
int yhteensa;
char paivamaara[11];

cout << "Syota paivamaara muodossa pp.kk.vvvv\n";
cin >> paivamaara;

sscanf(paivamaara,"%i.%i.%i",&paivat,&kuukaudet,&vuodet);

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta