Long time no see
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,48 @@
|
||||
#ifndef Head
|
||||
#define Head
|
||||
|
||||
// INCLUDE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
// DEFINE
|
||||
#define LLI long long int
|
||||
#define MAX_MATRIX_ALIVE 21
|
||||
#define BUFF_MAX 10 //(char) <= 254
|
||||
#define IN_BUFF_CHARS 10 //(char) <= 254
|
||||
|
||||
//TypeDef
|
||||
// matrix.c
|
||||
typedef struct {
|
||||
int rows;
|
||||
int cols;
|
||||
int** data;
|
||||
} MATRIX2D;
|
||||
|
||||
|
||||
// FUNC
|
||||
// === io.c ===
|
||||
MATRIX2D* create_matrix2d(int rows, int cols);
|
||||
char buff_input(char *inbuff, char *_buff);
|
||||
char cmd_buff(char* _buff,char** _charCommands,char NUM_OF_CHAR_COMMANDS);
|
||||
char get_matrix_num(void);
|
||||
int get_num(void);
|
||||
|
||||
// === matrix.c ===
|
||||
void create_matrix(MATRIX2D** addr, unsigned char n, int rows, int cols);
|
||||
void input_matrix(MATRIX2D** addr, unsigned char n);
|
||||
void get_matrix(MATRIX2D** addr, unsigned char n);
|
||||
void logic_matrix(MATRIX2D** addr, unsigned char n1, unsigned char n2);
|
||||
void edit_matrix(MATRIX2D** addr, unsigned char n);
|
||||
void matrix_random(MATRIX2D** addr, unsigned char n);
|
||||
void copy_matrix(MATRIX2D** addr, unsigned char n1, unsigned char n2);
|
||||
void free_matrix(MATRIX2D** addr, unsigned char n);
|
||||
void get_matrix_col(MATRIX2D** addr, unsigned char n, int c);
|
||||
void get_matrix_row(MATRIX2D** addr, unsigned char n, int r);
|
||||
void transp_matrix(MATRIX2D** addr, unsigned char n);
|
||||
LLI determ_matrix(MATRIX2D** addr, unsigned char n);
|
||||
void obr_matrix(MATRIX2D** addr, unsigned char n);
|
||||
void is_Matrix_Exist(MATRIX2D** addr, unsigned char n);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,108 @@
|
||||
#include "head.h"
|
||||
|
||||
char buff_input(char *inbuff, char *_buff){
|
||||
|
||||
*inbuff = 0;
|
||||
{ // INPUT
|
||||
char ch;
|
||||
while((ch=getchar())>' '&&*inbuff<BUFF_MAX){
|
||||
*(_buff+*inbuff)=(int)ch;
|
||||
(*inbuff)++;
|
||||
}
|
||||
if(ch<= 4)return -1;
|
||||
}
|
||||
|
||||
|
||||
if (_buff[0]>='a' && _buff[0] <= 'z')
|
||||
{ // Is input - command?
|
||||
const char NUM_OF_CHAR_COMMANDS = 15;
|
||||
char * _charCommands[NUM_OF_CHAR_COMMANDS]; // _charCommands[*]["char"]
|
||||
_charCommands[0] = (char[]){"input"};
|
||||
_charCommands[1] = (char[]){"getmatrix"};
|
||||
_charCommands[2] = (char[]){"logic"};
|
||||
_charCommands[3] = (char[]){"edit"};
|
||||
_charCommands[4] = (char[]){"random"};
|
||||
_charCommands[5] = (char[]){"copy"};
|
||||
_charCommands[6] = (char[]){"destruct"};
|
||||
_charCommands[7] = (char[]){"getcolum"};
|
||||
_charCommands[8] = (char[]){"getrow"};
|
||||
_charCommands[9] = (char[]){"transp"};
|
||||
_charCommands[10] = (char[]){"determ"};
|
||||
_charCommands[11] = (char[]){"obr"};
|
||||
_charCommands[12] = (char[]){"create"};
|
||||
_charCommands[13] = (char[]){"n"};
|
||||
_charCommands[14] = (char[]){"exit"};
|
||||
|
||||
|
||||
char cmd = cmd_buff(_buff,_charCommands,NUM_OF_CHAR_COMMANDS);
|
||||
if(cmd==15)return -1; //exit
|
||||
return cmd; //Вернуть комману
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char cmd_buff(char* _buff,char** _charCommands,char NUM_OF_CHAR_COMMANDS){
|
||||
for (int i = 0;i<NUM_OF_CHAR_COMMANDS;i++){
|
||||
char flag = 1;
|
||||
for(int j = 0;*(_charCommands[i]+j)!='\0';j++){
|
||||
if (_buff[j]!=*(_charCommands[i]+j)){
|
||||
flag = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(flag) return i+1;//Вернуть комманду
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char get_matrix_num(void){
|
||||
char inbuff;
|
||||
char _buff[BUFF_MAX];
|
||||
while(buff_input(&inbuff,_buff)>0&&*_buff>' ');
|
||||
|
||||
long int num = 0;
|
||||
char flagIsDec = 1;
|
||||
{ // GetNum
|
||||
int i = 0;
|
||||
if(_buff[0]=='-'){i++;flagIsDec = -1;}
|
||||
|
||||
for(; i<inbuff;i++)
|
||||
if(_buff[i]>= '0' && _buff[i] <= '9')
|
||||
num = (num*10) + (_buff[i]-'0');
|
||||
num *= flagIsDec;
|
||||
}
|
||||
if (num>MAX_MATRIX_ALIVE)num = MAX_MATRIX_ALIVE;
|
||||
if (num<0)num = 0;
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
int get_num(void){
|
||||
char inbuff;
|
||||
char _buff[BUFF_MAX];
|
||||
while(buff_input(&inbuff,_buff)>0&&*_buff>' ');
|
||||
|
||||
long int num = 0;
|
||||
char flagIsDec = 1;
|
||||
{ // GetNum
|
||||
int i = 0;
|
||||
if(_buff[0]=='-'){i++;flagIsDec = -1;}
|
||||
|
||||
for(; i<inbuff;i++)
|
||||
if(_buff[i]>= '0' && _buff[i] <= '9')
|
||||
num = (num*10) + (_buff[i]-'0');
|
||||
num *= flagIsDec;
|
||||
}
|
||||
if (num>INT_MAX)num = INT_MAX;
|
||||
if (num<INT_MIN)num = INT_MIN;
|
||||
return (int)num;
|
||||
}
|
||||
/*
|
||||
void outputInt(int n){
|
||||
|
||||
}
|
||||
|
||||
void outputStr(char* str){
|
||||
|
||||
}*/ // Подрузамевалось подобный io но он это нецелесообразная трата времени
|
||||
@@ -0,0 +1,118 @@
|
||||
#include "head.h"
|
||||
|
||||
int main(void){
|
||||
|
||||
MATRIX2D** __matrixAddr = (MATRIX2D**)calloc(MAX_MATRIX_ALIVE,sizeof(MATRIX2D*));
|
||||
if(__matrixAddr == NULL) {printf("ERROR.__matrixAddr NotExist");return 1;}
|
||||
|
||||
char mode;
|
||||
do{
|
||||
char inbuff;
|
||||
char _buff[BUFF_MAX];
|
||||
char n1,n2;
|
||||
int num1,num2;
|
||||
mode = buff_input(&inbuff,_buff);
|
||||
{
|
||||
switch(mode){
|
||||
case 1:
|
||||
n1 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
input_matrix(__matrixAddr,n1);
|
||||
break;
|
||||
|
||||
case 2: // output
|
||||
n1 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
get_matrix(__matrixAddr,n1);
|
||||
|
||||
break;
|
||||
|
||||
case 3: // logic
|
||||
n1 = get_matrix_num();
|
||||
n2 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
is_Matrix_Exist(__matrixAddr,n2);
|
||||
logic_matrix(__matrixAddr,n1,n2);
|
||||
break;
|
||||
|
||||
case 4: // edit
|
||||
n1 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
edit_matrix(__matrixAddr,n1);
|
||||
break;
|
||||
|
||||
case 5: // random
|
||||
n1 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
matrix_random(__matrixAddr,n1);
|
||||
break;
|
||||
|
||||
case 6: // copy
|
||||
n1 = get_matrix_num();
|
||||
n2 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
free_matrix(__matrixAddr,n2);
|
||||
copy_matrix(__matrixAddr,n1,n2);
|
||||
break;
|
||||
|
||||
case 7: // destroy
|
||||
n1 = get_matrix_num();
|
||||
free_matrix(__matrixAddr,n1);
|
||||
break;
|
||||
|
||||
case 8: // get colum
|
||||
n1 = get_matrix_num();
|
||||
num1 = get_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
get_matrix_col(__matrixAddr,n1,num1);
|
||||
break;
|
||||
|
||||
case 9: // get row
|
||||
n1 = get_matrix_num();
|
||||
num1 = get_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
get_matrix_row(__matrixAddr,n1,num1);
|
||||
break;
|
||||
|
||||
case 10: // transp
|
||||
n1 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
transp_matrix(__matrixAddr,n1);
|
||||
break;
|
||||
|
||||
case 11: // determ
|
||||
n1 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
printf("%lld",determ_matrix(__matrixAddr,n1));
|
||||
|
||||
break;
|
||||
|
||||
case 12: //obr
|
||||
n1 = get_matrix_num();
|
||||
is_Matrix_Exist(__matrixAddr,n1);
|
||||
obr_matrix(__matrixAddr,n1);
|
||||
break;
|
||||
|
||||
case 13:
|
||||
n1 = get_matrix_num();
|
||||
num1 = get_num();
|
||||
num2 = get_num();
|
||||
free_matrix(__matrixAddr,n1);
|
||||
create_matrix(__matrixAddr,n1,num1,num2);
|
||||
break;
|
||||
|
||||
case 15:
|
||||
putchar('\n');
|
||||
putchar('\n');
|
||||
break;
|
||||
|
||||
case 0: // wrong input
|
||||
break;
|
||||
|
||||
case -1: return 0;
|
||||
}
|
||||
}
|
||||
}while(mode>=0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,374 @@
|
||||
#include "head.h"
|
||||
|
||||
MATRIX2D* create_matrix2d(int rows,int cols) {
|
||||
MATRIX2D* m = (MATRIX2D*)malloc(sizeof(MATRIX2D));
|
||||
m->rows = rows;
|
||||
m->cols = cols;
|
||||
|
||||
m->data = (int**)malloc(rows * sizeof(int*));
|
||||
|
||||
for (int i = 0; i < rows; i++){
|
||||
m->data[i] = (int*)malloc(cols * sizeof(int));
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
void create_matrix(MATRIX2D** __addr,unsigned char n,int rows,int cols){
|
||||
__addr[n] = create_matrix2d(rows,cols);
|
||||
for (int i = 0;i<rows;i++){
|
||||
for(int j = 0;j<cols;j++){
|
||||
__addr[n]->data[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void input_matrix(MATRIX2D** __addr,unsigned char n){
|
||||
int** data = __addr[n]->data;
|
||||
|
||||
for(int rows = 0; rows < __addr[n]->rows;rows++){
|
||||
for(int cols = 0; cols < __addr[n]->cols;cols++){
|
||||
int num = get_num();
|
||||
data[rows][cols] = num;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void get_matrix(MATRIX2D** __addr,unsigned char n){
|
||||
int rows = __addr[n]->rows;
|
||||
int cols = __addr[n]->cols;
|
||||
|
||||
//printf("\tМассив №%d",n);
|
||||
//printf("Колл-во строк %d\nКолл-во колон %d\n\n",rows,cols);
|
||||
for(int r = 0;r<rows;r++){
|
||||
for(int c = 0;c<cols;c++){
|
||||
printf("%d ",__addr[n]->data[r][c]);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
void logic_matrix(MATRIX2D** __addr,unsigned char n1,unsigned char n2){
|
||||
char inbuff;
|
||||
char _buff[BUFF_MAX];
|
||||
int** data1 = __addr[n1]->data;
|
||||
int** data2 = __addr[n2]->data;
|
||||
|
||||
char cmd = 0;
|
||||
{
|
||||
buff_input(&inbuff,_buff);
|
||||
|
||||
const char NUM_OF_CHAR_COMMANDS = 6;
|
||||
char * _charCommands[NUM_OF_CHAR_COMMANDS]; // _charCommands[*]["char"]
|
||||
_charCommands[0] = (char[]){"=="};
|
||||
_charCommands[1] = (char[]){"!="};
|
||||
_charCommands[2] = (char[]){">="};
|
||||
_charCommands[3] = (char[]){"<="};
|
||||
_charCommands[4] = (char[]){">"};
|
||||
_charCommands[5] = (char[]){"<"};
|
||||
|
||||
cmd = cmd_buff(_buff,_charCommands,NUM_OF_CHAR_COMMANDS);
|
||||
}
|
||||
|
||||
LLI cost1 = 0;
|
||||
{
|
||||
for(int r = 0;r<__addr[n1]->rows;r++)
|
||||
for(int c = 0;c<__addr[n1]->cols;c++)
|
||||
cost1 += data1[r][c];
|
||||
}
|
||||
LLI cost2 = 0;
|
||||
{
|
||||
for(int r = 0;r<__addr[n2]->rows;r++)
|
||||
for(int c = 0;c<__addr[n2]->cols;c++)
|
||||
cost2 += data2[r][c];
|
||||
}
|
||||
|
||||
switch(cmd){
|
||||
case 0: //Null
|
||||
putchar('-');putchar('1');
|
||||
break;
|
||||
case 1: // ==
|
||||
putchar(cost1==cost2?'1':'0');
|
||||
break;
|
||||
case 2: // !=
|
||||
putchar(cost1!=cost2?'1':'0');
|
||||
break;
|
||||
case 3: //>=
|
||||
putchar(cost1>=cost2?'1':'0');
|
||||
break;
|
||||
case 4: //<=
|
||||
putchar(cost1<=cost2?'1':'0');
|
||||
break;
|
||||
case 5: // >
|
||||
putchar(cost1>cost2?'1':'0');
|
||||
break;
|
||||
case 6: // <
|
||||
putchar(cost1<cost2?'1':'0');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void edit_matrix(MATRIX2D** __addr, unsigned char n) {
|
||||
char inbuff;
|
||||
char _buff[BUFF_MAX];
|
||||
int** data = __addr[n]->data;
|
||||
int r = 0, c = 0;
|
||||
char mode = 0;
|
||||
|
||||
char* _locStrings[3];
|
||||
_locStrings[0] = (char[]){"point"};
|
||||
_locStrings[1] = (char[]){"add"};
|
||||
_locStrings[2] = (char[]){"sub"};
|
||||
|
||||
while (r < __addr[n]->rows) {
|
||||
char res = buff_input(&inbuff, _buff);
|
||||
if (res == -1) break;
|
||||
|
||||
if (_buff[0] == 'n' && inbuff == 1) break;
|
||||
|
||||
char loc_cmd = cmd_buff(_buff, _locStrings, 3);
|
||||
|
||||
if (loc_cmd == 1) {
|
||||
buff_input(&inbuff, _buff);
|
||||
long pr = 0, pc = 0;
|
||||
int i = 0;
|
||||
for (; i < inbuff && (_buff[i] != ':' && _buff[i] != ',' && _buff[i] != '.'); i++)
|
||||
if (_buff[i] >= '0' && _buff[i] <= '9') pr = pr * 10 + (_buff[i] - '0');
|
||||
for (i++; i < inbuff; i++)
|
||||
if (_buff[i] >= '0' && _buff[i] <= '9') pc = pc * 10 + (_buff[i] - '0');
|
||||
|
||||
if (pr < __addr[n]->rows && pc < __addr[n]->cols) {
|
||||
r = (int)pr;
|
||||
c = (int)pc;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (loc_cmd == 2) { mode = 1; continue; }
|
||||
if (loc_cmd == 3) { mode = 2; continue; }
|
||||
|
||||
long val = 0;
|
||||
int i = 0, sign = 1;
|
||||
if (inbuff > 0 && _buff[0] == '-') { sign = -1; i++; }
|
||||
for (; i < inbuff; i++) {
|
||||
if (_buff[i] >= '0' && _buff[i] <= '9')
|
||||
val = val * 10 + (_buff[i] - '0');
|
||||
}
|
||||
val *= sign;
|
||||
|
||||
if (mode == 1) {
|
||||
long res_val = (long)data[r][c] + val;
|
||||
data[r][c] = (res_val > INT_MAX) ? INT_MAX : (res_val < INT_MIN) ? INT_MIN : (int)res_val;
|
||||
} else if (mode == 2) {
|
||||
long res_val = (long)data[r][c] - val;
|
||||
data[r][c] = (res_val > INT_MAX) ? INT_MAX : (res_val < INT_MIN) ? INT_MIN : (int)res_val;
|
||||
} else {
|
||||
data[r][c] = (val > INT_MAX) ? INT_MAX : (val < INT_MIN) ? INT_MIN : (int)val;
|
||||
}
|
||||
|
||||
if (++c >= __addr[n]->cols) {
|
||||
c = 0;
|
||||
r++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int get_rand(int min, int max) {
|
||||
return (double)rand() / (RAND_MAX + 1.0) * (max - min) + min;
|
||||
}
|
||||
|
||||
void matrix_random(MATRIX2D** __addr,unsigned char n){
|
||||
unsigned int lo, hi;
|
||||
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
|
||||
srand(((unsigned long long)hi << 32) | lo);
|
||||
|
||||
for (int r = 0; r < __addr[n]->rows; r++){
|
||||
for(int c = 0; c < __addr[n]->cols; c++){
|
||||
__addr[n]->data[r][c] = get_rand(-100, 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void copy_matrix(MATRIX2D** __addr,unsigned char n1, unsigned char n2){
|
||||
// n2 = n1
|
||||
__addr[n2] = create_matrix2d(__addr[n1]->rows,__addr[n1]->cols);
|
||||
|
||||
for(int i = 0; i<__addr[n1]->rows;i++){
|
||||
for(int j = 0; j<__addr[n1]->cols;j++){
|
||||
__addr[n2]->data[i][j] = __addr[n1]->data[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void free_matrix(MATRIX2D** __addr,unsigned char n){
|
||||
if (__addr[n] == NULL) return;
|
||||
|
||||
MATRIX2D* m = __addr[n];
|
||||
for (int i = 0; i < m->rows; i++) {
|
||||
free(m->data[i]);
|
||||
}
|
||||
free(m->data);
|
||||
free(m);
|
||||
|
||||
__addr[n] = NULL;
|
||||
}
|
||||
|
||||
void get_matrix_col(MATRIX2D** __addr,unsigned char n,int c){
|
||||
//printf("colum %d - ",c);
|
||||
if(c >= __addr[n]->cols)c = __addr[n]->cols - 1;
|
||||
if(c<0)c = 0;
|
||||
for(int i = 0;i<__addr[n]->rows;i++){
|
||||
printf("%d ",__addr[n]->data[i][c]);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
void get_matrix_row(MATRIX2D** __addr,unsigned char n,int r){
|
||||
//printf("row %d - ",r);
|
||||
if(r >= __addr[n]->rows)r = __addr[n]->rows - 1;
|
||||
if(r<0)r = 0;
|
||||
for(int i = 0;i<__addr[n]->cols;i++){
|
||||
printf("%d ",__addr[n]->data[r][i]);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
void transp_matrix(MATRIX2D** __addr,unsigned char n){
|
||||
MATRIX2D* tr = create_matrix2d(
|
||||
__addr[n]->cols,__addr[n]->rows);
|
||||
|
||||
|
||||
int** dataDef = __addr[n]->data;
|
||||
int** dataRes = tr->data;
|
||||
|
||||
for(int r = 0;r<__addr[n]->rows;r++)
|
||||
for(int c = 0;c<__addr[n]->cols;c++)
|
||||
dataRes[c][r] = dataDef[r][c];
|
||||
|
||||
free_matrix(__addr,n);
|
||||
|
||||
__addr[n] = tr;
|
||||
}
|
||||
|
||||
LLI determ_matrix(MATRIX2D** __addr, unsigned char n) {
|
||||
int size = __addr[n]->rows;
|
||||
int** data = __addr[n]->data;
|
||||
|
||||
if (size == 1) return data[0][0];
|
||||
if (size == 2) return (LLI)data[0][0] * data[1][1] - (LLI)data[0][1] * data[1][0];
|
||||
|
||||
double det = 1.0;
|
||||
double** temp = (double**)malloc(size * sizeof(double*));
|
||||
for (int i = 0; i < size; i++) {
|
||||
temp[i] = (double*)malloc(size * sizeof(double));
|
||||
for (int j = 0; j < size; j++) temp[i][j] = (double)data[i][j];
|
||||
}
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
int pivot = i;
|
||||
for (int j = i + 1; j < size; j++) {
|
||||
double val1 = temp[j][i] < 0 ? -temp[j][i] : temp[j][i];
|
||||
double val2 = temp[pivot][i] < 0 ? -temp[pivot][i] : temp[pivot][i];
|
||||
if (val1 > val2) pivot = j;
|
||||
}
|
||||
|
||||
if (pivot != i) {
|
||||
double* swap = temp[i];
|
||||
temp[i] = temp[pivot];
|
||||
temp[pivot] = swap;
|
||||
det *= -1;
|
||||
}
|
||||
|
||||
double current_val = temp[i][i] < 0 ? -temp[i][i] : temp[i][i];
|
||||
if (current_val < 1e-9) {
|
||||
for (int k = 0; k < size; k++) free(temp[k]);
|
||||
free(temp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
det *= temp[i][i];
|
||||
|
||||
for (int j = i + 1; j < size; j++) {
|
||||
double factor = temp[j][i] / temp[i][i];
|
||||
for (int k = i + 1; k < size; k++) {
|
||||
temp[j][k] -= factor * temp[i][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLI final_det;
|
||||
if (det >= 0) final_det = (LLI)(det + 0.5);
|
||||
else final_det = (LLI)(det - 0.5);
|
||||
|
||||
for (int i = 0; i < size; i++) free(temp[i]);
|
||||
free(temp);
|
||||
|
||||
return final_det;
|
||||
}
|
||||
|
||||
void obr_matrix(MATRIX2D** __addr, unsigned char n) {
|
||||
int size = __addr[n]->rows;
|
||||
if (size != __addr[n]->cols) return;
|
||||
|
||||
LLI d = determ_matrix(__addr, n);
|
||||
if (d == 0) return;
|
||||
|
||||
double** temp = (double**)malloc(size * sizeof(double*));
|
||||
for (int i = 0; i < size; i++) {
|
||||
temp[i] = (double*)malloc(2 * size * sizeof(double));
|
||||
for (int j = 0; j < size; j++) {
|
||||
temp[i][j] = (double)__addr[n]->data[i][j];
|
||||
temp[i][j + size] = (i == j ? 1.0 : 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
int pivot = i;
|
||||
for (int j = i + 1; j < size; j++) {
|
||||
double v1 = temp[j][i] < 0 ? -temp[j][i] : temp[j][i];
|
||||
double v2 = temp[pivot][i] < 0 ? -temp[pivot][i] : temp[pivot][i];
|
||||
if (v1 > v2) pivot = j;
|
||||
}
|
||||
|
||||
double* row_ptr = temp[i];
|
||||
temp[i] = temp[pivot];
|
||||
temp[pivot] = row_ptr;
|
||||
|
||||
double divisor = temp[i][i];
|
||||
for (int j = i; j < 2 * size; j++) {
|
||||
temp[i][j] /= divisor;
|
||||
}
|
||||
|
||||
for (int k = 0; k < size; k++) {
|
||||
if (k != i) {
|
||||
double factor = temp[k][i];
|
||||
for (int j = i; j < 2 * size; j++) {
|
||||
temp[k][j] -= factor * temp[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
for (int j = 0; j < size; j++) {
|
||||
double val = temp[i][j + size];
|
||||
if (val >= 0) __addr[n]->data[i][j] = (int)(val + 0.5);
|
||||
else __addr[n]->data[i][j] = (int)(val - 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < size; i++) free(temp[i]);
|
||||
free(temp);
|
||||
}
|
||||
|
||||
void is_Matrix_Exist(MATRIX2D** __addr,unsigned char n){
|
||||
if(n > MAX_MATRIX_ALIVE) n = MAX_MATRIX_ALIVE-1;
|
||||
if(__addr[n] == NULL){
|
||||
//printf("Матрица №%d не существует, создана новая матрица 4x4\n",n);
|
||||
__addr[n] = create_matrix2d(4,4);
|
||||
matrix_random(__addr,n);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
## Matrix
|
||||
|
||||
Когда вы запускаете програму она будет ожидать одну из следующих коммнад.
|
||||
Ввод чисел будет проигнорирован но, адм символы приведут к завершению программы.
|
||||
|
||||
При вводе символов весь ввод является строкой.
|
||||
Делителем строк являются - Space Enter EOT
|
||||
Также каждый 10 символ - новая строка
|
||||
При вводе, каждое запрашиваемое значение должно заканчиваться делителем
|
||||
|
||||
###### Пример:
|
||||
|
||||
create
|
||||
0
|
||||
10 20
|
||||
getmatrix
|
||||
exit
|
||||
|
||||
Номер матрицы ограничен их возможным колличеством установленным в header.h
|
||||
По умолчанию = 20
|
||||
|
||||
Если вы пытаетесь манипулировать несуществующей матрицей
|
||||
То будет создана матрица 4 X 4 со случайными значениями от -100 до 100
|
||||
|
||||
##
|
||||
|
||||
Далее будет описыватся только ожидаеммый ввод после команды.
|
||||
Функцианал коммнады понятен из названия.
|
||||
|
||||
#### create
|
||||
|
||||
(Ожидается 3 числа)
|
||||
номер-матрицы
|
||||
коллво-строк
|
||||
коллво-колон
|
||||
|
||||
#### input
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
(далее будет ввод матрицы X на Y необходимо ввести X\*Y значений)
|
||||
int1 int2 int3 ... int(x\*y)
|
||||
|
||||
#### getmatrix
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
|
||||
#### logic
|
||||
|
||||
(Ожидается 2 числа)
|
||||
номер-матрицы1
|
||||
номер-матрицы2
|
||||
(Ожидается логическая операция > < >= <= != == )
|
||||
Логическа-операция
|
||||
|
||||
#### edit
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
(Далее принимает X\*Y чисел и заменяет предыдущие)
|
||||
(Так же может принять 3 буквенных выражения,
|
||||
add - все последующие введёные числа будут добавлены к имеющимся
|
||||
sub - от всех имеющихся чисел будут отняты последующие введёные
|
||||
point - указать на точку в массиве начиная с которой продолжить заполнение, row:col для разделения могут использоваться , . :)
|
||||
|
||||
|
||||
#### random
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
|
||||
#### copy
|
||||
|
||||
(Ожидается 2 числа)
|
||||
номер-матрицы-откуда-копировать
|
||||
номер-матрицы-куда-копировать
|
||||
|
||||
#### destruct
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
|
||||
#### getcolum
|
||||
|
||||
(Ожидается 2 числа)
|
||||
номер-матрицы
|
||||
номер-столбца
|
||||
|
||||
#### getrow
|
||||
|
||||
(Ожидается 2 числа)
|
||||
номер-матрицы
|
||||
номер-строки
|
||||
|
||||
#### transp
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
|
||||
#### determ
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
|
||||
#### obr
|
||||
|
||||
(Ожидается 1 число)
|
||||
номер-матрицы
|
||||
|
||||
#### exit
|
||||
@@ -0,0 +1,38 @@
|
||||
create 0 3 3
|
||||
input 0
|
||||
1 2 3
|
||||
4 5 6
|
||||
7 8 9
|
||||
getmatrix 0
|
||||
n n
|
||||
transp 0
|
||||
getmatrix 0
|
||||
n n
|
||||
create 1 3 3
|
||||
random 1
|
||||
getmatrix 1
|
||||
n
|
||||
logic 0 1 >= n
|
||||
logic 0 0 == n
|
||||
edit 0
|
||||
add
|
||||
1 1 1
|
||||
1 1 1
|
||||
1 1 1
|
||||
getmatrix 0
|
||||
n
|
||||
edit 0
|
||||
point 1:1
|
||||
sub
|
||||
10 10
|
||||
getmatrix 0
|
||||
n
|
||||
getcolum 0 1
|
||||
getrow 0 2
|
||||
n
|
||||
copy 0 5
|
||||
getmatrix 5
|
||||
n
|
||||
determ 5
|
||||
destruct 5
|
||||
exit
|
||||
@@ -0,0 +1,28 @@
|
||||
CC = gcc
|
||||
|
||||
CFLAGS = -Wall -Wextra -I../ -g
|
||||
TARGET = matrix
|
||||
|
||||
SRC_DIR = ../code
|
||||
OBJ_DIR = ../.o
|
||||
|
||||
SRCS = $(wildcard $(SRC_DIR)/*.c)
|
||||
OBJS = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))
|
||||
|
||||
.PHONY: all clean run
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): $(OBJS)
|
||||
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)
|
||||
|
||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
||||
@mkdir -p $(OBJ_DIR)
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
run: $(TARGET)
|
||||
./$(TARGET) < input > output
|
||||
@cat output
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJ_DIR) $(TARGET) output
|
||||
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user