C:编程练习5:指针数组+高级指针(复习)

本人C语言现已学习到结构体

本次所取习题来源于:教材(我支持版权的喔)


题目一

1,用指向指针的指针的方法对5个字符串排序后输出

我的答案如下:
#include<stdio.h>
#include<string.h>
void fun1(char *p[],int a);
main()
{
    char *p[5]={"you","are","a","good","boy"};
    int i,j;
    fun1(p,5);
    for(i=0;i<5;i++)
        printf("%s\n",p[i]);
}
void fun1(char *p[],int a)
{
    int i,j;
    char*h;
    for(i=0;i<a-1-i;i++)
        for(j=0;j<a-1-i;j++)
            if(strcmp(p[j],p[j+1])>0)
                {
                    h=p[j];
                    p[j]=p[j+1];
                    p[j+1]=h;
                }
}

本题涉及指针数组的内容,指针数组内的每一个元素都是一个指针变量,分别指向不同的字符串。
注意这里的字符串位于内存里的常量区,是无法改变的
同时我们也用到了一个字符公式,即strcmp(比较两个字符串的大小)(从首字符开始比较ASCII码)

strcmp(str1,str2)
str1 > str2 则返回值大于0;
str1 < str2 则返回值小于0
str1 = str2 则返回值等于0

最后通过改变数组内各元素的指向,就可以由小到大的将个支付串排列出来啦。


题目二

2,找到一个二维数组中的鞍点,即该位置上的元素在改行上最大,该列上最小,也可能没有鞍点。

我的答案如下:
#include<stdio.h>
#define n 3
main()
{
    int i,j,a[][n]={4,5,6,1,2,3,7,8,9};
    int(*q)[n];
    int max,min,swap,x=0,y=0;
    q=a;
    for(i=0;i<n;i++)
    {
        j=0;
        max=q[i][j];
        for(j=0;j<n;j++)
            if(q[i][j]>max)
            {
                max=q[i][j];
                x=j;
            }
        min=q[0][x];
        for(j=0;j<n;j++)
            if(q[j][x]<min)
            {
                min=q[j][x];
                y=j;
            }
        if(min==max)
            {
                printf("鞍点为%d\n",min);
                printf("其坐标为第%d行,第%d列\n",y+1,x+1);
                break;
            }
    }
    if(min!=max)
       printf("there are no point");
}

这道题太难受了,在没有完全理解指针的情况下,只能照葫芦画瓢的将它晦涩的描绘出来,而且在上课的时候我还没有完全答出来,看来是拿不到优秀了。
回去后一顿猛学,简单的修改了一下。

修改后:
#include<stdio.h>
#define n 3
void fun1(int (*q)[n]);
main()
{
    printf("please input a 3*3 matrix\n");
    int a[n][n];
    int i,j;
    for(i=0;i<n;i++)
       for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
    fun1(a);
}
void fun1(int (*q)[n])
{
    int max,min,swap,x=0,y=0,i,j;
    for(i=0;i<n;i++)
    {
        j=0;
        max=q[i][j];
        for(j=0;j<n;j++)
            if(q[i][j]>max)
            {
                max=q[i][j];
                x=j;
            }
        min=q[0][x];
        for(j=0;j<n;j++)
            if(q[j][x]<min)
            {
                min=q[j][x];
                y=j;
            }
        if(min==max)
            {
                printf("鞍点为%d\n",min);
                printf("其坐标为第%d行,第%d列\n",y+1,x+1);
                break;
            }
    }
    if(min!=max)
       printf("there are no point");
}

可能起来还差不多,可是本人的思想还是发生了一定的变化的呀。
这里用到了一个行指针指向了我原来输入进去的数组,行指针状态之下,q[i][j]=a[i][j],但要注意这里的q!=a,因为一个是变量,一个是常量。
接下来的操作就简单了呀,按原思路就可以完美解决了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值