c語言求矩陣行列數
① 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;
}