C语言入门级教程 八

C语言入门级教程                  icesongqiang


2016.12.05

总结

  1. 一维指针,二维指针以及行指针是不同的类型;

矩阵转置

/**矩阵转置
* 内部设置一个大的方阵,用来装用户的矩阵,
* 只在输入输出时按照用户的长,宽输出
* 两重循环,每次内循环执行交换功能
* @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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值