Initial commit: C language learning code
This commit is contained in:
+181
@@ -0,0 +1,181 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6},
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
// !tic-tac-toe游戏
|
||||
int main()
|
||||
{
|
||||
const int size = 3;
|
||||
int board[size][size];
|
||||
int i, j;
|
||||
int numfx, numfo;
|
||||
int result = -1;
|
||||
|
||||
// 写入棋盘矩阵
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
for (j = 0; j < size; j++)
|
||||
{
|
||||
printf("请输入第%d行第%d列的棋子(1代表X,0代表O):", i + 1, j + 1);
|
||||
scanf("%d", &board[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
// 检查行
|
||||
for (i = 0; i < size && result == -1; i++)
|
||||
{
|
||||
numfx = numfo = 0;
|
||||
for (j = 0; j < size;j++)
|
||||
{
|
||||
if (board[i][j]==1)
|
||||
{
|
||||
numfx++;
|
||||
}
|
||||
else
|
||||
{
|
||||
numfo++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numfo == size)
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else if (numfx == size)
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查列
|
||||
if (result == -1)
|
||||
{
|
||||
for (j = 0; j < size && result == -1; j++)
|
||||
{
|
||||
numfx = numfo = 0;
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
if (board[i][j] == 1)
|
||||
{
|
||||
numfx++;
|
||||
}
|
||||
else
|
||||
{
|
||||
numfo++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numfo == size)
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else if (numfx == size)
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 检查主对角线
|
||||
if (result == -1)
|
||||
{
|
||||
numfx = numfo = 0;
|
||||
for (i = 0; i < size;i++)
|
||||
{
|
||||
if (board[i][i]==1)
|
||||
{
|
||||
numfx++;
|
||||
}
|
||||
else
|
||||
{
|
||||
numfo++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numfo ==size)
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else if (numfx == size)
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查次对角线
|
||||
if (result == -1)
|
||||
{
|
||||
numfx = numfo = 0;
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
if (board[i][size - i - 1] == 1)
|
||||
{
|
||||
numfx++;
|
||||
}
|
||||
else
|
||||
{
|
||||
numfo++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numfo == size)
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else if (numfx == size)
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 输出结果
|
||||
if (result == 1)
|
||||
{
|
||||
printf("X获胜!\n");
|
||||
}
|
||||
else if (result == 0)
|
||||
{
|
||||
printf("O获胜!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("平局!\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[][5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
// !输入l行m列的矩阵()
|
||||
void matrix_produce(int l, int m, int a[l][m]);
|
||||
|
||||
// !找出二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点
|
||||
void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols]);
|
||||
|
||||
// !打印l行n列的矩阵()
|
||||
void matrix_print(int l, int n, int c[l][n]);
|
||||
|
||||
// !释放二维数组内存
|
||||
void matrix_free(int **matrix, int rows);
|
||||
|
||||
int main()
|
||||
{
|
||||
int l, m;
|
||||
printf("输入矩阵的行数和列数(用空格分隔): ");
|
||||
scanf("%d %d", &l, &m);
|
||||
|
||||
int matrix[l][m];
|
||||
printf("按行输入矩阵元素(每行%d个,空格分隔):\n", m);
|
||||
matrix_produce(l, m, matrix);
|
||||
|
||||
printf("输入的矩阵为:\n");
|
||||
matrix_print(l, m, matrix);
|
||||
|
||||
matrix_find_saddle_point(l, m, matrix);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ! 输入l行m列的矩阵
|
||||
void matrix_produce(int l, int m, int a[l][m])
|
||||
{
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// !找出二维数组中的鞍点(行最大且列最小)
|
||||
void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols])
|
||||
{
|
||||
// 标记是否找到鞍点
|
||||
int has_saddle = 0;
|
||||
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
// !步骤1:找到当前行的最大值
|
||||
int row_max = matrix[i][0];
|
||||
int col_max = 0;
|
||||
|
||||
for (int j = 0; j < cols;j++)
|
||||
{
|
||||
if (matrix[i][j]>row_max)
|
||||
{
|
||||
row_max = matrix[i][j];
|
||||
col_max = j;
|
||||
}
|
||||
}
|
||||
|
||||
// !步骤2:检查该行最大值是否是所在列的最小值
|
||||
int col_min = matrix[0][col_max]; // 初始化列最小值为当前列第一行
|
||||
for (int k = 1; k < rows; k++)
|
||||
{
|
||||
// 遍历当前列的所有行
|
||||
if (matrix[k][col_max] < col_min)
|
||||
{
|
||||
col_min = matrix[k][col_max]; // 更新列最小值
|
||||
}
|
||||
}
|
||||
|
||||
// !步骤3:判断是否为鞍点(行最大且列最小)
|
||||
if (row_max == col_min)
|
||||
{
|
||||
printf("鞍点坐标为(%d, %d),值为:%d\n", i, col_max, row_max);
|
||||
has_saddle = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 未找到鞍点时提示
|
||||
if (has_saddle==0)
|
||||
{
|
||||
printf("该矩阵没有鞍点!\n");
|
||||
}
|
||||
}
|
||||
|
||||
// !打印l行n列的矩阵(适配 int ** 类型)
|
||||
void matrix_print(int l, int n, int c[l][n])
|
||||
{
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]); // 通过指针访问动态分配的矩阵元素
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
// !释放二维数组内存
|
||||
void matrix_free(int **matrix, int rows)
|
||||
{
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
free(matrix[i]); // 释放每行的内存
|
||||
}
|
||||
free(matrix); // 释放行指针数组
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6},
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
// !矩阵与矩阵的乘法运算
|
||||
int main()
|
||||
{
|
||||
int l, m, n;
|
||||
int i, j, k;
|
||||
|
||||
printf("请输入矩阵的行数、列数:\n");
|
||||
scanf("%d %d %d", &l, &m, &n);
|
||||
int a[l][m];
|
||||
int b[m][n];
|
||||
int c[l][n];
|
||||
|
||||
// !矩阵的输入
|
||||
printf("请输入矩阵a的元素:\n");
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
printf("请输入矩阵b的元素:\n");
|
||||
for (i = 0; i < m; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
scanf("%d", &b[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
// !矩阵的乘法运算
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
c[i][j] = 0;
|
||||
for (k = 0; k < m; k++)
|
||||
{
|
||||
c[i][j] += a[i][k] * b[k][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// !矩阵的打印
|
||||
printf("矩阵a和矩阵b的乘法结果矩阵c为:\n");
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
void matrix_produce(int l,int m, int a[l][m]);
|
||||
void matrix_multiply( int l, int m, int n, int a[l][m], int b[m][n], int c[l][n]);
|
||||
void matrix_print(int l, int n, int c[l][n]);
|
||||
|
||||
// !矩阵与矩阵的乘法运算
|
||||
int main()
|
||||
{
|
||||
int l, m, q, n;
|
||||
|
||||
// !矩阵的定义
|
||||
printf("请输入矩阵a的行数、列数:\n");
|
||||
scanf("%d %d", &l, &m);
|
||||
printf("请输入矩阵b的行数、列数:\n");
|
||||
scanf("%d %d", &q, &n);
|
||||
while (m!=q)
|
||||
{
|
||||
printf("矩阵a的列数与矩阵b的行数不相等,无法进行矩阵乘法运算!\n");
|
||||
printf("请重新输入矩阵a的行数、列数:\n");
|
||||
scanf("%d %d", &l, &m);
|
||||
printf("请重新输入矩阵b的行数、列数:\n");
|
||||
scanf("%d %d", &q, &n);
|
||||
}
|
||||
|
||||
int a[l][m];
|
||||
int b[m][n];
|
||||
int c[l][n];
|
||||
|
||||
// !矩阵的输入
|
||||
printf("请输入矩阵a的元素:\n");
|
||||
matrix_produce(l, m, a);
|
||||
|
||||
printf("请输入矩阵b的元素:\n");
|
||||
matrix_produce(m, n, b);
|
||||
|
||||
// !矩阵的乘法运算
|
||||
matrix_multiply(l, m, n, a, b, c);
|
||||
|
||||
// !矩阵的打印
|
||||
printf("矩阵a和矩阵b的乘法结果矩阵c为:\n");
|
||||
matrix_print(l, n, c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void matrix_produce(int l,int m, int a[l][m])
|
||||
{
|
||||
// !矩阵的输入
|
||||
int i, j;
|
||||
for ( i = 0; i < l; i++)
|
||||
{
|
||||
for ( j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_multiply (int l, int m, int n, int a[l][m], int b[m][n], int c[l][n])
|
||||
{
|
||||
// !矩阵的乘法运算
|
||||
int i, j, k;
|
||||
for ( i = 0; i < l; i++)
|
||||
{
|
||||
for ( j = 0; j < n; j++)
|
||||
{
|
||||
c[i][j] = 0;
|
||||
for ( k = 0; k < m; k++)
|
||||
{
|
||||
c[i][j] += a[i][k] * b[k][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_print(int l, int n, int c[l][n])
|
||||
{
|
||||
// !矩阵的打印
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !数组
|
||||
/*
|
||||
[i]是一个数组,例如本代码中数组名是number
|
||||
number[0]是数组的第一个元素,number[1]是数组的第二个元素,以此类推
|
||||
即从左到右是从0开始
|
||||
|
||||
数组是一种容器,其中所有的元素都具有相同的数据类型,且在内存中连续存储,依次排列
|
||||
*/
|
||||
|
||||
int main()
|
||||
{
|
||||
int x;
|
||||
double sum = 0.0;
|
||||
int count = 0;
|
||||
int number[100]; // 定义一个数组,数组名为number,数组大小为100
|
||||
printf("请输入一个整数:");
|
||||
scanf("%d", &x);
|
||||
|
||||
while (x != -1)
|
||||
{
|
||||
if (x < 0 || x != (int)x) // 判断输入的数字是否为正整数
|
||||
{
|
||||
printf("输入的数字不是正整数,请重新输入!\n");
|
||||
continue;
|
||||
}
|
||||
number[count] = x; // 对数组中的元素进行赋值
|
||||
count++;
|
||||
sum += x;
|
||||
printf("请输入一个整数:");
|
||||
scanf("%d", &x);
|
||||
}
|
||||
|
||||
// 防止数组越界
|
||||
if (count < 100)
|
||||
{
|
||||
if (count > 0)
|
||||
{
|
||||
int i;
|
||||
double average = sum * 1.0 / count;
|
||||
printf("数组的总和是%.0f,平均数是%.2f(保留两位小数),大于平均数有\n", sum, average);
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if (number[i] >= average) // s使用数组中的元素,将数组中的元素与平均数进行比较
|
||||
{
|
||||
printf("%d ", number[i]); // 输出数组中大于平均数的元素
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("数组为空,请重新输入!\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("数组的规定大小是100,现在已经超过了!\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !定义数组
|
||||
/*
|
||||
<类型> 变量名字[元素数量],例如int number[100],double number[100]
|
||||
元素数量必须是整数
|
||||
例如:a[10]
|
||||
每个单元都是一个变量,每个变量都是一个int类型的变量,可以出现在赋值语句的左边或右边
|
||||
如a[2] = a[1]+6
|
||||
|
||||
*/
|
||||
|
||||
void f();
|
||||
|
||||
int main()
|
||||
{
|
||||
f();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void f()
|
||||
{
|
||||
int a[10];
|
||||
a[10] = 0; // !数组越界,因为数组大小为10,从a[0]到a[9],所以a[10]是越界的
|
||||
}
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
int check_symmetry(int matrix[][200], int size);
|
||||
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
scanf("%d", &n);
|
||||
int matrix1[100][100], matrix2[100][100], matrix3[100][100], matrix4[100][100];
|
||||
|
||||
// 读取四个n×n的矩阵
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
scanf("%d", &matrix1[i][j]);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
scanf("%d", &matrix2[i][j]);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
scanf("%d", &matrix3[i][j]);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
scanf("%d", &matrix4[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
int big_matrix[200][200];
|
||||
// 方案一:常规左上、右上、左下、右下拼接
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
big_matrix[i][j] = matrix1[i][j];
|
||||
big_matrix[i][j + n] = matrix2[i][j];
|
||||
big_matrix[i + n][j] = matrix3[i][j];
|
||||
big_matrix[i + n][j + n] = matrix4[i][j];
|
||||
}
|
||||
}
|
||||
if (check_symmetry(big_matrix, 2 * n))
|
||||
{
|
||||
printf("YES\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 方案二:交换右上和左下
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
big_matrix[i][j] = matrix1[i][j];
|
||||
big_matrix[i][j + n] = matrix3[i][j];
|
||||
big_matrix[i + n][j] = matrix2[i][j];
|
||||
big_matrix[i + n][j + n] = matrix4[i][j];
|
||||
}
|
||||
}
|
||||
if (check_symmetry(big_matrix, 2 * n))
|
||||
{
|
||||
printf("YES\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 方案三:交换左上和右下
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
big_matrix[i][j] = matrix4[i][j];
|
||||
big_matrix[i][j + n] = matrix2[i][j];
|
||||
big_matrix[i + n][j] = matrix3[i][j];
|
||||
big_matrix[i + n][j + n] = matrix1[i][j];
|
||||
}
|
||||
}
|
||||
if (check_symmetry(big_matrix, 2 * n))
|
||||
{
|
||||
printf("YES\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 方案四:交换左上和右上,左下和右下
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
big_matrix[i][j] = matrix2[i][j];
|
||||
big_matrix[i][j + n] = matrix1[i][j];
|
||||
big_matrix[i + n][j] = matrix4[i][j];
|
||||
big_matrix[i + n][j + n] = matrix3[i][j];
|
||||
}
|
||||
}
|
||||
if (check_symmetry(big_matrix, 2 * n))
|
||||
{
|
||||
printf("YES\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("NO\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// !检查矩阵是否为对称矩阵
|
||||
int check_symmetry(int matrix[][200], int size)
|
||||
{
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
for (int j = 0; j < size; j++)
|
||||
{
|
||||
if (matrix[i][j] != matrix[j][i])
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
int a[10]={0};
|
||||
int count=0;
|
||||
while(1)
|
||||
{
|
||||
int b;
|
||||
printf("请输入一个数字:");
|
||||
scanf("%d",&b);
|
||||
|
||||
if(b==-1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (b<=-1 || b>=10)
|
||||
{
|
||||
printf("输入错误,请重新输入\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (count<10)
|
||||
{
|
||||
printf("数组已满\n");
|
||||
break;
|
||||
}
|
||||
|
||||
a[b]++;
|
||||
count++;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
printf("%d: %d\n", i, a[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !判断能被已知的且为素数的数整除(构造素数表)
|
||||
/*
|
||||
欲构造n以内的素数表
|
||||
1.令x=2
|
||||
2.将2x、3x、4x直至ax<n的数标记为非素数
|
||||
3.令x为下一个没有被标记为非素数的数,重复步骤2;直到所有的数都已经尝试完毕
|
||||
*/
|
||||
|
||||
// !数组的赋值
|
||||
/*
|
||||
数组赋值有两种方式
|
||||
1.用赋值号直接赋值
|
||||
2.用循环赋值
|
||||
例如:
|
||||
int a[10]={1,2,3,4,5,6,7,8,9,10};
|
||||
int b[10];
|
||||
for(int i=0;i<10;i++)
|
||||
{
|
||||
b[i]=a[i];
|
||||
}
|
||||
数组不能用来赋另外一个数组的值
|
||||
*/
|
||||
|
||||
int main()
|
||||
{
|
||||
int a[10], i, j, temp;
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
scanf("%d", &a[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i < 9; i++)
|
||||
{
|
||||
for (j = 0; j < 10 - i - 1; j++)
|
||||
{
|
||||
if (a[j] < a[j + 1])
|
||||
{
|
||||
temp = a[j];
|
||||
a[j] = a[j + 1];
|
||||
a[j + 1] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
printf("%d ", a[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#define num 100
|
||||
|
||||
// !判断能被已知的且为素数的数整除
|
||||
|
||||
int sushu(int x, int primes[], int count);
|
||||
|
||||
int main()
|
||||
{
|
||||
//const int num=100;
|
||||
int prime[num] = {2};
|
||||
int count = 1;
|
||||
int i=3;
|
||||
|
||||
while (count<num)
|
||||
{
|
||||
if (sushu(i,prime,count))
|
||||
{
|
||||
prime[count] = i;
|
||||
count++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
for (i = 0; i < num;i++)
|
||||
{
|
||||
printf("%d", prime[i]);
|
||||
if ((i+1)%5==0)
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\t");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 判断能被已知的且为素数的数整除
|
||||
int sushu(int x, int known_sushu[], int num_sushu)
|
||||
// x为要判断的数,known_sushu为已知的素数,num_sushu为已知的素数的个数
|
||||
{
|
||||
int ret = 1;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_sushu;i++)
|
||||
{
|
||||
if (x % known_sushu[i]==0)
|
||||
{
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !判断能被已知的且为素数的数整除(构造素数表)
|
||||
/*
|
||||
欲构造n以内的素数表
|
||||
1.令x=2
|
||||
2.将2x、3x、4x直至ax<n的数标记为非素数
|
||||
3.令x为下一个没有被标记为非素数的数,重复步骤2;直到所有的数都已经尝试完毕
|
||||
*/
|
||||
|
||||
// !数组的赋值
|
||||
/*
|
||||
数组赋值有两种方式
|
||||
1.用赋值号直接赋值
|
||||
2.用循环赋值
|
||||
例如:
|
||||
int a[10]={1,2,3,4,5,6,7,8,9,10};
|
||||
int b[10];
|
||||
for(int i=0;i<10;i++)
|
||||
{
|
||||
b[i]=a[i];
|
||||
}
|
||||
数组不能用来赋另外一个数组的值
|
||||
*/
|
||||
|
||||
int main()
|
||||
{
|
||||
int minnum,maxnum;
|
||||
printf("请输入一个数(即为最小和最大的区间):");
|
||||
scanf(" %d %d", &minnum, &maxnum);
|
||||
|
||||
int isprime[maxnum];
|
||||
int i, x;
|
||||
|
||||
if (maxnum<=0)
|
||||
{
|
||||
printf("输入错误!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < maxnum; i++)// 令isprime[i]=1,采用循环赋值,默认所有的数都是素数,标记为1
|
||||
{
|
||||
isprime[i] = 1;
|
||||
}
|
||||
|
||||
for (x = 2; x < maxnum; x++)
|
||||
{
|
||||
if (isprime[x]==1) // isprime[x]判断是否为素数
|
||||
{
|
||||
/* x的倍数不是素数 */
|
||||
for (i = 2; i*x < maxnum; i++)
|
||||
{
|
||||
isprime[i*x] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (x = 2; x < minnum;x++) // 将比minnum小的数标记为非素数,即不打印
|
||||
{
|
||||
isprime[x] = 0;
|
||||
}
|
||||
|
||||
for (x = 2; x < maxnum; x++)// 打印素数
|
||||
{
|
||||
if (isprime[x] == 1)
|
||||
{
|
||||
printf("%d是素数\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !数组的集成初始化
|
||||
/*
|
||||
例如:int a[10]={1,2,3,4,5,6,7,8,9,10};
|
||||
直接用大括号给出数组的所有元素值的初始值
|
||||
不需要给出数组的长度(大小),编译器会自动计算
|
||||
*/
|
||||
|
||||
// !集成初始化的定位
|
||||
/*
|
||||
用[n]在初始化数据中给出定位
|
||||
没有定位的数据接在前面的位置后面
|
||||
其他位置的值补零 也可以不给出数组大小,让编译器算
|
||||
特别适合初始数据稀疏的数组
|
||||
例如:int a[10]={[1]=1,4, [5]=6};他的数组为{0,1,4,0,0,6,0,0,0,0}
|
||||
*/
|
||||
|
||||
// !数组的大小
|
||||
/*
|
||||
sizeof(a)给出数组a所占据的内容的大小,单位是字节
|
||||
sizeof(a)/sizeof(a[0])给出数组a的大小
|
||||
*/
|
||||
|
||||
// !数组的赋值
|
||||
/*
|
||||
数组赋值有两种方式
|
||||
1.用赋值号直接赋值
|
||||
2.用循环赋值
|
||||
例如:
|
||||
int a[10]={1,2,3,4,5,6,7,8,9,10};
|
||||
int b[10];
|
||||
for(int i=0;i<10;i++)
|
||||
{
|
||||
b[i]=a[i];
|
||||
}
|
||||
数组不能用来赋另外一个数组的值
|
||||
*/
|
||||
|
||||
// !例题
|
||||
/*
|
||||
找出key在数组a中的位置
|
||||
@param key 要寻找的数字
|
||||
@param a 要寻找的数组
|
||||
@param length 数组a的长度
|
||||
@return 如果找到,返回其在a中的位置;如果找不到则返回-1
|
||||
*/
|
||||
|
||||
int search(int x, int a[], int len);
|
||||
|
||||
int main()
|
||||
{
|
||||
int a[] = {2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32}; //{[1]=2,4, [5]=6};
|
||||
{
|
||||
int i;
|
||||
printf("%lu\n", sizeof(a));
|
||||
printf("%lu\n", sizeof(a[0])); // sizeof(a[0])是数组中每个元素的大小,结果为4
|
||||
|
||||
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) // 相除得到了数组的单元个数,即sizeof(a)/sizeof(a[0])是数组的大小
|
||||
{
|
||||
printf("%d\t", a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int x;
|
||||
int location;
|
||||
printf("请输入要查找的数字:");
|
||||
scanf("%d", &x);
|
||||
location = search(x,a,sizeof(a)/sizeof(a[0]));
|
||||
if (location!=-1)
|
||||
{
|
||||
printf("%d在%d个位置上\n", x, location);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%d在数组中不存在\n", x);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int search(int x, int a[], int len)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
if (len==0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (int i=0;i<len;i++)
|
||||
{
|
||||
if (x==a[i])
|
||||
{
|
||||
ret = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[][5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
void yanghui(int rows);
|
||||
|
||||
int main()
|
||||
{
|
||||
int rows;
|
||||
printf("请输入杨辉三角的行数:");
|
||||
scanf("%d", &rows);
|
||||
|
||||
yanghui(rows);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void yanghui(int rows)
|
||||
{
|
||||
int triangle[rows][rows];
|
||||
triangle[0][0] = 1;
|
||||
|
||||
for (int i = 1; i < rows; i++)
|
||||
{
|
||||
// !第一列和最后一列都为1
|
||||
triangle[i][0] = 1;
|
||||
triangle[i][i] = 1;
|
||||
for (int j = 1; j < i; j++)
|
||||
{
|
||||
// !中间数为上一行相邻两数之和
|
||||
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
for (int j = 0; j <= i; j++)
|
||||
{
|
||||
printf("%d ", triangle[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
// ! 动态分配二维数组(int ** 类型)
|
||||
int **allocate_matrix(int rows, int cols);
|
||||
|
||||
// ! 输入l行m列的矩阵(适配 int ** 类型)
|
||||
void matrix_produce(int l, int m, int **a);
|
||||
|
||||
// ! 打印l行n列的矩阵(适配 int ** 类型)
|
||||
void matrix_print(int l, int n, int **c);
|
||||
|
||||
// ! 计算两个矩阵的和(补零相加)
|
||||
int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols);
|
||||
|
||||
// ! 释放二维数组内存
|
||||
void matrix_free(int **matrix, int rows);
|
||||
|
||||
int main()
|
||||
{
|
||||
// 矩阵A和B的行列数
|
||||
int n1, m1, n2, m2;
|
||||
|
||||
// 结果矩阵的行列数
|
||||
int result_rows, result_cols;
|
||||
|
||||
// ! 输入矩阵A的行列数并动态分配内存
|
||||
printf("输入矩阵A的行数和列数(用空格分隔): ");
|
||||
scanf("%d %d", &n1, &m1);
|
||||
|
||||
// 动态分配矩阵A(int ** 类型)
|
||||
int **A = allocate_matrix(n1, m1);
|
||||
printf("按行输入矩阵A的元素(每行%d个,用空格分隔):\n", m1);
|
||||
matrix_produce(n1, m1, A);
|
||||
|
||||
// ! 输入矩阵B的行列数并动态分配内存
|
||||
printf("输入矩阵B的行数和列数(用空格分隔): ");
|
||||
scanf("%d %d", &n2, &m2);
|
||||
|
||||
// 动态分配矩阵B(int ** 类型)
|
||||
int **B = allocate_matrix(n2, m2);
|
||||
printf("按行输入矩阵B的元素(每行%d个,用空格分隔):\n", m2);
|
||||
matrix_produce(n2, m2, B);
|
||||
|
||||
// ! 计算矩阵相加(补零相加)
|
||||
int **result = add_matrices(A, n1, m1, B, n2, m2, &result_rows, &result_cols);
|
||||
|
||||
// ! 输出结果矩阵
|
||||
printf("\n结果矩阵(行列数: %d×%d):\n", result_rows, result_cols);
|
||||
matrix_print(result_rows, result_cols, result);
|
||||
|
||||
// ! 释放所有动态分配的内存
|
||||
matrix_free(A, n1);
|
||||
matrix_free(B, n2);
|
||||
matrix_free(result, result_rows);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ! 动态分配二维数组(int ** 类型)
|
||||
int **allocate_matrix(int rows, int cols)
|
||||
{
|
||||
int **matrix = (int **)malloc(rows * sizeof(int *)); // 分配行指针数组
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
matrix[i] = (int *)malloc(cols * sizeof(int)); // 分配每行的列空间
|
||||
}
|
||||
return matrix;
|
||||
}
|
||||
|
||||
// ! 输入l行m列的矩阵(适配 int ** 类型)
|
||||
void matrix_produce(int l, int m, int **a)
|
||||
{
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]); // 通过指针访问动态分配的矩阵元素
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ! 计算两个矩阵的和(补零相加)
|
||||
int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols)
|
||||
{
|
||||
// 计算结果矩阵的尺寸(行数和列数的最大值)
|
||||
*result_rows = (n1 > n2) ? n1 : n2;
|
||||
*result_cols = (m1 > m2) ? m1 : m2;
|
||||
int **result = allocate_matrix(*result_rows, *result_cols); // 动态分配结果矩阵
|
||||
|
||||
// 逐位置计算相加结果(补零逻辑)
|
||||
for (int i = 0; i < *result_rows; i++)
|
||||
{
|
||||
for (int j = 0; j < *result_cols; j++)
|
||||
{
|
||||
int a = (i < n1 && j < m1) ? A[i][j] : 0; // A超出范围则为0
|
||||
int b = (i < n2 && j < m2) ? B[i][j] : 0; // B超出范围则为0
|
||||
result[i][j] = a + b;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// ! 打印l行n列的矩阵(适配 int ** 类型)
|
||||
void matrix_print(int l, int n, int **c)
|
||||
{
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]); // 通过指针访问动态分配的矩阵元素
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
// ! 释放二维数组内存
|
||||
void matrix_free(int **matrix, int rows)
|
||||
{
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
free(matrix[i]); // 释放每行的内存
|
||||
}
|
||||
free(matrix); // 释放行指针数组
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
// !输入l行m列的矩阵
|
||||
void matrix_produce(int l, int m, int a[l][m])
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// !打印l行n列的矩阵
|
||||
void matrix_print(int l, int n, int c[l][n])
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int l, m;
|
||||
printf("请输入方阵的行数l和列数m(必须相等):");
|
||||
scanf("%d %d", &l, &m);
|
||||
|
||||
if (l != m)
|
||||
{
|
||||
printf("错误:输入的不是方阵(行数≠列数)!\n");
|
||||
return 1;
|
||||
}
|
||||
int n = l;
|
||||
|
||||
int a[n][n];
|
||||
matrix_produce(n, n, a);
|
||||
|
||||
int sum_main = 0;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
sum_main += a[i][i];
|
||||
}
|
||||
|
||||
int sum_anti = 0;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
int j = n - 1 - i;
|
||||
sum_anti += a[i][j];
|
||||
}
|
||||
|
||||
int total_sum;
|
||||
if (n % 2 == 1)
|
||||
{
|
||||
int duplicate_i = (n - 1) / 2;
|
||||
total_sum = sum_main + sum_anti - a[duplicate_i][duplicate_i];
|
||||
}
|
||||
else
|
||||
{
|
||||
total_sum = sum_main + sum_anti;
|
||||
}
|
||||
|
||||
printf("主对角线和为:%d\n", sum_main);
|
||||
printf("副对角线和为:%d\n", sum_anti);
|
||||
printf("两条对角线总和(重复位置仅一次):%d\n", total_sum);
|
||||
|
||||
return 0;
|
||||
}
|
||||
+249
@@ -0,0 +1,249 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !动态分配二维数组(int ** 类型)
|
||||
int **allocate_matrix(int rows, int cols);
|
||||
|
||||
// !输入l行m列的矩阵
|
||||
void matrix_produce(int l, int m, int a[l][m]);
|
||||
|
||||
// !打印l行n列的矩阵
|
||||
void matrix_print(int l, int n, int c[l][n]);
|
||||
|
||||
// !矩阵的乘法运算
|
||||
void matrix_multiply(int l, int m, int n, int a[l][m], int b[m][n], int c[l][n]);
|
||||
|
||||
// !检查矩阵是否对称
|
||||
int matrix_check_symmetry(int matrix[][200], int size);
|
||||
|
||||
// !转置矩阵:将src[l][m]转置为dest[m][l]
|
||||
void matrix_transpose(int l, int m, int src[l][m], int dest[m][l]);
|
||||
|
||||
// !查找矩阵中的最大值
|
||||
int matrix_max_value(int l, int m, int mat[l][m]);
|
||||
|
||||
// !计算主对角线和(i == j)
|
||||
int calculate_main_diagonal(int n, int mat[n][n]);
|
||||
|
||||
// !计算副对角线和(i + j == n-1)
|
||||
int calculate_anti_diagonal(int n, int mat[n][n]);
|
||||
|
||||
// !计算两个矩阵的和(补零相加)
|
||||
int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols);
|
||||
|
||||
// !找出二维数组中的鞍点(行最大且列最小)
|
||||
void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols]);
|
||||
|
||||
// !释放二维数组内存
|
||||
void matrix_free(int **matrix, int rows);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int **allocate_matrix(int rows, int cols)
|
||||
{
|
||||
// !动态分配二维数组(int ** 类型)
|
||||
int **matrix = (int **)malloc(rows * sizeof(int *)); // 分配行指针数组
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
matrix[i] = (int *)malloc(cols * sizeof(int)); // 分配每行的列空间
|
||||
}
|
||||
return matrix;
|
||||
}
|
||||
|
||||
void matrix_produce(int l, int m, int a[l][m])
|
||||
{
|
||||
// !矩阵的输入
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_multiply(int l, int m, int n, int a[l][m], int b[m][n], int c[l][n])
|
||||
{
|
||||
// !矩阵的乘法运算
|
||||
int i, j, k;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
c[i][j] = 0;
|
||||
for (k = 0; k < m; k++)
|
||||
{
|
||||
c[i][j] += a[i][k] * b[k][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_print(int l, int n, int c[l][n])
|
||||
{
|
||||
// !矩阵的打印
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
int matrix_check_symmetry(int matrix[][200], int size)
|
||||
{
|
||||
// !检查矩阵是否对称
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
for (int j = 0; j < size; j++)
|
||||
{
|
||||
if (matrix[i][j] != matrix[j][i])
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void matrix_transpose(int l, int m, int src[l][m], int dest[m][l])
|
||||
{
|
||||
// !转置矩阵:将src[l][m]转置为dest[m][l]
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < m; j++)
|
||||
{
|
||||
dest[j][i] = src[i][j]; // 核心转置逻辑
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int matrix_max_value(int l, int m, int mat[l][m])
|
||||
{
|
||||
// !查找mat矩阵中的最大值
|
||||
int max = mat[0][0]; // 初始化最大值为第一个元素
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < m; j++)
|
||||
{
|
||||
if (mat[i][j] > max)
|
||||
{
|
||||
max = mat[i][j]; // 更新最大值
|
||||
}
|
||||
}
|
||||
}
|
||||
return max; // 返回最大值
|
||||
}
|
||||
|
||||
int calculate_main_diagonal(int n, int mat[n][n])
|
||||
{
|
||||
// !计算主对角线和(i == j)
|
||||
int sum = 0;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
sum += mat[i][i];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
int calculate_anti_diagonal(int n, int mat[n][n])
|
||||
{
|
||||
// !计算副对角线和(i + j == n-1)
|
||||
int sum = 0;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
int j = n - 1 - i;
|
||||
sum += mat[i][j];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols)
|
||||
{
|
||||
// !计算两个矩阵的和(补零相加)
|
||||
// 计算结果矩阵的尺寸(行数和列数的最大值)
|
||||
*result_rows = (n1 > n2) ? n1 : n2;
|
||||
*result_cols = (m1 > m2) ? m1 : m2;
|
||||
int **result = allocate_matrix(*result_rows, *result_cols); // 动态分配结果矩阵
|
||||
|
||||
// 逐位置计算相加结果(补零逻辑)
|
||||
for (int i = 0; i < *result_rows; i++)
|
||||
{
|
||||
for (int j = 0; j < *result_cols; j++)
|
||||
{
|
||||
int a = (i < n1 && j < m1) ? A[i][j] : 0; // A超出范围则为0
|
||||
int b = (i < n2 && j < m2) ? B[i][j] : 0; // B超出范围则为0
|
||||
result[i][j] = a + b;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols])
|
||||
{
|
||||
// !找出二维数组中的鞍点(行最大且列最小)
|
||||
// 标记是否找到鞍点
|
||||
int has_saddle = 0;
|
||||
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
// !步骤1:找到当前行的最大值
|
||||
int row_max = matrix[i][0];
|
||||
int col_max = 0;
|
||||
|
||||
for (int j = 0; j < cols; j++)
|
||||
{
|
||||
if (matrix[i][j] > row_max)
|
||||
{
|
||||
row_max = matrix[i][j];
|
||||
col_max = j;
|
||||
}
|
||||
}
|
||||
|
||||
// !步骤2:检查该行最大值是否是所在列的最小值
|
||||
int col_min = matrix[0][col_max]; // 初始化列最小值为当前列第一行
|
||||
for (int k = 1; k < rows; k++)
|
||||
{
|
||||
// 遍历当前列的所有行
|
||||
if (matrix[k][col_max] < col_min)
|
||||
{
|
||||
col_min = matrix[k][col_max]; // 更新列最小值
|
||||
}
|
||||
}
|
||||
|
||||
// !步骤3:判断是否为鞍点(行最大且列最小)
|
||||
if (row_max == col_min)
|
||||
{
|
||||
printf("鞍点坐标为(%d, %d),值为:%d\n", i, col_max, row_max);
|
||||
has_saddle = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 未找到鞍点时提示
|
||||
if (has_saddle == 0)
|
||||
{
|
||||
printf("该矩阵没有鞍点!\n");
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_free(int **matrix, int rows)
|
||||
{
|
||||
// !释放二维数组内存
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
free(matrix[i]); // 释放每行的内存
|
||||
}
|
||||
free(matrix); // 释放行指针数组
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
// !输入l行m列的矩阵
|
||||
void matrix_produce(int l, int m, int a[l][m])
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// !打印l行n列的矩阵
|
||||
void matrix_print(int l, int n, int c[l][n])
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int l, m, max;
|
||||
printf("请输入矩阵的行数l和列数m:");
|
||||
scanf("%d %d", &l, &m);
|
||||
|
||||
int a[l][m];
|
||||
|
||||
printf("请输入%d行%d列的矩阵数据:\n", l, m);
|
||||
matrix_produce(l, m, a);
|
||||
|
||||
max = a[0][0];
|
||||
int row = 0;
|
||||
int col = 0;
|
||||
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < m; j++)
|
||||
{
|
||||
if (a[i][j] > max)
|
||||
{
|
||||
max = a[i][j];
|
||||
row = i;
|
||||
col = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("矩阵为:\n");
|
||||
matrix_print(l, m, a);
|
||||
printf("矩阵的最大值为:%d,位置为(%d,%d)\n", max, row, col);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// !二维数组
|
||||
/*
|
||||
int a[3][5];
|
||||
通常理解为a是一个3行5列的矩阵
|
||||
*/
|
||||
|
||||
// !二维数组的遍历
|
||||
/*
|
||||
for ( i=0; i<3; i++)
|
||||
{
|
||||
for ( j=0; j<5; j++ )
|
||||
{
|
||||
a[i][j] = i*j;
|
||||
}
|
||||
}
|
||||
a[i][i]是一个int
|
||||
表示第i行第j列上的单元
|
||||
但a[i,j]是数学上表示a是一个i行j列的矩阵,在C语言是a[i][j]
|
||||
*/
|
||||
|
||||
// !二维数组的初始化
|
||||
/*
|
||||
nt a[] [5] =
|
||||
{
|
||||
{0,1,2,3,4},
|
||||
{2,3,4,5,6
|
||||
};
|
||||
列数是必须给出的,行数可以由编译器来数每行一个,逗号分隔
|
||||
最后的逗号可以存在,有古老的传统
|
||||
如果省略,表示补零
|
||||
也可以用定位(*C99 标准)
|
||||
*/
|
||||
|
||||
// !输入l行m列的矩阵
|
||||
void matrix_produce(int l, int m, int a[l][m])
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < m; j++)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// !打印l行n列的矩阵
|
||||
void matrix_print(int l, int n, int c[l][n])
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < l; i++)
|
||||
{
|
||||
for (j = 0; j < n; j++)
|
||||
{
|
||||
printf("%d ", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int l, m;
|
||||
printf("请输入矩阵的行数l和列数m:");
|
||||
scanf("%d %d", &l, &m);
|
||||
|
||||
int a[l][m];
|
||||
int b[m][l];
|
||||
|
||||
printf("请输入%d行%d列的矩阵数据:\n", l, m);
|
||||
matrix_produce(l, m, a);
|
||||
|
||||
for (int i = 0; i < l; i++)
|
||||
{
|
||||
for (int j = 0; j < m; j++)
|
||||
{
|
||||
b[j][i] = a[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
printf("转置后的矩阵为:\n");
|
||||
matrix_print(m, l, b);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user