学习任务:
初步掌握visual studio 2013 中控制台c程序的建立。
结合课本讲解指针概念;指针上机练习。
讲解动态分配和释放。 malloc/free.
一维指针动态分配和释放练习。
二维指针概念讲解。二维指针动态分配和释放练习。
作业:矩阵乘法
用户输入矩阵1行数、列数,然后提示用户输入各元素;
用户输入矩阵2行数、列数,然后提示用户输入各元素;
输入后计算相乘结果矩阵。
/********************************************
二维指针概念讲解。二维指针动态分配和释放练习。
作业:矩阵乘法
用户输入矩阵1行数、列数,然后提示用户输入各元素;
用户输入矩阵2行数、列数,然后提示用户输入各元素;
输入后计算相乘结果矩阵
*********************************************/
#include<stdio.h>
#include<stdlib.h>
void showhelp( int* row , int* column );
void matrix_input( int** a , int row , int column );
void matrix_mulp( int** a , int** b , int row1 , int column1 , int row2 , int column2 );
int main( )
{
int **A = NULL , **B = NULL; //指针初始化
int row1 , column1 , row2 , column2;
showhelp( &row1 , &column1 );
A = ( int** ) malloc( sizeof( int* ) * row1 );
A[0] = ( int* ) malloc( sizeof( int ) * row1 * column1 );
matrix_input( A , row1 , column1 );
showhelp( &row2 , &column2 );
B = ( int** ) malloc( sizeof( int* ) * row2 );
B[0] = ( int* ) malloc( sizeof( int ) * row2 * column2 );
matrix_input( B , row2 , column2 );
matrix_mulp( A , B , row1 , column1 , row2 , column2 );
free( A[0] );
free( A );
free( B[0] );
free( B );
}
/***********************************************
函数名称:showhelp
函数参数:两个整型指针分别代表矩阵的行和列
调用函数:无
返回参数:无
************************************************/
void showhelp( int* row , int* column )
{
printf( "please input the row and column of the matrix:\n" );
printf( "row= " );
scanf_s( "%d" , row );
printf( "column= " );
scanf_s( "%d" , column );
}
/***********************************************
函数名称:matrix_input
函数参数:存储矩阵的首地址,矩阵的行数、列数
调用函数:无
返回参数:无
************************************************/
void matrix_input( int** a , int row , int column )
{
int i , j;
int** p;
for( i = 1; i < row; i++ ) //内存分配
{
a[i] = a[i - 1] + column;
}
for( i = 0; i < row; i++ )
{
for( j = 0; j < column; j++ )
{
scanf_s( "%d" , ( a[i] + j ) ); //没有完全当成数组用,也可以写成&a[i][j]
}
}
printf( "The matrix you input is as followed:\n" );
for( i = 0; i < row; i++ )
{
for( j = 0; j < column; j++ )
{
printf( "%d " , *( a[i] + j ) ); //和上面一样,也可以写成a[i][j]
}
printf( "\n" );
}
}
/***********************************************
函数名称:matrix_mulp
函数参数:两相乘矩阵的首地址,两矩阵的行数、列数
调用函数:无
返回参数:无
函数功能:计算两已知矩阵的积并显示在屏幕上
************************************************/
void matrix_mulp( int** a , int** b , int row1 , int column1 , int row2 , int column2 )
{
int s , arow , acolumn , brow , bcolumn;
printf( "The result is as follows:\n" );
for( arow = 0; arow < row1; arow++ )
{
for( bcolumn = 0; bcolumn < column2; bcolumn++ )
{
s = 0;
acolumn = 0;
for( brow = 0; brow <row2; )
{
s = s + ( *( a[arow] + acolumn ) ) * ( *( b[brow] + bcolumn ) );
acolumn++;
brow++;
}
printf( "%d " , s );
}
printf( "\n" );
}
}
现在来看,第一个作业是写得比较糟糕的,内存的释放有问题,内存申请的时候也不明晰,总之,有待改进的地方,不过是第一次,总归慢慢来。
千里之行始于足下!