C语言课后题的疑惑
这题是 《带你学C带你飞》的21课的动手题,第0题。
答案是这样的
#include <stdio.h>
int main()
{
int a, b, c;
int *d, *e, *f, *g;
printf("请输入三个数:");
scanf("%d%d%d", &a, &b, &c);
d = &a;
e = &b;
f = &c;
if (a > b)
{
g = d;
d = e;
e = g;
}
if (a > c)
{
g = d;
d = f;
f = g;
}
if (b > c)
{
g = e;
e = f;
f = g;
}
printf("%d <= %d <= %d\n", *d, *e, *f);
return 0;
}
但是如果输入值为:5 1 3
就得不到正确的排序了
甲鱼老师是想让我们照着运行结果写代码?如果不是,那应该怎么填呢?想了一个下午了,实在想不出来,看了答案有点懵。求大神指点。{:5_100:}
因为小甲鱼老师给出的答案只是通过原输入的数和位置判断,但是改变指针的时候不改变原a、b、c的值,所以进行第一次互换后其实a、b、c依旧没变,只是改变了指针的指向。这里有两种方法,你可以理解下
第一种:改变判断条件,判断指针所指向的值,改变指针指向,但是不改变原值。
#include <stdio.h>
int main()
{
int a, b, c;
int *d, *e, *f, *g;
printf("请输入三个数:");
scanf("%d%d%d", &a, &b, &c);
d = &a;
e = &b;
f = &c;
if (*d > *e)
{
g = d;
d = e;
e = g;
}
if (*d > *f)
{
g = d;
d = f;
f = g;
}
if (*e > *f)
{
g = e;
e = f;
f = g;
}
printf("%d <= %d <= %d\n", *d, *e, *f);
return 0;
}
第二种:改变原值,不改变指针的指向
#include <stdio.h>
int main()
{
int a, b, c, x;
int *d, *e, *f, *g=&x; // g如果不定义会指向无法更改地址,所以随便指一个
printf("请输入三个数:");
scanf("%d%d%d", &a, &b, &c);
d = &a;
e = &b;
f = &c;
if (a > b)
{
*g = *d;
*d = *e;
*e = *g;
}
if (a > c)
{
*g = *d;
*d = *f;
*f = *g;
}
if (b > c)
{
*g = *e;
*e = *f;
*f = *g;
}
printf("%d <= %d <= %d\n", *d, *e, *f);
return 0;
} 用指针这种方法,有个好处:1.简单粗暴,不用考虑只变量改变后的变化。 前路 发表于 2017-10-18 21:11
用指针这种方法,有个好处:1.简单粗暴,不用考虑只变量改变后的变化。
谢谢回复 丶忘却的年少o 发表于 2017-10-18 19:20
因为小甲鱼老师给出的答案只是通过原输入的数和位置判断,但是改变指针的时候不改变原a、b、c的值,所以进 ...
谢谢大神的解答,经常麻烦,太感谢了{:10_275:} 比特阿尔法 发表于 2017-10-18 21:46
谢谢大神的解答,经常麻烦,太感谢了
别这么说,我可是无时不刻的存在,有什么麻不麻烦的。对了,我不是大神啦,大神都比较忙。 丶忘却的年少o 发表于 2017-10-18 21:47
别这么说,我可是无时不刻的存在,有什么麻不麻烦的。对了,我不是大神啦,大神都比较忙。
{:10_332:}
页:
[1]