请高手教下初学者的几个问题!

holyassassin 2008-10-31 11:12:10
老师出了一份课外的练习,我刚接触C++不久什么都不会.请高手指点,最好有思路和参考代码!


要求:
以下各题均要求以C语言实现,编译器不限,直接实现,最好不要用到函数.
各程序要求能够编译通过,并有结果输出


一 使用一段C语言程序实现对任意输入的0~255以内十进制数据到十六进制数据的转换,并将该十六进制数据转为字符串类型,输出转换结果。例如:对于十进制的数据10,要求输出其十六进制数据为0x0A,输出字符串为“0x0A”。


二 使用C语言程序中函数调用的形式实现如下两个矩阵相乘的结果。
已知表达式为:C(m*n)=A(m*p)*B(p*n
1 2 3 1 4 7
4 5 6 × 2 5 8
7 8 9 3 6 9


三 使用C语言程序中函数调用的形式实现如下矩阵中值掩膜的计算。已知矩阵为3×16维,
160 163 167 80 83 85 155 158 159 20 22 23 170 173 176 179
159 158 155 75 78 80 156 159 153 25 23 21 167 168 166 164
153 155 157 81 84 82 154 153 158 27 25 24 168 172 171 170
中值掩膜为:
1 2 1
2 4 2 × 1/16
1 2 1
算法为使用中值掩膜与上述矩阵进行矩阵相乘,再将矩阵相乘的结果相加即可得出一个值,掩膜依次滑动,得到计算结果为1×14维的矩阵。
...全文
1816 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
holyassassin 2008-11-03
  • 打赏
  • 举报
回复
我想补充下第一题怎么弄成字符串?第二题怎么用函数实现?第三题也怎么用函数?
jia_xiaoxin 2008-11-03
  • 打赏
  • 举报
回复
第二题
void ArrayMul(int a[][3], int b[][3], int c[][3])
{
for(int i=0; i < 3; i++)/*A矩阵的行数*/
{
for(int j=0; j < 3; j++)/*B矩阵的列数*/
{
int temp = 0;
for(int k=0; k < 3; k++)
{
temp=temp+a[i][k]*b[k][j];
}
c[i][j]=temp;
}
}
printf("\n两矩阵相乘的值为:\n");
for(i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
printf("\n");
}

int main()
{
int A[3][3] = {1,2,3,4,5,6,7,8,9};
int B[3][3] = {1,4,7,2,5,8,3,6,9};
int C[3][3];
ArrayMul(A,B,C);
return 0;
}
jia_xiaoxin 2008-11-03
  • 打赏
  • 举报
回复
第一题

//输出到屏幕
void IntoHex(int i)
{
if(i < 16)
printf("0x0%X",i);
else
printf("0x%X",i);
}

//输出到字符串
void IntoHexStr(int i)
{
char Charhex[5];
if(i < 16)
sprintf(Charhex,"0x0%X",i);
else
sprintf(Charhex,"0x%X",i);
}

int main()
{
IntoHexStr(10);
IntoHex(10);
celltree001 2008-10-31
  • 打赏
  • 举报
回复
printf("0x%x",a);
train0714 2008-10-31
  • 打赏
  • 举报
回复
第三题没看懂!
The_eagles 2008-10-31
  • 打赏
  • 举报
回复


忘了看清题,既然是用c语言实现,就把cout<< ...改成 printf("%d\n",arr[i] );
另外如果你不想用一个函数的话,可以直接把gaussfilter里的东西copy到main中。
The_eagles 2008-10-31
  • 打赏
  • 举报
回复
三:这个问题实际上是个二维的低通滤波器。如果几个系数都是1/16的话,那就是一个均值滤波,既求均值。
void GaussFilter(int pArr[3][16],int *Arr)
{

for (int i=0; i<14; ++i)
{
Arr[i] =(1.0/16.0)*( pArr[0][i] + 2.0*pArr[0][i+1] + pArr[0][i+2]
+2.0*pArr[1][i] + 4.0*pArr[1][i+1] +2.0 * pArr[1][i+2]
+pArr[2][i] + 2.0 *pArr[2][i+1] + pArr[2][i+2]);
}

}

void main()
{


int Arr[3][16] =
{
160 ,163 ,167 ,80 ,83 ,85 ,155 ,158 ,159 ,20 ,22 ,23 ,170 ,173 ,176 ,179,
159 ,158 ,155 ,75 ,78 ,80 ,156 ,159 ,153 ,25 ,23 ,21 ,167 ,168 ,166 ,164,
153 ,155 ,157 ,81 ,84 ,82 ,154 ,153 ,158 ,27 ,25 ,24 ,168 ,172 ,171 ,170
};


int arr[14];
GaussFilter(Arr,arr);
for (int i=0; i<14; i++)
{
cout<<arr[i]<<endl;
}

}
lhz62004753 2008-10-31
  • 打赏
  • 举报
回复
一:用格式转换符就OK了,你要输出的是16进制整数,用%x就好了。
二:void main()
{
int a[2][3]={1,2,3,4,5,6};//m=2,p=3
int b[3][3]={1,2,3,4,5,6,7,8,9};//p=3,n=3
int c[2][3]={0};//m=2,n=3
int i,j,k;
for(i=0; i<2; i++)//i<m
for(j=0; j<3; j++)//j<n
{
for(k=0; k<3; k++)//k<p
{
c[i][j] += a[i][k]*b[k][j];//矩阵相乘
}
}

for(i=0; i<2; i++)//输出C数组
{
for(j=0; j<3; j++)
printf("%4d",c[i][j]);
printf("\n");
}
}
第三个问题没看懂,呵呵
帅得不敢出门 2008-10-31
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<stdlib.h>
#include <math.h>
#define N 11
int main()
{
char s[N];
int n ;
scanf("%d",&n);
sprintf(s, "0X%02X", n);
printf("%s",s);
system("pause");
return 0;
}

10
0X0A请按任意键继续. . .

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧