homework(original function names in () )
i have done most of the job allready, but i can't seem to make it do exactelly what the program should.
My job is to make a program that asks numbers of busses(10,27,33,36) and the departure(valjus) times and save them into a txt document and then how many minutes has passed from the last departure(valjus) of the same buss. and also the program should check that the time(minutes and hours) are in the normal range from 0-24 h and 0-60 minutes and also it should check that the buss number entered is exacetelly the same number as given in the program.
It currently makes a txt document and saves the times, but i can't make the program calculate the time between(vahe) the departure(valjus) of the same number buss, it just doesn't do that. also, when i close the program window and start inserting the times and numbers again, it for some reason prints out the wrong time, but the new inserted buss number. my program doesn't brake, when '0' is entered as the buss number . i don't know what i'm doing wrong...
can you help me.
i have added my homework as well.
#include <stdio.h> // C nuab kasutatavate funktsioonide teekide lisamist
#include <conio.h> // nendes teekides on sisend-vljundfukktsioonide kirjeldused
#include <string.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
int nr=-1, vahe=0;
time_t s; // aeg sekundites (pikk tisarv - long)
tm *t; // viit struktuurile tm (deklareeritud teegis time.h)
int bussid[]={10,27,33,36};
int valjus[]={0,0,0,0};
int minutid(char*);
char aeg[6];
char inputTime[6];
char *fail="bussid.txt";
FILE *ofp;
ofp=fopen(fail, "a");
char outputLine[10];
while(true){
for(int i=0;i<4;i++){
if(nr==0)break;
printf("Sisesta bussi number >");
scanf("%02d", &nr);
printf("Sisesta valjumise aeg kujul HH:SS > ");
scanf("%s",inputTime);
s=time(NULL);
t=localtime(&s);
sprintf(aeg,"%02d:%02d", t->tm_hour, t->tm_min);
printf("Buss %d, kell on %s\n", nr, aeg);
sprintf(outputLine,"%02d - %s\n",nr,inputTime);
printf("\n****************************************\n");
fputs(outputLine,ofp);
//vahe=0;
if(nr==bussid[i]){
if(valjus[i]){
vahe=minutid(inputTime)-valjus[i];
}
valjus[i]=minutid(inputTime);
}
}
if(vahe)printf("Eelmine buss samal liinil valjus %d minutit tagasi\n",
vahe);
}
printf("Vajuta suvalisele klahvile...");
getch(); // oodatakse suvalise klahvi vajutust enne akna sulgemist
return 0; // programmi t normaalne (veakood=0) lpp
}
int minutid(char *p){
int tund, minut;
char *pos;
tund=atoi(p);
pos=strchr(p,':');
minut=(pos==NULL)?0:atoi(pos+1);
return tund*60+minut;
}
also i have a problem with my project, i need to get some info from a xml file and compare and print out few things.
everything is working fine, but the smallest countries area is 315,6 and every other area is a normal number like 12345 or something like that.
my problem is that that i can't get the 0,6 out from the xml, only the 315(i actually need 315+0,6)
what should i do?
should i just find the coma and then add the value after the coma or something else, but i have no idea how to put this into c++
i added my code and the xml file
<xml>
</Liikmesriik>
<Riigi nimi>Austria</Riigi nimi>
<Pindala> 83858km</Pindala><Rahvaarv>8 116 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Belgia</Riigi nimi>
<Pindala> 30528km</Pindala><Rahvaarv>10 318 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Eesti</Riigi nimi>
<Pindala> 45227km</Pindala><Rahvaarv>1 323 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Hispaania</Riigi nimi>
<Pindala> 504782km</Pindala><Rahvaarv>41 060 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Holland</Riigi nimi>
<Pindala> 41865km</Pindala><Rahvaarv>16 149 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Iirimaa</Riigi nimi>
<Pindala> 70273km</Pindala><Rahvaarv>3 956 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Itaalia</Riigi nimi>
<Pindala> 301323km</Pindala><Rahvaarv>57 423 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Kreeka</Riigi nimi>
<Pindala> 131957km</Pindala><Rahvaarv>10 499 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Kpros</Riigi nimi>
<Pindala> 9251km</Pindala><Rahvaarv>802 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Leedu</Riigi nimi>
<Pindala> 65302km</Pindala><Rahvaarv>3 444 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Luksemburg</Riigi nimi>
<Pindala> 2586km</Pindala><Rahvaarv>453 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Lti</Riigi nimi>
<Pindala> 64589km</Pindala><Rahvaarv>2 307 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Malta</Riigi nimi>
<Pindala> 315,6km</Pindala><Rahvaarv>394 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Poola</Riigi nimi>
<Pindala> 312685km</Pindala><Rahvaarv>38 587 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Portugal</Riigi nimi>
<Pindala> 92345km</Pindala><Rahvaarv>10 062 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Prantsusmaa</Riigi nimi>
<Pindala> 543965km</Pindala><Rahvaarv>60 144 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Rootsi</Riigi nimi>
<Pindala> 449964km</Pindala><Rahvaarv>8 876 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Saksamaa</Riigi nimi>
<Pindala> 357021km</Pindala><Rahvaarv>82 476 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Slovakkia</Riigi nimi>
<Pindala> 49034km</Pindala><Rahvaarv>5 402 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Sloveenia</Riigi nimi>
<Pindala> 20253km</Pindala><Rahvaarv>1 984 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Soome</Riigi nimi>
<Pindala> 338144km</Pindala><Rahvaarv>5 207 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Suurbritannia</Riigi nimi>
<Pindala> 242900km</Pindala><Rahvaarv>59 251 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Taani</Riigi nimi>
<Pindala> 43094km</Pindala><Rahvaarv>5 364 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Tehhi</Riigi nimi>
<Pindala> 78866km</Pindala><Rahvaarv>10 236 000</Rahvaarv>
<Liikmesriik>
</Liikmesriik>
<Riigi nimi>Ungari</Riigi nimi>
<Pindala> 93030km</Pindala><Rahvaarv>9 877 000</Rahvaarv>
<Liikmesriik>
</xml>
/*Informaatika II IDK0032 Projekt
Alustatud:21.04.2006
Muudetud:30.04.2006
Tegija:Mari Sults 05029 IAPB24
Eesmrk: Programm leiab, kui mitu korda on pindalalt suurim
liikmesriik vikseimast suurem ning mitu korda on elanikke suurima
rahvaarvuga riigis rohkem, kui vikseima rahvaarvuga riigis. Vljastab
ka nende riikide nimed ning vastavad pindalad ja rahvaarvud.
Hetkel:Vljastab xml'ist riigi nime, pindala, ja peaks kuid ei vljasta, ja ka
rahvaarvu.
Teha veel: Kik, mis eesmrgis kirjas.
*/
#include <stdio.h> // standardne sisend-vljund
#include <conio.h> // klaviatuur-kuvar
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(void)
{ printf("Informaatika II IDK0032 Projekt\n\nTegija: Mari Sults 050629IAPB\n\n"
"Eesm2rk: Programm leiab, kui mitu korda on pindalalt suurim\n"
"liikmesriik vikseimast suurem ning mitu korda on elanikke\n"
"suurima rahvaarvuga riigis rohkem, kui v2ikseima rahvaarvuga\n"
"riigis. V2ljastab ka nende riikide nimed ning vastavad pindalad\n"
"ja rahvaarvud.\n\n\n\n");
//muutujad
char *fail="EuroopaLiit.xml";
char rida[60], *pos;
char *riigid[25], *pos1;
int pindala[25];
int rahvas[25];
int OnRiik=0, OnPindala=0, OnRahvas=0, abi=0;
int i, j, k, z; //suvaline abimuutuja
FILE *fp;
//alamfuncid
int comp( int jada[25], int sv = 1 );
fp=fopen(fail, "r");
if(fp){ // fail edukalt avatud
j = 0;
while (!feof(fp)){
fgets(rida, sizeof(rida), fp);
pos = strtok(rida,"<>");
//kui on see rida, kus asub riigi nimi, siis
if (strcmp(pos, "Riigi nimi") == 0){
for (i=0;i<2;i++){
pos = strtok(NULL,"<>");
if ((pos != NULL)&&(i==0)){
riigid[j] = new char[9];
strcpy(riigid[j],pos);
}
}
}
//kui on see rida, kus on pindala, siis
if (strcmp(pos, "Pindala") == 0){
for (i=0;i<3;i++){
pos = strtok(NULL,"<>");
if ((pos != NULL)&&(i==0)){
sscanf(pos,"%d",&pindala[j]);
}
}
}
//kui on see rida, kus rahvaarv, siis
if (strcmp(pos, "Rahvaarv") == 0){
abi = 0;
for (i=0;i<10;i++){
pos = strtok(NULL," ");
if ((pos != NULL)&&(k==0)){
abi = abi * 1000 + atoi(pos);
}
}
rahvas[j] = abi;
j++;
}
}
}
else printf("Faili %s avamine ebannestus\n", fail);
printf( "Suurima pindalaga riik on %s\n", riigid[comp(pindala)] );
printf( "(pindala: %d km^2 ja rahvaarv: %d)\n",
pindala[comp(pindala)],rahvas[comp(pindala)] );
printf( "Ta on v2ikseima pindalaga riigist\n" );
printf( "(%s; pindala: %d km^2 ja rahvaarv: %d) ", riigid[comp(pindala, 2)],
pindala[comp(pindala, 2)],rahvas[comp(pindala, 2)] );
printf( "%d korda suurem\n\n",pindala[comp(pindala)]/pindala[comp(pindala, 2)] );
printf( "Suurima rahvaarvuga riik on %s\n", riigid[comp(rahvas)] );
printf( "(pindala: %d km^2 ja rahvaarv: %d)\n", pindala[comp(rahvas)],
rahvas[comp(rahvas)] );
printf( "Seal elab v2ikseima rahvaarvuga riigist\n" );
printf( "(%s; pindala: %d km^2 ja rahvaarv: %d) ", riigid[comp(rahvas, 2)],
pindala[comp(rahvas, 2)],rahvas[comp(rahvas, 2)] );
printf( "%d korda rohkem inimesi\n",rahvas[comp(rahvas)]/rahvas[comp(rahvas, 2)] );
printf("Vajuta suvalisele klahvile...");
getch();
return 0;
}
//vrdlusfunksioon: parameetrid jada - massiiv numbritest, millest suurim leida,
//sv = abimuutuja (1 - suurem kui, 2 - viksem kui)
//tagastab suurima/vikseima jada elemendi indeksi
int comp( int jada[25], int sv = 1 ){
int i, a=0, suurus;
if (sv == 1){ suurus = 0; } else { suurus = jada[comp( jada, 1 )]; }
for ( i = 0; i < 25; i++ ){
if (( suurus < jada[i] ) && ( sv == 1 )){
suurus = jada[i];
a = i;
}
if (( suurus > jada[i] ) && ( sv == 2 )){
suurus = jada[i];
a = i;
}
}
return a;
}
i can't make the program calculate the time between(vahe) the departure(valjus) of the same number buss
No compiler available so I can't download cpp files. In general there are several ways to approach this:
1) you can transform hours and minutes to seconds, subtract the number of seconds from one time to the other and then convert back into hours and minutes.
2) Do routine math using base 60.
>> my program doesn't brake, when '0' is entered as the buss number
Because you break from the for loop, but not from the
while loop.
I suggest a flag like "tocont"
tocont = 1;
while ( tocont )
{
for(int i=0;i<4;i++)
{
if(nr==0)
{
tocont = 0;
break;
}
}
}
inline int pmin(int h, int m){return (h*60 + m); }
is that the conversion i should use to convert hours to minutes?
>> my program doesn't brake, when '0' is entered as the buss number
Because you break from the for loop, but not from the
while loop.
I suggest a flag like "tocont"tocont = 1; while ( tocont ) { for(int i=0;i<4;i++) { if(nr==0) { tocont = 0; break; } } }
i really don't get it? do i have to declare docont as an intiger?:confused:
Yes , you might declare tocont as integer or even
as char.
but where do i put it in my code - after, between or before the for statment that makes my program print?
If you understand the language you're using, then you should have no problem running through the code by hand or in your head to see what happens, given some particular program. So do that.
If you understand the language you're using, then you should have no problem running through the code by hand or in your head to see what happens, given some particular program. So do that.
but i don't understand the language, that is my big problem :sad: if did understand the code i wouldn't be her and asking but helping others...
please don't make me feel even more miserable then i allready am
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.