Кто-нибудь может объяснить termios.h и функции getch1 и допустимый ввод, используемый в следующем коде, который я дал, пожалуйста
#include <stdio.h> #include <math.h> #include <sys/ioctl.h>//for varying variable according to terminal size #include <string.h> #include <stdlib.h> #include <termios.h>//for taking proper inputs #include <unistd.h> #define NS printf("\nNo Unique Solution\n") /*Source of next 2 macros *https://ubuntuforums.org/showthread.php?t=549023 */ #define clrs printf("\033[H\033[J") #define gxy(x,y) printf("\033[%d;%dH", (x), (y)) #define clrstdin while(getchar() != '\n') {} float gif(float f)//return integer part of float { int i; i=f; f=i; return f; } int min_int(int a,int b) { if (a>b) return b; else return a; } int input_i(int max_var)//handles character ,float ,negative and other invalid inputs like less than one { float temp; while (scanf("%f",&temp) != 1 || temp<1 || temp>max_var || temp != gif(temp)) { clrstdin; printf("Enter Integers (0<n<%d)\nNew Response : ",max_var+1); } short check=0; while(getchar() != '\n') {check++;} if (check != 0) { printf("Enter Integers (0<n<%d)\nNew Response : ",max_var+1); return input_i(max_var); } int i; i=temp; return i; } /*Source of getch1() : http://zobayer.blogspot.in/2010/12/getch-getche-in-gccg.html*/ char getch1()//defines the condition according to what to take and what tp reject { char buf=0; struct termios old={0}; fflush(stdout); if(tcgetattr(0, &old)<0) perror("tcsetattr()"); old.c_lflag&=~ICANON; old.c_lflag&=~ECHO; old.c_cc[VMIN]=1; old.c_cc[VTIME]=0; if(tcsetattr(0, TCSANOW, &old)<0) perror("tcsetattr ICANON"); if(read(0,&buf,1)<0) perror("read()"); old.c_lflag|=ICANON; old.c_lflag|=ECHO; if(tcsetattr(0, TCSADRAIN, &old)<0) perror ("tcsetattr ~ICANON"); //printf("%c",buf); return buf; } float valid_input_f()//passing of valid input { char c=0; char f[20]; int point=0; int i=0; while (c != '\n') { c=getch1(); if (c>='0' && c<='9') { printf("%c",c); f[i]=c; i++; } else if (c=='.' && point==0) { printf("."); f[i]=c; i++; point++; } else if ((c=='-' || c=='+') && i==0) { printf("%c",c); f[0]=c; i++; } else if (c==' ' && i!=0) { printf("\b \b"); if (f[i-1]=='.') point--; f[i]='\0'; i--; } } f[i]='\0'; return atof(f); } void assign0(float *v,int noe)//initializing to zero { for (int i=0;i<noe;i++) { *(v+i)=0; } return; } void expPrint (float n)//prints in exponential form { if (n==0) { printf("0"); } else if (n>=1 || n<=-1) { float exp=gif(log10(fabs(n))); printf("%.1fe%.0f",n/pow(10,exp),exp); } else { float exp=gif(log10(fabs(n))); printf("%.1fe%.0f",n/pow(10,exp),--exp); } } float getputMatrix(float *cf,float *cn,int n,int ex,int ey,short flag)//initializes and prints the augumented matrix and sets cursor to first position { clrs; printf("\n"); for (int i=0;i<n;i++) { printf("%cx(%d)+",'a'+i,i+1); } printf("\b=const\n\n"); for (int i=0;i<n;i++) { printf("\t%c",'a'+i); } printf("\tconst"); printf("\n"); for (int i=0;i<n;i++) { printf("eqn %d",i+1); for (int j=0;j<n;j++) { printf("\t"); expPrint(*(cf+i*n+j)); } printf("\t"); expPrint(*(cn+i)); printf("\n"); } if (flag==1) { gxy(5+ex,((ey+1)*8)+1); float f=valid_input_f();//passes the valid input to getcoeffs return f; } return 0; } void swapv(float *a,float *b)//interchanges the values { float t=*a; *a=*b; *b=t; return; } void getcoeffs(float *cf,float *cn,int n)//takes the input from getput matrix and prints augumented matrix it on the screen { for (int i=0;i<n;i++) { for (int j=0;j<n;j++) { *(cf+j+i*n)=getputMatrix(cf,cn,n,i,j,1); } *(cn+i)=getputMatrix(cf,cn,n,i,n,1); } getputMatrix(cf,cn,n,0,0,0); return; } void getx(float *x,float *cf,float *cn,int n)//for getting solution of variables { for (int i=0;i<n;i++) { *(x+i)=*(cn+i)/(*(cf+i*n+i)); } } void putx(float *x,int n)//prints the solution { printf("\n"); for (int i=0;i<n;i++) { printf("\nx(%d) = %.3f",i+1,*(x+i)); } printf("\n"); } void reverse(float *v,int i)//prints the adjoint of matrix { for (int j=0;j<i/2;j++) { swapv(v+j,v+i-j-1); } } //rs=reduced side ; os=original side void rowswap(float *cf,int i1,int i2,int os)//interchanges two rows of augumented matrix { for (int i=0;i<os;i++) { swapv(cf+(i1)*(os)+(i),cf+(i2)*(os)+(i)); } return; } short triangle(float *cf,float *cn,int os,int rs,short flag)//makes the lower triangle to zero { if (rs==1) return 1; int dif=os-rs; if(*(cf+(dif)*(os)+(dif))==0)//if first element of row is zero it swaps it with any other row having non zero first element row { for (int i=dif+1;i<rs;i++) { if (*(cf+(i)*(os)+(dif))!=0) { rowswap(cf,dif,i,os); swapv(cn+dif,cn+i); goto skip;//checks if first element is non zero then directly makes triangle zero } } return triangle(cf,cn,os,rs-1,flag);//recursively makes the lower triangle to zero } skip: for (int j=dif+1;j<os;j++) { float f=*(cf+(j)*(os)+(dif))/(*(cf+(dif)*(os)+(dif)));//find the cofficient of multiplication *(cn+j) -= *(cn+dif)*f; for (int k=0;k<rs;k++) { *(cf+(j)*(os)+(dif+k)) -= *(cf+(dif)*(os)+(dif+k))*f;//makes the column zero } if (flag==1) { int check=0; for (int l=dif;l<os;l++) { if (*(cf+(j)*(os)+(l))==0) check++; } if (check==rs) { return -1; } } } return triangle(cf,cn,os,rs-1,flag);//goes to the smaller triangle and makes it zero } short row_operations(float *cf,float *cn,int n)//making the two triangles zero and only diagonal element non zero { if (triangle(cf,cn,n,n,1)==-1) return -1; reverse(cf,n*n); reverse(cn,n); triangle(cf,cn,n,n,-1); reverse(cf,n*n); reverse(cn,n); return 1; } /*Source of max_variables() : http5://stackoverflow.com/questions/1022957/getting-terminal-width-in-c*/ int max_variables() { struct winsize w; ioctl(0, TIOCGWINSZ, &w); return w.ws_col/8-2; }
Что я уже пробовал:
буквально я ничего не могу понять о вышеупомянутых 2 функциях в приведенном выше коде
[no name]
Попросите того, от кого вы получили код, объяснить вам его.
Richard MacCutchan
Нет смысла копировать код из интернета, Если вы не можете понять его или то, что он делает.