C语言 利用指针实现求数组元素中的最大值和最小值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 利用指针实现求数组元素中的最大值和最小值相关的知识,希望对你有一定的参考价值。

#include<stdio.h> #define N 10 void main() int *p,*t,a[N],i; for(i=0;i<N;i++) scanf("%d",&a[i]); p=a; t=a; for(i=1;i<N;i++) if(*p<*(p+i)) p=p+i; if(*t>*(t+i)) t=t+i; printf("%d %d\n",*p,*t); 帮忙找个错…… 如果第一为是最大值那么此程序就能正常输出 但是如果第一位输入的不是最大值 此程序第一个输出是个很大的数 最小值也能正常输出…… 谢谢帮忙……

参考技术A 这个乍一看没有错误
但我把你打程序抄近TC运行了一下
发现不是像你说的那样的错误
及时第一位是最大的也会输出错误
无论怎么
输出的第一位都是24940
最小的也有错误
最小有时会输出最大
后来仔细看了一下
发现你后面一个for循环里有大错误
if语句是进行比较
就第一个if来说
你把a[0]与a[1]先进行比较
这里你用的是p=p+i;
就是使p指向p+i所指向的内存
但需要注意
假设我输入的一组数是
9
10
8
5
15
4
2
3
11
1
当进行第一次循环后
p会指向p+1
既然是用p=p+i;
这是p+1就变成了p
当计算机再进行循环至a[4]
也就是15时
就会有p=p+4;
而这时想对于刚开始时的指针p就已经不是指向你想要他指的那个数(也就是大的那个)了
此时的指针p与刚开始的比其实不是指向了p+4
而是指向了p+5
也就是4了
所以程序出现了这般错误
要改正的话只要把后面那个for循环换成如下程序段就可以了:
for(i=1;i<N;i++)

if(*p<a[i])
*p=a[i];
if(*t>a[i])
*t=a[i];

如果规定要用指针的话那可以再定义两个中间指针变量应该可以解决
只能说这么多了
太晚了
要睡觉了~~
不然明天第一节课又没得上了
希望我的答案对你有帮助
嘿嘿!!

C语言怎样对二维数组中每个元素进行选择排序

#include <stdio.h>
#include "stdlib.h"
#include "time.h"
int main(int argc,char *argv[])
    int a[5][8],i,j,k,t,*p;
    printf("排序前:\\n");
    srand((unsigned)time(NULL));
    for(i=0;i<5;i++)//为二维数组赋值
        for(j=0;j<8;printf("%3d",a[i][j++]=rand()%100));
        printf("\\n");
    
    printf("排序后:\\n");
    p=(int *)a;//降为一维,这样排序简单
    for(t=i=0;i<40;i++)//选择法排序
        for(k=i,j=k+1;j<40;j++)
            if(p[k]>p[j])
                k=j;
        if(k!=i)
            j=p[k],p[k]=p[i],p[i]=j;
        printf(++t%8 ? "%3d" : "%3d\\n",p[i]);
    
    return 0;

追问

能帮我看下我的哪里错了吗

printf(++t%8 ? "%3d" : "%3d\n",p[i])这句有点看不懂

参考技术A 1)核心思想是每行按顺序排列好,假定从小到大,然后,每列从小到大排序
2)假设数组为a[i_max][j_max]
核心代码
for(i=0;i<i_max;i++)

for(j=0;j<j_max;j++)
for(k=j+1;k<j_max-1;k++)
if(a[i][k]<a[i][j])
t=a[i][j];
a[i][j]=a[i][k];
a[i][k]=t;



for(j=0;j<j_max;j++)

for(i=0;i<i_max;i++)
for(k=i+1;k<i_max-1;k++)
if(a[k][j]<a[i][j])
t=a[i][j];
a[i][j]=a[k][j];
a[k][j]=t;


望采纳追问

这方法不对啊,比如说

追答

你可以按算法走一遍,不是你给的那个

追问

你不是说先排列再排行吗

追答

先把每行排好,再把每列排好

追问

运行结果

你帮我看下我自己写的有什么错误行吗

追答

把这段程序的结果贴给我吧

一定是算法错了,你再看看吧

追问

追答

1)核心思想是每行按顺序排列好,假定从小到大,然后,每列从小到大排序
2)假设数组为a[i_max][j_max]
核心代码
for(i=0;i<i_max;i++)

for(j=0;j<j_max-1;j++)
for(k=j+1;k<j_max;k++)
if(a[i][k]<a[i][j])
t=a[i][j];
a[i][j]=a[i][k];
a[i][k]=t;



for(j=0;j<j_max;j++)

for(i=0;i<i_max-1;i++)
for(k=i+1;k<i_max;k++)
if(a[k][j]<a[i][j])
t=a[i][j];
a[i][j]=a[k][j];
a[k][j]=t;

改过了,应该能用,希望能帮到你:-)

追问

太感谢了

追答

不用谢:-)

以上是关于C语言 利用指针实现求数组元素中的最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章

C语言利用指针编写程序,求一维数组中的最大和最小值

C语言利用指针编写程序,求一维数组中的最大和最小值

ZZNUOJ_用C语言编写程序实现1157:最大值和最小值(指针专题)(附完整源码)

C语言【函数 数组 指针】利用指针求一维数组的数据元素之和

C语言中怎样用指针找出一维数组中的最大值和最小值并输出它们的下标

指针问题求教