Member 12904284 Ответов: 1

Кто-нибудь может объяснить 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

Нет смысла копировать код из интернета, Если вы не можете понять его или то, что он делает.

1 Ответов

Рейтинг:
0

Jochen Arndt

Для termios.ч видеть termios(3) - man-страница Linux[^].

С этим вы должны быть в состоянии понять, что происходит в getch1().

valid_input_f() выглядит как функция, которая считывает входные данные, ожидая значения с плавающей запятой, и возвращает результат в виде float.