大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#includestdio.h
公司主营业务:成都网站设计、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出秦都免费做网站回馈大家。
main()
{ int a[100][100],n,m,i,j,b[6];
scanf("%d,%d",n,m);
for(i=0;in;i++)
for(j=0;jm;j++)
scanf("%d",a[i][j]);
for(i=0;in;i++){
b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=0;
if(a[i][0]=1){b[0]=1;b[1]=0;}
else b[0]=0;
for(j=1;jm;j++){
if(a[i][j]==1)
b[0]++;
else
b[0]=0;
if(a[i][j-1]==0a[i][j]==1) b[1]=j;
if(a[i][j]==1a[i][j+1]==0) b[2]=j;
if(b[0]b[3]){b[3]=b[0];b[4]=b[1];b[5]=b[2];}
if(b[3]==0){b[4]=-1;b[5]=-1;}
}
printf("%d %d\n",b[4],b[5]);
}
}
如图所示,望采纳。。。。。。
#include stdio.h
#include stdlib.h
#include time.h
void Fill ( char *F, int n )
{
srand(time(NULL));
while ( n-- 0 )
*F++ = rand() % 2;
}
void Calc ( char *F, char *D, int rF, int c )
{
int i, j, k;
char *pF, *pD, *pT, *pB;
size_t lineSize = c * sizeof(char);
pT = F; pD = D;
memcpy ( pD, pT, lineSize );
pD += c;
for ( i = 1; i rF; i++ )
{
pF = pT += c;
memcpy ( pD, pF, lineSize );
pD += c; pB = D;
for ( j = (1i)-1; j 0; j-- )
{
for ( k = 0; k c; k++ )
*pD++ = pF[k] | *pB++;
}
}
}
int Show ( char *m, int r, int c )
{
char *s;
char *ps;
int i, j;
s = (char*)malloc ( sizeof(char) * (1+c) );
s[c] = 0;
for ( i = 0; i r; i++ )
{
ps = s;
for ( j = 0; j c; j++ )
*ps++ = *m+++'0';
puts ( s );
}
putchar ( '\n' );
free ( s );
}
int main ( void )
{
int rF, c, rD;
char *hF, *hD;
FILE *fp;
scanf ( "%d%d", rF, c );
rD = 1 rF; rD--;
hF = (char*)malloc ( rF * c );
hD = (char*)malloc ( rD * c );
Fill ( hF, rF*c );
Show ( hF, rF, c );
Calc ( hF, hD, rF, c );
Show ( hD, rD, c );
free ( hD );
free ( hF );
system ( "pause nul" );
}
#includestdio.h
int main(){
int i,j,m,n;
printf("请输入0矩阵的行数m、列数n:");
scanf("%d %d",m,n);
for(i=0;im;i++){
for(j=0;jn;j++){
printf("0");
}
printf("\n");
}
return 0;
}
童鞋,不知道你是用的什么测试数据,在我的机器上测试了几组数据,结果都是正确的。
重复下我的测试代码。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
void multiplication(int a,int b,int c,int *p,int *q);
void main()
{
int m,n,l,h;
int i,j,g,k;
int *p,*q;
char x;
printf("请输入a矩阵行数和列数,以空格分开,,,");
scanf("%d %d",m,n);
p=(int *)malloc(sizeof(int)*m*n);
for(i=0;im;i++)
for(j=0;jn;j++)
{
printf("请输入a矩阵%d行%d列的数,,",(i+1),(j+1));
scanf("%d",(p+m*i+j));
}
printf("请输入b矩阵行数和列数,以空格分开,,,");
scanf("%d %d",l,h);
q=(int *)malloc(sizeof(int)*l*h);
for(g=0;gl;g++)
for(k=0;kh;k++)
{
printf("请输入b矩阵%d行%d列的数,,",(g+1),(k+1));
scanf("%d",(q+l*g+k));
}
multiplication( m, n, h, p, q);
}
void multiplication(int a,int b,int c,int *p,int *q)
{
int i,j;
int k;
int sum;
for(i=0;ia;i++)
{
for(j=0;jc;j++)
{
sum=0;
for(k=0;kb;k++)
{
sum=sum+(*(p+a*i+k))*(*(q+b*k+j));
}
printf("%d ",sum);
}
printf("\n");
}
}
附带一组测试数据
A 3 4
2 1
B 3
4
Result
25
10
结果正确。
//矩阵三元组之矩阵相加 相乘
#include iostream
using namespace std;
typedef int Elemtype;
#define MAXSIZE 12500 //最大非零元素
typedef struct Triple
{
Elemtype value;
int row,col;
}Triple;
typedef struct TSMatrix
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
TSMatrix T;
void InputMatrix(TSMatrix T) //输入t个非零元素
{
cout"请输入稀疏矩阵的信息,(行,列,非零元素个数)"endl;
cinT.muT.nuT.tu;
int i;
cout"请输入非零元素的信息(行,列,值),提醒(下标从1开始)"endl;
for(i=1;i=T.tu;++i)
{
cinT.data[i].rowT.data[i].colT.data[i].value;
}
}
void Output(TSMatrix T)
{
cout"矩阵的三元组表示(ROW=)"T.mu" COL="T.nu"非零个数="T.tuendl;
int i;
for(i=1;i=T.tu;++i)
{
cout"ROW(行):"T.data[i].row" COL(列):"T.data[i].col" Value(值)"T.data[i].valueendl;
}
}
void TransposeSMatrix(TSMatrix M,TSMatrix T) //矩阵的转置
{
T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;
int i,j,k=1;
for(i=1;i=M.nu;++i)
{
for(j=1;j=M.tu;++j)
if(M.data[j].col==i)
{
T.data[k].row=i;
T.data[k].col=M.data[j].row;
T.data[k].value=M.data[j].value;
++k;
}
}
}
void AddMastrix(TSMatrix M,TSMatrix T,TSMatrix Q) //矩阵相加
{
int index_a,index_b,i=1,j=1,k=1;
Q.mu=M.mu; Q.nu=M.nu;
while (i=M.tuj=T.tu)
{
index_a=(M.data[i].row)*(M.data[i].col)+M.data[i].col;
index_b=(T.data[j].row)*(T.data[j].col)+T.data[j].col;
if(index_aindex_b)
{
Q.data[k]=M.data[i];
i++;
k++;
}
else if(index_aindex_b)
{
Q.data[k]=T.data[j];
j++;
k++;
}
else if(index_a==index_b)
{
if((M.data[i].value+T.data[j].value)!=0)
{
Q.data[k]=M.data[i];
Q.data[k].value=M.data[i].value+T.data[j].value;
k++;
}
++i;
++j;
}
}
//复制剩余元素
for(;i=M.tu;++i)
{
Q.data[k]=M.data[i];
k++;
}
for(;j=T.tu;++j)
Q.data[k++]=T.data[j];
Q.tu=k-1;
}
void Multiply(TSMatrix M,TSMatrix T,TSMatrix Q) //相乘
{
if(M.nu!=T.mu)
{
cerr"两矩阵相乘不合法"endl;
return ;
}
int *rowSize=new int[T.mu+1]; //存放每行非零元素的个数
int *rowStart=new int[T.mu+2]; //矩阵每行在三元组开始位置
int *temp=new int[T.nu+1]; //存放结果矩阵中每行的计算结果
int i,Current,k,ROWM,COLM,COLB;
for(i=1;i=T.mu;i++) rowSize[i]=0;
for(i=1;i=T.tu;++i) rowSize[T.data[i].row]++;
rowStart[1]=1;
for(i=2;i=T.mu+1;i++)
rowStart[i]=rowStart[i-1]+rowSize[i-1];
Current=1; k=1;
while (Current=M.tu)
{
ROWM=M.data[Current].row; //当前三元组数据中元素的行号
for(i=1;i=T.nu;++i) temp[i]=0;
while (Current=M.tuROWM==M.data[Current].row)
{
COLM=M.data[Current].col; //当前元素的列号,方便与T矩阵的行号相乘
for(i=rowStart[COLM];irowStart[COLM+1];i++) //对应T矩阵中每行的个数
{
COLB=T.data[i].col;
temp[COLB]+=(M.data[Current].value)*(T.data[i].value);
}
Current++;
}
for(i=1;i=T.nu;i++)
{
if(temp[i]!=0)
{
Q.data[k].row=ROWM;
Q.data[k].col=i;
Q.data[k].value=temp[i];
}
k++;
}
}
Q.mu=M.mu;Q.nu=T.nu;
Q.tu=k-1;
}
int main()
{
TSMatrix T,M,Q,S;
InputMatrix(M);
InputMatrix(T);
cout"两矩阵相乘"endl;
Multiply(M,T,Q);
Output(Q);
cout"两矩阵相加"endl;
AddMastrix(M,M,S);
Output(S);
system("pause");
return 0;
}
看程序中P1.0-P1.3是行扫描输出,P1.4-P1.7是扫描输入。所以原理是P1.0-P1.3中每次只有一个引脚输出0,其余输出1,然后读取P1.4-P1.7是否有引脚为0;如果有0说明有按键按下,如果全1说明没有按键按下。
scancode这个变量就是用于控制P1.0-P1.3(P1 = scancode;由这句输出)中每次只有一个引脚输出0的。
scancode = 0xfe;这句中bit0值为0,其余bit为1,所以开始时,P1 = scancode;由这句输出后,P1.0为0,其余引脚为1。
scancode = (scancode 1) | 0x01;这句使为0的bit左移一位(依次值为0xFE, 0xFD, 0xFB, 0xF7, 0xEF)。0xFE, 0xFD, 0xFB, 0xF7都满足while ((scancode 0x10) != 0)这个条件,而0xEF则不满足了,所以说此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了,到这就所有按键都扫描过了,没有按键按下(如果有按键按下,中途就返回了)。
if ((P1 0xf0) != 0xf0)这句中P1 0xf0表示只判断P1.4-P1.7,只有当前按下的按键所在行扫描输出为0时,这个表达式才成立(这时(P1 0xf0) != 0xf0);否则这个表达式肯定不成立(这时(P1 0xf0) == 0xf0),所以说当前行。
return ((~scancode) + (~tmpcode));这句就是如果有按键按下,那么直接返回键值,并不再进行循环退出程序。
程序格式要注意,下面这样更清楚:
uchar keyscan(void)
{
uchar scancode, tmpcode;
P1 = 0xf0; // 发全0行扫描码
if ((P1 0xf0) != 0xf0)
// 若有键按下
{
delay(); // 延时去抖动
if ((P1 0xf0) != 0xf0)
// 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while ((scancode 0x10) != 0)
// 逐行扫描此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了
{
P1 = scancode; // 输出行扫描码
if ((P1 0xf0) != 0xf0)
// 本行有键按下为什么是行?哪一列按下此句都成立啊
{
tmpcode = (P1 0xf0) | 0x0f;
/* 返回特征字节码,为1的位即对应于行和列 */
return ((~scancode) + (~tmpcode));
}
else
scancode = (scancode 1) | 0x01;
// 行扫描码左移一位
}
}
}
return (0); // 无键按下,返回值为0
}