Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ========================================================================== */
- /* */
- /* rst_trgl_sobotka.c */
- /* 2020-2021 Jan Sobotka - 8.V */
- /* */
- /* ========================================================================== */
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define INACC (0.01)
- #define CHAR_DEF_VAL (69)
- #define STAR_NUM (55)
- // fce zjistujici pocet bodu zadanych ve zdrojovem souboru
- int getsz(FILE* file){
- int sz, e;
- char blbm;
- for(sz=1;blbm!=EOF;blbm=getc(file)){
- if(blbm=='\n'){
- sz++;
- e=1;
- }
- else{
- e=0;
- }
- }
- if(e==1){
- sz-=1;
- }
- return sz;
- }
- // fce nacitajici body do pole
- void getpt(FILE* file,int size,double* pt) {
- int i;
- for(i=0;i<size;i++){
- fscanf(file,"%lf %lf",pt+2*i,pt+2*i+1);
- }
- }
- // fce overujici existenci RST ze zadanych bodu
- char trglfnkc(double ax, double ay, double bx, double by, double cx, double cy, double* ln){
- double dl1,dl2,dl3;
- dl1=(sqrt(((ax-bx)*(ax-bx))+((ay-by)*(ay-by))));
- dl2=(sqrt(((bx-cx)*(bx-cx))+((by-cy)*(by-cy))));
- dl3=(sqrt(((cx-ax)*(cx-ax))+((cy-ay)*(cy-ay))));
- if((sqrt((dl1-dl2)*(dl1-dl2)))<INACC&&(sqrt((dl2-dl3)*(dl2-dl3)))<INACC&&(sqrt((dl3-dl1)*(dl3-dl1)))<INACC){
- ln[0]=dl1;
- return 'a';
- }
- else{
- return 'b';
- }
- }
- // fce overujici zda zadany bod existuje v trojuhelniku ze zadanych bodu
- int in_trgl(double ax,double ay,double bx,double by,double cx,double cy,double dx,double dy){
- double c,d1,d2,d3,d4,d5,d6;
- d1=ay-by;
- d2=bx-ax;
- d3=ay-cy;
- d4=cx-ax;
- d5=by-cy;
- d6=cx-bx;
- if((d1*cx+d2*cy+(-d1*ax-d2*ay))*(d1*dx+d2*dy+(-d1*ax-d2*ay))<=0){
- return 0;
- }
- else if((d3*bx+d4*by+(-d3*ax-d4*ay))*(d3*dx+d4*dy+(-d3*ax-d4*ay))<=0){
- return 0;
- }
- else if((d5*ax+d6*ay+(-d5*bx-d6*by))*(d5*dx+d6*dy+(-d5*bx-d6*by))<=0){
- return 0;
- }
- else{
- return 1;
- }
- }
- // Tiskne hvezdickovy oddelovac se zadanym poctem hvezdicek (designovy prvek)
- void oddelovac(int num){
- int star;
- printf("\n");
- for(star=0;star!=num;star++){
- printf("*");
- }
- printf("\n\n");
- }
- // Tiskne meziradek vystupni tabulky (designovy prvek)
- void liner(int num, int end){
- int p;
- for(p=0;p<num;p++){
- printf("%c",196);
- }
- if(end==0){
- printf("%c",197);
- return 0;
- }
- printf("\n");
- }
- int main(){
- FILE *fr;
- char filename[CHAR_DEF_VAL];
- char pruch;
- double *pt;
- double lngt[2];
- int sz, c1, c2, c3, c4, prd=0, intrl=0;
- //Cely program je v cyklu pro moznost nacteni vice souboru bez nutnosti zavrit program
- while(1){
- while(1){
- printf("Zadejte nazev souboru pro cteni: \n");
- scanf("%s",filename);
- if ((fr = fopen(filename, "r")) == NULL) {
- printf("\nSoubor se nepodarilo otevrit. Zkuste to znovu...\n");
- continue;
- }
- else{
- break;
- }
- }
- sz=getsz(fr);
- fseek(fr,0,SEEK_SET);
- pt=(double*)malloc(sz*sizeof(double)*2);
- getpt(fr,sz,pt);
- oddelovac(STAR_NUM);
- //Tisk legendy vystupnich hodnot + funkce liner pro meziradek
- printf("Poradi RST | C1 | C2 | C3 | Delka str. | Bodu uvnitr\n");
- liner(11,0);
- liner(5,0);
- liner(5,0);
- liner(5,0);
- liner(12,0);
- liner(12,1);
- //Prochazeni pole s nactenymi body a posla je do funkci pro zjisteni existence RST a pro overeni existence bodu uvnitr RST
- for(prd=0,c1=0;c1<sz;c1++){
- for(c2=(c1+1);c2<sz;c2++){
- for(c3=(c2+1);c3<sz;c3++){
- if(trglfnkc(pt[2*c1],pt[2*c1+1],pt[2*c2],pt[2*c2+1],pt[2*c3],pt[2*c3+1],lngt)=='a'){
- prd++;
- for(intrl=0,c4=0;c4<sz;c4++){
- intrl+=in_trgl(pt[2*c1],pt[2*c1+1],pt[2*c2],pt[2*c2+1],pt[2*c3],pt[2*c3+1],pt[2*c4],pt[2*c4+1]);
- }
- printf("%5d. RST | %3d | %3d | %3d | %8.3lf | %3d \n",prd,c1,c2,c3,lngt[0],intrl);
- }
- }
- }
- }
- oddelovac(STAR_NUM);
- //Ukoncovaci sekvence s moznosti ukonceni programu nebo opakovani cyklu
- while(1){
- printf("\n\nChcete pokracovat? [Y/N]\n");
- pruch=getch();
- putchar(pruch);
- if(pruch=='Y'||pruch=='y'){
- printf("\n");
- break;
- }
- else if(pruch=='N'||pruch=='n'){
- while(1){
- printf("\n\nOpravdu chcete program ukoncit?\n");
- pruch=getch();
- putchar(pruch);
- if(pruch=='Y'||pruch=='y'){
- printf("\n");
- //Tisk podpisu autora
- oddelovac(STAR_NUM);
- for(sz=0;sz<((STAR_NUM-41)/2);sz++){
- printf("%c",32);
- }
- printf("Program vytvoril Jan Sobotka - 2020-2021\n");
- oddelovac(STAR_NUM);
- return 1;
- }
- else if(pruch=='N'||pruch=='n'){
- break;
- }
- else{
- continue;
- }
- }
- }
- else{
- printf("\n\nChybne zadani. Zkuste to znovu...");
- continue;
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment