当前位置:编程学习 > C/C++ >>

C语言小问题 在线等

动态内存的基本练习 为什么最大最小值是对的 平均值是错的 求解 #include<stdio.h> #include<stdlib.h> int main(void) { int n,i,j,*p,*min,*temp; double sum=0.0; printf("Enter the number of the class:\n"); scanf("%d",&n); if((p=(int*)malloc(n*sizeof(int)))==NULL){ printf("Not able to allocate memory.\n"); exit(1); } printf("The score.\n"); for(i=0;i<n;i++){ printf("No.%d\n",i+1); scanf("%d",(p+i));} for(i=0;i<n-1;i++) for(j=i+1;j<n;j++){ min=(p+i); if(*min>*(p+j)) min=(p+j); temp=min; *min=*(p+i); *(p+i)=*temp; } for(i=0;i<n;i++) sum=sum+*(p+i); printf("min:%d\n max:%d\n ave:%d\n",*p,*(p+n-1),sum/n); free(p); return 0; }
追问:你的答案和楼下的加起来才是正确答案 三楼的答案最完善 没办法 只能给他了 以后还有机会 我经常有问题的……你的答案和楼上的加起来才是正确答案 三楼的答案最完善 没办法 只能给他了 以后还有机会 我经常有问题的……
答案:#include<stdio.h>
#include<stdlib.h>
int main(void)
{
	int n,i,j,*p,*min,temp;   //temp 不用指针
	double sum=0.0;
	printf("Enter the number of the class:\n");
	scanf("%d",&n);
	if((p=(int*)malloc(n*sizeof(int)))==NULL){
		printf("Not able to allocate memory.\n");
		exit(1);
	}
	printf("The score.\n");
	for(i=0;i<n;i++){
		printf("No.%d\n",i+1);
		scanf("%d",(p+i));}
	for(i=0;i<n-1;i++)
	{
		
		for(j=i+1;j<n;j++){
			min=p+i;
			if(*min>*(p+j)) 
                          {
				min=(p+j);
		    temp=*min;    //1
			*min=*(p+i);  //2
			*(p+i)=temp; //3 这三句应该放到if ()后面的语句块中
                       }
		}
	}
    for(i=0;i<n;i++)
	{
		sum=sum+*(p+i);
	}
	printf("\n");
	printf("min:%d\n max:%d\n ave:%d\n",*p,*(p+n-1),(int)sum/n);         //输出int, 需要对double进行强制类型转换
	free(p);
	return 0;

原先最严重的错误是在temp声明为指针后;
temp=min;   //此时temp与min指向同一个地址  (1)
*min=*(p+i);  //min指向的数据 赋值 p+i 指向的数据 (2)
*(p+i)=*temp;   //p+i的数据 赋值 min指向的数据  (3) 
你会发现经过了(2)(3), 如果 min!=p+i的话,被你弄丢了一个数据,即最初min指向的数据丢了,所以temp不能用所指针,如果用指针的话也是可以的,但必须要有储存的位置,
int a; 
int *temp=&a;
*temp=*min;
*min=*(p+i);
*(p+i)=*temp;
至于放到if块中的的原因是可以增加效率,因为如果min没有改变的话,上面那几句就相当于是 *temp=*min; *min=*min; *min=*temp,很没有意义

你上面说到最大和最小的输出是正确的,应该是你测试的太少,我猜测你输入的测试数据是从小到大依次输入的,打乱输入的话输出也是错误的
其他:temp=min;
*min=*(p+i);
*(p+i)=*temp;

此句用于交换,但是执行第二句以后,
temp指向的空间的值也改变了,第三句没用,所以你的数组的值已经改变了.. printf("min:%d\n max:%d\n ave:%d\n",*p,*(p+n-1),sum/n);
修改一下
printf("min:%d\n max:%d\n ave:%.2f\n",*p,*(p+n-1),sum/n);

上一个:(C语言)有四个警告warning C4033: 'main' must return a value,不能出运行结果,请帮忙看下
下一个:c语言 求一组数中的最大2个值。

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,