當前位置:首頁 » 編程語言 » c語言求矩陣行列數

c語言求矩陣行列數

發布時間: 2022-05-21 20:03:04

c語言 關於矩陣

方法1:直接定義10*10的數組,讀取全部數據,再根據選擇的行列數列印輸出部分數據。

方法2:通過文件流指針的移動,跨過不需要的內容。(這里控制文件流指針可利用ftell和fseek函數來移動指定位元組數)我是利用fscanf讀取需要的內容,遇到需要跳行就用fgets來跳過。(注意常量參數根據自己需求修改)。

說明:邊讀取邊列印輸出,就不需要變數存儲。我的代碼是把讀取出來的內容存放在三維數組中(文件內容你沒指定,如是單純數字,二維數組即可,我是作為字元串處理,故用三維數組。),數組是根據實際大小,動態申請,寫成兩個獨立函數。

下面是代碼:

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#define MAXR 10//文件中矩陣最大行

#define MAXC 10//文件中矩陣最大列

#define MS 3//矩陣中元素字元串最大字元數(包含結束符號,不可小於實際內容)

#define MBUF 100//文件中一行最大字元數,可設置大一點

char ***getMem(int r,int c,int len);//動態申請一個三維數組

void freeMem(char ***datas,int r,int c);//釋放數組空間

void showDatas(char ***datas,int r,int c);//列印輸出結果

int main()

{

int r=MAXR+1,c=MAXC+1,i=0,j=0;

char ***datas=NULL,str[3],buf[MBUF];

FILE *fp=NULL;

printf("請輸入要獲取的行數和列數: ");

while(r<0 || r>MAXR || c<0 || c>MAXC)scanf("%d%d",&r,&c);

datas=getMem(r,c,MS);

fp=fopen("C:\test.data","r");

if(!fp) return 1;

while(fscanf(fp,"%s",str)!=-1)

{

if(i<c) strcpy(datas[j][i],str),i++;

if(i==c)

{

if(!fgets(buf,sizeof(buf),fp)) break;

i=0,j++;

}

if(j==r) break;

}

showDatas(datas,r,c);

freeMem(datas,r,c);

return 0;

}

void showDatas(char ***datas,int r,int c)

{

int i,j;

for(i=0;i<r;i++,printf(" "))

for(j=0;j<c;j++)

printf("%s ",datas[i][j]);

printf(" ");

}

void freeMem(char ***datas,int r,int c)

{

int i,j;

if(!datas)

{

for(i=0;i<r;i++,free(datas[i]))

for(j=0;j<c;j++)

free(datas[i][j]);

free(datas);

}


}

char ***getMem(int r,int c,int len)

{

int i,j;

char ***datas=NULL,**dr=NULL;

datas=(char ***)malloc(sizeof(char **)*r);

if(!datas) return NULL;

for(i=0;i<r;i++)

{

dr=(char **)malloc(sizeof(char *)*c);

if(!dr) return NULL;

else

{

for(j=0;j<c;j++)

{

dr[j]=(char *)malloc(sizeof(char)*len);

if(!dr[j]) return NULL;

}

datas[i]=dr;

}

}

return datas;

}

② C語言:求矩陣中行和列的最值

#include<stdio.h>
int main()
{
int i,j,tem,m,n,a[500][500];
/*m表示行,n表示列*/

int rmax,cmax;
/*分別表示每行的最大值和每列的最大值*/

scanf("%d%d",&m,&n);
/*讀入矩陣的行與列*/

for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
/*讀入矩陣*/

for(i=0;i<m;i++)
{
rmax=0;
for(j=0;j<n;j++)
if(a[i][j]>rmax) rmax=a[i][j];
printf("The max number of the %d row is %d\n",i+1,rmax);
/*輸出每行的最大值*/
}

for(j=0;j<n;j++)
{
cmax=0;
for(i=0;i<m;i++)
if(a[i][j]>cmax)cmax=a[i][j];
printf("The max number of the %d column is %d\n",j+1,cmax);
/*輸出每列的最大值*/
}

return 0;
}
/*
最小值的話,跟最大值一樣原理,相信你會的,親測可用,如有幫助請及時採納
*/

③ C語言 求矩陣各行各列的和

思路:求矩陣各行的和時,矩陣的行先不變,利用for循環依次遍歷該行的每一列元素累加求和;求矩陣各列的和時,矩陣的列先不變,利用for循環依次遍歷該列的每一行元素累加求和。

參考代碼:

#include<stdio.h>
intSr(inta[3][5],intn)//求矩陣n行的累加和
{
inti,j,c=0;
for(j=0;j<5;j++)
c+=a[n][j];
returnc;
}
intSc(inta[3][5],intn)//求矩陣n列的累加和
{
inti,j,c=0;
for(i=0;i<3;i++)
c+=a[i][n];
returnc;
}

intmain()
{
inti,j,a[3][5]={1,3,5,7,9,2,4,6,8,10,3,5,8,7,6};
for(i=0;i<3;i++){
for(j=0;j<5;j++)
printf("%d",a[i][j]);
printf(" ");
}

printf("各行的累加和為: ");
for(i=0;i<3;i++)
printf("%d",Sr(a,i));
printf(" 各列的累加和為: ");
for(i=0;i<5;i++)
printf("%d",Sc(a,i));
return0;
}
/*
輸出:
13579
246810
35876
各行的累加和為:
253029
各列的累加和為:
612192225
*/

④ 怎樣用C語言計算一個矩陣文件的列數 如data.txt: 2.1 3.3 4.2 4.2 6.1 0.6 3.3 1.2 5.2

2.1
3.3
4.2
4.2
6.1
0.6
3.3
1.2
5.2
你不給行和列,這里只能是知道矩陣裡面有多少個數字
矩陣是長方形的
設元素有n個
行是a,列是b
那麼有a*b=n
那麼a,b肯定是n的因子.可以枚舉n的因子,不過這樣的話會有很多種可能的
這里還好,是9個
3*3=9
也有可能是1*9=9
9*1=9
你要的是哪個?我估計你是要3*3的吧

⑤ 剛才你解答的那個用C語言求矩陣行列和的演算法

形參只要知道每行是幾個,有幾行是你自己控制的
int a[][5], 是指定,第一唯的數組是5元素的,有幾行,形參不需要知道
計算時,必需要知道第一唯是幾元素的,否則沒法算如a[1][2]的實際地址
申明第一唯地寬度後,內部求地址實際上是:首地址+行號*第一唯寬度+列號地址 定位到具體的位置
所以 行列是程序員自己控制的,這個第一唯寬度是程序編譯時必需知道的
你也可以不用二唯數組,用一唯的a[],你函數就得改演算法 a[i*5+j] 表示 原二唯的 i 行 j 列
如果你用三唯的數組,通過形參傳的話,要指明第一唯和第二唯的寬度,第三唯則不必管 道理一樣的

⑥ c語言中如何獲取一個二維數組的行列數

有兩種方式:
1 二維數組的行列數在定義的時候就是確定好的,所以編程人員是知道二維數組的大小以及行列數的。 所以可以直接使用行列數的值。
為方便維護,可以將行列數定義為宏,直接調用對應的宏名作為行列值。

2 動態獲取。
對於type array[A][B];形式的二維數組,可以通過計算sizeof獲取行列數。
sizeof(array[0][0])為一個元素佔用的空間,
sizeof(array[0])為一行元素佔用的空間,
sizeof(array)為整個數組佔用的空間,
於是:
行數 = sizeof(array)/sizeof(array[0]);
列數 = sizeof(array[0])/sizeof(array[0][0]);

⑦ 用C語言編寫一個矩陣轉置的函數,矩陣的行數和列數在程序中由用戶輸入,請問怎麼寫,非常感謝

我的代碼邏輯是:

矩陣行指針初值指向每行首地址,迭代依次取所有行指針指向值組成新行,所有行指針自增。最終組合新的矩陣。

#include<stdio.h>
#include<malloc.h>
int**getList(introw,intclo);//獲取矩陣地址空間
voidsetNum(int**nList,intn);//填寫數值
voidprtList(int**nList,introw,intclo);//列印矩陣
int**zz(int**nList,introw,intclo);//轉置函數

intmain()
{
introw,clo,**nList=NULL,**nListSave=NULL;

printf("輸入矩陣行列數:");
scanf("%d%d",&row,&clo);
nList=getList(row,clo);
setNum(nList,row*clo);

printf("輸入的矩陣為: ");
prtList(nList,row,clo);

printf("轉置後的矩陣為: ");
nListSave=zz(nList,row,clo);
free(nList);
nList=nListSave;
prtList(nList,clo,row);
return0;
}

int**zz(int**nList,introw,intclo)
{
int*nSave=NULL,**listSave=NULL,**listp=nList,*p=NULL,i,j;
nSave=(int*)malloc(sizeof(int)*row*clo);
listSave=(int**)malloc(sizeof(int*)*clo);//倒置後的矩陣
p=nSave;

for(j=0;j<clo;j++)
{
for(i=0;i<row;i++)
{
*p++=*listp[i];
listp[i]=listp[i]+1;
}
}
for(i=0;i<clo;i++)
listSave[i]=&nSave[i*row];

for(i=0;i<row;i++)
free(nList[i]);//釋放原矩陣行空間
returnlistSave;
}
voidprtList(int**nList,introw,intclo)
{
inti,j;
for(i=0;i<row;i++)
{
for(j=0;j<clo;j++)
printf("%d",nList[i][j]);
printf(" ");
}
}
voidsetNum(int**nList,intn)
{
int*p=nList[0];
printf("填寫矩陣中%d個數值: ",n);
while(n-->0)
scanf("%d",p++);
}
int**getList(introw,intclo)
{
int*nums,**nList,i;
nums=(int*)malloc(sizeof(int)*row*clo);
nList=(int**)malloc(sizeof(int*)*row);
for(i=0;i<row;i++)
nList[i]=&nums[i*clo];
returnnList;
}

⑧ 用C語言解決:求任意階(n階)矩陣的行列式

很遺憾,上面匿名的程序不正確。
比如n=2 輸入:
3---7
2---1
得出錯誤結果。
而當輸入n=3
0---1---3
3---0---2
5---2---0
時也會得出錯誤結果。
錯誤的原因有2:
1 是數據類型不對,匿名的程序是設定輸入都是整數int,顯然按照行列式的定義結果肯定是整數,但是他程序中使用了整型數的除法,結果是取整整數,雖然他使用了類型強制轉換,但結果顯然不同,有誤差而且有時候這個誤差很大形成錯誤。
2 是演算法有點問題。小可很欣賞匿名的演算法思路,簡潔明快。不過有相當缺陷,這在程序中註明。
下面的程序是在匿名的程序思路上改寫的。考慮到數據類型和精確度問題,程序中行列式數據使用double型。由於tc和win-tc是16位編輯器,對float型和double型數據支持不好,所以程序是在32位編輯器Dev-c++下調試並通過的。
本題的一個完整的c程序如下,程序在Dev-c++下都調試通過,結果正確。
/* 用C語言解決:求任意階(n階)矩陣的行列式值 */
#include <stdio.h>
#include <math.h>

void getarray(int n);
void showarray(int n);
double getresult(int n);
double array[10][10];/*設矩陣不超過10階,可更改*/

int main()
{
int n;
double result;
printf("\nPlease input the Array size n:");
scanf("%d",&n);
getarray(n);
showarray(n);
result=getresult(n);
printf("\nResult=%f\n",result);
system("pause");
return 0;
}

void getarray(int n)
{
int row,col;
for(row=0;row<n;row++)
{
printf("\nPlease input line %d:",row+1);
for(col=0;col<n;col++)
scanf("%lf",&array[row][col]);
}
}

void showarray(int n)
{
int row,col;
printf("\nA=");
for(row=0;row<n;row++)
{
for(col=0;col<n;col++)
printf("\t%f",array[row][col]);
printf("\n");
}
}

double getresult(int n)
{
double temp,result=1.0;
int switchtime=0,flag=0;
int row,nextrow,col,stemp;
for(row=0;row<n-1;row++)
{
nextrow=row+1;
if(array[row][row]==0)/* 開始處理第一列,如果行列式第一行第一個數為零,要交換行 */
{ while(array[nextrow][row]==0)
{
nextrow++; /* 如果行列式第二行第一個數為零,行增加繼續尋找非零數值的行 */
if(nextrow==n)/* 如果遍歷完行列式行列式第一列元素都為零,退出while循環 */
{ flag=1;
break;
}
}
if(flag==1) /* 退出while循環後回到for(row=0;row<n-1;row++)行加1?*/
continue; /* 從array[row][row]==0知列也相應加1,開始處理第二列 */
switchtime++; /* 每交換一次行,行列式符號變化1次,統計變化次數 */
for(col=0;col<n;col++) /* 交換非零行到行列式頂部 */
{
stemp=array[row][col];
array[row][col]=array[nextrow][col];
array[nextrow][col]=stemp;
}
}
for(nextrow=row+1;nextrow<n;nextrow++)
{ /* 類似高斯消去法,消第一行下各行第一列數值到零*/
temp=array[nextrow][row]/array[row][row];
for(col=0;col<n;col++)
array[nextrow][col]+=-temp*array[row][col];/* 化行列式為上三角行列式形式 */
}
}
showarray(n);
for(row=0;row<n;row++)
result*=array[row][row];
if(switchtime%2)
return -result;
else
return result;
}

⑨ C語言編程:輸入一個M*N的整數矩陣,求其最大值及其所在的行號、列號,用流程圖表示

#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,m,n,*array;
printf("請輸入矩陣行數:");
scanf("%d",&m);
printf("請輸入矩陣列數:");
scanf("%d",&n);
array=(int*)malloc(m*n*sizeof(int));
printf("請輸入該%d*%d矩陣:\n",m,n);
for(i=0;i<m*n;i++)
scanf("%d",&array[i]);
int max=array[0];
int index=0;
for(i=1;i<m*n;i++)
{
if(max<array[i])
{
max=array[i];
index=i;
}
}
printf("您輸入的矩陣中的最大值為:%d\n",max);
printf("它所在的行號和列號分別是:%d,%d\n",(index/n)+1,(index%n)+1);
return 0;
}
以上就是我的回答

⑩ 用c語言編寫輸出3*4的矩陣,求最後一個最小值並顯示行號和列號

#include<stdio.h>

int main() {
const unsigned row=3, col=4;//定義行列數
unsigned minx, miny;//最小值的行列
int min;//最小值
int nums[row][col];
for (unsigned i = 0; i < row; i++)//錄入數據
{
for (unsigned j = 0; j < col; j++)
{
scanf("%d",&nums[i][j]);
}
}
min = nums[0][0];//初始化最小值為第一行第一列的數
minx = 1;
miny = 1;
for (unsigned i = 0; i < row; i++)//遍歷數組找出最小值
{
for (unsigned j = 0; j < col; j++)
{
if (nums[i][j] <= min)
{
min = nums[i][j];
minx = i+1;
miny = j+1;
}
}
}
printf("最小值為:%d,位於第%u行%u列", min, minx, miny);//輸出數據
return 0;
}

熱點內容
我的世界手機創的伺服器電腦能進嗎 發布:2025-02-14 01:08:16 瀏覽:163
eclipseandroid運行 發布:2025-02-14 00:54:57 瀏覽:897
雲伺服器安全策略 發布:2025-02-14 00:54:07 瀏覽:289
小米手機如何更改賬號密碼 發布:2025-02-14 00:48:48 瀏覽:572
我的世界如何導出伺服器 發布:2025-02-14 00:48:39 瀏覽:722
工業伺服器機箱怎麼樣 發布:2025-02-14 00:29:15 瀏覽:86
英朗壓縮機 發布:2025-02-14 00:29:12 瀏覽:678
java門面模式 發布:2025-02-14 00:29:09 瀏覽:917
java旋轉 發布:2025-02-14 00:22:49 瀏覽:104
存儲虛擬化方案 發布:2025-02-14 00:21:15 瀏覽:696