/***************************************************************************** * * * Program ocekuje kao jedini parametar ime datoteke sa opisom mnogougla. * * Opis mnogougla se sastoji iz prirodnog broja N, i N parova realnih brojeva * * koji predstavljaju koordinate temena mnogougla. * * * * Program ispisuje velicinu povrsine opisanog mnogougla. * * * *****************************************************************************/ #include #include #include enum greska { NEMA_GRESKE, GRESKA_PRI_OTVARANJU_TEKE, GRESKA_PARAMETARA_KOMANDNE_LINIJE, GRESKA_U_BROJU_TEMENA, GRESKA_PRI_UCITAVANJU_KOORDINATA }; void obradiGresku(enum greska greska); FILE *f = NULL; char *imeTeke, *imePrograma; int tekuceTeme = 0; int main(int argc, char **argv) { int brojTemena = 0; float x0, y0, xPredhodna, yPredhodna, xTekuca, yTekuca; float povrsina = 0.0; void ucitajTekuceKoordinate(float &xTekuca, float &yTekuca); imePrograma = argv[0]; if (argc != 2) obradiGresku(GRESKA_PARAMETARA_KOMANDNE_LINIJE); f = fopen(imeTeke = argv[1], "r"); if (f == NULL) obradiGresku(GRESKA_PRI_OTVARANJU_TEKE); fscanf(f, "%d", &brojTemena); if (brojTemena < 3) obradiGresku(GRESKA_U_BROJU_TEMENA); printf("Citam opis mnogougla sa %d temena iz datoteke %s:\n", brojTemena, imeTeke); ucitajTekuceKoordinate(x0, y0); xPredhodna = x0; yPredhodna = y0; for (tekuceTeme = 1; tekuceTeme < brojTemena; tekuceTeme++) { ucitajTekuceKoordinate(&xTekuca, &yTekuca); povrsina += (xTekuca + xPredhodna)*(yTekuca - yPredhodna); xPredhodna = xTekuca; yPredhodna = yTekuca; } povrsina += (x0 + xPredhodna)*(y0 - yPredhodna); povrsina = fabs(povrsina) / 2; printf("\nPovrsina mnogougla iznosi %f\n", povrsina); exit(NEMA_GRESKE); } void ucitajTekuceKoordinate(float xTekuca, float yTekuca) { int ucitano; ucitano = fscanf(f, "%f%f", &xTekuca, &yTekuca); if (ucitano != 2) obradiGresku(GRESKA_PRI_UCITAVANJU_KOORDINATA); printf("M%d(%f, %f), ", tekuceTeme, xTekuca, yTekuca); } void obradiGresku(enum greska greska) { switch (greska) { case GRESKA_PRI_OTVARANJU_TEKE : printf("Ne mogu da otvorim datoteku %s za citanje.\n", imeTeke); break; case GRESKA_PARAMETARA_KOMANDNE_LINIJE : printf("Program %s ocekuje ime datoteke sa opisom mnogougla kao jedini parametar.\n", imePrograma); break; case GRESKA_U_BROJU_TEMENA : printf("Na pocetku ulazne datoteke ocekuje se broj temena (N > 2).\n"); break; case GRESKA_PRI_UCITAVANJU_KOORDINATA : printf("\nNe mogu da ucitam sve kordinate.\nProblem kod temena broj %d.\n", tekuceTeme); default : ; } if (f != NULL) fclose(f); exit(greska); }