C语言入门级教程 icesongqiang
2016.12.05
总结
- 一维指针,二维指针以及行指针是不同的类型;
矩阵转置
/**矩阵转置
* 内部设置一个大的方阵,用来装用户的矩阵,
* 只在输入输出时按照用户的长,宽输出
* 两重循环,每次内循环执行交换功能
* @author icesongqiang 1204
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <malloc.h>
int **arrGene(int row, int col);
int makeArr(int **ppArr, int row, int col);
int printArr(int **ppArr, int row, int col);
int transArr(int **ppArr, int row, int col);
int arrFree(int **ppArr, int row);
// 动态分配矩阵
// 为了保证不越界,申请一个方阵,边长为矩阵的长和宽中大的一个
int **arrGene(int row, int col)
{
int max = (row > col ? row : col);
int **ppArr = (int **)malloc(max*sizeof(int*));
for (int i = 0; i < row; ++i)
*(ppArr+i) = (int *)malloc(max*sizeof(int));
return ppArr;
}
// 填充数据
int makeArr(int **ppArr, int row, int col)
{
srand((unsigned int)time(NULL));
for (int i = 0; i < row; ++i){
for (int j = 0; j < col; ++j)
*(*(ppArr + i) + j) = rand() % 100; // 限定范围在100之内
}
return 0;
}
// 打印二维数组元素
int printArr(int **ppArr, int row, int col)
{
for (int i = 0; i < row; ++i){
for (int j = 0; j < col; ++j)
printf("%d\t", *(*(ppArr + i) + j));
printf("\n");
}
return 0;
}
// 转置
int transArr(int **ppArr, int row, int col)
{
int max = (row > col ? row : col);
int tmp = 0;
for (int i = 0; i < max; ++i){
for (int j = i + 1; j < max; ++j){
tmp = *(*(ppArr + i) + j);
*(*(ppArr + i) + j) = *(*(ppArr + j) + i);
*(*(ppArr + j) + i) = tmp;
}
}
return 0;
}
// 释放内存
int arrFree(int **ppArr, int row, int col)
{
int max = (row > col ? row : col);
if (ppArr == NULL) return 0;
for (int i = 0; i < max; ++i)
free(*(ppArr+i));
free(ppArr);
}
int main()
{
const int row = 5;
const int col = 4;
int **ppArr=arrGene(row, col);
makeArr(ppArr, row, col);
printf("before trans.ing:\n");
printArr(ppArr, row, col);
transArr(ppArr, row, col);
printf("after trans.ing:\n");
printArr(ppArr, col, row);
system("pause");
return 0;
}
杨辉三角
#include<math.h>
#include<stdio.h>
int f(int n)
{
int sum=1,i;
if(n==0) return(1);
else
{
for(i=1;i<=n;i++)
{
sum*=i;
}
return(sum);
}
}
void g(int *p,int n)
{
int i,j,k=0;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=i;j++)
{
*(p+k)=f(i)/(f(j)*f(i-j));
k++;
}
}
}
int main()
{
printf("Enter num of row\n");
int i,j,k,m,n=0;
scanf("%d",&m);
int a[100];
int *p=a;
g(p,m);
for(i=1;i<=m;i++)
{
for(j=0;j<=m-i;j++)
printf(" ");
for(k=1;k<=i;k++)
{
printf("%-4d ",a[n]);
n++;
}
printf("\n");
}
return 0;
}