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个值。