/* Html/javascriptist tuleb käsk/sisetus punktist X: 1) C programm leiab tabelist punkti IDga X 2) Leiab teekonna, mida reostus läbib, liites vahemaad ja keskmiseid kiiruseid kokku. 3) Väljastab aja (sekundites vist) kaua läheb, et jõuda Ülemisteni. */ #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct{ double Lat; double Long; }koordinaat; typedef struct{ koordinaat asukoht; double Kiirus; int suubumisID; }punkt; void failiNimi(char[20], char*); void sisestus(int*); int failiPikkus(FILE*); void check(FILE*); void taitmine(FILE*, int x, punkt[x]); void kontroll(int, int x, punkt[x]); double ajaLeidmine(int, int x, punkt[x]); double arvutus(double, double, double, double); int main(void){ int sisestusID = 2, n, x; double aeg; char Fnimi[20]; FILE *F; failiNimi(Fnimi, "Sisetage algandmete fail (.txt): \n"); // siia tuleb panna reaalse nimekirja aadress F = fopen(Fnimi,"r"); check(F); n = failiPikkus(F); punkt punktid[n]; taitmine(F,n,punktid); fclose(F); // pole faili enam avatult vaja sisestus(&sisestusID); //Peaks tulema kasutajaliideselt printf("ID on: %d\n", sisestusID); kontroll(sisestusID, n, punktid); aeg = ajaLeidmine(sisestusID, n, punktid); x = atoi(aeg); return x; } void failiNimi(char input[20], char *tekst){ printf("%s", tekst); scanf("%s", input); } void sisestus(int* x){ printf("Reopunkti algpunkt: \n"); scanf("%d", x); } void check(FILE *input){ if(input == NULL){ printf("Faili ei leitud!\n"); exit(1); } fclose(input); } // Kontrollib, kui mitu kirjet failis on int failiPikkus(FILE *input){ int x = 0,s; double a,b,c; while(fscanf(input, "%lf %lf %lf %d",&a, &b, &c, &s) != EOF){ x++; } rewind(input); printf("Ridade arv: %d\n", x); return x; } // Struct massiivi täitmine void taitmine(FILE *input, int N, punkt punktid[N]){ int i = 0; while(fscanf(input, "%lf %lf %lf %d", &punktid[i].asukoht.Lat, &punktid[i].asukoht.Long, &punktid[i].Kiirus, &punktid[i].suubumisID ) != EOF){ i++; } } // Kontrollib, ega algpunkt ei ole lõpppunkt void kontroll(int ID, int n, punkt punktid[n]){ printf("Toimub kontroll\n"); if(punktid[ID].suubumisID == -1){ exit(1); } } // Leiab terve vahemaa ja aja double ajaLeidmine(int algID, int N, punkt punktid[N]){ int uusID, counter = 0; double x, lat1, long1, lat2, long2, vahemaa = 0; int vanaID = algID; double kiirus = punktid[algID].Kiirus; while(punktid[vanaID].suubumisID != -1){ uusID = punktid[vanaID].suubumisID; lat1 = punktid[vanaID].asukoht.Lat; long1 = punktid[vanaID].asukoht.Long; lat2 = punktid[uusID].asukoht.Lat; long2 = punktid[uusID].asukoht.Long; vahemaa += arvutus(lat1, long1, lat2, long2); kiirus += punktid[uusID].Kiirus; counter++; } kiirus = kiirus / counter; x = vahemaa / kiirus; return x; } // arvutab koordinaatide vahelise vahemaa double arvutus(double Lat1, double Long1, double Lat2, double Long2){ int R = 6371; double D; Lat1 = Lat1 * M_PI / 180; Long1 = Long1 * M_PI / 180; Lat2 = Lat2 * M_PI / 180; Long2 = Long2 * M_PI / 180; D = R * acos(sin(Lat1) * sin(Lat2) + cos(Lat1) * cos(Lat2) * cos(Long2 - Long1)); return D; }