?
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include<math.h>
// 定義一個(gè)結(jié)構(gòu)體類型,表示一個(gè)矩陣
typedef struct matrix
{
? ? int nrow; // 矩陣的行數(shù)
? ? int ncol; // 矩陣的列數(shù)
? ? double data[10][10]; // 矩陣的數(shù)據(jù),最大為 10 x 10
} matrix;
// 定義一個(gè)函數(shù),用于顯示一個(gè)矩陣的內(nèi)容?
void display_matrix(matrix m)
{
? ? int i,j;
? ? // 用兩層循環(huán)遍歷矩陣的每個(gè)元素
?? ?for(i=0; i<m.nrow; i++)
? ? {
? ? ? ? for(j=0; j<m.ncol; j++)
? ? ? ? {
? ? ? ? ? ? // 打印矩陣的當(dāng)前元素,保留小數(shù)點(diǎn)后六位
? ? ? ? ? ? printf(" %f",m.data[i][j]);
? ? ? ? }
? ? ? ? // 換行
? ? ? ? printf("\n");
? ? }
}
?// 定義一個(gè)函數(shù),用于計(jì)算一個(gè)矩陣的轉(zhuǎn)置
matrix matrix_t(matrix m)
{
? ? int i,j;
?? ?matrix c; // 定義一個(gè)新的矩陣,用于存儲(chǔ)轉(zhuǎn)置結(jié)果
? ? c.nrow=m.ncol; // 轉(zhuǎn)置后的矩陣的行數(shù)等于原矩陣的列數(shù)
? ? c.ncol=m.nrow; // 轉(zhuǎn)置后的矩陣的列數(shù)等于原矩陣的行數(shù)
? ? // 用兩層循環(huán)遍歷原矩陣的每個(gè)元素
? ? for (i = 0; i < m.nrow; i++)
? ? {
? ? ? ? for(j = 0; j < m.ncol; j++)
? ? ? ? {
? ? ? ? ? ? // 將原矩陣的第 i 行第 j 列的元素賦值給轉(zhuǎn)置后的矩陣的第 j 行第 i 列
? ? ? ? ? ? c.data[j][i] = m.data[i][j];
? ? ? ? }
? ? }
? ? display_matrix(c); // 調(diào)用 display_matrix 函數(shù),顯示轉(zhuǎn)置后的矩陣
? ? return c; // 返回轉(zhuǎn)置后的矩陣
}
?// 定義一個(gè)函數(shù),用于計(jì)算兩個(gè)矩陣的加法
matrix matrix_add(matrix a, matrix b)
{
? ? matrix c; // 定義一個(gè)新的矩陣,用于存儲(chǔ)加法結(jié)果
? ? c.nrow=a.ncol; // 結(jié)果矩陣的行數(shù)等于兩個(gè)矩陣的行數(shù)
? ? c.ncol=a.nrow; // 結(jié)果矩陣的列數(shù)等于兩個(gè)矩陣的列數(shù)? ? ?int i, j;
? ? // 用兩層循環(huán)遍歷兩個(gè)矩陣的每個(gè)元素
? ? for (i = 0; i < a.nrow; i++)
? ? {
? ? ? ? for(j = 0; j < a.ncol; j++)
? ? ? ? {
? ? ? ? ? ? // 將兩個(gè)矩陣的對(duì)應(yīng)元素相加,賦值給結(jié)果矩陣的對(duì)應(yīng)位置
? ? ? ? ? ? c.data[i][j]=a.data[i][j]+b.data[i][j];
? ? ? ? }
? ? }
? ? display_matrix(c); // 調(diào)用 display_matrix 函數(shù),顯示加法結(jié)果
? ? return c; // 返回加法結(jié)果
}
// 定義一個(gè)函數(shù),用于計(jì)算兩個(gè)矩陣的減法
matrix matrix_minus(matrix a, matrix b)
{
? ? matrix c; // 定義一個(gè)新的矩陣,用于存儲(chǔ)減法結(jié)果
? ? c.nrow=a.ncol; // 結(jié)果矩陣的行數(shù)等于兩個(gè)矩陣的行數(shù)
? ? c.ncol=a.nrow; // 結(jié)果矩陣的列數(shù)等于兩個(gè)矩陣的列數(shù)? ? int i, j;
? ? // 用兩層循環(huán)遍歷兩個(gè)矩陣的每個(gè)元素
? ? for (i = 0; i < a.nrow; i++)
? ? {
? ? ? ? for(j = 0; j < a.ncol; j++)
? ? ? ? {
? ? ? ? ? ? // 將兩個(gè)矩陣的對(duì)應(yīng)元素相減,賦值給結(jié)果矩陣的對(duì)應(yīng)位置
? ? ? ? ? ? c.data[i][j]=a.data[i][j]-b.data[i][j];
? ? ? ? }
? ? }
? ? display_matrix(c); // 調(diào)用 display_matrix 函數(shù),顯示減法結(jié)果
? ? return c; // 返回減法結(jié)果
}
?// 定義一個(gè)函數(shù),用于計(jì)算兩個(gè)矩陣的乘法
matrix matrix_mul(matrix a, matrix b)
{
? ? matrix c; // 定義一個(gè)新的矩陣,用于存儲(chǔ)乘法結(jié)果
? ? c.nrow=a.ncol; // 結(jié)果矩陣的行數(shù)等于第一個(gè)矩陣的行數(shù)
? ? c.ncol=b.nrow; // 結(jié)果矩陣的列數(shù)等于第二個(gè)矩陣的列數(shù)? ? int i, j,k;
? ? // 用三層循環(huán)遍歷兩個(gè)矩陣的每個(gè)元素
? ? for (i = 0; i < a.nrow; i++)
? ? {
? ? ? ? for(j = 0; j < b.ncol; j++)
? ? ? ? {
? ? ? ? ? ? double tmp=0; // 定義一個(gè)臨時(shí)變量,用于存儲(chǔ)乘法的中間結(jié)果
? ? ? ? ? ? for(k=0; k<a.ncol; k++)
? ? ? ? ? ? ? ? // 將第一個(gè)矩陣的第 i 行的每個(gè)元素與第二個(gè)矩陣的第 j 列的每個(gè)元素相乘,并累加到臨時(shí)變量中
? ? ? ? ? ? ? ? tmp+=a.data[i][k]*b.data[k][j];
? ? ? ? ? ? c.data[i][j]=tmp; // 將臨時(shí)變量的值賦值給結(jié)果矩陣的對(duì)應(yīng)位置
? ? ? ? }
? ? }
? ? display_matrix(c); // 調(diào)用 display_matrix 函數(shù),顯示乘法結(jié)果
? ? return c; // 返回乘法結(jié)果
}
// 定義一個(gè)函數(shù),用于計(jì)算一個(gè)矩陣的逆
int ?matrix_inv(matrix m)
{
? ? int i,j;
?? ?int ndimen=m.nrow; // 獲取矩陣的行數(shù)(假設(shè)是方陣)
? ? double a_matrix[3][3]; // 定義一個(gè)臨時(shí)的 3 x 3 矩陣,用于存儲(chǔ)計(jì)算過程中的結(jié)果
? ? ?int k, k1, k2, k3, ?j2, i2, kme[20], kmf[20]; // 定義一些輔助變量,用于記錄矩陣的行列交換
? ? for (i=0;i<ndimen;i++){
? ? ? ? for(j=0;j<ndimen;j++)
? ? ? ? ? ? a_matrix[i][j]=m.data[i][j]; // 將原矩陣的數(shù)據(jù)復(fù)制到臨時(shí)矩陣中
? ? }
? ? double tmp, tmp2, b_tmp[20], c_tmp[20]; // 定義一些臨時(shí)變量,用于存儲(chǔ)計(jì)算過程中的中間值? ? i2 = j2 = 0; // 初始化 i2 和 j2 為 0
? ? for (k = 0; k < ndimen; k++) // 從第 0 行開始,遍歷每一行
? ? {
? ? ? ? tmp2 = 0.0; // 初始化 tmp2 為 0.0
? ? ? ? for (i = k; i < ndimen; i++) // 從第 k 行開始,遍歷每一行
? ? ? ? {
? ? ? ? ? ? for (j = k; j < ndimen; j++) // 從第 k 列開始,遍歷每一列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (fabs(a_matrix[i][j] ) <= fabs(tmp2)) // 如果當(dāng)前元素的絕對(duì)值小于等于 tmp2
? ? ? ? ? ? ? ? ? ? continue; // 跳過當(dāng)前元素
? ? ? ? ? ? ? ? tmp2 = a_matrix[i][j];//最大值 // 否則,將當(dāng)前元素賦值給 tmp2,作為最大值
? ? ? ? ? ? ? ? i2 = i; // 記錄最大值所在的行號(hào)
? ? ? ? ? ? ? ? j2 = j; // 記錄最大值所在的列號(hào)
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (i2 != k) // 如果最大值所在的行號(hào)不等于 k
? ? ? ? {
? ? ? ? ? ? for (j = 0; j < ndimen; j++) // 遍歷每一列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? tmp = a_matrix[i2][j]; // 交換第 i2 行和第 k 行的元素
? ? ? ? ? ? ? ? a_matrix[i2][j] = a_matrix[k][j];
? ? ? ? ? ? ? ? a_matrix[k][j] = tmp;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (j2 != k) // 如果最大值所在的列號(hào)不等于 k
? ? ? ? {
? ? ? ? ? ? for (i = 0; i < ndimen; i++) // 遍歷每一行
? ? ? ? ? ? {
? ? ? ? ? ? ? ? tmp = a_matrix[i][j2]; // 交換第 j2 列和第 k 列的元素
? ? ? ? ? ? ? ? a_matrix[i][j2] = a_matrix[i][k];
? ? ? ? ? ? ? ? a_matrix[i][k] = tmp;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? kme[k] = i2; // 記錄第 k 次交換的行號(hào)
? ? ? ? kmf[k] = j2; // 記錄第 k 次交換的列號(hào)
? ? ? ? for (j = 0; j < ndimen; j++) // 遍歷每一列
? ? ? ? {
? ? ? ? ? ? if (j == k) // 如果是第 k 列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? b_tmp[j] = 1.0 / tmp2; // 將最大值的倒數(shù)賦值給 b_tmp[j]
? ? ? ? ? ? ? ? c_tmp[j] = 1.0; // 將 1.0 賦值給 c_tmp[j]
? ? ? ? ? ? }
? ? ? ? ? ? else // 如果不是第 k 列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? b_tmp[j] = -a_matrix[k][j] / tmp2; // 將第 k 行第 j 列的元素的相反數(shù)除以最大值賦值給 b_tmp[j]
? ? ? ? ? ? ? ? c_tmp[j] = a_matrix[j][k]; // 將第 j 行第 k 列的元素賦值給 c_tmp[j]
? ? ? ? ? ? }
? ? ? ? ? ? a_matrix[k][j] = 0.0; // 將第 k 行第 j 列的元素賦值為 0.0
? ? ? ? ? ? a_matrix[j][k] = 0.0; // 將第 j 行第 k 列的元素賦值為 0.0
? ? ? ? }
? ? ? ? for (i = 0; i < ndimen; i++) // 遍歷每一行
? ? ? ? {
? ? ? ? ? ? for (j = 0; j < ndimen; j++) // 遍歷每一列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? a_matrix[i][j] = a_matrix[i][j] + c_tmp[i] * b_tmp[j]; // 將第 i 行第 j 列的元素加上 c_tmp[i] 乘以 b_tmp[j] 的結(jié)果
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? for (k3 = 0; k3 < ndimen; ?k3++) // 從第 0 行開始,遍歷每一行
? ? {
? ? ? ? k ?= ndimen - k3 - 1; // 計(jì)算當(dāng)前行號(hào)的倒序
? ? ? ? k1 = kme[k]; // 獲取第 k 次交換的行號(hào)
? ? ? ? k2 = kmf[k]; // 獲取第 k 次交換的列號(hào)
? ? ? ? if (k1 != k) // 如果行號(hào)不等于 k
? ? ? ? {
? ? ? ? ? ? for (i = 0; i < ndimen; i++) // 遍歷每一行
? ? ? ? ? ? {
? ? ? ? ? ? ? ? tmp = a_matrix[i][k1]; // 交換第 k1 列和第 k 列的元素
? ? ? ? ? ? ? ? a_matrix[i][k1] = a_matrix[i][k];
? ? ? ? ? ? ? ? a_matrix[i][k] = tmp;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (k2 != k) // 如果列號(hào)不等于 k
? ? ? ? {
? ? ? ? ? ? for(j = 0; j < ndimen; j++) // 遍歷每一列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? tmp = a_matrix[k2][j]; // 交換第 k2 行和第 k 行的元素
? ? ? ? ? ? ? ? a_matrix[k2][j] = a_matrix[k][j];
? ? ? ? ? ? ? ? a_matrix[k][j] = tmp;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? for (i=0;i<ndimen;i++){ // 遍歷每一行
? ? ? ? for(j=0;j<ndimen;j++) // 遍歷每一列
? ? ? ? ? ? printf(" %f",a_matrix[i][j]); // 打印臨時(shí)矩陣的元素,保留小數(shù)點(diǎn)后六位
? ? ? ? printf("\n"); // 換行
? ? }
? ? return (0); // 返回 0,表示函數(shù)執(zhí)行成功
}
// 定義一個(gè)函數(shù),用于計(jì)算一個(gè)矩陣與一個(gè)數(shù)的乘法?
matrix matrix_numMulti(matrix a){
? ? ? ? int n; // 定義一個(gè)整型變量,用于存儲(chǔ)輸入的數(shù)
? ? matrix c; // 定義一個(gè)新的矩陣,用于存儲(chǔ)乘法結(jié)果
? ? c.nrow=a.nrow; // 結(jié)果矩陣的行數(shù)等于原矩陣的行數(shù)
? ? c.ncol=a.ncol; // 結(jié)果矩陣的列數(shù)等于原矩陣的列數(shù)? ? int i, j;
? ? printf("請(qǐng)輸入一個(gè)數(shù):"); // 提示用戶輸入一個(gè)數(shù)
? ? scanf("%d",&n); // 從標(biāo)準(zhǔn)輸入讀取一個(gè)整數(shù),賦值給 n
? ? for (i = 0; i < a.nrow; i++) // 遍歷原矩陣的每一行
? ? {
? ? ? ? for(j = 0; j < a.ncol; j++) // 遍歷原矩陣的每一列
? ? ? ? {
? ? ? ? ? ? c.data[i][j]=a.data[i][j]*n; // 將原矩陣的第 i 行第 j 列的元素乘以 n,賦值給結(jié)果矩陣的對(duì)應(yīng)位置
? ? ? ? }
? ? }
? ? display_matrix(c); // 調(diào)用 display_matrix 函數(shù),顯示乘法結(jié)果
? ? return c; // 返回乘法結(jié)果}
// 定義一個(gè)函數(shù),用于顯示程序的功能菜單
void interface()
{
? ? printf("----------------------------————————————————————————————\n");
? ? printf("----------------------------————————————————————————————\n");
? ? printf(" ? ? ? ? ? 1.顯示A、B矩陣 ? ? ? ? ? ? ? ? ? ? ? 2.求矩陣A的轉(zhuǎn)置\n"); // 1.顯示兩個(gè)已定義的矩陣 A 和 B,2.計(jì)算并顯示矩陣 A 的轉(zhuǎn)置
? ? printf(" ? ? ? ? ? 3.求兩矩陣的和 ? ? ? ? ? ? ? ? ? ? ? 4.求兩矩陣的差\n"); // 3.計(jì)算并顯示矩陣 A 和 B 的加法結(jié)果,4.計(jì)算并顯示矩陣 A 和 B 的減法結(jié)果
? ? printf(" ? ? ? ? ? 5.求兩矩陣的積 ? ? ? ? ? ? ? ? ? ? ? 6.求矩陣A的逆\n"); // 5.計(jì)算并顯示矩陣 A 和 B 的乘法結(jié)果,6.計(jì)算并顯示矩陣 A 的逆
? ? printf(" ? ? ? ? ? 7.數(shù)乘 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 8.退出程序 ?\n"); // 7.提示用戶輸入一個(gè)數(shù),計(jì)算并顯示矩陣 A 與該數(shù)的乘法結(jié)果,8.退出程序
? ? ?printf(" ? ? ? ? ? 0.查看程序功能 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\n"); // 0.重新顯示程序的功能菜單
? ? printf("----------------------------————————————————————————————\n");
? ? printf("----------------------------————————————————————————————\n");
}
int main()
{
//文件讀取,int dim1,dim2; int ta[3][3];int tb[3][3];?
/*oo.txt 文件
3
1 2 3
5 4 3
6 5 4
3
2 5 4
3 4 5
9 6 4
*/
? ? int dim1,dim2; // 定義一個(gè)整型變量,表示矩陣的維度(假設(shè)是 3 x 3 的方陣)
? ? int ta[3][3]; // 定義一個(gè)二維數(shù)組,表示矩陣 A 的數(shù)據(jù)
? ? int tb[3][3];
? ? int i,j;
? ? FILE *fp;
? ? fp=fopen("oo.txt","r");
? ? if(fp==NULL){
? ? ? ? printf("無法打開文件!");
? ? ? ? return 0;
? ? }? ? ? ? fscanf(fp,"%d",&dim1);
? ? ? ? for(i=0;i<3;i++){
? ? ? ? ? ? for(j=0;j<3;j++){
? ? ? ? ? ? fscanf(fp,"%d",&ta[i][j]);
? ? ? ? ? ? }
? ? }
? ??
? ? fscanf(fp,"%d",&dim2);
? ? for(i=0;i<3;i++){
? ? ? ? ? ? for(j=0;j<3;j++){
? ? ? ? ? ? fscanf(fp,"%d",&tb[i][j]);
? ? ? ? ? ? }
? ? }
//可輸出查看是否成功讀取
? ? /* for(i=0;i<3;i++){
? ? ? ? ? ? for(j=0;j<3;j++){
? ? ? ? ? ? printf("%d",ta[i][j]);
? ? ? ? ? ? }
? ? ? ? ? ? printf("\n");
? ? }
*/
? ? fclose(fp);
? ? matrix a,b; // 定義兩個(gè)矩陣類型的變量,分別表示矩陣 A 和 B
? ? a.nrow=a.ncol=dim1; // 設(shè)置矩陣 A 的行數(shù)和列數(shù)為 dim
? ? for(i=0; i<a.nrow; i++) // 遍歷每一行
? ? {
? ? ? ? for(j=0; j<a.ncol; j++) // 遍歷每一列
? ? ? ? {
? ? ? ? ? ? a.data[i][j]=(double)(ta[i][j]); // 將二維數(shù)組的數(shù)據(jù)賦值給矩陣 A 的數(shù)據(jù)
? ? ? ? }
? ? }
? ?? ? b.nrow=b.ncol=dim2; // 設(shè)置矩陣 B 的行數(shù)和列數(shù)為 dim
? ? for(i=0; i<b.nrow; i++) // 遍歷每一行
? ? {
? ? ? ? for(j=0; j<b.ncol; j++) // 遍歷每一列
? ? ? ? {
? ? ? ? ? ? b.data[i][j]=tb[i][j]; // 將二維數(shù)組的數(shù)據(jù)賦值給矩陣 B 的數(shù)據(jù)
? ? ? ? }
? ? }文章來源:http://www.zghlxwxcb.cn/news/detail-843679.html? ? interface(); // 調(diào)用 interface 函數(shù),顯示程序的功能菜單
? ? int choice=0; // 定義一個(gè)整型變量,用于存儲(chǔ)用戶的選擇
? ? while(choice>=0&&choice<8) // 當(dāng)用戶的選擇在 0 到 7 之間時(shí),循環(huán)執(zhí)行
? ? {
? ? ? ? printf("\n請(qǐng)選擇:"); // 提示用戶選擇
? ? ? ? scanf("%d",&choice); // 從標(biāo)準(zhǔn)輸入讀取一個(gè)整數(shù),賦值給 choice
? ? ? ? switch(choice) // 根據(jù) choice 的值,執(zhí)行相應(yīng)的操作
? ? ? ? {
? ? ? ? case 0: // 如果 choice 為 0
? ? ? ? ? ? interface(); // 重新顯示程序的功能菜單
? ? ? ? ? ? break; // 跳出 switch 語句
? ? ? ? case 1: // 如果 choice 為 1
? ? ? ? ? ? printf("A:\n"); // 打印 A
? ? ? ? ? ? display_matrix(a); // 調(diào)用 display_matrix 函數(shù),顯示矩陣 A
? ? ? ? ? ? printf("B:\n"); // 打印 B
? ? ? ? ? ? display_matrix(b); // 調(diào)用 display_matrix 函數(shù),顯示矩陣 B
? ? ? ? ? ? break; // 跳出 switch 語句
? ? ? ? case 2: // 如果 choice 為 2
? ? ? ? ? ? printf("A的轉(zhuǎn)置:\n"); // 打印 A 的轉(zhuǎn)置
? ? ? ? ? ? matrix_t(a); // 調(diào)用 matrix_t 函數(shù),計(jì)算并顯示矩陣 A 的轉(zhuǎn)置
? ? ? ? ? ? break; // 跳出 switch 語句
? ? ? ? case 3: // 如果 choice 為 3
? ? ? ? ? ? printf("A+B:\n"); // 打印 A + B
? ? ? ? ? ? matrix_add(a,b); // 調(diào)用 matrix_add 函數(shù),計(jì)算并顯示矩陣 A 和 B 的加法結(jié)果
? ? ? ? ? ? break; // 跳出 switch 語句
? ? ? ? case 4: // 如果 choice 為 4
? ? ? ? ? ? printf("A-B:\n"); // 打印 A - B
? ? ? ? ? ? matrix_minus(a,b); // 調(diào)用 matrix_minus 函數(shù),計(jì)算并顯示矩陣 A 和 B 的減法結(jié)果
? ? ? ? ? ? break; // 跳出 switch 語句
? ? ? ? case 5: // 如果 choice 為 5
? ? ? ? ? ? printf("AxB:\n"); // 打印 A x B
? ? ? ? ? ? matrix_mul(a,b); // 調(diào)用 matrix_mul 函數(shù),計(jì)算并顯示矩陣 A 和 B 的乘法結(jié)果
? ? ? ? ? ? break; // 跳出 switch 語句
? ? ? ? case 6: // 如果 choice 為 6
? ? ? ? ? ? printf("A的逆:\n"); // 打印 A 的逆
? ? ? ? ? ? matrix_inv(a); // 調(diào)用 matrix_inv 函數(shù),計(jì)算并顯示矩陣 A 的逆
? ? ? ? ? ? break; // 跳出 switch 語句
? ? ? ? case 7: // 如果 choice 為 7
? ? ? ? ? ? printf("A的數(shù)乘"); // 打印 A 的數(shù)乘
? ? ? ? ? ? matrix_numMulti(a); // 調(diào)用 matrix_numMulti 函數(shù),提示用戶輸入一個(gè)數(shù),計(jì)算并顯示矩陣 A 與該數(shù)的乘法結(jié)果
? ? ? ? default: // 如果 choice 不在 0 到 7 之間
? ? ? ? ? ? printf("成功退出!\n"); // 打印退出信息
? ? ? ? }
? ? }
? ? return 0; // 返回 0,表示程序正常結(jié)束
}文章來源地址http://www.zghlxwxcb.cn/news/detail-843679.html
到了這里,關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)課設(shè):矩陣的運(yùn)算(轉(zhuǎn)置.求和.求差.矩陣相乘.求逆.數(shù)乘),文件讀取矩陣的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!