① c语言,矩阵
上面那个程序是我写的,下面写的是两个2*2矩阵相加和相乘的程序(行数和列数可以在主函数中更改),不得不说一句,有关矩阵的东西就是麻烦:
#include <stdio.h>
#include <stdlib.h>
int** NewMatrix(int row,int col) //动态开辟一个数组
{
int i,j;
int** matrix;
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;i<row;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//输入矩阵的元素
printf("please input the array elements:\n") ;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
scanf("%d",&matrix[i][j]);
}
}
return matrix;
}
//两矩阵相加a[row][col]+b[row][col]
int **addMatrix(int** a,int** b,int row,int col)
{
int i,j;
int** matrix;
//动态建立一个矩阵空间以存放运算结果
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;i<row;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//计算a+b
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
matrix[i][j] = a[i][j] + b[i][j];
}
}
return matrix;
}
//两矩阵相乘a[row][com]*b[com][col]
int **multiplyMatrix(int **a,int **b,int row,int com,int col)
{
int i,j,k;
int** matrix;
//动态建立一个矩阵空间以存放运算结果
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;i<row;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//计算a+b
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
matrix[i][j] = 0;
for(k=0;k<com;k++)
{
matrix[i][j] += a[i][k] * b[k][j];
}
}
}
return matrix;
}
void main()
{
int i,j;
int row = 2,col = 2; //行数和列数在此更改
int **a,**b,**c;
a = NewMatrix(row,col); //动态建立矩阵a
b = NewMatrix(row,col); //动态建立矩阵b
//调用函数,求两矩阵的和
c = addMatrix(a,b,row,col);
//输出两矩阵的和
printf("\na add b is:\n");
for(i=0;i<row;i++)
{
printf("\n");
for(j=0;j<col;j++)
{
printf("%d ",c[i][j]);
}
}
//调用函数,求两矩阵的积
c = multiplyMatrix(a,b,row,row,col);
//输出两矩阵的积
printf("\na multiply b is:\n");
for(i=0;i<row;i++)
{
printf("\n");
for(j=0;j<col;j++)
{
printf("%d ",c[i][j]);
}
}
}
本来程序还可以写得简单一些,由于你要求两矩阵同时能够相加和相乘,从而可以判定两矩阵的行数和列数应该是相等的,因而在函数传递参数的时候只要传一个就行了。但是考虑到程序的可移植性,我在写相加和相乘的子函数时,考虑了普遍性,即对于给定的任意的row和col(甚至row != col),加法和乘法都能够适用。然而这样一来,形参看起来就比较多了。你自己就情况而定吧,不懂的地方发我消息。
② C语言 矩阵操作题
从题目要求看只好用动态二维数组了——
#include<stdio.h>
#include"stdlib.h"
intmain(intargc,char*argv[]){
int**p,*q,i,j,TR,t;
chars[3];
printf("InputTR(intTR>0)... TR=");
if(scanf("%d",&TR)!=1||TR<1){
printf("Inputerror,exit... ");
return0;
}
if((q=(int*)malloc(sizeof(int)*TR*TR))==NULL){
printf("Applicationmemoryfailure... ");
return0;
}
if((p=(int**)malloc(sizeof(int*)*TR))==NULL){
printf("Failedtocreatethearray... ");
return0;
}
for(j=i=0;i<TR;p[i]=q+j,i++,j+=TR);
printf("Pleaseinputmatrixdata... ");
for(i=0;i<TR;i++){
for(j=0;j<TR;j++){
scanf("%d",p[i]+j);
printf("%d",p[i][j]);
}
printf(" ");
}
printf("LRorRR? ");
if(scanf("%s",s)==1&&(s[0]=='L'||s[0]=='R')&&s[1]=='R'){
if(s[0]=='L'){
//左倒置
}
else{
//右倒置
}
}
else{
printf("Inputerror,exit... ");
return0;
}
for(i=0;i<TR;i++){
for(j=0;j<TR;printf("%d",p[i][j++]));
printf(" ");
}
free(p);
free(q);
return0;
}
没有理解“左倒置”、“右倒置”的意思,只好先空前空着。
③ C语言 矩阵变换编程
for(i)循环的i是相同数据组成的矩形框的层号。
for(j)循环的j是矩形框顶行和底行的列号(i列到N - 1 - i列)。该循环显然是填写行的。
for(k)循环的k是矩形框左列和右列的行号(i行到N - 1 - i行)。该循环显然是填写列的。
看看代码:
for(i=0;i<N;++i)
for(j=0;j<N;++j;
a[i][j]=N*i+j;
每一个i都对应N个j(0 -- N - 1),i是行索引,j是列索引,显然是按行操作的
for(i=0;i<N;++i)
for(j=0;j<N;++j;
a[j][i]=N*i+j;
每一个i都对应N个j(0 -- N - 1),j是行索引,i是列索引,显然是按列操作的
从以上分析可知,二维数组的两个索引的变化方式的不同,决定了操作方式的不同。第一维(左边的索引)一次变化对应第二维多次变化时,就是按行操作,相反,第一维(左边的索引)多次次变化对应第二维一次变化时,就是按列操作。
④ 如图 是一题C语言程序设计题目 和数组循环右移不同 是要方阵一整列循环右移两次 怎么做求大神!!!
#include<stdio.h>
intmain()
{
intm,n,a[6][6],i,j,k,b[6][6];
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
k=(j+m)%n;
b[i][k]=a[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d",b[i][j]);
}
printf(" ");
}
return0;
}
⑤ 方阵循环右移c语言改错
#include int main() {int a[6][6]; int m,n,i,j,z,k=0,t; scanf("%d%d",&m,&n) ; for(i=0;i0;z--) { a[i][z]=a[i][z-1]; } a[i][0]=t; for(z=0;z
⑥ C语言编程:将n*m矩阵中每个元素向右移一列,最右一列换最左一列 输入要求“"Input %d*%d矩阵:\n”
程序如下:
Coding is happy...
⑦ C语言方阵循环右移,纠错, 大神快来,初学!
#include <stdio.h>
int main()
{int a[6][6];
int m,n,i,j,z,k=0,t;
scanf("%d%d",&m,&n) ;
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
printf("======== ");
for(i=0;i<n;i++)
{t=a[i][n-1];
for(z=n-1;z>0;z--)
{
a[i][z]=a[i][z-1];
}
a[i][0]=t;
for(z=0;z<n;z++)
{
printf("%d ",a[i][z]);
}
printf(" ");
}
return 0;
}
⑧ C语言用矩阵求解方程组
//作品:多元一次方程组的计算
//作者:与你看日出
//日期:2009年4月25日 星期六
//说明:输出值只能是小数(最多六位),如x=1.876546
//Han: 初始设的最多未知数的个数,运行程序后只能比它的个数小
//hang:计算中途中自己改变的未知数的个数
//JUZHEN:初始的示例矩阵
#include <stdio.h>
#include <math.h>
#define Han 200//(可自设)多元一次方程组有n行n+1列(多的一列是等号右边的值),给出行数就能确定矩阵,
#define JUZHEN {1,1,1,1,5},{1,2,-1,4,-2},{2,-3,-1,-5,-2},{3,1,2,11,0}//示例一个
main()
{
int i,j,k,m,n,t,cf,hang=4;
float temp;
float AA[Han][Han+1]={JUZHEN};//定义所要计算的数组
do//判断是否重试
{
for(i=0;i<hang;i++)//输出所定义的数组
{
printf("\n");
for(j=0;j<hang+1;j++)
{
printf("%g\t",AA[i][j]);
}
}
printf("\n");
printf("是否自己输入?是:1;否:0");
scanf("%d",&t);
if(t==1)//判断是否自己输入数组
{
printf("输入未知数的个数");
scanf("%d",&hang);
for(i=0;i<hang;i++)//输入所定义的数组
{
for(j=0;j<hang+1;j++)
{
printf("第%d行第%d列的数为:",i+1,j+1);
scanf("%f",&AA[i][j]);
}
}
}
for(k=0;k<hang;k++)//这个大循环将数组的左下角转化为0
{
while(AA[k][k]==0)//如果第K行K列的那个数为0,则加和重组一行。
{
for(m=k+1;m<hang;m++)
for(n=k;n<hang+1;n++)
{
AA[k][n]+=AA[m][n];
}
}
for(i=k;i<hang;i++)//将第K列下面变为1
{
temp=AA[i][k];
for(j=k;j<hang+1;j++)//将每列变为1
{
AA[i][j]/=temp;
}
}
for(i=k+1;i<hang;i++)//将下面的数列与上面的数列相减使其下面为0
{
for(j=0;j<hang+1;j++)
{
AA[i][j]-=AA[k][j];
}
}
}
for(k=hang-2;k>=0;k--)//这个大循环将数组的右上角转化为0
{
for(i=k+1;i<hang+1-1;i++)//将第i列上面变为0
{
AA[k][hang+1-1]-=AA[k][i]*AA[i][hang+1-1];
AA[k][i]=0;
}
}
for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
{
printf("\n");
for(j=0;j<hang+1;j++)
{
printf("%g\t",AA[i][j]);
}
}
printf("\n未知数的值为:\n");
for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
{
printf("x(%d)=\t%g\n",i+1,AA[i][hang+1-1]);
}
printf("\n");
printf("是否再试一次?是:1;否:0");
scanf("%d",&cf);
}
while(cf==1);//判断是否重试
}
⑨ 请教C语言矩阵问题....谢谢!
思想:
矩阵一般可以用二维数组来描述,也可以用一维数组描述,二维数组比较直观,一维数组需要换算公式,但如需要动态变化的矩阵,那么就需要动态申请空间,此时,动态一维数组比动态二维数组处理起来方便一些。
因为你这题给定了矩阵的维数,所以用二维数组解决可能更方便些,但如果是动态矩阵,那用一维数组还是比较方便的。
对于你这道题,我用一维数组解决如下:
定义矩阵为int arr[3*4];
那么
arr[0]~arr[3]对应矩阵的 a[1][1]~a[1][4]
arr[4]~arr[7]对应矩阵的 a[2][1]~a[2][4]
arr[8]~arr[11]对应矩阵的a[3][1]~a[3][4]
注意到C语言里数组下标从0开始,可以得到换算公式为:
a[i][j]=arr[(i-1)*4+(j-1)]
程序如下:
#include <stdio.h>
int FindMax(int arr[3*4],int *maxRow,int *maxCol)
{
int i,j;
int maxElem=arr[0];
for(i=1;i<=3;i++)
{
for(j=1;j<=4;j++)
{
/*如果找到最大值,记录下行号,列号*/
if(arr[(i-1)*4+(j-1)] > maxElem)
{
maxElem=arr[(i-1)*4+(j-1)];
*maxRow=i;
*maxCol=j;
}
}
}
return maxElem;
}
int FindMin(int arr[3*4],int *minRow,int *minCol)
{
int i,j;
int minElem=arr[0];
for(i=1;i<=3;i++)
{
for(j=1;j<=4;j++)
{
/*如果找到最小值,记录下行号,列号*/
if(arr[(i-1)*4+(j-1)] < minElem)
{
minElem=arr[(i-1)*4+(j-1)];
*minRow=i;
*minCol=j;
}
}
}
return minElem;
}
void main()
{
/*定义矩阵*/
int a[3*4]={4,5,9,15, 1,3,7,16, 8,2,6,78};
int maxRow,maxCol,minRow,minCol;
int maxElem;
int minElem;
maxElem=FindMax(a,&maxRow,&maxCol);
minElem=FindMin(a,&minRow,&minCol);
printf("最大值为:%d,行号:%d,列号:%d\n",maxElem,maxRow,maxCol);
printf("最小值为:%d,行号:%d,列号:%d\n",minElem,minRow,minCol);
}
⑩ 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;
}