Initial commit: C language learning code

This commit is contained in:
2025-07-20 16:30:56 +08:00
commit 06e24173a6
139 changed files with 9303 additions and 0 deletions
+181
View File
@@ -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;
}
+150
View File
@@ -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");
}
}
+67
View File
@@ -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;
}
+30
View File
@@ -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
View File
@@ -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;
}
+44
View File
@@ -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
View File
@@ -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;
}
+78
View File
@@ -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); // 释放行指针数组
}
+112
View File
@@ -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
View File
@@ -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); // 释放行指针数组
}
+100
View File
@@ -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;
}
+91
View File
@@ -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;
}