Commit 4d8190e6 by kmicha

Upload New File

parent 9c95e80c
Showing with 185 additions and 0 deletions
/*
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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment