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;
}